Actions

Module

Module:Chain

From Project Rebearth

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

local p = {}

function p.render(frame)
    local args = frame.args
    local parent = frame:getParent()
    local pargs = parent and parent.args or {}

    local items = {}
    for i = 1, 15 do
        local val = args[i] or pargs[i]
        if val then
            val = mw.text.trim(val)
            if val ~= '' then
                items[#items + 1] = val
            end
        end
    end

    if #items < 1 then
        return ''
    end

    local title = mw.text.trim(args.title or pargs.title or '')
    local direction = mw.text.trim(args.direction or pargs.direction or ''):lower()
    local isVertical = (direction == 'vertical')

    local root = mw.html.create('div'):addClass('rb-chain')
    if isVertical then
        root:addClass('rb-chain-vertical')
    end

    if title ~= '' then
        root:tag('div')
            :addClass('rb-chain-title')
            :wikitext(title)
    end

    for i, name in ipairs(items) do
        if i > 1 then
            root:tag('div')
                :addClass('rb-chain-arrow')
                :wikitext('→')
        end

        local isResource = (i % 2 == 1)
        local parts = isResource and mw.text.split(name, '+') or nil

        if parts and #parts > 1 then
            local group = root:tag('div'):addClass('rb-chain-group')
            for _, part in ipairs(parts) do
                group:tag('div')
                    :addClass('rb-chain-step')
                    :addClass('rb-chain-resource')
                    :wikitext(frame:expandTemplate{ title = 'Icon', args = { mw.text.trim(part) } })
            end
        else
            local step = root:tag('div')
                :addClass('rb-chain-step')
                :addClass(isResource and 'rb-chain-resource' or 'rb-chain-building')

            local label = isResource
                and frame:expandTemplate{ title = 'Icon', args = { name } }
                or  '[[' .. name .. ']]'
            step:wikitext(label)
        end
    end

    return tostring(root)
end

return p