Jump to content

Module:London Gazette util

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Trappist the monk (talk | contribs) at 10:47, 7 May 2017 (make_page_param();). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

-- this module is created to support {{London Gazette}}

require('Module:No globals')
local getArgs = require('Module:Arguments').getArgs
local code_style="color:inherit; border:inherit; padding:inherit;";
local supp_error = '<span style="font-size:100%; font-weight:normal" class="error">invalid <code style="'..code_style..'">&#124;supp=</code></span>';

local p = {}

--[[--------------------------< I S _ S E T >------------------------------------------------------------------

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


--[[--------------------------< C I T Y >----------------------------------------------------------------------

sets the city portion of the url path according to |city= value; defaults to London

]]

local function city (city_param)
	local city_names = {['b'] = 'Belfast', ['belfast'] = 'Belfast', ['e'] = 'Edinburgh', ['edinburgh'] = 'Edinburgh'};
	
	if is_set (city_param) then
		city_param = city_param:lower();
	end
	
	return city_names[city_param] or 'London';
end

	
--[[--------------------------< O R D I N A L _ S U F F I X >--------------------------------------------------

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.

TODO: use Module:Ordinal instead?

]]

local function ordinal_suffix (num_str)
	local lsd;
	local suffixes = {['1'] = 'st', ['2'] = 'nd', ['3'] = 'rd'};				-- table of suffixes except 'th'

	if num_str:match ('^1[1-3]$') then											-- do 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 .. (suffixes[lsd] or 'th');									-- append the suffix from the suffixes table or default to 'th'
end


--[[--------------------------< P A G E _ O R _ S U P P L E M E N T >------------------------------------------

sets the page/supplement portion of the url path according to |supp= value; defaults to page

]]

local function page_or_supplement (supp_param)
	if not is_set (supp_param) then
		return 'page';
	end
	
	supp_param = supp_param:lower();											--make sure lower case for comparisons
	
	if ('y' == supp_param) or ('yes' == supp_param) or ('1' == supp_param) or supp_param:match ('^%d%d?$') then
		return 'supplement';
	else
		return 'page';
	end
end

	
--[[--------------------------< M A K E _ P A G E _ P A R A M >------------------------------------------------

Determine the value and create the appropriate cs1|2 parameter for parameter in {{London Gazette}}.  This function
inspects the content of the various |startpage= (or {{{2|}}}, |endpage=, |page=, and |pages= parameters, and writes
the result as a cs1|2 parameter.  |startpage= and |endpage= parameters have priority over |page= or |pages=.  If
both |page= and |pages= are set, this function mimics cs1|2 and chooses |page=.

Another function is required for error messaging because we don't want to dump css markup into a parameter value
that will be included in the cs1|2 metadata.

{{#invoke:Gazette util|make_page_param|startpage={{{startpage|{{{2|}}}}}}|endpage={{{endpage|}}}|page={{{page|}}}|pages={{{pages|}}}}}

 |page{{#if: {{{endpage|}}}{{#invoke:String|match|s={{{page|{{{pages|}}} }}} |pattern=[,%-–] |plain=false|nomatch=}}|s}}={{#if:{{{startpage|}}}{{{endpage|}}}|{{#if: {{{endpage|}}}|{{{startpage|{{{2|}}} }}}–{{{endpage}}}|{{{startpage|{{{2|}}} }}} }}|{{{page|{{{pages|}}} }}} }}
]]

function p.make_page_param (frame)
	local args = getArgs(frame);
	local page_or_pages;
	
	if is_set (args.startpage) and (is_set (args.page) or is_set (args.pages)) then
		-- mix of startpage and page or pages
	elseif not is_set (args.startpage) and is_set (args.endpage) then
		-- |endpage= without |startpage=
	elseif is_set (args.page) and is_set (args.pages) then
		-- more than one of |page= and |pages=
	end
	
	if is_set (args.startpage) then
		if is_set (args.endpage) then
			return '|pages=' .. args.startpage .. '–' .. args.endpage;			-- make |pages= from |startpage= and |endpage=
		else
			return '|page=' .. args.startpage;									-- just start page
		end
	end
	
	page_or_pages = args.page or args.pages;									-- only one; prefer |page=
	
	if is_set (page_or_pages) then
		if page_or_pages:match ('[,%-–]') then
			return '|pages=' .. mw.ustring.gsub (page_or_pages, '%s*[%-–]%s*', '–');		-- has separator character so make the parameter |pages=; hyphen to endash remove spaces
		else
			return '|page=' .. page_or_pages;									-- no separator so make the parameter |page=
		end
	end
	
	return '';																	-- if here no pagination
end

--[[--------------------------< T Y P E _ P A R A M >----------------------------------------------------------

set the value that is assigned to the cite magazine |type= parameter using the values of the London Gazette
|supp= and |display-supp= parameters

row number 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]
	end
	
	if not is_set (args['display-supp']) and is_set (args.supp) then			-- when only |supp= is set
		if ('y' == args.supp:lower()) or ('yes' == args.supp:lower()) then
			return 'Supplement';												-- [row 2] 
		elseif args.supp:match ('^%d%d?$') then									-- one or two digits
			if '1' == args.supp then
				return 'Supplement';											-- [row 3]
			else
				return ordinal_suffix (args.supp) .. ' supplement';					-- [row 4]
			end
		else
			return supp_error;													-- [row 5] any other text not supported
		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 6]
		else
			return args['display-supp'];										-- [row 10]
		end
	end

	if args['display-supp']:match ('^%d%d?$') then
		if ('y' == args.supp:lower()) or ('yes' == args.supp:lower()) or (args['display-supp'] == args.supp) then
			return ordinal_suffix (args['display-supp']) .. ' supplement';				-- [rows 7, 8]
		else																	-- |supp= is not a number or number isn't same as number in |display-supp=
			return supp_error;													-- [row 9]
		end
	else
		if ('y' == args.supp) or ('yes' == args.supp) then
			return args['display-supp'];										-- [row 11]
		else
			return supp_error;													-- [row ??]
		end
	end
end


--[[--------------------------< U R L _ P A R A M >------------------------------------------------------------

Build a url given |city=, |issue=, |supp=, and any of |startpage=, |page=, |pages=, or {{{2}}}  result is assigned
to |url=

{{#invoke:Gazette util|url_param|city={{{city|}}}|issue={{{issue|{{{1|}}} }}}|supp={{{supp|}}}|pg={{{startpage|{{{page|{{{pages|{{{2|}}} }}} }}} }}}}}

]]

function p.url_param (frame)
	local args = getArgs(frame);

	local url_table = {															-- a table of the various url parts
		'https://www.thegazette.co.uk',											-- the domain name
		city (args.city),														-- default to London
		'issue',																-- static path text
		mw.text.trim (args.issue),												-- trim because {{{1|}}} won't be trimmed
		page_or_supplement (args.supp),
		(args.pg and args.pg:match ('^%d*')) or ''								-- digits only; if not digit then empty string for concatenation
		};
	
	return table.concat (url_table, '/');										-- string the parts together and done
end


return p;