Module:Political party

From Omniversalis


{{#invoke:Political party|fetch|<party>|<value>}}


{{#section:Template:Political party/doc|Parameters}}

Updating the module[edit]

The political parties contained in this module are split into alphabetised lists based on the first character of the name (for example, "Labour Party (UK)" would be under /L). The /1 subpage is for any party that does not start with the western letters A-Z (including numbers and accented characters).

Within each data submodule are two local groups: local alternate and local full. The alternate group is for alternate names of a party. The following is an example of alternate names for the Labour Party (UK):

local alternate = {
	["Labour and Co-operative"] = "Labour Party (UK)",
	["Labour Co-operative"] = "Labour Party (UK)",

The first entry in square brackets is the alternate name, and the second entry only in quotes is the name found in the full group, seen below. Note that the alternate name of a party should be stored in its corresponding letter-based subpage; "Alabama Democratic Party" is listed in /A even though it is an alternate name for "Democratic Party (US)" (which is stored in /D).

local full = {
	["Labour Party (UK)"] = {abbrev = "Lab", color = "#E4003B", shortname = "Labour",},

Table values[edit]

There are three values stored for each party:

  • The abbreviation (abbrev).
  • The color of the party (color), which can either be a hex triplet or a basic color name.
  • A shorter name for the party (shortname).

If a name value is not stored for a party, the module will attempt to return the other "short" name variant before returning the input. Thus, if abbrev is stored but shortname is not, regardless of which value is asked for it will return the abbrev value.

Requesting an addition or a change[edit]

Requests should be made at the talk page in a new section. Copy the following line and fill in only the fields relevant to the party. A party name is required as is at least one other piece of information. See above for information regarding each value.

  • ["party"] = {abbrev = "", color = "", shortname = "",},

Error messages[edit]

Module error messages and resolutions
Error message Resolution
Lua error: bad argument #1 to 'sub' (string expected, got table). An entry intended for the "local full" section has been placed into the "local alternate" section. Move it to the "local full" section
Lua error in package.lua at line 80: module 'Module:Political party/' not found. Party added to alternate list with empty value.
Value not in template. Please request that it be added. (article search) The party in question has an entry with no color in the "local full" section. (This can be caused by duplicate entries in "local full" that, if present, should be merged.)
(no error message, but party color is white/blank) Add a color for the party to its entry in the "local full" section in the relevant Module:Political party/ lettered data page (see links below).
parameter 1 should be a party name (article search) A template is trying to feed a missing parameter to the module. Work around this by testing for the parameter in the template.
parameter 2 should be the output type (article search)

Data pages[edit]

local p = {}

local default_color = '&#35;F8F9FA'

local categories = {
	party_not_in_list = '[[Category:Pages using Political party with unknown party]]',
	shortname_not_in_list = '[[Category:Pages using Political party with missing shortname]]',
	color_not_in_list = '[[Category:Pages using Political party with missing color]]',

local function create_error(error_message)
	return string.format('<strong class="error">%s</strong>', error_message)

local function getFirstLetter(party)
	local index = mw.ustring.sub(party, 1, 1)
	-- Set index for non-A-Z starts
	if string.match(index, '%A') then
		return '1'
	return string.upper(index)

local function stripToNil(text)
	-- If text is a string, return its trimmed content, or nil if empty.
	-- Otherwise return text (which may, for example, be nil).
	if type(text) == 'string' then
		text = text:match('(%S.-)%s*$')
		local delink = require('Module:Delink')._delink
		text = delink({text, wikilinks = "target"})
	return text

-- Example of having all the data - color and names - in one table. Requires one page to be edited instead of two when adding a new party.
function p._fetch(args)
	if not args[1] then
		return create_error("parameter 1 should be a party name.")

	if not args[2] then
		return create_error("parameter 2 should be the output type.")

 	local party = stripToNil(args[1])
	local out_type = stripToNil(args[2])
	if out_type == 'colour' then
		out_type = 'color'
	local index = getFirstLetter(party)
	-- Load data from submodule
	local data = mw.loadData('Module:Political party/' .. index)
	local data_all = data.full

	local party_alt = data.alternate[party]
	local party_info
	if party_alt then
		if data_all[party_alt] then
			party_info = data_all[party_alt]
			index = getFirstLetter(party_alt)
			data = mw.loadData('Module:Political party/' .. index)
			party_info = data.full[party_alt]
		party_info = data_all[party]

	-- Check if database value exists
	-- * Not even in database - return given error or input
	-- * No color - return error
	-- * No shortname/abbrev - return first non-blank of abbrev->shortname->input
	if not party_info then
		if out_type == 'color' then
			return args.error or default_color
			return args.error or party
	local return_value = party_info[out_type]
	if return_value == "" then
		if out_type == 'color' then
			return args.error or create_error("Value not in template. Please request that it be added.")
		elseif out_type == 'abbrev' then
			if party_info.shortname ~= "" then
				return party_info.shortname
				return party
		elseif out_type == 'shortname' then
			if party_info.abbrev ~= "" then
				return party_info.abbrev 
				return party
			return party

	if out_type == 'color' and string.find(return_value, '#') then
		return_value = string.gsub(return_value, '#', '&#35;')
	return return_value	

function p.fetch(frame)
	-- Initialise and populate variables
	local getArgs = require("Module:Arguments").getArgs
	local args = getArgs(frame)
	return p._fetch(args)

return p