Diferencia entre revisiones de «Módulo:Ficha»

De la Enciclopedia Colchagüina
Diego Grez (discusión | contribs.)
m Revertidos los cambios de Diego Grez (disc.) a la última edición de [[User:>Leoncastro|>Leoncastro]]
Etiqueta: Reversión
Diego Grez (discusión | contribs.)
Sin resumen de edición
Línea 11: Línea 11:
local root
local root
local anchoImagen = '320px'  
local anchoImagen = '320px'  
function union(t1, t2)
function union(t1, t2)
     -- devuelve la unión de los valores de dos tablas, como una secuencia
     -- devuelve la unión de los valores de dos tablas, como una secuencia
Línea 49: Línea 50:
                 .tag('th')
                 .tag('th')
                     .attr('colspan', 3)
                     .attr('colspan', 3)
                .addClass('section')
                    .addClass('section')
                     .addClass(rowArgs.clasefila)
                     .addClass(rowArgs.clasefila)
                     .css('text-align', 'center')
                     .css('text-align', 'center')
Línea 62: Línea 63:
                     .attr('scope', 'row')
                     .attr('scope', 'row')
                     .css('text-align', 'left')
                     .css('text-align', 'left')
.addClass('label')
                    .addClass('label')
                     .addClass(rowArgs.clasefila)
                     .addClass(rowArgs.clasefila)
                     .cssText (rowArgs.estiloetiqueta or args.estiloetiqueta)
                     .cssText (rowArgs.estiloetiqueta or args.estiloetiqueta)
Línea 82: Línea 83:
             .addClass(rowArgs.clase)
             .addClass(rowArgs.clase)
             .cssText (rowArgs.estilodatos or args.estilodatos)
             .cssText (rowArgs.estilodatos or args.estilodatos)
        -- Se añade un salto de línea porque si no se hace así y por ejemplo en los
        -- datos hay una lista con asteriscos en el primer elemento se muestra
        -- un asterisco.
        -- Se trata de un error que ya ocurre con tablas normales sin LUA. Por ejemplo
        -- {|
        -- | * elemento1
        -- * elemento2
        -- |}
        -- El salto de línea ya se producía en la plantilla Ficha/fila
             .wikitext('\n' .. rowArgs.datos)
             .wikitext('\n' .. rowArgs.datos)
            --.newline()
     end
     end
end
end
Línea 261: Línea 251:
       if args.pieizquierdo then brcondicionalizquierdo = 'br' end
       if args.pieizquierdo then brcondicionalizquierdo = 'br' end
       if args.piederecho then brcondicionalderecho = 'br' end
       if args.piederecho then brcondicionalderecho = 'br' end
     
       
       root
       root
         .tag('tr')
         .tag('tr')
         .tag('td')
         .tag('td')
        --.attr('cellspacing', '0em')
        --.attr('padding','0em')
         .attr('colspan', '3')
         .attr('colspan', '3')
         .css('align', 'center')
         .css('align', 'center')
         .tag('table') -- tiene que ir dentro de una tabla para que las filas no lo deformen
         .tag('table')  
         .css('width', '100%')
         .css('width', '100%')
         .addClass('mergedrow')
         .addClass('mergedrow')
Línea 276: Línea 264:
             .css('text-align', 'center')
             .css('text-align', 'center')
                 .addClass(args.claseimagenizquierda)
                 .addClass(args.claseimagenizquierda)
                 .css('align', 'center')-- Se alinea en el centro horizontal
                 .css('align', 'center')
                 .css('text-align', 'center') -- Se alinea en el centro horizontal
                 .css('text-align', 'center')  
                 .css('vertical-align', 'middle')-- Se alinea en el centro vertical
                 .css('vertical-align', 'middle')  
                 .cssText(args.estiloimagenizquierda)
                 .cssText(args.estiloimagenizquierda)
                 .wikitext('[[Archivo:' .. args.imagenizquierda .. '|' .. args['tamañoimagenizquierda'] .. ']]' )
                 .wikitext('[[Archivo:' .. args.imagenizquierda .. '|' .. args['tamañoimagenizquierda'] .. ']]' )
Línea 288: Línea 276:
                     .done()
                     .done()
             .tag('td')
             .tag('td')
                 .css('text-align', 'center')-- Se alinea en el centro horizontal
                 .css('text-align', 'center')
                 .css('align', 'center')-- Se alinea en el centro horizontal
                 .css('align', 'center')
                 .css('vertical-align', 'middle')-- Se alinea en el centro vertical
                 .css('vertical-align', 'middle')
                 .addClass(args.claseimagenderecha)
                 .addClass(args.claseimagenderecha)
                 .cssText(args.estiloimagenderecha)       
                 .cssText(args.estiloimagenderecha)       
Línea 302: Línea 290:
                 .newline()
                 .newline()
     elseif args.imagenderecha or args.imagenizquierda then  
     elseif args.imagenderecha or args.imagenizquierda then  
