|
|
Línea 1: |
Línea 1: |
− | -- Módulo Experimental para la construcción de complementos HTML (por ejemplo, fichas plantillas de navegación) con una interfaz fluida
| + | error('Please use mw.html instead of Module:HtmlBuilder', 2) |
− |
| |
− | 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
| |
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.