From ba595c475ea5d422c15047f3aa221f5a02234dd0 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 10:21:47 +0800 Subject: [PATCH 01/14] README // Update hardware requirement & dev proposal, etc. --- README.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b651cd8f..680ed38b 100644 --- a/README.md +++ b/README.md @@ -24,27 +24,31 @@ ## 系統需求 -建置用系統需求:至少 macOS 10.15 Catalina & Xcode 12。// 原因:Swift 封包管理支持所需。 +建置用系統需求:至少 macOS 10.15 Catalina & Xcode 12。// 原因:Swift 封包管理支援所需。 編譯出的成品對應系統需求: -- 至少 macOS El Capitan 10.11.5,否則無法處理 Unicode 8.0 的漢字。即便如此,仍需手動升級蘋方至至少 macOS 10.12 開始隨贈的版本、以支持 Unicode 8.0 的通用規範漢字表用字(全字型檔沒有「𫫇」字)。 +- 至少 macOS El Capitan 10.11.5,否則無法處理 Unicode 8.0 的漢字。即便如此,仍需手動升級蘋方至至少 macOS 10.12 開始隨贈的版本、以支援 Unicode 8.0 的通用規範漢字表用字(全字庫沒有「𫫇」字)。 - 保留該系統支援的原因:非 Unibody 體型的 MacBook Pro 支援的最後一版 macOS 就是 El Capitan。 -- **推薦最低系統版本**:macOS 10.12 Sierra,對 Unicode 8.0 開始的《通用規範漢字表》漢字有原生的蘋方支持。 +- **推薦最低系統版本**:macOS 10.12 Sierra,對 Unicode 8.0 開始的《通用規範漢字表》漢字有原生的蘋方支援。 + + - 同時建議**系統記憶體應至少 4GB**。威注音輸入法佔用記憶體約 115MB 左右(簡繁雙模式)、75MB左右(單模式),供參考。 + + - 請務必使用 SSD 硬碟,否則可能會影響每次開機之後輸入法首次載入的速度。從 10.10 Yosemite 開始,macOS 就已經是針對機械硬碟負優化的作業系統了。 - 注:能裝 macOS 10.13 High Sierra 就不要去碰 macOS 10.12 Sierra 這個半成品。 -- 關於全字型檔支持,因下述事實而在理論上很難做到最完美: +- 關於全字庫支援,因下述事實而在理論上很難做到最完美: - - 很可惜 GB18030-2005 並沒有官方提供的逐字讀音對照表,所以目前才用了全字型檔。然而全字型檔並不等於完美。 + - 很可惜 GB18030-2005 並沒有官方提供的逐字讀音對照表,所以目前才用了全字庫。然而全字庫並不等於完美。 - - 有條件者可以安裝全字型檔字型與花園明朝,否則全字型檔等高萬國碼碼位漢字恐無法在輸入法的選字窗內完整顯示。 + - 有條件者可以安裝全字庫字型與花園明朝,否則全字庫等高萬國碼碼位漢字恐無法在輸入法的選字窗內完整顯示。 - - 全字型檔漢字顯示支持會受到具體系統版本對萬國碼版本的支持的限制。 + - 全字庫漢字顯示支援會受到具體系統版本對萬國碼版本的支援的限制。 - - 有些全字型檔漢字一開始會依賴萬國碼的私人造字區,且在之後被新版本萬國碼所支持。 + - 有些全字庫漢字一開始會依賴萬國碼的私人造字區,且在之後被新版本萬國碼所支援。 ## 建置流程 @@ -106,6 +110,6 @@ 其實我滿懷念上游專案還沒被 Lukhnos Liu 接管收入 OpenVanilla 的那個年代。MJHsieh 主導開發小麥注音的時候,且不討論他立場怎樣,但基礎的技術交流是完全沒問題的。LibChewing 那邊也是,正常交流完全沒問題。 -有些事情,繼續爭論下去也沒用。本來我想著重寫 ctlInputMethod 撤掉 zonble 的狀態管理引擎的,畢竟有大陸同鄉寫的火山五筆輸入法的框架套上我的鐵恨注音並擊引擎可以直接用。但這樣賭氣對誰都沒好處。眼下,威注音 macOS 版還需要一些小維護。之後我就得開始考慮用 Rust 重寫鐵恨注音並擊引擎與天權星語彙引擎、方便接下來威注音的 Windows 版本的研發。能將 Lukhnos 的 C++ 內容全部換掉、徹底砸碎套在威注音身上的名為 C++ 的枷鎖、讓威注音有一個自由的未來,我已經知足了。讓更多的人用上好用的輸入法,才是最重要的。**這個重要性,不是 zonble 用「私人需求」這種帽子扣過來、就可以泯滅了的**。 +有些事情,繼續爭論下去也沒用。本來我想著重寫 ctlInputMethod 撤掉 zonble 的狀態管理引擎的,畢竟有大陸同鄉寫的火山五筆輸入法的框架套上我的鐵恨注音並擊引擎可以直接用。但這樣賭氣對誰都沒好處。眼下,威注音 macOS 版還需要一些小維護。之後我就得開始考慮用 Windows 平台可用的除了 C++ 以外的語言重寫鐵恨注音並擊引擎與天權星語彙引擎、方便接下來威注音的 Windows 版本的研發。能將 Lukhnos 的 C++ 內容全部換掉、徹底砸碎套在威注音身上的名為 C++ 的枷鎖、讓威注音有一個自由的未來,我已經知足了。讓更多的人用上好用的輸入法,才是最重要的。**這個重要性,不是 zonble 用「私人需求」這種帽子扣過來、就可以泯滅了的**。 $ EOF. From 0bcaa6165648518ea3ed8ed9a16c22297ce3ffb7 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 08:37:22 +0800 Subject: [PATCH 02/14] Megrez v1.1.3 // Nerf the additional weights to the balanced score. --- .../Megrez/1_BlockReadingBuilder.swift | 3 +-- .../LanguageParsers/Megrez/2_Grid.swift | 20 +++++++++---------- .../LanguageParsers/Megrez/3_NodeAnchor.swift | 14 ++++++++++--- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Source/Modules/LanguageParsers/Megrez/1_BlockReadingBuilder.swift b/Source/Modules/LanguageParsers/Megrez/1_BlockReadingBuilder.swift index 2bf8cb76..eb562795 100644 --- a/Source/Modules/LanguageParsers/Megrez/1_BlockReadingBuilder.swift +++ b/Source/Modules/LanguageParsers/Megrez/1_BlockReadingBuilder.swift @@ -193,8 +193,7 @@ extension Megrez { // 利用幅位長度來決定權重。 // 這樣一來,例:「再見」比「在」與「見」的權重更高。 if balanced { - let weightedScore: Double = (Double(n.spanningLength) - 1) * 2 - n.accumulatedScore += weightedScore + n.accumulatedScore += n.additionalWeights } var path: [NodeAnchor] = reverseWalk( diff --git a/Source/Modules/LanguageParsers/Megrez/2_Grid.swift b/Source/Modules/LanguageParsers/Megrez/2_Grid.swift index da532564..61410e8f 100644 --- a/Source/Modules/LanguageParsers/Megrez/2_Grid.swift +++ b/Source/Modules/LanguageParsers/Megrez/2_Grid.swift @@ -204,33 +204,33 @@ extension Megrez { extension Megrez.Grid { public var dumpDOT: String { - var sst = "digraph {\ngraph [ rankdir=LR ];\nBOS;\n" + var strOutput = "digraph {\ngraph [ rankdir=LR ];\nBOS;\n" for (p, span) in mutSpans.enumerated() { for ni in 0...(span.maximumLength) { guard let np: Megrez.Node = span.node(length: ni) else { continue } if p == 0 { - sst += "BOS -> \(np.currentKeyValue.value);\n" + strOutput += "BOS -> \(np.currentKeyValue.value);\n" } - sst += "\(np.currentKeyValue.value);\n" + strOutput += "\(np.currentKeyValue.value);\n" if (p + ni) < mutSpans.count { - let dstSpan = mutSpans[p + ni] - for q in 0...(dstSpan.maximumLength) { - if let dn = dstSpan.node(length: q) { - sst += np.currentKeyValue.value + " -> " + dn.currentKeyValue.value + ";\n" + let destinatedSpan = mutSpans[p + ni] + for q in 0...(destinatedSpan.maximumLength) { + if let dn = destinatedSpan.node(length: q) { + strOutput += np.currentKeyValue.value + " -> " + dn.currentKeyValue.value + ";\n" } } } if (p + ni) == mutSpans.count { - sst += np.currentKeyValue.value + " -> EOS;\n" + strOutput += np.currentKeyValue.value + " -> EOS;\n" } } } - sst += "EOS;\n}\n" - return sst + strOutput += "EOS;\n}\n" + return strOutput } } diff --git a/Source/Modules/LanguageParsers/Megrez/3_NodeAnchor.swift b/Source/Modules/LanguageParsers/Megrez/3_NodeAnchor.swift index b450b6a2..11b47258 100644 --- a/Source/Modules/LanguageParsers/Megrez/3_NodeAnchor.swift +++ b/Source/Modules/LanguageParsers/Megrez/3_NodeAnchor.swift @@ -52,11 +52,19 @@ extension Megrez { return stream } + /// 獲取加權量。 + public var additionalWeights: Double { + (Double(spanningLength) - 1) * 0.75 + } + /// 獲取平衡權重。 public var balancedScore: Double { - let weightedScore: Double = (Double(spanningLength) - 1) * 2 - let nodeScore: Double = node?.score ?? 0 - return weightedScore + nodeScore + (node?.score ?? 0) + additionalWeights + } + + /// 獲取平衡累計權重。 + public var balancedAccumulatedScore: Double { + accumulatedScore + additionalWeights } } } From 2b786b23565e46a1eaf1753edb97f59ffd527e0d Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 09:41:11 +0800 Subject: [PATCH 03/14] mgrPrefs // +useScoreBalancing. --- Source/Modules/IMEModules/mgrPrefs.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/Modules/IMEModules/mgrPrefs.swift b/Source/Modules/IMEModules/mgrPrefs.swift index 70d80662..7d86f399 100644 --- a/Source/Modules/IMEModules/mgrPrefs.swift +++ b/Source/Modules/IMEModules/mgrPrefs.swift @@ -28,6 +28,7 @@ import Cocoa struct UserDef { static let kIsDebugModeEnabled = "_DebugMode" + static let kUseScoreBalancing = "UseScoreBalancing" static let kMostRecentInputMode = "MostRecentInputMode" static let kUserDataFolderSpecified = "UserDataFolderSpecified" static let kCheckUpdateAutomatically = "CheckUpdateAutomatically" @@ -219,6 +220,7 @@ public enum mgrPrefs { static var allKeys: [String] { [ UserDef.kIsDebugModeEnabled, + UserDef.kUseScoreBalancing, UserDef.kMostRecentInputMode, UserDef.kUserDataFolderSpecified, UserDef.kMandarinParser, @@ -257,6 +259,7 @@ public enum mgrPrefs { public static func setMissingDefaults() { UserDefaults.standard.setDefault(mgrPrefs.isDebugModeEnabled, forKey: UserDef.kIsDebugModeEnabled) + UserDefaults.standard.setDefault(mgrPrefs.useScoreBalancing, forKey: UserDef.kUseScoreBalancing) UserDefaults.standard.setDefault(mgrPrefs.mostRecentInputMode, forKey: UserDef.kMostRecentInputMode) UserDefaults.standard.setDefault(mgrPrefs.checkUpdateAutomatically, forKey: UserDef.kCheckUpdateAutomatically) UserDefaults.standard.setDefault( @@ -305,6 +308,9 @@ public enum mgrPrefs { @UserDefault(key: UserDef.kIsDebugModeEnabled, defaultValue: false) static var isDebugModeEnabled: Bool + @UserDefault(key: UserDef.kUseScoreBalancing, defaultValue: false) + static var useScoreBalancing: Bool + @UserDefault(key: UserDef.kMostRecentInputMode, defaultValue: "") static var mostRecentInputMode: String From 51fa28557b10a015bd152be10787ab9d9bc200ad Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 09:54:11 +0800 Subject: [PATCH 04/14] KeyHandler // Bind mgrPrefs.useScoreBalancing option. --- Source/Modules/ControllerModules/KeyHandler_Core.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Modules/ControllerModules/KeyHandler_Core.swift b/Source/Modules/ControllerModules/KeyHandler_Core.swift index 3eb722d6..161b0455 100644 --- a/Source/Modules/ControllerModules/KeyHandler_Core.swift +++ b/Source/Modules/ControllerModules/KeyHandler_Core.swift @@ -112,7 +112,9 @@ class KeyHandler { // of the best possible Mandarin characters given the input syllables, // using the Viterbi algorithm implemented in the Megrez library. // The walk() traces the grid to the end, hence no need to use .reversed() here. - _walkedNodes = _builder.walk(at: _builder.grid.width, nodesLimit: 10, balanced: true) + _walkedNodes = _builder.walk( + at: _builder.grid.width, nodesLimit: 10, balanced: mgrPrefs.useScoreBalancing + ) } var popOverflowComposingTextAndWalk: String { From 8dc4cd058bb1816ffdbc340f4638733fa391d513 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 10:15:53 +0800 Subject: [PATCH 05/14] PrefUI // Bind mgrPrefs.useScoreBalancing option. --- Source/Resources/Base.lproj/Localizable.strings | 1 + Source/Resources/en.lproj/Localizable.strings | 1 + Source/Resources/ja.lproj/Localizable.strings | 1 + Source/Resources/zh-Hans.lproj/Localizable.strings | 1 + Source/Resources/zh-Hant.lproj/Localizable.strings | 1 + Source/UI/PrefUI/suiPrefPaneDictionary.swift | 9 +++++++++ 6 files changed, 14 insertions(+) diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index a39e8b80..77feb523 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -89,6 +89,7 @@ "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "Auto-convert traditional Chinese glyphs to KangXi characters"; "Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected"; +"Balance the score according to candidate length" = "Balance the score according to candidate length"; "Basic Keyboard Layout:" = "Basic Keyboard Layout:"; "Candidate Layout:" = "Candidate Layout:"; "Candidate Size:" = "Candidate Size:"; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index a39e8b80..77feb523 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -89,6 +89,7 @@ "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "Auto-convert traditional Chinese glyphs to KangXi characters"; "Automatically reload user data files if changes detected" = "Automatically reload user data files if changes detected"; +"Balance the score according to candidate length" = "Balance the score according to candidate length"; "Basic Keyboard Layout:" = "Basic Keyboard Layout:"; "Candidate Layout:" = "Candidate Layout:"; "Candidate Size:" = "Candidate Size:"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 180e54a4..812521c2 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -89,6 +89,7 @@ "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "入力した繁体字を日文 JIS 新字体と自動変換"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "入力した繁体字を康熙字体と自動変換"; "Automatically reload user data files if changes detected" = "ユーザー辞書データの変更を自動検出し、自動的に再読込"; +"Balance the score according to candidate length" = "候補文字の長さによる重みの調整"; "Basic Keyboard Layout:" = "基礎キーボード:"; "Candidate Layout:" = "入力候補陳列の仕様"; "Candidate Size:" = "候補文字の字号:"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 5d844616..928d130e 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -89,6 +89,7 @@ "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "自动将繁体中文字转为日文 JIS 新字体"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "自动将繁体中文字转为康熙正体字"; "Automatically reload user data files if changes detected" = "自动检测并载入使用者语汇档案变更"; +"Balance the score according to candidate length" = "按候选字词的长度调整权重"; "Basic Keyboard Layout:" = "基础键盘布局:"; "Candidate Layout:" = "候选字窗布局:"; "Candidate Size:" = "候选字窗字号:"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index cd1edbe9..faa80a99 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -89,6 +89,7 @@ "Auto-convert traditional Chinese glyphs to JIS Shinjitai characters" = "自動將繁體中文字轉為日文 JIS 新字體"; "Auto-convert traditional Chinese glyphs to KangXi characters" = "自動將繁體中文字轉為康熙正體字"; "Automatically reload user data files if changes detected" = "自動檢測並載入使用者語彙檔案變更"; +"Balance the score according to candidate length" = "按候選字詞的長度調整權重"; "Basic Keyboard Layout:" = "基礎鍵盤佈局:"; "Candidate Layout:" = "候選字窗佈局:"; "Candidate Size:" = "候選字窗字號:"; diff --git a/Source/UI/PrefUI/suiPrefPaneDictionary.swift b/Source/UI/PrefUI/suiPrefPaneDictionary.swift index e8376b3e..2f8dd746 100644 --- a/Source/UI/PrefUI/suiPrefPaneDictionary.swift +++ b/Source/UI/PrefUI/suiPrefPaneDictionary.swift @@ -35,6 +35,8 @@ struct suiPrefPaneDictionary: View { @State private var selEnableCNS11643: Bool = UserDefaults.standard.bool(forKey: UserDef.kCNS11643Enabled) @State private var selEnableSymbolInputSupport: Bool = UserDefaults.standard.bool( forKey: UserDef.kSymbolInputEnabled) + @State private var selUseScoreBalancing: Bool = UserDefaults.standard.bool( + forKey: UserDef.kUseScoreBalancing) private let contentWidth: Double = { switch mgrPrefs.appleLanguages[0] { case "ja": @@ -126,6 +128,13 @@ struct suiPrefPaneDictionary: View { mgrPrefs.symbolInputEnabled = value mgrLangModel.setSymbolEnabled(value) } + Toggle( + LocalizedStringKey("Balance the score according to candidate length"), + isOn: $selUseScoreBalancing + ) + .onChange(of: selUseScoreBalancing) { value in + mgrPrefs.useScoreBalancing = value + } } } } From 8cf6f283ff35ecde63261861b7918cb1cab9214e Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 10:29:17 +0800 Subject: [PATCH 06/14] PrefWindow // Bind mgrPrefs.useScoreBalancing option, etc. --- .../WindowNIBs/Base.lproj/frmPrefWindow.xib | 48 +++++++++++++------ .../WindowNIBs/en.lproj/frmPrefWindow.strings | 3 ++ .../WindowNIBs/ja.lproj/frmPrefWindow.strings | 3 ++ .../zh-Hans.lproj/frmPrefWindow.strings | 3 ++ .../zh-Hant.lproj/frmPrefWindow.strings | 3 ++ 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib index 1dc1d24c..5ae27bfc 100644 --- a/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib +++ b/Source/WindowNIBs/Base.lproj/frmPrefWindow.xib @@ -623,9 +623,9 @@ + - + + - + - + + + - - + - - - - + + + + + @@ -789,6 +806,7 @@ + diff --git a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings index f7c834dc..bedd40a6 100644 --- a/Source/WindowNIBs/en.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/en.lproj/frmPrefWindow.strings @@ -247,3 +247,6 @@ /* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */ "Parser14.title" = "Universal Pinyin with Numeral Intonation"; + +/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */ +"Wh1-iz-pwM.title" = "Balance the score according to candidate length"; diff --git a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings index ae3a0e98..3e03d3f2 100644 --- a/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/ja.lproj/frmPrefWindow.strings @@ -247,3 +247,6 @@ /* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */ "Parser14.title" = "汎用弁音 (ローマ字+数字音調)"; + +/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */ +"Wh1-iz-pwM.title" = "候補文字の長さによる重みの調整"; diff --git a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings index 6a282458..b18b0a94 100644 --- a/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hans.lproj/frmPrefWindow.strings @@ -247,3 +247,6 @@ /* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */ "Parser14.title" = "通用拼音+数字标调"; + +/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */ +"Wh1-iz-pwM.title" = "按候选字词的长度调整权重"; diff --git a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings index fb1bc669..db47c17e 100644 --- a/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings +++ b/Source/WindowNIBs/zh-Hant.lproj/frmPrefWindow.strings @@ -247,3 +247,6 @@ /* Class = "NSMenuItem"; title = "Universal Pinyin with Numeral Intonation"; ObjectID = "Parser14"; */ "Parser14.title" = "通用拼音+數字標調"; + +/* Class = "NSButtonCell"; title = "Balance the score according to candidate length"; ObjectID = "Wh1-iz-pwM"; */ +"Wh1-iz-pwM.title" = "按候選字詞的長度調整權重"; From 8fe9fb1ee14d30b63ea166b2028be61123a81609 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 11:55:19 +0800 Subject: [PATCH 07/14] Repo // Update high-resolution fart and beep SFX files. --- Source/Resources/SoundFiles/Beep.m4a | Bin 14940 -> 22473 bytes Source/Resources/SoundFiles/Fart.m4a | Bin 8804 -> 10083 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Source/Resources/SoundFiles/Beep.m4a b/Source/Resources/SoundFiles/Beep.m4a index 6e4e31508a274bb6de069f7aee7ce673153f9d8a..6972662d446e69b053388389f682dc6f04295198 100644 GIT binary patch delta 19120 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 delta 11513 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

