มอดูล:London Gazette util

-- this module is created to support 
require('strict')
local getArgs = require('Module:Arguments').getArgs
local span_open = ;
local code_open = ;
local help_link = ' (help)';
local supp_error = mw.ustring.format ('%sinvalid %s|supp=%s', span_open, code_open, help_link);
local duplicate_page_error = mw.ustring.format (' %smore than one of %s|page= and %s|pages=%s', span_open, code_open, code_open, help_link);
local p = {}
----------------------------------------------------------------------------------------------
Whether variable is set or not.  A variable is set when it is not nil and not empty.
local function is_set( var )
	return not (var == nil or var == );
end
------------------------------------------------------------------------------
render a numerical text string in ordinal form suitable for English language use.  In this module, num_str is
limited by calling functions to the integer values 1-99.  The argument num_str must be known to be set before
this function is called.
local function ordinal_suffix (num_str)
	local lsd;																	-- least significant digit
	local suffixes = {'1' = 'st', '2' = 'nd', '3' = 'rd'};				-- table of suffixes except 'th'
	if num_str:match ('^11-3$') then											-- check the 11-13 odd balls first to get them out of the way
		return num_str .. 'th';													-- 11th, 12th, 13th
	end
	
	lsd = num_str:match ('^%d?(%d)$');											-- all other numbers: get the least significant digit
	return num_str .. (suffixeslsd or 'th');									-- append the suffix from the suffixes table or default to 'th'
end
--2 metadata.
function p.make_page_param (frame)
	local args = getArgs(frame);
	local page_or_pages;
	page_or_pages = args.page or args.unnamed or args.pages;					-- only one; prefer |page=
	
	if is_set (page_or_pages) then
		if 'pages' == args.param then
			if page_or_pages:match (',%-–') then								-- only for |pages= parameter
				page_or_pages = mw.ustring.gsub (page_or_pages, '%s*%-–%s*', '–');	-- hyphen to en dash; remove spaces
				return page_or_pages;											-- has separator character so make the parameter |pages=
			else
				return ;														-- no separator so value will be assigned to |page=
			end
		elseif 'page' == args.param then
			if page_or_pages:match (',%-–') then								-- only for |pages= parameter
				return ;														-- has separator so value will be assigned to |pages=
			else
				return page_or_pages;											-- no separator character so make the parameter |page=
			end
		else
			return ;															-- |param= something else
		end
	end
	return ;																	-- if here no pagination or not correct |page= or |pages= parameter
end
--2
citation's metadata.
function p.page_error (frame)
	local args = getArgs(frame);
	if is_set (args.page) and is_set (args.pages) then
		return duplicate_page_error;											-- both of |page= and |pages= are set
	else
		return ;
	end
end
--supp= values will set the type value.  These are: 'y' or a number 1-99.
row numbers in comments apply to the table in Template_talk:London_Gazette#Rewrite_as_wrapper_around_template:cite_news
function p.type_param (frame)
	local args = getArgs(frame);
	
	if not is_set (args'display-supp') and not is_set (args.supp) then		-- when both |display-supp= and |supp= are not set
		return ;																-- row 1 not a supplement so no display
	end
	
	args.supp = args.supp and args.supp:lower();								-- make text values lower case
	if not is_set (args'display-supp') and is_set (args.supp) then			-- when only |supp= is set
		if 'y' == args.supp then
			return 'Supplement';												-- row 2 the first or only supplement
		elseif args.supp:match ('^%d%d?$') then									-- one or two digits
				return ordinal_suffix (args.supp) .. ' supplement';				-- row 3 for the 1st-99th supplement
		else
			return supp_error;													-- row 4 any other text not supported show an error message
		end
	end
	if is_set (args'display-supp') and not is_set (args.supp) then			-- when only |display-supp= is set
		if args'display-supp':match ('^%d%d?$') then							-- one or two digits
			return ordinal_suffix (args'display-supp') .. ' supplement';		-- row 7 for the 1st-99th supplement
		elseif 'y' == args'display-supp' then
			return 'Supplement';												-- row 6 unnumbered supplement in /page/ space
		else
			return args'display-supp';										-- row 11 user specified text; supplement is not in supplement space (a Gazette website error)
		end
	end
																				-- here when both |display-supp= and |supp= are set
	if args'display-supp':match ('^%d%d?$') then								-- supplement number
		if 'y' == args.supp or (args'display-supp' == args.supp) then
			return ordinal_suffix (args'display-supp') .. ' supplement';		-- rows 8, 9
		else																	-- |supp= is not a number or number isn't same as number in |display-supp=
			return supp_error;													-- row 10 different values are ambiguous
		end
	else																		-- not a supplement number
		if ('y' == args.supp) and ('none' == args'display-supp') then
			return ;															-- row 5 for the case when a /page/ is in /supplement/ space 
		elseif ('y' == args.supp) or args.supp:match ('^%d%d?$') or not is_set (args.supp) then
			return args'display-supp';										-- rows 12, 13 user specified text
		else
			return supp_error;													-- row 14 any other |supp= value not supported show an error message
		end
	end
