Module:zh-dial-syn

From Wiktionary, the free dictionary
Jump to navigation Jump to search

Chinese dialectal synonyms module. See {{zh-dial}}.


local export = {}
local m_links = require("Module:links")
local zh = require("Module:languages").getByCode("zh")

local variety_list = {
	"Classical", "Formal", "Taxonomic",
	"Northeastern Mandarin", "Jilu Mandarin", "Jiaoliao Mandarin",
	"Central Plains Mandarin", "Lanyin Mandarin",
	"Southwestern Mandarin", "Jianghuai Mandarin",
	"Mandarin", "Cantonese", "Gan", "Hakka", "Huizhou", "Jin", "Jiuxing Yumin",
	"Northern Min", "Eastern Min", "Southern Min", "Puxian Min", "Central Min", "Shaojiang Min", "Zhongshan Min",
	"Southern Pinghua", "Northern Pinghua", "Shehua", "Waxiang", "Wu", "Xiang", "Xiangnan Tuhua", "Yuebei Tuhua"
}

local variety_colour = {
	["Classical"]				= "FAF0F2",
	["Formal"]					= "FAF0F2",
	["Taxonomic"]				= "FAF0F2",
	["Northeastern Mandarin"]	= "FAF5F0",
	["Jilu Mandarin"]			= "FAF5F0",
	["Jiaoliao Mandarin"]		= "FAF5F0",
	["Central Plains Mandarin"]	= "FAF5F0",
	["Lanyin Mandarin"]			= "FAF5F0",
	["Southwestern Mandarin"]	= "FAF5F0",
	["Jianghuai Mandarin"]		= "FAF5F0",
	["Mandarin"]				= "FAF5F0",
	["Cantonese"]				= "F0F5FA",
	["Gan"]						= "F0FAF3",
	["Hakka"]					= "FAF0F6",
	["Huizhou"]					= "FAF9F0",
	["Jin"]						= "FAF5F0",
	["Jiuxing Yumin"]			= "FAF0FE",
	["Northern Min"]			= "F7FAF0",
	["Eastern Min"]				= "F7FAF0",
	["Southern Min"]			= "F7FAF0",
	["Puxian Min"]				= "F7FAF0",
	["Central Min"]				= "F7FAF0",
	["Shaojiang Min"]			= "F7FAF0",
	["Zhongshan Min"]			= "F7FAF0",
	["Southern Pinghua"]		= "F0F5FA",
	["Northern Pinghua"]		= "F0F5FA",
	["Shehua"]					= "FAF0F6",
	["Waxiang"]					= "F0FAF6",
	["Wu"]						= "F4F0FA",
	["Xiang"]					= "F0F2FA",
	["Xiangnan Tuhua"]			= "F0F9FA",
	["Yuebei Tuhua"]			= "F0F9FA",
}

local special_note = {
	["Classical"] = "[[w:Classical Chinese|Classical Chinese]]",
	["Formal"] = "Formal <small>([[w:Written vernacular Chinese|Written Standard Chinese]])</small>",
	["Taxonomic"] = "Taxonomic name",
}

