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 argslocal rootlocal 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 retendlocal function depurarVueitas(conteniu)    if conteniu and conteniu ~= '' then        return conteniu    endendlocal 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 numsendlocal 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()    endendlocal function ferTitol() -- Cabecera d'a ficha    if not args.titol then return endlocal 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)endlocal 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)endlocal 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)endlocal 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()endlocal 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()endlocal 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]        })    endendlocal 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]        })    endendlocal 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]        })    endendlocal 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])        })    endendfunction 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 falseendfunction 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'] .. ')')    endendfunction 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   endlocal 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 }                }))endlocal 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">&#x5B;[[d:' .. tostring(entidat) .. '|editar datos en Wikidata]]&#x5D;</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&nbsp;nuevo&nbsp;ítem]]</span>\n".."* Si existe en atras Wikipedias: [<span class=plainlinks>[[:d:Special:ItemByTitle|busca&nbsp;ítem&nbsp;para&nbsp;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)    endendlocal 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())endendfunction _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)endlocal 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    endend 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()endreturn p