end
--city= value; defaults to London
local function url_city (city_param)
	local city_names = {'b' = 'Belfast', 'belfast' = 'Belfast', 'e' = 'Edinburgh', 'edinburgh' = 'Edinburgh'};
	
	city_param = city_param and city_param:lower();								-- lower() to index into the city_names table
	return city_namescity_param or 'London';									-- the city, or default to London
end
	
--supp= values will set the page number path element.  These are: 'y' or a number 1-99.
From issue 1610–1619 the gazette has both digit page numbers and digit + alpha page numbers.  It appears that the
issue numbers did not advance properly in this period so the website has page numbers like '1.a' and '3.a.a' plus
the usual digit page number '1', '3', etc for all of issues 1610–1619.  There were no supplements during this period
so this function handles the 1610–1619 issues separately.  The alpha character is always 'a' and is always separated
from the digits and other alpha by a dot.
local function url_page (page, supp, issue)
	issue = tonumber (issue);													-- for issues 1610–1619 comparison
	if issue and (6610 = issue) then							-- if one of these oddball issues with numeric + alpha page numbers (~ Sep–Oct 1727)
		return page:match ('^%d+%.?a%.+');									-- there are no supplements in this range so we're done
	end
	
	if is_set (supp) then														-- all other issues
		if ('y' == supp) or supp:match ('^%d%d?$') then
			page = page:match ('^%a?%a?%d+');									-- one or two letters followed by digits or just digits (supplement to issue 61608)
		else
			page = page:match ('^%d+');											-- |supp= set to an unexpected value, so one or more digits only
		end
	else
		page = page:match ('^%d+');												-- |supp= not set, so one or more digits only
	end
	
	return page or ;															-- at minimum return empty string for concatenation
end
--supp= values will set the page/supplement path element to /supplement/.  These are: 'y' or a number 1-99
local function url_page_or_supplement (supp_param)
	supp_param = (supp_param and supp_param:lower()) or ;						--make sure lower case for comparisons
	
	if ('y' == supp_param) or supp_param:match ('^%d%d?$') then
		return 'supplement';
	else
		return 'page';															-- anything else
	end
end
	
--url=
function p.url_param (frame)
	local args = getArgs(frame);
	local pg = args.page or args.pages or ;									-- first set parameter or empty string
	local url_table = {															-- a table of the various url parts
		'https://www.thegazette.co.uk',											-- static domain name
		url_city (args.city),													-- default to London
		'issue',																-- static path text
		args.issue,																-- issue number
		url_page_or_supplement (args.supp),										-- either of /page/ or /supplement/ according to the state of |supp=
		url_page (pg, args.supp, args.issue)									-- pages: digits only; supplements: optional letter followed by 1 or more digits
		};
	
	return table.concat (url_table, '/');										-- concatenate all of the parts together and done
end
return p;