Módulo:Lista de canciones
A
-- -------------------------------------------------------------------------- --
-- Lista de canciones
--
-- Plantilla: {{Lista de canciones}}
-- -------------------------------------------------------------------------- --
-- Variables
local HtmlBuilder = require('Módulo:HtmlBuilder')
local p = {}
local raiz
local objeto
local infodisco
local args
-- Union
function union(t1, t2)
local vals = {}
for k, v in pairs(t1) do
vals[v] = true
end
for k, v in pairs(t2) do
vals[v] = true
end
local ret = {}
for k, v in pairs(vals) do
table.insert(ret, k)
end
return ret
end
-- Depuración de etiquetas vacías
local function depuracion(contenido)
if contenido and contenido ~= '' then
return contenido
end
end
-- Obtener números en parámetros {{{1}}}
local function obtenerNumero(prefijo)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefijo .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
-- Información previa
function informacion()
infodisco = raiz.wikitext()
if (args['todas_escritas'] or args['all_writing']) then -- {{{todas_escritas|{{{all_writing}}}}}}
infodisco.wikitext('Todas las canciones escritas y compuestas por ' .. (args['todas_escritas'] or args['all_writing']) .. '. ')
else
if (args['todas_letras'] or args['all_lyrics']) then -- {{{todas_letras|{{{all_lyrics}}}}}}
infodisco.wikitext('Todas las letras escritas por ' .. (args['todas_letras'] or args['all_lyrics']))
if not args['all_music'] and not args['toda_la_música'] then
infodisco.wikitext('.')
end
end
if args['all_music'] or args['toda_la_música'] then -- {{{toda_la_música|{{{all_music}}}}}}
if (args['todas_letras'] or args['all_lyrics']) then -- Unión de las dos frases con coma (,)
infodisco.wikitext(', toda la música compuesta por ' .. (args['toda_la_música'] or args['all_music']) .. '. ')
else
infodisco.wikitext('Toda la música compuesta por ' .. (args['toda_la_música'] or args['all_music']) .. '. ')
end
end
end
end
-- Agregar filas a la tabla de contenido global
local function agregarPista(filaArgs)
-- Variables globales internas
local pista = objeto.tag('tr')
pista
.tag('td')
.addClass('tracklist-number')
.wikitext(filaArgs.numero .. '.') -- Número de la pista ( 1.)
-- Título de la pista y notas
local titulopista, notaspista
if filaArgs.titulo and filaArgs.titulo ~= '' then
titulopista = filaArgs.titulo
else
titulopista = "''Sin título''"
end
if filaArgs.notas and filaArgs.notas ~= '' then
notaspista = ' <span class="notes">(' .. filaArgs.notas .. ')</span> '
else
notaspista = ''
end
local nombrepista = pista.tag('td')
nombrepista.wikitext('«' .. titulopista .. '»' .. notaspista)
-- Créditos letras
if args['lyrics_credits'] and args['lyrics_credits'] == 'yes' or args['créditos_letras'] and args['créditos_letras'] == 'sí' then
local letraspista = pista.tag('td')
letraspista.wikitext(filaArgs.letraspor)
end
-- Créditos música
if args['music_credits'] and args['music_credits'] == 'yes' or args['créditos_música'] and args['créditos_música'] == 'sí' then
local musicapista = pista.tag('td')
musicapista.wikitext(filaArgs.musicapor)
end
-- Créditos escritores
if args['writing_credits'] and args['writing_credits'] == 'yes' or args['créditos_escritores'] and args['créditos_escritores'] == 'sí' then
local escritopista = pista.tag('td')
escritopista.wikitext(filaArgs.escritopor)
end
-- Columna extra
if args['extra_column'] or args['columna_extra'] then
local columnapista = pista.tag('td')
columnapista.wikitext(filaArgs.extrapor)
end
-- Duración de la pista
local duracionpista = pista.tag('td')
duracionpista
.addClass('tracklist-length')
.wikitext(filaArgs.duracionpor)
end
-- Hacer títulos de la tabla
local function titulosContenido()
if args['title'] or args['titulo'] or args['título'] or args['headline'] then
local titulopadding = ''
if args['ocultar'] and args['ocultar'] == 'si' or args['ocultar'] and args['ocultar'] == 'sí' then
titulopadding = 'collapsed'
end
local encabezado = objeto.tag('tr')
encabezado
.tag('th')
.addClass('tlheader mbox-text')
.addClass(titulopadding)
.attr('colspan', 10)
.wikitext(args['title'] or args['titulo'] or args['título'] or args['headline'])
local cel2 = encabezado.tag('td')
cel2.addClass('mbox-empty-cell')
else
if args['ocultar'] and args['ocultar'] == 'si' or args['ocultar'] and args['ocultar'] == 'sí' then
local coloculto = objeto.tag('tr')
coloculto
.tag('th')
.addClass('tlheader mbox-text')
.attr('colspan', 10)
local cel3 = coloculto.tag('td')
cel3.addClass('mbox-empty-cell')
end
end
local totalnum, clase_pista, clase_resto
totalnum = 0
if
args['lyrics_credits'] and args['lyrics_credits'] == 'yes' or args['créditos_letras'] and args['créditos_letras'] == 'sí' or
args['music_credits'] and args['music_credits'] == 'yes' or args['créditos_música'] and args['créditos_música'] == 'sí' or
args['writing_credits'] and args['writing_credits'] == 'yes' or args['créditos_escritores'] and args['créditos_escritores'] == 'sí' or
args['extra_column'] or args['columna_extra']
then
if args['lyrics_credits'] and args['lyrics_credits'] == 'yes' or args['créditos_letras'] and args['créditos_letras'] == 'sí' then
totalnum = totalnum + 1
end
if args['music_credits'] and args['music_credits'] == 'yes' or args['créditos_música'] and args['créditos_música'] == 'sí' then
totalnum = totalnum + 1
end
if args['writing_credits'] and args['writing_credits'] == 'yes' or args['créditos_escritores'] and args['créditos_escritores'] == 'sí' then
totalnum = totalnum + 1
end
if args['extra_column'] or args['columna_extra'] then
totalnum = totalnum + 1
end
-- Estilizado
if totalnum == 1 then
clase_pista = 'row-width-60'
clase_resto = 'row-width-40'
elseif totalnum == 2 then
clase_pista = 'row-width-40'
clase_resto = 'row-width-30'
elseif totalnum == 3 then
clase_pista = 'row-width-30'
clase_resto = 'row-width-20'
elseif totalnum == 4 then
clase_pista = 'row-width-20'
clase_resto = 'row-width-20'
end
else
clase_pista = 'row-width-100'
clase_resto = ''
end
local titulares = objeto.tag('tr')
titulares
.tag('th')
.addClass('tracklist-number-header')
.attr('scope', 'col')
.wikitext('N.º') -- Número de la pista
local nombrepista = titulares.tag('th')
nombrepista
.addClass(clase_pista)
.attr('scope', 'col')
.wikitext('Título')
if args['lyrics_credits'] and args['lyrics_credits'] == 'yes' or args['créditos_letras'] and args['créditos_letras'] == 'sí' then
local letrista = titulares.tag('th')
letrista
.addClass(clase_resto)
.attr('scope', 'col')
.wikitext('Letras')
end
if args['music_credits'] and args['music_credits'] == 'yes' or args['créditos_música'] and args['créditos_música'] == 'sí' then
local musicapista = titulares.tag('th')
musicapista
.addClass(clase_resto)
.attr('scope', 'col')
.wikitext('Música')
end
if args['writing_credits'] and args['writing_credits'] == 'yes' or args['créditos_escritores'] and args['créditos_escritores'] == 'sí' then
local escritorespista = titulares.tag('th')
escritorespista
.addClass(clase_resto)
.attr('scope', 'col')
.wikitext('Escritor(es)')
end
if args['extra_column'] or args['columna_extra'] then
local columnaextra = titulares.tag('th')
columnaextra
.addClass(clase_resto)
.attr('scope', 'col')
.wikitext(args['extra_column'] or args['columna_extra'])
end
local duraciones = titulares.tag('th')
duraciones
.addClass('tracklist-length-header')
.attr('scope', 'col')
.wikitext('Duración')
local cel5 = titulares.tag('td')
cel5.addClass('mbox-empty-cell')
end
-- Hacer las filas consecutivamente según sean escritas
local function hacerLista()
-- Detectar idioma del parámetro (inglés/español)
local numeroPista = union(obtenerNumero('título'), obtenerNumero('title'))
table.sort(numeroPista)
for k, num in ipairs(numeroPista) do
-- Agrega los datos según el parámetro (en inglés o español)
agregarPista({
numero = num,
titulo = depuracion(args['título' .. num] or args['title' .. num]),
notas = depuracion(args['notas' .. num] or args['note' .. num]),
letraspor = depuracion(args['letras' .. num] or args['lyrics' .. num]),
musicapor = depuracion(args['música' .. num] or args['music' .. num]),
escritopor = depuracion(args['escritor' .. num] or args['writer' .. num]),
extrapor = depuracion(args['extra' .. num]),
duracionpor = depuracion(args['duración' .. num] or args['length' .. num])
})
end
end
-- Duración total
local function duracionTotal()
local duraciontotal = objeto.tag('tr')
if args['duración_total'] then
duraciontotal
.tag('td')
.attr('colspan', 10)
.addClass('tracklist-total-length')
.cssText('padding-right: 10px; text-align: right; color: var(--color-base,#202122); background-color: var(--background-color-neutral, #eaecf0); border-width: 0; font-weight: bold')
.wikitext(args['duración_total'])
local cel8 = duraciontotal.tag('td')
cel8.addClass('mbox-empty-cell')
end
end
-- Vericando que el parámetro tenga datos
function existenciaDatos(pista)
-- TRUE si tiene datos FALSE por defecto
if depuracion(pista[1]) or depuracion(pista['título']) then
return true
end
return false
end
-- Hacer lista de pistas en la tabla
function hacerListaTabla(tabla)
for k, pista in ipairs(tabla) do
if existenciaDatos(pista) then
agregarPista({
titulo = depuracion(pista['título'] or pista['title']),
notas = depuracion(args['notas'] or args['note']),
letraspor = depuracion(args['letras'] or args['lyrics']),
musicapor = depuracion(args['música'] or args['music']),
escritopor = depuracion(args['escritor'] or args['writer']),
extrapor = depuracion(args['extra']),
duracionpor = depuracion(args['duración'] or args['length'])
})
end
end
end
-- Plantilla de lista de canciones
function _canciones()
--Variables
local ocultar
-- Condicionales en _canciones
if args['ocultar'] and args['ocultar'] == 'si' or args['ocultar'] and args['ocultar'] == 'sí' then
ocultar = 'collapsible collapsed'
else
ocultar = ''
end
-- Constructor global HtmlBuilder
raiz = HtmlBuilder.create()
-- Información
informacion()
-- Tabla contenedora
objeto = raiz.tag('table')
objeto
.addClass('tracklist ')
.addClass(ocultar)
.attr('cellpadding', 0)
-- Indexar secciones
titulosContenido()
if not args[1] then
hacerLista()
else
hacerListaTabla(args)
end
duracionTotal()
-- Indexar todo en variable global
return tostring(raiz)
end
-- Index
function p.lista(frame)
local origArgs
-- Llamado en #invoke par uso de etiquetas de plantilla
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
else
origArgs = frame
end
-- For pairs
args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Módulo:Lista de canciones/styles.css' }
}
..
_canciones()
end
return p