모듈:Lang-zh

require('strict')
local p = {}
-- articles in which traditional Chinese preceeds simplified Chinese
local t1st = {
	"228 사건" = true,
	"중국력" = true,
	"Lippo Centre, Hong Kong" = true,
	"중화민국" = true,
	"1924년 하계 올림픽 중화민국 선수단" = true,
	"대만" = true,
	"대만섬" = true,
	"Taiwan Province" = true,
	"Wei Boyang" = true,
}
-- the labels for each part 
local labels = {
	"c" = "중국어",
	"s" = "간체자",
	"t" = "정체자",
	"p" = "한어병음",
	"tp" = "통용병음",
	"w" = "웨이드-자일스 표기법",
	"j" = "Jyutping",
	"cy" = "Cantonese Yale",
	"sl" = "Sidney Lau",
	"poj" = "Pe̍h-ōe-jī",
	"zhu" = "Zhuyin Fuhao",
	"l" = "lit.",
	"tr" = "trans.",
}
-- article titles for wikilinks for each part
local wlinks = {
	"c" = "중국어",
	"s" = "간체자",
	"t" = "정체자",
	"p" = "한어병음",
	"tp" = "통용병음",
	"w" = "웨이드-자일스 표기법",
	"j" = "Jyutping",
	"cy" = "Yale romanization of Cantonese",
	"sl" = "Sidney Lau romanisation",
	"poj" = "Pe̍h-ōe-jī",
	"zhu" = "Bopomofo",
	"l" = "Literal translation",
	"tr" = "Translation",
}
-- for those parts which are to be treated as languages their ISO code
local ISOlang = {
	"c" = "zh",
	"t" = "zh-Hant",
	"s" = "zh-Hans",
	"p" = "zh-Latn-pinyin",
	"tp" = "zh-Latn",
	"w" = "zh-Latn-wadegile",
	"j" = "yue-Latn-jyutping",
	"cy" = "yue-Latn",
	"sl" = "yue-Latn",
	"poj" = "nan-Latn",
	"zhu" = "zh-Bopo",
}
local italic = {
	"p" = true,
	"tp" = true,
	"w" = true,
	"j" = true,
	"cy" = true,
	"sl" = true,
	"poj" = true,
}
local superscript = {
	"w" = true,
	"sl" = true,
}
-- Categories for different kinds of Chinese text
local cats = {
	"c" = "",
	"s" = "",
	"t" = "",
}
function p.Zh(frame)
	-- load arguments module to simplify handling of args
	local getArgs = require('Module:Arguments').getArgs
	
	local args = getArgs(frame)
	return p._Zh(args)
end
	
function p._Zh(args)
	local uselinks = not (args"links" == "no") -- whether to add links
	local uselabels = not (args"labels" == "no") -- whether to have labels
	local capfirst = args"scase" ~= nil

	local t1 = false -- whether traditional Chinese characters go first
	local j1 = false -- whether Cantonese Romanisations go first
	local testChar
	if (args"first") then
	 	 for testChar in mw.ustring.gmatch(args"first", "%a+") do
			if (testChar == "t") then
				t1 = true
			 end
			if (testChar == "j") then
				j1 = true
			 end
		end
	end
	if (t1 == false) then
		local title = mw.title.getCurrentTitle()
		t1 = t1sttitle.text == true
	end
	-- based on setting/preference specify order
	local orderlist = {"c", "s", "t", "p", "tp", "w", "j", "cy", "sl", "poj", "zhu", "l", "tr"}
	if (t1) then
		orderlist2 = "t"
		orderlist3 = "s"
	end
	if (j1) then
		orderlist4 = "j"
		orderlist5 = "cy"
		orderlist6 = "sl"
		orderlist7 = "p"
		orderlist8 = "tp"
		orderlist9 = "w"
	end
	
	-- rename rules. Rules to change parameters and labels based on other parameters
	if args"hp" then
		-- hp an alias for p (hanyu pinyin)
		args"p" = args"hp"
	end
	if args"tp" then
		-- if also Tongyu pinyin use full name for Hanyu pinyin
		labels"p" = "Hanyu Pinyin"
	end
	
	if (args"s" and args"s" == args"t") then
		-- Treat simplified + traditional as Chinese if they're the same
		args"c" = args"s"
		args"s" = nil
		args"t" = nil
	elseif (not (args"s" and args"t")) then
		-- use short label if only one of simplified and traditional
		labels"s" = labels"c"
		labels"t" = labels"c"
	end
	local body = "" -- the output string
	local params -- for creating HTML spans
	local label -- the label, i.e. the bit preceeding the supplied text
	local val -- the supplied text
	
	-- go through all possible fields in loop, adding them to the output
	for i, part in ipairs(orderlist) do
		if (argspart) then
			-- build label
			label = ""
			if (uselabels) then
				label = labelspart
				if (capfirst) then
					label = mw.language.getContentLanguage():ucfirst(label)
					capfirst = false
				end
				if (uselinks) then
					label = "" .. wlinkspart .. "|" .. label .. ""
				end
				if (labelspart ~= "lit.") then
					label = label .. ":"
				else
					label = "" .. label .. ""
				end
				label = label .. " "
			end
			-- build value
			val = argspart
			if (catspart) and mw.title.getCurrentTitle().namespace == 0 then
				-- if has associated category AND current page in article namespace, add category
				val = catspart .. val
			end
			if (ISOlangpart) then
				-- add span for language if needed
				params = {"lang" = ISOlangpart}
				val = mw.text.tag({name="span",attrs=params, content=val})
			elseif ((part == "l") or (part == "tr")) then
				-- put literals in quotes
				val = "'" .. val .. "'"
			end
			if (italicpart) then
				-- italicise
				val = "" .. val .. ""
			end
			if string.match(val, "") then val = val.."" end
			if (superscriptpart) then
				-- superscript
				val = val:gsub("(%d)", "%1"):gsub("(%d)%*(%d)", "%1*%2"):gsub("(%d%*+)", "%1")
			end
			-- add both to body
			body = body .. label .. val .. "; "
		end
	end
	
	if (body > "") then -- check for empty string
		return string.sub(body, 1, -3) -- chop off final semicolon and space
	else --no named parameters; see if there's a first parameter, ignoring its name
		if (args1) then
			-- if there is treat it as Chinese
			label = ""
			if (uselabels) then
				label = labels"c"
				if (uselinks) then
					label = "" .. wlinks"c" .. "|" .. label .. ""
				end
				label = label .. ": "
			end
			-- default to show links and labels as no options given
			if mw.title.getCurrentTitle().namespace == 0 then
				-- if current page in article namespace
				val = cats"c" .. args1
			else
				val = args1
			end
			params = {"lang" = ISOlang"c"}
			val = mw.text.tag({name="span",attrs=params, content=val})
			return label .. val
		end
		return ""
	end
end
return p