Module:Infobox/utilities#L-4--L-63

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 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 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 ; only language tags known to MediaWiki allowed

if '' == orig_lang_name then -- empty string when invalid

return 'invalid language tag: ' .. orig_lang_code .. '';

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 | 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'},

{args[2], '% Black'},

{args[3], '% Asian'},

{args[4], '% Hispanic'},

{args[5], '% Native American'},

{args[6], '% Pacific Islander Americans'},

{args[7], '% 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'},

{args[2], '% 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,

}