Module:User:Manishearth/zh-pron

Hello, you have come here looking for the meaning of the word Module:User:Manishearth/zh-pron. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:User:Manishearth/zh-pron, but we will also tell you about its etymology, its characteristics and you will know how to say Module:User:Manishearth/zh-pron in singular and plural. Everything you need to know about the word Module:User:Manishearth/zh-pron you have here. The definition of the word Module:User:Manishearth/zh-pron will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:User:Manishearth/zh-pron, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.


local export = {}
local m_string_utils = require("Module:string utilities")

local codepoint = mw.ustring.codepoint
local find = m_string_utils.find
local gsub = m_string_utils.gsub
local len = m_string_utils.len
local match = m_string_utils.match
local u = mw.ustring.char

local langname = {
     = "Min Dong",
     = "Mandarin",
     = "Jin",
     = "Dungan",
     = "Gan",
     = "Hakka",
     = "Xiang",
     = "Min Bei",
     = "Min Nan",
     = "Wu",
     = "Cantonese",
}

local langname_abbr = {
     = "Mandarin",
     = "Sichuanese",
     = "Dungan",
     = "Cantonese",
     = "Taishanese",
     = "Gan",
     = "Hakka",
     = "Jin",
     = "Min Bei",
     = "Min Dong",
     = "Min Nan",
     = "Teochew",
     = "Wu",
     = "Xiang",
}

local pos_aliases_cat = {
     = "nouns",  = "nouns",
     = "proper nouns",  = "proper nouns",  = "proper nouns",  = "proper nouns",
     = "pronouns",  = "pronouns",
     = "verbs",  = "verbs",
     = "adjectives",  = "adjectives",  = "adjectives",
     = "adverbs",  = "adverbs",
     = "prepositions",  = "prepositions",
     = "postpositions",  = "postpositions",
     = "conjunctions",  = "conjunctions",  = "conjunctions",
     = "particles",  = "particles",
     = "prefixes",  = "prefixes",
     = "suffixes",  = "suffixes",
     = "infixes",
     = "proverbs",  = "proverbs",
     = "idioms",  = "idioms",
     = "chengyu",  = "chengyu",  = "chengyu",
     = "phrases",  = "phrases",
     = "interjections",  = "interjections",  = "interjections",
     = "classifiers",  = "classifiers",  = "classifiers",
     = "numerals",  = "numerals",
     = "abbreviations",  = "abbreviations",
     = "determiners",  = "determiners",  = "determiners",
     = "syllables",
}

-- if not empty
local function ine(val)
    if val == "" then
        return nil
    end
    return val
end

local function makeNote(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)
    return "\n<div style=\"border: 1px solid green; padding: 4px; margin: 8px; background: #F7F4ED; font-size: 85%\">'''Note''': " .. text .. ".</div>"
end

local function ipa_format(text)
    local numbers = { ="¹",="²",="³",="⁴",="⁵",="⁰",="⁻",="/, /" }
    return gsub(text,'',numbers)
end

local function Consolas(text)
    return '<span style="font-family: Consolas, monospace;">' .. text .. '</span>'
end

local function format_IPA(text)
    return '<span class="IPA">' .. text .. '</span>'
end

