Módulo:Lista de canciones
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; 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; 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('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('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('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('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; 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; background-color: #fff; 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 = '#f7f7f7' else colorfondo = '#fff' 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; background-color: #fff; 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