モジュール:Zh

require('strict')
local p = {}
-- articles in which traditional Chinese preceeds simplified Chinese
local t1st = {
	--"228 Incident" = true,
	--"Chinese calendar" = true,
	--"Lippo Centre, Hong Kong" = true,
	--"Republic of China" = true,
	--"Republic of China at the 1924 Summer Olympics" = true,
	--"Taiwan" = true,
	--"Taiwan (island)" = true,
	--"Taiwan Province" = true,
	--"Wei Boyang" = true,
}
-- the labels for each part 
local labels = {
	"c" = "中国語",
	"cs" = "中",
	"s" = "簡体字",
	"ss" = "簡",
	"t" = "繁体字",
	"ts" = "繁",
	"p" = "拼音",
	"ps" = "拼",
	"tp" = "通用拼音",
	"w" = "ウェード式",
	"j" = "粤拼",
	"cy" = "イェール式広東語",
	"sl" = "シドニー・ラウ式",
	"poj" = "白話字",
	"tl" = "台羅",
	"zhu" = "注音",
	"zs" = "注",
	"l" = "英文直訳",
	"tr" = "翻訳",
}
-- article titles for wikilinks for each part
local wlinks = {
	"c" = "中国語",
	"s" = "簡体字",
	"t" = "繁体字",
	"p" = "拼音",
	"tp" = "通用拼音",
	"w" = "ウェード式",
	"j" = "香港語言学学会粤語拼音方案",
	"cy" = "イェール式#広東語",
	"sl" = "シドニー・ラウ式ローマ字",
	"poj" = "白話字",
	"tl" = "台湾語ローマ字方案",
	"zhu" = "注音符号",
	--"l" = "Literal translation",
	--"tr" = "Translation",
}
wlinks"cs", wlinks"ss", wlinks"ts", wlinks"ps", wlinks"zs" = wlinks"c", wlinks"s", wlinks"t", wlinks"p", wlinks"zhu"
-- 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",
	"tp" = "zh-Latn-tongyong",
	"w" = "zh-Latn-wadegile",
	"j" = "yue-Latn-jyutping",
	"cy" = "yue-Latn",
	"sl" = "yue-Latn",
	"poj" = "nan-Latn",
	"tl" = "nan-Latn-tailo",
	"zhu" = "zh-Bopo",
}
ISOlang"cs", ISOlang"ss", ISOlang"ts", ISOlang"ps", ISOlang"zs" = ISOlang"c", ISOlang"s", ISOlang"t", ISOlang"p", ISOlang"zhu"
local italic = {
	"p" = false,
	"tp" = false,
	"w" = true,
	"j" = true,
	"cy" = true,
	"sl" = true,
	"poj" = true,
	"tl" = true,
}
local superscript = {
	"w" = true,
	"sl" = true,
}
-- Categories for different kinds of Chinese text
local cats = {
	"c" = "", --
	"s" = "", --
	"t" = "", --
}
--cats"cs", cats"ss", cats"ts" = cats"c", cats"s", cats"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)
	if args"link" then args"links" = args"link"; end
	if args"label" then args"labels" = args"label"; end
		
	local uselinks = args"links" ~= "no" -- whether to add links
	local uselabels = args"labels" ~= "no" -- whether to have labels
	local capfirst = args"scase" ~= nil
	local out = nil -- which term to put before the brackets
	local usebrackets = 0 -- whether to have bracketed terms
	local numargs = 0
	
	if args"out" then
		out = args"out"
		usebrackets = 1
	end
	local t1 = false -- whether traditional Chinese characters go first
	local j1 = false -- whether Cantonese Romanisations go first
	local poj1 = false -- whether Hokkien 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
			if (testChar == "poj") then
				poj1 = 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", "cs", "s", "ss", "t", "ts", "p", "ps", "tp", "w", "j", "cy", "sl", "poj", "tl", "zhu", "zs", "l", "tr"}
	if (t1) then
		orderlist3 = "t"
		orderlist4 = "ts"
		orderlist5 = "s"
		orderlist6 = "ss"
	end
	if (j1) then
		orderlist7 = "j"
		orderlist8 = "cy"
		orderlist9 = "sl"
		orderlist10 = "p"
		orderlist11 = "ps"
		orderlist12 = "tp"
		orderlist13 = "w"
	end
	if (poj1) then
		orderlist7 = "poj"
		orderlist8 = "tl"
		orderlist9 = "p"
		orderlist10 = "ps"
		orderlist11 = "tp"
		orderlist12 = "w"
		orderlist13 = "j"
		orderlist14 = "cy"
		orderlist15 = "sl"
	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" = "漢語拼音"
	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
		if out == "s" or out == "t" then
			out = "c"
		end
	--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
	if (args"ss" and args"ss" == args"ts") then
		-- Treat simplified + traditional as Chinese if they're the same
		args"cs" = args"ss"
		args"ss" = nil
		args"ts" = nil
		if out == "ss" or out == "ts" then
			out = "cs"
		end
	--elseif (not (args"ss" and args"ts")) then
		-- use short label if only one of simplified and traditional
	--	labels"ss" = labels"cs"
	--	labels"ts" = labels"cs"
	end
	if out then
		for i, v in ipairs (orderlist) do -- shift `out` to the beginning of the order list
			if v == out then
				table.remove(orderlist, i)
				table.insert(orderlist, 1, v)
				break
			end
		end
	end
	if (out == "c" and args"s") then usebrackets = 2; end
	if (out == "cs" and args"ss") then usebrackets = 3; 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
			numargs = numargs + 1
			-- build label
			label = ""
			if (uselabels) then
				label = labelspart
				if (capfirst) then
					label = mw.language.getContentLanguage():ucfirst(label)
					capfirst = false
				end
				if (uselinks and part ~= "l" and part ~= "tr") then
					label = "" .. wlinkspart .. "|" .. label .. ""
				end
				--if (part == "l" or part == "tr") then
				--	label = "" .. label .. ""
				--else
					label = label .. "&colon;"
				--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") then
				local terms = ""
				-- put individual, potentially comma-separated glosses in single quotes
				-- (first strip leading and trailing whitespace and quotes, including bold/italic markup)
				for term in val:gmatch("^;,+") do
					term = mw.text.trim(term, "%s\"'")
					terms = terms .. "&apos;" .. term .. "&apos;, "
				end
				val = string.sub(terms, 1, -3)
			elseif (part == "tr") then
				-- put translations in double quotes
				-- (first strip leading and trailing spaces and quotes, including bold/italic markup)
				val = mw.text.trim(val, "%s\"'")
				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
			if numargs == usebrackets then
				-- opening bracket after the `out` term
				body = body .. label .. val .. "（"
			else
				body = body .. label .. val .. "; "
			end
		end
	end
	
	if (body > "") then -- check for empty string
		if mw.ustring.sub(body, -1, -1) == '（' then
			body = mw.ustring.sub(body, 1, -2) -- 末尾の開き括弧を除去
		else
			body = string.sub(body, 1, -3) -- chop off final semicolon and space
		end
		if out and numargs > usebrackets then
			-- closing bracket after the rest of the terms
			body = body .. "）"
		end
		return body
	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 .. "&colon; "
			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