Difference between revisions of "Module:London Gazette util"

From blackwiki
Jump to navigation Jump to search
blackwiki>Trappist the monk
blackwiki>Trappist the monk
Line 105: Line 105:
 
except for the lvalue and the rvalue assigned to |param=, the two calls must be identical else odd results.
 
except for the lvalue and the rvalue assigned to |param=, the two calls must be identical else odd results.
  
 +
|page= or |pages= without a comma, hyphen, or en dash separator → |page=
 +
|page= or |pages= with a separator → |pages=
 
|startpage= without |endpage= → |page=
 
|startpage= without |endpage= → |page=
 
|startpage= with |endpage= → |pages=
 
|startpage= with |endpage= → |pages=
|page= or |pages= without a comma, hyphen, or en dash separator → |page=
 
|page= or |pages= with a separator → |pages=
 
  
 
Hyphen separator characters are converted to en dash characters.  Any white space around hyphen and en dash
 
Hyphen separator characters are converted to en dash characters.  Any white space around hyphen and en dash
 
separators is removed.
 
separators is removed.
  
|startpage= and |endpage= parameters have priority over |page= or |pages=.  If both |page= and |pages= are
+
|page= or |pages= parameters have priority over |startpage= and |endpage=.  If both |page= and |pages= are
 
set, this function mimics cs1|2 and chooses |page=.
 
set, this function mimics cs1|2 and chooses |page=.
  
Line 125: Line 125:
 
local page_or_pages;
 
local page_or_pages;
  
if is_set (args.startpage) then
 
if 'pages' == args.param then -- if this call is for the |pages= parameter
 
if is_set (args.endpage) then -- only for |pages= parameter
 
return args.startpage .. '–' .. args.endpage; -- make |pages= value from |startpage= and |endpage=
 
else
 
return ''; -- |startpage= will be assigned to |page=
 
end
 
elseif 'page' == args.param then -- |param=page
 
if is_set (args.endpage) then -- only for |pages= parameter
 
return ''; -- |endpage= will be part of |pages=
 
else
 
return args.startpage; -- make |page= value from |startpage=
 
end
 
else
 
return ''; -- |param= something else
 
end
 
end
 
 
 
page_or_pages = args.page or args.pages; -- only one; prefer |page=
 
page_or_pages = args.page or args.pages; -- only one; prefer |page=
 
 
Line 158: Line 140:
 
else
 
else
 
return page_or_pages; -- no separator character so make the parameter |page=
 
return page_or_pages; -- no separator character so make the parameter |page=
 +
end
 +
else
 +
return ''; -- |param= something else
 +
end
 +
end
 +
 +
if is_set (args.startpage) then
 +
if 'pages' == args.param then -- if this call is for the |pages= parameter
 +
if is_set (args.endpage) then -- only for |pages= parameter
 +
return args.startpage .. '–' .. args.endpage; -- make |pages= value from |startpage= and |endpage=
 +
else
 +
return ''; -- |startpage= will be assigned to |page=
 +
end
 +
elseif 'page' == args.param then -- |param=page
 +
if is_set (args.endpage) then -- only for |pages= parameter
 +
return ''; -- |endpage= will be part of |pages=
 +
else
 +
return args.startpage; -- make |page= value from |startpage=
 
end
 
end
 
else
 
else

Revision as of 10:24, 8 May 2017

