| Contenidos de Wikipedia en español bajo licencia CC BY-SA 4.0 ⇔ Mapas de OpenStreetMap bajo licencia ODbL |
Diferencia entre revisiones de «Módulo:HtmlBuilder»
De Hispanopedia
imported>Miguillen Sin resumen de edición |
m 1 revisión importada |
||
| (No se muestran 8 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) | ||
-- | 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 | 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