Permanently protected module
From Wikipedia, the free encyclopedia


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 = labelsstring.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 (countryDataualias == nil) then

		local cdtable = cd.gettable(frame, alias, {})

		countryDataualias = cdtable'alias'

	end



	return countryDataualias

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'

	if (listformat == nil or listformat == "") then

		listformat = "unbulleted"

	end

	local items = {}



	-- Old syntax "Two parameter region" use case, where param 1 is an article, param 2 is a label, and param 3 is the date. We assume this case if argument 4 is nil.

	if (args3 ~= nil and args4 == nil) then

		local item = "<span style=\"font-size:97%;\">[["

		if (args1 ~= nil) then

			item = item .. args1

		end

		item = item .. "|"

		if (args2 ~= nil) then

			item = item .. args2

		end

		item = item .. "]]:</span> " .. args3 .. "[[Category:Pages using vgrelease with two parameter region]]"

		table.insert(items, item)

		-- Old syntax "Blank region" use case, where param 1 is empty, and param 2 is the date.

	elseif (args1 == nil and args2 ~= nil) then

		local item = args2 .. "[[Category:Pages using vgrelease without a region]]"

		table.insert(items, item)

		-- Normal use cases, region/date pairs in 1/2, 3/4, 5/6, etc.

	else

		local i = 1

		local j = 2

		while (argsi and argsj]) do

			local labels = {}

			for k,v in ipairs(splitLabel(argsi])) do

				local label = getLocalLabel(v);



				-- Didn't find a local label? Check for country data.

				if (label == nil) then

					if not v:match('^%s*%[') then

						label = getCountryData(frame, v)

					end



					-- Found something? Build a sitelink with it.

					if (label ~= nil) then

						label = "[[" .. label .. "|" .. v .. "]]"

					else

						label = v

					end

				end

				table.insert(labels, label)

			end

			local item = "<span style=\"font-size:97%;\">" .. table.concat(labels,'/') .. ":</span> " .. argsj

			table.insert(items, item)



			i = i + 2

			j = j + 2

		end

	end



	-- Add known parameters of Module:List to the table

	for k, v in pairs(args) do

		if (knownargsk == true) then

			itemsk = v

		end

	end



	local out = list.makeList(listformat, items)



	-- Preview message and category

	local parameterMsg = require('Module:If preview')._warning({

		'Unknown parameter "_VALUE_".'

	}) .. "[[Category:Pages using vgrelease with named parameters|_VALUE_]]"



	-- Check for invalid parameters	

	for k, v in pairs(args) do

		if (type(k) ~= 'number' and knownargsk ~= true) then

			local msg = parameterMsg:gsub('_VALUE_', k)

			out = out .. msg

		end

	end



	return out

end



return p