function export.make(frame)
    local args = frame:getParent().args
    local title = mw.title.getCurrentTitle()
    local pagename = ine(args) or title.text
    local sortkey = (require("Module:Hani-sortkey").makeSortKey(pagename))
    -- Unicode pattern for single Han character, with non-NFC characters
    -- inserted using mw.ustring.char because they can't be saved in a MediaWiki
    -- page.
    -- https://unicode.org/cldr/utility/regex.jsp?a=%5Cp%7BHani%7D
    local hanzi = "^[⺀-⺙⺛-⻳⼀-⿕々〇〡-〩〸-〻㐀-䶿一-鿼"
        .. u(0xF900) .. "-" .. u(0xFA6D)
        .. u(0xFA70) .. "-" .. u(0xFAD9)
        .. "𠀀-𪛝𪜀-𫜴𫝀-𫠝𫠠-𬺡𬺰-𮯠" .. u(0x2F800)
        .. "-" .. u(0x2FA1D) .. "𰀀-𱍊]$"
    local is_single_hanzi = find(pagename, hanzi) ~= nil
    local namespace = ine(args) or title.nsText
    local m_rom = ine(args)
    local m_s_rom = ine(args)
    local dg_rom = ine(args)
    local c_rom = ine(args)
    local c_t_rom = ine(args)
    local g_rom = ine(args)
    local h_rom = ine(args)
    local j_rom = ine(args)
    local mb_rom = ine(args)
    local md_rom = ine(args)
    local mn_rom = ine(args)
    local mn_t_rom = ine(args)
    local w_rom = ine(args)
    local x_rom = ine(args)
    local m_audio = ine(args)
    local m_audio2 = ine(args)
    local m_s_audio = ine(args)
    local dg_audio = ine(args)
    local c_audio = ine(args)
    local c_t_audio = ine(args)
    local g_audio = ine(args)
    local h_audio = ine(args)
    local j_audio = ine(args)
    local mb_audio = ine(args)
    local md_audio = ine(args)
    local mn_audio = ine(args)
    local mn_t_audio = ine(args)
    local w_audio = ine(args)
    local x_audio = ine(args)
    local dial = ine(args)
    local mc = ine(args) or false
    local oc = ine(args) or false
    local only_cat = args == "yes"
    
    local function add_audio(text, audio, lang)
        -- This function has side effects
        if audio then
            if audio == "y" then audio = string.format('%s-%s.ogg', lang, mw.title.getCurrentTitle().baseText) end
            table.insert(text, '\n*** [[File:')
            table.insert(text, audio)
            table.insert(text, ']]')
            table.insert(text, '[[Category:')
            table.insert(text, langname)
            table.insert(text, ' terms with audio links|' .. sortkey .. ']]')
        end
    end
    
    local function add_audio_show(text, audio, lang)
        -- This function has side effects
        if audio then
            if audio == "y" then audio = string.format('%s-%s.ogg', lang, mw.title.getCurrentTitle().baseText) end
            table.insert(text, '\n*:: [[File:')
            table.insert(text, audio)
            table.insert(text, ']]')
            table.insert(text, '[[Category:')
            table.insert(text, langname)
            table.insert(text, ' terms with audio links|' .. sortkey .. ']]')
        end
    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 = {'<div class="toccolours zhpron" style="max-width:500px; min-width: 20em; font-size:100%; overflow: hidden">'}
        --"textHide" is Part 2
        local textHide = {}

        table.insert(textShow, '<div class="vsSwitcher" data-toggle-category="pronunciations">\n<span class="vsToggleElement" style="float: right;"></span>')
        --Part 1 and 2, "Pronunciation" and "Pronunciation expressed in different romanizations"
        if m_rom or m_s_rom or dg_rom then
            table.insert(textShow, '\n* ]')
        end
        if m_rom or m_audio 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 = { (m_s_rom or ""), (m_s_audio or ""), (dg_rom or ""), (dg_audio or "") }
                table.insert(textShow, '\n' .. str_analysis(m_rom, 'head', table.concat(other_m_vars) ~= ""))

                m_args = str_analysis(m_rom,'')
                local m_args_names = {
                    '1n','1na','1nb','1nc','1nd','py','cap','tl','tl2','tl3','a','audio','er','ertl','ertl2','ertl3','era','eraudio',
                    '2n','2na','2nb','2nc','2nd','2py','2cap','2tl','2tl2','2tl3','2a','2audio','2er','2ertl','2ertl2','2ertl3','2era','2eraudio',
                    '3n','3na','3nb','3nc','3nd','3py','3cap','3tl','3tl2','3tl3','3a','3audio','3er','3ertl','3ertl2','3ertl3','3era','3eraudio',
                    '4n','4na','4nb','4nc','4nd','4py','4cap','4tl','4tl2','4tl3','4a','4audio','4er','4ertl','4ertl2','4ertl3','4era','4eraudio',
                    '5n','5na','5nb','5nc','5nd','5py','5cap','5tl','5tl2','5tl3','5a','5audio','5er','5ertl','5ertl2','5ertl3','5era','5eraudio',
                }
                for _, name in ipairs(m_args_names) do
                    m_args = str_analysis(m_rom, name)
                end
                for i = 2, 5 do
                    m_args = str_analysis(m_rom, tostring(i))
                end
            end
            m_args = m_audio
            m_args = m_audio2
            local debug = ""
            for code,name in pairs(m_args) do
                debug = debug .. code .. ":" .. name .. ","
            end
            table.insert(textShow, m_pron.make_audio(m_args))
            table.insert(textHide, m_pron.make_args(m_args))
            if args then table.insert(textHide, makeNote(args)) end
        end
        if m_s_rom or m_s_audio then
            local m_s_pron = require("Module:cmn-sic-pron")
            local m_s_processed = gsub(gsub(gsub(m_s_rom, '/', ' / '), '()()', '%1 %2'), '(+)', '<sup>%1</sup>')
            if m_s_rom then
                table.insert(textShow, '\n*: <small>(<i>], ]</i>)</small>: ')
                table.insert(textShow, Consolas(m_s_processed))
            end
            add_audio_show(textShow, m_s_audio, 'cmn-sic')
            if not (m_rom or m_audio) then
                table.insert(textHide, '\n* ]')
            end
            table.insert(textHide, '\n** <small>(<i>]</i>)</small>')
            table.insert(textHide, '\n*** <small><i>]</i></small>: ')
            table.insert(textHide, Consolas(m_s_processed))
            local xinwenz = m_s_pron.convert(m_s_rom, 'SWZ')
            if xinwenz then
                table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                table.insert(textHide, Consolas(m_s_pron.convert(m_s_rom, 'SWZ')))
            end
            table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup></small>: ')
            table.insert(textHide, format_IPA(m_s_pron.convert(m_s_rom, 'IPA')))
            if args then table.insert(textHide, makeNote(args)) end
        end
        if dg_rom or dg_audio then
            local dg_pron = require("Module:dng-pron")
            local dg_processed = dg_pron.process(dg_rom)
            if dg_rom then
                table.insert(textShow, '\n*: <small>(<i>], ] and ]</i>)</small>: ')
                table.insert(textShow, Consolas(dg_processed))
            end
            add_audio_show(textShow, dg_audio, 'dng')
            if not (m_rom or m_audio or m_s_rom or m_s_audio) then
                table.insert(textHide, '\n* ]')
            end
            table.insert(textHide, '\n** <small>(<i>]</i>)</small>')
            table.insert(textHide, '\n*** <small><i>] and ]</i></small>: ')
            table.insert(textHide, Consolas(dg_processed))
            table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup></small>: ')
            table.insert(textHide, format_IPA(dg_pron.convert(dg_rom, 'IPA')) .. '\n**: <small>(Note: Dungan pronunciation is currently experimental and may be inaccurate.)</small>')
            if args then table.insert(textHide, makeNote(args)) end
        end
        if c_rom or c_audio or c_t_rom or c_t_audio then
            local c_pron = require("Module:yue-pron")
            if c_rom or c_t_rom then
                table.insert(textShow, '\n* ]')
                table.insert(textHide, '\n* ]')
                if c_rom then
                    c_rom = c_rom:gsub("%*","-")
                    local c_processed = c_rom:gsub(',()',', %1')
                    if len(pagename) == 1 then
                        c_processed = c_processed:gsub('(+)',']')
                        c_processed = c_processed:gsub('%[%[%[%[','[[')
                        c_processed = c_processed:gsub('%]%]%]%]',']]')
                        c_processed = gsub(c_processed, '%]+)%]%]', function(a)
                            return '+)', '<sup>%1</sup>') .. ']]' end)
                    else
                        c_processed = gsub(c_processed, '(+)', '<sup>%1</sup>')
                    end
                    if not c_t_rom then
                        table.insert(textShow, ' <small>(<i>')
                    else
                        table.insert(textShow, '\n*: <small>(<i>]–], ')
                    end
                    table.insert(textShow, ']</i>)</small>: ' .. Consolas(c_processed))
                    add_audio_show(textShow, c_audio, 'yue')
                    c_rom = c_rom:gsub(']','')
                    local c_hom = mw.loadData("Module:yue-pron/hom")
                    local c_hom_exists = false
                    for _,c_first in ipairs(c_pron.jyutping_format(c_rom)) do
                        if c_hom then
                            c_hom_exists = c_first
                        end
                    end
                    table.insert(textHide, '\n** <small>(<i>], ]–]</i>)</small>')
                    if not c_hom_exists then
                        table.insert(textHide, '<sup><small><abbr title="Add Cantonese homophones"><span class="plainlinks">[')
                        table.insert(textHide, tostring(mw.uri.fullUrl("Module:yue-pron/hom",{="edit"})))
                        table.insert(textHide, ' +]</span></abbr></small></sup>')
                    end
                    local c_comma = gsub(c_rom,',()',', %1')
                    table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                    table.insert(textHide, Consolas(tostring(gsub(c_comma, '(+)', '<sup>%1</sup>'))))
                    table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                    table.insert(textHide, Consolas(c_pron.jyutping_to_yale(c_rom)))
                    table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                    table.insert(textHide, Consolas(tostring(gsub(c_pron.jyutping_to_cantonese_pinyin(c_rom), '(+)', '<sup>%1</sup>'))))
                    table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                    table.insert(textHide, Consolas(tostring(gsub(c_pron.jyutping_to_guangdong(c_rom), '(+)', '<sup>%1</sup>'))))
                    table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup></small>: ')
                    table.insert(textHide, format_IPA('/' .. c_pron.jyutping_to_ipa(c_rom) .. '/'))
                    for _,c_first in ipairs(c_pron.jyutping_format(c_rom)) do
                        if c_hom_exists == c_first then
                            local hom_textHide = {'\n*** <small>Homophones</small>: <table class="wikitable mw-collapsible mw-collapsed" style="width:15em;margin:0;'}
                            local hom_text = {}
                            table.insert(hom_textHide, 'position:left; text-align:center"><tr><th></th></tr><tr><td><div style="float: right; clear: right;"><sup>')
                            table.insert(hom_textHide, '<span class="plainlinks">[')
                            table.insert(hom_textHide, tostring(mw.uri.fullUrl("Module:yue-pron/hom",{="edit"})))
                            table.insert(hom_textHide, ' edit]</span></sup></div><div style="visibility:hidden; float:left"><sup><span style="color:#FFF">edit</span></sup></div>')
                            local yue = require("Module:languages").getByCode("yue")
                            for _,hom in ipairs(c_hom) do
                                table.insert(hom_text, require("Module:links").full_link( { term = hom, lang = yue, tr = "-" } ))
                            end
                            table.insert(hom_textHide, table.concat(hom_text, "<br>"))
                            table.insert(hom_textHide, '</td></tr></table>')
                            table.insert(textHide, table.concat(hom_textHide))
                            table.insert(textHide, ']')
                        end
                    end
                    if not args and c_rom and (find(c_rom, "^") or find(c_rom, ",")) and len(pagename) == 1 then
                        args = "The zero initial " .. format_IPA("/∅-/") .. " is commonly pronounced with a ''ng''-initial " .. format_IPA("/ŋ-/") .. " in some varieties of Cantonese, including Hong Kong Cantonese"
                    end
                    if args then table.insert(textHide, makeNote(args)) end
                end
                if c_t_rom then
                    local c_t_processed = c_t_rom:gsub(',()',', %1')
                    c_t_processed = gsub(c_t_processed, '(%-??)', '<sup>%1</sup>')
                    table.insert(textShow, (c_rom and '\n*:' or '') .. ' <small>(<i>], ]</i>)</small>: ')
                    table.insert(textShow, Consolas(c_t_processed))
                    add_audio_show(textShow, c_t_audio, 'yue-taishan')
                    c_t_rom = c_t_rom:gsub(']','')
                    local c_t_comma = gsub(c_t_rom,',()',', %1')
                    table.insert(textHide, '\n** <small>(<i>], ]</i>)</small>')
                    table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                    table.insert(textHide, Consolas(tostring(gsub(c_t_comma, '(%-??)', '<sup>%1</sup>'))))
                    table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup></small>: ')
                    table.insert(textHide, format_IPA(c_pron.hoisanva_to_ipa(c_t_rom)))
                    if args then table.insert(textHide, makeNote(args)) end
                end
            end
        end
        if g_rom or g_audio then
            local g_pron = require("Module:gan-pron")
            if g_rom then
                table.insert(textShow, '\n* ] <small>(<i>]</i>)</small>: ')
                table.insert(textShow, Consolas(g_pron.rom(g_rom)))
            end
            add_audio_show(textShow, g_audio, 'gan')
            table.insert(textHide, '\n* ]')
            table.insert(textHide, '\n** <small>(<i>]</i>)</small>')
            table.insert(textHide, '\n*** <small><i>]</i></small>: ')
            table.insert(textHide, Consolas(g_pron.rom(g_rom)))
            table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup></small>: ')
            table.insert(textHide, format_IPA('/' .. g_pron.ipa(g_rom) .. '/'))
            if args then table.insert(textHide, makeNote(args)) end
        end
        if h_rom and (find(h_rom, 'pfs=.') or find(h_rom, 'gd=.')) or h_audio then
            local h_pron = require("Module:hak-pron")
            if find(h_rom, "pfs=.") or find(h_rom, 'gd=.') then
                table.insert(textShow, '\n* ]')
                table.insert(textShow, h_pron.rom_display(h_rom,'yes'))
            end
            add_audio_show(textShow, h_audio, 'hak')
            table.insert(textHide, '\n* ]')
            if h_rom then table.insert(textHide, h_pron.rom_display(h_rom,'')) end
            if args then table.insert(textHide, makeNote(args)) end
        end
        if j_rom or j_audio then
            local j_pron = require("Module:cjy-pron")
            if j_rom then
                table.insert(textShow, '\n* ] <small>(<i>]</i>)</small>: ')
                table.insert(textShow, Consolas(j_pron.rom(j_rom)))
            end
            add_audio_show(textShow, j_audio, 'cjy')
            table.insert(textHide, '\n* ]')
            table.insert(textHide, '\n** <small>(<i>]</i>)<sup>]</sup></small>')
            if j_rom then
                table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                table.insert(textHide, Consolas(j_pron.rom(j_rom)))
            end
            local no_sandhi = false
            local roms = mw.text.split(j_rom, '/')
            for i = 1, table.getn(roms) do
                if find(roms, ' + ') then
                    no_sandhi = true
                    break
                end
            end
            table.insert(textHide, '\n*** <small>Sinological ] (<i>old-style' .. (no_sandhi and ', no sandhi' or '') .. '</i>)</small>: ')
            table.insert(textHide, format_IPA('/' .. j_pron.ipa(j_rom, no_sandhi and "no_sandhi" or "") .. '/'))
            if args then table.insert(textHide, makeNote(args)) end
        end
        if mb_rom or mb_audio then
            local mb_pron = require("Module:mnp-pron")
            if mb_rom then
                table.insert(textShow, '\n* ] <small>(<i>]</i>)</small>: ')
                table.insert(textShow, Consolas(mb_pron.rom(mb_rom)))
            end
            add_audio_show(textShow, mb_audio, 'mnp')
            table.insert(textHide, '\n* ]')
            table.insert(textHide, "\n** <small>(<i>]</i>)</small>")
            if mb_rom then
                table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                table.insert(textHide, Consolas(mb_pron.rom(mb_rom)))
                table.insert(textHide, "\n*** <small>Sinological ] <sup>(])</sup></small>: ")
                table.insert(textHide, format_IPA(mb_pron.ipa(mb_rom)))
            end
            if args then table.insert(textHide, makeNote(args)) end
        end
        if md_rom or md_audio then
            local md_pron = require("Module:cdo-pron")
            if md_rom then
                table.insert(textShow, '\n* ] <small>(<i>]</i>)</small>: ')
                table.insert(textShow, Consolas(md_pron.rom(md_rom)))
            end
            add_audio_show(textShow, md_audio, 'cdo')
            table.insert(textHide, '\n* ]')
            table.insert(textHide, '\n** <small>(<i>]</i>)</small>')
            if md_rom then
                table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                table.insert(textHide, Consolas(md_pron.rom(md_rom)))
                if not (md_rom and find(md_rom, '(*)-(*)-(*)-(*)-(*)')) then
                    table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup></small>: ')
                    table.insert(textHide, format_IPA('/' .. md_pron.ipa(md_rom) .. '/'))
                else
                    table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup> (<i>no sandhi</i>)</small>: ')
                    table.insert(textHide, format_IPA('/' .. md_pron.ipa(md_rom, "no_sandhi") .. '/'))
                end
            end
            if args then table.insert(textHide, makeNote(args)) end
        end
        if mn_rom or mn_audio or mn_t_rom or mn_t_audio then
            local mn_pron = require("Module:nan-pron")
            if mn_rom or mn_t_rom then
                table.insert(textShow, '\n* ]')
                if mn_rom then
                    table.insert(textShow, ( not mn_t_rom and " <small>(<i>" or "\n*: <small>(<i>], ") .. ']</i>)</small>: ')
                    table.insert(textShow, Consolas(mn_pron.poj_display(mn_pron.poj_check_invalid(mn_rom))))
                    add_audio_show(textShow, mn_audio, 'nan')
                end
                if mn_t_rom then
                    table.insert(textShow, (mn_rom and '\n*:' or '') .. ' <small>(<i>], ]</i>)</small>: ')
                    table.insert(textShow, Consolas(mn_pron.pengim_display(mn_t_rom)))
                    add_audio_show(textShow, mn_t_audio, 'nan-teochew')
                end
            end
            table.insert(textHide, '\n* ]')
            if mn_rom or mn_audio then
                table.insert(textHide, mn_pron.generate_all(mn_rom))
                if args then table.insert(textHide, makeNote(args)) end
            end
            if mn_t_rom or mn_t_audio then
                table.insert(textHide, '\n** <small>(<i>]</i>)</small>')
                table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                table.insert(textHide, Consolas(mn_pron.pengim_display(mn_t_rom)))
                table.insert(textHide, '\n*** <small><i>]-like</i></small>: ')
                table.insert(textHide,  Consolas(mn_pron.pengim_to_pojlike_conv(mn_t_rom)))
                table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup></small>: ')
                table.insert(textHide, format_IPA(mn_pron.pengim_to_ipa_conv(mn_t_rom)))
                if args then table.insert(textHide, makeNote(args)) end
            end
        end
        if w_rom or w_audio then
            local w_pron = require("Module:User:Manishearth/wuu-pron")
            if w_rom then
                table.insert(textShow, '\n* ]')
                table.insert(textShow, '\n** <small>(<i>], ]</i>)</small>: ')
                table.insert(textShow, Consolas(w_pron.rom(w_rom)))
                table.insert(textShow, '\n** <small>(<i>], ]</i>)</small>: ')
                table.insert(textShow, Consolas(w_pron.wugniu(w_rom)))
            end
            add_audio_show(textShow, w_audio, 'wuu')
            table.insert(textHide, '\n* ]')
            table.insert(textHide, '\n** <small>(<i>]</i>)</small>')
            table.insert(textHide, '\n*** <small><i>]</i></small>: ')
            table.insert(textHide, Consolas(w_pron.rom(w_rom)))
            table.insert(textHide, '\n*** <small><i>]</i></small>: ')
            table.insert(textHide, Consolas(w_pron.wugniu(w_rom)))
            table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup></small>: ')
            table.insert(textHide, format_IPA('/' .. w_pron.ipa_conv(w_rom) .. '/'))
            -- add_audio(textHide, w_audio, 'wuu')
            if args then table.insert(textHide, makeNote(args)) end
        end
        if x_rom or x_audio then
            local x_pron = require("Module:hsn-pron")
            if x_rom then
                table.insert(textShow, '\n* ] <small>(<i>]</i>)</small>: ')
                table.insert(textShow, Consolas(x_pron.rom(x_rom)))
            end
            add_audio_show(textShow, x_audio, 'hsn')
            table.insert(textHide, '\n* ]')
            table.insert(textHide, '\n** <small>(<i>]</i>)</small>')
            if x_rom then
                local x_diff = x_pron.stylediff(x_rom)
                table.insert(textHide, '\n*** <small><i>]</i></small>: ')
                table.insert(textHide, Consolas(x_pron.rom(x_rom)))
                table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup>')
                table.insert(textHide, x_diff and ' (<i>old-style</i>)' or '')
                table.insert(textHide, '</small>: ')
                table.insert(textHide, format_IPA('/' .. x_pron.ipa(x_rom) .. '/'))
                if x_diff then
                    table.insert(textHide, '\n*** <small>Sinological ] <sup>(])</sup> (<i>new-style</i>)</small>: ')
                    table.insert(textHide, format_IPA('/' .. x_pron.ipa(x_rom, 'new') .. '/'))
                end
            end
            if args then table.insert(textHide, makeNote(args)) end
        end
        -- combine textShow and textHide into text
        text = {
            table.concat(textShow),
            '\n<div class="vsHide">\n----\n',
            table.concat(textHide),
            '</div></div>'
        }
        if not c_rom then table.insert(text, "]") end

        --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, "^+$") then
                    for element in mw.text.gsplit(dial, ",") do
                        table.insert(dialPron, m_dial)
                    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) do
                        table.insert(temporary, object)
                    end
                end
                local rand = gsub("-" .. table.concat(temporary), "", codepoint('%1'))
                table.insert(text,
                    '\n----\n<div class="vsSwitcher" data-toggle-category="pronunciations" style="background-color:#FAFFFA">\n* ' ..
                    '<span style="color:#3366bb">Dialectal data</span>' ..
                    '<span class="vsToggleElement" style="float:right; padding:0 0; font-size:90%"></span>\n' ..
                    '<div class="vsHide">'
                )

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

                local locStart = '\n|-\n!'
                local readingStart = table.concat({'\n!style="background:#E8ECFA; width:9em"|',
                '<div style="float: right; clear: right; font-size:60%"><span class="plainlinks">="edit"})), ' edit]</span></div><span lang="zh" class="Hani">'})
                local locEnd = '<span class="IPA">'
                local headclr = 'style="background:#E8ECFA"|'
                local mclr = 'style="background:#FAF5F0"|'
                local jclr = 'style="background:#F0F5FA"|'
                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, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({mclr, "]\n|", mclr}),
                    table.concat({"rowspan=3 ", jclr, "Jin\n!", jclr, "]\n|", jclr}),
                    table.concat({jclr, "]\n|", jclr}),
                    table.concat({jclr, "]\n|", jclr}),
                    table.concat({"rowspan=4 ", wclr, "Wu\n!", wclr, "]\n|", wclr}),
                    table.concat({wclr, "]\n|", wclr}),
                    table.concat({wclr, "]\n|" , wclr}),
                    table.concat({wclr, "]\n|", wclr}),
                    table.concat({"rowspan=2 ", huclr, "Hui\n!", huclr, "]\n|", huclr}),
                    table.concat({huclr, "]\n|", huclr}),
                    table.concat({"rowspan=2 ", xclr, "Xiang\n!", xclr, "]\n|", xclr}),
                    table.concat({xclr, "]\n|", xclr}),
                    table.concat({gclr, "Gan\n!", gclr, "]\n|", gclr}),
                    table.concat({"rowspan=2 ", haclr, "Hakka\n!", haclr, "]\n|", haclr}),
                    table.concat({haclr, "]\n|", haclr}),
                    table.concat({"rowspan=3 ", cclr, "Cantonese\n!", cclr, "]\n|", cclr}),
                    table.concat({cclr, "]\n|", cclr}),
                    table.concat({cclr, "]\n|", cclr}),
                    table.concat({"rowspan=5 ", minclr, "Min\n!", minclr, "] (Min Nan)\n|", minclr}),
                    table.concat({minclr, "] (Min Dong)\n|", minclr}),
                    table.concat({minclr, "] (Min Bei)\n|", minclr}),
                    table.concat({minclr, "] (Min Nan)\n|", minclr}),
                    table.concat({minclr, "] (Min Nan)\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 mw.text.gsplit(text, "|") do
                        local ipa = match(pronunciation, "^+")
                        ipa = gsub(ipa, "()()", "%1̚%2")
                        local environ = match(pronunciation, "*$") or false
                        table.insert(fmttedPron, "<span class=\"IPA\"><small>/" ..
                            tostring(ipa_format(ipa_correct(ipa, location))) .. "/</small></span>" .. (environ
                            and " <span class=\"Hani\" lang=\"zh\"><small>"..environ.."</small></span>" or nil))
                    end
                    return table.concat(fmttedPron, "<br>")
                end

                for locationNo = 1, 40 do
                    for readingNo = 1, #dialPron do
                        if readingNo == 1 then
                            table.insert(text, locStart)
                            table.insert(text, locList)
                        end
                        if locationNo == 1 then
                            local situation = dialPron
                            table.insert(text, readingStart)
                            table.insert(text, pagename)
                            table.insert(text, (pagename ~= situation and " (" ..
                                gsub(situation, pagename, "<b>" .. pagename .. "</b>") .. ")" or ""))
                            table.insert(text, "</span>")
                        else
                            table.insert(text, (readingNo == 1 and "" or "\n|" .. clrList))
                            table.insert(text, locEnd)
                            table.insert(text, fmtDial(dialPron, locationNo))
                            table.insert(text, "</span>")
                        end
                    end
                end
                table.insert(text, "\n|}</div></div>")
            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%* <div title="expand" class="mw%-customtoggle+">',
                '\n<div class="vsSwitcher" data-toggle-category="pronunciations">\n* '
            ):gsub(
                '<span style="float:right; border:1px solid #ccc; border%-radius:1px; padding:0 0; font%-size:90%%">▼</span>(.-)</div>\n{| class="wikitable',
                '<span class="vsToggleElement" style="float:right; padding:0 0; font-size:90%%"></span>%1\n<div class="vsHide">\n{| class="wikitable'
            ):gsub(
                '{| class="wikitable mw%-collapsible mw%-collapsed" id="+"',
                '{| class="wikitable"'
            ):gsub(
                '\n|}$',
                '\n|}</div></div>'
            ))
            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 = false
            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 = false
            end
        end
        if mc or oc then
            table.insert(text, '\n----\n<div style="background-color:#f7fbff">')
            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, "</div>")
        end
        table.insert(text, "</div>")
        if 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 ine(args) then
                table.insert(text, ']')
            end
        end
    end

    local conv_text = {} --categories
    if namespace == "" then
        local catText = args 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 = mw.text.split(catText, ',', true)
        if pos_aliases_cat] == 'chengyu' then
            table.insert(cats, 2, 'idioms')
        end
        table.insert(cats, 1, "lemmas")
        for i = 1, #cats do
            local cat = cats
            if cat == "" then break end
            cat = gsub(cat, '^ +', '')
            if find(cat, ':') then
                local cat_split = mw.text.split(cat, ':', true)
                local lang_name = langname_abbr]
                local category = pos_aliases_cat] 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 or cat
                add_cat(conv_text, 'Chinese ', cat)
                if m_rom then add_cat(conv_text, 'Mandarin ', cat) end
                if m_s_rom or m_s_audio then add_cat(conv_text, 'Mandarin ', cat) end
                if dg_rom or dg_audio then add_cat(conv_text, 'Dungan ', cat) end
                if c_rom then add_cat(conv_text, 'Cantonese ', cat) end
                if c_t_rom then add_cat(conv_text, 'Taishanese ', cat) end
                if g_rom or g_audio then add_cat(conv_text, 'Gan ', cat) end
                if h_rom and (find(h_rom, 'pfs=.') or find(h_rom, 'gd=.')) or h_audio then
                    add_cat(conv_text, 'Hakka ', cat)
                end
                if j_rom or j_audio then add_cat(conv_text, 'Jin ', cat) end
                if mb_rom or mb_audio then add_cat(conv_text, 'Min Bei ', cat) end
                if md_rom or md_audio then add_cat(conv_text, 'Min Dong ', cat) end
                if mn_rom or mn_audio then add_cat(conv_text, 'Min Nan ', cat) end
                if mn_t_rom or mn_t_audio then add_cat(conv_text, 'Teochew ', cat) end
                if w_rom or w_audio then add_cat(conv_text, 'Wu ', cat) end
                if x_rom or x_audio then add_cat(conv_text, 'Xiang ', cat) end
            end
        end
        if m_s_rom or m_s_audio then add_cat(conv_text, 'Sichuanese Mandarin', '') 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 hanzi|' .. sortkey .. cat_end)
        end
    end

    local output = table.concat(text) .. table.concat(conv_text)
    if namespace ~= '' then
        output = gsub(output, "%]+%]%]", "")
    end
    return output
end

return export