-- Si solo una de las dos, la imagen que aparezca estará en el centro
         imagenL = {}     
         imagenL = {}     
           if args.imagenderecha ~= '' and  args.imagenderecha ~= nil then
           if args.imagenderecha ~= '' and  args.imagenderecha ~= nil then
Línea 334: Línea 321:
     end
     end
              
              
local function hacerImagenes() -- Puede crear un número infinito de imágenes
local function hacerImagenes()  
     if args.imagen then
     if args.imagen then
         args.imagen1 = args.imagen
         args.imagen1 = args.imagen
Línea 357: Línea 344:
             end
             end
          
          
        -- Comprobamos si se ha activado el argumento imagenmodooscuro para esta imagen
         local claseInversion = args['imagenmodooscuro' .. num] and 'class=skin-invert-image' or ''
         local claseInversion = args['imagenmodooscuro' .. num] and 'class=skin-invert-image' or ''
              
              
         imagen  = {}
         imagen  = {}
             local cadenaBusqueda = mw.ustring.gsub(args['imagen'..num],'UNIQ','[') -- Para que no de problemas con ciertas plantillas
             local cadenaBusqueda = mw.ustring.gsub(args['imagen'..num],'UNIQ','[')  
             if mw.ustring.find(cadenaBusqueda, '[{[|]') == nil then -- Comprueba si hay [ o { para no añadir prefijo
             if mw.ustring.find(cadenaBusqueda, '[{[|]') == nil then  
             imagen = ('[[Archivo:' .. args['imagen' .. num] .. '|'.. args['tamañoimagen' ..num] .. '|' .. claseInversion .. ']]' )
             imagen = ('[[Archivo:' .. args['imagen' .. num] .. '|'.. args['tamañoimagen' ..num] .. '|' .. claseInversion .. ']]' )
             else  
             else  
Línea 369: Línea 355:
         local datos = HtmlBuilder.create().wikitext(imagen)
         local datos = HtmlBuilder.create().wikitext(imagen)
         if pie and not flotante then
         if pie and not flotante then
        datos
            datos
                 .tag('br', {selfClosing = true})
                 .tag('br', {selfClosing = true})
                     .done()
                     .done()
Línea 409: Línea 395:


function tieneDatosFila(fila)
function tieneDatosFila(fila)
    -- Función que devuelve true si la fila o grupo de filas (en el caso de
    -- secciones) tiene datos.
   
     if fila.tipo == 'sección' or fila.tipo == 'seccion' then
     if fila.tipo == 'sección' or fila.tipo == 'seccion' then
         for k, filaSeccion in ipairs(fila) do
         for k, filaSeccion in ipairs(fila) do
Línea 515: Línea 498:
end
end
function hacerFilasTabla(tabla)
function hacerFilasTabla(tabla)
    -- Función que compone las filas de una tabla bien la ficha o bien una sección de la misma.
   
     local anadidoTituloSeccion = false
     local anadidoTituloSeccion = false
      
      
Línea 522: Línea 503:
         if tieneDatosFila(fila) then
         if tieneDatosFila(fila) then
             if fila.tipo == 'sección' or fila.tipo == 'seccion' then
             if fila.tipo == 'sección' or fila.tipo == 'seccion' then
                -- Añadir el título de la sección (si está informado)
                 local tituloSeccion = depurarVacias(fila.titulo) or depurarVacias(fila['título'])
                 local tituloSeccion = depurarVacias(fila.titulo) or depurarVacias(fila['título'])
                 if tituloSeccion then
                 if tituloSeccion then
Línea 531: Línea 511:
                 end
                 end
                 hacerFilasTabla(fila)
                 hacerFilasTabla(fila)
             elseif fila.tipo == 'sección desplegable' or fila.tipo == 'seccion desplegable' then -- FALTA
             elseif fila.tipo == 'sección desplegable' or fila.tipo == 'seccion desplegable' then
             elseif fila.tipo == 'sucesión'or fila.tipo == 'sucesion' then
             elseif fila.tipo == 'sucesión'or fila.tipo == 'sucesion' then
                 anadirSucesion({
                 anadirSucesion({
Línea 543: Línea 523:
                     ['color']        = depurarVacias(fila['color'])
                     ['color']        = depurarVacias(fila['color'])
                 })
                 })
             elseif fila.tipo == 'dos columnas'  then -- FALTA
             elseif fila.tipo == 'dos columnas'  then  
             elseif fila.tipo == 'tres columnas' then -- FALTA            
             elseif fila.tipo == 'tres columnas' then             
             else                      -- Etiqueta + Datos o solo Datos
             else                       
                 anadirfila({
                 anadirfila({
                     etiqueta      = depurarVacias(fila[1]) or depurarVacias(fila['etiqueta']),
                     etiqueta      = depurarVacias(fila[1]) or depurarVacias(fila['etiqueta']),
Línea 559: Línea 539:
end
end


local function hacerBarraDeNavegacion()-- Crea en la parte inferior un enlace a la plantilla que se de con nombre
local function hacerBarraDeNavegacion()
     if not args.nombre then return end
     if not args.nombre then return end
      
      
Línea 573: Línea 553:
end
end


local function hacerBarraWikidata()-- Crea en la parte inferior un enlace al ítem de Wikidata
local function hacerBarraWikidata()
 
    -- PARCHE: Si la extensión Wikibase no está instalada, salimos de la función sin arrojar error.
    if not mw.wikibase then return end
 
     local enlacePagina = mw.title.getCurrentTitle().prefixedText  
     local enlacePagina = mw.title.getCurrentTitle().prefixedText  
     local etiquetaPagina = mw.ustring.gsub(enlacePagina,'%s%(.*%)','')  
     local etiquetaPagina = mw.ustring.gsub(enlacePagina,'%s%(.*%)','')  
Línea 584: Línea 566:
         textoPie = '<div class="plainlinks wikidata-link" style="font-size: 0.85em">&#x5B;[[d:' .. tostring(entidad) .. '|editar datos en Wikidata]]&#x5D;</div>'
         textoPie = '<div class="plainlinks wikidata-link" style="font-size: 0.85em">&#x5B;[[d:' .. tostring(entidad) .. '|editar datos en Wikidata]]&#x5D;</div>'
         if (entidad ~= mw.wikibase.getEntityIdForCurrentPage()) and (mw.title.getCurrentTitle().namespace == 0 or mw.title.getCurrentTitle().namespace == 104)  then
         if (entidad ~= mw.wikibase.getEntityIdForCurrentPage()) and (mw.title.getCurrentTitle().namespace == 0 or mw.title.getCurrentTitle().namespace == 104)  then
        textoPie = textoPie .. '[[Categoría:Wikipedia:Artículos con fichas que utilizan acceso arbitrario]]'
            textoPie = textoPie .. '[[Categoría:Wikipedia:Artículos con fichas que utilizan acceso arbitrario]]'
         end
         end
     else
     else
Línea 593: Línea 575:
     end
     end
     if textoPie ~= '' then
     if textoPie ~= '' then
    root
        root
        .tag('tr')
            .tag('tr')
            .tag('td')
                .tag('td')
                .addClass('noprint')
                    .addClass('noprint')
                .attr('colspan', '3')
                    .attr('colspan', '3')
                .css('text-align', 'left')
                    .css('text-align', 'left')
                .wikitext(textoPie)
                    .wikitext(textoPie)
     end
     end
end
end
local function hacerCategoriasSeguimiento()
local function hacerCategoriasSeguimiento()
     if args.decat ~= 'si' and #(getArgNums('datos')) == 0 and not args[1] and mw.title.getCurrentTitle().namespace == 0 then
     if args.decat ~= 'si' and #(getArgNums('datos')) == 0 and not args[1] and mw.title.getCurrentTitle().namespace == 0 then
Línea 608: Línea 591:
      
      
     if CategorizacionAByAD.hasAnyBadge() == '1' then
     if CategorizacionAByAD.hasAnyBadge() == '1' then
    root.wikitext(CategorizacionAByAD.badgesCategories())
        root.wikitext(CategorizacionAByAD.badgesCategories())
end
    end
end
end


Línea 616: Línea 599:
         root = HtmlBuilder.create('table')
         root = HtmlBuilder.create('table')
          
          
         root  -- Estilo de toda la ficha       
         root   
             .addClass('infobox')
             .addClass('infobox')
             .addClass(args.clase)
             .addClass(args.clase)
             .cssText('width:22.7em; line-height: 1.4em; text-align:left; padding:.23em') -- Lo mismo que la plantilla:Ficha
             .cssText('width:22.7em; line-height: 1.4em; text-align:left; padding:.23em')  
             .cssText(args.estilo)
             .cssText(args.estilo)
         if args.estilo and (mw.title.getCurrentTitle().namespace == 10) then -- Para que sólo lo añada en el espacio de nombres plantilla
         if args.estilo and (mw.title.getCurrentTitle().namespace == 10) then  
        root.wikitext('[[Categoría:Wikipedia:Fichas con el parámetro estilo]]')
            root.wikitext('[[Categoría:Wikipedia:Fichas con el parámetro estilo]]')
         end
         end
      
      
Línea 653: Línea 636:
     return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Plantilla:Ficha/imagelimit.css' } } .. tostring(root)
     return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Plantilla:Ficha/imagelimit.css' } } .. tostring(root)
end
end
local function touchParameters(prefixTable, origArgs, step)
local function touchParameters(prefixTable, origArgs, step)
    -- Analiza los parámetros con los prefijos dados, en orden por lotes lotes y con el tamaño  especificado a step.
    -- Esto es para evitar referencias etc aparezca en el orden equivocado.
     if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
     if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
         error("Entrada no válida detectada para la función touchParameters. Ambos parámetros deben ser tablas.", 2)
         error("Entrada no válida detectada para la función touchParameters. Ambos parámetros deben ser tablas.", 2)
Línea 663: Línea 645:
     end
     end
   
   
     step = step or 20 -- Si no se le da el tamaño a step, el valor predeterminado es 20.
     step = step or 20  
     local temp
     local temp
     local a = 1 -- variable de contador.
     local a = 1  
     local moreArgumentsExist = true
     local moreArgumentsExist = true
     for j,v in ipairs(prefixTable) do
     for j,v in ipairs(prefixTable) do
Línea 686: Línea 668:
     end
     end
end  
end  
function p.infobox(frame)
function p.infobox(frame)
     local origArgs
     local origArgs
     marco = frame
     marco = frame
    -- Si se llama a través de #invoke, utilice los argumentos pasados ​​a la plantilla de invocación.
    -- De lo contrario, para fines de prueba, asume args que se pasan directamente como parámetros.
     if frame == mw.getCurrentFrame() then
     if frame == mw.getCurrentFrame() then
         origArgs = frame:getParent().args
         origArgs = frame:getParent().args
Línea 696: Línea 677:
         origArgs = frame
         origArgs = frame
     end
     end
-- Analizar los parámetros de datos en el mismo orden que la plantilla {{ficha}} lo hace, por lo que
-- referencias etc. se mostrarán en los lugares previstos.
     local temp
     local temp
     temp = origArgs.titulo
     temp = origArgs.titulo
Línea 706: Línea 685:
     temp = origArgs.piedetabla
     temp = origArgs.piedetabla


    -- El analizador de funciones  considera que una cadena vacía es falsa, por lo que para preservar el anterior
    -- comportamiento de {{Ficha}}, debe cambiar los argumentos vacíos a cero, por lo que Lua los considerará
    -- que son falsos también (excepto parámetros 'title cursiva', que especifica un comportamiento diferente
    -- dependiendo de si está ausente o vacío)
     args = {}
     args = {}
     for k, v in pairs(origArgs) do
     for k, v in pairs(origArgs) do

Revisión del 20:31 6 jul 2026

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

--
-- Este módulo es para implementar en {{Ficha}}
--
 
local p = {}
 
local HtmlBuilder = require('Module:HtmlBuilder')
local CategorizacionAByAD = require('Módulo:Categorización de buenos y destacados')
local marco = {} 
local args
local root
local anchoImagen = '320px' 

function union(t1, t2)
    -- devuelve la unión de los valores de dos tablas, como una secuencia
    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 depurarVacias(contenido)
    if contenido and contenido ~= '' then
        return contenido
    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 anadirfila(rowArgs)
    if rowArgs.seccion then
        root
            .tag('tr')
                .tag('th')
                    .attr('colspan', 3)
                    .addClass('section')
                    .addClass(rowArgs.clasefila)
                    .css('text-align', 'center')
                    .cssText(rowArgs.estiloseccion or args.estiloseccion)
                    .wikitext(rowArgs.seccion)
    elseif rowArgs.datos then
        local fila = root.tag('tr')
        fila.addClass(rowArgs.clasefila)
        if rowArgs.etiqueta then
            fila
                .tag('th')
                    .attr('scope', 'row')
                    .css('text-align', 'left')
                    .addClass('label')
                    .addClass(rowArgs.clasefila)
                    .cssText (rowArgs.estiloetiqueta or args.estiloetiqueta)
                    .wikitext(rowArgs.etiqueta)
                    .done()
        end
        
        local datosCelula = fila.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)
            .wikitext('\n' .. rowArgs.datos)
    end
end

local function hacerTitulo() -- Cabecera de la ficha
    if not args.titulo then return end
local cabecera = {}    
    if args.media == 'si' and args.clasetitulo then
      cabecera = 'media ' .. args['clasetitulo']
    elseif args.media == 'si' then
      cabecera = 'media ' 
    elseif args.tipocabecera then
      cabecera = 'cabecera ' .. args.tipocabecera
    elseif args.clasetitulo then
      cabecera = 'cabecera ' .. args.clasetitulo
    else 
      cabecera = 'cabecera '
    end
    root
        .tag('tr')
           .tag('th')
              .attr('colspan', 3)
              .addClass(cabecera)
              .css('text-align', 'center')
              .cssText( (args.colorfondo or args.colorfondotitulo) and ('background-color:' .. (args.colorfondo or args.colorfondotitulo)) )
              .cssText( (args.colortexto or args.colorfondo or args.colorfondotitulo) and ('color:' .. (args.colortexto or 'inherit')) )
              .cssText(args.estilotitulo)
              .wikitext(args.titulo)
end
local function hacerFilaArriba()
    if not args.arriba and not args.titulo2 then return end
 
    root
        .tag('tr')
            .tag('th')
                .attr('colspan', 3)
                .addClass(args.clasearribaor or args.clasetitulo2)
                .css('text-align', 'center')
                .css('font-size', '125%')
                .css('font-weight', 'bold')
                .cssText(args.estiloarriba or args.estilotitulo2)
                .wikitext(args.arriba or args.titulo2)
end

local function hacerPieDeTabla()-- Pie de tabla, aparecerá abajo de la ficha
    if not args.piedetabla then return end
    
    root
        .tag('tr')
            .tag('td')
                .attr('colspan', '3')
                .addClass(args.clasepiedetabla)
                .css('text-align', 'center')
                .cssText(args.estilopiedetabla)
                .wikitext(args.piedetabla)
end
local function hacerImagenInferior()-- Imagen que aparecerá en la parte inferior de la tabla
    if not args.imageninferior then return end
            imageninferior  = {}
            if args['tamañoimageninferior']  == nil or args['tamañoimageninferior'] == '' then
                 args['tamañoimageninferior'] = anchoImagen
            end
            if string.find(args.imageninferior, '[{[]') == nil then
            imageninferior = ('[[Archivo:' .. args.imageninferior .. '|'.. args['tamañoimageninferior'] .. ']]' )
            else 
            imageninferior = args.imageninferior
            end
    
    root
        .tag('tr')
            .tag('td')
                .attr('colspan', '3')
                .addClass('imagen ' .. (args.claseimageninferior or '') )
                .css('text-align', 'center')
                .cssText(args.estiloimageninferior)
                .newline()
                .wikitext(imageninferior)
                .tag('br', {selfClosing = true})
                    .done()
                .tag('div')
                    .css('display','inline')
                    .cssText(args.estilopieinferior)
                    .wikitext(args.pieinferior)
                    .done()
                    .newline()
end

local function hacerImagenSuperior()-- Imagen que aparecerá en la parte superior de la tabla
    if not args.imagensuperior then return end
    if args['tamañoimagensuperior']  == nil or args['tamañoimagensuperior']  == '' then
            args['tamañoimagensuperior'] = anchoImagen
    end
    imagensuperior  = {}
            if string.find(args.imagensuperior, '[{[]') == nil then
            imagensuperior = ('[[Archivo:' .. args.imagensuperior .. '|'.. args['tamañoimagensuperior'] .. ']]' )
            else 
            imagensuperior = args.imagensuperior
            end
    
    root
        .tag('tr')
            .tag('td')
                .attr('colspan', '3')
                .addClass('imagen ' .. (args.claseimagensuperior or '') )
                .css('text-align', 'center')
                .cssText(args.estiloimagensuperior)
                .newline()
                .wikitext(imagensuperior)
                .tag('br', {selfClosing = true})
                    .done()
                .tag('div')
                    .css('display','inline')
                    .cssText(args.estilopiesuperior)
                    .wikitext(args.piesuperior)
                    .done()
                    .newline()
end

local function hacerSubtitulos()-- Subtítulos de la ficha
    if args.subtitulo then
        args.subtitulo1 = args.subtitulo
    end
    if args.clasesubtitulo then
        args.clasesubtitulo1 = args.clasesubtitulo
    end
    local subtitulonumero = getArgNums('subtitulo')
    for k, num in ipairs(subtitulonumero) do
        anadirfila({
            datos       = args['subtitulo' .. num],
            estilodatos = args['estilosubtitulo' .. num] or args.estilosubtitulo,
            clase       = args.clasesubtitulo,
            clasefila   = args['clasesubtitulo' .. num]
        })
    end
end
local function hacerfilassuperiores()-- filas encima de imagenes laterales 
    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
        anadirfila({
            datos = args['datosup' .. num],
            estilodatos = args['estilodatosup' .. num],
            clase = args.clasedatosup,
            clasefila = args['clasedatosup' .. num]
        })
    end
end
local function hacerImageneslaterales()
-- Imagenes que apareceran arriba de forma geminada por ejemplo escudos y banderas
   
if args['tamañoimagenizquierda'] == "" or args['tamañoimagenizquierda'] == nil then
         args['tamañoimagenizquierda'] = '100px'
      end 
      if args['tamañoimagenderecha'] == "" or args['tamañoimagenderecha'] == nil then
         args['tamañoimagenderecha'] = '100px'
      end
   if args.imagenderecha and args.imagenizquierda then
      if args.pieizquierdo then brcondicionalizquierdo = 'br' end
      if args.piederecho then brcondicionalderecho = 'br' end
         
      root
        .tag('tr')
        .tag('td')
        .attr('colspan', '3')
        .css('align', 'center')
        .tag('table') 
        .css('width', '100%')
        .addClass('mergedrow')
        .tag('tr')
            .tag('td')
            .css('text-align', 'center')
                .addClass(args.claseimagenizquierda)
                .css('align', 'center')
                .css('text-align', 'center') 
                .css('vertical-align', 'middle') 
                .cssText(args.estiloimagenizquierda)
                .wikitext('[[Archivo:' .. args.imagenizquierda .. '|' .. args['tamañoimagenizquierda'] .. ']]' )
                .tag(brcondicionalizquierdo)
                .tag('div')
                    .css('display','inline')
                    .cssText(args.estilopieizquierdo)
                    .wikitext(args.pieizquierdo)
                    .done()
            .tag('td')
                .css('text-align', 'center')
                .css('align', 'center')
                .css('vertical-align', 'middle')
                .addClass(args.claseimagenderecha)
                .cssText(args.estiloimagenderecha)       
                .wikitext('[[Archivo:' .. args.imagenderecha .. '|' .. args['tamañoimagenderecha'] .. ']]' )
                .tag(brcondicionalderecho)
                .tag('div')
                    .css('display','inline')
                    .cssText(args.estilopiederecho)
                    .wikitext(args.piederecho)
                    .done()
                .newline()
     elseif args.imagenderecha or args.imagenizquierda then 
         imagenL = {}    
           if args.imagenderecha ~= '' and  args.imagenderecha ~= nil then
               imagenL = 'imagenderecha'  
           elseif args.imagenizquierda ~= '' and  args.imagenizquierda ~= nil then
               imagenL = 'imagenizquierda'
           end
        pieL = {}
          if args.imagenderecha then
               pieL = 'piederecho' 
          elseif args.imagenizquierda then
               pieL = 'pieizquierdo' 
          end
      root
        .tag('tr')
            .tag('td')
                .attr('colspan', '3')
                .addClass(args['clase' .. imagenL])
                .css('text-align', 'center')
                .cssText(args['estilo' .. imagenL])
                .newline()
                .wikitext('[[Archivo:' ..  args[imagenL] .. '|'.. args['tamaño'..imagenL] .. ']]' )
                .tag('br')
                .tag('div')
                   .css('display','inline')
                   .cssText(args['estilo' .. pieL])
                   .wikitext(args[pieL])
                   .done()
                
    end
    end
            
local function hacerImagenes() 
    if args.imagen then
        args.imagen1 = args.imagen
    end
     if args['tamañoimagen'] then
        args['tamañoimagen1'] = args['tamañoimagen']
     end
     if args['imagenmodooscuro'] then
        args['imagenmodooscuro1'] = args['imagenmodooscuro']
    end

    if args.pie then
        args.pie1 = args.pie
    end
    local imagenums = getArgNums('imagen')

    for k, num in ipairs(imagenums) do
        local pie = args['pie' .. num]
        local flotante = args['imagenflotante' .. num] or false
            if args['tamañoimagen'..num]  == nil then
                args['tamañoimagen'..num]  = anchoImagen
            end
        
        local claseInversion = args['imagenmodooscuro' .. num] and 'class=skin-invert-image' or ''
            
        imagen  = {}
            local cadenaBusqueda = mw.ustring.gsub(args['imagen'..num],'UNIQ','[') 
            if mw.ustring.find(cadenaBusqueda, '[{[|]') == nil then 
            imagen = ('[[Archivo:' .. args['imagen' .. num] .. '|'.. args['tamañoimagen' ..num] .. '|' .. claseInversion .. ']]' )
            else 
            imagen = args['imagen'..num]
            end
        local datos = HtmlBuilder.create().wikitext(imagen)
        if pie and not flotante then
            datos
                .tag('br', {selfClosing = true})
                    .done()
        end
        if pie then
            datos
                .tag('div')
                    .css('display','inline')
                    .cssText(args.estilopie)
                    .wikitext(pie)
                    .done()
        end
        anadirfila({
            datos = tostring(datos),
            estilodatos = args.estiloimagen,
            clase = 'imagen ' .. (args.claseimagen or ''),
            clasefila = args['claseimagen' .. num]
        })
    end
end

local function hacerFilas()
    local filanum = union(getArgNums('seccion'), getArgNums('datos'))
    table.sort(filanum)
    for k, num in ipairs(filanum) do
        anadirfila({
            estilosubtitulo = depurarVacias(args['estilosubtitulo' .. num]),
            seccion         = depurarVacias(args['seccion' .. num]),
            estiloseccion   = depurarVacias(args['estilosección' .. num]),
            etiqueta        = depurarVacias(args['etiqueta' .. num]),
            datos           = depurarVacias(args['datos' .. num]),
            estiloetiqueta  = depurarVacias(args['estiloetiqueta' .. num]),
            estilodatos     = depurarVacias(args['estilodatos' .. num]),
            clase           = depurarVacias(args['clase' .. num]),
            clasefila       = depurarVacias(args['clasefila' .. num])
        })
    end
end

function tieneDatosFila(fila)
    if fila.tipo == 'sección' or fila.tipo == 'seccion' then
        for k, filaSeccion in ipairs(fila) do
            if tieneDatosFila(filaSeccion) then 
                return true
            end
        end
    elseif fila.tipo == 'sucesión' or fila.tipo == 'sucesion' then
        if depurarVacias(fila[1]) or depurarVacias(fila['anterior']) or
           depurarVacias(fila[3]) or depurarVacias(fila['siguiente']) then 
            return true 
        end
    else
        if depurarVacias(fila[2]) or depurarVacias(fila['datos']) then
            return true
        end
    end
    
    return false
end

function anadirSucesion(argumentosSucesion)
    local filaGen = root.tag('tr')
    filaGen.css('font-size', '88%')
    filaGen.css('text-align', 'center')
    
    local celda
    local width
    
    width = '33%'
    
    local celdaGen = filaGen.tag('td').attr('colspan', 3).css('padding', 0)
    local tablaSuc = celdaGen.tag('table')
    tablaSuc.css('width', '100%')
    local fila = tablaSuc.tag('tr')
    
    celda = fila.tag('td')
    celda
            .css('width', width)
            .css('padding', '0.2em 0.1em 0.2em 0')
            .css('vertical-align', 'middle')

    if argumentosSucesion['estilo fuente'] then
           celda
                .tag('div')
                    .css('display','inline')
                    .css('font-style', argumentosSucesion['estilo fuente'])
                    .wikitext(argumentosSucesion.anterior)
                    .done()
    else 
        celda.wikitext(argumentosSucesion.anterior)
    end
        
    if argumentosSucesion['año anterior'] then
        celda
            .tag('br')
            .wikitext('(' .. argumentosSucesion['año anterior'] .. ')')
    end
    
    celda = fila.tag('td')
    celda
         .css('width', width)    
            .css('padding', '0.2em 0.1em')
            .css('vertical-align', 'middle')
            .css('background-color', argumentosSucesion.color or '#E6E8FA')
            
    celda
         .tag('div')
              .css('display','inline')
              .css('font-weight', 'bold')
              .css('font-style', argumentosSucesion['estilo fuente'] or '')
              .wikitext(argumentosSucesion.actual or args.titulo)
              .done()
              
    if argumentosSucesion['año'] then
        celda
            .tag('br')
            .wikitext('(' .. argumentosSucesion['año'] .. ')')
    end              
    
    celda = fila.tag('td')
    celda
            .css('width', width)
            .css('padding', '0.2em 0 0.2em 0.1em')
            .css('vertical-align', 'middle')
        
    if argumentosSucesion['estilo fuente'] then
           celda
                .tag('div')
                    .css('display','inline')
                    .css('font-style', argumentosSucesion['estilo fuente'])
                    .wikitext(argumentosSucesion.siguiente)
                    .done()
    else 
        celda.wikitext(argumentosSucesion.siguiente)
    end
        
    if argumentosSucesion['año siguiente'] then
        celda
            .tag('br')
            .wikitext('(' .. argumentosSucesion['año siguiente'] .. ')')
    end
end
function hacerFilasTabla(tabla)
    local anadidoTituloSeccion = false
    
    for k, fila in ipairs(tabla) do
        if tieneDatosFila(fila) then
            if fila.tipo == 'sección' or fila.tipo == 'seccion' then
                local tituloSeccion = depurarVacias(fila.titulo) or depurarVacias(fila['título'])
                if tituloSeccion then
                    anadirfila({
                        estiloseccion = fila['estilotitulo'] or fila['estilotítulo'],
                        seccion       = tituloSeccion
                   })
                end
                hacerFilasTabla(fila)
            elseif fila.tipo == 'sección desplegable' or fila.tipo == 'seccion desplegable' then
            elseif fila.tipo == 'sucesión'or fila.tipo == 'sucesion' then
                anadirSucesion({
                    ['anterior']      = depurarVacias(fila[1]) or depurarVacias(fila['anterior']),
                    ['actual']        = depurarVacias(fila['actual']),
                    ['siguiente']     = depurarVacias(fila[3]) or depurarVacias(fila['siguiente']),
                    ['año anterior']  = depurarVacias(fila['año anterior']),
                    ['año']           = depurarVacias(fila['año']),
                    ['año siguiente'] = depurarVacias(fila['año siguiente']),
                    ['estilo fuente'] = depurarVacias(fila['estilo fuente']),
                    ['color']         = depurarVacias(fila['color'])
                })
            elseif fila.tipo == 'dos columnas'  then 
            elseif fila.tipo == 'tres columnas' then            
            else                      
                anadirfila({
                    etiqueta       = depurarVacias(fila[1]) or depurarVacias(fila['etiqueta']),
                    datos          = depurarVacias(fila[2]) or depurarVacias(fila['datos']),
                    estiloetiqueta = fila['estiloetiqueta'] or tabla['estiloetiqueta'],
                    estilodatos    = fila['estilodatos']    or tabla['estilodatos'],
                    clase          = fila['clase']          or tabla['clase'],
                    clasefila      = fila['clasefila']      or tabla['clasefila']
                })
            end        
        end
    end   
end

local function hacerBarraDeNavegacion()
    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 hacerBarraWikidata()
    -- PARCHE: Si la extensión Wikibase no está instalada, salimos de la función sin arrojar error.
    if not mw.wikibase then return end

    local enlacePagina = mw.title.getCurrentTitle().prefixedText 
    local etiquetaPagina = mw.ustring.gsub(enlacePagina,'%s%(.*%)','') 
    local entidad = args.entidad 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.entidad) then
        textoPie = ''
    elseif  entidad ~= "" and entidad ~= nil  then
        textoPie = '<div class="plainlinks wikidata-link" style="font-size: 0.85em">&#x5B;[[d:' .. tostring(entidad) .. '|editar datos en Wikidata]]&#x5D;</div>'
        if (entidad ~= mw.wikibase.getEntityIdForCurrentPage()) and (mw.title.getCurrentTitle().namespace == 0 or mw.title.getCurrentTitle().namespace == 104)  then
            textoPie = textoPie .. '[[Categoría:Wikipedia:Artículos con fichas que utilizan acceso arbitrario]]'
        end
    else
        textoPie = "<small>'''Página no enlazada a [[Wikidata]]'''\n"..
"* Si no existe en otras Wikipedias: [<span class=plainlinks>[//www.wikidata.org/w/index.php?title=Special:NewItem&site=eswiki&page="..mw.uri.encode(enlacePagina,WIKI) .."&label="..mw.uri.encode(etiquetaPagina,WIKI) .." crea&nbsp;nuevo&nbsp;ítem]]</span>\n"..
"* Si existe en otras Wikipedias: [<span class=plainlinks>[[:d:Special:ItemByTitle|busca&nbsp;ítem&nbsp;para&nbsp;enlazar]]</span>]\n"..
"y añade el enlace en español: ".. enlacePagina ..".</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 hacerCategoriasSeguimiento()
    if args.decat ~= 'si' and #(getArgNums('datos')) == 0 and not args[1] and mw.title.getCurrentTitle().namespace == 0 then
        root.wikitext('[[Categoría:Wikipedia:Artículos que usan ficha sin datos en filas]]')
    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   
            .addClass('infobox')
            .addClass(args.clase)
            .cssText('width:22.7em; line-height: 1.4em; text-align:left; padding:.23em') 
            .cssText(args.estilo)
        if args.estilo and (mw.title.getCurrentTitle().namespace == 10) then 
            root.wikitext('[[Categoría:Wikipedia:Fichas con el parámetro estilo]]')
        end
    
        hacerTitulo()
        hacerFilaArriba()
    else
        root = HtmlBuilder.create()
        
        if args.titulo then
            root.wikitext("'''" .. args.titulo .. "'''")
        end
    end

    hacerSubtitulos()
    hacerImagenSuperior()
    hacerImageneslaterales()
    hacerfilassuperiores()
    hacerImagenes() 
    if not args[1] then
        hacerFilas()
    else
        hacerFilasTabla(args)
    end
    hacerImagenInferior()
    hacerPieDeTabla()  
    hacerBarraDeNavegacion()
    hacerBarraWikidata()
    hacerCategoriasSeguimiento()
    
    return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Plantilla:Ficha/imagelimit.css' } } .. tostring(root)
end

local function touchParameters(prefixTable, origArgs, step)
    if type(prefixTable) ~= 'table' or type(origArgs) ~= 'table' then
        error("Entrada no válida detectada para la función touchParameters. Ambos parámetros deben ser tablas.", 2)
    end
    if step and type(step) ~= 'number' then
        error("Detectado valor no numérico en step.", 2)
    end
 
    step = step or 20 
    local temp
    local a = 1 
    local moreArgumentsExist = true
    for j,v in ipairs(prefixTable) do
        if not type(v) == "string" then
            error("Detectado un valor que no es string en el prefijo de la tabla por la función touchParameters.", 2)
        end
        temp = origArgs[v]
    end
    while moreArgumentsExist == true do
        moreArgumentsExist = false
        for i = a, a + step - 1 do
            for j,v in ipairs(prefixTable) do
                temp = origArgs[v .. tostring(i)]
                if temp then
                    moreArgumentsExist = true
                end
            end
        end
        a = a + step
    end
end 

function p.infobox(frame)
    local origArgs
    marco = frame
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
    else
        origArgs = frame
    end
    local temp
    temp = origArgs.titulo
    temp = origArgs.arriba
    touchParameters({'subtitulo'}, origArgs, 5)
    touchParameters({'imagen', 'pie'}, origArgs, 5)
    touchParameters({'seccion', 'etiqueta', 'datos'}, origArgs, 20)
    temp = origArgs.piedetabla

    args = {}
    for k, v in pairs(origArgs) do
        if v ~= ''  then
            args[k] = v
        end
    end
 
    return _infobox()
end

return p