Content added Content deleted
(created lyrics module) |
mNo edit summary |
||
(21 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local getArgs = require('Module:Arguments').getArgs |
|||
local stringToArray = require('Module:ProcessingFunctions').stringToArray |
|||
local VariablesLua = mw.ext.VariablesLua |
|||
local p = {} |
local p = {} |
||
local tableIdKey = 'lyrics_table_id' |
|||
function p.main(frame) |
|||
local columnVariableKey = 'lyrics_columns' |
|||
local args = frame:getParent().args |
|||
local root = mw.html.create('table'):addClass('wikitable') |
|||
function p.head(frame) |
|||
languages = { |
|||
local args = getArgs(frame) |
|||
{ |
|||
name = "Japanese Lyrics", |
|||
pattern = "^japanese[0-9]+$", |
|||
lyrics = {} |
|||
}, |
|||
{ |
|||
name = "Romaji Lyrics", |
|||
pattern = "^romaji[0-9]+$", |
|||
lyrics = {} |
|||
}, |
|||
{ |
|||
name = " English Translation", |
|||
pattern = "^english[0-9]+$", |
|||
lyrics = {} |
|||
} |
|||
} |
|||
local previousId = tonumber(VariablesLua.var(tableIdKey)) or 0 |
|||
for k,v in pairs(args) do |
|||
for _,lang in ipairs(languages) do |
|||
local id = args['id'] or tostring(previousId + 1) |
|||
if string.match(k, lang.pattern) then |
|||
local columnsStr = args['columns'] or '' |
|||
ind = tonumber(string.match(k, "[0-9]+")) |
|||
local splitColumns = stringToArray(',')(columnsStr) |
|||
lang.lyrics[ind] = v |
|||
local definedColumns = {} |
|||
break |
|||
local columns = {} |
|||
for _,column in ipairs(splitColumns) do |
|||
local columnTrimmed = mw.text.trim(column) |
|||
if columnTrimmed ~= '' then |
|||
if definedColumns[columnTrimmed] then |
|||
error(string.format( |
|||
'Column "%s" already defined', |
|||
columnTrimmed |
|||
)) |
|||
end |
end |
||
table.insert(columns, columnTrimmed) |
|||
definedColumns[columnTrimmed] = true |
|||
end |
end |
||
end |
end |
||
local |
local labels = {} |
||
for _, |
for _,column in ipairs(columns) do |
||
local label = args[column] |
|||
maxLen = math.max(maxLen, #lang.lyrics) |
|||
if label and label ~= '' then |
|||
labels[column] = label |
|||
else |
|||
error(string.format( |
|||
'Column "%s" needs a header', |
|||
column |
|||
)) |
|||
end |
|||
end |
end |
||
local |
local lyricsOptions = mw.html.create('div') |
||
:addClass('lyrics-options') |
|||
for _,lang in ipairs(languages) do |
|||
:attr('data-id', id) |
|||
_row:tag('th'):css('width', string.format("%d\%%", 100 / #languages)):wikitext(lang.name) |
|||
:attr('data-languages', table.concat(columns, ',')) |
|||
:attr('data-labels', mw.text.jsonEncode(labels)) |
|||
local row = mw.html.create('tr') |
|||
:addClass('lyrics-row') |
|||
for _,column in ipairs(columns) do |
|||
row:tag('th') |
|||
:addClass('lyrics-' .. column) |
|||
:attr('width', math.floor(100 / #columns) .. '%') |
|||
:css('min-width', '150px') |
|||
:wikitext(args[column]) |
|||
end |
end |
||
if tonumber(id) ~= nil then |
|||
for i=1,maxLen,1 do |
|||
VariablesLua.vardefine(tableIdKey, id) |
|||
local _row = root:tag('tr') |
|||
end |
|||
VariablesLua.vardefine(columnVariableKey, table.concat(columns, ',')) |
|||
local nextContent = nil |
|||
return '<div>' .. |
|||
for _,lang in ipairs(languages) do |
|||
tostring(lyricsOptions) .. |
|||
local content = "<br />" |
|||
string.format('<table class="wikitable" id="lyrics-%s">', id) .. |
|||
if lang.lyrics[i] and lang.lyrics[i] ~= "''" and lang.lyrics[i] ~= '""' then |
|||
tostring(row) |
|||
content = lang.lyrics[i] |
|||
end |
|||
function p.line(frame) |
|||
_row:tag('td'):wikitext(content) |
|||
local function formatArg(arg) |
|||
if arg and arg ~= '' then |
|||
nextContent = lang.lyrics[i+1] or nextContent |
|||
return table.concat(stringToArray('\n')(arg), '<br>') |
|||
end |
|||
else |
|||
return '<br>' |
|||
if nextContent == nil then |
|||
break |
|||
end |
end |
||
end |
end |
||
local args = getArgs(frame) |
|||
local root = mw.html.create('tr'):addClass('lyrics-row') |
|||
local columnOrder = VariablesLua.var(columnVariableKey, '') |
|||
local columns = stringToArray(',')(columnOrder) |
|||
for _,column in ipairs(columns) do |
|||
root:tag('td') |
|||
:addClass('lyrics-' .. column) |
|||
:wikitext(formatArg(args[column]) |
|||
) |
|||
end |
|||
return tostring(root) |
return tostring(root) |
||
end |
|||
function p.tail(frame) |
|||
local args = getArgs(frame) |
|||
if args[1] then |
|||
local columnOrder = VariablesLua.var(columnVariableKey, '') |
|||
local columns = stringToArray(',')(columnOrder) |
|||
local row = mw.html.create('tr') |
|||
:tag('th') |
|||
:attr('colspan', #columns) |
|||
:wikitext(args[1]) |
|||
return tostring(row) .. '</table>' .. '</div>' |
|||
end |
|||
return '</table>' |
|||
end |
end |
||
Latest revision as of 03:22, 15 April 2023
Documentation for this module may be created at Module:Lyrics/doc
local getArgs = require('Module:Arguments').getArgs
local stringToArray = require('Module:ProcessingFunctions').stringToArray
local VariablesLua = mw.ext.VariablesLua
local p = {}
local tableIdKey = 'lyrics_table_id'
local columnVariableKey = 'lyrics_columns'
function p.head(frame)
local args = getArgs(frame)
local previousId = tonumber(VariablesLua.var(tableIdKey)) or 0
local id = args['id'] or tostring(previousId + 1)
local columnsStr = args['columns'] or ''
local splitColumns = stringToArray(',')(columnsStr)
local definedColumns = {}
local columns = {}
for _,column in ipairs(splitColumns) do
local columnTrimmed = mw.text.trim(column)
if columnTrimmed ~= '' then
if definedColumns[columnTrimmed] then
error(string.format(
'Column "%s" already defined',
columnTrimmed
))
end
table.insert(columns, columnTrimmed)
definedColumns[columnTrimmed] = true
end
end
local labels = {}
for _,column in ipairs(columns) do
local label = args[column]
if label and label ~= '' then
labels[column] = label
else
error(string.format(
'Column "%s" needs a header',
column
))
end
end
local lyricsOptions = mw.html.create('div')
:addClass('lyrics-options')
:attr('data-id', id)
:attr('data-languages', table.concat(columns, ','))
:attr('data-labels', mw.text.jsonEncode(labels))
local row = mw.html.create('tr')
:addClass('lyrics-row')
for _,column in ipairs(columns) do
row:tag('th')
:addClass('lyrics-' .. column)
:attr('width', math.floor(100 / #columns) .. '%')
:css('min-width', '150px')
:wikitext(args[column])
end
if tonumber(id) ~= nil then
VariablesLua.vardefine(tableIdKey, id)
end
VariablesLua.vardefine(columnVariableKey, table.concat(columns, ','))
return '<div>' ..
tostring(lyricsOptions) ..
string.format('<table class="wikitable" id="lyrics-%s">', id) ..
tostring(row)
end
function p.line(frame)
local function formatArg(arg)
if arg and arg ~= '' then
return table.concat(stringToArray('\n')(arg), '<br>')
else
return '<br>'
end
end
local args = getArgs(frame)
local root = mw.html.create('tr'):addClass('lyrics-row')
local columnOrder = VariablesLua.var(columnVariableKey, '')
local columns = stringToArray(',')(columnOrder)
for _,column in ipairs(columns) do
root:tag('td')
:addClass('lyrics-' .. column)
:wikitext(formatArg(args[column])
)
end
return tostring(root)
end
function p.tail(frame)
local args = getArgs(frame)
if args[1] then
local columnOrder = VariablesLua.var(columnVariableKey, '')
local columns = stringToArray(',')(columnOrder)
local row = mw.html.create('tr')
:tag('th')
:attr('colspan', #columns)
:wikitext(args[1])
return tostring(row) .. '</table>' .. '</div>'
end
return '</table>'
end
return p