Documentation for this module may be created at Module:Reformat/doc
-- <nowiki>
local export = {}
local replace = mw.ustring.gsub
local trim = mw.text.trim
local find = mw.ustring.find
local match = mw.ustring.match
local split = mw.text.split
-- {{subst:#invoke:reformat|derivatives
-- {{subst:#invoke:reformat|derivatives_tabber
-- {{subst:#invoke:reformat|song_box_new
-- {{subst:#invoke:reformat|producer_song_box
-- {{subst:#invoke:reformat|producer_infobox
function export.derivatives(frame)
local text = trim([[
{{Derivatives |<nnd_id> |<nnd_comment> |<yt_id> |<yt_comment> |<bb_id> |<bb_comment>
|<nnd_id2> |<nnd2_comment> |<yt_id2> |<yt2_comment>
|<pp_id> |<pp_comment> |<piapro_id> |<piapro_comment> |<sc_id> |<sc_comment> |<sc_id2> |<sc2_comment> |<5s_id> |<5s_comment> |<mz_id> |<mz_comment> |<vm_id> |<vm_comment> |<tm_id> |<tm_comment>
|<etc> |<etc_comment> |<etc2> |<etc2_comment>
|<singer> |<author> |<category>
|<title> |<romaji (english)>
|<description>
|<width> |<height>
|<icon> |<thumb> |<color> }}
]])
local keep = { 'nnd_id', 'yt_id', 'yt_comment', 'author', 'category', 'title', 'description', 'color' }
local optional = { 'nnd_comment', 'bb_id', 'bb_comment', 'nnd_id2', 'nnd2_comment', 'yt_id2', 'yt2_comment', 'pp_id', 'pp_comment', 'piapro_id', 'piapro_comment', 'sc_id', 'sc_comment', 'sc_id2', 'sc2_comment', '5s_id', '5s_comment', 'mz_id', 'mz_comment', 'vm_id', 'vm_comment', 'tm_id', 'tm_comment', 'etc', 'etc_comment', 'etc2', 'etc2_comment', 'singer', 'romaji %(english%)', 'width', 'height', 'icon', 'thumb' }
local p = frame.args
for param, value in pairs(p) do
if param == 'title' then
value = replace(value, 'dance cover', 'Dance Cover')
value = replace(value, 'cover', 'Cover')
value = replace(value, 'demo', 'Demo')
value = replace(value, ' x ', ' × ')
end
if param == 'author' then
-- value = replace(value, ' %([A-Z][a-z][A-Za-z, ]+', mw.ustring.lower) -- 「(Cover)」→「(cover)」 but not 「(UST)」→「(uST)」
-- converts 「Rin tuning」 to 「rin tuning」 like it's told to, but this isn't what we want so whatever
value = replace(value, ' x ', ' × ')
end
if param == 'category' then
value = replace(value, 'Cover', 'cover')
value = replace(value, 'Version', 'version')
value = replace(value, '[Uu]taite', 'Human')
value = replace(value, '[Uu][Tt][Aa][Uu]', 'UTAU')
value = replace(value, '[Vv][Oo][Cc][Aa][Ll][Oo][Ii][Dd]', 'VOCALOID')
-- value = replace(value, ';', ',')
end
if param == 'color' then
value = replace(value, ' *; *color: *', '; color:')
value = replace(value, ';$', '')
end
if param == 'romaji (english)' then
param = 'romaji %(english%)'
end
if value ~= '' then
text = replace(text, '|<'..param..'>', '|'..param..' = '..value)
end
end
for i, param in ipairs(keep) do
text = replace(text, '|<'..param..'> ?', '|'..param..' = ')
end
for i, param in ipairs(optional) do
text = replace(text, '|<'..param..'> ?', '')
end
text = replace(text, ' +', ' ')
text = replace(text, '\n+', '\n')
text = replace(text, ' \n', '\n')
text = replace(text, '=\n', '= \n')
text = replace(text, 'romaji %%%(english%%%) = ', 'romaji (english) = ')
text = replace(text, '|nnd_id = |yt_id = |yt_comment = \n', '')
text = replace(text, '|nnd_id = |', '|')
text = replace(text, 'Derivatives |singer', 'Derivatives\n|singer')
text = replace(text, 'Derivatives |author', 'Derivatives\n|author')
return text
end
function export.derivatives_tabber(frame)
local text = trim([[
{{Derivatives tabber
|<vocaloid>
|<VOCALOID>
|<utau>
|<UTAU>
|<other>
|<OTHER>
|<human>
|<HUMAN>
|<dance>
|<DANCE>
|<arrangement>
|<ARRANGEMENT>
|<fanmadepv>
|<FANMADEPV>
|<spinoff>
|<SPINOFF>
|<more>
|<MORE>
}}
]])
local list_lower = { 'vocaloid', 'utau', 'other', 'human', 'dance', 'arrangement', 'fanmadepv', 'spinoff', 'more' }
local list_upper = { 'VOCALOID', 'UTAU', 'OTHER', 'HUMAN', 'DANCE', 'ARRANGEMENT', 'FANMADEPV', 'SPINOFF', 'MORE' }
local list, other = {}, {}
local p = frame.args
if p['VOCALOID'] or p['UTAU'] or p['OTHER'] or p['HUMAN'] or p['DANCE'] or p['ARRANGEMENT'] or p['FANMADEPV'] or p['SPINOFF'] or p['MORE'] then
list = list_upper
other = list_lower
else
list = list_lower
other = list_upper
end
for param, value in pairs(p) do
if value ~= '' then
text = replace(text, '<'..param..'>', param..' =\n'..value)
end
end
for i, param in ipairs(list) do
text = replace(text, '<'..param..'>', param..' =')
end
for i, param in ipairs(other) do
text = replace(text, '\n |<'..param..'>', '')
end
text = replace(text, '\n*{{[Cc]lr}}\n*', '\n\n')
return text
end
function export.song_box_new(frame)
local text = trim([[
{{Song box 2
|color = <color>
|image = <image>
|title = <title>
|date = <date>
|views = <views>
|singers = <singers>
|producers = <producers>
|links = <links>
}}
]])
local list = { 'color', 'image', 'title', 'date', 'views', 'singers', 'producers', 'links' }
local p = frame.args
for param, value in pairs(p) do
if param == 'title' or param == 'singers' or param == 'producers' or param == 'links' then
value = replace(value, '\n%* *', '\n* ')
value = replace(value, '\n([^%*])', '\n* %1')
value = replace(value, ' ?<[Bb][Rr] ?%/?> ?', '\n* ')
end
if param == 'title' then
if find(value, '\'\'\'"') then
value = replace(value, '\'\'\'"(.+)"\'\'\'', '"\'\'\'%1\'\'\'"')
elseif not find(value, '^"\'\'\'') then
value = replace(value, '^([^\n]+)', '"\'\'\'%1\'\'\'"')
end
end
if param == 'views' then
value = replace(value, '&', 'and')
end
if param == 'color' then
value = replace(value, ' *; *color: *', '; color:')
value = replace(value, ';$', '')
end
if param == 'links' then
local honke, tensai = {}, {}
value = replace(value, '}} {{', '}}@@{{')
value = replace(value, '\n%* *', '@@')
value = replace(value, '\n', '@@')
value = split(value, '@@')
for i, l in ipairs(value) do
if find(l, 'authorized') then
table.insert(honke, l)
elseif find(l, 'reprint') then
table.insert(tensai, l)
elseif find(l, 'sub') then
l = replace(l, '(|)([^}|]+)(}})', '%1reprint, %2%3')
table.insert(tensai, l)
else
table.insert(honke, l)
end
end
honke = table.concat(honke, ' ')
tensai = table.concat(tensai, ' ')
if honke == '' then honke = nil end
if tensai == '' then tensai = nil end
if not honke then
value = tensai
else
value = honke .. (tensai and '\n* ' .. tensai or '')
end
end
text = replace(text, '<'..param..'>', value or '') -- all given ones
end
for i, param in ipairs(list) do
text = replace(text, '<'..param..'>', '') -- any that may have been left out in original input
end
return text
end
function export.producer_song_box(frame)
local text = trim([[
{{Infobox song
|<nnd_id> |<nnd_comment> |<yt_id> |<yt_comment> |<bb_id> |<bb_comment>
|<nnd_id2> |<nnd2_comment> |<yt_id2> |<yt2_comment>
|<pp_id> |<pp_comment> |<piapro_id> |<piapro_comment> |<sc_id> |<sc_comment> |<5s_id> |<5s_comment>
|<mz_id> |<mz_comment> |<vm_id> |<5s_comment> |<tm_id> |<tm_comment>
|<etc> |<etc_name> |<etc_comment> |<xtra_url> |<xtra_name> |<xtra_comment>
|<composer> |<lyricist>
|<overallPVwork> |<illustrator> |<videoeditor>
|<vocaloid>
|<description>
|<icon> |<thumb>
|<uploaddate> |<title1> |<title2> }}
]])
local keep = { 'title1', 'nnd_id', 'yt_id', 'yt_comment', 'uploaddate', 'vocaloid', 'composer', 'lyricist', 'description' }
local keep_2 = { 'overallPVwork', 'illustrator', 'videoeditor' }
local optional = { 'title2', 'icon', 'thumb', 'xtra_url', 'etc', 'xtra_name', 'etc_name', 'xtra_comment', 'etc_comment', 'bb_id', 'sc_id', '5s_id', 'mz_id', 'nnd_comment', 'nnd_id2', 'nnd2_comment', 'yt_id2', 'yt2_comment', 'bb_comment', 'piapro_id', 'pp_id', 'piapro_comment', 'pp_comment', 'sc_comment', '5s_comment', 'mz_comment', 'vm_id', 'vm_comment', 'tm_id', 'tm_comment' }
local p = frame.args
for param, value in pairs(p) do
if param == 'overallpvwork' then
param = 'overallPVwork'
end
if value ~= '' then
text = replace(text, '|<'..param..'>', '|'..param..' = '..value)
end
end
for i, param in ipairs(keep) do
text = replace(text, '|<'..param..'> ?', '|'..param..' = ')
end
for i, param in ipairs(optional) do
text = replace(text, '|<'..param..'> ?', '')
end
if p['overallPVwork'] ~= '' or p['illustrator'] ~= '' or p['videoeditor'] ~= '' then
text = replace(text, '|<overallPVwork> ?', '')
text = replace(text, '|<illustrator> ?', '')
text = replace(text, '|<videoeditor> ?', '')
else
for i, param in ipairs(keep_2) do
text = replace(text, '|<'..param..'> ?', '|'..param..' = ')
end
end
text = replace(text, ' +', ' ')
text = replace(text, '\n+', '\n')
text = replace(text, ' \n', '\n')
text = replace(text, '=\n', '= \n')
text = replace(text, '|nnd_id = |yt_id = |yt_comment = \n?', '')
text = replace(text, '|nnd_id = |', '|')
return text
end
function export.producer_infobox(frame)
local text = trim([[
{{Infobox Producer
|width = <width>
|image = <image>
|caption = <caption>
|producer = <producer>
|debut = <debut>
|currently = <currently>
|genre = <genre>
|labels = <labels>
|associations = <associations>
|official = <official>
|url = <url>
|playlist = <playlist>
|content =
<content>
}}
]])
local keep = { 'image', 'producer', 'debut', 'currently', 'genre', 'labels', 'associations', 'official', 'url', 'playlist', 'content' }
local optional = { 'width', 'caption' }
local p = frame.args
for param, value in pairs(p) do
if param == 1 then
param = 'content' -- who even allowed |1= to happen
value = trim(value)
end
if param == 'content' then
value = replace(value, '^# *', '# ')
value = replace(value, '\n# *', '\n# ')
end
if value ~= '' then
text = replace(text, '<'..param..'>', value)
end
end
for i, param in ipairs(keep) do
text = replace(text, '<'..param..'>', '')
end
for i, param in ipairs(optional) do
text = replace(text, '|'..param..' *=%s*<'..param..'>\n', '')
end
return text
end
function export.master(frame)
local template = frame.args['template name']
template = replace(template, '_', ' ')
template = mw.ustring.lower(template)
if template == 'derivatives' then
return export.derivatives(frame)
elseif template == 'derivatives tabber' then
return export.derivatives_tabber(frame)
elseif template == 'song box 2' then
return export.song_box_new(frame)
elseif template == 'song box' then
return require('module:song box conversion').show(frame)
elseif template == 'infobox song' then
return export.producer_song_box(frame)
elseif template == 'infobox producer' then
return export.producer_infobox(frame)
end
end
return export