Mô đun:Infobox/utilities

require('strict');
local getArgs = require ('Module:Arguments').getArgs;
------------------------------------------------------------------------------------
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 cjkcode or false;
end
--italics=}}
local function set_italics (frame)
	local args=getArgs(frame); 
	local code = args1 or args'code' or ;									-- empty string causes 'yes' return;  will handle the missing code error
	local text = args2 or args'text' or ;									-- empty string causes 'yes' return;  will handle the missing text error
	local is_latn = require ("Module:Unicode data").is_Latin;
	
	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
--------------------------------------------------------------------------------------------------
compare function for result{} table descending sort
local function comp (a, b)
	return tonumber (a1) > tonumber (b1);
end
	
--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 (resulti1) 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
		resulti = table.concat (resulti);									-- make each table in result{} a string
	end
	result1 = table.concat ({result1, 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
--------------------------------------------------------------------------
local function distribution_sort (frame)
	local args=getArgs(frame);
	
	local result = {															-- initialize; table will be sorted according to values in resultn1
		{args1, '% đô thị'},
		{args2, '% nông thôn'},
	};
	
	return sort_common (result, args#result+1, frame);
end
------------------------------------------------------------------------------
local function ethnicity_sort (frame)
	local args=getArgs(frame);
	
	local result = {															-- initialize; table will be sorted according to values in resultn1
		{args1, '% Da trắng'},
		{args2, '% Da đen'},
		{args3, '% Gốc Á'},
		{args4, '% Tây Ban Nha hoặc Latinh'},
		{args5, '% Bản địa'},
		{args6, '% Pacific Islander Americans'},
		{args7, '% Two or more races'},
		{args8, '% other'},													-- TODO: make other always last?
	};
	
	return sort_common (result, args#result+1, frame);
end
----------------------------------------------------------------------------
local function occupation_sort (frame)
	local args=getArgs(frame);
	
	local result = {															-- initialize; table will be sorted according to values in resultn1
		{args1, '% Blue-collar'},
		{args2, '% White-collar'},
		{args3, '% Gray-collar'},
	};
	
	return sort_common (result, args#result+1, frame)
end
----------------------------------------------------------------------
return {
	distribution_sort = distribution_sort,										-- 
	ethnicity_sort = ethnicity_sort,
	occupation_sort = occupation_sort,
	
	set_italics = set_italics,													-- 
	}