Diferencia entre revisiones de «Módulo:HtmlBuilder»

De Hispanopedia
imported>Miguillen
m Miguillen movió la página Module:Module:HtmlBuilder a Module:HtmlBuilder sin dejar una redirección
Supremo (discusión | contribs.)
m 1 revisión importada
 
(No se muestran 6 ediciones intermedias de 4 usuarios)
Línea 2: Línea 2:
   
   
local HtmlBuilder = {}
local HtmlBuilder = {}
 
local metatable = {}
local metatable = {}
 
metatable.__index = function(t, key)
metatable.__index = function(t, key)
     local ret = rawget(t, key)
     local ret = rawget(t, key)
Línea 10: Línea 10:
         return ret
         return ret
     end
     end
   
     ret = metatable[key]
     ret = metatable[key]
     if type(ret) == 'function' then
     if type(ret) == 'function' then
Línea 20: Línea 20:
     end
     end
end
end
 
metatable.__tostring = function(t)
metatable.__tostring = function(t)
     local ret = {}
     local ret = {}
     t._build(ret)
     t._build(ret)
     return table.concat(ret, '')
     return table.concat(ret)
end
end
 
metatable._build = function(t, ret)
metatable._build = function(t, ret)
     if t.tagName then  
     if t.tagName then  
Línea 43: Línea 43:
             end
             end
             table.insert(ret, '"')
             table.insert(ret, '"')
        end
        if t.selfClosing then
            table.insert(ret, ' /')
         end
         end
         table.insert(ret, '>')  
         table.insert(ret, '>')  
Línea 55: Línea 58:
         end
         end
     end
     end
     if t.tagName and not t.unclosed then
     if t.tagName and not t.unclosed and not t.selfClosing then
         table.insert(ret, '</' .. t.tagName .. '>')
         table.insert(ret, '</' .. t.tagName .. '>')
     end
     end
end
end
 
metatable.node = function(t, builder)
metatable.node = function(t, builder)
     if builder then
     if builder then
Línea 66: Línea 69:
     return t
     return t
end
end
 
metatable.wikitext = function(t, ...)  
metatable.wikitext = function(t, ...)  
     local vals = {...}
     local vals = {...}
Línea 76: Línea 79:
     return t
     return t
end
end
 
metatable.newline = function(t)
metatable.newline = function(t)
     table.insert(t.nodes, '\n')
     table.insert(t.nodes, '\n')
     return t
     return t
end
end
 
metatable.tag = function(t, tagName, args)
metatable.tag = function(t, tagName, args)
     args = args or {}
     args = args or {}
Línea 89: Línea 92:
     return builder
     return builder
end
end
 
function getAttr(t, name)
local function getAttr(t, name)
     for i, attr in ipairs(t.attributes) do
     for i, attr in ipairs(t.attributes) do
         if attr.name == name then
         if attr.name == name then
Línea 97: Línea 100:
     end
     end
end
end
 
metatable.attr = function(t, name, val)
metatable.attr = function(t, name, val)
     -- Si una persona establece el atributo de estilo de forma explícita, a continuación, reemplace todos los estilos añadidos previamente con css () y cssText ()
     if type(val) == 'string' or type(val) == 'number' then
    if name == 'style' then
        -- if caller sets the style attribute explicitly, then replace all styles previously added with css() and cssText()
        t.styles = {val}
        if name == 'style' then
        return t
            t.styles = {val}
    end
            return t
        end
    local attr = getAttr(t, name)
       
    if attr then
        local attr = getAttr(t, name)
        attr.val = val
        if attr then
    else
            attr.val = val
        table.insert(t.attributes, {name = name, val = val})
        else
            table.insert(t.attributes, {name = name, val = val})
        end
     end
     end
   
     return t
     return t
end
end
 
metatable.addClass = function(t, class)
metatable.addClass = function(t, class)
     if class then
     if class then
Línea 124: Línea 129:
         end
         end
     end
     end
   
     return t
     return t
end
end
 
metatable.css = function(t, name, val)
metatable.css = function(t, name, val)
     if type(val) == 'string' or type(val) == 'number' then
     if type(val) == 'string' or type(val) == 'number' then
Línea 136: Línea 141:
             end
             end
         end
         end
       
         table.insert(t.styles, {name = name, val = val})
         table.insert(t.styles, {name = name, val = val})
     end
     end
   
     return t
     return t
end
end
 
metatable.cssText = function(t, css)
metatable.cssText = function(t, css)
     if css then
     if css then
Línea 149: Línea 154:
     return t
     return t
end
end
 
metatable.done = function(t)
metatable.done = function(t)
     return t.parent or t
     return t.parent or t
end
end
 
metatable.allDone = function(t)
metatable.allDone = function(t)
     while t.parent do
     while t.parent do
Línea 160: Línea 165:
     return t
     return t
end
end
 
function HtmlBuilder.create(tagName, args)
function HtmlBuilder.create(tagName, args)
     args = args or {}
     args = args or {}
Línea 171: Línea 176:
     builder.parent = args.parent
     builder.parent = args.parent
     builder.unclosed = args.unclosed or false
     builder.unclosed = args.unclosed or false
    builder.selfClosing = args.selfClosing or false
     return builder
     return builder
end
end
 
return HtmlBuilder
return HtmlBuilder

