Module:zh-pron

local m_str_utils = require("Module:string utilities")

local codepoint = m_str_utils.codepoint local concat = table.concat local find = m_str_utils.find local format = string.format local gmatch = m_str_utils.gmatch local gsub = m_str_utils.gsub local insert = table.insert local ipairs = ipairs local match = m_str_utils.match local pairs = pairs local split = m_str_utils.split local gsplit = m_str_utils.gsplit

local export = {}

local hanzi = require("Module:scripts").getByCode("Hani"):getCharacters local bopomofo = require("Module:scripts").getByCode("Bopo"):getCharacters

local langname = { ["cdo"] = "Eastern Min", ["cjy"] = "Jin", ["cmn"] = "Mandarin", ["csp"] = "Southern Pinghua", ["dng"] = "Dungan", ["gan"] = "Gan", ["hak"] = "Hakka", ["hsn"] = "Xiang", ["hsn-lou"] = "Xiang", ["hsn-hya"] = "Xiang", ["mnp"] = "Northern Min", ["nan-hbl"] = "Hokkien", ["nan-luh"] = "Leizhou Min", ["nan-tws"] = "Teochew", ["wuu"] = "Wu", ["wuu-jih"] = "Wu", ["yue"] = "Cantonese", ["zhx-sic"] = "Sichuanese", ["zhx-tai"] = "Taishanese", }

local langname_abbr = { ["m"] = "Mandarin", ["m-s"] = "Sichuanese", ["m-x"] = "Mandarin", ["m-nj"] = "Mandarin", ["dg"] = "Dungan", ["c"] = "Cantonese", ["c-dg"] = "Cantonese", ["c-t"] = "Taishanese", ["c-yj"] = "Cantonese", ["g"] = "Gan", ["h"] = "Hakka", ["j"] = "Jin", ["mb"] = "Northern Min", ["mc"] = "Middle Chinese", ["md"] = "Eastern Min", ["mn"] = "Hokkien", ["mn-t"] = "Teochew", ["mn-l"] = "Leizhou Min", ["oc"] = "Old Chinese", ["sp"] = "Southern Pinghua", ["w"] = "Wu", ["w-j"] = "Wu", ["x"] = "Xiang", ["x-l"] = "Loudi Xiang", ["x-h"] = "Hengyang Xiang", }

local pos_aliases_cat = { ["n"] = "nouns", ["noun"] = "nouns", ["pn"] = "proper nouns", ["propn"] = "proper nouns", ["proper"] = "proper nouns", ["proper noun"] = "proper nouns", ["pron"] = "pronouns", ["pronoun"] = "pronouns", ["v"] = "verbs", ["verb"] = "verbs", ["a"] = "adjectives", ["adj"] = "adjectives", ["adjective"] = "adjectives", ["adv"] = "adverbs", ["adverb"] = "adverbs", ["prep"] = "prepositions", ["pre"] = "prepositions", ["postp"] = "postpositions", ["post"] = "postpositions", ["con"] = "conjunctions", ["conj"] = "conjunctions", ["conjunction"] = "conjunctions", ["part"] = "particles", ["particle"] = "particles", ["pref"] = "prefixes", ["prefix"] = "prefixes", ["suf"] = "suffixes", ["suffix"] = "suffixes", ["infix"] = "infixes", ["prov"] = "proverbs", ["proverb"] = "proverbs", ["id"] = "idioms", ["idiom"] = "idioms", ["ch"] = "chengyu", ["cy"] = "chengyu", ["4ci"] = "chengyu", ["ph"] = "phrases", ["phrase"] = "phrases", ["int"] = "interjections", ["intj"] = "interjections", ["interj"] = "interjections", ["interjection"] = "interjections", ["cl"] = "classifiers", ["cls"] = "classifiers", ["classifier"] = "classifiers", ["num"] = "numerals", ["numeral"] = "numerals", ["abb"] = "abbreviations", ["abbreviation"] = "abbreviations", ["det"] = "determiners", ["deter"] = "determiners", ["determiner"] = "determiners", ["syl"] = "syllables", ["syllable"] = "syllables", }

