Module:zh-pron/sandbox

local export = {}

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

local codepoint = m_str_utils.codepoint local find = m_str_utils.find local gsub = m_str_utils.gsub local len = m_str_utils.len local match = m_str_utils.match local rsplit = m_str_utils.split local rgsplit = m_str_utils.gsplit

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-nn"] = "Cantonese", ["c-t"] = "Taishanese", ["c-kp"] = "Cantonese", ["c-yj"] = "Cantonese", ["c-yl"] = "Cantonese", ["g"] = "Gan", ["h"] = "Hakka", ["j"] = "Jin", ["mb"] = "Northern Min", ["md"] = "Eastern Min", ["mn"] = "Hokkien", ["mn-t"] = "Teochew", ["mn-l"] = "Leizhou Min", ["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"] = "four-character idioms", ["cy"] = "four-character idioms", ["chengyu"] = "four-character idioms", ["4ci"] = "four-character idioms", ["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"}, no_foreign_script_cat = {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 title.text 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_nn_rom = args["c-nn"] local c_t_rom = args["c-t"] local c_kp_rom = args["c-kp"] local c_yj_rom = args["c-yj"] local c_yl_rom = args["c-yl"] 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_nn_audio = args["c-nna"] local c_t_audio = args["c-ta"] local c_kp_audio = args["c-kpa"] local c_yj_audio = args["c-yja"] local c_yl_audio = args["c-yla"] 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 = string.format("%s-%s.ogg", lang, mw.title.getCurrentTitle.baseText) end table.insert(text, "\n*" .. (show and "::" or "**") .. " [[File:")			table.insert(text, audio)			table.insert(text, "]]") end if #audios > 0 then table.insert(text, "[[Category:")			table.insert(text, langname[lang])			table.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) table.insert(textShow, txt) end local function hide(txt) table.insert(textHide, txt) end local function hide_note(var) local note = args[var .. "_note"] if note then hide(make_note(note)) end end

show(' \n ') --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("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 has_var("m") and (has_var("m-s") or has_var("m-x") or has_var("m-nj") or has_var("dg")) 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(gsub(gsub(m_s_rom, "/", " / "), "([%d-])([%a])", "%1 %2"), "([%d-]+)", "%1") 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-nn") or has_var("c-t") or has_var("c-kp") or has_var("c-yj") or has_var("c-yl") then if c_rom or c_dg_rom or c_nn_rom or c_t_rom or c_kp_rom or c_yj_rom or c_yl_rom then local c_count = (c_rom and 1 or 0) + (c_dg_rom and 1 or 0) + (c_nn_rom and 1 or 0) + (c_t_rom and 1 or 0) + (c_kp_rom and 1 or 0) + (c_yj_rom and 1 or 0) + (c_yl_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?","%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_nn_rom then local c_nn_pron = require("Module:yue-pron/Nanning") local c_nn_display = c_nn_rom:gsub(","," / ") :gsub("%d","%0") show(c_sep .. " (Nanning, Jyutping++) : ") show(Consolas(c_nn_display)) add_audio_show(textShow, c_nn_audio, "yue") hide("\n** (Nanning, Nanning) ") hide("\n*** Jyutping++ : ") hide(Consolas(c_nn_display)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(c_nn_pron.jpp_to_ipa(c_nn_rom))) hide_note("c-nn") end if c_t_rom then local c_t_pron = require("Module:yue-pron/Taishanese") local c_t_display = c_t_rom:gsub(","," / ") :gsub("[1-5%*%-]+","%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_kp_rom then local c_kp_pron = require("Module:yue-pron/Kaiping") local c_kp_display = c_kp_rom:gsub(","," / ") :gsub("%d%-?[25]?%*?","%0") show(c_sep .. " (Kaiping, Jyutping++) : ") show(Consolas(c_kp_display)) add_audio_show(textShow, c_kp_audio, "yue") hide("\n** (Kaiping, Chikan) ") hide("\n*** Jyutping++ : ") hide(Consolas(c_kp_display)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(c_kp_pron.jpp_to_ipa(c_kp_rom))) hide_note("c-kp") end if c_yj_rom then local c_yj_pron = require("Module:yue-pron/Yangjiang") local c_yj_display = c_yj_rom:gsub(","," / ") :gsub("[12346]","%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 if c_yl_rom then local c_yl_pron = require("Module:yue-pron/Yulin") local c_yl_display = c_yl_rom:gsub(","," / ") :gsub("[1-6]%*?","%0") show(c_sep .. " (Yulin, Jyutping++) : ") show(Consolas(c_yl_display)) add_audio_show(textShow, c_yl_audio, "yue") hide("\n** (Yulin Yue, Yuzhou) ") hide("\n*** Jyutping++ : ") hide(Consolas(c_yl_display)) hide("\n*** Sinological IPA (key) : ") hide(format_IPA(c_yl_pron.jpp_to_ipa(c_yl_rom))) hide_note("c-yl") 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 = rsplit(j_rom, "/") for i = 1, table.getn(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("([1-6])", "%1") 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_show, w_hide, w_j_show, w_j_hide if w_rom then w_show, w_hide = require("Module:wuu-pron/sandbox").make(w_rom) end if w_j_rom then w_j_show, w_j_hide = require("Module:wuu-pron/Jinhua").make(w_j_rom) end show("\n* Wu (Wugniu) ") 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 if has_var("x") then x_pron = require("Module:hsn-pron") end if has_var("x-l") then x_l_pron = require("Module:hsn-pron-Loudi") end if has_var("x-h") then x_h_pron = require("Module:hsn-pron-Hengyang") end 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 = { table.concat(textShow), '\n \n\n', table.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 rgsplit(dial, ",") do						table.insert(dialPron, m_dial[tonumber(element)]) end else for _, element in ipairs(m_dial) do						table.insert(dialPron, element) end end for _, set in ipairs(dialPron) do					for _, object in ipairs(set[2]) do						table.insert(temporary, object) end end local rand = gsub("-" .. table.concat(temporary), "[^A-Za-z0-9]", codepoint("%1")) table.insert(text,                   '\n\n \n* ' ..                    ' Dialectal data ' ..					' \n' ..                    ' '                )

table.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 = table.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 = { table.concat({headclr, "Variety\n!", headclr, "Location"}), table.concat({"rowspan=17 ", mclr, "Mandarin\n!", mclr, "Beijing\n|", mclr}), table.concat({mclr, "Harbin\n|", mclr}), table.concat({mclr, "Tianjin\n|", mclr}), table.concat({mclr, "Jinan\n|", mclr}), table.concat({mclr, "Qingdao\n|", mclr}), table.concat({mclr, "Zhengzhou\n|", mclr}), table.concat({mclr, "Xi'an\n|", mclr}), table.concat({mclr, "Xining\n|", mclr}), table.concat({mclr, "Yinchuan\n|", mclr}), table.concat({mclr, "Lanzhou\n|", mclr}), table.concat({mclr, "Ürümqi\n|", mclr}), table.concat({mclr, "Wuhan\n|", mclr}), table.concat({mclr, "Chengdu\n|", mclr}), table.concat({mclr, "Guiyang\n|", mclr}), table.concat({mclr, "Kunming\n|", mclr}), table.concat({mclr, "Nanjing\n|", mclr}), table.concat({mclr, "Hefei\n|", mclr}), table.concat({"rowspan=3 ", jclr, "Jin\n!", jclr, "Taiyuan\n|", jclr}), table.concat({jclr, "Pingyao\n|", jclr}), table.concat({jclr, "Hohhot\n|", jclr}), table.concat({"rowspan=4 ", wclr, "Wu\n!", wclr, "Shanghai\n|", wclr}), table.concat({wclr, "Suzhou\n|", wclr}), table.concat({wclr, "Hangzhou\n|", wclr}), table.concat({wclr, "Wenzhou\n|", wclr}), table.concat({"rowspan=2 ", huclr, "Hui\n!", huclr, "Shexian\n|", huclr}), table.concat({huclr, "Tunxi\n|", huclr}), table.concat({"rowspan=2 ", xclr, "Xiang\n!", xclr, "Changsha\n|", xclr}), table.concat({xclr, "Xiangtan\n|", xclr}), table.concat({gclr, "Gan\n!", gclr, "Nanchang\n|", gclr}), table.concat({"rowspan=2 ", haclr, "Hakka\n!", haclr, "Meixian\n|", haclr}), table.concat({haclr, "Taoyuan\n|", haclr}), table.concat({"rowspan=3 ", cclr, "Cantonese\n!", cclr, "Guangzhou\n|", cclr}), table.concat({cclr, "Nanning\n|", cclr}), table.concat({cclr, "Hong Kong\n|", cclr}), table.concat({"rowspan=5 ", minclr, "Min\n!", minclr, "Xiamen (Hokkien)\n|", minclr}), table.concat({minclr, "Fuzhou (Eastern Min)\n|", minclr}), table.concat({minclr, "Jian'ou (Northern Min)\n|", minclr}), table.concat({minclr, "Shantou (Teochew)\n|", minclr}), table.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 rgsplit(text, "|") do						local ipa = match(pronunciation, "^[^%(%)一-龯㐀-䶵～,]+") ipa = gsub(ipa, "([ptk])([0-5])", "%1̚%2") local environ = match(pronunciation, "[%(%)一-龯㐀-䶵～,]*$") or false table.insert(fmttedPron, " /" ..							tostring(ipa_format(ipa_correct(ipa, location))) .. "/ " .. (environ and "  "..environ.." " or nil)) end return table.concat(fmttedPron, " ") end

for locationNo = 1, 40 do					for readingNo = 1, #dialPron do						if readingNo == 1 then table.insert(text, locStart) table.insert(text, locList[locationNo]) end if locationNo == 1 then local situation = dialPron[readingNo][1] table.insert(text, readingStart) table.insert(text, pagename) table.insert(text, (pagename ~= situation and " (" ..								gsub(situation, pagename, "'''" .. pagename .. "'''") .. ")" or "")) table.insert(text, " ") else table.insert(text, (readingNo == 1 and "" or "\n|" .. clrList[locationNo-1])) table.insert(text, locEnd) table.insert(text, fmtDial(dialPron[readingNo][2][locationNo-1], locationNo)) table.insert(text, " ") end end end table.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 table.insert(text, '\n\n ') if mc then table.insert(text, shiftCustomtoggle2Vsswitcher(m_ltc_pron.ipa(mc, mc_preview))) end if oc then table.insert(text, shiftCustomtoggle2Vsswitcher(m_och_pron.ipa(oc, oc_preview))) end table.insert(text, " ") end table.insert(text, " ") if namespace == "" or namespace == "-" then if mc then table.insert(text, "") if is_single_hanzi then if mc_preview:find("k̚$") then table.insert(text, "") elseif mc_preview:find("t̚$") then table.insert(text, "") elseif mc_preview:find("p̚$") then table.insert(text, "") end end end if oc then table.insert(text, "") end if not args["cat"] then table.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) table.insert(cat_table, cat_start .. name .. cat .. "|" .. sortkey .. cat_end) end

local cats = rsplit(catText, ",", true) if pos_aliases_cat[cats[1]] == "four-character idioms" then table.insert(cats, 2, "idioms") end table.insert(cats, 1, "lemmas") for i = 1, #cats do			local cat = cats[i] if cat == "" then break end cat = gsub(cat, "^ +", "") if find(cat, ":") then local cat_split = rsplit(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) table.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_nn_rom or c_kp_rom or c_yj_rom or c_yl_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 end end table.insert(conv_text, cat_start .. "Chinese terms with IPA pronunciation|" .. sortkey .. cat_end) if is_single_hanzi then table.insert(conv_text, cat_start .. "Chinese Han characters|" .. sortkey .. cat_end) end if not find(pagename, hanzi) and not find(pagename, bopomofo) and not args.no_foreign_script_cat then table.insert(conv_text, cat_start .. "Chinese terms written in foreign scripts|" .. sortkey .. cat_end) end end

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

return export