<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3AZyPy%2Fsandbox</id>
	<title>Module:ZyPy/sandbox - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3AZyPy%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:ZyPy/sandbox&amp;action=history"/>
	<updated>2026-06-30T03:30:47Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Module:ZyPy/sandbox&amp;diff=4832503&amp;oldid=prev</id>
		<title>imported&gt;TransportationMEE 来自 2026年3月20日 (五) 14:04</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:ZyPy/sandbox&amp;diff=4832503&amp;oldid=prev"/>
		<updated>2026-03-20T14:04:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
-- ==============================================&lt;br /&gt;
-- 核心辅助工具函数（修复多音节、空格、连写兼容）&lt;br /&gt;
-- ==============================================&lt;br /&gt;
&lt;br /&gt;
-- 去除首尾空格、合并多个空格、兼容全角空格&lt;br /&gt;
local function trim(s)&lt;br /&gt;
    if not s then return &amp;#039;&amp;#039; end&lt;br /&gt;
    s = s:gsub(&amp;#039;　&amp;#039;, &amp;#039; &amp;#039;) -- 全角空格转半角&lt;br /&gt;
    return s:gsub(&amp;#039;^%s+&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039;%s+$&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039;%s+&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 拆分连写带声调拼音为单个音节（如nǐhǎo → {&amp;#039;nǐ&amp;#039;, &amp;#039;hǎo&amp;#039;}）&lt;br /&gt;
local function splitPinyinSyllables(pinyinStr)&lt;br /&gt;
    pinyinStr = trim(pinyinStr)&lt;br /&gt;
    -- 已有空格直接拆分&lt;br /&gt;
    if pinyinStr:find(&amp;#039;%s&amp;#039;) then&lt;br /&gt;
        local t = {}&lt;br /&gt;
        for s in string.gmatch(pinyinStr, &amp;#039;%S+&amp;#039;) do&lt;br /&gt;
            table.insert(t, s)&lt;br /&gt;
        end&lt;br /&gt;
        return t&lt;br /&gt;
    end&lt;br /&gt;
    -- 无空格连写，按带声调元音拆分音节边界&lt;br /&gt;
    local syllables = {}&lt;br /&gt;
    local toneVowelPattern = &amp;#039;[āáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜ]&amp;#039;&lt;br /&gt;
    local start = 1&lt;br /&gt;
    local len = #pinyinStr&lt;br /&gt;
    for i = 1, len do&lt;br /&gt;
        local c = pinyinStr:sub(i, i)&lt;br /&gt;
        if i &amp;gt; start and c:match(toneVowelPattern) then&lt;br /&gt;
            local prevChar = pinyinStr:sub(i-1, i-1)&lt;br /&gt;
            -- 前一个字符非元音，判定为新音节起点&lt;br /&gt;
            if not prevChar:match(&amp;#039;[a-zA-Zāáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜ]&amp;#039;) then&lt;br /&gt;
                table.insert(syllables, pinyinStr:sub(start, i-1))&lt;br /&gt;
                start = i&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if start &amp;lt;= len then&lt;br /&gt;
        table.insert(syllables, pinyinStr:sub(start, len))&lt;br /&gt;
    end&lt;br /&gt;
    return syllables&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================================&lt;br /&gt;
-- 拼音 ↔ 注音 映射表&lt;br /&gt;
-- ==============================================&lt;br /&gt;
&lt;br /&gt;
-- 拼音声母 → 注音&lt;br /&gt;
local pinyinInitialToZhuyin = {&lt;br /&gt;
    [&amp;#039;b&amp;#039;] = &amp;#039;ㄅ&amp;#039;, [&amp;#039;p&amp;#039;] = &amp;#039;ㄆ&amp;#039;, [&amp;#039;m&amp;#039;] = &amp;#039;ㄇ&amp;#039;, [&amp;#039;f&amp;#039;] = &amp;#039;ㄈ&amp;#039;,&lt;br /&gt;
    [&amp;#039;d&amp;#039;] = &amp;#039;ㄉ&amp;#039;, [&amp;#039;t&amp;#039;] = &amp;#039;ㄊ&amp;#039;, [&amp;#039;n&amp;#039;] = &amp;#039;ㄋ&amp;#039;, [&amp;#039;l&amp;#039;] = &amp;#039;ㄌ&amp;#039;,&lt;br /&gt;
    [&amp;#039;g&amp;#039;] = &amp;#039;ㄍ&amp;#039;, [&amp;#039;k&amp;#039;] = &amp;#039;ㄎ&amp;#039;, [&amp;#039;h&amp;#039;] = &amp;#039;ㄏ&amp;#039;,&lt;br /&gt;
    [&amp;#039;j&amp;#039;] = &amp;#039;ㄐ&amp;#039;, [&amp;#039;q&amp;#039;] = &amp;#039;ㄑ&amp;#039;, [&amp;#039;x&amp;#039;] = &amp;#039;ㄒ&amp;#039;,&lt;br /&gt;
    [&amp;#039;zh&amp;#039;] = &amp;#039;ㄓ&amp;#039;, [&amp;#039;ch&amp;#039;] = &amp;#039;ㄔ&amp;#039;, [&amp;#039;sh&amp;#039;] = &amp;#039;ㄕ&amp;#039;, [&amp;#039;r&amp;#039;] = &amp;#039;ㄖ&amp;#039;,&lt;br /&gt;
    [&amp;#039;z&amp;#039;] = &amp;#039;ㄗ&amp;#039;, [&amp;#039;c&amp;#039;] = &amp;#039;ㄘ&amp;#039;, [&amp;#039;s&amp;#039;] = &amp;#039;ㄙ&amp;#039;,&lt;br /&gt;
    [&amp;#039;y&amp;#039;] = &amp;#039;ㄧ&amp;#039;, [&amp;#039;w&amp;#039;] = &amp;#039;ㄨ&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- 拼音韵母 → 注音&lt;br /&gt;
local pinyinFinalToZhuyin = {&lt;br /&gt;
    [&amp;#039;a&amp;#039;] = &amp;#039;ㄚ&amp;#039;, [&amp;#039;o&amp;#039;] = &amp;#039;ㄛ&amp;#039;, [&amp;#039;e&amp;#039;] = &amp;#039;ㄜ&amp;#039;, [&amp;#039;ê&amp;#039;] = &amp;#039;ㄝ&amp;#039;,&lt;br /&gt;
    [&amp;#039;i&amp;#039;] = &amp;#039;ㄧ&amp;#039;, [&amp;#039;u&amp;#039;] = &amp;#039;ㄨ&amp;#039;, [&amp;#039;ü&amp;#039;] = &amp;#039;ㄩ&amp;#039;,&lt;br /&gt;
    [&amp;#039;ai&amp;#039;] = &amp;#039;ㄞ&amp;#039;, [&amp;#039;ei&amp;#039;] = &amp;#039;ㄟ&amp;#039;, [&amp;#039;ao&amp;#039;] = &amp;#039;ㄠ&amp;#039;, [&amp;#039;ou&amp;#039;] = &amp;#039;ㄡ&amp;#039;,&lt;br /&gt;
    [&amp;#039;an&amp;#039;] = &amp;#039;ㄢ&amp;#039;, [&amp;#039;en&amp;#039;] = &amp;#039;ㄣ&amp;#039;, [&amp;#039;ang&amp;#039;] = &amp;#039;ㄤ&amp;#039;, [&amp;#039;eng&amp;#039;] = &amp;#039;ㄥ&amp;#039;, [&amp;#039;er&amp;#039;] = &amp;#039;ㄦ&amp;#039;,&lt;br /&gt;
    [&amp;#039;ia&amp;#039;] = &amp;#039;ㄧㄚ&amp;#039;, [&amp;#039;ie&amp;#039;] = &amp;#039;ㄧㄝ&amp;#039;, [&amp;#039;iao&amp;#039;] = &amp;#039;ㄧㄠ&amp;#039;, [&amp;#039;iu&amp;#039;] = &amp;#039;ㄧㄡ&amp;#039;, [&amp;#039;iou&amp;#039;] = &amp;#039;ㄧㄡ&amp;#039;,&lt;br /&gt;
    [&amp;#039;ian&amp;#039;] = &amp;#039;ㄧㄢ&amp;#039;, [&amp;#039;in&amp;#039;] = &amp;#039;ㄧㄣ&amp;#039;, [&amp;#039;iang&amp;#039;] = &amp;#039;ㄧㄤ&amp;#039;, [&amp;#039;ing&amp;#039;] = &amp;#039;ㄧㄥ&amp;#039;,&lt;br /&gt;
    [&amp;#039;ua&amp;#039;] = &amp;#039;ㄨㄚ&amp;#039;, [&amp;#039;uo&amp;#039;] = &amp;#039;ㄨㄛ&amp;#039;, [&amp;#039;uai&amp;#039;] = &amp;#039;ㄨㄞ&amp;#039;, [&amp;#039;ui&amp;#039;] = &amp;#039;ㄨㄟ&amp;#039;, [&amp;#039;uei&amp;#039;] = &amp;#039;ㄨㄟ&amp;#039;,&lt;br /&gt;
    [&amp;#039;uan&amp;#039;] = &amp;#039;ㄨㄢ&amp;#039;, [&amp;#039;un&amp;#039;] = &amp;#039;ㄨㄣ&amp;#039;, [&amp;#039;uen&amp;#039;] = &amp;#039;ㄨㄣ&amp;#039;, [&amp;#039;uang&amp;#039;] = &amp;#039;ㄨㄤ&amp;#039;, [&amp;#039;ueng&amp;#039;] = &amp;#039;ㄨㄥ&amp;#039;,&lt;br /&gt;
    [&amp;#039;üe&amp;#039;] = &amp;#039;ㄩㄝ&amp;#039;, [&amp;#039;üan&amp;#039;] = &amp;#039;ㄩㄢ&amp;#039;, [&amp;#039;ün&amp;#039;] = &amp;#039;ㄩㄣ&amp;#039;,&lt;br /&gt;
    [&amp;#039;iong&amp;#039;] = &amp;#039;ㄩㄥ&amp;#039;, [&amp;#039;ong&amp;#039;] = &amp;#039;ㄨㄥ&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- 注音声母 → 拼音&lt;br /&gt;
local zhuyinInitialToPinyin = {&lt;br /&gt;
    [&amp;#039;ㄅ&amp;#039;] = &amp;#039;b&amp;#039;, [&amp;#039;ㄆ&amp;#039;] = &amp;#039;p&amp;#039;, [&amp;#039;ㄇ&amp;#039;] = &amp;#039;m&amp;#039;, [&amp;#039;ㄈ&amp;#039;] = &amp;#039;f&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄉ&amp;#039;] = &amp;#039;d&amp;#039;, [&amp;#039;ㄊ&amp;#039;] = &amp;#039;t&amp;#039;, [&amp;#039;ㄋ&amp;#039;] = &amp;#039;n&amp;#039;, [&amp;#039;ㄌ&amp;#039;] = &amp;#039;l&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄍ&amp;#039;] = &amp;#039;g&amp;#039;, [&amp;#039;ㄎ&amp;#039;] = &amp;#039;k&amp;#039;, [&amp;#039;ㄏ&amp;#039;] = &amp;#039;h&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄐ&amp;#039;] = &amp;#039;j&amp;#039;, [&amp;#039;ㄑ&amp;#039;] = &amp;#039;q&amp;#039;, [&amp;#039;ㄒ&amp;#039;] = &amp;#039;x&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄓ&amp;#039;] = &amp;#039;zh&amp;#039;, [&amp;#039;ㄔ&amp;#039;] = &amp;#039;ch&amp;#039;, [&amp;#039;ㄕ&amp;#039;] = &amp;#039;sh&amp;#039;, [&amp;#039;ㄖ&amp;#039;] = &amp;#039;r&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄗ&amp;#039;] = &amp;#039;z&amp;#039;, [&amp;#039;ㄘ&amp;#039;] = &amp;#039;c&amp;#039;, [&amp;#039;ㄙ&amp;#039;] = &amp;#039;s&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄧ&amp;#039;] = &amp;#039;y&amp;#039;, [&amp;#039;ㄨ&amp;#039;] = &amp;#039;w&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- 注音韵母 → 拼音&lt;br /&gt;
local zhuyinFinalToPinyin = {&lt;br /&gt;
    [&amp;#039;ㄚ&amp;#039;] = &amp;#039;a&amp;#039;, [&amp;#039;ㄛ&amp;#039;] = &amp;#039;o&amp;#039;, [&amp;#039;ㄜ&amp;#039;] = &amp;#039;e&amp;#039;, [&amp;#039;ㄝ&amp;#039;] = &amp;#039;ê&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄧ&amp;#039;] = &amp;#039;i&amp;#039;, [&amp;#039;ㄨ&amp;#039;] = &amp;#039;u&amp;#039;, [&amp;#039;ㄩ&amp;#039;] = &amp;#039;ü&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄞ&amp;#039;] = &amp;#039;ai&amp;#039;, [&amp;#039;ㄟ&amp;#039;] = &amp;#039;ei&amp;#039;, [&amp;#039;ㄠ&amp;#039;] = &amp;#039;ao&amp;#039;, [&amp;#039;ㄡ&amp;#039;] = &amp;#039;ou&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄢ&amp;#039;] = &amp;#039;an&amp;#039;, [&amp;#039;ㄣ&amp;#039;] = &amp;#039;en&amp;#039;, [&amp;#039;ㄤ&amp;#039;] = &amp;#039;ang&amp;#039;, [&amp;#039;ㄥ&amp;#039;] = &amp;#039;eng&amp;#039;, [&amp;#039;ㄦ&amp;#039;] = &amp;#039;er&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄧㄚ&amp;#039;] = &amp;#039;ia&amp;#039;, [&amp;#039;ㄧㄝ&amp;#039;] = &amp;#039;ie&amp;#039;, [&amp;#039;ㄧㄠ&amp;#039;] = &amp;#039;iao&amp;#039;, [&amp;#039;ㄧㄡ&amp;#039;] = &amp;#039;iu&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄧㄢ&amp;#039;] = &amp;#039;ian&amp;#039;, [&amp;#039;ㄧㄣ&amp;#039;] = &amp;#039;in&amp;#039;, [&amp;#039;ㄧㄤ&amp;#039;] = &amp;#039;iang&amp;#039;, [&amp;#039;ㄧㄥ&amp;#039;] = &amp;#039;ing&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄨㄚ&amp;#039;] = &amp;#039;ua&amp;#039;, [&amp;#039;ㄨㄛ&amp;#039;] = &amp;#039;uo&amp;#039;, [&amp;#039;ㄨㄞ&amp;#039;] = &amp;#039;uai&amp;#039;, [&amp;#039;ㄨㄟ&amp;#039;] = &amp;#039;ui&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄨㄢ&amp;#039;] = &amp;#039;uan&amp;#039;, [&amp;#039;ㄨㄣ&amp;#039;] = &amp;#039;un&amp;#039;, [&amp;#039;ㄨㄤ&amp;#039;] = &amp;#039;uang&amp;#039;, [&amp;#039;ㄨㄥ&amp;#039;] = &amp;#039;ueng&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄩㄝ&amp;#039;] = &amp;#039;üe&amp;#039;, [&amp;#039;ㄩㄢ&amp;#039;] = &amp;#039;üan&amp;#039;, [&amp;#039;ㄩㄣ&amp;#039;] = &amp;#039;ün&amp;#039;,&lt;br /&gt;
    [&amp;#039;ㄩㄥ&amp;#039;] = &amp;#039;iong&amp;#039;, [&amp;#039;ㄨㄥ&amp;#039;] = &amp;#039;ong&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- 带声调元音 → 元音+数字声调&lt;br /&gt;
local vowelToneMap = {&lt;br /&gt;
    [&amp;#039;ā&amp;#039;] = {&amp;#039;a&amp;#039;, &amp;#039;1&amp;#039;}, [&amp;#039;á&amp;#039;] = {&amp;#039;a&amp;#039;, &amp;#039;2&amp;#039;}, [&amp;#039;ǎ&amp;#039;] = {&amp;#039;a&amp;#039;, &amp;#039;3&amp;#039;}, [&amp;#039;à&amp;#039;] = {&amp;#039;a&amp;#039;, &amp;#039;4&amp;#039;},&lt;br /&gt;
    [&amp;#039;ō&amp;#039;] = {&amp;#039;o&amp;#039;, &amp;#039;1&amp;#039;}, [&amp;#039;ó&amp;#039;] = {&amp;#039;o&amp;#039;, &amp;#039;2&amp;#039;}, [&amp;#039;ǒ&amp;#039;] = {&amp;#039;o&amp;#039;, &amp;#039;3&amp;#039;}, [&amp;#039;ò&amp;#039;] = {&amp;#039;o&amp;#039;, &amp;#039;4&amp;#039;},&lt;br /&gt;
    [&amp;#039;ē&amp;#039;] = {&amp;#039;e&amp;#039;, &amp;#039;1&amp;#039;}, [&amp;#039;é&amp;#039;] = {&amp;#039;e&amp;#039;, &amp;#039;2&amp;#039;}, [&amp;#039;ě&amp;#039;] = {&amp;#039;e&amp;#039;, &amp;#039;3&amp;#039;}, [&amp;#039;è&amp;#039;] = {&amp;#039;e&amp;#039;, &amp;#039;4&amp;#039;},&lt;br /&gt;
    [&amp;#039;ī&amp;#039;] = {&amp;#039;i&amp;#039;, &amp;#039;1&amp;#039;}, [&amp;#039;í&amp;#039;] = {&amp;#039;i&amp;#039;, &amp;#039;2&amp;#039;}, [&amp;#039;ǐ&amp;#039;] = {&amp;#039;i&amp;#039;, &amp;#039;3&amp;#039;}, [&amp;#039;ì&amp;#039;] = {&amp;#039;i&amp;#039;, &amp;#039;4&amp;#039;},&lt;br /&gt;
    [&amp;#039;ū&amp;#039;] = {&amp;#039;u&amp;#039;, &amp;#039;1&amp;#039;}, [&amp;#039;ú&amp;#039;] = {&amp;#039;u&amp;#039;, &amp;#039;2&amp;#039;}, [&amp;#039;ǔ&amp;#039;] = {&amp;#039;u&amp;#039;, &amp;#039;3&amp;#039;}, [&amp;#039;ù&amp;#039;] = {&amp;#039;u&amp;#039;, &amp;#039;4&amp;#039;},&lt;br /&gt;
    [&amp;#039;ǖ&amp;#039;] = {&amp;#039;ü&amp;#039;, &amp;#039;1&amp;#039;}, [&amp;#039;ǘ&amp;#039;] = {&amp;#039;ü&amp;#039;, &amp;#039;2&amp;#039;}, [&amp;#039;ǚ&amp;#039;] = {&amp;#039;ü&amp;#039;, &amp;#039;3&amp;#039;}, [&amp;#039;ǜ&amp;#039;] = {&amp;#039;ü&amp;#039;, &amp;#039;4&amp;#039;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- 数字声调 → 注音声调符号&lt;br /&gt;
local toneMap = {[&amp;#039;1&amp;#039;] = &amp;#039;ˉ&amp;#039;, [&amp;#039;2&amp;#039;] = &amp;#039;ˊ&amp;#039;, [&amp;#039;3&amp;#039;] = &amp;#039;ˇ&amp;#039;, [&amp;#039;4&amp;#039;] = &amp;#039;ˋ&amp;#039;, [&amp;#039;5&amp;#039;] = &amp;#039;˙&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
-- 元音+数字声调 → 带声调元音&lt;br /&gt;
local toneVowelMap = {&lt;br /&gt;
    [&amp;#039;a&amp;#039;] = {&amp;#039;ā&amp;#039;, &amp;#039;á&amp;#039;, &amp;#039;ǎ&amp;#039;, &amp;#039;à&amp;#039;, &amp;#039;a&amp;#039;},&lt;br /&gt;
    [&amp;#039;o&amp;#039;] = {&amp;#039;ō&amp;#039;, &amp;#039;ó&amp;#039;, &amp;#039;ǒ&amp;#039;, &amp;#039;ò&amp;#039;, &amp;#039;o&amp;#039;},&lt;br /&gt;
    [&amp;#039;e&amp;#039;] = {&amp;#039;ē&amp;#039;, &amp;#039;é&amp;#039;, &amp;#039;ě&amp;#039;, &amp;#039;è&amp;#039;, &amp;#039;e&amp;#039;},&lt;br /&gt;
    [&amp;#039;i&amp;#039;] = {&amp;#039;ī&amp;#039;, &amp;#039;í&amp;#039;, &amp;#039;ǐ&amp;#039;, &amp;#039;ì&amp;#039;, &amp;#039;i&amp;#039;},&lt;br /&gt;
    [&amp;#039;u&amp;#039;] = {&amp;#039;ū&amp;#039;, &amp;#039;ú&amp;#039;, &amp;#039;ǔ&amp;#039;, &amp;#039;ù&amp;#039;, &amp;#039;u&amp;#039;},&lt;br /&gt;
    [&amp;#039;ü&amp;#039;] = {&amp;#039;ǖ&amp;#039;, &amp;#039;ǘ&amp;#039;, &amp;#039;ǚ&amp;#039;, &amp;#039;ǜ&amp;#039;, &amp;#039;ü&amp;#039;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- ==============================================&lt;br /&gt;
-- 拼音 → 注音 核心转换（支持多音节、连写、空格）&lt;br /&gt;
-- ==============================================&lt;br /&gt;
&lt;br /&gt;
-- 提取拼音声调（返回：无声调拼音 + 数字声调）&lt;br /&gt;
local function extractTone(pinyin)&lt;br /&gt;
    local tone = &amp;#039;5&amp;#039;&lt;br /&gt;
    local clean = pinyin&lt;br /&gt;
    -- 匹配带声调元音&lt;br /&gt;
    for v, info in pairs(vowelToneMap) do&lt;br /&gt;
        if clean:find(v) then&lt;br /&gt;
            clean = clean:gsub(v, info[1])&lt;br /&gt;
            tone = info[2]&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- 匹配末尾数字声调&lt;br /&gt;
    if tone == &amp;#039;5&amp;#039; then&lt;br /&gt;
        local num = clean:match(&amp;#039;(%d)$&amp;#039;)&lt;br /&gt;
        if num and tonumber(num) &amp;gt;=1 and tonumber(num) &amp;lt;=5 then&lt;br /&gt;
            tone = num&lt;br /&gt;
            clean = clean:sub(1, -2)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return clean, tone&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 拼音标准化（处理jqx+ü、缩写、v代替ü）&lt;br /&gt;
local function normalizePinyin(pinyin)&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;v&amp;#039;, &amp;#039;ü&amp;#039;) -- 兼容v代替ü&lt;br /&gt;
    -- jqx后的ü还原&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;^j([uü])&amp;#039;, &amp;#039;jü&amp;#039;):gsub(&amp;#039;^q([uü])&amp;#039;, &amp;#039;qü&amp;#039;):gsub(&amp;#039;^x([uü])&amp;#039;, &amp;#039;xü&amp;#039;)&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;^jue&amp;#039;, &amp;#039;jüe&amp;#039;):gsub(&amp;#039;^que&amp;#039;, &amp;#039;qüe&amp;#039;):gsub(&amp;#039;^xue&amp;#039;, &amp;#039;xüe&amp;#039;)&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;^juan&amp;#039;, &amp;#039;jüan&amp;#039;):gsub(&amp;#039;^quan&amp;#039;, &amp;#039;qüan&amp;#039;):gsub(&amp;#039;^xuan&amp;#039;, &amp;#039;xüan&amp;#039;)&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;^jun&amp;#039;, &amp;#039;jün&amp;#039;):gsub(&amp;#039;^qun&amp;#039;, &amp;#039;qün&amp;#039;):gsub(&amp;#039;^xun&amp;#039;, &amp;#039;xün&amp;#039;)&lt;br /&gt;
    -- 缩写还原&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;iu$&amp;#039;, &amp;#039;iou&amp;#039;):gsub(&amp;#039;ui$&amp;#039;, &amp;#039;uei&amp;#039;):gsub(&amp;#039;un$&amp;#039;, &amp;#039;uen&amp;#039;)&lt;br /&gt;
    -- y/w改写&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;^y([aoeiuü])&amp;#039;, &amp;#039;i%1&amp;#039;):gsub(&amp;#039;^y$&amp;#039;, &amp;#039;i&amp;#039;)&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;^w([aoeiuü])&amp;#039;, &amp;#039;u%1&amp;#039;):gsub(&amp;#039;^w$&amp;#039;, &amp;#039;u&amp;#039;)&lt;br /&gt;
    return pinyin&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 分割拼音声母韵母&lt;br /&gt;
local function splitInitialFinal(pinyin)&lt;br /&gt;
    local initial, final = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
    -- 优先匹配双字母声母zh/ch/sh&lt;br /&gt;
    if pinyin:sub(1,2) == &amp;#039;zh&amp;#039; or pinyin:sub(1,2) == &amp;#039;ch&amp;#039; or pinyin:sub(1,2) == &amp;#039;sh&amp;#039; then&lt;br /&gt;
        initial = pinyin:sub(1,2)&lt;br /&gt;
        final = pinyin:sub(3)&lt;br /&gt;
    elseif pinyinInitialToZhuyin[pinyin:sub(1,1)] then&lt;br /&gt;
        initial = pinyin:sub(1,1)&lt;br /&gt;
        final = pinyin:sub(2)&lt;br /&gt;
    else&lt;br /&gt;
        final = pinyin -- 零声母&lt;br /&gt;
    end&lt;br /&gt;
    return initial, final&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 对外暴露的拼音转注音函数（支持多音节）&lt;br /&gt;
local function pinyinToZhuyin(pinyinStr)&lt;br /&gt;
    if not pinyinStr or pinyinStr == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
    local syllables = splitPinyinSyllables(pinyinStr)&lt;br /&gt;
    local result = {}&lt;br /&gt;
    for _, syl in ipairs(syllables) do&lt;br /&gt;
        local clean, tone = extractTone(syl)&lt;br /&gt;
        clean = normalizePinyin(clean)&lt;br /&gt;
        local initial, final = splitInitialFinal(clean)&lt;br /&gt;
        local zhu = (pinyinInitialToZhuyin[initial] or &amp;#039;&amp;#039;) .. (pinyinFinalToZhuyin[final] or &amp;#039;&amp;#039;)&lt;br /&gt;
        -- 轻声符号在前，其他声调在后&lt;br /&gt;
        local converted = tone == &amp;#039;5&amp;#039; and &amp;#039;˙&amp;#039; .. zhu or zhu .. toneMap[tone]&lt;br /&gt;
        table.insert(result, converted)&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(result, &amp;#039; &amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================================&lt;br /&gt;
-- 注音 → 拼音 核心转换（支持多音节、空格）&lt;br /&gt;
-- ==============================================&lt;br /&gt;
&lt;br /&gt;
-- 提取注音声调（返回：无声调注音 + 数字声调）&lt;br /&gt;
local function extractZhuyinTone(zhuyin)&lt;br /&gt;
    local tone = &amp;#039;5&amp;#039;&lt;br /&gt;
    local clean = zhuyin&lt;br /&gt;
    -- 匹配前置轻声符号&lt;br /&gt;
    if clean:sub(1,1) == &amp;#039;˙&amp;#039; then&lt;br /&gt;
        clean = clean:sub(2)&lt;br /&gt;
    else&lt;br /&gt;
        -- 匹配后置声调符号&lt;br /&gt;
        local lastChar = clean:sub(-1)&lt;br /&gt;
        if lastChar == &amp;#039;ˉ&amp;#039; then tone = &amp;#039;1&amp;#039;&lt;br /&gt;
        elseif lastChar == &amp;#039;ˊ&amp;#039; then tone = &amp;#039;2&amp;#039;&lt;br /&gt;
        elseif lastChar == &amp;#039;ˇ&amp;#039; then tone = &amp;#039;3&amp;#039;&lt;br /&gt;
        elseif lastChar == &amp;#039;ˋ&amp;#039; then tone = &amp;#039;4&amp;#039; end&lt;br /&gt;
        if tone ~= &amp;#039;5&amp;#039; then clean = clean:sub(1, -2) end&lt;br /&gt;
    end&lt;br /&gt;
    return clean, tone&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 分割注音声母韵母&lt;br /&gt;
local function splitZhuyinInitialFinal(zhuyin)&lt;br /&gt;
    local initials = &amp;#039;ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄧㄨ&amp;#039;&lt;br /&gt;
    local firstChar = zhuyin:sub(1,1)&lt;br /&gt;
    if initials:find(firstChar, 1, true) then&lt;br /&gt;
        return firstChar, zhuyin:sub(2)&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;&amp;#039;, zhuyin -- 零声母&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 拼音还原（处理jqx+ü去点、y/w改写）&lt;br /&gt;
local function normalizePinyinBack(pinyin, zhuyinInitial)&lt;br /&gt;
    -- 缩写还原&lt;br /&gt;
    pinyin = pinyin:gsub(&amp;#039;iou$&amp;#039;, &amp;#039;iu&amp;#039;):gsub(&amp;#039;uei$&amp;#039;, &amp;#039;ui&amp;#039;):gsub(&amp;#039;uen$&amp;#039;, &amp;#039;un&amp;#039;)&lt;br /&gt;
    -- jqx后的ü去点&lt;br /&gt;
    if zhuyinInitial == &amp;#039;ㄐ&amp;#039; or zhuyinInitial == &amp;#039;ㄑ&amp;#039; or zhuyinInitial == &amp;#039;ㄒ&amp;#039; then&lt;br /&gt;
        pinyin = pinyin:gsub(&amp;#039;ü&amp;#039;, &amp;#039;u&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    -- 零声母y/w改写&lt;br /&gt;
    if zhuyinInitial == &amp;#039;&amp;#039; then&lt;br /&gt;
        pinyin = pinyin:gsub(&amp;#039;^i([aoeiuü])&amp;#039;, &amp;#039;y%1&amp;#039;):gsub(&amp;#039;^i$&amp;#039;, &amp;#039;yi&amp;#039;)&lt;br /&gt;
        pinyin = pinyin:gsub(&amp;#039;^u([aoeiuü])&amp;#039;, &amp;#039;w%1&amp;#039;):gsub(&amp;#039;^u$&amp;#039;, &amp;#039;wu&amp;#039;)&lt;br /&gt;
        pinyin = pinyin:gsub(&amp;#039;^ü&amp;#039;, &amp;#039;yu&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    return pinyin&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 给拼音加声调符号（严格遵循汉语拼音标调规则）&lt;br /&gt;
local function addToneMark(pinyin, tone)&lt;br /&gt;
    if tone == &amp;#039;5&amp;#039; then return pinyin end&lt;br /&gt;
    local toneNum = tonumber(tone)&lt;br /&gt;
    local targetVowel, pos = &amp;#039;&amp;#039;, 0&lt;br /&gt;
    -- 标调优先级：a &amp;gt; o &amp;gt; e &amp;gt; i/u并列标在后&lt;br /&gt;
    if pinyin:find(&amp;#039;a&amp;#039;) then targetVowel, pos = &amp;#039;a&amp;#039;, pinyin:find(&amp;#039;a&amp;#039;)&lt;br /&gt;
    elseif pinyin:find(&amp;#039;o&amp;#039;) then targetVowel, pos = &amp;#039;o&amp;#039;, pinyin:find(&amp;#039;o&amp;#039;)&lt;br /&gt;
    elseif pinyin:find(&amp;#039;e&amp;#039;) then targetVowel, pos = &amp;#039;e&amp;#039;, pinyin:find(&amp;#039;e&amp;#039;)&lt;br /&gt;
    elseif pinyin:find(&amp;#039;iu&amp;#039;) then targetVowel, pos = &amp;#039;u&amp;#039;, pinyin:find(&amp;#039;u&amp;#039;)&lt;br /&gt;
    elseif pinyin:find(&amp;#039;ui&amp;#039;) then targetVowel, pos = &amp;#039;i&amp;#039;, pinyin:find(&amp;#039;i&amp;#039;)&lt;br /&gt;
    elseif pinyin:find(&amp;#039;i&amp;#039;) then targetVowel, pos = &amp;#039;i&amp;#039;, pinyin:find(&amp;#039;i&amp;#039;)&lt;br /&gt;
    elseif pinyin:find(&amp;#039;u&amp;#039;) then targetVowel, pos = &amp;#039;u&amp;#039;, pinyin:find(&amp;#039;u&amp;#039;)&lt;br /&gt;
    elseif pinyin:find(&amp;#039;ü&amp;#039;) then targetVowel, pos = &amp;#039;ü&amp;#039;, pinyin:find(&amp;#039;ü&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if targetVowel == &amp;#039;&amp;#039; then return pinyin end&lt;br /&gt;
    return pinyin:sub(1, pos-1) .. toneVowelMap[targetVowel][toneNum] .. pinyin:sub(pos+1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 对外暴露的注音转拼音函数（支持多音节）&lt;br /&gt;
local function zhuyinToPinyin(zhuyinStr)&lt;br /&gt;
    if not zhuyinStr or zhuyinStr == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
    zhuyinStr = trim(zhuyinStr)&lt;br /&gt;
    -- 按空格拆分音节&lt;br /&gt;
    local syllables = {}&lt;br /&gt;
    for s in string.gmatch(zhuyinStr, &amp;#039;%S+&amp;#039;) do&lt;br /&gt;
        table.insert(syllables, s)&lt;br /&gt;
    end&lt;br /&gt;
    local result = {}&lt;br /&gt;
    for _, syl in ipairs(syllables) do&lt;br /&gt;
        local clean, tone = extractZhuyinTone(syl)&lt;br /&gt;
        local initial, final = splitZhuyinInitialFinal(clean)&lt;br /&gt;
        local pin = (zhuyinInitialToPinyin[initial] or &amp;#039;&amp;#039;) .. (zhuyinFinalToPinyin[final] or &amp;#039;&amp;#039;)&lt;br /&gt;
        pin = normalizePinyinBack(pin, initial)&lt;br /&gt;
        pin = addToneMark(pin, tone)&lt;br /&gt;
        table.insert(result, pin)&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(result, &amp;#039; &amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==============================================&lt;br /&gt;
-- 原模板核心逻辑（保留原有功能，新增自动互转）&lt;br /&gt;
-- ==============================================&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = getArgs(frame, { wrappers = &amp;#039;Template:Zy&amp;#039; })&lt;br /&gt;
    return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.nocat(frame)&lt;br /&gt;
    local args = getArgs(frame, { wrappers = &amp;#039;Template:ZyPy&amp;#039; })&lt;br /&gt;
    args.nocat = true&lt;br /&gt;
    return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
    -- 核心自动互转逻辑&lt;br /&gt;
    local inputPinyin = args[2]&lt;br /&gt;
    local inputZhuyin = args[3]&lt;br /&gt;
    -- 有拼音无注音 → 自动生成注音&lt;br /&gt;
    if inputPinyin and not inputZhuyin then&lt;br /&gt;
        args[3] = pinyinToZhuyin(inputPinyin)&lt;br /&gt;
    -- 有注音无拼音 → 自动生成拼音&lt;br /&gt;
    elseif inputZhuyin and not inputPinyin then&lt;br /&gt;
        args[2] = zhuyinToPinyin(inputZhuyin)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local pinyin   = args[2] and mw.text.tag{ name = &amp;#039;span&amp;#039;, attrs = { lang = &amp;#039;zh-Latn-pinyin&amp;#039; }, content = args[2] }&lt;br /&gt;
    local zhuyin   = args[3] and mw.text.tag{ name = &amp;#039;span&amp;#039;, attrs = { lang = &amp;#039;zh-Bopo&amp;#039; }, content = args[3] }&lt;br /&gt;
    local jyutping = args[4] and mw.text.tag{ name = &amp;#039;span&amp;#039;, attrs = { lang = &amp;#039;yue-Latn-jyutping&amp;#039; }, content = args[4] }&lt;br /&gt;
&lt;br /&gt;
    if not pinyin and not zhuyin then&lt;br /&gt;
        return args[1]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local ruby = mw.html.create(&amp;#039;ruby&amp;#039;):addClass(&amp;#039;zy&amp;#039;)&lt;br /&gt;
    ruby:wikitext(args[1])&lt;br /&gt;
    ruby:tag(&amp;#039;rp&amp;#039;):wikitext(&amp;#039;（&amp;#039;)&lt;br /&gt;
    ruby:tag(&amp;#039;rt&amp;#039;):wikitext(string.format(&lt;br /&gt;
        &amp;#039;-{zh-hans:%s;zh-hant:%s;zh-tw:%s;zh-hk:%s;}-&amp;#039;,&lt;br /&gt;
        pinyin or zhuyin,&lt;br /&gt;
        pinyin or zhuyin,&lt;br /&gt;
        zhuyin or pinyin,&lt;br /&gt;
        jyutping or pinyin or zhuyin&lt;br /&gt;
    ))&lt;br /&gt;
    ruby:tag(&amp;#039;rp&amp;#039;):wikitext(&amp;#039;）&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    local rubyText = tostring(ruby)&lt;br /&gt;
&lt;br /&gt;
    -- 仅在部分变体下注音&lt;br /&gt;
    local v = args.v&lt;br /&gt;
    local t = { hans = &amp;#039;tw&amp;#039;, hant = &amp;#039;cn&amp;#039; }&lt;br /&gt;
    if v and t[v] then&lt;br /&gt;
        rubyText = string.format(&lt;br /&gt;
            &amp;#039;-{zh-%s:-{zh;zh-hans;zh-hant|%s}-;zh-%s:%s;}-&amp;#039;,&lt;br /&gt;
            v, rubyText, t[v], args[1]&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if args.nocat then&lt;br /&gt;
        return rubyText&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- 维护分类&lt;br /&gt;
    local getCategoryName = require(&amp;#039;Module:Lang&amp;#039;)._category_from_tag&lt;br /&gt;
    local result = { rubyText }&lt;br /&gt;
    if mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
        if pinyin then&lt;br /&gt;
            table.insert(result, &amp;#039;[[&amp;#039;)&lt;br /&gt;
            table.insert(result, getCategoryName({ &amp;#039;zh-Latn-pinyin&amp;#039; }))&lt;br /&gt;
            table.insert(result, &amp;#039;]]&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
        if zhuyin then&lt;br /&gt;
            table.insert(result, &amp;#039;[[&amp;#039;)&lt;br /&gt;
            table.insert(result, getCategoryName({ &amp;#039;zh-Bopo&amp;#039; }))&lt;br /&gt;
            table.insert(result, &amp;#039;]]&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local count = (pinyin and 1 or 0) + (zhuyin and 1 or 0) + (jyutping and 1 or 0)&lt;br /&gt;
    if count == 3 then&lt;br /&gt;
        table.insert(result, &amp;#039;[[Category:使用了三种注音方式的页面]]&amp;#039;)&lt;br /&gt;
    elseif count == 2 then&lt;br /&gt;
        table.insert(result, &amp;#039;[[Category:使用了两种注音方式的页面]]&amp;#039;)&lt;br /&gt;
    else&lt;br /&gt;
        table.insert(result, &amp;#039;[[Category:使用了一种注音方式的页面]]&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat(result)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 单独暴露转换函数，方便调试&lt;br /&gt;
p.pinyinToZhuyin = pinyinToZhuyin&lt;br /&gt;
p.zhuyinToPinyin = zhuyinToPinyin&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;TransportationMEE</name></author>
	</entry>
</feed>