Saltar para o conteúdo

Módulo:Zh

Origem: Wikipédia, a enciclopédia livre.
require('strict')

local p = {}

-- artigos em que o chinês tradicional precede o chinês simplificado
local t1st = {
	["Incidente de 28 de fevereiro"] = true,
	["Calendário chinês"] = true,
	["Centro Lippo, Hong Kong"] = true,
	["República da China"] = true,
	["República da China nos Jogos olímpicos de verão de 1924"] = true,
	["Taiwan"] = true,
	["Taiwan (ilha)"] = true,
	["Província de Taiwan"] = true,
	["Wei Boyang"] = true,
}

-- os rótulos para cada parte
local labels = {
	["c"] = "chinês",
	["s"] = "chinês simplificado",
	["t"] = "chinês tradicional",
	["p"] = "pinyin",
	["tp"] = "Tongyong Pinyin",
	["w"] = "Wade–Giles",
	["j"] = "Jyutping",
	["cy"] = "Yale cantonês",
	["sl"] = "Sidney Lau",
	["poj"] = "Pe̍h-ōe-jī",
	["zhu"] = "Zhuyin Fuhao",
	["l"] = "lit.",
	["tr"] = "trad.",
}

-- títulos dos artigos para os wikilinks para cada parte
local wlinks = {
	["c"] = "Língua chinesa",
	["s"] = "Chinês simplificado",
	["t"] = "Chinês tradicional",
	["p"] = "Pinyin",
	["tp"] = "Tongyong Pinyin",
	["w"] = "Wade–Giles",
	["j"] = "Jyutping",
	["cy"] = "Romanização Yale do cantonês",
	["sl"] = "Romanização Sidney Lau",
	["poj"] = "Pe̍h-ōe-jī",
	["zhu"] = "Zhuyin",
	["l"] = "Tradução literal",
	["tr"] = "Tradução",
}

-- para as partes que devem ser tratadas como linguagens em seus códigos ISO
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,
}
-- Categorias para diferentes tipos de textos chineses
local cats = {
	["c"] = "[[Categoria:!Artigos com texto em chinês]]",
	["s"] = "[[Categoria:!Artigos com texto em chinês simplificado]]",
	["t"] = "[[Categoria:!Artigos com texto em chinês tradicional]]",
}

function p.Zh(frame)
	-- carrega o módulo de argumentos para simplificar o tratamento de 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") -- se deseja adicionar links
	local uselabels = not (args["labels"] == "no") -- se precisa ter rótulos
	local capfirst = args["scase"] ~= nil
 
	local t1 = false -- se os caracteres chineses tradicionais vão primeiro
	local j1 = false -- se as romanizações cantonesas vão primeiro
	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 = t1st[title.text] == true
	end

	-- com base na configuração/preferência, especifica a ordem
	local orderlist = {"c", "s", "t", "p", "tp", "w", "j", "cy", "sl", "poj", "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
	
	-- regras para renomear. Regras para alterar parâmetros e rótulos com base em outros parâmetros
	if args["hp"] then
		-- hp um alias para p ([hanyu] pinyin)
		args["p"] = args["hp"]
	end
	if args["tp"] then
		-- se também Tongyu pinyin usa o nome completo para Hanyu pinyin
		labels["p"] = "Hanyu Pinyin"
	end
	
	if (args["s"] and args["s"] == args["t"]) then
		-- Trata simplificado + tradicional como chinês se forem iguais
		args["c"] = args["s"]
		args["s"] = nil
		args["t"] = nil
	elseif (not (args["s"] and args["t"])) then
		-- usa rótulo curto se apenas um dos simplificados e tradicionais
		labels["s"] = labels["c"]
		labels["t"] = labels["c"]
	end

	local body = "" -- a string de saída
	local params -- para a criação de extensões HTML
	local label -- o rótulo, ou seja, o bit que precede o texto fornecido
	local val -- o texto fornecido
	
	-- percorre todos os campos possíveis em loop, adicionando-os à saída
	for i, part in ipairs(orderlist) do
		if (args[part]) then
			-- constrói o rótulo
			label = ""
			if (uselabels) then
				label = labels[part]
				if (capfirst) then
					label = mw.language.getContentLanguage():ucfirst(label)
					capfirst = false
				end
				if (uselinks) then
					label = "[[" .. wlinks[part] .. "|" .. label .. "]]"
				end
				if (labels[part] ~= "lit.") then
					label = label .. ":"
				else
					label = "<small>" .. label .. "</small>"
				end
				label = label .. " "
			end
			-- constrói o valor
			val = args[part]
			if (cats[part]) and mw.title.getCurrentTitle().namespace == 0 then
				-- se tiver categoria associada E página atual no espaço nomeado para artigos, adiciona categoria
				val = cats[part] .. val
			end
			if (ISOlang[part]) then
				-- adiciona extensão para a linguagem, se necessário
				params = {["lang"] = ISOlang[part]}
				val = mw.text.tag({name="span",attrs=params, content=val})
			elseif ((part == "l") or (part == "tr")) then
				-- coloca literais entre aspas
				val = "'" .. val .. "'"
			end
			if (italic[part]) then
				-- coloca em itálico
				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
			-- adiciona ambos ao corpo
			body = body .. label .. val .. "; "
		end
	end
	
	if (body > "") then -- verifica se há string vazia
		return string.sub(body, 1, -3) -- corta o ponto e vírgula e o espaço final
	else -- sem parâmetros nomeados; verifica se há um primeiro parâmetro, ignorando seu nome
		if (args[1]) then
			-- se houver, trata-o como chinês
			label = ""
			if (uselabels) then
				label = labels["c"]
				if (uselinks) then
					label = "[[" .. wlinks["c"] .. "|" .. label .. "]]"
				end
				label = label .. "&#58; "
			end
			-- padrão para mostrar links e rótulos como nenhuma opção fornecida
			if mw.title.getCurrentTitle().namespace == 0 then
				-- se a página atual no espaço nomeado para artigos
				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