Utility module for {{London Gazette}} {{#lst:Template:London Gazette/doc|supp_disp-supp_interaction_table}}



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

require('Module:No globals')
local getArgs = require('Module:Arguments').getArgs

local span_open = '<span style="font-size:100%; font-weight:normal" class="error">';
local code_style="color:inherit; border:inherit; padding:inherit;";
local help_link = ' ([[Template:London Gazette#error messages|help]])';

local supp_error = span_open .. 'invalid <code style="'..code_style..'">&#124;supp=</code>' .. help_link .. '</span>';

local page_ignored_error = ' ' .. span_open .. '<code style="'..code_style..'">&#124;page=</code> or <code style="'..code_style..'">&#124;pages=</code> ignored' .. help_link .. '</span>';
local endpage_error = ' ' .. span_open .. '<code style="'..code_style..'">&#124;endpage=</code> requires <code style="'..code_style..'">&#124;startpage=</code>' .. help_link .. '</span>';
local duplicate_page_error = ' ' .. span_open .. 'more than one of <code style="'..code_style..'">&#124;page=</code> and <code style="'..code_style..'">&#124;pages=</code>' .. help_link .. '</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 element 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();										-- lower() to index into the city_names table
	end
	
	return city_names[city_param] or 'London';									-- the city, or default to 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;																	-- least significant digit
	local suffixes = {['1'] = 'st', ['2'] = 'nd', ['3'] = 'rd'};				-- table of suffixes except 'th'

	if num_str:match ('^1[1-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 .. (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 element of the url path according to |supp= value; defaults to page

Only limited |supp= values will set the page/supplement path element to /supplement/.  These are: 'y', 'yes', a number 1-99

]]

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

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

Determine the value to be assigned to the specified cs1|2 |page= or |pages= parameter in {{London Gazette}}.
The arguments |param=page and |param=pages specify which of the cs1|2 parameters |page= or |pages= for which this
function is to create a value.

This function inspects the content of the various |startpage= (or {{{2|}}}), |endpage=, |page=, and |pages= parameters,
along with the |param= specifier.  From this information it creates a value appropriate for the specified |page=
or |pages= parameter.  Only one will have a value, the other will get an empty string.

This function is called twice; once for each of |page= and |pages=:
	|page={{#invoke:Gazette util|make_page_param|param=page|startpage={{{startpage|{{{2|}}}}}}|endpage={{{endpage|}}}|page={{{page|}}}|pages={{{pages|}}}}}
	|pages={{#invoke:Gazette util|make_page_param|param=pages|startpage={{{startpage|{{{2|}}}}}}|endpage={{{endpage|}}}|page={{{page|}}}|pages={{{pages|}}}}}

except for the lvalue and the rvalue assigned to |param=, the two calls must be identical else odd results.

|page= or |pages= without a comma, hyphen, or en dash separator → |page=
|page= or |pages= with a separator → |pages=
|startpage= without |endpage= → |page=
|startpage= with |endpage= → |pages=

Hyphen separator characters are converted to en dash characters.  Any white space around hyphen and en dash
separators is removed.

|page= or |pages= parameters have priority over |startpage= and |endpage=.  If both |page= and |pages= are
set, this function mimics cs1|2 and chooses |page=.

Another function, page_error() 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.

]]

function p.make_page_param (frame)
	local args = getArgs(frame);
	local page_or_pages;

	page_or_pages = args.page 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
	
	if is_set (args.startpage) then
		if 'pages' == args.param then											-- if this call is for the |pages= parameter
			if is_set (args.endpage) then										-- only for |pages= parameter
				return args.startpage .. '–' .. args.endpage;					-- make |pages= value from |startpage= and |endpage=
			else
				return '';														-- |startpage= will be assigned to |page= 
			end
		elseif 'page' == args.param then										-- |param=page
			if is_set (args.endpage) then										-- only for |pages= parameter
				return '';														-- |endpage= will be part of |pages= 
			else
				return args.startpage;											-- make |page= value from |startpage=
			end
		else
			return '';															-- |param= something else
		end
	end
	
	return '';																	-- if here no pagination or not for correct |page= or |pages= parameter
end


--[[--------------------------< P A G E _ E R R O R >----------------------------------------------------------

Inspect page number parameters and return an error message that will be appended to the end of the {{cite magazine}}
template rendering.  Error messages are handled this way so that the error message is not made part of the cs1|2
citation's metadata.

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

]]

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

	if is_set (args.startpage) and (is_set (args.page) or is_set (args.pages)) then
		return page_ignored_error;												-- mix of startpage and page or pages
	elseif not is_set (args.startpage) and is_set (args.endpage) then
		return endpage_error;													-- |endpage= requires |startpage=
	elseif is_set (args.page) and is_set (args.pages) then
		return duplicate_page_error;											-- more than one of |page= and |pages=
	else
		return '';
	end
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 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
	
	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] the first or only supplement
		elseif args.supp:match ('^%d%d?$') then									-- one or two digits
			if '1' == args.supp then
				return 'Supplement';											-- [row 3] the first or only supplement; a legacy value TODO:deprecate this use?
			else
				return ordinal_suffix (args.supp) .. ' supplement';				-- [row 4] for the 2nd-99th supplement
			end
		else
			return supp_error;													-- [row 5] 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 6] for the 1st-99th supplement
		else
			return args['display-supp'];										-- [row 10] 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: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] different values are ambiguous
		end
	else																		-- not a supplement number
		if ('y' == args.supp) or ('yes' == args.supp) or (args['display-supp'] == args.supp) then
			return args['display-supp'];										-- [rows 11, 12] user specified text
		else
			return supp_error;													-- [row 13] any other text not supported show an error message
		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',											-- static domain name
		city (args.city),														-- default to London
		'issue',																-- static path text
		mw.text.trim (args.issue),												-- issue number; trim because {{{1|}}} won't be trimmed
		page_or_supplement (args.supp),											-- either of /page/ or /supplement/ according to the state of |supp=
		(args.pg and args.pg:match ('^%d*')) or ''								-- digits only; if not digit then empty string for concatenation
		};
	
	return table.concat (url_table, '/');										-- concatenate all of the parts together and done
end


return p;