Module:Political party

From BMG Wiki
Revision as of 20:00, 13 February 2023 by Ulferno (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Usage

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

Parameters

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

Updating the module

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).

Table values

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

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

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

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


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)
end

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'
	end
	return string.upper(index)
end

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"})
	end
	return text
end

-- 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.")
	end

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

 	local party = stripToNil(args[1])
	local out_type = stripToNil(args[2])
	if out_type == 'colour' then
		out_type = 'color'
	end
	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]
		else
			index = getFirstLetter(party_alt)
			data = mw.loadData('Module:Political party/' .. index)
			party_info = data.full[party_alt]
		end
	else
		party_info = data_all[party]
	end

	-- 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
		else
			return args.error or party
		end
	end
	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
			else
				return party
			end
		elseif out_type == 'shortname' then
			if party_info.abbrev ~= "" then
				return party_info.abbrev 
			else
				return party
			end
		else
			return party
		end
	end

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

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

return p