Module:HtmlBuilder

Documentation for this module may be created at Module:HtmlBuilder/doc

-- 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    endendmetatable.__tostring = function(t)    local ret = {}    t._build(ret)    return table.concat(ret)endmetatable._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 .. '>')    endendmetatable.node = function(t, builder)    if builder then        table.insert(t.nodes, builder)    end    return tendmetatable.wikitext = function(t, ...)     local vals = {...}    for i = 1, #vals do        if vals[i] then            table.insert(t.nodes, vals[i])        end    end    return tendmetatable.newline = function(t)    table.insert(t.nodes, '\n')    return tendmetatable.tag = function(t, tagName, args)    args = args or {}    args.parent = t    local builder = HtmlBuilder.create(tagName, args)    table.insert(t.nodes, builder)    return builderendlocal function getAttr(t, name)    for i, attr in ipairs(t.attributes) do        if attr.name == name then            return attr        end    endendmetatable.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 tendmetatable.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 tendmetatable.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 tendmetatable.cssText = function(t, css)    if css then        table.insert(t.styles, css)    end    return tendmetatable.done = function(t)    return t.parent or tendmetatable.allDone = function(t)    while t.parent do        t = t.parent    end    return tendfunction 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 builderendreturn HtmlBuilder
🔥 Top keywords: Special:ListUsersSpecial:UserLoginSpecial:QrCodeSpecial:UrlShortenerSpecial:Log/blockKrataafa TitiriwSpecial:LogSpecial:AbuseLogCategory:Language user templatesSpecial:SearchSpecial:MobileOptionsSpecial:BookSpecial:DownloadAsPdfCategory:YuropSpecial:ListFilesBaike: Community PortalSpecial:BlockListSpecial:GlobalBlockListUser:SilvonenBotBaike: Community portalCategory:WikipediaBaike: AdministratorsUser:タチコマ robotUser:Luckas-botTemplate:Wikipedia languagesCategory:User en-NUser:EmausBotCategory:RɔhyeaSpecial:SpecialPagesTalk:Krataafa TitiriwUser:EscarbotCategory:User frCategory:User ruSpecial:AllPagesCategory:Gaana AmampanyimfoUser:Vanished user 9oijnsdfknefijh3tjasfi34MediaWiki:SitenoticeSpecial:UploadUser:DarkicebotSpecial:ListUsers/sysopSpecial:StatisticsUser:RazorflameUser:MF-Warburg/monobook.jsUser:YosriUser:221.20User:WikiDreamerUser:HuhuSpecial:Contributions/VolkovBotUser:ChuispastonBotCategory:User zhSpecial:Contributions/MinoraxUser:Conquistador/sandboxUser talk:MoiraMoiraCategory:Candidates for speedy deletionUser:WikiDreamer BotCategory:Gaana MmantawCategory:User enCategory:User srUser:TXiKiBoTUser:MahdiBotUser talk:87.97.132.4Category:User ltSpecial:WhatLinksHere/User:ChuispastonBotUser:WhisperToMeCategory:AfrikaSpecial:LonelyPagesUser:Pawelek39File:WhatsApp logo-color-vertical.svgUser:EmausUser:Az1568Special:Contributions/JarrahTreeCategory:User ptTemplate:ClearUser:Baljeet BilaspurCategory:EhyiaUser:Kolega2357User talk:Wim bUser:PurodhaSpecial:WhatLinksHere/User:Ripchip BotSpecial:WithoutInterwikiUser:Anas1712User:ZorroIIIUser talk:AlanUser:.snoopy.User:BlackcatCategory:UkraineUser:Andre EngelsUser:TXiKiUser:Michael BareraUser:NjardarlogarModule:Check for unknown parametersUser:WayiranSpecial:WantedPagesUser:GrimlockTemplate:User fr-1User:John CummingsUser:ZéroBotUser talk:Chabi1User:TheresNoTime