Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Sort

From Teriock

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

local p = {}

function formatItem(item, format, replace1, with1, replace2, with2, replace3, with3)
    out = tostring(format:gsub("##", item))
    if replace1 and with1 then
        out = out:gsub(replace1, with1)
    end
    if replace2 and with2 then
        out = out:gsub(replace2, with2)
    end
    if replace3 and with3 then
        out = out:gsub(replace3, with3)
    end
    return out
end

function p.clean(frame)
    local input = frame.args[1] or ""
    local delimiter = frame.args['delimiter'] or frame.args['delim'] or frame.args['d'] or ", "
    local format = frame.args['format'] or frame.args['f'] or "##"
    local replace1 = frame.args['replace1']
    local with1 = frame.args['with1']
    local replace2 = frame.args['replace2']
    local with2 = frame.args['with2']
    local replace3 = frame.args['replace3']
    local with3 = frame.args['with3']
    local addAnd = frame.args['and']
    input = input:gsub("%s*%|%s*", ",") -- Convert DPL separators to commas if present
    local items = {}
    for item in string.gmatch(input, "([^,]+)") do
        local trimmed_item = item:match("^%s*(.-)%s*$")
        table.insert(items, trimmed_item)
    end
    table.sort(items)
    local processed_items = {}
    for _, item in ipairs(items) do
        table.insert(processed_items, formatItem(item, format, replace1, with1, replace2, with2, replace3, with3))
    end
    if addAnd and #processed_items > 1 then
        processed_items[#processed_items] = "and " .. processed_items[#processed_items]
    end
    if addAnd and #processed_items < 3 then
        return frame:preprocess(table.concat(processed_items, ' '))
    else
        return frame:preprocess(table.concat(processed_items, delimiter))
    end
    -- return table.concat(processed_items, delimiter)
end

function p.parse(frame)

    local input = frame.args[1] or ""

    -- DPL-specific preprocessing
    input = input:gsub("%s*%|%s*", ",") -- Convert DPL separators to commas if present

    local pre = ""
    local post = ""
    local prePublic = ""
    local postPublic = ""
    local prePrivate = ""
    local postPrivate = ""
    if frame.args['prepublic'] then
        prePublic = frame.args['prepublic']
    end
    if frame.args['postpublic'] then
        postPublic = frame.args['postpublic']
    end
    if frame.args['preprivate'] then
        prePrivate = frame.args['preprivate']
    end
    if frame.args['postprivate'] then
        postPrivate = frame.args['postprivate']
    end
    if frame.args['wrap'] then
        pre = "{{L|" .. prePrivate .. frame.args['wrap'] .. postPrivate .. "|" .. prePublic .. frame.args['wrap'] .. postPublic .. "|"
        post = "|u=1}}"
    end
    if frame.args['cat'] and frame.args['name'] and frame.args['ns'] then
        pre = "{{Cat|name=" .. frame.args['name'] .. "|ns=" .. frame.args['ns'] .. "|"
        post = "}}"
    end
    if frame.args['item'] and frame.args['name'] and frame.args['ns'] then
        pre = "{{Cat|name=" .. frame.args['name'] .. "|ns=" .. frame.args['ns'] .. "|"
        post = " equipment}}"
    elseif frame.args['item'] and frame.args['ns'] then
        pre = "{{Cat|ns=" .. frame.args['ns'] .. "|"
        post = " equipment}}"
    end
    if frame.args['sub'] then
        pre = pre .. "{{SSub|Ability:"
        post = post .. "}}\n"
    end

    local items = {}
    for item in string.gmatch(input, "([^,]+)") do
        local trimmed_item = item:match("^%s*(.-)%s*$") -- Trim whitespace
        if trimmed_item ~= "Weapon" then
            table.insert(items, pre .. trimmed_item .. post)
        end
    end

    table.sort(items)
    if frame.args['cat'] or frame.args['item'] or frame.args['sub'] then
        return frame:preprocess(table.concat(items, ""))
    else
        if (frame.args['wrap'] == 'Ability') and #items > 1 then
            items[#items] = "and " .. items[#items]
        end
        return frame:preprocess(table.concat(items, ", "))
    end
end

return p