Toggle menu
15
236
70
27.5K
Kenshi Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

This module is intended to be a repository for miscellaneous utility functions that support various infoboxes.

  • for {{Infobox U.S. congressional district}}
    • distribution_sort() – sorts the various distribution parameters and renders an unbulleted list of same
    • ethnicity_sort() – sorts the various ethnicity parameters and renders an unbulleted list of same
    • occupation_sort() – sorts the various occupation parameters and renders an unbulleted list of same
  • for {{Infobox book}}
    • set_italics() – used to ensure that book-titles in cjk scripts are not italicized
      • is_cjk_code() – (private) returns true when language code represents a cjk language

require('strict');
local getArgs = require ('Module:Arguments').getArgs;

--[=[--------------------------< I N T E R L A N G _ W I K I S O U R C E _ L I N K _ M A K E >------------------

created as a test function to figure out why the wikitext for |data36= in [[Special:Permalink/1236589613|this version]]
of the template doesn't work in [[Salammbô]] when |title_orig= exists but does not have a value.  When that
happened, the infobox returned plain wikitext [[s:fr:Salammbô|]] which should have been a functioning link.
Placing that wikilink in the article body and previewing produced a working inter-language/inter-project link.

{{#invoke:Infobox/utilities|interlang_wikisource_link_make|{{{orig_lang_code|}}}|{{{native_wikisource|}}}|{{{title_orig|}}}|{{{name|}}} }}

]=]

local function interlang_wikisource_link_make (frame)
	local lang_mod = require ('Module:Lang');									-- used to wrap non-English wikisource links in proper html markup

	local args_t = getArgs (frame);												-- parameter values that are emptyspace or only white space are converted to nil
	local orig_lang_code = args_t[1];											-- 'all of them sensible everyday names'
	local native_wikisource = args_t[2];
	local title_orig = args_t[3];
	local name = args_t[4];

	local orig_lang_name = mw.language.fetchLanguageName (orig_lang_code, 'en');	-- get the English name associated with <orig_lang_code>; only language tags known to MediaWiki allowed
	if '' == orig_lang_name then												-- empty string when <orig_lang_code> invalid
		return '<span style="color:#d33">invalid language tag: <span style="font-family:monospace">' .. orig_lang_code .. '</span></span>';
	end

	local out_t = {};															-- output goes here
	table.insert (out_t, '[[s:');												-- open inter-language/inter-project wikilink
	table.insert (out_t, orig_lang_code);										-- the language tag
	table.insert (out_t, ':');													-- add the required separator

	table.insert (out_t, native_wikisource);									-- insert wikisource title
	table.insert (out_t, '|');													-- done with link; start label
	table.insert (out_t, title_orig or name or mw.title.getCurrentTitle().baseText);	-- insert the label
	table.insert (out_t, ']]');													-- close inter-language/inter-project wikilink
	
	out_t = {lang_mod._lang ({orig_lang_code, table.concat (out_t)})};			-- replace content of out_t with a big string of its contents wrapped in {{lang}}

	table.insert (out_t, ' at ');												-- begin other language wikisource wikilinklink
	table.insert (out_t, orig_lang_name);										-- add the MediaWiki-known language name associated with |orig_lang_code=
	table.insert (out_t, ' [[Wikisource]]');									-- insert wikisource link static text
	
	return table.concat (out_t);												-- make a big string of all and done
end


--[[--------------------------< I S _ C J K _ C O D E >--------------------------------------------------------

return true if code is one of the listed Chinese, Japanese, Korean ISO 639 codes, false else.

]]

local function is_cjk_code (code)
local cjk =
		{
		['zh'] = true, ['cdo'] = true, ['cjy'] = true, ['cmn'] = true,			-- Chinese language codes
		['cpi'] = true, ['cpx'] = true, ['czh'] = true, ['czo'] = true,
		['gan'] = true, ['hak'] = true, ['hsn'] = true, ['ltc'] = true,
		['lzh'] = true, ['mnp'] = true, ['nan'] = true, ['och'] = true,
		['wuu'] = true, ['yue'] = true, ['zhx'] = true,
		['ja'] = true, ['jpx'] = true, ['ojp'] = true,							-- Japanese language codes
		['ko'] = true, ['okm'] = true, ['oko'] = true,							-- Korean language codes
		}

	return cjk[code] or false;
end


--[[--------------------------< S E T _ I T A L I C S >--------------------------------------------------------

Created for use with Template:Infobox book and Template:Infobox document and perhaps others to replace hard-coded
italic markup in the call to {{lang}}.  This module attempts to make sure that {{lang}} correctly applies italic
markup according to MOS:FOREIGNITALIC.

|italics={{#invoke:Infobox/utilities|set_italics|{{{orig_lang_code|}}}|{{{title_orig}}}}}}}

]]

local function set_italics (frame)
	local args=getArgs(frame); 
	local code = args[1] or args['code'] or '';									-- empty string causes 'yes' return; {{lang}} will handle the missing code error
	local text = args[2] or args['text'] or '';									-- empty string causes 'yes' return; {{lang}} will handle the missing text error

	local is_latn = require ("Module:Unicode data").is_Latin;
	
	code = code:gsub ('^(%a+).*', '%1');										-- strip subtags from IETF tag to leave just the language subtag
	if is_cjk_code (code) and not is_latn (text) then							-- is_latn() is in Module:Unicode data
		return  'no';															-- only case for 'no' 
	end
	return 'yes';																-- everything else is yes
end


--[[--------------------------< C O M P >----------------------------------------------------------------------

compare function for result{} table descending sort

]]

local function comp (a, b)
	return tonumber (a[1]) > tonumber (b[1]);
end
	

--[[--------------------------< S O R T _ C O M M O N >--------------------------------------------------------

common function to render sorted distribution, ethnicity, and occupation lists.

inputs:
	result - table of percentages and labels
	ref - value from |distribution ref=, |ethnicity ref=, or |occupation ref= as appropriate
	frame - calling frame required for expandTemplate()
	
returns sorted list on success; empty string else

]]

local function sort_common (result, ref, frame)
	for i=#result, 1, -1 do
		if not tonumber (result[i][1]) then										-- if cannot be converted to a number
			table.remove (result, i);											-- delete
		end
	end
	
	if 0 == #result then														-- if we get here and the result table is empty
		return '';																-- abandon returning empty string
	end
	
	table.sort (result, comp);													-- sort what remains

	for i, v in ipairs (result) do
		result[i] = table.concat (result[i]);									-- make each table in result{} a string
	end

	result[1] = table.concat ({result[1], ref and ref or ''});					-- add reference(s) from |<list> ref= to first item in the list
	
	return frame:expandTemplate { title = 'Unbulleted list', args = result};	-- render the unbulleted list
end


--[[--------------------------< D I S R I B U T I O N _ S O R T >----------------------------------------------

{{#invoke:Infobox/utilities|distribution_sort|{{{percent urban|}}}|{{{percent rural|}}}|{{{distribution ref|}}} }}

]]

local function distribution_sort (frame)
	local args=getArgs(frame);
	
	local result = {															-- initialize; table will be sorted according to values in result[n][1]
		{args[1], '% urban'},
		{args[2], '% rural'},
	};
	
	return sort_common (result, args[#result+1], frame);
end


--[[--------------------------< E T H N I C I T Y _ S O R T >--------------------------------------------------

{{#invoke:Infobox/utilities|ethnicity_sort|{{{percent white|}}}|{{{percent black|}}}|{{{percent asian|}}}|{{{percent hispanic|}}}|{{{percent native american|}}}|{{{percent native hawaiian|}}}|{{{percent more than one race|}}}|{{{percent other race|}}}|{{{ethnicity ref|}}} }}

]]

local function ethnicity_sort (frame)
	local args=getArgs(frame);
	
	local result = {															-- initialize; table will be sorted according to values in result[n][1]
		{args[1], '% [[White Americans|White]]'},
		{args[2], '% [[African Americans|Black]]'},
		{args[3], '% [[Asian Americans|Asian]]'},
		{args[4], '% [[Hispanic and Latino Americans|Hispanic]]'},
		{args[5], '% [[Native Americans in the United States|Native American]]'},
		{args[6], '% [[Pacific Islander Americans]]'},
		{args[7], '% [[Multiracial Americans|Two or more races]]'},
		{args[8], '% other'},													-- TODO: make other always last?
	};
	
	return sort_common (result, args[#result+1], frame);
end


--[[--------------------------< O C C U P A T I O N _ S O R T >------------------------------------------------

{{#invoke:Infobox/utilities|distribution_sort|{{{percent blue collar|}}}|{{{percent white collar|}}}|{{{percent grey collar|}}}|{{{occupation ref|}}} }}

]]

local function occupation_sort (frame)
	local args=getArgs(frame);
	
	local result = {															-- initialize; table will be sorted according to values in result[n][1]
		{args[1], '% [[Blue-collar worker|Blue-collar]]'},
		{args[2], '% [[White-collar worker|White-collar]]'},
		{args[3], '% [[Gray-collar]]'},
	};
	
	return sort_common (result, args[#result+1], frame)
end


--[[--------------------------< E X P O R T E D   F U N C T I O N S >------------------------------------------

]]

return {
	distribution_sort = distribution_sort,										-- {{Infobox U.S. congressional district}}
	ethnicity_sort = ethnicity_sort,
	occupation_sort = occupation_sort,
	
	set_italics = set_italics,													-- {{Infobox book}}
	interlang_wikisource_link_make = interlang_wikisource_link_make,
	}