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 = '[[[d:' .. tostring(entidat) .. '|editar datos en Wikidata]]]' 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 = "'''Pachina no enlazada a [[Wikidata]]'''\n".. "* Si no existe en atras Wikipedias: [[//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]]\n".. "* Si existe en atras Wikipedias: [[[:d:Special:ItemByTitle|busca ítem para enlazar]]]\n".. "y ashibe o enlace en aragonés: ".. enlacePachina .."." 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