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

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