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", 
	"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",
	["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"]	= "F0FDFF",
	["Yuebei Tuhua"]	= "F0FDFF",
}

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