Módulo:Lista de canciones

De MacphersonWiki
Ir a la navegación Ir a la búsqueda

La documentación para este módulo puede ser creada en Módulo:Lista de canciones/doc

-- -------------------------------------------------------------------------- --
-- 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