Módulo:Ficha
La documentación para este módulo puede ser creada en Módulo:Ficha/doc
--
-- Iste modulo ye pa implementar en {{Ficha}}
--
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local CategorizacionAByAD = require('Módulo:Categorización de buenos y destacaus')
local marco = {}
local args
local root
local amploImachen = '245px'
function union(t1, t2)
-- torna a unión d'as valors de dos tablas, como una seqüencia
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
local function depurarVueitas(conteniu)
if conteniu and conteniu ~= '' then
return conteniu
end
end
local function getArgNums(prefix)
local nums = {}
for k, v in pairs(args) do
local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
if num then table.insert(nums, tonumber(num)) end
end
table.sort(nums)
return nums
end
local function adhibirRinglera(rowArgs)
if rowArgs.seccion then
root
.tag('tr')
.tag('th')
.attr('colspan', 3)
.addClass(rowArgs.claseRinglera)
.css('text-align', 'center')
.cssText(rowArgs.estiloseccion or args.estiloseccion)
.wikitext(rowArgs.seccion)
elseif rowArgs.datos then
local ringlera = root.tag('tr')
ringlera.addClass(rowArgs.claseRinglera)
if rowArgs.etiqueta then
ringlera
.tag('th')
.attr('scope', 'row')
.css('text-align', 'left')
.addClass(rowArgs.claseRinglera)
.cssText (rowArgs.estiloetiqueta or args.estiloetiqueta)
.wikitext(rowArgs.etiqueta)
.done()
end
local datosCelula = ringlera.tag('td')
if rowArgs.etiqueta then
datosCelula
.attr('colspan', 2)
else
datosCelula
.attr('colspan', 3)
.css('text-align', 'center')
end
datosCelula
.addClass(rowArgs.clase)
.cssText (rowArgs.estilodatos or args.estilodatos)
-- S'adhibe un salto de linia porque si no se fa asinas y por eixemplo en os
-- datos i hai una lista con asteriscos en o primer elemento s'amostra
-- un asterisco.
-- Se tracta d'una error que ya ocurre con tablas normals sin LUA. Por eixemplo
-- {|
-- | * elemento1
-- * elemento2
-- |}
-- O salto de linia ya se produciba en a plantilla Ficha/ringlera
.wikitext('\n' .. rowArgs.datos)
--.newline()
end
end
local function ferTitol() -- Cabecera d'a ficha
if not args.titol then return end
local cabecera = {}
if args.media == 'si' and args.clasetitol then
cabecera = 'media ' .. args['clasetitol']
elseif args.media == 'si' then
cabecera = 'media '
elseif args.tipocabecera then
cabecera = 'cabecera ' .. args.tipocabecera
elseif args.clasetitol then
cabecera = 'cabecera ' .. args.clasetitol
else
cabecera = 'cabecera '
end
root
.tag('tr')
.tag('th')
.attr('colspan', 3)
.addClass(cabecera)
.css('text-align', 'center')
.css('background-color', args.colorfondo or args.colorfondotitol or 'transparent')
.css('color', args.colortexto or 'black')
.cssText(args.estilotitol)
.wikitext(args.titol)
end
local function ferRingleraAlto()
if not args.alto and not args.titol2 then return end
root
.tag('tr')
.tag('th')
.attr('colspan', 3)
.addClass(args.clasealtoor or args.clasetitol2)
.css('text-align', 'center')
.css('font-size', '125%')
.css('font-weight', 'bold')
.cssText(args.estiloalto or args.estilotitol2)
.wikitext(args.alto or args.titol2)
end
local function ferPietDeTabla()-- Piet de tabla, apareixerá debaixo d'a ficha
if not args.pietdetabla then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '3')
.addClass(args.clasepietdetabla)
.css('text-align', 'center')
.cssText(args.estilopietdetabla)
.wikitext(args.pietdetabla)
end
local function hacerImagenInferior()-- Imachen que apareixerá en a parti inferior d'a tabla
if not args.imacheninferior then return end
imacheninferior = {}
if args['grandariaimacheninferior'] == nil or args['grandariaimacheninferior'] == '' then
args['grandariaimacheninferior'] = amploImachen
end
if string.find(args.imacheninferior, '[{[]') == nil then
imacheninferior = ('[[Imachen:' .. args.imacheninferior .. '|'.. args['grandariaimacheninferior'] .. ']]' )
else
imacheninferior = args.imacheninferior
end
root
.tag('tr')
.tag('td')
.attr('colspan', '3')
.addClass(args.claseimacheninferior)
.css('text-align', 'center')
.cssText(args.estiloimacheninferior)
.newline()
.wikitext(imacheninferior)
.tag('br', {selfClosing = true})
.done()
.tag('div')
.css('display','inline')
.cssText(args.estilopietinferior)
.wikitext(args.pietinferior)
.done()
.newline()
end
local function ferImachenSuperior()-- Imachen que apareixerá en a parti superior d'a tabla
if not args.imachensuperior then return end
if args['grandariaimachensuperior'] == nil or args['grandariaimachensuperior'] == '' then
args['grandariaimachensuperior'] = amploImachen
end
imachensuperior = {}
if string.find(args.imachensuperior, '[{[]') == nil then
imachensuperior = ('[[Imachen:' .. args.imachensuperior .. '|'.. args['grandariaimachensuperior'] .. ']]' )
else
imachensuperior = args.imachensuperior
end
root
.tag('tr')
.tag('td')
.attr('colspan', '3')
.addClass(args.claseimachensuperior)
.css('text-align', 'center')
.cssText(args.estiloimachensuperior)
.newline()
.wikitext(imachensuperior)
.tag('br', {selfClosing = true})
.done()
.tag('div')
.css('display','inline')
.cssText(args.estilopietsuperior)
.wikitext(args.pietsuperior)
.done()
.newline()
end
local function ferSubtitols()-- Subtitols d'a ficha
if args.subtitol then
args.subtitol1 = args.subtitol
end
if args.clasesubtitol then
args.clasesubtitol1 = args.clasesubtitol
end
local subtitolnumero = getArgNums('subtitol')
for k, num in ipairs(subtitolnumero) do
adhibirRinglera({
datos = args['subtitol' .. num],
estilodatos = args['estilosubtitol' .. num] or args.estilosubtitol,
clase = args.clasesubtitol,
claseRinglera = args['clasesubtitol' .. num]
})
end
end
local function ferRinglerasSuperiors()-- ringleras dencima d'imachens laterals
if args.datosup then
args.datosup1 = args.datosup
end
if args.clasedatosup then
args.clasedatosup1 = args.clasedatosup
end
if args.estilodatosup then
args.estilodatosup1 = args.estilodatosup
end
local datosupnumero = getArgNums('datosup')
for k, num in ipairs(datosupnumero) do
adhibirRinglera({
datos = args['datosup' .. num],
estilodatos = args['estilodatosup' .. num],
clase = args.clasedatosup,
claseRinglera = args['clasedatosup' .. num]
})
end
end
local function ferImachensLaterals()
-- Imagenes que apareceran alto de forma geminada por ejemplo escudos y banderas
if args['grandariaimachenizquierda'] == "" or args['grandariaimachenizquierda'] == nil then
args['grandariaimachenizquierda'] = '100px'
end
if args['grandariaimachendreita'] == "" or args['grandariaimachendreita'] == nil then
args['grandariaimachendreita'] = '100px'
end
if args.imachendreita and args.imachenizquierda then
if args.pietizquierdo then brcondicionalizquierdo = 'br' end
if args.pietdreito then brcondicionaldreito = 'br' end
root
.tag('tr')
.tag('td')
--.attr('cellspacing', '0em')
--.attr('padding','0em')
.attr('colspan', '3')
.css('align', 'center')
.tag('table') -- ha d'ir adintro d'una tabla pa que as filas no lo deformen
.css('width', '100%')
.addClass('mergedrow')
.tag('tr')
.tag('td')
.css('text-align', 'center')
.css('background-color', 'transparent')
.addClass(args.claseimagenizquierda)
.css('align', 'center')-- S'alinia en o centro horizontal
.css('text-align', 'center') -- S'alinia en o centro horizontal
.css('vertical-align', 'middle')-- S'alinia en o centro vertical
.cssText(args.estiloimagenizquierda)
.wikitext('[[Imachen:' .. args.imachenizquierda .. '|' .. args['grandariaimachenizquierda'] .. ']]' )
.tag(brcondicionalizquierdo)
.tag('div')
.css('display','inline')
.cssText(args.estilopieizquierdo)
.wikitext(args.pietizquierdo)
.done()
.tag('td')
.css('text-align', 'center')-- S'alinia en o centro horizontal
.css('align', 'center')-- S'alinia en o horizontal
.css('vertical-align', 'middle')-- S'alinia en o centro vertical
.css('background-color', 'transparent')
.addClass(args.claseimagenderecha)
.cssText(args.estiloimagenderecha)
.wikitext('[[Imachen:' .. args.imachendreita .. '|' .. args['grandariaimachendreita'] .. ']]' )
.tag(brcondicionaldreito)
.tag('div')
.css('display','inline')
.cssText(args.estilopiederecho)
.wikitext(args.pietdreito)
.done()
.newline()
elseif args.imachendreita or args.imachenizquierda then
-- Si nomás una d'as dos, a imachen que apareixca será en o centro
imachenL = {}
if args.imachendreita ~= '' and args.imachendreita ~= nil then
imachenL = 'imachendreita'
elseif args.imachenizquierda ~= '' and args.imachenizquierda ~= nil then
imachenL = 'imachenizquierda'
end
pieL = {}
if args.imachendreita then
pieL = 'pietdreito'
elseif args.imachenizquierda then
pieL = 'pietizquierdo'
end
root
.tag('tr')
.tag('td')
.attr('colspan', '3')
.addClass(args['clase' .. imachenL])
.css('text-align', 'center')
.cssText(args['estilo' .. imachenL])
.newline()
.wikitext('[[Imachen:' .. args[imachenL] .. '|'.. args['tamanyo'..imachenL] .. ']]' )
.tag('br')
.tag('div')
.css('display','inline')
.cssText(args['estilo' .. pieL])
.wikitext(args[pieL])
.done()
end
end
local function ferImachens() -- Puet creyar un numero infinito de imachens
if args.imachen then
args.imagen1 = args.imachen
end
if args['grandariaimachen'] then
args['grandariaimachen1'] = args['grandariaimachen']
end
if args.piet then
args.pie1 = args.piet
end
local imagenums = getArgNums('imachen')
for k, num in ipairs(imagenums) do
local piet = args['piet' .. num]
local flotante = args['imachenflotant' .. num] or false
if args['grandariaimachen'..num] == nil then
args['grandariaimachen'..num] = amploImachen
end
imachen = {}
local cadenaBusqueda = mw.ustring.gsub(args['imachen'..num],'UNIQ','[') -- Pa que no de problemas con qualques plantillas
if mw.ustring.find(cadenaBusqueda, '[{[|]') == nil then -- Comprueba si i hai [ o { para no adhibir-ie prefixo
imachen = ('[[Imachen:' .. args['imachen' .. num] .. '|'.. args['grandariaimachen' ..num] .. ']]' )
else
imachen = args['imachen'..num]
end
local datos = HtmlBuilder.create().wikitext(imachen)
if piet and not flotante then
datos
.tag('br', {selfClosing = true})
.done()
end
if piet then
datos
.tag('div')
.css('display','inline')
.cssText(args.estilopie)
.wikitext(piet)
.done()
end
adhibirRinglera({
datos = tostring(datos),
estilodatos = args.estiloimachen,
clase = args.claseimachen,
claseRinglera = args['claseimachen' .. num]
})
end
end
local function ferRingleras()
local filanum = union(getArgNums('seccion'), getArgNums('datos'))
table.sort(filanum)
for k, num in ipairs(filanum) do
adhibirRinglera({
estilosubtitol = depurarVueitas(args['estilosubtitol' .. num]),
seccion = depurarVueitas(args['seccion' .. num]),
estiloseccion = depurarVueitas(args['estilosección' .. num]),
etiqueta = depurarVueitas(args['etiqueta' .. num]),
datos = depurarVueitas(args['datos' .. num]),
estiloetiqueta = depurarVueitas(args['estiloetiqueta' .. num]),
estilodatos = depurarVueitas(args['estilodatos' .. num]),
clase = depurarVueitas(args['clase' .. num]),
claseRinglera = depurarVueitas(args['claseRinglera' .. num])
})
end
end
function tienDatosRinglera(ringlera)
-- Función que torna true si a ringlera u grupo de ringleras (en o caso de
-- secciones) tien datos.
if ringlera.tipo == 'sección' or ringlera.tipo == 'seccion' then
for k, ringleraSeccion in ipairs(ringlera) do
if tienDatosRinglera(ringleraSeccion) then
return true
end
end
elseif ringlera.tipo == 'succesión' or ringlera.tipo == 'succesion' then
if depurarVueitas(ringlera[1]) or depurarVueitas(ringlera['anterior']) or
depurarVueitas(ringlera[3]) or depurarVueitas(ringlera['siguient']) then
return true
end
else
if depurarVueitas(ringlera[2]) or depurarVueitas(ringlera['datos']) then
return true
end
end
return false
end
function adhibirSuccesion(argumentosSuccesion)
local ringlera = root.tag('tr')
ringlera.css('font-size', '88%')
ringlera.css('text-align', 'center')
local celda
local width
width = '33%'
celda = ringlera.tag('td')
celda
.css('width', width)
.css('padding', '0.2em 0.1em 0.2em 0')
.css('vertical-align', 'middle')
if argumentosSuccesion['estilo fuent'] then
celda
.tag('div')
.css('display','inline')
.css('font-style', argumentosSuccesion['estilo fuent'])
.wikitext(argumentosSuccesion.anterior)
.done()
else
celda.wikitext(argumentosSuccesion.anterior)
end
if argumentosSuccesion['anyo anterior'] then
celda
.tag('br')
.wikitext('(' .. argumentosSuccesion['anyo anterior'] .. ')')
end
celda = ringlera.tag('td')
celda
.css('width', width)
.css('padding', '0.2em 0.1em')
.css('vertical-align', 'middle')
.css('background-color', argumentosSuccesion.color or '#E6E8FA')
celda
.tag('div')
.css('display','inline')
.css('font-weight', 'bold')
.css('font-style', argumentosSuccesion['estilo fuent'] or '')
.wikitext(argumentosSuccesion.actual or args.titol)
.done()
if argumentosSuccesion['anyo'] then
celda
.tag('br')
.wikitext('(' .. argumentosSuccesion['anyo'] .. ')')
end
celda = ringlera.tag('td')
celda
.css('width', width)
.css('padding', '0.2em 0 0.2em 0.1em')
.css('vertical-align', 'middle')
if argumentosSuccesion['estilo fuent'] then
celda
.tag('div')
.css('display','inline')
.css('font-style', argumentosSuccesion['estilo fuent'])
.wikitext(argumentosSuccesion.siguient)
.done()
else
celda.wikitext(argumentosSuccesion.siguient)
end
if argumentosSuccesion['anyo siguient'] then
celda
.tag('br')
.wikitext('(' .. argumentosSuccesion['anyo siguient'] .. ')')
end
end
function ferRinglerasTabla(tabla)
-- Función que composa as ringleras d'una tabla bien a ficha u bien una sección d'a mesma.
local anadidoTituloSeccion = false
for k, ringlera in ipairs(tabla) do
if tienDatosRinglera(ringlera) then
if ringlera.tipo == 'sección' or ringlera.tipo == 'seccion' then
-- Adhibir o títol d'a sección (si ye informau)
local titolSeccion = depurarVueitas(ringlera.titol) or depurarVueitas(ringlera['títol'])
if titolSeccion then
adhibirRinglera({
estiloseccion = ringlera['estilotitol'] or ringlera['estilotítol'],
seccion = titolSeccion
})
end
ferRinglerasTabla(ringlera)
elseif ringlera.tipo == 'sección desplegable' or ringlera.tipo == 'seccion desplegable' then -- MANCA
elseif ringlera.tipo == 'succesión'or ringlera.tipo == 'succesion' then
adhibirSuccesion({
['anterior'] = depurarVueitas(ringlera[1]) or depurarVueitas(ringlera['anterior']),
['actual'] = depurarVueitas(ringlera['actual']),
['siguient'] = depurarVueitas(ringlera[3]) or depurarVueitas(ringlera['siguient']),
['anyo anterior'] = depurarVueitas(ringlera['anyo anterior']),
['anyo'] = depurarVueitas(ringlera['anyo']),
['anyo siguient'] = depurarVueitas(ringlera['anyo siguient']),
['estilo fuent'] = depurarVueitas(ringlera['estilo fuent']),
['color'] = depurarVueitas(ringlera['color'])
})
elseif ringlera.tipo == 'dos columnas' then -- MANCA
elseif ringlera.tipo == 'tres columnas' then -- MANCA
else -- Etiqueta + Datos u nomás Datos
adhibirRinglera({
etiqueta = depurarVueitas(ringlera[1]) or depurarVueitas(ringlera['etiqueta']),
datos = depurarVueitas(ringlera[2]) or depurarVueitas(ringlera['datos']),
estiloetiqueta = ringlera['estiloetiqueta'] or tabla['estiloetiqueta'],
estilodatos = ringlera['estilodatos'] or tabla['estilodatos'],
clase = ringlera['clase'] or tabla['clase'],
claseRinglera = ringlera['claseRinglera'] or tabla['claseRinglera']
})
end
end
end
end
local function ferBarraDeNavegacion()-- Creya en a parti inferior un enlace a la plantilla que se de con nombre
if not args.nombre then return end
root
.tag('tr')
.tag('td')
.attr('colspan', '3')
.css('text-align', 'right')
.wikitext(mw.getCurrentFrame():expandTemplate({
title = 'navbar',
args = { args.nombre, mini = 1 }
}))
end
local function ferBarraWikidata()-- Creya en a parti inferior un enlace a l'ítem de Wikidata
local enlacePachina = mw.title.getCurrentTitle().text
local etiquetaPachina = mw.ustring.gsub(enlacePachina,'%s%(.*%)','')
local entidat = args.entidat or mw.wikibase.getEntityIdForCurrentPage()
local textoPie = ""
if (args.child == 'si' or args.integrada == 'sí' or args.wikidata == 'no') or (mw.title.getCurrentTitle().namespace ~= 0 and mw.title.getCurrentTitle().namespace ~= 104 and not args.entidat) then
textoPie = ''
elseif entidat ~= "" and entidat ~= nil then
textoPie = '<div class="plainlinks wikidata-link" style="font-size: 0.85em">[[[d:' .. tostring(entidat) .. '|editar datos en Wikidata]]]</div>'
if (entidat ~= mw.wikibase.getEntityIdForCurrentPage()) and (mw.title.getCurrentTitle().namespace == 0 or mw.title.getCurrentTitle().namespace == 104) then
textoPie = textoPie .. '[[Categoría:Biquipedia:Articlos con fichas que emplegan acceso arbitrario]]'
end
else
textoPie = "<small>'''Pachina no enlazada a [[Wikidata]]'''\n"..
"* Si no existe en atras Wikipedias: [<span class=plainlinks>[//www.wikidata.org/w/index.php?title=Special:NewItem&site=eswiki&page="..mw.uri.encode(enlacePachina,WIKI) .."&label="..mw.uri.encode(etiquetaPachina,WIKI) .." crea nuevo ítem]]</span>\n"..
"* Si existe en atras Wikipedias: [<span class=plainlinks>[[:d:Special:ItemByTitle|busca ítem para enlazar]]</span>]\n"..
"y ashibe o enlace en aragonés: ".. enlacePachina ..".</small>"
end
if textoPie ~= '' then
root
.tag('tr')
.tag('td')
.addClass('noprint')
.attr('colspan', '3')
.css('text-align', 'left')
.wikitext(textoPie)
end
end
local function ferCategoriasSeguimiento()
if args.decat ~= 'si' and #(getArgNums('datos')) == 0 and not args[1] and mw.title.getCurrentTitle().namespace == 0 then
root.wikitext('[[Categoría:Biquipedia:Articlos que emplegan ficha sin datos en ringleras]]')
end
if CategorizacionAByAD.hasAnyBadge() == '1' then
root.wikitext(CategorizacionAByAD.badgesCategories())
end
end
function _infobox()
if args.child ~= 'si' and args.integrada ~= 'sí' then
root = HtmlBuilder.create('table')
root -- Estilo de toda a ficha
.addClass('infobox')
.addClass(args.clase)
.cssText('width:22.7em; line-height: 1.4em; text-align:left; padding:.23em') -- Lo mesmo que a plantilla:Ficha
.cssText(args.estilo)
if args.estilo and (mw.title.getCurrentTitle().namespace == 10) then -- Para que sólo lo adhiba en o espacio de nombres plantilla
root.wikitext('[[Categoría:Biquipedia:Fichas con o parametro estilo]]')
end
ferTitol()
ferRingleraAlto()
else
root = HtmlBuilder.create()
if args.titol then
root.wikitext("'''" .. args.titol .. "'''")
end
end
ferSubtitols()
ferImachenSuperior()
ferImachensLaterals()
ferRinglerasSuperiors()
ferImachens()
if not args[1] then
ferRingleras()
else
ferRinglerasTabla(args)
end
hacerImagenInferior()
ferPietDeTabla()
ferBarraDeNavegacion()
ferBarraWikidata()
ferCategoriasSeguimiento()
return tostring(root)
end
local function touchParameters(prefixTable, orichArgs, step)
-- Analiza os parametros con os prefixos daus, en orden por lotes y con a grandaria especificada a step.
-- Isto ye para privar que referencias etc aparezcan en l'orden entivocau.
if type(prefixTable) ~= 'table' or type(orichArgs) ~= 'table' then
error("Dentrada no valida detectada pa la función touchParameters. Os dos parametros han d'estar tablas.", 2)
end
if step and type(step) ~= 'number' then
error("Detectada valor no numerica en step.", 2)
end
step = step or 20 -- Si no se le da a grandaria a step, a valor predeterminada ye 20.
local temp
local a = 1 -- variable de contador.
local moreArgumentsExist = true
for j,v in ipairs(prefixTable) do
if not type(v) == "string" then
error("Detectada una valor que no ye string en o prefixo d'a tabla por a función touchParameters.", 2)
end
temp = orichArgs[v]
end
while moreArgumentsExist == true do
moreArgumentsExist = false
for i = a, a + step - 1 do
for j,v in ipairs(prefixTable) do
temp = orichArgs[v .. tostring(i)]
if temp then
moreArgumentsExist = true
end
end
end
a = a + step
end
end
function p.infobox(frame)
local orichArgs
marco = frame
-- Si se grita a traviés de #invoke, emplegue os argumentos pasaus a la plantilla d'invocación.
-- D'atra man, para fins de prueba, asume args que se pasan dreitament como parametros.
if frame == mw.getCurrentFrame() then
orichArgs = frame:getParent().args
else
orichArgs = frame
end
-- Analizar os parametros de datos en o mesmo orden que a plantilla {{ficha}} lo fa, por lo que
-- referencias etc. s'amostrarán en os puestos previstos.
local temp
temp = orichArgs.titol
temp = orichArgs.alto
touchParameters({'subtitol'}, orichArgs, 5)
touchParameters({'imachen', 'piet'}, orichArgs, 5)
touchParameters({'seccion', 'etiqueta', 'datos'}, orichArgs, 20)
temp = orichArgs.pietdetabla
-- L'analizador de funcions considera que una cadena vueita ye falsa, por lo que pa preservar l'anterior
-- comportamiento de {{Ficha}}, s'han de cambear os argumentos vueitos ta cero, por lo que Lua los considerará
-- que son falsos tamién (excepto parametros 'title cursiva', que especifica un comportamiento diferent
-- pendendo de si ye ausent u vueito)
args = {}
for k, v in pairs(orichArgs) do
if v ~= '' then
args[k] = v
end
end
return _infobox()
end
return p