Module:Loop

From StarfinderWiki

This loop implementation loops over arguments in the form of somename1, somename2. It only expands wikitext afterwards which makes it safe to use with categories and other templates.

Usage: {{ #invoke:Loop | arguments | myArgumentName | [[Category:{{{myArgumentName$n$}}}]] }}

resulting in effectively {{#if: {{{myArgumentName1|}}}|[[Category:{{{myArgumentName1}}}]]| }} {{#if: {{{myArgumentName2|}}}|[[Category:{{{myArgumentName2}}}]]| }}...


local p = {} --p stands for package

function p.arguments( frame )
    local argumentName = frame.args[1]
    argumentName = mw.ustring.match(argumentName, "^%s*(.-)%s*$") -- trim spaces
    local text = frame.args[2]

    -- collect keys and order them
    local keys = {}
    for k in pairs(frame:getParent().args) do
        local from, to, match = string.find(k, "^"..argumentName.."(%d+)$")
        if from ~= nil then
            table.insert(keys, tonumber(match))
        end
        
    end
    table.sort(keys)

    local result = "";
    for i = 1, #keys do
        local name = argumentName..keys[i]
        local parsed = mw.ustring.gsub( text, "{{{ *"..argumentName.." *}}}", "{{{"..name .."}}}" )
        parsed = mw.ustring.gsub( parsed, "{{{ *"..argumentName.."%$n%$ *}}}", "{{{"..name.."}}}" )
        result = result .. "{{#if: {{{"..name.."|}}}|"..parsed.."| }}"
    end
    return frame:getParent():preprocess(result)
end

function p.matches( frame )
    local input = frame.args[1]
    local pattern = frame.args[2]
    local replace = frame.args[3]
    
    local result = "";
    for match in mw.ustring.gmatch(input, pattern) do
    	result = result .. mw.ustring.gsub(replace, "%%1", match);
    end
    return frame:getParent():preprocess(result)
end

return p