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