Revisión actual - 11:07 16 jul 2023

Este módulo crea html usando una interfaz fluida Lua.

Uso

para empezar, es necesario cargar el módulo:

HtmlBuilder local = require ('Módule:HtmlBuilder') A continuación, puede crear html usando los siguientes sub-funciones:

  • create() - la función básica. Todas las sub-funciones se denominan de esta.
  • wikitext() - wikitexto texto normal que se produce entre las etiquetas html, o fuera de las etiquetas HTML.
  • allDone() - esto cierra cualquier etiqueta html abierta. Cada llamada a HtmlBuilder debe finalizar con esto, independientemente de si se utiliza cualquier etiqueta o no.
  • tag() - especifica que etiqueta utilizar. Puede ser utilizado para crear etiquetas no cerradas utilizando el unclosed {true} = parámetro.
  • attr() - especifica los atributos utilizados en la etiqueta html.
  • css() - especifica estilos CSS usado en un "estilo" atributo en la etiqueta html. Esta función sub-acepta dos parámetros - la primera es la propiedad css, y el segundo es el valor. Por ejemplo, ('background', 'rojo') .
  • cssText() - establece este estilo css como una cadena de texto que contiene la propiedad css y el valor. Por ejemplo, ('background: red; ")
  • addClass() - esto se suma un valor de más de clase a la etiqueta.

-- Módulo Experimental para la construcción de complementos HTML (por ejemplo, fichas plantillas de navegación) con una interfaz fluida
 
local HtmlBuilder = {}

local metatable = {}

metatable.__index = function(t, key)
    local ret = rawget(t, key)
    if ret then
        return ret
    end
    
    ret = metatable[key]
    if type(ret) == 'function' then
        return function(...) 
            return ret(t, ...) 
        end 
    else
        return ret
    end
end

metatable.__tostring = function(t)
    local ret = {}
    t._build(ret)
    return table.concat(ret)
end

metatable._build = function(t, ret)
    if t.tagName then 
        table.insert(ret, '<' .. t.tagName)
        for i, attr in ipairs(t.attributes) do
            table.insert(ret, ' ' .. attr.name .. '="' .. attr.val .. '"') 
        end
        if #t.styles > 0 then
            table.insert(ret, ' style="')
            for i, prop in ipairs(t.styles) do
                if type(prop) == 'string' then -- added with cssText()
                    table.insert(ret, prop .. ';')
                else -- added with css()
                    table.insert(ret, prop.name .. ':' .. prop.val .. ';')
                end
            end
            table.insert(ret, '"')
        end
        if t.selfClosing then
            table.insert(ret, ' /')
        end
        table.insert(ret, '>') 
    end
    for i, node in ipairs(t.nodes) do
        if node then
            if type(node) == 'table' then
                node._build(ret)
            else
                table.insert(ret, tostring(node))
            end
        end
    end
    if t.tagName and not t.unclosed and not t.selfClosing then
        table.insert(ret, '</' .. t.tagName .. '>')
    end
end

metatable.node = function(t, builder)
    if builder then
        table.insert(t.nodes, builder)
    end
    return t
end

metatable.wikitext = function(t, ...) 
    local vals = {...}
    for i = 1, #vals do
        if vals[i] then
            table.insert(t.nodes, vals[i])
        end
    end
    return t
end

metatable.newline = function(t)
    table.insert(t.nodes, '\n')
    return t
end

metatable.tag = function(t, tagName, args)
    args = args or {}
    args.parent = t
    local builder = HtmlBuilder.create(tagName, args)
    table.insert(t.nodes, builder)
    return builder
end

local function getAttr(t, name)
    for i, attr in ipairs(t.attributes) do
        if attr.name == name then
            return attr
        end
    end
end

metatable.attr = function(t, name, val)
    if type(val) == 'string' or type(val) == 'number' then
        -- if caller sets the style attribute explicitly, then replace all styles previously added with css() and cssText()
        if name == 'style' then
            t.styles = {val}
            return t
        end
        
        local attr = getAttr(t, name)
        if attr then
            attr.val = val
        else
            table.insert(t.attributes, {name = name, val = val})
        end
    end
    
    return t
end

metatable.addClass = function(t, class)
    if class then
        local attr = getAttr(t, 'class')
        if attr then
            attr.val = attr.val .. ' ' .. class
        else
            t.attr('class', class)
        end
    end
    
    return t
end

metatable.css = function(t, name, val)
    if type(val) == 'string' or type(val) == 'number' then
        for i, prop in ipairs(t.styles) do
            if prop.name == name then
                prop.val = val
                return t
            end
        end
        
        table.insert(t.styles, {name = name, val = val})
    end
    
    return t
end

metatable.cssText = function(t, css)
    if css then
        table.insert(t.styles, css)
    end
    return t
end

metatable.done = function(t)
    return t.parent or t
end

metatable.allDone = function(t)
    while t.parent do
        t = t.parent
    end
    return t
end

function HtmlBuilder.create(tagName, args)
    args = args or {}
    local builder = {}
    setmetatable(builder, metatable)
    builder.nodes = {}
    builder.attributes = {}
    builder.styles = {}
    builder.tagName = tagName
    builder.parent = args.parent
    builder.unclosed = args.unclosed or false
    builder.selfClosing = args.selfClosing or false
    return builder
end

return HtmlBuilder