function export.main(frame)
	local data = {}
	local args = frame:getParent().args
	local pagename = mw.title.getCurrentTitle().text
	local target_page = args[1] or pagename
	local resource_page = "Module:zh/data/dial-syn/" .. target_page
	local m_syndata
	if mw.title.new(resource_page).exists then
		m_syndata = require(resource_page).list
	else
		return frame:expandTemplate{ title = "Template:zh-dial/uncreated", args = { target_page } }
	end
	
	--allow alternative title linking for sum-of-parts tables
	local title = m_syndata["title"] and m_syndata["title"] ~= "" and m_syndata["title"] or target_page
	
	local main_title = m_links.full_link( { term = title:gsub("[0-9%-]", "") .. "//", lang = zh, tr = "-" } )
	
	local syn_table = { [=[
	<div class="NavFrame" style="border:0px; max-width: 40em; text-align:center;"><div class="NavHead" style="font-size:105%; border:1px solid #aaaaaa; margin-left:-1px; background-color:#CCCCFF; text-align:center;" cellpadding="3">Dialectal synonyms of ]=] ..
		main_title .. ' (“' .. m_syndata["meaning"] .. '”) ' ..
		"[[Template:zh-dial-map/" .. target_page .. '|<small>&#91;map&#93;</small>]]\n' .. [=[</div><div class="NavContent"> 
	{| class="wikitable" style="margin:0; text-align:center; width: 100%"
	|-
	! style="background:#E8ECFA" | Variety
	! style="background:#E8ECFA" | Location
	! style="background:#E8ECFA" | Words]=] .. [=[
	<div style="float: right; clear: right; font-size:60%"><span class="plainlinks">[]=] ..
		tostring(mw.uri.fullUrl("Module:zh/data/dial-syn/" .. target_page, { ["action"] = "edit" })) ..
	' edit]</span></div>' }
	
	local note = m_syndata["note"]
	if m_syndata["Formal"][1] == "" then
		m_syndata["Formal"] = { target_page }
	elseif m_syndata["Formal"][1] == "-" then
		m_syndata["Formal"] = nil
	end

	local m_dialdata = require("Module:zh/data/dial")
	local variety = ""
	local current_variety = ""
	local location_name = ""
	local location_link = ""
	local colour = ""
	local exists = {}
	local variety_count = {}
	local formatted_synonyms = {}
	local loc = {}
	local cur = {}
	for i, v in pairs(variety_list) do
		variety_count[v] = 0
	end

	for i = 1,#m_dialdata,1 do
		loc = m_dialdata[i]
		cur = m_syndata[loc.key] or {""}
		if cur[1] == "" then
			exists[i] = false
		else
			exists[i] = true
			variety = loc.group
			variety_count[variety] = variety_count[variety] + 1
		end
	end
	
	for i = 1,#exists,1 do
		if exists[i] then
			loc = m_dialdata[i]
			variety = loc.group
			location_name = (loc.english or loc.key):gsub("(%(.*%))", "<small>%1</small>")
			location_link = loc.link or loc.key
			formatted_synonyms = {}
			for i, synonym in ipairs(m_syndata[loc.key]) do
				local synonym_note = mw.text.split(synonym, ":")
				local synonym_etym = mw.text.split(synonym_note[1], "_")
				local syn, etym, note = synonym_etym[1], synonym_etym[2], synonym_note[2]
				local synonym_link = m_links.full_link( {
						term = syn .. (etym and string.format("#Etymology %s", etym) or "") .. "//",
						alt = etym and (syn .. string.format("<sub>%s</sub>", etym)) .. "//",
						lang = zh,
						tr = "-"
					} )
				if note == "GT" then
					require('Module:debug/track')("zh-dial-GT")
				end
				note = note and ' <span style="font-size:60%"><i>' .. note .. '</i></span>' or ""
				table.insert(formatted_synonyms, synonym_link .. note)
			end
			table.insert(syn_table, "\n|-")
			if variety ~= current_variety then
				current_variety = variety
				colour = variety_colour[variety]
				table.insert(syn_table, "\n!rowspan=" .. variety_count[variety] .. (special_note[variety] and " colspan=2" or "") .. 
				' style="background:#' .. colour .. '"| ' .. (special_note[variety] or variety))
			end
			table.insert(syn_table,
				((location_name and not special_note[variety]) and ('\n|style="background:#' .. colour .. '"| ' .. 
				'[[w:' .. location_link .. '|' .. location_name .. ']]') or '') ..
				'\n|style="background:#' .. colour .. '"| ' ..
				table.concat(formatted_synonyms, ", "))
		end
	end
	
	if note and note ~= "" then
		table.insert(syn_table, '\n|-\n! style="background:#FFF7FB; padding-top:5px; padding-bottom: 5px" | ' ..
			"<small>Note</small>\n| colspan=2|<small><i>" .. note .. "</i></small>")
	end
	
	table.insert(syn_table, '\n|}</div></div>')
	
	return table.concat(syn_table, "")
end

return export