Jump to content
Wikipedia The Free Encyclopedia

Module:Lang-zh

From Wikipedia, the free encyclopedia
Module documentation[view] [edit] [history] [purge]
[画像:Ready for use] This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing.
[画像:Protected] This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing.
Warning This Lua module is used on approximately 79,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them.
This module depends on the following other modules:

Usage

This is the module for the template {{Lang-zh }}. Its main features are described on that template's documentation page, refer to that for how to use it in articles. This documentation describes some particular features of the module.

The first table in the module lists the articles in which the template will put traditional Chinese first. Add articles to this list in the same fashion (the order doesn't matter) to include them. If you cannot edit the module because its protected use the {{edit template-protected }} template on its talk page to request a change.

Use from other modules

The module can be called directly from another module as well as a template. To do this first load the module

local Zh = require("Module:Lang-zh")._Zh

Then call it as follows, with the arguments in a table

local output = Zh{["c"] = "中国", ["p"] = "zhōngguó"}

Tracking categories

The above documentation is transcluded from Module:Lang-zh/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.

 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"] = "Chinese",
	["s"] = "simplified Chinese",
	["t"] = "traditional Chinese",
	["p"] = "pinyin",
	["tp"] = "Tongyong Pinyin",
	["w"] = "Wade–Giles",
	["j"] = "Jyutping",
	["cy"] = "Cantonese Yale",
	["sl"] = "Sidney Lau",
	["poj"] = "Pe̍h-ōe-jī",
	["tl"] = "Tâi-lô",
	["zhu"] = "Zhuyin Fuhao",
	["l"] = "lit.",
	["tr"] = "trans.",
 }

 -- article titles for wikilinks for each part
 local wlinks = {
	["c"] = "Chinese language",
	["s"] = "simplified Chinese characters",
	["t"] = "traditional Chinese characters",
	["p"] = "pinyin",
	["tp"] = "Tongyong Pinyin",
	["w"] = "Wade–Giles",
	["j"] = "Jyutping",
	["cy"] = "Yale romanization of Cantonese",
	["sl"] = "Sidney Lau romanisation",
	["poj"] = "Pe̍h-ōe-jī",
	["tl"] = "Tâi-uân Lô-má-jī Phing-im Hong-àn",
	["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",
	["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",
 }

 local italic = {
	["p"] = true,
	["tp"] = true,
	["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"] = "[[Category:Articles containing Chinese-language text]]",
	["s"] = "[[Category:Articles containing simplified Chinese-language text]]",
	["t"] = "[[Category:Articles containing traditional Chinese-language text]]",
 }

 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
	local regionalvariant = nil
	
	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 = t1st[title.text] == true
	end

	-- based on setting/preference specify order
	local orderlist = {"c", "s", "t", "p", "tp", "w", "j", "cy", "sl", "poj", "tl", "zhu", "l", "tr"}
	if (t1) then
		orderlist[2] = "t"
		orderlist[3] = "s"
	end
	if (j1) then
		orderlist[4] = "j"
		orderlist[5] = "cy"
		orderlist[6] = "sl"
		orderlist[7] = "p"
		orderlist[8] = "tp"
		orderlist[9] = "w"
	end
	if (poj1) then
		orderlist[4] = "poj"
		orderlist[5] = "tl"
		orderlist[6] = "p"
		orderlist[7] = "tp"
		orderlist[8] = "w"
		orderlist[9] = "j"
		orderlist[10] = "cy"
		orderlist[11] = "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"] = "Hanyu Pinyin"
	end
	
	-- specify traditional Chinese variants
	if args["t_hk"] then
		args["t"] = args["t_hk"]
	 regionalvariant = "HK"
	elseif args["t_tw"] then
		args["t"] = args["t_tw"]
		regionalvariant = "TW"
	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 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

	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 (args[part]) then
			numargs = numargs + 1
			-- build label
			label = ""
			if (uselabels) then
				label = labels[part]
				if (capfirst) then
					label = mw.language.getContentLanguage():ucfirst(label)
					capfirst = false
				end
				if (uselinks and part ~= "l" and part ~= "tr") then
					label = "[[" .. wlinks[part] .. "|" .. label .. "]]"
				end
				if (part == "l" or part == "tr") then
					label = "<abbr title=\"" .. wlinks[part] .. "\"><small>" .. label .. "</small></abbr>"
				else
					label = label .. "&colon;"
				end
				label = label .. " "
			end
			-- build value
			val = args[part]
			if (cats[part]) and mw.title.getCurrentTitle().namespace == 0 then
				-- if has associated category AND current page in article namespace, add category
				val = cats[part] .. val
			end
			if (ISOlang[part]) then
				-- add span for language if needed
				params = {["lang"] = ISOlang[part] .. (regionalvariant and "-" .. regionalvariant or "")}
				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 = "&quot;" .. val .. "&quot;"
			end
			if (italic[part]) then
				-- italicise
				val = "<i>" .. val .. "</i>"
			end
			if string.match(val, "</?sup>") then val = val.."[[Category:Pages using template Zh with sup tags]]" end
			if (superscript[part]) then
				-- superscript
				val = val:gsub("(%d)", "<sup>%1</sup>"):gsub("(%d)</sup>%*<sup>(%d)", "%1*%2"):gsub("<sup><sup>([%d%*]+)</sup></sup>", "<sup>%1</sup>")
			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
		body = string.sub(body, 1, -3) -- chop off final semicolon and space
		if out and numargs > usebrackets then
			-- closing bracket after the rest of the terms
			body = body .. "&rpar;"
		end
		return body
	else --no named parameters; see if there's a first parameter, ignoring its name
		if (args[1]) 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"] .. args[1]
			else
				val = args[1]
			end
			params = {["lang"] = ISOlang["c"]}
			val = mw.text.tag({name="span",attrs=params, content=val})
			return label .. val
		end
		return ""
	end
 end

 return p

AltStyle によって変換されたページ (->オリジナル) /