WbhVp2r^OeJk~DHJ^~pPO-W zWSf$h#$VMDpfYj4qwNQ~GCC1nnAdl_XsOWGL@-J;+vhH3R&`nq~&dwL-k_MV*ms7Z*NJhByE)?8VIcFA@IW!L)iz!$Ui&KVN~)L2ER%HBpqr z*zF$rne7P~=1drKqh#2$4_K6vS@pKQR}0*#rIYT%*!m=+x{!Jy+o)yAAn|wXN5$p7 z`HGba+_5}M+n%zx%X2S0FiaVi{7I;QB2v5}bV7I>p3Ey+BzS2`kxxQXt<0)qlBxu#OVOb&AGOG>P+32bPtW!qSsf6A& zIqC^8Dg9T|$aF5FMTaRBd^`NO>2x{bw{1BAlRW94?>0D97oq#ehNBF+EkYq-c5;1< zkjK1xh%sPpEMesbN$|#`SlpvY#AvhUO02=^ORw5$?Xr#7HeStgi3*5NGMMaVP8o0Q zv|Xzd#j^O%ezvRv zAe4eEpY?Yx>q>|7hZ9v#a#&$W5|2v98iHL0Ob<_U=rcv4wnSNkHY*^Om|Ym6f(h ziIjhKlNT<1<+S{x&fQd4$!P&M9qTa9sckl=7tzQj3aCyq>oXtWY%*1ATh_;)za1$`4;FcL3z7o zc&AA*rv22x$`;db*^&lGmT|NWmgl^c@%N$qG* zkrwk~9JKD6tr#ozho!BQA1uv!9rt`1M}N zFGy|&#emeFkmAsNDLQ#c;mr9C183t)mwNG`sJc4z#`1xk__XvG;xBhN`%t#md9TI+6{Ju*DjEsMrVU z^kDN!v2lrq&%cB}C$Dn6 zF8$!I0l*E&SWyb^{GLAjLqJ1WJdSlmJjPE0Al6td;dVqdCKRO64&+-9 zuszpRvxKTAs91*IjEzBSVeJ~P%N!jmouk`)Y|B5tZH`!Jc|y|ec}(c^zG>w_nyQ8Uin7V#C=w9DIBE z?AS+y#40^NfbK;nNyZMOa;LUf*r;<)^EI?i%c?r#VU&oHjPwD_j!A*t5p+&FhD@mr z$N|E$?7*7m`N#!5@rvboqthx;o-Cu>=-<4bol1ku`dPFJQOMwE#-P?*Va`K`jmEM0 zvAmH;QrxI@PLUBA?dTV21(|LK$2FQZ40FB!X}t+TMcLMa&7}g(Kh8Ue0>_7$&Q#JK zKk+2;CWq8x7r9`L_Ui1J0rlJ+h(*G(!xtr7r4=j$Y~U*CtfJ|pPesqVNvt|OG3lT` z{g0b$QAPoTmNavC0fm5pMLH;aOrbYF|NP3uRbMAkd!^PrurDP%Yc+@6qJLKOA*2V< zfhrF)HsP%KPE1A$3RBoe(=TNMT#Lt$sl$86uiS3ZK{P~y;-Hs;WrxT0-2hx(W;(|7 NZL4=t%n0Vg{{hf$7*+rP delta 5101 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 From 703b427ddd1646e00167f74af0db62184ebc81ce Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 21:52:35 +0800 Subject: [PATCH 08/14] DataCompiler // Also generate factory dictionaries in plist format. --- DataCompiler/dataCompiler.swift | 145 ++++++++++++++++++++++++++++++-- 1 file changed, 138 insertions(+), 7 deletions(-) diff --git a/DataCompiler/dataCompiler.swift b/DataCompiler/dataCompiler.swift index 08261761..d79dbd12 100644 --- a/DataCompiler/dataCompiler.swift +++ b/DataCompiler/dataCompiler.swift @@ -43,6 +43,20 @@ extension String { } } +// MARK: - StringView Ranges Extension (by Isaac Xen) + +extension String { + fileprivate func ranges(splitBy separator: Element) -> [Range] { + var startIndex = startIndex + return split(separator: separator).reduce(into: []) { ranges, substring in + _ = range(of: substring, range: startIndex.. String { + let dicPhonabet2ASCII = [ + "ㄅ": "b", "ㄆ": "p", "ㄇ": "m", "ㄈ": "f", "ㄉ": "d", "ㄊ": "t", "ㄋ": "n", "ㄌ": "l", "ㄍ": "g", "ㄎ": "k", "ㄏ": "h", + "ㄐ": "j", "ㄑ": "q", "ㄒ": "x", "ㄓ": "Z", "ㄔ": "C", "ㄕ": "S", "ㄖ": "r", "ㄗ": "z", "ㄘ": "c", "ㄙ": "s", "ㄧ": "i", + "ㄨ": "u", "ㄩ": "v", "ㄚ": "a", "ㄛ": "o", "ㄜ": "e", "ㄝ": "E", "ㄞ": "B", "ㄟ": "P", "ㄠ": "M", "ㄡ": "F", "ㄢ": "D", + "ㄣ": "T", "ㄤ": "N", "ㄥ": "L", "ㄦ": "R", "ˊ": "2", "ˇ": "3", "ˋ": "4", "˙": "5", + ] + var strOutput = incoming + if !strOutput.contains("_") { + for entry in dicPhonabet2ASCII { + strOutput = strOutput.replacingOccurrences(of: entry.key, with: entry.value) + } + } + return strOutput +} + // MARK: - 登記全局根常數變數 private let urlCurrentFolder = URL(fileURLWithPath: FileManager.default.currentDirectoryPath) @@ -95,12 +127,22 @@ private let urlCHTforMOE: String = "./components/cht/phrases-moe-cht.txt" private let urlCHTforVCHEW: String = "./components/cht/phrases-vchewing-cht.txt" private let urlKanjiCore: String = "./components/common/char-kanji-core.txt" -private let urlPunctuation: String = "./components/common/data-punctuations.txt" private let urlMiscBPMF: String = "./components/common/char-misc-bpmf.txt" private let urlMiscNonKanji: String = "./components/common/char-misc-nonkanji.txt" +private let urlPunctuation: String = "./components/common/data-punctuations.txt" +private let urlSymbols: String = "./components/common/data-symbols.txt" +private let urlZhuyinwen: String = "./components/common/data-zhuyinwen.txt" +private let urlCNS: String = "./components/common/char-kanji-cns.txt" + +private let urlPlistSymbols: String = "./data-symbols.plist" +private let urlPlistZhuyinwen: String = "./data-zhuyinwen.plist" +private let urlPlistCNS: String = "./data-cns.plist" + private let urlOutputCHS: String = "./data-chs.txt" +private let urlPlistCHS: String = "./data-chs.plist" private let urlOutputCHT: String = "./data-cht.txt" +private let urlPlistCHT: String = "./data-cht.plist" // MARK: - 載入詞組檔案且輸出陣列 @@ -382,41 +424,130 @@ func weightAndSort(_ arrStructUncalculated: [Entry], isCHS: Bool) -> [Entry] { func fileOutput(isCHS: Bool) { let i18n: String = isCHS ? "簡體中文" : "繁體中文" + var strPunctuation = "" + var rangeMap: [String: [Data]] = [:] let pathOutput = urlCurrentFolder.appendingPathComponent( isCHS ? urlOutputCHS : urlOutputCHT) + let plistURL = urlCurrentFolder.appendingPathComponent( + isCHS ? urlPlistCHS : urlPlistCHT) var strPrintLine = "" // 讀取標點內容 do { - strPrintLine += try String(contentsOfFile: urlPunctuation, encoding: .utf8) + strPunctuation = try String(contentsOfFile: urlPunctuation, encoding: .utf8).replacingOccurrences( + of: "\t", with: " ") + strPrintLine += try String(contentsOfFile: urlPunctuation, encoding: .utf8).replacingOccurrences( + of: "\t", with: " ") } catch { NSLog(" - \(i18n): Exception happened when reading raw punctuation data.") } - NSLog(" - \(i18n): 成功插入標點符號與西文字母數據。") + NSLog(" - \(i18n): 成功插入標點符號與西文字母數據(txt)。") // 統合辭典內容 + strPunctuation.ranges(splitBy: "\n").forEach { + let neta = strPunctuation[$0].split(separator: " ") + let line = String(strPunctuation[$0]) + if neta.count >= 2 { + let theKey = String(neta[0]) + let theValue = String(neta[1]) + if !neta[0].isEmpty, !neta[1].isEmpty, line.first != "#" { + rangeMap[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!) + } + } + } var arrStructUnified: [Entry] = [] arrStructUnified += rawDictForKanjis(isCHS: isCHS) arrStructUnified += rawDictForNonKanjis(isCHS: isCHS) arrStructUnified += rawDictForPhrases(isCHS: isCHS) // 計算權重且排序 arrStructUnified = weightAndSort(arrStructUnified, isCHS: isCHS) - for entry in arrStructUnified { + let theKey = entry.valPhone + let theValue = (String(entry.valWeight) + " " + entry.valPhrase) + rangeMap[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!) strPrintLine += entry.valPhone + " " + entry.valPhrase + " " + String(entry.valWeight) + "\n" } - NSLog(" - \(i18n): 要寫入檔案的內容編譯完畢。") + NSLog(" - \(i18n): 要寫入檔案的 txt 內容編譯完畢。") do { try strPrintLine.write(to: pathOutput, atomically: false, encoding: .utf8) + let plistData = try PropertyListSerialization.data(fromPropertyList: rangeMap, format: .binary, options: 0) + try plistData.write(to: plistURL) } catch { NSLog(" - \(i18n): Error on writing strings to file: \(error)") } NSLog(" - \(i18n): 寫入完成。") } -// MARK: - 主执行绪 +func commonFileOutput() { + let i18n = "語言中性" + var strSymbols = "" + var strZhuyinwen = "" + var strCNS = "" + var mapSymbols: [String: [Data]] = [:] + var mapZhuyinwen: [String: [Data]] = [:] + var mapCNS: [String: [Data]] = [:] + // 讀取標點內容 + do { + strSymbols = try String(contentsOfFile: urlSymbols, encoding: .utf8).replacingOccurrences(of: "\t", with: " ") + strZhuyinwen = try String(contentsOfFile: urlZhuyinwen, encoding: .utf8).replacingOccurrences(of: "\t", with: " ") + strCNS = try String(contentsOfFile: urlCNS, encoding: .utf8).replacingOccurrences(of: "\t", with: " ") + } catch { + NSLog(" - \(i18n): Exception happened when reading raw punctuation data.") + } + NSLog(" - \(i18n): 成功取得標點符號與西文字母原始資料(plist)。") + // 統合辭典內容 + strSymbols.ranges(splitBy: "\n").forEach { + let neta = strSymbols[$0].split(separator: " ") + let line = String(strSymbols[$0]) + if neta.count >= 2 { + let theKey = String(neta[1]) + let theValue = String(neta[0]) + if !neta[0].isEmpty, !neta[1].isEmpty, line.first != "#" { + mapSymbols[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!) + } + } + } + strZhuyinwen.ranges(splitBy: "\n").forEach { + let neta = strZhuyinwen[$0].split(separator: " ") + let line = String(strZhuyinwen[$0]) + if neta.count >= 2 { + let theKey = String(neta[1]) + let theValue = String(neta[0]) + if !neta[0].isEmpty, !neta[1].isEmpty, line.first != "#" { + mapZhuyinwen[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!) + } + } + } + strCNS.ranges(splitBy: "\n").forEach { + let neta = strCNS[$0].split(separator: " ") + let line = String(strCNS[$0]) + if neta.count >= 2 { + let theKey = String(neta[1]) + let theValue = String(neta[0]) + if !neta[0].isEmpty, !neta[1].isEmpty, line.first != "#" { + mapCNS[cnvPhonabetToASCII(theKey), default: []].append(theValue.data(using: .utf8)!) + } + } + } + NSLog(" - \(i18n): 要寫入檔案的內容編譯完畢。") + do { + try PropertyListSerialization.data(fromPropertyList: mapSymbols, format: .binary, options: 0).write( + to: URL(fileURLWithPath: urlPlistSymbols)) + try PropertyListSerialization.data(fromPropertyList: mapZhuyinwen, format: .binary, options: 0).write( + to: URL(fileURLWithPath: urlPlistZhuyinwen)) + try PropertyListSerialization.data(fromPropertyList: mapCNS, format: .binary, options: 0).write( + to: URL(fileURLWithPath: urlPlistCNS)) + } catch { + NSLog(" - \(i18n): Error on writing strings to file: \(error)") + } + NSLog(" - \(i18n): 寫入完成。") +} + +// MARK: - 主執行緒 func main() { + NSLog("// 準備編譯符號表情ㄅ文語料檔案。") + commonFileOutput() NSLog("// 準備編譯繁體中文核心語料檔案。") fileOutput(isCHS: false) NSLog("// 準備編譯簡體中文核心語料檔案。") From 975a121c288034ba94a23afac15e9a8ec2f23b04 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 21:56:39 +0800 Subject: [PATCH 09/14] Data // Generate plist-formatted factory dictionary data. --- Source/Data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Data b/Source/Data index 6c4d659d..b92e458d 160000 --- a/Source/Data +++ b/Source/Data @@ -1 +1 @@ -Subproject commit 6c4d659d148ef5be3255427bfd4429fa8690631d +Subproject commit b92e458ddda22f43e2a0e9b0b7a2b2aa6455fab2 From 0d84dcf41c45c8b72fbb17531c85c3bd1b3b62f3 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 22:17:15 +0800 Subject: [PATCH 10/14] Xcode // Add LMCoreNS & compiled plists to app bundle. --- .../LangModelRelated/SubLMs/lmCoreNS.swift | 171 ++++++++++++++++++ vChewing.xcodeproj/project.pbxproj | 44 +++-- 2 files changed, 195 insertions(+), 20 deletions(-) create mode 100644 Source/Modules/LangModelRelated/SubLMs/lmCoreNS.swift diff --git a/Source/Modules/LangModelRelated/SubLMs/lmCoreNS.swift b/Source/Modules/LangModelRelated/SubLMs/lmCoreNS.swift new file mode 100644 index 00000000..7e4eacb6 --- /dev/null +++ b/Source/Modules/LangModelRelated/SubLMs/lmCoreNS.swift @@ -0,0 +1,171 @@ +// Copyright (c) 2021 and onwards The vChewing Project (MIT-NTL License). +/* +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +1. The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +2. No trademark license is granted to use the trade names, trademarks, service +marks, or product names of Contributor, except as required to fulfill notice +requirements above. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +/// 與之前的 LMCore 不同,LMCoreNS 直接讀取 plist。 +/// 這樣一來可以節省在舊 mac 機種內的資料讀入速度。 + +import Foundation + +extension vChewing { + @frozen public struct LMCoreNS { + var rangeMap: [String: [Data]] = [:] + var strData: String = "" + var shouldReverse: Bool = false + var allowConsolidation: Bool = false + var defaultScore: Double = 0 + var shouldForceDefaultScore: Bool = false + + public var count: Int { + rangeMap.count + } + + public init( + reverse: Bool = false, consolidate: Bool = false, defaultScore scoreDefault: Double = 0, + forceDefaultScore: Bool = false + ) { + rangeMap = [:] + allowConsolidation = consolidate + shouldReverse = reverse + defaultScore = scoreDefault + shouldForceDefaultScore = forceDefaultScore + } + + public func isLoaded() -> Bool { + !rangeMap.isEmpty + } + + @discardableResult public mutating func open(_ path: String) -> Bool { + if isLoaded() { + return false + } + + if allowConsolidation { + LMConsolidator.fixEOF(path: path) + LMConsolidator.consolidate(path: path, pragma: true) + } + + do { + let rawData = try Data(contentsOf: URL(fileURLWithPath: path)) + let rawPlist = try PropertyListSerialization.propertyList(from: rawData, format: nil) as! [String: [Data]] + rangeMap = rawPlist + } catch { + IME.prtDebugIntel("↑ Exception happened when reading plist file at: \(path).") + return false + } + + return true + } + + public mutating func close() { + if isLoaded() { + rangeMap.removeAll() + } + } + + // MARK: - Advanced features + + public func dump() { + var strDump = "" + for entry in rangeMap { + let netaSets: [Data] = entry.value + let theKey = entry.key + for netaSet in netaSets { + let strNetaSet = String(decoding: netaSet, as: UTF8.self) + let neta = Array(strNetaSet.components(separatedBy: " ").reversed()) + let theValue = neta[0] + var theScore = defaultScore + if neta.count >= 2, !shouldForceDefaultScore { + theScore = .init(String(neta[1])) ?? defaultScore + } + strDump += "\(cnvPhonabetToASCII(theKey)) \(theValue) \(theScore)\n" + } + } + IME.prtDebugIntel(strDump) + } + + public func bigramsForKeys(precedingKey: String, key: String) -> [Megrez.Bigram] { + // 這裡用了點廢話處理,不然函數構建體會被 Swift 格式整理工具給毀掉。 + // 其實只要一句「[Megrez.Bigram]()」就夠了。 + precedingKey == key ? [Megrez.Bigram]() : [Megrez.Bigram]() + } + + public func unigramsFor(key: String) -> [Megrez.Unigram] { + var grams: [Megrez.Unigram] = [] + if let arrRangeRecords: [Data] = rangeMap[cnvPhonabetToASCII(key)] { + for netaSet in arrRangeRecords { + let strNetaSet = String(decoding: netaSet, as: UTF8.self) + let neta = Array(strNetaSet.split(separator: " ").reversed()) + let theValue: String = String(neta[0]) + let kvPair = Megrez.KeyValuePair(key: key, value: theValue) + var theScore = defaultScore + if neta.count >= 2, !shouldForceDefaultScore { + theScore = .init(String(neta[1])) ?? defaultScore + } + if theScore > 0 { + theScore *= -1 // 應對可能忘記寫負號的情形 + } + grams.append(Megrez.Unigram(keyValue: kvPair, score: theScore)) + } + } + return grams + } + + public func hasUnigramsFor(key: String) -> Bool { + rangeMap[cnvPhonabetToASCII(key)] != nil + } + + func cnvPhonabetToASCII(_ incoming: String) -> String { + let dicPhonabet2ASCII = [ + "ㄅ": "b", "ㄆ": "p", "ㄇ": "m", "ㄈ": "f", "ㄉ": "d", "ㄊ": "t", "ㄋ": "n", "ㄌ": "l", "ㄍ": "g", "ㄎ": "k", "ㄏ": "h", + "ㄐ": "j", "ㄑ": "q", "ㄒ": "x", "ㄓ": "Z", "ㄔ": "C", "ㄕ": "S", "ㄖ": "r", "ㄗ": "z", "ㄘ": "c", "ㄙ": "s", "ㄧ": "i", + "ㄨ": "u", "ㄩ": "v", "ㄚ": "a", "ㄛ": "o", "ㄜ": "e", "ㄝ": "E", "ㄞ": "B", "ㄟ": "P", "ㄠ": "M", "ㄡ": "F", "ㄢ": "D", + "ㄣ": "T", "ㄤ": "N", "ㄥ": "L", "ㄦ": "R", "ˊ": "2", "ˇ": "3", "ˋ": "4", "˙": "5", + ] + var strOutput = incoming + if !strOutput.contains("_") { + for entry in dicPhonabet2ASCII { + strOutput = strOutput.replacingOccurrences(of: entry.key, with: entry.value) + } + } + return strOutput + } + + func restorePhonabetFromASCII(_ incoming: String) -> String { + let dicPhonabet4ASCII = [ + "b": "ㄅ", "p": "ㄆ", "m": "ㄇ", "f": "ㄈ", "d": "ㄉ", "t": "ㄊ", "n": "ㄋ", "l": "ㄌ", "g": "ㄍ", "k": "ㄎ", "h": "ㄏ", + "j": "ㄐ", "q": "ㄑ", "x": "ㄒ", "Z": "ㄓ", "C": "ㄔ", "S": "ㄕ", "r": "ㄖ", "z": "ㄗ", "c": "ㄘ", "s": "ㄙ", "i": "ㄧ", + "u": "ㄨ", "v": "ㄩ", "a": "ㄚ", "o": "ㄛ", "e": "ㄜ", "E": "ㄝ", "B": "ㄞ", "P": "ㄟ", "M": "ㄠ", "F": "ㄡ", "D": "ㄢ", + "T": "ㄣ", "N": "ㄤ", "L": "ㄥ", "R": "ㄦ", "2": "ˊ", "3": "ˇ", "4": "ˋ", "5": "˙", + ] + + var strOutput = incoming + if !strOutput.contains("_") { + for entry in dicPhonabet4ASCII { + strOutput = strOutput.replacingOccurrences(of: entry.key, with: entry.value) + } + } + return strOutput + } + } +} diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index 2fe1eb44..925e5ee5 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -9,10 +9,6 @@ /* Begin PBXBuildFile section */ 5B0AF8B527B2C8290096FE54 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0AF8B427B2C8290096FE54 /* StringExtension.swift */; }; 5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B11328827B94CFB00E58451 /* AppleKeyboardConverter.swift */; }; - 5B27AD6A27CB1F9B000ED75B /* data-symbols.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B27AD6827CB1F9B000ED75B /* data-symbols.txt */; }; - 5B27AD6B27CB1F9B000ED75B /* data-zhuyinwen.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B27AD6927CB1F9B000ED75B /* data-zhuyinwen.txt */; }; - 5B2DB16F27AF6891006D874E /* data-chs.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B2DB16D27AF6891006D874E /* data-chs.txt */; }; - 5B2DB17027AF6891006D874E /* data-cht.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5B2DB16E27AF6891006D874E /* data-cht.txt */; }; 5B3133BF280B229700A4A505 /* KeyHandler_States.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3133BE280B229700A4A505 /* KeyHandler_States.swift */; }; 5B38F59A281E2E49007D5F5D /* 6_Unigram.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1D15FC0EB100ABF4B3 /* 6_Unigram.swift */; }; 5B38F59B281E2E49007D5F5D /* 7_KeyValuePair.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1815FC0EB100ABF4B3 /* 7_KeyValuePair.swift */; }; @@ -26,6 +22,7 @@ 5B38F5A4281E2E49007D5F5D /* 5_LanguageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D4F1915FC0EB100ABF4B3 /* 5_LanguageModel.swift */; }; 5B40730C281672610023DFFF /* lmAssociates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B407309281672610023DFFF /* lmAssociates.swift */; }; 5B40730D281672610023DFFF /* lmReplacements.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B40730A281672610023DFFF /* lmReplacements.swift */; }; + 5B54E743283A7D89001ECBDC /* lmCoreNS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B54E742283A7D89001ECBDC /* lmCoreNS.swift */; }; 5B5E535227EF261400C6AA1E /* IME.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B5E535127EF261400C6AA1E /* IME.swift */; }; 5B61B0CA280BEFD4002E3CFA /* KeyHandler_Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B61B0C9280BEFD4002E3CFA /* KeyHandler_Misc.swift */; }; 5B62A32927AE77D100A19448 /* FSEventStreamHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A32827AE77D100A19448 /* FSEventStreamHelper.swift */; }; @@ -84,7 +81,6 @@ 5BC2652227E04B7E00700291 /* uninstall.sh in Resources */ = {isa = PBXBuildFile; fileRef = 5BC2652127E04B7B00700291 /* uninstall.sh */; }; 5BD0113B28180D6100609769 /* LMInstantiator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0113A28180D6100609769 /* LMInstantiator.swift */; }; 5BD0113D2818543900609769 /* KeyHandler_Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0113C2818543900609769 /* KeyHandler_Core.swift */; }; - 5BD05B8127B22F3C004C4F1D /* char-kanji-cns.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */; }; 5BD05BCA27B2A43D004C4F1D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6A2E40F5253A69DA00D1AE1D /* Images.xcassets */; }; 5BD05C5D27B2BBA9004C4F1D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05C5B27B2BBA9004C4F1D /* Main.storyboard */; }; 5BD05C6627B2BBEF004C4F1D /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD05C6127B2BBEF004C4F1D /* Document.swift */; }; @@ -96,6 +92,11 @@ 5BDCBB2E27B4E67A00D0CC59 /* vChewingPhraseEditor.app in Resources */ = {isa = PBXBuildFile; fileRef = 5BD05BB827B2A429004C4F1D /* vChewingPhraseEditor.app */; }; 5BE78BD927B3775B005EA1BE /* ctlAboutWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE78BD827B37750005EA1BE /* ctlAboutWindow.swift */; }; 5BE78BDD27B3776D005EA1BE /* frmAboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BE78BDA27B37764005EA1BE /* frmAboutWindow.xib */; }; + 5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.plist */; }; + 5BEDB722283B4C250078EB25 /* data-zhuyinwen.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */; }; + 5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.plist */; }; + 5BEDB724283B4C250078EB25 /* data-symbols.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */; }; + 5BEDB725283B4C250078EB25 /* data-chs.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */; }; 5BF8423127BAA942008E7E4C /* vChewingKanjiConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF8423027BAA942008E7E4C /* vChewingKanjiConverter.swift */; }; 6A187E2616004C5900466B2E /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6A187E2816004C5900466B2E /* MainMenu.xib */; }; 6A225A1F23679F2600F685C6 /* NotarizedArchives in Resources */ = {isa = PBXBuildFile; fileRef = 6A225A1E23679F2600F685C6 /* NotarizedArchives */; }; @@ -190,15 +191,12 @@ 5B18BA7227C7BD8B0056EB19 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; 5B18BA7327C7BD8C0056EB19 /* LICENSE-JPN.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "LICENSE-JPN.txt"; sourceTree = ""; }; 5B18BA7427C7BD8C0056EB19 /* LICENSE-CHT.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "LICENSE-CHT.txt"; sourceTree = ""; }; - 5B27AD6827CB1F9B000ED75B /* data-symbols.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-symbols.txt"; path = "Data/components/common/data-symbols.txt"; sourceTree = ""; }; - 5B27AD6927CB1F9B000ED75B /* data-zhuyinwen.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-zhuyinwen.txt"; path = "Data/components/common/data-zhuyinwen.txt"; sourceTree = ""; }; - 5B2DB16D27AF6891006D874E /* data-chs.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-chs.txt"; path = "Data/data-chs.txt"; sourceTree = ""; }; - 5B2DB16E27AF6891006D874E /* data-cht.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "data-cht.txt"; path = "Data/data-cht.txt"; sourceTree = ""; }; 5B2DB17127AF8771006D874E /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = Data/Makefile; sourceTree = ""; }; 5B30F11227BA568800484E24 /* vChewingKeyLayout.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = vChewingKeyLayout.bundle; sourceTree = ""; }; 5B3133BE280B229700A4A505 /* KeyHandler_States.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_States.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 5B407309281672610023DFFF /* lmAssociates.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmAssociates.swift; sourceTree = ""; usesTabs = 0; }; 5B40730A281672610023DFFF /* lmReplacements.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = lmReplacements.swift; sourceTree = ""; usesTabs = 0; }; + 5B54E742283A7D89001ECBDC /* lmCoreNS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = lmCoreNS.swift; sourceTree = ""; }; 5B5E535127EF261400C6AA1E /* IME.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = IME.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 5B61B0C9280BEFD4002E3CFA /* KeyHandler_Misc.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = KeyHandler_Misc.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 5B62A32827AE77D100A19448 /* FSEventStreamHelper.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = FSEventStreamHelper.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; @@ -261,7 +259,6 @@ 5BC2652127E04B7B00700291 /* uninstall.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; lineEnding = 0; path = uninstall.sh; sourceTree = ""; }; 5BD0113A28180D6100609769 /* LMInstantiator.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = LMInstantiator.swift; sourceTree = ""; usesTabs = 0; }; 5BD0113C2818543900609769 /* KeyHandler_Core.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = KeyHandler_Core.swift; sourceTree = ""; usesTabs = 0; }; - 5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "char-kanji-cns.txt"; path = "Data/components/common/char-kanji-cns.txt"; sourceTree = ""; }; 5BD05BB827B2A429004C4F1D /* vChewingPhraseEditor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewingPhraseEditor.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5BD05BC627B2A42A004C4F1D /* vChewingPhraseEditor.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = vChewingPhraseEditor.entitlements; sourceTree = ""; }; 5BD05C5C27B2BBA9004C4F1D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -284,6 +281,11 @@ 5BE78BDB27B37764005EA1BE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/frmAboutWindow.xib; sourceTree = ""; }; 5BE78BDF27B37968005EA1BE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmAboutWindow.strings; sourceTree = ""; }; 5BE8A8C4281EE65300197741 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = ""; }; + 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-chs.plist"; path = "Data/data-chs.plist"; sourceTree = ""; }; + 5BEDB71D283B4AEA0078EB25 /* data-cns.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-cns.plist"; path = "Data/data-cns.plist"; sourceTree = ""; }; + 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-symbols.plist"; path = "Data/data-symbols.plist"; sourceTree = ""; }; + 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-zhuyinwen.plist"; path = "Data/data-zhuyinwen.plist"; sourceTree = ""; }; + 5BEDB720283B4AEA0078EB25 /* data-cht.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-cht.plist"; path = "Data/data-cht.plist"; sourceTree = ""; }; 5BF8423027BAA942008E7E4C /* vChewingKanjiConverter.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = vChewingKanjiConverter.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 5BFDF48C27B51867009523B6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Main.strings"; sourceTree = ""; }; 6A0D4EA215FC0D2D00ABF4B3 /* vChewing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewing.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -380,6 +382,7 @@ children = ( 5B407309281672610023DFFF /* lmAssociates.swift */, 5B887F2F2826AEA400B6651E /* lmCoreEX.swift */, + 5B54E742283A7D89001ECBDC /* lmCoreNS.swift */, 5B40730A281672610023DFFF /* lmReplacements.swift */, 5BA0DF2E2817857D009E73BB /* lmUserOverride.swift */, ); @@ -548,11 +551,11 @@ 5B62A35027AE7F6600A19448 /* Data */ = { isa = PBXGroup; children = ( - 5BD05B8027B22F3C004C4F1D /* char-kanji-cns.txt */, - 5B2DB16D27AF6891006D874E /* data-chs.txt */, - 5B2DB16E27AF6891006D874E /* data-cht.txt */, - 5B27AD6827CB1F9B000ED75B /* data-symbols.txt */, - 5B27AD6927CB1F9B000ED75B /* data-zhuyinwen.txt */, + 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */, + 5BEDB720283B4AEA0078EB25 /* data-cht.plist */, + 5BEDB71D283B4AEA0078EB25 /* data-cns.plist */, + 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */, + 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */, 5B2DB17127AF8771006D874E /* Makefile */, ); name = Data; @@ -956,23 +959,23 @@ D4E33D8A27A838CF006DB1CF /* Localizable.strings in Resources */, 5BDCBB2E27B4E67A00D0CC59 /* vChewingPhraseEditor.app in Resources */, 5BBBB76027AED54C0023B93A /* Fart.m4a in Resources */, - 5B27AD6A27CB1F9B000ED75B /* data-symbols.txt in Resources */, 6A2E40F6253A69DA00D1AE1D /* Images.xcassets in Resources */, D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */, 5BBBB76B27AED5DB0023B93A /* frmNonModalAlertWindow.xib in Resources */, + 5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */, + 5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */, + 5BEDB725283B4C250078EB25 /* data-chs.plist in Resources */, 5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */, 5BBBB77527AED70B0023B93A /* MenuIcon-SCVIM.png in Resources */, + 5BEDB722283B4C250078EB25 /* data-zhuyinwen.plist in Resources */, + 5BEDB724283B4C250078EB25 /* data-symbols.plist in Resources */, 5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */, - 5BD05B8127B22F3C004C4F1D /* char-kanji-cns.txt in Resources */, - 5B27AD6B27CB1F9B000ED75B /* data-zhuyinwen.txt in Resources */, - 5B2DB17027AF6891006D874E /* data-cht.txt in Resources */, 5BBBB77327AED70B0023B93A /* MenuIcon-TCVIM@2x.png in Resources */, 5BBBB77627AED70B0023B93A /* MenuIcon-TCVIM.png in Resources */, 6A187E2616004C5900466B2E /* MainMenu.xib in Resources */, 5BBBB75F27AED54C0023B93A /* Beep.m4a in Resources */, 5BC2652227E04B7E00700291 /* uninstall.sh in Resources */, 5BAD0CD527D701F6003D127F /* vChewingKeyLayout.bundle in Resources */, - 5B2DB16F27AF6891006D874E /* data-chs.txt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1064,6 +1067,7 @@ 5BA9FD4A27FEF3C9002DE248 /* PreferencesTabViewController.swift in Sources */, 5B62A34A27AE7CD900A19448 /* NotifierController.swift in Sources */, 5B11328927B94CFB00E58451 /* AppleKeyboardConverter.swift in Sources */, + 5B54E743283A7D89001ECBDC /* lmCoreNS.swift in Sources */, 5B62A32927AE77D100A19448 /* FSEventStreamHelper.swift in Sources */, 5B38F59B281E2E49007D5F5D /* 7_KeyValuePair.swift in Sources */, 5B62A33627AE795800A19448 /* mgrPrefs.swift in Sources */, From f7f2e3d0080d8bad24809069eb29b83ecd6133f9 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 23:12:54 +0800 Subject: [PATCH 11/14] LMInstantiator // Use LMCoreNS instead for factorial dictionaries. --- .../LangModelRelated/LMInstantiator.swift | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Source/Modules/LangModelRelated/LMInstantiator.swift b/Source/Modules/LangModelRelated/LMInstantiator.swift index 00794148..6e3bfa41 100644 --- a/Source/Modules/LangModelRelated/LMInstantiator.swift +++ b/Source/Modules/LangModelRelated/LMInstantiator.swift @@ -31,10 +31,10 @@ import Foundation // 簡體中文模式與繁體中文模式共用全字庫擴展模組,故單獨處理。 // 塞在 LMInstantiator 內的話,每個模式都會讀入一份全字庫,會多佔用 100MB 記憶體。 -private var lmCNS = vChewing.LMCoreEX( +private var lmCNS = vChewing.LMCoreNS( reverse: true, consolidate: false, defaultScore: -11.0, forceDefaultScore: false ) -private var lmSymbols = vChewing.LMCoreEX( +private var lmSymbols = vChewing.LMCoreNS( reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: false ) @@ -73,14 +73,16 @@ extension vChewing { /// LMCoreEX 的辭典陣列不承載 Unigram 本體、而是承載索引範圍,這樣可以節約記憶體。 /// 一個 LMCoreEX 就可以滿足威注音幾乎所有語言模組副本的需求,當然也有這兩個例外: /// LMReplacements 與 LMAssociates 分別擔當語彙置換表資料與使用者聯想詞的資料承載工作。 + /// 但是,LMCoreEX 對 2010-2013 年等舊 mac 機種而言,讀取速度異常緩慢。 + /// 於是 LMCoreNS 就出場了,專門用來讀取原廠的 plist 格式的辭典。 // 聲明原廠語言模組 /// Reverse 的話,第一欄是注音,第二欄是對應的漢字,第三欄是可能的權重。 /// 不 Reverse 的話,第一欄是漢字,第二欄是對應的注音,第三欄是可能的權重。 - var lmCore = LMCoreEX( + var lmCore = LMCoreNS( reverse: false, consolidate: false, defaultScore: -9.9, forceDefaultScore: false ) - var lmMisc = LMCoreEX( + var lmMisc = LMCoreNS( reverse: true, consolidate: false, defaultScore: -1.0, forceDefaultScore: false ) @@ -103,7 +105,7 @@ extension vChewing { // 以下這些函數命名暫時保持原樣,等弒神行動徹底結束了再調整。 - public func isLanguageModelLoaded() -> Bool { lmCore.isLoaded() } + public var isLanguageModelLoaded: Bool { lmCore.isLoaded() } public func loadLanguageModel(path: String) { if FileManager.default.isReadableFile(atPath: path) { lmCore.open(path) @@ -113,7 +115,7 @@ extension vChewing { } } - public func isCNSDataLoaded() -> Bool { lmCNS.isLoaded() } + public var isCNSDataLoaded: Bool { lmCNS.isLoaded() } public func loadCNSData(path: String) { if FileManager.default.isReadableFile(atPath: path) { lmCNS.open(path) @@ -123,7 +125,7 @@ extension vChewing { } } - public func isMiscDataLoaded() -> Bool { lmMisc.isLoaded() } + public var isMiscDataLoaded: Bool { lmMisc.isLoaded() } public func loadMiscData(path: String) { if FileManager.default.isReadableFile(atPath: path) { lmMisc.open(path) @@ -133,7 +135,7 @@ extension vChewing { } } - public func isSymbolDataLoaded() -> Bool { lmSymbols.isLoaded() } + public var isSymbolDataLoaded: Bool { lmSymbols.isLoaded() } public func loadSymbolData(path: String) { if FileManager.default.isReadableFile(atPath: path) { lmSymbols.open(path) From b95abffb7e140399374f92ff3974bd0286225945 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 22 May 2022 23:13:00 +0800 Subject: [PATCH 12/14] mgrLM // Cope with changes happened in LMInstantiator. --- .../LangModelRelated/mgrLangModel.swift | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Source/Modules/LangModelRelated/mgrLangModel.swift b/Source/Modules/LangModelRelated/mgrLangModel.swift index 8850e23e..2360ff47 100644 --- a/Source/Modules/LangModelRelated/mgrLangModel.swift +++ b/Source/Modules/LangModelRelated/mgrLangModel.swift @@ -51,25 +51,25 @@ enum mgrLangModel { } public static func loadDataModels() { - if !gLangModelCHT.isCNSDataLoaded() { - gLangModelCHT.loadCNSData(path: getBundleDataPath("char-kanji-cns")) + if !gLangModelCHT.isCNSDataLoaded { + gLangModelCHT.loadCNSData(path: getBundleDataPath("data-cns")) } - if !gLangModelCHT.isMiscDataLoaded() { + if !gLangModelCHT.isMiscDataLoaded { gLangModelCHT.loadMiscData(path: getBundleDataPath("data-zhuyinwen")) } - if !gLangModelCHT.isSymbolDataLoaded() { + if !gLangModelCHT.isSymbolDataLoaded { gLangModelCHT.loadSymbolData(path: getBundleDataPath("data-symbols")) } - if !gLangModelCHS.isCNSDataLoaded() { - gLangModelCHS.loadCNSData(path: getBundleDataPath("char-kanji-cns")) + if !gLangModelCHS.isCNSDataLoaded { + gLangModelCHS.loadCNSData(path: getBundleDataPath("data-cns")) } - if !gLangModelCHS.isMiscDataLoaded() { + if !gLangModelCHS.isMiscDataLoaded { gLangModelCHS.loadMiscData(path: getBundleDataPath("data-zhuyinwen")) } - if !gLangModelCHS.isSymbolDataLoaded() { + if !gLangModelCHS.isSymbolDataLoaded { gLangModelCHS.loadSymbolData(path: getBundleDataPath("data-symbols")) } - if !gLangModelCHT.isLanguageModelLoaded() { + if !gLangModelCHT.isLanguageModelLoaded { NotifierController.notify( message: String( format: "%@", NSLocalizedString("Loading CHT Core Dict...", comment: "") @@ -82,7 +82,7 @@ enum mgrLangModel { ) ) } - if !gLangModelCHS.isLanguageModelLoaded() { + if !gLangModelCHS.isLanguageModelLoaded { NotifierController.notify( message: String( format: "%@", NSLocalizedString("Loading CHS Core Dict...", comment: "") @@ -99,16 +99,16 @@ enum mgrLangModel { public static func loadDataModel(_ mode: InputMode) { if mode == InputMode.imeModeCHS { - if !gLangModelCHS.isMiscDataLoaded() { + if !gLangModelCHS.isMiscDataLoaded { gLangModelCHS.loadMiscData(path: getBundleDataPath("data-zhuyinwen")) } - if !gLangModelCHS.isSymbolDataLoaded() { + if !gLangModelCHS.isSymbolDataLoaded { gLangModelCHS.loadSymbolData(path: getBundleDataPath("data-symbols")) } - if !gLangModelCHS.isCNSDataLoaded() { - gLangModelCHS.loadCNSData(path: getBundleDataPath("char-kanji-cns")) + if !gLangModelCHS.isCNSDataLoaded { + gLangModelCHS.loadCNSData(path: getBundleDataPath("data-cns")) } - if !gLangModelCHS.isLanguageModelLoaded() { + if !gLangModelCHS.isLanguageModelLoaded { NotifierController.notify( message: String( format: "%@", NSLocalizedString("Loading CHS Core Dict...", comment: "") @@ -122,16 +122,16 @@ enum mgrLangModel { ) } } else if mode == InputMode.imeModeCHT { - if !gLangModelCHT.isMiscDataLoaded() { + if !gLangModelCHT.isMiscDataLoaded { gLangModelCHT.loadMiscData(path: getBundleDataPath("data-zhuyinwen")) } - if !gLangModelCHT.isSymbolDataLoaded() { + if !gLangModelCHT.isSymbolDataLoaded { gLangModelCHT.loadSymbolData(path: getBundleDataPath("data-symbols")) } - if !gLangModelCHT.isCNSDataLoaded() { - gLangModelCHT.loadCNSData(path: getBundleDataPath("char-kanji-cns")) + if !gLangModelCHT.isCNSDataLoaded { + gLangModelCHT.loadCNSData(path: getBundleDataPath("data-cns")) } - if !gLangModelCHT.isLanguageModelLoaded() { + if !gLangModelCHT.isLanguageModelLoaded { NotifierController.notify( message: String( format: "%@", NSLocalizedString("Loading CHT Core Dict...", comment: "") @@ -212,7 +212,7 @@ enum mgrLangModel { // MARK: - 獲取當前輸入法封包內的原廠核心語彙檔案所在路徑 static func getBundleDataPath(_ filenameSansExt: String) -> String { - Bundle.main.path(forResource: filenameSansExt, ofType: "txt")! + Bundle.main.path(forResource: filenameSansExt, ofType: "plist")! } // MARK: - 使用者語彙檔案的具體檔案名稱路徑定義 From 0f2eaba0fd34b507d1bef4d7660846cc50219e2f Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Mon, 23 May 2022 16:26:35 +0800 Subject: [PATCH 13/14] Tekkon 1.1.3 // Add support of "biang" and "duang". --- .../ControllerModules/SyllableComposer.swift | 426 +++++++++--------- 1 file changed, 221 insertions(+), 205 deletions(-) diff --git a/Source/Modules/ControllerModules/SyllableComposer.swift b/Source/Modules/ControllerModules/SyllableComposer.swift index 827963f6..70065a43 100644 --- a/Source/Modules/ControllerModules/SyllableComposer.swift +++ b/Source/Modules/ControllerModules/SyllableComposer.swift @@ -869,7 +869,7 @@ public struct Tekkon { ["ㄕㄨㄢ", "shuan"], ["ㄕㄨㄣ", "shun"], ["ㄕㄨㄤ", "shuang"], ["ㄖㄨㄛ", "ruo"], ["ㄖㄨㄟ", "rui"], ["ㄖㄨㄢ", "ruan"], ["ㄖㄨㄣ", "run"], ["ㄖㄨㄥ", "rong"], ["ㄗㄨㄛ", "zuo"], ["ㄗㄨㄟ", "zui"], ["ㄗㄨㄢ", "zuan"], ["ㄗㄨㄣ", "zun"], ["ㄗㄨㄥ", "zong"], ["ㄘㄨㄛ", "cuo"], ["ㄘㄨㄟ", "cui"], ["ㄘㄨㄢ", "cuan"], ["ㄘㄨㄣ", "cun"], ["ㄘㄨㄥ", "cong"], ["ㄙㄨㄛ", "suo"], ["ㄙㄨㄟ", "sui"], - ["ㄙㄨㄢ", "suan"], ["ㄙㄨㄣ", "sun"], ["ㄙㄨㄥ", "song"], + ["ㄙㄨㄢ", "suan"], ["ㄙㄨㄣ", "sun"], ["ㄙㄨㄥ", "song"], ["ㄅㄧㄤ", "biang"], ["ㄉㄨㄤ", "duang"], ["ㄅㄚ", "ba"], ["ㄅㄛ", "bo"], ["ㄅㄞ", "bai"], ["ㄅㄟ", "bei"], ["ㄅㄠ", "bao"], ["ㄅㄢ", "ban"], ["ㄅㄣ", "ben"], ["ㄅㄤ", "bang"], ["ㄅㄥ", "beng"], ["ㄅㄧ", "bi"], ["ㄅㄨ", "bu"], ["ㄆㄚ", "pa"], ["ㄆㄛ", "po"], ["ㄆㄞ", "pai"], @@ -956,15 +956,16 @@ public struct Tekkon { ] /// 漢語拼音排列專用處理陣列 static let mapHanyuPinyin: [String: String] = [ - "chuang": "ㄔㄨㄤ", "shuang": "ㄕㄨㄤ", "zhuang": "ㄓㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chong": "ㄔㄨㄥ", "chuai": "ㄔㄨㄞ", - "chuan": "ㄔㄨㄢ", "guang": "ㄍㄨㄤ", "huang": "ㄏㄨㄤ", "jiang": "ㄐㄧㄤ", "jiong": "ㄐㄩㄥ", "kiang": "ㄎㄧㄤ", "kuang": "ㄎㄨㄤ", - "liang": "ㄌㄧㄤ", "niang": "ㄋㄧㄤ", "qiang": "ㄑㄧㄤ", "qiong": "ㄑㄩㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shuai": "ㄕㄨㄞ", - "shuan": "ㄕㄨㄢ", "xiang": "ㄒㄧㄤ", "xiong": "ㄒㄩㄥ", "zhang": "ㄓㄤ", "zheng": "ㄓㄥ", "zhong": "ㄓㄨㄥ", "zhuai": "ㄓㄨㄞ", - "zhuan": "ㄓㄨㄢ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "bian": "ㄅㄧㄢ", "biao": "ㄅㄧㄠ", "bing": "ㄅㄧㄥ", "cang": "ㄘㄤ", "ceng": "ㄘㄥ", - "chai": "ㄔㄞ", "chan": "ㄔㄢ", "chao": "ㄔㄠ", "chen": "ㄔㄣ", "chou": "ㄔㄡ", "chua": "ㄔㄨㄚ", "chui": "ㄔㄨㄟ", "chun": "ㄔㄨㄣ", - "chuo": "ㄔㄨㄛ", "cong": "ㄘㄨㄥ", "cuan": "ㄘㄨㄢ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", "dian": "ㄉㄧㄢ", "diao": "ㄉㄧㄠ", - "ding": "ㄉㄧㄥ", "dong": "ㄉㄨㄥ", "duan": "ㄉㄨㄢ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fiao": "ㄈㄧㄠ", "fong": "ㄈㄨㄥ", "gang": "ㄍㄤ", - "geng": "ㄍㄥ", "giao": "ㄍㄧㄠ", "gong": "ㄍㄨㄥ", "guai": "ㄍㄨㄞ", "guan": "ㄍㄨㄢ", "hang": "ㄏㄤ", "heng": "ㄏㄥ", "hong": "ㄏㄨㄥ", + "chuang": "ㄔㄨㄤ", "shuang": "ㄕㄨㄤ", "zhuang": "ㄓㄨㄤ", + "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chong": "ㄔㄨㄥ", "chuai": "ㄔㄨㄞ", "chuan": "ㄔㄨㄢ", "guang": "ㄍㄨㄤ", "huang": "ㄏㄨㄤ", + "jiang": "ㄐㄧㄤ", "jiong": "ㄐㄩㄥ", "kiang": "ㄎㄧㄤ", "kuang": "ㄎㄨㄤ", "biang": "ㄅㄧㄤ", "duang": "ㄉㄨㄤ", "liang": "ㄌㄧㄤ", + "niang": "ㄋㄧㄤ", "qiang": "ㄑㄧㄤ", "qiong": "ㄑㄩㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shuai": "ㄕㄨㄞ", "shuan": "ㄕㄨㄢ", + "xiang": "ㄒㄧㄤ", "xiong": "ㄒㄩㄥ", "zhang": "ㄓㄤ", "zheng": "ㄓㄥ", "zhong": "ㄓㄨㄥ", "zhuai": "ㄓㄨㄞ", "zhuan": "ㄓㄨㄢ", + "bang": "ㄅㄤ", "beng": "ㄅㄥ", "bian": "ㄅㄧㄢ", "biao": "ㄅㄧㄠ", "bing": "ㄅㄧㄥ", "cang": "ㄘㄤ", "ceng": "ㄘㄥ", "chai": "ㄔㄞ", + "chan": "ㄔㄢ", "chao": "ㄔㄠ", "chen": "ㄔㄣ", "chou": "ㄔㄡ", "chua": "ㄔㄨㄚ", "chui": "ㄔㄨㄟ", "chun": "ㄔㄨㄣ", "chuo": "ㄔㄨㄛ", + "cong": "ㄘㄨㄥ", "cuan": "ㄘㄨㄢ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", "dian": "ㄉㄧㄢ", "diao": "ㄉㄧㄠ", "ding": "ㄉㄧㄥ", + "dong": "ㄉㄨㄥ", "duan": "ㄉㄨㄢ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fiao": "ㄈㄧㄠ", "fong": "ㄈㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ", + "giao": "ㄍㄧㄠ", "gong": "ㄍㄨㄥ", "guai": "ㄍㄨㄞ", "guan": "ㄍㄨㄢ", "hang": "ㄏㄤ", "heng": "ㄏㄥ", "hong": "ㄏㄨㄥ", "huai": "ㄏㄨㄞ", "huan": "ㄏㄨㄢ", "jian": "ㄐㄧㄢ", "jiao": "ㄐㄧㄠ", "jing": "ㄐㄧㄥ", "juan": "ㄐㄩㄢ", "kang": "ㄎㄤ", "keng": "ㄎㄥ", "kong": "ㄎㄨㄥ", "kuai": "ㄎㄨㄞ", "kuan": "ㄎㄨㄢ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "lian": "ㄌㄧㄢ", "liao": "ㄌㄧㄠ", "ling": "ㄌㄧㄥ", "long": "ㄌㄨㄥ", "luan": "ㄌㄨㄢ", "lvan": "ㄌㄩㄢ", "mang": "ㄇㄤ", "meng": "ㄇㄥ", "mian": "ㄇㄧㄢ", @@ -999,33 +1000,36 @@ public struct Tekkon { "wan": "ㄨㄢ", "wei": "ㄨㄟ", "wen": "ㄨㄣ", "xia": "ㄒㄧㄚ", "xie": "ㄒㄧㄝ", "xin": "ㄒㄧㄣ", "xiu": "ㄒㄧㄡ", "xue": "ㄒㄩㄝ", "xun": "ㄒㄩㄣ", "yai": "ㄧㄞ", "yan": "ㄧㄢ", "yao": "ㄧㄠ", "yin": "ㄧㄣ", "you": "ㄧㄡ", "yue": "ㄩㄝ", "yun": "ㄩㄣ", "zai": "ㄗㄞ", "zan": "ㄗㄢ", "zao": "ㄗㄠ", "zei": "ㄗㄟ", "zen": "ㄗㄣ", "zha": "ㄓㄚ", "zhe": "ㄓㄜ", "zhi": "ㄓ", "zhu": "ㄓㄨ", - "zou": "ㄗㄡ", "zui": "ㄗㄨㄟ", "zun": "ㄗㄨㄣ", "zuo": "ㄗㄨㄛ", "ai": "ㄞ", "an": "ㄢ", "ao": "ㄠ", "ba": "ㄅㄚ", "bi": "ㄅㄧ", - "bo": "ㄅㄛ", "bu": "ㄅㄨ", "ca": "ㄘㄚ", "ce": "ㄘㄜ", "ci": "ㄘ", "cu": "ㄘㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", - "du": "ㄉㄨ", "eh": "ㄝ", "ei": "ㄟ", "en": "ㄣ", "er": "ㄦ", "fa": "ㄈㄚ", "fo": "ㄈㄛ", "fu": "ㄈㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", - "gi": "ㄍㄧ", "gu": "ㄍㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ", "ji": "ㄐㄧ", "ju": "ㄐㄩ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", - "ku": "ㄎㄨ", "la": "ㄌㄚ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lo": "ㄌㄛ", "lu": "ㄌㄨ", "lv": "ㄌㄩ", "ma": "ㄇㄚ", "me": "ㄇㄜ", - "mi": "ㄇㄧ", "mo": "ㄇㄛ", "mu": "ㄇㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "nv": "ㄋㄩ", "ou": "ㄡ", - "pa": "ㄆㄚ", "pi": "ㄆㄧ", "po": "ㄆㄛ", "pu": "ㄆㄨ", "qi": "ㄑㄧ", "qu": "ㄑㄩ", "re": "ㄖㄜ", "ri": "ㄖ", "ru": "ㄖㄨ", - "sa": "ㄙㄚ", "se": "ㄙㄜ", "si": "ㄙ", "su": "ㄙㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "wa": "ㄨㄚ", - "wo": "ㄨㄛ", "wu": "ㄨ", "xi": "ㄒㄧ", "xu": "ㄒㄩ", "ya": "ㄧㄚ", "ye": "ㄧㄝ", "yi": "ㄧ", "yo": "ㄧㄛ", "yu": "ㄩ", "za": "ㄗㄚ", - "ze": "ㄗㄜ", "zi": "ㄗ", "zu": "ㄗㄨ", "a": "ㄚ", "e": "ㄜ", "o": "ㄛ", "q": "ㄑ", + "zou": "ㄗㄡ", "zui": "ㄗㄨㄟ", "zun": "ㄗㄨㄣ", "zuo": "ㄗㄨㄛ", + "ai": "ㄞ", "an": "ㄢ", "ao": "ㄠ", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "bo": "ㄅㄛ", "bu": "ㄅㄨ", "ca": "ㄘㄚ", "ce": "ㄘㄜ", "ci": "ㄘ", + "cu": "ㄘㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "du": "ㄉㄨ", "eh": "ㄝ", "ei": "ㄟ", "en": "ㄣ", "er": "ㄦ", "fa": "ㄈㄚ", + "fo": "ㄈㄛ", "fu": "ㄈㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", "gi": "ㄍㄧ", "gu": "ㄍㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ", + "ji": "ㄐㄧ", "ju": "ㄐㄩ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", "ku": "ㄎㄨ", "la": "ㄌㄚ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lo": "ㄌㄛ", + "lu": "ㄌㄨ", "lv": "ㄌㄩ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mo": "ㄇㄛ", "mu": "ㄇㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ", + "ni": "ㄋㄧ", "nu": "ㄋㄨ", "nv": "ㄋㄩ", "ou": "ㄡ", "pa": "ㄆㄚ", "pi": "ㄆㄧ", "po": "ㄆㄛ", "pu": "ㄆㄨ", "qi": "ㄑㄧ", + "qu": "ㄑㄩ", "re": "ㄖㄜ", "ri": "ㄖ", "ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ", "si": "ㄙ", "su": "ㄙㄨ", "ta": "ㄊㄚ", + "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "wu": "ㄨ", "xi": "ㄒㄧ", "xu": "ㄒㄩ", "ya": "ㄧㄚ", + "ye": "ㄧㄝ", "yi": "ㄧ", "yo": "ㄧㄛ", "yu": "ㄩ", "za": "ㄗㄚ", "ze": "ㄗㄜ", "zi": "ㄗ", "zu": "ㄗㄨ", + "a": "ㄚ", "e": "ㄜ", "o": "ㄛ", "q": "ㄑ", ] /// 國音二式排列專用處理陣列 static let mapSecondaryPinyin: [String: String] = [ "chuang": "ㄔㄨㄤ", "shuang": "ㄕㄨㄤ", "chiang": "ㄑㄧㄤ", "chiung": "ㄑㄩㄥ", "chiuan": "ㄑㄩㄢ", "shiang": "ㄒㄧㄤ", - "shiung": "ㄒㄩㄥ", "shiuan": "ㄒㄩㄢ", "juang": "ㄓㄨㄤ", "jiang": "ㄐㄧㄤ", "jiung": "ㄐㄩㄥ", "niang": "ㄋㄧㄤ", "liang": "ㄌㄧㄤ", + "shiung": "ㄒㄩㄥ", "shiuan": "ㄒㄩㄢ", + "biang": "ㄅㄧㄤ", "duang": "ㄉㄨㄤ", "juang": "ㄓㄨㄤ", "jiang": "ㄐㄧㄤ", "jiung": "ㄐㄩㄥ", "niang": "ㄋㄧㄤ", "liang": "ㄌㄧㄤ", "guang": "ㄍㄨㄤ", "kuang": "ㄎㄨㄤ", "huang": "ㄏㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chuai": "ㄔㄨㄞ", "chuan": "ㄔㄨㄢ", "chung": "ㄔㄨㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shuai": "ㄕㄨㄞ", "shuan": "ㄕㄨㄢ", "jiuan": "ㄐㄩㄢ", "chiau": "ㄑㄧㄠ", "chian": "ㄑㄧㄢ", "ching": "ㄑㄧㄥ", "shing": "ㄒㄧㄥ", "tzang": "ㄗㄤ", "tzeng": "ㄗㄥ", "tzuan": "ㄗㄨㄢ", "tzung": "ㄗㄨㄥ", "tsang": "ㄘㄤ", "tseng": "ㄘㄥ", "tsuan": "ㄘㄨㄢ", "tsung": "ㄘㄨㄥ", "chiue": "ㄑㄩㄝ", "liuan": "ㄌㄩㄢ", "chuei": "ㄔㄨㄟ", "chuen": "ㄔㄨㄣ", "shuei": "ㄕㄨㄟ", "shuen": "ㄕㄨㄣ", "chiou": "ㄑㄧㄡ", "chiun": "ㄑㄩㄣ", "tzuei": "ㄗㄨㄟ", "tzuen": "ㄗㄨㄣ", "tsuei": "ㄘㄨㄟ", "tsuen": "ㄘㄨㄣ", "kiang": "ㄎㄧㄤ", "shiau": "ㄒㄧㄠ", "shian": "ㄒㄧㄢ", "shiue": "ㄒㄩㄝ", "shiou": "ㄒㄧㄡ", - "shiun": "ㄒㄩㄣ", "jang": "ㄓㄤ", "jeng": "ㄓㄥ", "juai": "ㄓㄨㄞ", "juan": "ㄓㄨㄢ", "jung": "ㄓㄨㄥ", "jiau": "ㄐㄧㄠ", - "jian": "ㄐㄧㄢ", "jing": "ㄐㄧㄥ", "jiue": "ㄐㄩㄝ", "chie": "ㄑㄧㄝ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "biau": "ㄅㄧㄠ", - "bian": "ㄅㄧㄢ", "bing": "ㄅㄧㄥ", "pang": "ㄆㄤ", "peng": "ㄆㄥ", "piau": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "ping": "ㄆㄧㄥ", "mang": "ㄇㄤ", - "meng": "ㄇㄥ", "miau": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "ming": "ㄇㄧㄥ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fiau": "ㄈㄧㄠ", "dang": "ㄉㄤ", - "deng": "ㄉㄥ", "diau": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "ding": "ㄉㄧㄥ", "duan": "ㄉㄨㄢ", "dung": "ㄉㄨㄥ", "tang": "ㄊㄤ", "teng": "ㄊㄥ", + "shiun": "ㄒㄩㄣ", + "jang": "ㄓㄤ", "jeng": "ㄓㄥ", "juai": "ㄓㄨㄞ", "juan": "ㄓㄨㄢ", "jung": "ㄓㄨㄥ", "jiau": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", + "jing": "ㄐㄧㄥ", "jiue": "ㄐㄩㄝ", "chie": "ㄑㄧㄝ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "biau": "ㄅㄧㄠ", "bian": "ㄅㄧㄢ", + "bing": "ㄅㄧㄥ", "pang": "ㄆㄤ", "peng": "ㄆㄥ", "piau": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "ping": "ㄆㄧㄥ", "mang": "ㄇㄤ", "meng": "ㄇㄥ", + "miau": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "ming": "ㄇㄧㄥ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fiau": "ㄈㄧㄠ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", + "diau": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "ding": "ㄉㄧㄥ", "duan": "ㄉㄨㄢ", "dung": "ㄉㄨㄥ", "tang": "ㄊㄤ", "teng": "ㄊㄥ", "tiau": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "ting": "ㄊㄧㄥ", "tuan": "ㄊㄨㄢ", "tung": "ㄊㄨㄥ", "nang": "ㄋㄤ", "neng": "ㄋㄥ", "niau": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", "ning": "ㄋㄧㄥ", "nuan": "ㄋㄨㄢ", "nung": "ㄋㄨㄥ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "liau": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ", "ling": "ㄌㄧㄥ", "luan": "ㄌㄨㄢ", "lung": "ㄌㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ", @@ -1041,203 +1045,215 @@ public struct Tekkon { "tuei": "ㄊㄨㄟ", "tuen": "ㄊㄨㄣ", "niou": "ㄋㄧㄡ", "nuei": "ㄋㄨㄟ", "nuen": "ㄋㄨㄣ", "liou": "ㄌㄧㄡ", "luen": "ㄌㄨㄣ", "guen": "ㄍㄨㄣ", "kuen": "ㄎㄨㄣ", "huei": "ㄏㄨㄟ", "huen": "ㄏㄨㄣ", "ruei": "ㄖㄨㄟ", "ruen": "ㄖㄨㄣ", "tzuo": "ㄗㄨㄛ", "tsuo": "ㄘㄨㄛ", "suei": "ㄙㄨㄟ", "suen": "ㄙㄨㄣ", "chiu": "ㄑㄩ", "giau": "ㄍㄧㄠ", "shie": "ㄒㄧㄝ", "shia": "ㄒㄧㄚ", - "shiu": "ㄒㄩ", "jie": "ㄐㄧㄝ", "jai": "ㄓㄞ", "jei": "ㄓㄟ", "jau": "ㄓㄠ", "jou": "ㄓㄡ", "jan": "ㄓㄢ", "jen": "ㄓㄣ", - "jua": "ㄓㄨㄚ", "bie": "ㄅㄧㄝ", "pie": "ㄆㄧㄝ", "mie": "ㄇㄧㄝ", "die": "ㄉㄧㄝ", "tie": "ㄊㄧㄝ", "nie": "ㄋㄧㄝ", "lie": "ㄌㄧㄝ", - "jia": "ㄐㄧㄚ", "jin": "ㄐㄧㄣ", "chr": "ㄔ", "shr": "ㄕ", "yue": "ㄩㄝ", "juo": "ㄓㄨㄛ", "bai": "ㄅㄞ", "bei": "ㄅㄟ", - "bau": "ㄅㄠ", "ban": "ㄅㄢ", "ben": "ㄅㄣ", "bin": "ㄅㄧㄣ", "pai": "ㄆㄞ", "pei": "ㄆㄟ", "pau": "ㄆㄠ", "pou": "ㄆㄡ", - "pan": "ㄆㄢ", "pen": "ㄆㄣ", "pia": "ㄆㄧㄚ", "pin": "ㄆㄧㄣ", "mai": "ㄇㄞ", "mei": "ㄇㄟ", "mau": "ㄇㄠ", "mou": "ㄇㄡ", - "man": "ㄇㄢ", "men": "ㄇㄣ", "min": "ㄇㄧㄣ", "fei": "ㄈㄟ", "fou": "ㄈㄡ", "fan": "ㄈㄢ", "fen": "ㄈㄣ", "dai": "ㄉㄞ", - "dei": "ㄉㄟ", "dau": "ㄉㄠ", "dou": "ㄉㄡ", "dan": "ㄉㄢ", "den": "ㄉㄣ", "dia": "ㄉㄧㄚ", "tai": "ㄊㄞ", "tau": "ㄊㄠ", - "tou": "ㄊㄡ", "tan": "ㄊㄢ", "nai": "ㄋㄞ", "nei": "ㄋㄟ", "nau": "ㄋㄠ", "nou": "ㄋㄡ", "nan": "ㄋㄢ", "nen": "ㄋㄣ", - "nin": "ㄋㄧㄣ", "lai": "ㄌㄞ", "lei": "ㄌㄟ", "lau": "ㄌㄠ", "lou": "ㄌㄡ", "lan": "ㄌㄢ", "lia": "ㄌㄧㄚ", "lin": "ㄌㄧㄣ", - "gai": "ㄍㄞ", "gei": "ㄍㄟ", "gau": "ㄍㄠ", "gou": "ㄍㄡ", "gan": "ㄍㄢ", "gen": "ㄍㄣ", "gua": "ㄍㄨㄚ", "guo": "ㄍㄨㄛ", - "gue": "ㄍㄨㄜ", "kai": "ㄎㄞ", "kau": "ㄎㄠ", "kou": "ㄎㄡ", "kan": "ㄎㄢ", "ken": "ㄎㄣ", "kua": "ㄎㄨㄚ", "kuo": "ㄎㄨㄛ", - "hai": "ㄏㄞ", "hei": "ㄏㄟ", "hau": "ㄏㄠ", "hou": "ㄏㄡ", "han": "ㄏㄢ", "hen": "ㄏㄣ", "hua": "ㄏㄨㄚ", "huo": "ㄏㄨㄛ", - "cha": "ㄔㄚ", "che": "ㄔㄜ", "chu": "ㄔㄨ", "sha": "ㄕㄚ", "she": "ㄕㄜ", "shu": "ㄕㄨ", "rau": "ㄖㄠ", "rou": "ㄖㄡ", "ran": "ㄖㄢ", - "ren": "ㄖㄣ", "sai": "ㄙㄞ", "sei": "ㄙㄟ", "sau": "ㄙㄠ", "sou": "ㄙㄡ", "san": "ㄙㄢ", "sen": "ㄙㄣ", "ang": "ㄤ", "eng": "ㄥ", - "yai": "ㄧㄞ", "yau": "ㄧㄠ", "yan": "ㄧㄢ", "yin": "ㄧㄣ", "wai": "ㄨㄞ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wen": "ㄨㄣ", "yun": "ㄩㄣ", - "jiu": "ㄐㄩ", "chi": "ㄑㄧ", "shi": "ㄒㄧ", "tza": "ㄗㄚ", "tze": "ㄗㄜ", "tzu": "ㄗㄨ", "tsz": "ㄘ", "tsa": "ㄘㄚ", "tse": "ㄘㄜ", - "tsu": "ㄘㄨ", "duo": "ㄉㄨㄛ", "tuo": "ㄊㄨㄛ", "nuo": "ㄋㄨㄛ", "luo": "ㄌㄨㄛ", "ruo": "ㄖㄨㄛ", "suo": "ㄙㄨㄛ", "you": "ㄧㄡ", - "niu": "ㄋㄩ", "liu": "ㄌㄩ", "gin": "ㄍㄧㄣ", "bo": "ㄅㄛ", "po": "ㄆㄛ", "mo": "ㄇㄛ", "fo": "ㄈㄛ", "jr": "ㄓ", "ja": "ㄓㄚ", - "je": "ㄓㄜ", "ju": "ㄓㄨ", "ji": "ㄐㄧ", "tz": "ㄗ", "sz": "ㄙ", "er": "ㄦ", "ye": "ㄧㄝ", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "bu": "ㄅㄨ", - "pa": "ㄆㄚ", "pi": "ㄆㄧ", "pu": "ㄆㄨ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mu": "ㄇㄨ", "fa": "ㄈㄚ", "fu": "ㄈㄨ", - "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "du": "ㄉㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "na": "ㄋㄚ", - "ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "la": "ㄌㄚ", "lo": "ㄌㄛ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lu": "ㄌㄨ", "ga": "ㄍㄚ", - "ge": "ㄍㄜ", "gu": "ㄍㄨ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", "ku": "ㄎㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ", "re": "ㄖㄜ", - "ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ", "su": "ㄙㄨ", "eh": "ㄝ", "ai": "ㄞ", "ei": "ㄟ", "au": "ㄠ", "ou": "ㄡ", "an": "ㄢ", - "en": "ㄣ", "ya": "ㄧㄚ", "yo": "ㄧㄛ", "wu": "ㄨ", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "yu": "ㄩ", "ch": "ㄑ", "yi": "ㄧ", "r": "ㄖ", - "a": "ㄚ", "o": "ㄛ", "e": "ㄜ", - ] - - /// 耶魯拼音排列專用處理陣列 - static let mapYalePinyin: [String: String] = [ - "chwang": "ㄔㄨㄤ", "shwang": "ㄕㄨㄤ", "chyang": "ㄑㄧㄤ", "chyung": "ㄑㄩㄥ", "chywan": "ㄑㄩㄢ", "jwang": "ㄓㄨㄤ", "syang": "ㄒㄧㄤ", - "syung": "ㄒㄩㄥ", "jyang": "ㄐㄧㄤ", "jyung": "ㄐㄩㄥ", "nyang": "ㄋㄧㄤ", "lyang": "ㄌㄧㄤ", "gwang": "ㄍㄨㄤ", "kwang": "ㄎㄨㄤ", - "hwang": "ㄏㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", "chwai": "ㄔㄨㄞ", "chwan": "ㄔㄨㄢ", "chung": "ㄔㄨㄥ", "shang": "ㄕㄤ", - "sheng": "ㄕㄥ", "shwai": "ㄕㄨㄞ", "shwan": "ㄕㄨㄢ", "sywan": "ㄒㄩㄢ", "jywan": "ㄐㄩㄢ", "chyau": "ㄑㄧㄠ", "chyan": "ㄑㄧㄢ", - "ching": "ㄑㄧㄥ", "sying": "ㄒㄧㄥ", "dzang": "ㄗㄤ", "dzeng": "ㄗㄥ", "dzwan": "ㄗㄨㄢ", "dzung": "ㄗㄨㄥ", "tsang": "ㄘㄤ", - "tseng": "ㄘㄥ", "tswan": "ㄘㄨㄢ", "tsung": "ㄘㄨㄥ", "chywe": "ㄑㄩㄝ", "lywan": "ㄌㄩㄢ", "chwei": "ㄔㄨㄟ", "chwun": "ㄔㄨㄣ", - "shwei": "ㄕㄨㄟ", "shwun": "ㄕㄨㄣ", "chyou": "ㄑㄧㄡ", "chyun": "ㄑㄩㄣ", "dzwei": "ㄗㄨㄟ", "dzwun": "ㄗㄨㄣ", "tswei": "ㄘㄨㄟ", - "tswun": "ㄘㄨㄣ", "kyang": "ㄎㄧㄤ", "jang": "ㄓㄤ", "jeng": "ㄓㄥ", "jwai": "ㄓㄨㄞ", "jwan": "ㄓㄨㄢ", "jung": "ㄓㄨㄥ", - "syau": "ㄒㄧㄠ", "syan": "ㄒㄧㄢ", "jyau": "ㄐㄧㄠ", "jyan": "ㄐㄧㄢ", "jing": "ㄐㄧㄥ", "sywe": "ㄒㄩㄝ", "jywe": "ㄐㄩㄝ", - "chye": "ㄑㄧㄝ", "bang": "ㄅㄤ", "beng": "ㄅㄥ", "byau": "ㄅㄧㄠ", "byan": "ㄅㄧㄢ", "bing": "ㄅㄧㄥ", "pang": "ㄆㄤ", "peng": "ㄆㄥ", - "pyau": "ㄆㄧㄠ", "pyan": "ㄆㄧㄢ", "ping": "ㄆㄧㄥ", "mang": "ㄇㄤ", "meng": "ㄇㄥ", "myau": "ㄇㄧㄠ", "myan": "ㄇㄧㄢ", - "ming": "ㄇㄧㄥ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", "fyau": "ㄈㄧㄠ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", "dyau": "ㄉㄧㄠ", "dyan": "ㄉㄧㄢ", - "ding": "ㄉㄧㄥ", "dwan": "ㄉㄨㄢ", "dung": "ㄉㄨㄥ", "tang": "ㄊㄤ", "teng": "ㄊㄥ", "tyau": "ㄊㄧㄠ", "tyan": "ㄊㄧㄢ", - "ting": "ㄊㄧㄥ", "twan": "ㄊㄨㄢ", "tung": "ㄊㄨㄥ", "nang": "ㄋㄤ", "neng": "ㄋㄥ", "nyau": "ㄋㄧㄠ", "nyan": "ㄋㄧㄢ", - "ning": "ㄋㄧㄥ", "nwan": "ㄋㄨㄢ", "nung": "ㄋㄨㄥ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "lyau": "ㄌㄧㄠ", "lyan": "ㄌㄧㄢ", - "ling": "ㄌㄧㄥ", "lwan": "ㄌㄨㄢ", "lung": "ㄌㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ", "gwai": "ㄍㄨㄞ", "gwan": "ㄍㄨㄢ", - "gung": "ㄍㄨㄥ", "kang": "ㄎㄤ", "keng": "ㄎㄥ", "kwai": "ㄎㄨㄞ", "kwan": "ㄎㄨㄢ", "kung": "ㄎㄨㄥ", "hang": "ㄏㄤ", "heng": "ㄏㄥ", - "hwai": "ㄏㄨㄞ", "hwan": "ㄏㄨㄢ", "hung": "ㄏㄨㄥ", "jwei": "ㄓㄨㄟ", "jwun": "ㄓㄨㄣ", "chai": "ㄔㄞ", "chau": "ㄔㄠ", "chou": "ㄔㄡ", - "chan": "ㄔㄢ", "chen": "ㄔㄣ", "chwa": "ㄔㄨㄚ", "shai": "ㄕㄞ", "shei": "ㄕㄟ", "shau": "ㄕㄠ", "shou": "ㄕㄡ", "shan": "ㄕㄢ", - "shen": "ㄕㄣ", "shwa": "ㄕㄨㄚ", "shwo": "ㄕㄨㄛ", "rang": "ㄖㄤ", "reng": "ㄖㄥ", "rwan": "ㄖㄨㄢ", "rung": "ㄖㄨㄥ", "sang": "ㄙㄤ", - "seng": "ㄙㄥ", "swan": "ㄙㄨㄢ", "sung": "ㄙㄨㄥ", "yang": "ㄧㄤ", "ying": "ㄧㄥ", "wang": "ㄨㄤ", "weng": "ㄨㄥ", "ywan": "ㄩㄢ", - "yung": "ㄩㄥ", "syou": "ㄒㄧㄡ", "syun": "ㄒㄩㄣ", "nywe": "ㄋㄩㄝ", "lywe": "ㄌㄩㄝ", "gwei": "ㄍㄨㄟ", "kwei": "ㄎㄨㄟ", - "jyou": "ㄐㄧㄡ", "jyun": "ㄐㄩㄣ", "chya": "ㄑㄧㄚ", "chin": "ㄑㄧㄣ", "syin": "ㄒㄧㄣ", "dzai": "ㄗㄞ", "dzei": "ㄗㄟ", "dzau": "ㄗㄠ", - "dzou": "ㄗㄡ", "dzan": "ㄗㄢ", "dzen": "ㄗㄣ", "tsai": "ㄘㄞ", "tsau": "ㄘㄠ", "tsou": "ㄘㄡ", "tsan": "ㄘㄢ", "tsen": "ㄘㄣ", - "chwo": "ㄔㄨㄛ", "myou": "ㄇㄧㄡ", "dyou": "ㄉㄧㄡ", "dwei": "ㄉㄨㄟ", "dwun": "ㄉㄨㄣ", "twei": "ㄊㄨㄟ", "twun": "ㄊㄨㄣ", - "nyou": "ㄋㄧㄡ", "nwei": "ㄋㄨㄟ", "nwun": "ㄋㄨㄣ", "lyou": "ㄌㄧㄡ", "lwun": "ㄌㄨㄣ", "gwun": "ㄍㄨㄣ", "kwun": "ㄎㄨㄣ", - "hwei": "ㄏㄨㄟ", "hwun": "ㄏㄨㄣ", "rwei": "ㄖㄨㄟ", "rwun": "ㄖㄨㄣ", "dzwo": "ㄗㄨㄛ", "tswo": "ㄘㄨㄛ", "swei": "ㄙㄨㄟ", - "swun": "ㄙㄨㄣ", "chyu": "ㄑㄩ", "giau": "ㄍㄧㄠ", "sye": "ㄒㄧㄝ", "jye": "ㄐㄧㄝ", "jai": "ㄓㄞ", "jei": "ㄓㄟ", "jau": "ㄓㄠ", - "jou": "ㄓㄡ", "jan": "ㄓㄢ", "jen": "ㄓㄣ", "jwa": "ㄓㄨㄚ", "sya": "ㄒㄧㄚ", "bye": "ㄅㄧㄝ", "pye": "ㄆㄧㄝ", "mye": "ㄇㄧㄝ", - "dye": "ㄉㄧㄝ", "tye": "ㄊㄧㄝ", "nye": "ㄋㄧㄝ", "lye": "ㄌㄧㄝ", "jya": "ㄐㄧㄚ", "jin": "ㄐㄧㄣ", "chr": "ㄔ", "shr": "ㄕ", - "ywe": "ㄩㄝ", "jwo": "ㄓㄨㄛ", "bai": "ㄅㄞ", "bei": "ㄅㄟ", "bau": "ㄅㄠ", "ban": "ㄅㄢ", "ben": "ㄅㄣ", "bin": "ㄅㄧㄣ", - "pai": "ㄆㄞ", "pei": "ㄆㄟ", "pau": "ㄆㄠ", "pou": "ㄆㄡ", "pan": "ㄆㄢ", "pen": "ㄆㄣ", "pya": "ㄆㄧㄚ", "pin": "ㄆㄧㄣ", - "mai": "ㄇㄞ", "mei": "ㄇㄟ", "mau": "ㄇㄠ", "mou": "ㄇㄡ", "man": "ㄇㄢ", "men": "ㄇㄣ", "min": "ㄇㄧㄣ", "fei": "ㄈㄟ", - "fou": "ㄈㄡ", "fan": "ㄈㄢ", "fen": "ㄈㄣ", "dai": "ㄉㄞ", "dei": "ㄉㄟ", "dau": "ㄉㄠ", "dou": "ㄉㄡ", "dan": "ㄉㄢ", "den": "ㄉㄣ", - "dya": "ㄉㄧㄚ", "tai": "ㄊㄞ", "tau": "ㄊㄠ", "tou": "ㄊㄡ", "tan": "ㄊㄢ", "nai": "ㄋㄞ", "nei": "ㄋㄟ", "nau": "ㄋㄠ", - "nou": "ㄋㄡ", "nan": "ㄋㄢ", "nen": "ㄋㄣ", "nin": "ㄋㄧㄣ", "lai": "ㄌㄞ", "lei": "ㄌㄟ", "lau": "ㄌㄠ", "lou": "ㄌㄡ", - "lan": "ㄌㄢ", "lya": "ㄌㄧㄚ", "lin": "ㄌㄧㄣ", "gai": "ㄍㄞ", "gei": "ㄍㄟ", "gau": "ㄍㄠ", "gou": "ㄍㄡ", "gan": "ㄍㄢ", - "gen": "ㄍㄣ", "gwa": "ㄍㄨㄚ", "gwo": "ㄍㄨㄛ", "gue": "ㄍㄨㄜ", "kai": "ㄎㄞ", "kau": "ㄎㄠ", "kou": "ㄎㄡ", "kan": "ㄎㄢ", - "ken": "ㄎㄣ", "kwa": "ㄎㄨㄚ", "kwo": "ㄎㄨㄛ", "hai": "ㄏㄞ", "hei": "ㄏㄟ", "hau": "ㄏㄠ", "hou": "ㄏㄡ", "han": "ㄏㄢ", - "hen": "ㄏㄣ", "hwa": "ㄏㄨㄚ", "hwo": "ㄏㄨㄛ", "cha": "ㄔㄚ", "che": "ㄔㄜ", "chu": "ㄔㄨ", "sha": "ㄕㄚ", "she": "ㄕㄜ", - "shu": "ㄕㄨ", "rau": "ㄖㄠ", "rou": "ㄖㄡ", "ran": "ㄖㄢ", "ren": "ㄖㄣ", "sai": "ㄙㄞ", "sei": "ㄙㄟ", "sau": "ㄙㄠ", "sou": "ㄙㄡ", - "san": "ㄙㄢ", "sen": "ㄙㄣ", "ang": "ㄤ", "eng": "ㄥ", "yai": "ㄧㄞ", "yau": "ㄧㄠ", "yan": "ㄧㄢ", "yin": "ㄧㄣ", "wai": "ㄨㄞ", - "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wen": "ㄨㄣ", "yun": "ㄩㄣ", "syu": "ㄒㄩ", "jyu": "ㄐㄩ", "chi": "ㄑㄧ", "syi": "ㄒㄧ", "dza": "ㄗㄚ", - "dze": "ㄗㄜ", "dzu": "ㄗㄨ", "tsz": "ㄘ", "tsa": "ㄘㄚ", "tse": "ㄘㄜ", "tsu": "ㄘㄨ", "dwo": "ㄉㄨㄛ", "two": "ㄊㄨㄛ", - "nwo": "ㄋㄨㄛ", "lwo": "ㄌㄨㄛ", "rwo": "ㄖㄨㄛ", "swo": "ㄙㄨㄛ", "you": "ㄧㄡ", "nyu": "ㄋㄩ", "lyu": "ㄌㄩ", "bwo": "ㄅㄛ", - "pwo": "ㄆㄛ", "mwo": "ㄇㄛ", "fwo": "ㄈㄛ", "gin": "ㄍㄧㄣ", "jr": "ㄓ", "ja": "ㄓㄚ", "je": "ㄓㄜ", "ju": "ㄓㄨ", "ji": "ㄐㄧ", - "dz": "ㄗ", "sz": "ㄙ", "er": "ㄦ", "ye": "ㄧㄝ", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "bu": "ㄅㄨ", "pa": "ㄆㄚ", "pi": "ㄆㄧ", "pu": "ㄆㄨ", + "shiu": "ㄒㄩ", + "jie": "ㄐㄧㄝ", "jai": "ㄓㄞ", "jei": "ㄓㄟ", "jau": "ㄓㄠ", "jou": "ㄓㄡ", "jan": "ㄓㄢ", "jen": "ㄓㄣ", "jua": "ㄓㄨㄚ", + "bie": "ㄅㄧㄝ", "pie": "ㄆㄧㄝ", "mie": "ㄇㄧㄝ", "die": "ㄉㄧㄝ", "tie": "ㄊㄧㄝ", "nie": "ㄋㄧㄝ", "lie": "ㄌㄧㄝ", "jia": "ㄐㄧㄚ", + "jin": "ㄐㄧㄣ", "chr": "ㄔ", "shr": "ㄕ", "yue": "ㄩㄝ", "juo": "ㄓㄨㄛ", "bai": "ㄅㄞ", "bei": "ㄅㄟ", "bau": "ㄅㄠ", "ban": "ㄅㄢ", + "ben": "ㄅㄣ", "bin": "ㄅㄧㄣ", "pai": "ㄆㄞ", "pei": "ㄆㄟ", "pau": "ㄆㄠ", "pou": "ㄆㄡ", "pan": "ㄆㄢ", "pen": "ㄆㄣ", + "pia": "ㄆㄧㄚ", "pin": "ㄆㄧㄣ", "mai": "ㄇㄞ", "mei": "ㄇㄟ", "mau": "ㄇㄠ", "mou": "ㄇㄡ", "man": "ㄇㄢ", "men": "ㄇㄣ", + "min": "ㄇㄧㄣ", "fei": "ㄈㄟ", "fou": "ㄈㄡ", "fan": "ㄈㄢ", "fen": "ㄈㄣ", "dai": "ㄉㄞ", "dei": "ㄉㄟ", "dau": "ㄉㄠ", + "dou": "ㄉㄡ", "dan": "ㄉㄢ", "den": "ㄉㄣ", "dia": "ㄉㄧㄚ", "tai": "ㄊㄞ", "tau": "ㄊㄠ", "tou": "ㄊㄡ", "tan": "ㄊㄢ", + "nai": "ㄋㄞ", "nei": "ㄋㄟ", "nau": "ㄋㄠ", "nou": "ㄋㄡ", "nan": "ㄋㄢ", "nen": "ㄋㄣ", "nin": "ㄋㄧㄣ", "lai": "ㄌㄞ", + "lei": "ㄌㄟ", "lau": "ㄌㄠ", "lou": "ㄌㄡ", "lan": "ㄌㄢ", "lia": "ㄌㄧㄚ", "lin": "ㄌㄧㄣ", "gai": "ㄍㄞ", "gei": "ㄍㄟ", + "gau": "ㄍㄠ", "gou": "ㄍㄡ", "gan": "ㄍㄢ", "gen": "ㄍㄣ", "gua": "ㄍㄨㄚ", "guo": "ㄍㄨㄛ", "gue": "ㄍㄨㄜ", "kai": "ㄎㄞ", + "kau": "ㄎㄠ", "kou": "ㄎㄡ", "kan": "ㄎㄢ", "ken": "ㄎㄣ", "kua": "ㄎㄨㄚ", "kuo": "ㄎㄨㄛ", "hai": "ㄏㄞ", "hei": "ㄏㄟ", + "hau": "ㄏㄠ", "hou": "ㄏㄡ", "han": "ㄏㄢ", "hen": "ㄏㄣ", "hua": "ㄏㄨㄚ", "huo": "ㄏㄨㄛ", "cha": "ㄔㄚ", "che": "ㄔㄜ", + "chu": "ㄔㄨ", "sha": "ㄕㄚ", "she": "ㄕㄜ", "shu": "ㄕㄨ", "rau": "ㄖㄠ", "rou": "ㄖㄡ", "ran": "ㄖㄢ", "ren": "ㄖㄣ", "sai": "ㄙㄞ", + "sei": "ㄙㄟ", "sau": "ㄙㄠ", "sou": "ㄙㄡ", "san": "ㄙㄢ", "sen": "ㄙㄣ", "ang": "ㄤ", "eng": "ㄥ", "yai": "ㄧㄞ", "yau": "ㄧㄠ", + "yan": "ㄧㄢ", "yin": "ㄧㄣ", "wai": "ㄨㄞ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wen": "ㄨㄣ", "yun": "ㄩㄣ", "jiu": "ㄐㄩ", "chi": "ㄑㄧ", + "shi": "ㄒㄧ", "tza": "ㄗㄚ", "tze": "ㄗㄜ", "tzu": "ㄗㄨ", "tsz": "ㄘ", "tsa": "ㄘㄚ", "tse": "ㄘㄜ", "tsu": "ㄘㄨ", "duo": "ㄉㄨㄛ", + "tuo": "ㄊㄨㄛ", "nuo": "ㄋㄨㄛ", "luo": "ㄌㄨㄛ", "ruo": "ㄖㄨㄛ", "suo": "ㄙㄨㄛ", "you": "ㄧㄡ", "niu": "ㄋㄩ", "liu": "ㄌㄩ", + "gin": "ㄍㄧㄣ", + "bo": "ㄅㄛ", "po": "ㄆㄛ", "mo": "ㄇㄛ", "fo": "ㄈㄛ", "jr": "ㄓ", "ja": "ㄓㄚ", "je": "ㄓㄜ", "ju": "ㄓㄨ", "ji": "ㄐㄧ", + "tz": "ㄗ", "sz": "ㄙ", "er": "ㄦ", "ye": "ㄧㄝ", "ba": "ㄅㄚ", "bi": "ㄅㄧ", "bu": "ㄅㄨ", "pa": "ㄆㄚ", "pi": "ㄆㄧ", "pu": "ㄆㄨ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mu": "ㄇㄨ", "fa": "ㄈㄚ", "fu": "ㄈㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "du": "ㄉㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", "tu": "ㄊㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "la": "ㄌㄚ", "lo": "ㄌㄛ", "le": "ㄌㄜ", "li": "ㄌㄧ", "lu": "ㄌㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", "gu": "ㄍㄨ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", "ku": "ㄎㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", "hu": "ㄏㄨ", "re": "ㄖㄜ", "ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ", "su": "ㄙㄨ", "eh": "ㄝ", "ai": "ㄞ", "ei": "ㄟ", "au": "ㄠ", "ou": "ㄡ", "an": "ㄢ", "en": "ㄣ", "ya": "ㄧㄚ", "yo": "ㄧㄛ", - "wu": "ㄨ", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "yu": "ㄩ", "ch": "ㄑ", "yi": "ㄧ", "r": "ㄖ", "a": "ㄚ", "o": "ㄛ", "e": "ㄜ", + "wu": "ㄨ", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "yu": "ㄩ", "ch": "ㄑ", "yi": "ㄧ", + "r": "ㄖ", "a": "ㄚ", "o": "ㄛ", "e": "ㄜ", + ] + + /// 耶魯拼音排列專用處理陣列 + static let mapYalePinyin: [String: String] = [ + "chwang": "ㄔㄨㄤ", "shwang": "ㄕㄨㄤ", "chyang": "ㄑㄧㄤ", "chyung": "ㄑㄩㄥ", "chywan": "ㄑㄩㄢ", + "byang": "ㄅㄧㄤ", "dwang": "ㄉㄨㄤ", "jwang": "ㄓㄨㄤ", "syang": "ㄒㄧㄤ", "syung": "ㄒㄩㄥ", "jyang": "ㄐㄧㄤ", "jyung": "ㄐㄩㄥ", + "nyang": "ㄋㄧㄤ", "lyang": "ㄌㄧㄤ", "gwang": "ㄍㄨㄤ", "kwang": "ㄎㄨㄤ", "hwang": "ㄏㄨㄤ", "chang": "ㄔㄤ", "cheng": "ㄔㄥ", + "chwai": "ㄔㄨㄞ", "chwan": "ㄔㄨㄢ", "chung": "ㄔㄨㄥ", "shang": "ㄕㄤ", "sheng": "ㄕㄥ", "shwai": "ㄕㄨㄞ", "shwan": "ㄕㄨㄢ", + "sywan": "ㄒㄩㄢ", "jywan": "ㄐㄩㄢ", "chyau": "ㄑㄧㄠ", "chyan": "ㄑㄧㄢ", "ching": "ㄑㄧㄥ", "sying": "ㄒㄧㄥ", "dzang": "ㄗㄤ", + "dzeng": "ㄗㄥ", "dzwan": "ㄗㄨㄢ", "dzung": "ㄗㄨㄥ", "tsang": "ㄘㄤ", "tseng": "ㄘㄥ", "tswan": "ㄘㄨㄢ", "tsung": "ㄘㄨㄥ", + "chywe": "ㄑㄩㄝ", "lywan": "ㄌㄩㄢ", "chwei": "ㄔㄨㄟ", "chwun": "ㄔㄨㄣ", "shwei": "ㄕㄨㄟ", "shwun": "ㄕㄨㄣ", "chyou": "ㄑㄧㄡ", + "chyun": "ㄑㄩㄣ", "dzwei": "ㄗㄨㄟ", "dzwun": "ㄗㄨㄣ", "tswei": "ㄘㄨㄟ", "tswun": "ㄘㄨㄣ", "kyang": "ㄎㄧㄤ", + "jang": "ㄓㄤ", "jeng": "ㄓㄥ", "jwai": "ㄓㄨㄞ", "jwan": "ㄓㄨㄢ", "jung": "ㄓㄨㄥ", "syau": "ㄒㄧㄠ", "syan": "ㄒㄧㄢ", + "jyau": "ㄐㄧㄠ", "jyan": "ㄐㄧㄢ", "jing": "ㄐㄧㄥ", "sywe": "ㄒㄩㄝ", "jywe": "ㄐㄩㄝ", "chye": "ㄑㄧㄝ", "bang": "ㄅㄤ", + "beng": "ㄅㄥ", "byau": "ㄅㄧㄠ", "byan": "ㄅㄧㄢ", "bing": "ㄅㄧㄥ", "pang": "ㄆㄤ", "peng": "ㄆㄥ", "pyau": "ㄆㄧㄠ", "pyan": "ㄆㄧㄢ", + "ping": "ㄆㄧㄥ", "mang": "ㄇㄤ", "meng": "ㄇㄥ", "myau": "ㄇㄧㄠ", "myan": "ㄇㄧㄢ", "ming": "ㄇㄧㄥ", "fang": "ㄈㄤ", "feng": "ㄈㄥ", + "fyau": "ㄈㄧㄠ", "dang": "ㄉㄤ", "deng": "ㄉㄥ", "dyau": "ㄉㄧㄠ", "dyan": "ㄉㄧㄢ", "ding": "ㄉㄧㄥ", "dwan": "ㄉㄨㄢ", + "dung": "ㄉㄨㄥ", "tang": "ㄊㄤ", "teng": "ㄊㄥ", "tyau": "ㄊㄧㄠ", "tyan": "ㄊㄧㄢ", "ting": "ㄊㄧㄥ", "twan": "ㄊㄨㄢ", + "tung": "ㄊㄨㄥ", "nang": "ㄋㄤ", "neng": "ㄋㄥ", "nyau": "ㄋㄧㄠ", "nyan": "ㄋㄧㄢ", "ning": "ㄋㄧㄥ", "nwan": "ㄋㄨㄢ", + "nung": "ㄋㄨㄥ", "lang": "ㄌㄤ", "leng": "ㄌㄥ", "lyau": "ㄌㄧㄠ", "lyan": "ㄌㄧㄢ", "ling": "ㄌㄧㄥ", "lwan": "ㄌㄨㄢ", + "lung": "ㄌㄨㄥ", "gang": "ㄍㄤ", "geng": "ㄍㄥ", "gwai": "ㄍㄨㄞ", "gwan": "ㄍㄨㄢ", "gung": "ㄍㄨㄥ", "kang": "ㄎㄤ", "keng": "ㄎㄥ", + "kwai": "ㄎㄨㄞ", "kwan": "ㄎㄨㄢ", "kung": "ㄎㄨㄥ", "hang": "ㄏㄤ", "heng": "ㄏㄥ", "hwai": "ㄏㄨㄞ", "hwan": "ㄏㄨㄢ", + "hung": "ㄏㄨㄥ", "jwei": "ㄓㄨㄟ", "jwun": "ㄓㄨㄣ", "chai": "ㄔㄞ", "chau": "ㄔㄠ", "chou": "ㄔㄡ", "chan": "ㄔㄢ", "chen": "ㄔㄣ", + "chwa": "ㄔㄨㄚ", "shai": "ㄕㄞ", "shei": "ㄕㄟ", "shau": "ㄕㄠ", "shou": "ㄕㄡ", "shan": "ㄕㄢ", "shen": "ㄕㄣ", "shwa": "ㄕㄨㄚ", + "shwo": "ㄕㄨㄛ", "rang": "ㄖㄤ", "reng": "ㄖㄥ", "rwan": "ㄖㄨㄢ", "rung": "ㄖㄨㄥ", "sang": "ㄙㄤ", "seng": "ㄙㄥ", "swan": "ㄙㄨㄢ", + "sung": "ㄙㄨㄥ", "yang": "ㄧㄤ", "ying": "ㄧㄥ", "wang": "ㄨㄤ", "weng": "ㄨㄥ", "ywan": "ㄩㄢ", "yung": "ㄩㄥ", "syou": "ㄒㄧㄡ", + "syun": "ㄒㄩㄣ", "nywe": "ㄋㄩㄝ", "lywe": "ㄌㄩㄝ", "gwei": "ㄍㄨㄟ", "kwei": "ㄎㄨㄟ", "jyou": "ㄐㄧㄡ", "jyun": "ㄐㄩㄣ", + "chya": "ㄑㄧㄚ", "chin": "ㄑㄧㄣ", "syin": "ㄒㄧㄣ", "dzai": "ㄗㄞ", "dzei": "ㄗㄟ", "dzau": "ㄗㄠ", "dzou": "ㄗㄡ", "dzan": "ㄗㄢ", + "dzen": "ㄗㄣ", "tsai": "ㄘㄞ", "tsau": "ㄘㄠ", "tsou": "ㄘㄡ", "tsan": "ㄘㄢ", "tsen": "ㄘㄣ", "chwo": "ㄔㄨㄛ", "myou": "ㄇㄧㄡ", + "dyou": "ㄉㄧㄡ", "dwei": "ㄉㄨㄟ", "dwun": "ㄉㄨㄣ", "twei": "ㄊㄨㄟ", "twun": "ㄊㄨㄣ", "nyou": "ㄋㄧㄡ", "nwei": "ㄋㄨㄟ", + "nwun": "ㄋㄨㄣ", "lyou": "ㄌㄧㄡ", "lwun": "ㄌㄨㄣ", "gwun": "ㄍㄨㄣ", "kwun": "ㄎㄨㄣ", "hwei": "ㄏㄨㄟ", "hwun": "ㄏㄨㄣ", + "rwei": "ㄖㄨㄟ", "rwun": "ㄖㄨㄣ", "dzwo": "ㄗㄨㄛ", "tswo": "ㄘㄨㄛ", "swei": "ㄙㄨㄟ", "swun": "ㄙㄨㄣ", "chyu": "ㄑㄩ", + "giau": "ㄍㄧㄠ", + "sye": "ㄒㄧㄝ", "jye": "ㄐㄧㄝ", "jai": "ㄓㄞ", "jei": "ㄓㄟ", "jau": "ㄓㄠ", "jou": "ㄓㄡ", "jan": "ㄓㄢ", "jen": "ㄓㄣ", + "jwa": "ㄓㄨㄚ", "sya": "ㄒㄧㄚ", "bye": "ㄅㄧㄝ", "pye": "ㄆㄧㄝ", "mye": "ㄇㄧㄝ", "dye": "ㄉㄧㄝ", "tye": "ㄊㄧㄝ", "nye": "ㄋㄧㄝ", + "lye": "ㄌㄧㄝ", "jya": "ㄐㄧㄚ", "jin": "ㄐㄧㄣ", "chr": "ㄔ", "shr": "ㄕ", "ywe": "ㄩㄝ", "jwo": "ㄓㄨㄛ", "bai": "ㄅㄞ", + "bei": "ㄅㄟ", "bau": "ㄅㄠ", "ban": "ㄅㄢ", "ben": "ㄅㄣ", "bin": "ㄅㄧㄣ", "pai": "ㄆㄞ", "pei": "ㄆㄟ", "pau": "ㄆㄠ", + "pou": "ㄆㄡ", "pan": "ㄆㄢ", "pen": "ㄆㄣ", "pya": "ㄆㄧㄚ", "pin": "ㄆㄧㄣ", "mai": "ㄇㄞ", "mei": "ㄇㄟ", "mau": "ㄇㄠ", + "mou": "ㄇㄡ", "man": "ㄇㄢ", "men": "ㄇㄣ", "min": "ㄇㄧㄣ", "fei": "ㄈㄟ", "fou": "ㄈㄡ", "fan": "ㄈㄢ", "fen": "ㄈㄣ", + "dai": "ㄉㄞ", "dei": "ㄉㄟ", "dau": "ㄉㄠ", "dou": "ㄉㄡ", "dan": "ㄉㄢ", "den": "ㄉㄣ", "dya": "ㄉㄧㄚ", "tai": "ㄊㄞ", + "tau": "ㄊㄠ", "tou": "ㄊㄡ", "tan": "ㄊㄢ", "nai": "ㄋㄞ", "nei": "ㄋㄟ", "nau": "ㄋㄠ", "nou": "ㄋㄡ", "nan": "ㄋㄢ", "nen": "ㄋㄣ", + "nin": "ㄋㄧㄣ", "lai": "ㄌㄞ", "lei": "ㄌㄟ", "lau": "ㄌㄠ", "lou": "ㄌㄡ", "lan": "ㄌㄢ", "lya": "ㄌㄧㄚ", "lin": "ㄌㄧㄣ", + "gai": "ㄍㄞ", "gei": "ㄍㄟ", "gau": "ㄍㄠ", "gou": "ㄍㄡ", "gan": "ㄍㄢ", "gen": "ㄍㄣ", "gwa": "ㄍㄨㄚ", "gwo": "ㄍㄨㄛ", + "gue": "ㄍㄨㄜ", "kai": "ㄎㄞ", "kau": "ㄎㄠ", "kou": "ㄎㄡ", "kan": "ㄎㄢ", "ken": "ㄎㄣ", "kwa": "ㄎㄨㄚ", "kwo": "ㄎㄨㄛ", + "hai": "ㄏㄞ", "hei": "ㄏㄟ", "hau": "ㄏㄠ", "hou": "ㄏㄡ", "han": "ㄏㄢ", "hen": "ㄏㄣ", "hwa": "ㄏㄨㄚ", "hwo": "ㄏㄨㄛ", + "cha": "ㄔㄚ", "che": "ㄔㄜ", "chu": "ㄔㄨ", "sha": "ㄕㄚ", "she": "ㄕㄜ", "shu": "ㄕㄨ", "rau": "ㄖㄠ", "rou": "ㄖㄡ", "ran": "ㄖㄢ", + "ren": "ㄖㄣ", "sai": "ㄙㄞ", "sei": "ㄙㄟ", "sau": "ㄙㄠ", "sou": "ㄙㄡ", "san": "ㄙㄢ", "sen": "ㄙㄣ", "ang": "ㄤ", "eng": "ㄥ", + "yai": "ㄧㄞ", "yau": "ㄧㄠ", "yan": "ㄧㄢ", "yin": "ㄧㄣ", "wai": "ㄨㄞ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wen": "ㄨㄣ", "yun": "ㄩㄣ", + "syu": "ㄒㄩ", "jyu": "ㄐㄩ", "chi": "ㄑㄧ", "syi": "ㄒㄧ", "dza": "ㄗㄚ", "dze": "ㄗㄜ", "dzu": "ㄗㄨ", "tsz": "ㄘ", "tsa": "ㄘㄚ", + "tse": "ㄘㄜ", "tsu": "ㄘㄨ", "dwo": "ㄉㄨㄛ", "two": "ㄊㄨㄛ", "nwo": "ㄋㄨㄛ", "lwo": "ㄌㄨㄛ", "rwo": "ㄖㄨㄛ", "swo": "ㄙㄨㄛ", + "you": "ㄧㄡ", "nyu": "ㄋㄩ", "lyu": "ㄌㄩ", "bwo": "ㄅㄛ", "pwo": "ㄆㄛ", "mwo": "ㄇㄛ", "fwo": "ㄈㄛ", "gin": "ㄍㄧㄣ", + "jr": "ㄓ", "ja": "ㄓㄚ", "je": "ㄓㄜ", "ju": "ㄓㄨ", "ji": "ㄐㄧ", "dz": "ㄗ", "sz": "ㄙ", "er": "ㄦ", "ye": "ㄧㄝ", "ba": "ㄅㄚ", + "bi": "ㄅㄧ", "bu": "ㄅㄨ", "pa": "ㄆㄚ", "pi": "ㄆㄧ", "pu": "ㄆㄨ", "ma": "ㄇㄚ", "me": "ㄇㄜ", "mi": "ㄇㄧ", "mu": "ㄇㄨ", + "fa": "ㄈㄚ", "fu": "ㄈㄨ", "da": "ㄉㄚ", "de": "ㄉㄜ", "di": "ㄉㄧ", "du": "ㄉㄨ", "ta": "ㄊㄚ", "te": "ㄊㄜ", "ti": "ㄊㄧ", + "tu": "ㄊㄨ", "na": "ㄋㄚ", "ne": "ㄋㄜ", "ni": "ㄋㄧ", "nu": "ㄋㄨ", "la": "ㄌㄚ", "lo": "ㄌㄛ", "le": "ㄌㄜ", "li": "ㄌㄧ", + "lu": "ㄌㄨ", "ga": "ㄍㄚ", "ge": "ㄍㄜ", "gu": "ㄍㄨ", "ka": "ㄎㄚ", "ke": "ㄎㄜ", "ku": "ㄎㄨ", "ha": "ㄏㄚ", "he": "ㄏㄜ", + "hu": "ㄏㄨ", "re": "ㄖㄜ", "ru": "ㄖㄨ", "sa": "ㄙㄚ", "se": "ㄙㄜ", "su": "ㄙㄨ", "eh": "ㄝ", "ai": "ㄞ", "ei": "ㄟ", "au": "ㄠ", + "ou": "ㄡ", "an": "ㄢ", "en": "ㄣ", "ya": "ㄧㄚ", "yo": "ㄧㄛ", "wu": "ㄨ", "wa": "ㄨㄚ", "wo": "ㄨㄛ", "yu": "ㄩ", "ch": "ㄑ", + "yi": "ㄧ", + "r": "ㄖ", "a": "ㄚ", "o": "ㄛ", "e": "ㄜ", ] /// 華羅拼音排列專用處理陣列 static let mapHualuoPinyin: [String: String] = [ "shuang": "ㄕㄨㄤ", "jhuang": "ㄓㄨㄤ", "chyueh": "ㄑㄩㄝ", "chyuan": "ㄑㄩㄢ", "chyong": "ㄑㄩㄥ", "chiang": "ㄑㄧㄤ", - "chuang": "ㄔㄨㄤ", "kyang": "ㄎㄧㄤ", "syueh": "ㄒㄩㄝ", "syuan": "ㄒㄩㄢ", "syong": "ㄒㄩㄥ", "sihei": "ㄙㄟ", "siang": "ㄒㄧㄤ", - "shuei": "ㄕㄨㄟ", "shuan": "ㄕㄨㄢ", "shuai": "ㄕㄨㄞ", "sheng": "ㄕㄥ", "shang": "ㄕㄤ", "nyueh": "ㄋㄩㄝ", "niang": "ㄋㄧㄤ", - "lyueh": "ㄌㄩㄝ", "lyuan": "ㄌㄩㄢ", "liang": "ㄌㄧㄤ", "kuang": "ㄎㄨㄤ", "jyueh": "ㄐㄩㄝ", "jyuan": "ㄐㄩㄢ", "jyong": "ㄐㄩㄥ", + "chuang": "ㄔㄨㄤ", + "biang": "ㄅㄧㄤ", "duang": "ㄉㄨㄤ", "kyang": "ㄎㄧㄤ", "syueh": "ㄒㄩㄝ", "syuan": "ㄒㄩㄢ", "syong": "ㄒㄩㄥ", "sihei": "ㄙㄟ", + "siang": "ㄒㄧㄤ", "shuei": "ㄕㄨㄟ", "shuan": "ㄕㄨㄢ", "shuai": "ㄕㄨㄞ", "sheng": "ㄕㄥ", "shang": "ㄕㄤ", "nyueh": "ㄋㄩㄝ", + "niang": "ㄋㄧㄤ", "lyueh": "ㄌㄩㄝ", "lyuan": "ㄌㄩㄢ", "liang": "ㄌㄧㄤ", "kuang": "ㄎㄨㄤ", "jyueh": "ㄐㄩㄝ", "jyuan": "ㄐㄩㄢ", + "jyong": "ㄐㄩㄥ", "jiang": "ㄐㄧㄤ", "jhuei": "ㄓㄨㄟ", "jhuan": "ㄓㄨㄢ", "jhuai": "ㄓㄨㄞ", "jhong": "ㄓㄨㄥ", "jheng": "ㄓㄥ", + "jhang": "ㄓㄤ", "huang": "ㄏㄨㄤ", "guang": "ㄍㄨㄤ", "chyun": "ㄑㄩㄣ", "tsuei": "ㄘㄨㄟ", "tsuan": "ㄘㄨㄢ", "tsong": "ㄘㄨㄥ", + "chiou": "ㄑㄧㄡ", "ching": "ㄑㄧㄥ", "chieh": "ㄑㄧㄝ", "chiao": "ㄑㄧㄠ", "chian": "ㄑㄧㄢ", "chuei": "ㄔㄨㄟ", "chuan": "ㄔㄨㄢ", + "chuai": "ㄔㄨㄞ", "chong": "ㄔㄨㄥ", "cheng": "ㄔㄥ", "chang": "ㄔㄤ", "tseng": "ㄘㄥ", "tsang": "ㄘㄤ", + "gyao": "ㄍㄧㄠ", "fiao": "ㄈㄧㄠ", "zuei": "ㄗㄨㄟ", "zuan": "ㄗㄨㄢ", "zong": "ㄗㄨㄥ", "zeng": "ㄗㄥ", "zang": "ㄗㄤ", "yueh": "ㄩㄝ", + "yuan": "ㄩㄢ", "yong": "ㄩㄥ", "ying": "ㄧㄥ", "yang": "ㄧㄤ", "wong": "ㄨㄥ", "wang": "ㄨㄤ", "tuei": "ㄊㄨㄟ", "tuan": "ㄊㄨㄢ", + "tong": "ㄊㄨㄥ", "ting": "ㄊㄧㄥ", "tieh": "ㄊㄧㄝ", "tiao": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "teng": "ㄊㄥ", "tang": "ㄊㄤ", + "syun": "ㄒㄩㄣ", "suei": "ㄙㄨㄟ", "suan": "ㄙㄨㄢ", "song": "ㄙㄨㄥ", "siou": "ㄒㄧㄡ", "sing": "ㄒㄧㄥ", "sieh": "ㄒㄧㄝ", + "siao": "ㄒㄧㄠ", "sian": "ㄒㄧㄢ", "shuo": "ㄕㄨㄛ", "shun": "ㄕㄨㄣ", "shua": "ㄕㄨㄚ", "shou": "ㄕㄡ", "shih": "ㄕ", "shen": "ㄕㄣ", + "shei": "ㄕㄟ", "shao": "ㄕㄠ", "shan": "ㄕㄢ", "shai": "ㄕㄞ", "seng": "ㄙㄥ", "sang": "ㄙㄤ", "ruei": "ㄖㄨㄟ", "ruan": "ㄖㄨㄢ", + "rong": "ㄖㄨㄥ", "reng": "ㄖㄥ", "rang": "ㄖㄤ", "ping": "ㄆㄧㄥ", "pieh": "ㄆㄧㄝ", "piao": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "peng": "ㄆㄥ", + "pang": "ㄆㄤ", "nuei": "ㄋㄨㄟ", "nuan": "ㄋㄨㄢ", "nong": "ㄋㄨㄥ", "niou": "ㄋㄧㄡ", "ning": "ㄋㄧㄥ", "nieh": "ㄋㄧㄝ", + "niao": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", "neng": "ㄋㄥ", "nang": "ㄋㄤ", "miou": "ㄇㄧㄡ", "ming": "ㄇㄧㄥ", "mieh": "ㄇㄧㄝ", + "miao": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "meng": "ㄇㄥ", "mang": "ㄇㄤ", "luan": "ㄌㄨㄢ", "long": "ㄌㄨㄥ", "liou": "ㄌㄧㄡ", + "ling": "ㄌㄧㄥ", "lieh": "ㄌㄧㄝ", "liao": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ", "leng": "ㄌㄥ", "lang": "ㄌㄤ", "kuei": "ㄎㄨㄟ", + "kuan": "ㄎㄨㄢ", "kuai": "ㄎㄨㄞ", "kong": "ㄎㄨㄥ", "keng": "ㄎㄥ", "kang": "ㄎㄤ", "jyun": "ㄐㄩㄣ", "jiou": "ㄐㄧㄡ", + "jing": "ㄐㄧㄥ", "jieh": "ㄐㄧㄝ", "jiao": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", "jhuo": "ㄓㄨㄛ", "jhun": "ㄓㄨㄣ", "jhua": "ㄓㄨㄚ", + "jhou": "ㄓㄡ", "jhih": "ㄓ", "jhen": "ㄓㄣ", "jhei": "ㄓㄟ", "jhao": "ㄓㄠ", "jhan": "ㄓㄢ", "jhai": "ㄓㄞ", "huei": "ㄏㄨㄟ", + "huan": "ㄏㄨㄢ", "huai": "ㄏㄨㄞ", "hong": "ㄏㄨㄥ", "heng": "ㄏㄥ", "hang": "ㄏㄤ", "guei": "ㄍㄨㄟ", "guan": "ㄍㄨㄢ", + "guai": "ㄍㄨㄞ", "gong": "ㄍㄨㄥ", "geng": "ㄍㄥ", "gang": "ㄍㄤ", "feng": "ㄈㄥ", "fang": "ㄈㄤ", "duei": "ㄉㄨㄟ", "duan": "ㄉㄨㄢ", + "dong": "ㄉㄨㄥ", "diou": "ㄉㄧㄡ", "ding": "ㄉㄧㄥ", "dieh": "ㄉㄧㄝ", "diao": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "deng": "ㄉㄥ", + "dang": "ㄉㄤ", "chyu": "ㄑㄩ", "tsuo": "ㄘㄨㄛ", "tsun": "ㄘㄨㄣ", "tsou": "ㄘㄡ", "chin": "ㄑㄧㄣ", "tsih": "ㄘ", "chia": "ㄑㄧㄚ", + "chuo": "ㄔㄨㄛ", "chun": "ㄔㄨㄣ", "chua": "ㄔㄨㄚ", "chou": "ㄔㄡ", "chih": "ㄔ", "chen": "ㄔㄣ", "chao": "ㄔㄠ", "chan": "ㄔㄢ", + "chai": "ㄔㄞ", "tsen": "ㄘㄣ", "tsao": "ㄘㄠ", "tsan": "ㄘㄢ", "tsai": "ㄘㄞ", "bing": "ㄅㄧㄥ", "bieh": "ㄅㄧㄝ", "biao": "ㄅㄧㄠ", + "bian": "ㄅㄧㄢ", "beng": "ㄅㄥ", "bang": "ㄅㄤ", + "gin": "ㄍㄧㄣ", "den": "ㄉㄣ", "zuo": "ㄗㄨㄛ", "zun": "ㄗㄨㄣ", "zou": "ㄗㄡ", "zih": "ㄗ", "zen": "ㄗㄣ", "zei": "ㄗㄟ", + "zao": "ㄗㄠ", "zan": "ㄗㄢ", "zai": "ㄗㄞ", "yun": "ㄩㄣ", "you": "ㄧㄡ", "yin": "ㄧㄣ", "yeh": "ㄧㄝ", "yao": "ㄧㄠ", "yan": "ㄧㄢ", + "yai": "ㄧㄞ", "wun": "ㄨㄣ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wai": "ㄨㄞ", "tuo": "ㄊㄨㄛ", "tun": "ㄊㄨㄣ", "tou": "ㄊㄡ", + "tao": "ㄊㄠ", "tan": "ㄊㄢ", "tai": "ㄊㄞ", "syu": "ㄒㄩ", "suo": "ㄙㄨㄛ", "sun": "ㄙㄨㄣ", "sou": "ㄙㄡ", "sin": "ㄒㄧㄣ", + "sih": "ㄙ", "sia": "ㄒㄧㄚ", "shu": "ㄕㄨ", "she": "ㄕㄜ", "sha": "ㄕㄚ", "sen": "ㄙㄣ", "sao": "ㄙㄠ", "san": "ㄙㄢ", "sai": "ㄙㄞ", + "ruo": "ㄖㄨㄛ", "run": "ㄖㄨㄣ", "rou": "ㄖㄡ", "rih": "ㄖ", "ren": "ㄖㄣ", "rao": "ㄖㄠ", "ran": "ㄖㄢ", "pou": "ㄆㄡ", + "pin": "ㄆㄧㄣ", "pia": "ㄆㄧㄚ", "pen": "ㄆㄣ", "pei": "ㄆㄟ", "pao": "ㄆㄠ", "pan": "ㄆㄢ", "pai": "ㄆㄞ", "nyu": "ㄋㄩ", + "nuo": "ㄋㄨㄛ", "nun": "ㄋㄨㄣ", "nou": "ㄋㄡ", "nin": "ㄋㄧㄣ", "nen": "ㄋㄣ", "nei": "ㄋㄟ", "nao": "ㄋㄠ", "nan": "ㄋㄢ", + "nai": "ㄋㄞ", "mou": "ㄇㄡ", "min": "ㄇㄧㄣ", "men": "ㄇㄣ", "mei": "ㄇㄟ", "mao": "ㄇㄠ", "man": "ㄇㄢ", "mai": "ㄇㄞ", + "lyu": "ㄌㄩ", "luo": "ㄌㄨㄛ", "lun": "ㄌㄨㄣ", "lou": "ㄌㄡ", "lin": "ㄌㄧㄣ", "lia": "ㄌㄧㄚ", "lei": "ㄌㄟ", "lao": "ㄌㄠ", + "lan": "ㄌㄢ", "lai": "ㄌㄞ", "kuo": "ㄎㄨㄛ", "kun": "ㄎㄨㄣ", "kua": "ㄎㄨㄚ", "kou": "ㄎㄡ", "ken": "ㄎㄣ", "kao": "ㄎㄠ", + "kan": "ㄎㄢ", "kai": "ㄎㄞ", "jyu": "ㄐㄩ", "jin": "ㄐㄧㄣ", "jia": "ㄐㄧㄚ", "jhu": "ㄓㄨ", "jhe": "ㄓㄜ", "jha": "ㄓㄚ", + "huo": "ㄏㄨㄛ", "hun": "ㄏㄨㄣ", "hua": "ㄏㄨㄚ", "hou": "ㄏㄡ", "hen": "ㄏㄣ", "hei": "ㄏㄟ", "hao": "ㄏㄠ", "han": "ㄏㄢ", + "hai": "ㄏㄞ", "guo": "ㄍㄨㄛ", "gun": "ㄍㄨㄣ", "gue": "ㄍㄨㄜ", "gua": "ㄍㄨㄚ", "gou": "ㄍㄡ", "gen": "ㄍㄣ", "gei": "ㄍㄟ", + "gao": "ㄍㄠ", "gan": "ㄍㄢ", "gai": "ㄍㄞ", "fou": "ㄈㄡ", "fen": "ㄈㄣ", "fei": "ㄈㄟ", "fan": "ㄈㄢ", "eng": "ㄥ", "duo": "ㄉㄨㄛ", + "dun": "ㄉㄨㄣ", "dou": "ㄉㄡ", "dia": "ㄉㄧㄚ", "dei": "ㄉㄟ", "dao": "ㄉㄠ", "dan": "ㄉㄢ", "dai": "ㄉㄞ", "tsu": "ㄘㄨ", + "chi": "ㄑㄧ", "chu": "ㄔㄨ", "che": "ㄔㄜ", "cha": "ㄔㄚ", "tse": "ㄘㄜ", "tsa": "ㄘㄚ", "bin": "ㄅㄧㄣ", "ben": "ㄅㄣ", + "bei": "ㄅㄟ", "bao": "ㄅㄠ", "ban": "ㄅㄢ", "bai": "ㄅㄞ", "ang": "ㄤ", + "ch": "ㄑ", "zu": "ㄗㄨ", "ze": "ㄗㄜ", "za": "ㄗㄚ", "yu": "ㄩ", "yo": "ㄧㄛ", "ya": "ㄧㄚ", "yi": "ㄧ", "wu": "ㄨ", "wo": "ㄨㄛ", + "wa": "ㄨㄚ", "tu": "ㄊㄨ", "ti": "ㄊㄧ", "te": "ㄊㄜ", "ta": "ㄊㄚ", "su": "ㄙㄨ", "si": "ㄒㄧ", "se": "ㄙㄜ", "sa": "ㄙㄚ", + "ru": "ㄖㄨ", "re": "ㄖㄜ", "pu": "ㄆㄨ", "po": "ㄆㄛ", "pi": "ㄆㄧ", "pa": "ㄆㄚ", "ou": "ㄡ", "nu": "ㄋㄨ", "ni": "ㄋㄧ", + "ne": "ㄋㄜ", "na": "ㄋㄚ", "mu": "ㄇㄨ", "mo": "ㄇㄛ", "mi": "ㄇㄧ", "me": "ㄇㄜ", "ma": "ㄇㄚ", "lu": "ㄌㄨ", "lo": "ㄌㄛ", + "li": "ㄌㄧ", "le": "ㄌㄜ", "la": "ㄌㄚ", "ku": "ㄎㄨ", "ke": "ㄎㄜ", "ka": "ㄎㄚ", "ji": "ㄐㄧ", "hu": "ㄏㄨ", "he": "ㄏㄜ", + "ha": "ㄏㄚ", "gu": "ㄍㄨ", "ge": "ㄍㄜ", "ga": "ㄍㄚ", "fu": "ㄈㄨ", "fo": "ㄈㄛ", "fa": "ㄈㄚ", "er": "ㄦ", "en": "ㄣ", "ei": "ㄟ", + "eh": "ㄝ", "du": "ㄉㄨ", "di": "ㄉㄧ", "de": "ㄉㄜ", "da": "ㄉㄚ", "bu": "ㄅㄨ", "bo": "ㄅㄛ", "bi": "ㄅㄧ", "ba": "ㄅㄚ", + "ao": "ㄠ", "an": "ㄢ", "ai": "ㄞ", + "o": "ㄛ", "e": "ㄜ", "a": "ㄚ", + ] + + /// 通用拼音排列專用處理陣列 + static let mapUniversalPinyin: [String: String] = [ + "shuang": "ㄕㄨㄤ", "jhuang": "ㄓㄨㄤ", "chuang": "ㄔㄨㄤ", + "biang": "ㄅㄧㄤ", "duang": "ㄉㄨㄤ", "cyuan": "ㄑㄩㄢ", "cyong": "ㄑㄩㄥ", "ciang": "ㄑㄧㄤ", "kyang": "ㄎㄧㄤ", "syuan": "ㄒㄩㄢ", + "syong": "ㄒㄩㄥ", "sihei": "ㄙㄟ", "siang": "ㄒㄧㄤ", "shuei": "ㄕㄨㄟ", "shuan": "ㄕㄨㄢ", "shuai": "ㄕㄨㄞ", "sheng": "ㄕㄥ", + "shang": "ㄕㄤ", "niang": "ㄋㄧㄤ", "lyuan": "ㄌㄩㄢ", "liang": "ㄌㄧㄤ", "kuang": "ㄎㄨㄤ", "jyuan": "ㄐㄩㄢ", "jyong": "ㄐㄩㄥ", "jiang": "ㄐㄧㄤ", "jhuei": "ㄓㄨㄟ", "jhuan": "ㄓㄨㄢ", "jhuai": "ㄓㄨㄞ", "jhong": "ㄓㄨㄥ", "jheng": "ㄓㄥ", "jhang": "ㄓㄤ", - "huang": "ㄏㄨㄤ", "guang": "ㄍㄨㄤ", "chyun": "ㄑㄩㄣ", "tsuei": "ㄘㄨㄟ", "tsuan": "ㄘㄨㄢ", "tsong": "ㄘㄨㄥ", "chiou": "ㄑㄧㄡ", - "ching": "ㄑㄧㄥ", "chieh": "ㄑㄧㄝ", "chiao": "ㄑㄧㄠ", "chian": "ㄑㄧㄢ", "chuei": "ㄔㄨㄟ", "chuan": "ㄔㄨㄢ", "chuai": "ㄔㄨㄞ", - "chong": "ㄔㄨㄥ", "cheng": "ㄔㄥ", "chang": "ㄔㄤ", "tseng": "ㄘㄥ", "tsang": "ㄘㄤ", "gyao": "ㄍㄧㄠ", "fiao": "ㄈㄧㄠ", - "zuei": "ㄗㄨㄟ", "zuan": "ㄗㄨㄢ", "zong": "ㄗㄨㄥ", "zeng": "ㄗㄥ", "zang": "ㄗㄤ", "yueh": "ㄩㄝ", "yuan": "ㄩㄢ", "yong": "ㄩㄥ", - "ying": "ㄧㄥ", "yang": "ㄧㄤ", "wong": "ㄨㄥ", "wang": "ㄨㄤ", "tuei": "ㄊㄨㄟ", "tuan": "ㄊㄨㄢ", "tong": "ㄊㄨㄥ", "ting": "ㄊㄧㄥ", - "tieh": "ㄊㄧㄝ", "tiao": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "teng": "ㄊㄥ", "tang": "ㄊㄤ", "syun": "ㄒㄩㄣ", "suei": "ㄙㄨㄟ", - "suan": "ㄙㄨㄢ", "song": "ㄙㄨㄥ", "siou": "ㄒㄧㄡ", "sing": "ㄒㄧㄥ", "sieh": "ㄒㄧㄝ", "siao": "ㄒㄧㄠ", "sian": "ㄒㄧㄢ", + "huang": "ㄏㄨㄤ", "guang": "ㄍㄨㄤ", "chuei": "ㄔㄨㄟ", "chuan": "ㄔㄨㄢ", "chuai": "ㄔㄨㄞ", "chong": "ㄔㄨㄥ", "cheng": "ㄔㄥ", + "chang": "ㄔㄤ", + "cyue": "ㄑㄩㄝ", "syue": "ㄒㄩㄝ", "nyue": "ㄋㄩㄝ", "lyue": "ㄌㄩㄝ", "jyue": "ㄐㄩㄝ", "cyun": "ㄑㄩㄣ", "cuei": "ㄘㄨㄟ", + "cuan": "ㄘㄨㄢ", "cong": "ㄘㄨㄥ", "ciou": "ㄑㄧㄡ", "cing": "ㄑㄧㄥ", "ciao": "ㄑㄧㄠ", "cian": "ㄑㄧㄢ", "ceng": "ㄘㄥ", + "cang": "ㄘㄤ", "gyao": "ㄍㄧㄠ", "fiao": "ㄈㄧㄠ", "zuei": "ㄗㄨㄟ", "zuan": "ㄗㄨㄢ", "zong": "ㄗㄨㄥ", "zeng": "ㄗㄥ", "zang": "ㄗㄤ", + "yuan": "ㄩㄢ", "yong": "ㄩㄥ", "ying": "ㄧㄥ", "yang": "ㄧㄤ", "wong": "ㄨㄥ", "wang": "ㄨㄤ", "tuei": "ㄊㄨㄟ", "tuan": "ㄊㄨㄢ", + "tong": "ㄊㄨㄥ", "ting": "ㄊㄧㄥ", "tiao": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", "teng": "ㄊㄥ", "tang": "ㄊㄤ", "syun": "ㄒㄩㄣ", + "suei": "ㄙㄨㄟ", "suan": "ㄙㄨㄢ", "song": "ㄙㄨㄥ", "siou": "ㄒㄧㄡ", "sing": "ㄒㄧㄥ", "siao": "ㄒㄧㄠ", "sian": "ㄒㄧㄢ", "shuo": "ㄕㄨㄛ", "shun": "ㄕㄨㄣ", "shua": "ㄕㄨㄚ", "shou": "ㄕㄡ", "shih": "ㄕ", "shen": "ㄕㄣ", "shei": "ㄕㄟ", "shao": "ㄕㄠ", "shan": "ㄕㄢ", "shai": "ㄕㄞ", "seng": "ㄙㄥ", "sang": "ㄙㄤ", "ruei": "ㄖㄨㄟ", "ruan": "ㄖㄨㄢ", "rong": "ㄖㄨㄥ", "reng": "ㄖㄥ", - "rang": "ㄖㄤ", "ping": "ㄆㄧㄥ", "pieh": "ㄆㄧㄝ", "piao": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "peng": "ㄆㄥ", "pang": "ㄆㄤ", "nuei": "ㄋㄨㄟ", - "nuan": "ㄋㄨㄢ", "nong": "ㄋㄨㄥ", "niou": "ㄋㄧㄡ", "ning": "ㄋㄧㄥ", "nieh": "ㄋㄧㄝ", "niao": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", - "neng": "ㄋㄥ", "nang": "ㄋㄤ", "miou": "ㄇㄧㄡ", "ming": "ㄇㄧㄥ", "mieh": "ㄇㄧㄝ", "miao": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "meng": "ㄇㄥ", - "mang": "ㄇㄤ", "luan": "ㄌㄨㄢ", "long": "ㄌㄨㄥ", "liou": "ㄌㄧㄡ", "ling": "ㄌㄧㄥ", "lieh": "ㄌㄧㄝ", "liao": "ㄌㄧㄠ", - "lian": "ㄌㄧㄢ", "leng": "ㄌㄥ", "lang": "ㄌㄤ", "kuei": "ㄎㄨㄟ", "kuan": "ㄎㄨㄢ", "kuai": "ㄎㄨㄞ", "kong": "ㄎㄨㄥ", "keng": "ㄎㄥ", - "kang": "ㄎㄤ", "jyun": "ㄐㄩㄣ", "jiou": "ㄐㄧㄡ", "jing": "ㄐㄧㄥ", "jieh": "ㄐㄧㄝ", "jiao": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", - "jhuo": "ㄓㄨㄛ", "jhun": "ㄓㄨㄣ", "jhua": "ㄓㄨㄚ", "jhou": "ㄓㄡ", "jhih": "ㄓ", "jhen": "ㄓㄣ", "jhei": "ㄓㄟ", "jhao": "ㄓㄠ", - "jhan": "ㄓㄢ", "jhai": "ㄓㄞ", "huei": "ㄏㄨㄟ", "huan": "ㄏㄨㄢ", "huai": "ㄏㄨㄞ", "hong": "ㄏㄨㄥ", "heng": "ㄏㄥ", "hang": "ㄏㄤ", - "guei": "ㄍㄨㄟ", "guan": "ㄍㄨㄢ", "guai": "ㄍㄨㄞ", "gong": "ㄍㄨㄥ", "geng": "ㄍㄥ", "gang": "ㄍㄤ", "feng": "ㄈㄥ", "fang": "ㄈㄤ", - "duei": "ㄉㄨㄟ", "duan": "ㄉㄨㄢ", "dong": "ㄉㄨㄥ", "diou": "ㄉㄧㄡ", "ding": "ㄉㄧㄥ", "dieh": "ㄉㄧㄝ", "diao": "ㄉㄧㄠ", - "dian": "ㄉㄧㄢ", "deng": "ㄉㄥ", "dang": "ㄉㄤ", "chyu": "ㄑㄩ", "tsuo": "ㄘㄨㄛ", "tsun": "ㄘㄨㄣ", "tsou": "ㄘㄡ", "chin": "ㄑㄧㄣ", - "tsih": "ㄘ", "chia": "ㄑㄧㄚ", "chuo": "ㄔㄨㄛ", "chun": "ㄔㄨㄣ", "chua": "ㄔㄨㄚ", "chou": "ㄔㄡ", "chih": "ㄔ", "chen": "ㄔㄣ", - "chao": "ㄔㄠ", "chan": "ㄔㄢ", "chai": "ㄔㄞ", "tsen": "ㄘㄣ", "tsao": "ㄘㄠ", "tsan": "ㄘㄢ", "tsai": "ㄘㄞ", "bing": "ㄅㄧㄥ", - "bieh": "ㄅㄧㄝ", "biao": "ㄅㄧㄠ", "bian": "ㄅㄧㄢ", "beng": "ㄅㄥ", "bang": "ㄅㄤ", "gin": "ㄍㄧㄣ", "den": "ㄉㄣ", "zuo": "ㄗㄨㄛ", - "zun": "ㄗㄨㄣ", "zou": "ㄗㄡ", "zih": "ㄗ", "zen": "ㄗㄣ", "zei": "ㄗㄟ", "zao": "ㄗㄠ", "zan": "ㄗㄢ", "zai": "ㄗㄞ", "yun": "ㄩㄣ", - "you": "ㄧㄡ", "yin": "ㄧㄣ", "yeh": "ㄧㄝ", "yao": "ㄧㄠ", "yan": "ㄧㄢ", "yai": "ㄧㄞ", "wun": "ㄨㄣ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", - "wai": "ㄨㄞ", "tuo": "ㄊㄨㄛ", "tun": "ㄊㄨㄣ", "tou": "ㄊㄡ", "tao": "ㄊㄠ", "tan": "ㄊㄢ", "tai": "ㄊㄞ", "syu": "ㄒㄩ", - "suo": "ㄙㄨㄛ", "sun": "ㄙㄨㄣ", "sou": "ㄙㄡ", "sin": "ㄒㄧㄣ", "sih": "ㄙ", "sia": "ㄒㄧㄚ", "shu": "ㄕㄨ", "she": "ㄕㄜ", - "sha": "ㄕㄚ", "sen": "ㄙㄣ", "sao": "ㄙㄠ", "san": "ㄙㄢ", "sai": "ㄙㄞ", "ruo": "ㄖㄨㄛ", "run": "ㄖㄨㄣ", "rou": "ㄖㄡ", - "rih": "ㄖ", "ren": "ㄖㄣ", "rao": "ㄖㄠ", "ran": "ㄖㄢ", "pou": "ㄆㄡ", "pin": "ㄆㄧㄣ", "pia": "ㄆㄧㄚ", "pen": "ㄆㄣ", - "pei": "ㄆㄟ", "pao": "ㄆㄠ", "pan": "ㄆㄢ", "pai": "ㄆㄞ", "nyu": "ㄋㄩ", "nuo": "ㄋㄨㄛ", "nun": "ㄋㄨㄣ", "nou": "ㄋㄡ", - "nin": "ㄋㄧㄣ", "nen": "ㄋㄣ", "nei": "ㄋㄟ", "nao": "ㄋㄠ", "nan": "ㄋㄢ", "nai": "ㄋㄞ", "mou": "ㄇㄡ", "min": "ㄇㄧㄣ", - "men": "ㄇㄣ", "mei": "ㄇㄟ", "mao": "ㄇㄠ", "man": "ㄇㄢ", "mai": "ㄇㄞ", "lyu": "ㄌㄩ", "luo": "ㄌㄨㄛ", "lun": "ㄌㄨㄣ", - "lou": "ㄌㄡ", "lin": "ㄌㄧㄣ", "lia": "ㄌㄧㄚ", "lei": "ㄌㄟ", "lao": "ㄌㄠ", "lan": "ㄌㄢ", "lai": "ㄌㄞ", "kuo": "ㄎㄨㄛ", - "kun": "ㄎㄨㄣ", "kua": "ㄎㄨㄚ", "kou": "ㄎㄡ", "ken": "ㄎㄣ", "kao": "ㄎㄠ", "kan": "ㄎㄢ", "kai": "ㄎㄞ", "jyu": "ㄐㄩ", - "jin": "ㄐㄧㄣ", "jia": "ㄐㄧㄚ", "jhu": "ㄓㄨ", "jhe": "ㄓㄜ", "jha": "ㄓㄚ", "huo": "ㄏㄨㄛ", "hun": "ㄏㄨㄣ", "hua": "ㄏㄨㄚ", - "hou": "ㄏㄡ", "hen": "ㄏㄣ", "hei": "ㄏㄟ", "hao": "ㄏㄠ", "han": "ㄏㄢ", "hai": "ㄏㄞ", "guo": "ㄍㄨㄛ", "gun": "ㄍㄨㄣ", - "gue": "ㄍㄨㄜ", "gua": "ㄍㄨㄚ", "gou": "ㄍㄡ", "gen": "ㄍㄣ", "gei": "ㄍㄟ", "gao": "ㄍㄠ", "gan": "ㄍㄢ", "gai": "ㄍㄞ", - "fou": "ㄈㄡ", "fen": "ㄈㄣ", "fei": "ㄈㄟ", "fan": "ㄈㄢ", "eng": "ㄥ", "duo": "ㄉㄨㄛ", "dun": "ㄉㄨㄣ", "dou": "ㄉㄡ", - "dia": "ㄉㄧㄚ", "dei": "ㄉㄟ", "dao": "ㄉㄠ", "dan": "ㄉㄢ", "dai": "ㄉㄞ", "tsu": "ㄘㄨ", "chi": "ㄑㄧ", "chu": "ㄔㄨ", - "che": "ㄔㄜ", "cha": "ㄔㄚ", "tse": "ㄘㄜ", "tsa": "ㄘㄚ", "bin": "ㄅㄧㄣ", "ben": "ㄅㄣ", "bei": "ㄅㄟ", "bao": "ㄅㄠ", - "ban": "ㄅㄢ", "bai": "ㄅㄞ", "ang": "ㄤ", "ch": "ㄑ", "zu": "ㄗㄨ", "ze": "ㄗㄜ", "za": "ㄗㄚ", "yu": "ㄩ", "yo": "ㄧㄛ", - "ya": "ㄧㄚ", "yi": "ㄧ", "wu": "ㄨ", "wo": "ㄨㄛ", "wa": "ㄨㄚ", "tu": "ㄊㄨ", "ti": "ㄊㄧ", "te": "ㄊㄜ", "ta": "ㄊㄚ", + "rang": "ㄖㄤ", "ping": "ㄆㄧㄥ", "piao": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "peng": "ㄆㄥ", "pang": "ㄆㄤ", "nuei": "ㄋㄨㄟ", "nuan": "ㄋㄨㄢ", + "nong": "ㄋㄨㄥ", "niou": "ㄋㄧㄡ", "ning": "ㄋㄧㄥ", "niao": "ㄋㄧㄠ", "nian": "ㄋㄧㄢ", "neng": "ㄋㄥ", "nang": "ㄋㄤ", + "miou": "ㄇㄧㄡ", "ming": "ㄇㄧㄥ", "miao": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "meng": "ㄇㄥ", "mang": "ㄇㄤ", "luan": "ㄌㄨㄢ", + "long": "ㄌㄨㄥ", "liou": "ㄌㄧㄡ", "ling": "ㄌㄧㄥ", "liao": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ", "leng": "ㄌㄥ", "lang": "ㄌㄤ", + "kuei": "ㄎㄨㄟ", "kuan": "ㄎㄨㄢ", "kuai": "ㄎㄨㄞ", "kong": "ㄎㄨㄥ", "keng": "ㄎㄥ", "kang": "ㄎㄤ", "jyun": "ㄐㄩㄣ", + "jiou": "ㄐㄧㄡ", "jing": "ㄐㄧㄥ", "jiao": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", "jhuo": "ㄓㄨㄛ", "jhun": "ㄓㄨㄣ", "jhua": "ㄓㄨㄚ", + "jhou": "ㄓㄡ", "jhih": "ㄓ", "jhen": "ㄓㄣ", "jhei": "ㄓㄟ", "jhao": "ㄓㄠ", "jhan": "ㄓㄢ", "jhai": "ㄓㄞ", "huei": "ㄏㄨㄟ", + "huan": "ㄏㄨㄢ", "huai": "ㄏㄨㄞ", "hong": "ㄏㄨㄥ", "heng": "ㄏㄥ", "hang": "ㄏㄤ", "guei": "ㄍㄨㄟ", "guan": "ㄍㄨㄢ", + "guai": "ㄍㄨㄞ", "gong": "ㄍㄨㄥ", "geng": "ㄍㄥ", "gang": "ㄍㄤ", "fong": "ㄈㄥ", "fang": "ㄈㄤ", "duei": "ㄉㄨㄟ", "duan": "ㄉㄨㄢ", + "dong": "ㄉㄨㄥ", "diou": "ㄉㄧㄡ", "ding": "ㄉㄧㄥ", "diao": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "deng": "ㄉㄥ", "dang": "ㄉㄤ", + "chuo": "ㄔㄨㄛ", "chun": "ㄔㄨㄣ", "chua": "ㄔㄨㄚ", "chou": "ㄔㄡ", "chih": "ㄔ", "chen": "ㄔㄣ", "chao": "ㄔㄠ", "chan": "ㄔㄢ", + "chai": "ㄔㄞ", "bing": "ㄅㄧㄥ", "biao": "ㄅㄧㄠ", "bian": "ㄅㄧㄢ", "beng": "ㄅㄥ", "bang": "ㄅㄤ", + "cie": "ㄑㄧㄝ", "yue": "ㄩㄝ", "tie": "ㄊㄧㄝ", "sie": "ㄒㄧㄝ", "pie": "ㄆㄧㄝ", "nie": "ㄋㄧㄝ", "mie": "ㄇㄧㄝ", "lie": "ㄌㄧㄝ", + "jie": "ㄐㄧㄝ", "die": "ㄉㄧㄝ", "cyu": "ㄑㄩ", "cuo": "ㄘㄨㄛ", "cun": "ㄘㄨㄣ", "cou": "ㄘㄡ", "cin": "ㄑㄧㄣ", "cih": "ㄘ", + "cia": "ㄑㄧㄚ", "cen": "ㄘㄣ", "cao": "ㄘㄠ", "can": "ㄘㄢ", "cai": "ㄘㄞ", "bie": "ㄅㄧㄝ", "gin": "ㄍㄧㄣ", "den": "ㄉㄣ", + "zuo": "ㄗㄨㄛ", "zun": "ㄗㄨㄣ", "zou": "ㄗㄡ", "zih": "ㄗ", "zen": "ㄗㄣ", "zei": "ㄗㄟ", "zao": "ㄗㄠ", "zan": "ㄗㄢ", + "zai": "ㄗㄞ", "yun": "ㄩㄣ", "you": "ㄧㄡ", "yin": "ㄧㄣ", "yao": "ㄧㄠ", "yan": "ㄧㄢ", "yai": "ㄧㄞ", "wun": "ㄨㄣ", "wei": "ㄨㄟ", + "wan": "ㄨㄢ", "wai": "ㄨㄞ", "tuo": "ㄊㄨㄛ", "tun": "ㄊㄨㄣ", "tou": "ㄊㄡ", "tao": "ㄊㄠ", "tan": "ㄊㄢ", "tai": "ㄊㄞ", + "syu": "ㄒㄩ", "suo": "ㄙㄨㄛ", "sun": "ㄙㄨㄣ", "sou": "ㄙㄡ", "sin": "ㄒㄧㄣ", "sih": "ㄙ", "sia": "ㄒㄧㄚ", "shu": "ㄕㄨ", + "she": "ㄕㄜ", "sha": "ㄕㄚ", "sen": "ㄙㄣ", "sao": "ㄙㄠ", "san": "ㄙㄢ", "sai": "ㄙㄞ", "ruo": "ㄖㄨㄛ", "run": "ㄖㄨㄣ", + "rou": "ㄖㄡ", "rih": "ㄖ", "ren": "ㄖㄣ", "rao": "ㄖㄠ", "ran": "ㄖㄢ", "pou": "ㄆㄡ", "pin": "ㄆㄧㄣ", "pia": "ㄆㄧㄚ", + "pen": "ㄆㄣ", "pei": "ㄆㄟ", "pao": "ㄆㄠ", "pan": "ㄆㄢ", "pai": "ㄆㄞ", "nyu": "ㄋㄩ", "nuo": "ㄋㄨㄛ", "nun": "ㄋㄨㄣ", + "nou": "ㄋㄡ", "nin": "ㄋㄧㄣ", "nen": "ㄋㄣ", "nei": "ㄋㄟ", "nao": "ㄋㄠ", "nan": "ㄋㄢ", "nai": "ㄋㄞ", "mou": "ㄇㄡ", + "min": "ㄇㄧㄣ", "men": "ㄇㄣ", "mei": "ㄇㄟ", "mao": "ㄇㄠ", "man": "ㄇㄢ", "mai": "ㄇㄞ", "lyu": "ㄌㄩ", "luo": "ㄌㄨㄛ", + "lun": "ㄌㄨㄣ", "lou": "ㄌㄡ", "lin": "ㄌㄧㄣ", "lia": "ㄌㄧㄚ", "lei": "ㄌㄟ", "lao": "ㄌㄠ", "lan": "ㄌㄢ", "lai": "ㄌㄞ", + "kuo": "ㄎㄨㄛ", "kun": "ㄎㄨㄣ", "kua": "ㄎㄨㄚ", "kou": "ㄎㄡ", "ken": "ㄎㄣ", "kao": "ㄎㄠ", "kan": "ㄎㄢ", "kai": "ㄎㄞ", + "jyu": "ㄐㄩ", "jin": "ㄐㄧㄣ", "jia": "ㄐㄧㄚ", "jhu": "ㄓㄨ", "jhe": "ㄓㄜ", "jha": "ㄓㄚ", "huo": "ㄏㄨㄛ", "hun": "ㄏㄨㄣ", + "hua": "ㄏㄨㄚ", "hou": "ㄏㄡ", "hen": "ㄏㄣ", "hei": "ㄏㄟ", "hao": "ㄏㄠ", "han": "ㄏㄢ", "hai": "ㄏㄞ", "guo": "ㄍㄨㄛ", + "gun": "ㄍㄨㄣ", "gue": "ㄍㄨㄜ", "gua": "ㄍㄨㄚ", "gou": "ㄍㄡ", "gen": "ㄍㄣ", "gei": "ㄍㄟ", "gao": "ㄍㄠ", "gan": "ㄍㄢ", + "gai": "ㄍㄞ", "fou": "ㄈㄡ", "fen": "ㄈㄣ", "fei": "ㄈㄟ", "fan": "ㄈㄢ", "eng": "ㄥ", "duo": "ㄉㄨㄛ", "dun": "ㄉㄨㄣ", + "dou": "ㄉㄡ", "dia": "ㄉㄧㄚ", "dei": "ㄉㄟ", "dao": "ㄉㄠ", "dan": "ㄉㄢ", "dai": "ㄉㄞ", "chu": "ㄔㄨ", "che": "ㄔㄜ", + "cha": "ㄔㄚ", "bin": "ㄅㄧㄣ", "ben": "ㄅㄣ", "bei": "ㄅㄟ", "bao": "ㄅㄠ", "ban": "ㄅㄢ", "bai": "ㄅㄞ", "ang": "ㄤ", "yia": "ㄧㄚ", + "ye": "ㄧㄝ", "cu": "ㄘㄨ", "ci": "ㄑㄧ", "ce": "ㄘㄜ", "ca": "ㄘㄚ", "zu": "ㄗㄨ", "ze": "ㄗㄜ", "za": "ㄗㄚ", "yu": "ㄩ", + "yo": "ㄧㄛ", "yi": "ㄧ", "wu": "ㄨ", "wo": "ㄨㄛ", "wa": "ㄨㄚ", "tu": "ㄊㄨ", "ti": "ㄊㄧ", "te": "ㄊㄜ", "ta": "ㄊㄚ", "su": "ㄙㄨ", "si": "ㄒㄧ", "se": "ㄙㄜ", "sa": "ㄙㄚ", "ru": "ㄖㄨ", "re": "ㄖㄜ", "pu": "ㄆㄨ", "po": "ㄆㄛ", "pi": "ㄆㄧ", "pa": "ㄆㄚ", "ou": "ㄡ", "nu": "ㄋㄨ", "ni": "ㄋㄧ", "ne": "ㄋㄜ", "na": "ㄋㄚ", "mu": "ㄇㄨ", "mo": "ㄇㄛ", "mi": "ㄇㄧ", "me": "ㄇㄜ", "ma": "ㄇㄚ", "lu": "ㄌㄨ", "lo": "ㄌㄛ", "li": "ㄌㄧ", "le": "ㄌㄜ", "la": "ㄌㄚ", "ku": "ㄎㄨ", "ke": "ㄎㄜ", "ka": "ㄎㄚ", "ji": "ㄐㄧ", "hu": "ㄏㄨ", "he": "ㄏㄜ", "ha": "ㄏㄚ", "gu": "ㄍㄨ", "ge": "ㄍㄜ", "ga": "ㄍㄚ", "fu": "ㄈㄨ", "fo": "ㄈㄛ", "fa": "ㄈㄚ", "er": "ㄦ", "en": "ㄣ", "ei": "ㄟ", "eh": "ㄝ", "du": "ㄉㄨ", "di": "ㄉㄧ", "de": "ㄉㄜ", "da": "ㄉㄚ", - "bu": "ㄅㄨ", "bo": "ㄅㄛ", "bi": "ㄅㄧ", "ba": "ㄅㄚ", "ao": "ㄠ", "an": "ㄢ", "ai": "ㄞ", "o": "ㄛ", "e": "ㄜ", "a": "ㄚ", - ] - - /// 通用拼音排列專用處理陣列 - static let mapUniversalPinyin: [String: String] = [ - "shuang": "ㄕㄨㄤ", "jhuang": "ㄓㄨㄤ", "chuang": "ㄔㄨㄤ", "cyuan": "ㄑㄩㄢ", "cyong": "ㄑㄩㄥ", "ciang": "ㄑㄧㄤ", "kyang": "ㄎㄧㄤ", - "syuan": "ㄒㄩㄢ", "syong": "ㄒㄩㄥ", "sihei": "ㄙㄟ", "siang": "ㄒㄧㄤ", "shuei": "ㄕㄨㄟ", "shuan": "ㄕㄨㄢ", "shuai": "ㄕㄨㄞ", - "sheng": "ㄕㄥ", "shang": "ㄕㄤ", "niang": "ㄋㄧㄤ", "lyuan": "ㄌㄩㄢ", "liang": "ㄌㄧㄤ", "kuang": "ㄎㄨㄤ", "jyuan": "ㄐㄩㄢ", - "jyong": "ㄐㄩㄥ", "jiang": "ㄐㄧㄤ", "jhuei": "ㄓㄨㄟ", "jhuan": "ㄓㄨㄢ", "jhuai": "ㄓㄨㄞ", "jhong": "ㄓㄨㄥ", "jheng": "ㄓㄥ", - "jhang": "ㄓㄤ", "huang": "ㄏㄨㄤ", "guang": "ㄍㄨㄤ", "chuei": "ㄔㄨㄟ", "chuan": "ㄔㄨㄢ", "chuai": "ㄔㄨㄞ", "chong": "ㄔㄨㄥ", - "cheng": "ㄔㄥ", "chang": "ㄔㄤ", "cyue": "ㄑㄩㄝ", "syue": "ㄒㄩㄝ", "nyue": "ㄋㄩㄝ", "lyue": "ㄌㄩㄝ", "jyue": "ㄐㄩㄝ", - "cyun": "ㄑㄩㄣ", "cuei": "ㄘㄨㄟ", "cuan": "ㄘㄨㄢ", "cong": "ㄘㄨㄥ", "ciou": "ㄑㄧㄡ", "cing": "ㄑㄧㄥ", "ciao": "ㄑㄧㄠ", - "cian": "ㄑㄧㄢ", "ceng": "ㄘㄥ", "cang": "ㄘㄤ", "gyao": "ㄍㄧㄠ", "fiao": "ㄈㄧㄠ", "zuei": "ㄗㄨㄟ", "zuan": "ㄗㄨㄢ", - "zong": "ㄗㄨㄥ", "zeng": "ㄗㄥ", "zang": "ㄗㄤ", "yuan": "ㄩㄢ", "yong": "ㄩㄥ", "ying": "ㄧㄥ", "yang": "ㄧㄤ", "wong": "ㄨㄥ", - "wang": "ㄨㄤ", "tuei": "ㄊㄨㄟ", "tuan": "ㄊㄨㄢ", "tong": "ㄊㄨㄥ", "ting": "ㄊㄧㄥ", "tiao": "ㄊㄧㄠ", "tian": "ㄊㄧㄢ", - "teng": "ㄊㄥ", "tang": "ㄊㄤ", "syun": "ㄒㄩㄣ", "suei": "ㄙㄨㄟ", "suan": "ㄙㄨㄢ", "song": "ㄙㄨㄥ", "siou": "ㄒㄧㄡ", - "sing": "ㄒㄧㄥ", "siao": "ㄒㄧㄠ", "sian": "ㄒㄧㄢ", "shuo": "ㄕㄨㄛ", "shun": "ㄕㄨㄣ", "shua": "ㄕㄨㄚ", "shou": "ㄕㄡ", "shih": "ㄕ", - "shen": "ㄕㄣ", "shei": "ㄕㄟ", "shao": "ㄕㄠ", "shan": "ㄕㄢ", "shai": "ㄕㄞ", "seng": "ㄙㄥ", "sang": "ㄙㄤ", "ruei": "ㄖㄨㄟ", - "ruan": "ㄖㄨㄢ", "rong": "ㄖㄨㄥ", "reng": "ㄖㄥ", "rang": "ㄖㄤ", "ping": "ㄆㄧㄥ", "piao": "ㄆㄧㄠ", "pian": "ㄆㄧㄢ", "peng": "ㄆㄥ", - "pang": "ㄆㄤ", "nuei": "ㄋㄨㄟ", "nuan": "ㄋㄨㄢ", "nong": "ㄋㄨㄥ", "niou": "ㄋㄧㄡ", "ning": "ㄋㄧㄥ", "niao": "ㄋㄧㄠ", - "nian": "ㄋㄧㄢ", "neng": "ㄋㄥ", "nang": "ㄋㄤ", "miou": "ㄇㄧㄡ", "ming": "ㄇㄧㄥ", "miao": "ㄇㄧㄠ", "mian": "ㄇㄧㄢ", "meng": "ㄇㄥ", - "mang": "ㄇㄤ", "luan": "ㄌㄨㄢ", "long": "ㄌㄨㄥ", "liou": "ㄌㄧㄡ", "ling": "ㄌㄧㄥ", "liao": "ㄌㄧㄠ", "lian": "ㄌㄧㄢ", - "leng": "ㄌㄥ", "lang": "ㄌㄤ", "kuei": "ㄎㄨㄟ", "kuan": "ㄎㄨㄢ", "kuai": "ㄎㄨㄞ", "kong": "ㄎㄨㄥ", "keng": "ㄎㄥ", "kang": "ㄎㄤ", - "jyun": "ㄐㄩㄣ", "jiou": "ㄐㄧㄡ", "jing": "ㄐㄧㄥ", "jiao": "ㄐㄧㄠ", "jian": "ㄐㄧㄢ", "jhuo": "ㄓㄨㄛ", "jhun": "ㄓㄨㄣ", - "jhua": "ㄓㄨㄚ", "jhou": "ㄓㄡ", "jhih": "ㄓ", "jhen": "ㄓㄣ", "jhei": "ㄓㄟ", "jhao": "ㄓㄠ", "jhan": "ㄓㄢ", "jhai": "ㄓㄞ", - "huei": "ㄏㄨㄟ", "huan": "ㄏㄨㄢ", "huai": "ㄏㄨㄞ", "hong": "ㄏㄨㄥ", "heng": "ㄏㄥ", "hang": "ㄏㄤ", "guei": "ㄍㄨㄟ", - "guan": "ㄍㄨㄢ", "guai": "ㄍㄨㄞ", "gong": "ㄍㄨㄥ", "geng": "ㄍㄥ", "gang": "ㄍㄤ", "fong": "ㄈㄥ", "fang": "ㄈㄤ", "duei": "ㄉㄨㄟ", - "duan": "ㄉㄨㄢ", "dong": "ㄉㄨㄥ", "diou": "ㄉㄧㄡ", "ding": "ㄉㄧㄥ", "diao": "ㄉㄧㄠ", "dian": "ㄉㄧㄢ", "deng": "ㄉㄥ", - "dang": "ㄉㄤ", "chuo": "ㄔㄨㄛ", "chun": "ㄔㄨㄣ", "chua": "ㄔㄨㄚ", "chou": "ㄔㄡ", "chih": "ㄔ", "chen": "ㄔㄣ", "chao": "ㄔㄠ", - "chan": "ㄔㄢ", "chai": "ㄔㄞ", "bing": "ㄅㄧㄥ", "biao": "ㄅㄧㄠ", "bian": "ㄅㄧㄢ", "beng": "ㄅㄥ", "bang": "ㄅㄤ", "cie": "ㄑㄧㄝ", - "yue": "ㄩㄝ", "tie": "ㄊㄧㄝ", "sie": "ㄒㄧㄝ", "pie": "ㄆㄧㄝ", "nie": "ㄋㄧㄝ", "mie": "ㄇㄧㄝ", "lie": "ㄌㄧㄝ", "jie": "ㄐㄧㄝ", - "die": "ㄉㄧㄝ", "cyu": "ㄑㄩ", "cuo": "ㄘㄨㄛ", "cun": "ㄘㄨㄣ", "cou": "ㄘㄡ", "cin": "ㄑㄧㄣ", "cih": "ㄘ", "cia": "ㄑㄧㄚ", - "cen": "ㄘㄣ", "cao": "ㄘㄠ", "can": "ㄘㄢ", "cai": "ㄘㄞ", "bie": "ㄅㄧㄝ", "gin": "ㄍㄧㄣ", "den": "ㄉㄣ", "zuo": "ㄗㄨㄛ", - "zun": "ㄗㄨㄣ", "zou": "ㄗㄡ", "zih": "ㄗ", "zen": "ㄗㄣ", "zei": "ㄗㄟ", "zao": "ㄗㄠ", "zan": "ㄗㄢ", "zai": "ㄗㄞ", "yun": "ㄩㄣ", - "you": "ㄧㄡ", "yin": "ㄧㄣ", "yao": "ㄧㄠ", "yan": "ㄧㄢ", "yai": "ㄧㄞ", "wun": "ㄨㄣ", "wei": "ㄨㄟ", "wan": "ㄨㄢ", "wai": "ㄨㄞ", - "tuo": "ㄊㄨㄛ", "tun": "ㄊㄨㄣ", "tou": "ㄊㄡ", "tao": "ㄊㄠ", "tan": "ㄊㄢ", "tai": "ㄊㄞ", "syu": "ㄒㄩ", "suo": "ㄙㄨㄛ", - "sun": "ㄙㄨㄣ", "sou": "ㄙㄡ", "sin": "ㄒㄧㄣ", "sih": "ㄙ", "sia": "ㄒㄧㄚ", "shu": "ㄕㄨ", "she": "ㄕㄜ", "sha": "ㄕㄚ", - "sen": "ㄙㄣ", "sao": "ㄙㄠ", "san": "ㄙㄢ", "sai": "ㄙㄞ", "ruo": "ㄖㄨㄛ", "run": "ㄖㄨㄣ", "rou": "ㄖㄡ", "rih": "ㄖ", - "ren": "ㄖㄣ", "rao": "ㄖㄠ", "ran": "ㄖㄢ", "pou": "ㄆㄡ", "pin": "ㄆㄧㄣ", "pia": "ㄆㄧㄚ", "pen": "ㄆㄣ", "pei": "ㄆㄟ", - "pao": "ㄆㄠ", "pan": "ㄆㄢ", "pai": "ㄆㄞ", "nyu": "ㄋㄩ", "nuo": "ㄋㄨㄛ", "nun": "ㄋㄨㄣ", "nou": "ㄋㄡ", "nin": "ㄋㄧㄣ", - "nen": "ㄋㄣ", "nei": "ㄋㄟ", "nao": "ㄋㄠ", "nan": "ㄋㄢ", "nai": "ㄋㄞ", "mou": "ㄇㄡ", "min": "ㄇㄧㄣ", "men": "ㄇㄣ", - "mei": "ㄇㄟ", "mao": "ㄇㄠ", "man": "ㄇㄢ", "mai": "ㄇㄞ", "lyu": "ㄌㄩ", "luo": "ㄌㄨㄛ", "lun": "ㄌㄨㄣ", "lou": "ㄌㄡ", - "lin": "ㄌㄧㄣ", "lia": "ㄌㄧㄚ", "lei": "ㄌㄟ", "lao": "ㄌㄠ", "lan": "ㄌㄢ", "lai": "ㄌㄞ", "kuo": "ㄎㄨㄛ", "kun": "ㄎㄨㄣ", - "kua": "ㄎㄨㄚ", "kou": "ㄎㄡ", "ken": "ㄎㄣ", "kao": "ㄎㄠ", "kan": "ㄎㄢ", "kai": "ㄎㄞ", "jyu": "ㄐㄩ", "jin": "ㄐㄧㄣ", - "jia": "ㄐㄧㄚ", "jhu": "ㄓㄨ", "jhe": "ㄓㄜ", "jha": "ㄓㄚ", "huo": "ㄏㄨㄛ", "hun": "ㄏㄨㄣ", "hua": "ㄏㄨㄚ", "hou": "ㄏㄡ", - "hen": "ㄏㄣ", "hei": "ㄏㄟ", "hao": "ㄏㄠ", "han": "ㄏㄢ", "hai": "ㄏㄞ", "guo": "ㄍㄨㄛ", "gun": "ㄍㄨㄣ", "gue": "ㄍㄨㄜ", - "gua": "ㄍㄨㄚ", "gou": "ㄍㄡ", "gen": "ㄍㄣ", "gei": "ㄍㄟ", "gao": "ㄍㄠ", "gan": "ㄍㄢ", "gai": "ㄍㄞ", "fou": "ㄈㄡ", - "fen": "ㄈㄣ", "fei": "ㄈㄟ", "fan": "ㄈㄢ", "eng": "ㄥ", "duo": "ㄉㄨㄛ", "dun": "ㄉㄨㄣ", "dou": "ㄉㄡ", "dia": "ㄉㄧㄚ", - "dei": "ㄉㄟ", "dao": "ㄉㄠ", "dan": "ㄉㄢ", "dai": "ㄉㄞ", "chu": "ㄔㄨ", "che": "ㄔㄜ", "cha": "ㄔㄚ", "bin": "ㄅㄧㄣ", - "ben": "ㄅㄣ", "bei": "ㄅㄟ", "bao": "ㄅㄠ", "ban": "ㄅㄢ", "bai": "ㄅㄞ", "ang": "ㄤ", "yia": "ㄧㄚ", "ye": "ㄧㄝ", "cu": "ㄘㄨ", - "ci": "ㄑㄧ", "ce": "ㄘㄜ", "ca": "ㄘㄚ", "zu": "ㄗㄨ", "ze": "ㄗㄜ", "za": "ㄗㄚ", "yu": "ㄩ", "yo": "ㄧㄛ", "yi": "ㄧ", "wu": "ㄨ", - "wo": "ㄨㄛ", "wa": "ㄨㄚ", "tu": "ㄊㄨ", "ti": "ㄊㄧ", "te": "ㄊㄜ", "ta": "ㄊㄚ", "su": "ㄙㄨ", "si": "ㄒㄧ", "se": "ㄙㄜ", - "sa": "ㄙㄚ", "ru": "ㄖㄨ", "re": "ㄖㄜ", "pu": "ㄆㄨ", "po": "ㄆㄛ", "pi": "ㄆㄧ", "pa": "ㄆㄚ", "ou": "ㄡ", "nu": "ㄋㄨ", - "ni": "ㄋㄧ", "ne": "ㄋㄜ", "na": "ㄋㄚ", "mu": "ㄇㄨ", "mo": "ㄇㄛ", "mi": "ㄇㄧ", "me": "ㄇㄜ", "ma": "ㄇㄚ", "lu": "ㄌㄨ", - "lo": "ㄌㄛ", "li": "ㄌㄧ", "le": "ㄌㄜ", "la": "ㄌㄚ", "ku": "ㄎㄨ", "ke": "ㄎㄜ", "ka": "ㄎㄚ", "ji": "ㄐㄧ", "hu": "ㄏㄨ", - "he": "ㄏㄜ", "ha": "ㄏㄚ", "gu": "ㄍㄨ", "ge": "ㄍㄜ", "ga": "ㄍㄚ", "fu": "ㄈㄨ", "fo": "ㄈㄛ", "fa": "ㄈㄚ", "er": "ㄦ", - "en": "ㄣ", "ei": "ㄟ", "eh": "ㄝ", "du": "ㄉㄨ", "di": "ㄉㄧ", "de": "ㄉㄜ", "da": "ㄉㄚ", "bu": "ㄅㄨ", "bo": "ㄅㄛ", "bi": "ㄅㄧ", - "ba": "ㄅㄚ", "ao": "ㄠ", "an": "ㄢ", "ai": "ㄞ", "c": "ㄑ", "o": "ㄛ", "e": "ㄜ", "a": "ㄚ", + "bu": "ㄅㄨ", "bo": "ㄅㄛ", "bi": "ㄅㄧ", "ba": "ㄅㄚ", "ao": "ㄠ", "an": "ㄢ", "ai": "ㄞ", + "c": "ㄑ", "o": "ㄛ", "e": "ㄜ", "a": "ㄚ", ] // MARK: - Maps for Keyboard-to-Phonabet parsers From 08653e6adc6a55e50a223c1ba97873fdc0904328 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Mon, 23 May 2022 15:52:28 +0800 Subject: [PATCH 14/14] Bump version to 1.6.1 Build 1961. --- Update-Info.plist | 4 ++-- vChewing.pkgproj | 2 +- vChewing.xcodeproj/project.pbxproj | 24 ++++++++++++------------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Update-Info.plist b/Update-Info.plist index 1e03e069..72b5337f 100644 --- a/Update-Info.plist +++ b/Update-Info.plist @@ -3,9 +3,9 @@ CFBundleShortVersionString - 1.6.0 + 1.6.1 CFBundleVersion - 1960 + 1961 UpdateInfoEndpoint https://gitee.com/vchewing/vChewing-macOS/raw/main/Update-Info.plist UpdateInfoSite diff --git a/vChewing.pkgproj b/vChewing.pkgproj index 5d799050..9690c996 100644 --- a/vChewing.pkgproj +++ b/vChewing.pkgproj @@ -726,7 +726,7 @@ USE_HFS+_COMPRESSION VERSION - 1.6.0 + 1.6.1 TYPE 0 diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index 925e5ee5..491f50a9 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -1296,7 +1296,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1960; + CURRENT_PROJECT_VERSION = 1961; DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; @@ -1319,7 +1319,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.6.0; + MARKETING_VERSION = 1.6.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1352,7 +1352,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1960; + CURRENT_PROJECT_VERSION = 1961; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1371,7 +1371,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.6.0; + MARKETING_VERSION = 1.6.1; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1486,7 +1486,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1960; + CURRENT_PROJECT_VERSION = 1961; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1521,7 +1521,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.6.0; + MARKETING_VERSION = 1.6.1; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1553,7 +1553,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1960; + CURRENT_PROJECT_VERSION = 1961; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1583,7 +1583,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.6.0; + MARKETING_VERSION = 1.6.1; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1666,7 +1666,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1960; + CURRENT_PROJECT_VERSION = 1961; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -1691,7 +1691,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.6.0; + MARKETING_VERSION = 1.6.1; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1718,7 +1718,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1960; + CURRENT_PROJECT_VERSION = 1961; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1738,7 +1738,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.6.0; + MARKETING_VERSION = 1.6.1; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "";