Diferencia entre revisiones de «Módulo:HtmlBuilder»
De Familia Sanchez Arjona
m (Changed protection level of Module:HtmlBuilder: Highly visible template or Lua module ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))) |
(Página creada con «-- Experimental module for building complex HTML (e.g. infoboxes, navboxes) using a fluent interface local HtmlBuilder = {} local metatable = {} metatable.__index = f...») |
||
Línea 1: | Línea 1: | ||
-- Experimental module for building complex HTML (e.g. infoboxes, navboxes) using a fluent interface | -- Experimental module for building complex HTML (e.g. infoboxes, navboxes) using a fluent interface | ||
− | + | ||
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 = {} | ||
Línea 26: | Línea 26: | ||
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 59: | Línea 59: | ||
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 66: | ||
return t | return t | ||
end | end | ||
− | + | ||
metatable.wikitext = function(t, ...) | metatable.wikitext = function(t, ...) | ||
local vals = {...} | local vals = {...} | ||
Línea 76: | Línea 76: | ||
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 89: | ||
return builder | return builder | ||
end | end | ||
− | + | ||
function getAttr(t, name) | function getAttr(t, name) | ||
for i, attr in ipairs(t.attributes) do | for i, attr in ipairs(t.attributes) do | ||
Línea 97: | Línea 97: | ||
end | end | ||
end | end | ||
− | + | ||
metatable.attr = function(t, name, val) | metatable.attr = function(t, name, val) | ||
-- if caller sets the style attribute explicitly, then replace all styles previously added with css() and cssText() | -- if caller sets the style attribute explicitly, then replace all styles previously added with css() and cssText() | ||
Línea 104: | Línea 104: | ||
return t | return t | ||
end | end | ||
− | + | ||
local attr = getAttr(t, name) | local attr = getAttr(t, name) | ||
if attr then | if attr then | ||
Línea 111: | Línea 111: | ||
table.insert(t.attributes, {name = name, val = val}) | table.insert(t.attributes, {name = name, val = val}) | ||
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 124: | ||
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 136: | ||
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 149: | ||
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 160: | ||
return t | return t | ||
end | end | ||
− | + | ||
function HtmlBuilder.create(tagName, args) | function HtmlBuilder.create(tagName, args) | ||
args = args or {} | args = args or {} | ||
Línea 173: | Línea 173: | ||
return builder | return builder | ||
end | end | ||
− | + | ||
return HtmlBuilder | return HtmlBuilder |
Revisión del 19:44 31 mar 2013
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.
-- Experimental module for building complex HTML (e.g. infoboxes, navboxes) using a fluent interface 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 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 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 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 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 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 return builder end return HtmlBuilder