Módulo:Lista de canciones
Apariencia
Uso
Este módulo optimiza el uso de la plantilla {{Lista de canciones}}
, haciendo que el número de canciones no tenga límite. También incluye la traducción de todos los parámetros, para ver más información sobre el uso de la plantilla ve a Plantilla:Lista de canciones.
Sintaxis
{{#invoke:Lista de canciones| lista }}
-- -------------------------------------------------------------------------- --
-- Lista de canciones
--
-- Plantilla: {{Lista de canciones}}
-- Versión: 1.0.3
-- Autor: Jose Buelvas (Usuario:Iho jose)
-- Modificada 21/07/2021 >> Se añaden los parámetros en inglés "all_writing"
-- "all_lyrics" y "headline" (Usuario:Wiki LIC)
-- -------------------------------------------------------------------------- --
-- Variables
local HtmlBuilder = require('Módulo:HtmlBuilder')
local p = {}
local marco = {}
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}}}
if args['todas_escritas'] then infodisco.wikitext('Todas las canciones escritas y compuestas por ' .. args.todas_escritas .. '. ') end
if args['all_writing'] then infodisco.wikitext('Todas las canciones escritas y compuestas por ' .. args.all_writing .. '. ') end
else
if (args['todas_letras'] or args['all_lyrics']) then -- {{{todas_letras}}}
if args['todas_letras'] then infodisco.wikitext('Todas las letras escritas por ' .. args.todas_letras) end
if args['all_lyrics'] then infodisco.wikitext('Todas las letras escritas por ' .. args.all_lyrics) end
if not args['all_music'] and not args['toda_la_música'] then
infodisco.wikitext('.')
end
end
local compositor = ''
if args['all_music'] then
compositor = args['all_music']
elseif args['toda_la_música'] then
compositor = args['toda_la_música']
end
if args['all_music'] or args['toda_la_música'] then -- {{{all_music| {{{toda_la_música}}}
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 ' .. compositor .. '. ')
else
infodisco.wikitext('Toda la música compuesta por ' .. compositor .. '. ')
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')
.cssText('padding-right: 10px; text-align: right; cursor: default; -webkit-user-select:none; -moz-user-select:none; color: var(--color-base,#202122); background-color: ' .. filaArgs.bgcolor)
.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 style="font-size: smaller; color: #555">(' .. filaArgs.notas .. ')</span> '
else
notaspista = ''
end
local nombrepista = pista.tag('td')
nombrepista
.cssText('text-align: left; color: var(--color-base,#202122); background-color: ' .. filaArgs.bgcolor)
.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
.cssText('color: var(--color-base,#202122); background-color: ' .. filaArgs.bgcolor)
.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
.cssText('color: var(--color-base,#202122); background-color: ' .. filaArgs.bgcolor)
.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
.cssText('color: var(--color-base,#202122); background-color: ' .. filaArgs.bgcolor)
.wikitext(filaArgs.escritopor)
end
-- Columna extra
if args['extra_column'] or args['columna_extra'] then
local columnapista = pista.tag('td')
columnapista
.cssText('color: var(--color-base,#202122); background-color: ' .. filaArgs.bgcolor)
.wikitext(filaArgs.extrapor)
end
-- Duración de la pista
local duracionpista = pista.tag('td')
duracionpista
.cssText('padding-right: 10px; text-align: right; color: var(--color-base,#202122); background-color: ' .. filaArgs.bgcolor)
.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 = 'padding: 2px 4px'
end
local encabezado = objeto.tag('tr')
encabezado
.tag('th')
.addClass('tlheader mbox-text')
.attr('colspan', 10)
.cssText('text-align: left; color: var(--color-base,#202122); background-color: var(--background-color-neutral, #eaecf0); width: 100%; ' .. titulopadding)
.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)
.cssText('text-align: left; background-color: #fff')
local cel3 = coloculto.tag('td')
cel3.addClass('mbox-empty-cell')
end
end
local estilopista, num, num2, num3, num4, totalnum, estilomore
num = 0
num2 = 0
num3 = 0
num4 = 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
num = 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
num2 = 1
end
if args['writing_credits'] and args['writing_credits'] == 'yes' or args['créditos_escritores'] and args['créditos_escritores'] == 'sí' then
num3 = 1
end
if args['extra_column'] or args['columna_extra'] then
num4 = 1
end
-- Estilizado
totalnum = num+num2+num3+num4
if totalnum == 1 then
estilopista = 'width: 60%'
estilomore = 'width: 40%'
elseif totalnum == 2 then
estilopista = 'width: 40%'
estilomore = 'width: 30%'
elseif totalnum == 3 then
estilopista = 'width: 30%'
estilomore = 'width: 20%'
elseif totalnum == 4 then
estilopista = 'width: 20%'
estilomore = 'width: 20%'
end
else
estilopista = 'width: 100%'
estilomore = ''
end
local titulares = objeto.tag('tr')
titulares
.tag('th')
.cssText('width: 20px; padding-left: 10px; padding-right: 10px; text-align: center; background-color: #eee; height: 20px')
.wikitext('N.º') -- Número de la pista
local nombrepista = titulares.tag('th')
nombrepista
.cssText('text-align: left; background-color: #eee; ' .. estilopista)
.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
.cssText('text-align: left; background-color: #eee; ' .. estilomore)
.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
.cssText('text-align: left; background-color: #eee; ' .. estilomore)
.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
.cssText('text-align: left; background-color: #eee; ' .. estilomore)
.wikitext('Escritor(es)')
end
if args['extra_column'] or args['columna_extra'] then
local columnaextra = titulares.tag('th')
columnaextra
.cssText('text-align: left; background-color: #eee; ' .. estilomore)
.wikitext(args['extra_column'] or args['columna_extra'])
end
local duraciones = titulares.tag('th')
duraciones
.cssText('padding-right: 5px; width: 60px; text-align: center; background-color: #eee')
.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
-- Color de fondo de la fila (Pista)
local colorfondo
if (num % 2) == 0 then
colorfondo = 'var(--background-color-base, #fff)'
else
colorfondo = 'var(--background-color-neutral-subtle, #f8f9fa)'
end
-- Agrega los datos según el parámetro (en inglés o español)
agregarPista({
bgcolor = colorfondo,
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)
.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, estilos
-- Condicionales en _canciones
if args['ocultar'] and args['ocultar'] == 'si' or args['ocultar'] and args['ocultar'] == 'sí' then
ocultar = 'collapsible collapsed'
estilos = 'border: #aaa 1px solid; padding: 3px; margin-bottom: .4em'
else
ocultar = ''
estilos = 'padding: 4px'
end
-- Constructor global HtmlBuilder
raiz = HtmlBuilder.create()
-- Información
informacion()
-- Tabla contenedora
objeto = raiz.tag('table')
objeto
.addClass('tracklist ')
.addClass(ocultar)
.attr('cellpadding', 0)
.cssText('border-collapse: collapse; ' .. estilos)
-- 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
marco = frame
-- 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
-- Indexar plantilla de lista de canciones
return _canciones()
end
return p