Module:Vgregion

From RPCS3 Wiki
Revision as of 14:24, 17 March 2024 by HerrHulaHoop (talk | contribs) (Test version of VGregion)

This module provides the vgregion template the capabilities to store and arrange dates entered.

Attribution and re-use

This module has been adapted from Wikipedia released under the Creative Commons Attribution-ShareAlike License 4.0.


require('strict')

local getArgs = require('Module:Arguments').getArgs
local cd = require('Module:CountryData')
local list = require('Module:List');
local p = {}

local knownargs = {
    ['format'] = true,
    ['class'] = true,
    ['style'] = true,
    ['list_style'] = true,
    ['item_style'] = true,
    ['item1_style'] = true,
    ['indent'] = true
}

local labels = {
    ['NA'] = "[[North America|NA]]",
    ['EU'] = "[[Europe|EU]]",
    ['EUR'] = "[[Europe|EU]]",
    ['AU'] = "[[Australasia|AU]]",
    ['AUS'] = "[[Australasia|AU]]",
    ['PAL'] = "[[PAL region|PAL]]",
    ['SEA'] = "[[Southeast Asia|SEA]]",
    ['AS'] = "[[Asia|AS]]",
    ['SA'] = "[[South America|SA]]",
    ['OC'] = "[[Oceania|OC]]",
    ['WW'] = "<abbr title=\"Worldwide\">WW</abbr>"
}

local function getLocalLabel(alias)
    local label = labels[string.upper(alias)]

    return label
end

local countryData = {} -- Used to store country data to avoid the need of repeated calls to Module:CountryData. This saves a little time if the same abbreviation appears multiple times in the template.

local function getCountryData(frame, alias)
    local ualias = string.upper(alias)

    if (countryData[ualias] == nil) then
        local cdtable = cd.gettable(frame, alias, {})
        countryData[ualias] = cdtable['alias']
    end

    return countryData[ualias]
end

local function splitLabel(s)
    local islist = true
    local res = {}
    for k,v in ipairs(mw.text.split(s or '', '%s*/%s*')) do
        local v1 = v:match('^%s*([A-Z][A-Z][A-Z]?)%s*$')
        if v1 then
            table.insert(res,v1)
        else
            local v2 = v:match('^%s*(%[%[[^%[%]|]*|[A-Z][A-Z][A-Z]?%]%])%s*$')
            if v2 then
                table.insert(res,v2)
            else
                islist = false
            end
        end
    end
    return islist and res or {s}
end

function p.main(frame)
    local args = getArgs(frame)
    local listformat = args['format'] or "unbulleted"
    local items = {}

    if args[3] and not args[4] then
        local item = "[["
        if args[1] then
            item = item .. args[1]
        end
        item = item .. "|"
        if args[2] then
            item = item .. args[2]
        end
        item = item .. "]]: " .. args[3] .. "[[Category:Pages using vgrelease with two parameter region]]"
        table.insert(items, item)
    elseif not args[1] and args[2] then
        local item = args[2] .. "[[Category:Pages using vgrelease without a region]]"
        table.insert(items, item)
    else
        local i = 1
        local j = 2
        while args[i] and args[j] do
            local labels = {}
            for k,v in ipairs(splitLabel(args[i])) do
                local label = getLocalLabel(v)
                if not label then
                    if not v:match('^%s*%[') then
                        label = getCountryData(frame, v)
                    end
                    if label then
                        label = "[[" .. label .. "|" .. v .. "]]"
                    else
                        label = v
                    end
                end
                table.insert(labels, label)
            end
            local item = table.concat(labels, '/') .. ": " .. args[j]
            table.insert(items, item)
            i = i + 2
            j = j + 2
        end
    end

    for k, v in pairs(args) do
        if knownargs[k] then
            items[k] = v
        end
    end

    local out = list.makeList(listformat, items)

    local parameterMsg = require('Module:If preview')._warning({'Unknown parameter "_VALUE_".'}) .. "[[Category:Pages using vgrelease with named parameters|_VALUE_]]"

    for k, v in pairs(args) do
        if type(k) ~= 'number' and not knownargs[k] then
            local msg = parameterMsg:gsub('_VALUE_', k)
            out = out .. msg
        end
    end

    return out
end

return p