local function make_note(text) if find(text, ": ") then text = "\n*" .. gsub(gsub(text, "\n", ".\n*"), "([:;]) ", "%1\n**") elseif find(text, "; ") then text = "\n*" .. gsub(text, "; ", ";\n*") end text = gsub(text, "“([^”]+)”", function (a) return "“" .. gsub(a, ";\n%*+", "; ") .. "”" end) -- fix bug about indentation levels (see https://en.wiktionary.org/w/index.php?oldid=78848651) local last_level = ("\n"..text):match("\n(%**)[^*\n][^\n]*$") local append = last_level:gsub("%*","") return "\nNote: " .. text .. ". " .. append end

local function ipa_format(text) local numbers = { ["1"]="¹",["2"]="²",["3"]="³",["4"]="⁴",["5"]="⁵",["0"]="⁰",["-"]="⁻",["/"]="/, /" } return gsub(text,"[0-5%-/]",numbers) end

local function Consolas(text) return '' .. text .. " " end

local function format_IPA(text) return ' ' .. text .. " " end

function export.make(frame) local parent_args = frame:getParent.args local params = { pagename = {}, namespace = {}, dial = {}, mc = {}, oc = {}, cat = {}, only_cat = {type = "boolean"}, poj_form_zh_see = {type = "boolean"}, }	for abbr, _ in pairs(langname_abbr) do		params[abbr] = {} params[abbr .. "a"] = {list = true} params[abbr .. "_note"] = {} end local args = require("Module:parameters").process(parent_args, params, nil, "zh-pron", "make")

local title = mw.title.getCurrentTitle local pagename = args.pagename or mw.loadData("Module:headword/data").pagename local sortkey = (require("Module:Hani-sortkey").makeSortKey(pagename)) local is_single_hanzi = find(pagename, "^[" .. hanzi .. "]$") ~= nil local namespace = args.namespace or title.nsText local m_rom = args["m"] local m_s_rom = args["m-s"] local m_x_rom = args["m-x"] local m_nj_rom = args["m-nj"] local dg_rom = args["dg"] local c_rom = args["c"] local c_dg_rom = args["c-dg"] local c_t_rom = args["c-t"] local c_yj_rom = args["c-yj"] local g_rom = args["g"] local h_rom = args["h"] local j_rom = args["j"] local mb_rom = args["mb"] local md_rom = args["md"] local mn_rom = args["mn"] local mn_l_rom = args["mn-l"] local mn_t_rom = args["mn-t"] local sp_rom = args["sp"] local w_rom = args["w"] local w_j_rom = args["w-j"] local x_rom = args["x"] local x_l_rom = args["x-l"] local x_h_rom = args["x-h"] local m_audio = args["ma"] local m_s_audio = args["m-sa"] local m_x_audio = args["m-xa"] local m_nj_audio = args["m-nja"] local dg_audio = args["dga"] local c_audio = args["ca"] local c_dg_audio = args["c-dga"] local c_t_audio = args["c-ta"] local c_yj_audio = args["c-yja"] local g_audio = args["ga"] local h_audio = args["ha"] local j_audio = args["ja"] local mb_audio = args["mba"] local md_audio = args["mda"] local mn_audio = args["mna"] local mn_l_audio = args["mn-la"] local mn_t_audio = args["mn-ta"] local sp_audio = args["spa"] local w_audio = args["wa"] local w_j_audio = args["w-ja"] local x_audio = args["xa"] local x_l_audio = args["x-la"] local x_h_audio = args["x-ha"] local dial = args["dial"] local mc = args["mc"] local oc = args["oc"] local only_cat = args["only_cat"]

-- True if arguments exist for the specified variety, using a language param abbreviation. local function has_var(var) return args[var] or #args[var .. "a"] > 0 end

local function add_audio(text, audios, lang, show) -- This function has side effects for _, audio in ipairs(audios) do			if audio == "y" then audio = format("%s-%s.ogg", lang, title.baseText) end insert(text, "\n*" .. (show and "::" or "**") .. " [[File:")			insert(text, audio)			insert(text, "]]") end if #audios > 0 then insert(text, "[[Category:")			insert(text, langname[lang])			insert(text, " terms with audio links|" .. sortkey .. "]]") end end local function add_audio_show(text, audios, lang) add_audio(text, audios, lang, "show") end

local text = {} --the pronunciation table if not only_cat then --The whole table consists of 4 parts --"textShow" contains Part 1, 3 and 4 local textShow = {' '} --"textHide" is Part 2 local textHide = {} local function show(txt) insert(textShow, txt) end local function hide(txt) insert(textHide, txt) end local function hide_note(var) local note = args[var .. "_note"] if note then hide(make_note(note)) end end

show(' ') --Part 1 and 2, "Pronunciation" and "Pronunciation expressed in different romanizations" if m_rom or m_s_rom or m_x_rom or m_nj_rom or dg_rom then show("\n* Mandarin") end if has_var("m") then local m_args = {} local m_pron = require("Module:cmn-pron") if m_rom then local str_analysis = m_pron.str_analysis local other_m_vars = has_var("m-s") or has_var("m-x") or has_var("m-nj") or has_var("dg") show("\n" .. str_analysis(m_rom, "head", other_m_vars))

m_args[1] = str_analysis(m_rom, "") for i = 2, 5 do					m_args[i] = str_analysis(m_rom, tostring(i)) end local m_args_params_prefixed_with_1 = {"n", "na", "nb", "nc", "nd"} for _, base in ipairs(m_args_params_prefixed_with_1) do					for i = 1, 5 do local param = tostring(i) .. base m_args[param] = str_analysis(m_rom, param) end end local m_args_params = {"py", "cap", "tl", "tl2", "tl3", "a", "audio", "er", "ertl", "ertl2", "ertl3", "era", "eraudio"} for _, base in ipairs(m_args_params) do					m_args[base] = str_analysis(m_rom, base) for i = 2, 5 do local param = tostring(i) .. base m_args[param] = str_analysis(m_rom, param) end end end for i, audio in ipairs(m_audio) do				local ind = i == 1 and "" or tostring(i) m_args[ind .. "a"] = audio end show(m_pron.make_audio(m_args)) hide(m_pron.make_args(m_args)) hide_note("m") end if (not m_rom) and (m_s_rom or m_x_rom or m_nj_rom or dg_rom) then hide("\n* Mandarin") end if has_var("m-s") then local m_s_pron = require("Module:zhx-sic-pron") local m_s_processed = gsub(m_s_rom:gsub("/", " / "), "([%d-])([%a])", "%1 %2") :gsub("%d[%d%*%-]*%f[^%d%*]", "%0") if m_s_rom then show("\n*: (Chengdu, Sichuanese Pinyin) : ") show(Consolas(m_s_processed)) end add_audio_show(textShow, m_s_audio, "zhx-sic") hide("\n** (Chengdu) ") hide("\n*** Sichuanese Pinyin : ") hide(Consolas(m_s_processed)) local xinwenz = m_s_pron.convert(m_s_rom, "SWZ") if xinwenz then hide("\n*** Scuanxua Ladinxua Xin Wenz : ") hide(Consolas(m_s_pron.convert(m_s_rom, "SWZ"))) end hide("\n*** Sinological IPA (key) : ") hide(format_IPA(m_s_pron.convert(m_s_rom, "IPA"))) hide_note("m-s") end if has_var("m-x") then local m_x_pron = require("Module:cmn-pron-Xian") local m_x_display, m_x_hidden, m_x_ipa = m_x_pron.py_process(m_x_rom) show("\n*: (Xi'an, Guanzhong Pinyin) : ") show(Consolas(m_x_display)) add_audio_show(textShow, m_x_audio, "cmn") hide("\n** (Xi'an) ") hide("\n*** Guanzhong Pinyin : ") hide(Consolas(m_x_hidden)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(m_x_ipa)) hide_note("m-x") end if has_var("m-nj") then local m_nj_pron = require("Module:cmn-pron-Nanjing") local m_nj_display, m_nj_hidden, m_nj_num, m_nj_ipa = m_nj_pron.py_process(m_nj_rom) show("\n*: (Nanjing, Nanjing Pinyin) : ") show(Consolas(m_nj_display)) add_audio_show(textShow, m_nj_audio, "cmn") hide("\n** (Nanjing) ") hide("\n*** Nanjing Pinyin : ") hide(Consolas(m_nj_hidden)) hide("\n*** Nanjing Pinyin (numbered) : ") hide(Consolas(m_nj_num)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(m_nj_ipa)) hide_note("m-nj") end if has_var("dg") then local dg_pron = require("Module:dng-pron") local dg_processed = dg_pron.process(dg_rom) if dg_rom then show("\n*: (Dungan, Cyrillic and Wiktionary) : ") show(Consolas(dg_processed)) end add_audio_show(textShow, dg_audio, "dng") hide("\n** (Dungan) ") hide("\n*** Cyrillic and Wiktionary : ") hide(Consolas(dg_processed)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(dg_pron.convert(dg_rom, "IPA")) .. "\n**: (Note: Dungan pronunciation is currently experimental and may be inaccurate.) ") hide_note("dg") end if has_var("c") or has_var("c-dg") or has_var("c-t") or has_var("c-yj") then if c_rom or c_dg_rom or c_t_rom or c_yj_rom then local c_count = (c_rom and 1 or 0) + (c_dg_rom and 1 or 0) + (c_t_rom and 1 or 0) + (c_yj_rom and 1 or 0) local c_sep = (c_count == 1) and " " or "\n*: " show("\n* Cantonese") hide("\n* Cantonese") if c_rom then local c_pron = require("Module:yue-pron") show(c_sep) show(" (")					if c_count > 1 then						show("Guangzhou–Hong Kong, ")					end					show("Jyutping) : ") show(Consolas(c_pron.show_standard(c_rom, is_single_hanzi))) add_audio_show(textShow, c_audio, "yue") hide(c_pron.hide_standard(c_rom, is_single_hanzi)) if not args["c_note"] and is_single_hanzi and (c_rom:find("^[ao]") or c_rom:find(",[ao]")) then args["c_note"] = "The zero initial " .. format_IPA("/∅-/") .. " is commonly pronounced with a ng-initial " .. format_IPA("/ŋ-/") .. " in some varieties of Cantonese, including Hong Kong Cantonese" end hide_note("c") end if c_dg_rom then local c_dg_pron = require("Module:yue-pron/Dongguan") local c_dg_display = c_dg_rom:gsub(","," / ") :gsub("%d[%d%*%-]*%f[^%d%*]", "%0") show(c_sep .. " (Dongguan, Jyutping++) : ") show(Consolas(c_dg_display)) add_audio_show(textShow, c_dg_audio, "yue") hide("\n** (Dongguan, Guancheng) ") hide("\n*** Jyutping++ : ") hide(Consolas(c_dg_display)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(c_dg_pron.jpp_to_ipa(c_dg_rom))) hide_note("c-dg") end if c_t_rom then local c_t_pron = require("Module:yue-pron/Taishanese") local c_t_display = c_t_rom:gsub(","," / ") :gsub("%d[%d%*%-]*%f[^%d%*]", "%0") show(c_sep .. " (Taishan, Wiktionary) : ") show(Consolas(c_t_display)) add_audio_show(textShow, c_t_audio, "zhx-tai") hide("\n** (Taishanese, Taicheng) ") hide("\n*** Wiktionary : ") hide(Consolas(c_t_display)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(c_t_pron.hoisanva_to_ipa(c_t_rom))) hide_note("c-t") end if c_yj_rom then local c_yj_pron = require("Module:yue-pron/Yangjiang") local c_yj_display = c_yj_rom:gsub(","," / ") :gsub("%d[%d%*%-]*%f[^%d%*]", "%0") show(c_sep .. " (Yangjiang, Jyutping++) : ") show(Consolas(c_yj_display)) add_audio_show(textShow, c_yj_audio, "yue") hide("\n** (Yangjiang Yue, Jiangcheng) ") hide("\n*** Jyutping++ : ") hide(Consolas(c_yj_display)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(c_yj_pron.jpp_to_ipa(c_yj_rom))) hide_note("c-yj") end end end if has_var("g") then local g_pron = require("Module:gan-pron") if g_rom then show("\n* Gan (Wiktionary) : ") show(Consolas(g_pron.rom(g_rom))) end add_audio_show(textShow, g_audio, "gan") hide("\n* Gan") hide("\n** (Nanchang) ") hide("\n*** Wiktionary : ") hide(Consolas(g_pron.rom(g_rom))) hide("\n*** Sinological IPA (key) : ") hide(format_IPA("/" .. g_pron.ipa(g_rom) .. "/"))			hide_note("g") end if h_rom and (find(h_rom, "pfs=.") or find(h_rom, "gd=.")) or #h_audio > 0 then local h_pron = require("Module:hak-pron") if find(h_rom, "pfs=.") or find(h_rom, "gd=.") then show("\n* Hakka") show(h_pron.rom_display(h_rom,"yes")) end add_audio_show(textShow, h_audio, "hak") hide("\n* Hakka") if h_rom then hide(h_pron.rom_display(h_rom,"")) end hide_note("h") end if has_var("j") then local j_pron = require("Module:cjy-pron") if j_rom then show("\n* Jin (Wiktionary) : ") show(Consolas(j_pron.rom(j_rom))) end add_audio_show(textShow, j_audio, "cjy") hide("\n* Jin") hide("\n** (Taiyuan)+ ") if j_rom then hide("\n*** Wiktionary : ") hide(Consolas(j_pron.rom(j_rom))) end local no_sandhi = false local roms = split(j_rom, "/") for i = 1, #roms do				if find(roms[i], " [^ ]+ ") then no_sandhi = true break end end hide("\n*** Sinological IPA (''old-style" .. (no_sandhi and ", no sandhi" or "") .. "'') : ")			hide(format_IPA("/" .. j_pron.ipa(j_rom, no_sandhi and "no_sandhi" or "") .. "/"))			hide_note("j") end if has_var("mb") then local mb_pron = require("Module:mnp-pron") if mb_rom then show("\n* Northern Min (KCR) : ") show(Consolas(mb_pron.rom(mb_rom))) end add_audio_show(textShow, mb_audio, "mnp") hide("\n* Northern Min") hide("\n** (Jian'ou) ") if mb_rom then hide("\n*** Kienning Colloquial Romanized : ") hide(Consolas(mb_pron.rom(mb_rom))) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(mb_pron.ipa(mb_rom))) end hide_note("mb") end if has_var("md") then local md_pron = require("Module:cdo-pron") if md_rom then show("\n* Eastern Min (BUC) : ") show(Consolas(md_pron.rom(md_rom))) end add_audio_show(textShow, md_audio, "cdo") hide("\n* Eastern Min") hide("\n** (Fuzhou) ") if md_rom then hide("\n*** Bàng-uâ-cê : ") hide(Consolas(md_pron.rom(md_rom))) if not (md_rom and find(md_rom, "([^/]*)-([^/]*)-([^/]*)-([^/]*)-([^/]*)")) then hide("\n*** Sinological IPA (key) : ") hide(format_IPA("/" .. md_pron.ipa(md_rom) .. "/"))				else hide("\n*** Sinological IPA (key) (no sandhi) : ") hide(format_IPA("/" .. md_pron.ipa(md_rom, "no_sandhi") .. "/"))				end end hide_note("md") end if has_var("mn") or has_var("mn-l") or has_var("mn-t") then local mn_pron, mn_l_pron if has_var("mn") or has_var("mn-t") then mn_pron = require("Module:nan-pron") end if has_var("mn-l") then mn_l_pron = require("Module:nan-pron-Leizhou") end if mn_rom or mn_t_rom or mn_l_rom then show("\n* Southern Min") if mn_rom then show(((mn_l_rom or mn_t_rom) and "\n*:" or "") .. " (Hokkien, POJ) : ") show(Consolas(mn_pron.poj_display(mn_pron.poj_check_invalid(mn_rom)))) add_audio_show(textShow, mn_audio, "nan-hbl") end if mn_t_rom then show(((mn_rom or mn_l_rom) and "\n*:" or "") .. " (Teochew, Peng'im) : ") show(Consolas(mn_pron.pengim_display(mn_t_rom))) add_audio_show(textShow, mn_t_audio, "nan-tws") end if mn_l_rom then show(((mn_rom or mn_t_rom) and "\n*:" or "") .. " (Leizhou, Leizhou Pinyin) : ") show(Consolas(mn_l_pron.rom(mn_l_rom))) add_audio_show(textShow, mn_l_audio, "nan-luh") end end hide("\n* Southern Min") if has_var("mn") then hide(mn_pron.generate_all(mn_rom)) hide_note("mn") end if has_var("mn-t") then hide("\n** (Teochew) ") hide("\n*** Peng'im : ") hide(Consolas(mn_pron.pengim_display(mn_t_rom))) hide("\n*** Pe̍h-ōe-jī-like : ") hide(Consolas(mn_pron.pengim_to_pojlike_conv(mn_t_rom))) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(mn_pron.pengim_to_ipa_conv(mn_t_rom))) hide_note("mn-t") end if has_var("mn-l") then hide("\n** (Leizhou) ") hide("\n*** Leizhou Pinyin : ") hide(Consolas(mn_l_pron.rom(mn_l_rom))) hide("\n*** Sinological IPA : ") hide(format_IPA(mn_l_pron.ipa(mn_l_rom))) hide_note("mn-l") end end if has_var("sp") then local sp_pron = require("Module:csp-pron") local sp_processed = sp_rom:gsub(",([^ ])",", %1") :gsub("%d[%d%*%-]*%f[^%d%*]", "%0") show("\n* Southern Pinghua (Nanning, Jyutping++) : ") show(Consolas(sp_processed)) add_audio_show(textShow, sp_audio, "csp") hide("\n* Southern Pinghua") hide("\n** (Nanning Pinghua, Tingzi) ") hide("\n*** Jyutping++ : ") hide(Consolas(sp_processed)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(sp_pron.jpp_to_ipa(sp_rom))) hide_note("sp") end if has_var("w") or has_var("w-j") then local w_count = (w_rom and 1 or 0) + (w_j_rom and 1 or 0) local w_show, w_hide, w_j_show, w_j_hide if w_rom then w_show, w_hide = require("Module:wuu-pron").make(w_rom, w_count) end if w_j_rom then w_j_show, w_j_hide = require("Module:wuu-pron/Jinhua").make(w_j_rom, w_count) end if w_count > 1 then show("\n* Wu (Wugniu) ") else show("\n* Wu") end show(w_show) show(w_j_show) add_audio_show(textShow, w_audio, "wuu") hide("\n* Wu") hide(w_hide) hide(w_j_hide) -- add_audio(textHide, w_audio, "wuu") hide_note("w") hide_note("w-j") end if has_var("x") or has_var("x-l") or has_var("x-h") then local x_pron = has_var("x") and require("Module:hsn-pron") or nil local x_l_pron = has_var("x-l") and require("Module:hsn-pron-Loudi") or nil local x_h_pron = has_var("x-h") and require("Module:hsn-pron-Hengyang") or nil if x_rom or x_l_rom or x_h_rom then show("\n* Xiang") if x_rom then show(((x_l_rom or x_h_rom) and "\n*:" or "") .. " (Changsha, Wiktionary) : ") show(Consolas(x_pron.rom(x_rom))) add_audio_show(textShow, x_audio, "hsn") end if x_l_rom then show(((x_rom or x_h_rom) and "\n*:" or "") .. " (Loudi, Wiktionary) : ") show(Consolas(x_l_pron.rom(x_l_rom))) add_audio_show(textShow, x_l_audio, "hsn-lou") end if x_h_rom then show(((x_rom or x_l_rom) and "\n*:" or "") .. " (Hengyang, Wiktionary) : ") show(Consolas(x_h_pron.rom(x_h_rom))) add_audio_show(textShow, x_h_audio, "hsn-hya") end end hide("\n* Xiang") if x_rom then local x_diff = x_pron.stylediff(x_rom) hide("\n** (Changsha) ") hide("\n*** Wiktionary : ") hide(Consolas(x_pron.rom(x_rom))) hide("\n*** Sinological IPA (key)") hide(x_diff and " (old-style)" or "") hide(" : ") hide(format_IPA("/" .. x_pron.ipa(x_rom) .. "/"))				if x_diff then hide("\n*** Sinological IPA (key) (new-style) : ") hide(format_IPA("/" .. x_pron.ipa(x_rom, "new") .. "/"))				end hide_note("x") end if x_l_rom then hide("\n** (Loudi) ") hide("\n*** Wiktionary : ") hide(Consolas(x_l_pron.rom(x_l_rom))) hide("\n*** Sinological IPA (key)") hide(" : ") hide(format_IPA("/" .. x_l_pron.ipa(x_l_rom) .. "/"))				hide_note("x-l") end if x_h_rom then hide("\n** (Hengyang) ") hide("\n*** Wiktionary : ") hide(Consolas(x_h_pron.rom(x_h_rom))) hide("\n*** Sinological IPA (key)") hide(" : ") hide(format_IPA("/" .. x_h_pron.ipa(x_h_rom) .. "/"))				hide_note("x-h") end end -- combine textShow and textHide into text text = { concat(textShow), ' \n \n \n', concat(textHide), " "		}

--Part 3 "Dialectal data" if dial ~= "n" and is_single_hanzi then local success, m_dial = pcall(mw.loadData, "Module:zh/data/dial-pron/" .. pagename) if success then local dialPron = {} local temporary = {} if dial and find(dial, "^[0-9\\,]+$") then for element in gsplit(dial, ",") do						insert(dialPron, m_dial[tonumber(element)]) end else for _, element in ipairs(m_dial) do						insert(dialPron, element) end end for _, set in ipairs(dialPron) do					for _, object in ipairs(set[2]) do						insert(temporary, object) end end local rand = gsub("-" .. concat(temporary), "[^A-Za-z0-9]", codepoint("%1")) insert(text,					'\n\n \n* ' ..					' Dialectal data ' ..					' \n' ..					' '				)

insert(text, '\n{| class="wikitable" ' ..					'id="' .. rand .. '" style="width:100%; margin:0; ' ..					'text-align:center; border-collapse: collapse; border-style: hidden; display: table;"')

local locStart = "\n|-\n!" local readingStart = concat({'\n!style="background:#E8ECFA; width:9em"|',				' [', tostring(mw.uri.fullUrl("Module:zh/data/dial-pron/" .. pagename, {["action"]="edit"})), ' edit]  '}) local locEnd = ' ' local headclr = 'style="background:#E8ECFA"|' local mclr = 'style="background:#FAF5F0"|' local jclr = 'style="background:#FAF5F0"|' local wclr = 'style="background:#F4F0FA"|' local huclr = 'style="background:#FAF9F0"|' local xclr = 'style="background:#F0F2FA"|' local gclr = 'style="background:#F0FAF3"|' local haclr = 'style="background:#FAF0F6"|' local cclr = 'style="background:#F0F5FA"|' local minclr = 'style="background:#F7FAF0"|' local clrList = { mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, jclr, jclr, jclr, wclr, wclr, wclr, wclr, huclr, huclr, xclr, xclr, gclr, haclr, haclr, cclr, cclr, cclr, minclr, minclr, minclr, minclr, minclr }				local locList = { concat({headclr, "Variety\n!", headclr, "Location"}), concat({"rowspan=17 ", mclr, "Mandarin\n!", mclr, "Beijing\n|", mclr}), concat({mclr, "Harbin\n|", mclr}), concat({mclr, "Tianjin\n|", mclr}), concat({mclr, "Jinan\n|", mclr}), concat({mclr, "Qingdao\n|", mclr}), concat({mclr, "Zhengzhou\n|", mclr}), concat({mclr, "Xi'an\n|", mclr}), concat({mclr, "Xining\n|", mclr}), concat({mclr, "Yinchuan\n|", mclr}), concat({mclr, "Lanzhou\n|", mclr}), concat({mclr, "Ürümqi\n|", mclr}), concat({mclr, "Wuhan\n|", mclr}), concat({mclr, "Chengdu\n|", mclr}), concat({mclr, "Guiyang\n|", mclr}), concat({mclr, "Kunming\n|", mclr}), concat({mclr, "Nanjing\n|", mclr}), concat({mclr, "Hefei\n|", mclr}), concat({"rowspan=3 ", jclr, "Jin\n!", jclr, "Taiyuan\n|", jclr}), concat({jclr, "Pingyao\n|", jclr}), concat({jclr, "Hohhot\n|", jclr}), concat({"rowspan=4 ", wclr, "Wu\n!", wclr, "Shanghai\n|", wclr}), concat({wclr, "Suzhou\n|", wclr}), concat({wclr, "Hangzhou\n|", wclr}), concat({wclr, "Wenzhou\n|", wclr}), concat({"rowspan=2 ", huclr, "Hui\n!", huclr, "Shexian\n|", huclr}), concat({huclr, "Tunxi\n|", huclr}), concat({"rowspan=2 ", xclr, "Xiang\n!", xclr, "Changsha\n|", xclr}), concat({xclr, "Xiangtan\n|", xclr}), concat({gclr, "Gan\n!", gclr, "Nanchang\n|", gclr}), concat({"rowspan=2 ", haclr, "Hakka\n!", haclr, "Meixian\n|", haclr}), concat({haclr, "Taoyuan\n|", haclr}), concat({"rowspan=3 ", cclr, "Cantonese\n!", cclr, "Guangzhou\n|", cclr}), concat({cclr, "Nanning\n|", cclr}), concat({cclr, "Hong Kong\n|", cclr}), concat({"rowspan=5 ", minclr, "Min\n!", minclr, "Xiamen (Hokkien)\n|", minclr}), concat({minclr, "Fuzhou (Eastern Min)\n|", minclr}), concat({minclr, "Jian'ou (Northern Min)\n|", minclr}), concat({minclr, "Shantou (Teochew)\n|", minclr}), concat({minclr, "Haikou (Hainanese)\n|", minclr})}

local function ipa_correct(ipa, location) if location == 22 then return (gsub(ipa, "13", "23")) else return ipa end end

local function fmtDial(text, location) local fmttedPron = {} if text == "" then return "" end for pronunciation in gsplit(text, "|") do local ipa = match(pronunciation, "^[^%(%)" .. hanzi .. "～,]+") ipa = gsub(ipa, "([ptk])([0-5])", "%1̚%2") local environ = match(pronunciation, "[%(%)" .. hanzi .. "～,]*$") or false insert(fmttedPron, " /" ..							tostring(ipa_format(ipa_correct(ipa, location))) .. "/ " .. (environ and "  "..environ.." " or nil)) end return concat(fmttedPron, " ") end

for locationNo = 1, 40 do					for readingNo = 1, #dialPron do						if readingNo == 1 then insert(text, locStart) insert(text, locList[locationNo]) end if locationNo == 1 then local situation = dialPron[readingNo][1] insert(text, readingStart) insert(text, pagename) insert(text, (pagename ~= situation and " (" ..								gsub(situation, pagename, "'''" .. pagename .. "'''") .. ")" or "")) insert(text, " ") else insert(text, (readingNo == 1 and "" or "\n|" .. clrList[locationNo-1])) insert(text, locEnd) insert(text, fmtDial(dialPron[readingNo][2][locationNo-1], locationNo)) insert(text, " ") end end end insert(text, "\n|} ") end end

--Part 4 "Middle Chinese & Old Chinese" local mc_preview, oc_preview local m_ltc_pron, m_och_pron

-- !!!		-- The following function modifies the tables generated by mod:ltc-pron and mod:och-pron, shifting them -- from using "mw-collapsible" to using "vsSwitcher", because the former -- can not collapse on the mobile site and makes Chinese entries a mess. -- It is supposed to be a temporary solution. -- !!!		local function shiftCustomtoggle2Vsswitcher(s) local result result = (s:gsub( '\n%* ]+">', '\n \n* ' ):gsub( ' ▼ (.-) \n{| class="wikitable',				' %1\n \n{| class="wikitable' ):gsub( '{| class="wikitable mw%-collapsible mw%-collapsed" id="[^"]+"',				'{| class="wikitable"'			):gsub(				"\n|}$",				"\n|} "			))			return result		end

if mc then m_ltc_pron = require("Module:ltc-pron") mc_preview = m_ltc_pron.retrieve_pron(pagename, false, mc, true) if not mc_preview then require("Module:debug/track")("zh-pron/Middle Chinese data not found") mc = nil end end if oc then m_och_pron = require("Module:och-pron") oc_preview = m_och_pron.generate_show(pagename, oc) if not oc_preview then require("Module:debug/track")("zh-pron/Old Chinese data not found") oc = nil end end if mc or oc then insert(text, '\n\n ') if mc then insert(text, shiftCustomtoggle2Vsswitcher(m_ltc_pron.ipa(mc, mc_preview))) end if oc then insert(text, shiftCustomtoggle2Vsswitcher(m_och_pron.ipa(oc, oc_preview))) end insert(text, " ") end insert(text, " ") if namespace == "" or namespace == "-" then if mc then if is_single_hanzi then if mc_preview:find("k̚$") then insert(text, "") elseif mc_preview:find("t̚$") then insert(text, "") elseif mc_preview:find("p̚$") then insert(text, "") end end end if not args["cat"] then insert(text, "") end end end

local conv_text = {} --categories if namespace == "" or namespace == "-" then local catText = args["cat"] or "" local cat_start = "[[Category:"		local cat_end = "]]" if w_rom then w_rom = gsub(w_rom, "%d", "") end local function add_cat(cat_table, name, cat) insert(cat_table, cat_start .. name .. cat .. "|" .. sortkey .. cat_end) end

local cats = split(catText, ",", true) for i = 1, #cats do			if pos_aliases_cat[cats[i]] == "chengyu" then insert(cats, i, "idioms") break end end insert(cats, 1, "lemmas") if is_single_hanzi then insert(cats, 2, "hanzi") end for i = 1, #cats do			local cat = cats[i] if cat == "" then break end cat = gsub(cat, "^ +", "") if find(cat, ":") then local cat_split = split(cat, ":", true) local lang_name = langname_abbr[cat_split[1]] local category = pos_aliases_cat[cat_split[2]] or cat add_cat(conv_text, "Chinese ", category) insert(conv_text, cat_start .. lang_name .. " " .. category .. "|" .. sortkey .. cat_end) else cat = pos_aliases_cat[cat] or cat add_cat(conv_text, "Chinese ", cat) if m_rom or m_x_rom or m_nj_rom then add_cat(conv_text, "Mandarin ", cat) end if has_var("m-s") then add_cat(conv_text, "Sichuanese ", cat) end if has_var("dg") then add_cat(conv_text, "Dungan ", cat) end if c_rom or c_dg_rom or c_yj_rom then add_cat(conv_text, "Cantonese ", cat) end if c_t_rom then add_cat(conv_text, "Taishanese ", cat) end if has_var("g") then add_cat(conv_text, "Gan ", cat) end if h_rom and (find(h_rom, "pfs=.") or find(h_rom, "gd=.")) or #h_audio > 0 then add_cat(conv_text, "Hakka ", cat) end if has_var("j") then add_cat(conv_text, "Jin ", cat) end if has_var("mb") then add_cat(conv_text, "Northern Min ", cat) end if has_var("md") then add_cat(conv_text, "Eastern Min ", cat) end if has_var("mn") then add_cat(conv_text, "Hokkien ", cat) end if has_var("mn-t") then add_cat(conv_text, "Teochew ", cat) end if has_var("mn-l") then add_cat(conv_text, "Leizhou Min ", cat) end if has_var("sp") then add_cat(conv_text, "Southern Pinghua ", cat) end if has_var("w") then add_cat(conv_text, "Wu ", cat) end if has_var("w-j") then add_cat(conv_text, "Wu ", cat) end if has_var("x") then add_cat(conv_text, "Xiang ", cat) end if has_var("x-l") then add_cat(conv_text, "Xiang ", cat) end if has_var("x-h") then add_cat(conv_text, "Xiang ", cat) end if mc and has_var("mc") then add_cat(conv_text, "Middle Chinese ", cat) end if oc and has_var("oc") then add_cat(conv_text, "Old Chinese ", cat) end end end if not args.only_cat then insert(conv_text, cat_start .. "Chinese terms with IPA pronunciation|" .. sortkey .. cat_end) end if not args.poj_form_zh_see then if not find(pagename, "[" .. hanzi .. bopomofo .. "]") then insert(conv_text, cat_start .. "Chinese terms written in foreign scripts|" .. sortkey .. cat_end) end -- TODO: handle Zhuyin and IDS. for character in gmatch(pagename, "[" .. hanzi .. "%%%+%-·々〻𖿣]") do insert(conv_text, cat_start .. "Chinese terms spelled with " .. character .. "|" .. sortkey .. cat_end) end end end

local output = concat(text) .. concat(conv_text) if namespace ~= "" and namespace ~= "-" then output = gsub(output, "%[%[Category:[^%]]+%]%]", "") end return output end

return export