From 24a04105e856ef992bb3f5f39138e0e4ac66f9f7 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 20 Mar 2022 10:58:18 +0800 Subject: [PATCH 01/17] AboutWindow // i18n fixes. --- Installer/Resources/ja.lproj/MainMenu.strings | 2 +- LICENSE-JPN.txt | 2 +- Source/WindowNIBs/ja.lproj/frmAboutWindow.strings | 2 +- Source/WindowNIBs/zh-Hans.lproj/frmAboutWindow.strings | 2 +- Source/WindowNIBs/zh-Hant.lproj/frmAboutWindow.strings | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Installer/Resources/ja.lproj/MainMenu.strings b/Installer/Resources/ja.lproj/MainMenu.strings index 8f0c7545..03c967d2 100644 --- a/Installer/Resources/ja.lproj/MainMenu.strings +++ b/Installer/Resources/ja.lproj/MainMenu.strings @@ -57,7 +57,7 @@ "QYf-Nf-hoi.title" = "OpenVanilla 小麦注音プロジェクトから派生。"; /* Class = "NSTextFieldCell"; title = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development: Shiki Suen, Hiraku Wang, etc.\nvChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "VW8-s5-Wpn"; */ -"VW8-s5-Wpn.title" = "小麦注音入力エンジン開発:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, など。\nmacOS 版の開発:Shiki Suen, Hiraku Wang, など。\n威注音語彙データの維持:Shiki Suen。"; +"VW8-s5-Wpn.title" = "小麦注音入力エンジン開発:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, など。\nmacOS 版威注音の開発:Shiki Suen, Hiraku Wang, など。\n威注音語彙データの維持:Shiki Suen。"; /* Class = "NSTextFieldCell"; title = "Placeholder for showing copyright information."; ObjectID = "eo3-TK-0rB"; */ "eo3-TK-0rB.title" = "Placeholder for showing copyright information."; diff --git a/LICENSE-JPN.txt b/LICENSE-JPN.txt index 340b1f37..28ecbc4c 100644 --- a/LICENSE-JPN.txt +++ b/LICENSE-JPN.txt @@ -2,7 +2,7 @@ vChewing macOS: MIT商標不許可ライセンス (MIT-NTL License) © 2011-2022 OpenVanilla Project & © 2021-2022 vChewing Project. 小麦注音入力エンジン開発:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, など。 -威注音 macOS 版の開発:Hiraku Wang, Shiki Suen, など。 +macOS 版威注音の開発:Hiraku Wang, Shiki Suen, など。 威注音語彙データの維持:Shiki Suen。 以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべての人に対し、ソフトウェアを無制限に扱うことを無償で許可します。これには、ソフトウェアの複製を使用、複写、変更、結合、掲載、頒布、サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じことを許可する権利も無制限に含まれます。 diff --git a/Source/WindowNIBs/ja.lproj/frmAboutWindow.strings b/Source/WindowNIBs/ja.lproj/frmAboutWindow.strings index 71ab1f3c..534e0993 100644 --- a/Source/WindowNIBs/ja.lproj/frmAboutWindow.strings +++ b/Source/WindowNIBs/ja.lproj/frmAboutWindow.strings @@ -24,4 +24,4 @@ // "lblCopyright.title" = "© 2011-2022 OpenVanilla Project & © 2021-2022 vChewing Project."; /* Class = "NSTextFieldCell"; title = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development: Shiki Suen, Hiraku Wang, etc.\nvChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "lblCredits"; */ -"lblCredits.title" = "小麦注音入力エンジン開発:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, など。\nmacOS 版の開発:Shiki Suen, Hiraku Wang, など。\n威注音語彙データの維持:Shiki Suen。"; +"lblCredits.title" = "小麦注音入力エンジン開発:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, など。\nmacOS 版威注音の開発:Shiki Suen, Hiraku Wang, など。\n威注音語彙データの維持:Shiki Suen。"; diff --git a/Source/WindowNIBs/zh-Hans.lproj/frmAboutWindow.strings b/Source/WindowNIBs/zh-Hans.lproj/frmAboutWindow.strings index 3657c6b6..0529c644 100644 --- a/Source/WindowNIBs/zh-Hans.lproj/frmAboutWindow.strings +++ b/Source/WindowNIBs/zh-Hans.lproj/frmAboutWindow.strings @@ -24,4 +24,4 @@ // "lblCopyright.title" = "© 2011-2022 OpenVanilla Project & © 2021-2022 vChewing Project."; /* Class = "NSTextFieldCell"; title = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development: Shiki Suen, Hiraku Wang, etc.\nvChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "lblCredits"; */ -"VW8-s5-Wpn.title" = "小麦注音引擎研发:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, 等。\n威注音 macOS 程式研发:Shiki Suen, Hiraku Wang, 等。\n威注音词库维护:Shiki Suen。"; +"lblCredits.title" = "小麦注音引擎研发:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, 等。\n威注音 macOS 程式研发:Shiki Suen, Hiraku Wang, 等。\n威注音词库维护:Shiki Suen。"; diff --git a/Source/WindowNIBs/zh-Hant.lproj/frmAboutWindow.strings b/Source/WindowNIBs/zh-Hant.lproj/frmAboutWindow.strings index fd892d88..665ae1ba 100644 --- a/Source/WindowNIBs/zh-Hant.lproj/frmAboutWindow.strings +++ b/Source/WindowNIBs/zh-Hant.lproj/frmAboutWindow.strings @@ -24,4 +24,4 @@ // "lblCopyright.title" = "© 2011-2022 OpenVanilla Project & © 2021-2022 vChewing Project."; /* Class = "NSTextFieldCell"; title = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development: Shiki Suen, Hiraku Wang, etc.\nvChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "lblCredits"; */ -"VW8-s5-Wpn.title" = "小麥注音引擎研發:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, 等。\n威注音 macOS 程式研發:Shiki Suen, Hiraku Wang, 等。\n威注音詞庫維護:Shiki Suen。"; +"lblCredits.title" = "小麥注音引擎研發:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, 等。\n威注音 macOS 程式研發:Shiki Suen, Hiraku Wang, 等。\n威注音詞庫維護:Shiki Suen。"; From e7830a7828cc9df4e930ccc71b443d6158062c76 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 20 Mar 2022 21:14:08 +0800 Subject: [PATCH 02/17] MainXIB // Fixing defected clipboard keys. --- Source/WindowNIBs/Base.lproj/MainMenu.xib | 269 +++++++++++++++++++++- 1 file changed, 266 insertions(+), 3 deletions(-) diff --git a/Source/WindowNIBs/Base.lproj/MainMenu.xib b/Source/WindowNIBs/Base.lproj/MainMenu.xib index 2c5e937c..986e78cd 100644 --- a/Source/WindowNIBs/Base.lproj/MainMenu.xib +++ b/Source/WindowNIBs/Base.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -37,10 +37,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b9521ddd7f5e0744a601fa299a941159ce26a111 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Mon, 21 Mar 2022 19:10:00 +0800 Subject: [PATCH 03/17] Pkg // Add post-install script to auto-activate IME. --- Installer/pkgPostInstall.sh | 2 ++ vChewing.pkgproj | 38 +++++++++++++++++++------------------ 2 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 Installer/pkgPostInstall.sh diff --git a/Installer/pkgPostInstall.sh b/Installer/pkgPostInstall.sh new file mode 100644 index 00000000..9805eb5f --- /dev/null +++ b/Installer/pkgPostInstall.sh @@ -0,0 +1,2 @@ +#!/bin/sh +~/Library/Input\ Methods/vChewing.app/Contents/MacOS/vChewing install --all diff --git a/vChewing.pkgproj b/vChewing.pkgproj index 65eafd79..67f043e8 100644 --- a/vChewing.pkgproj +++ b/vChewing.pkgproj @@ -686,6 +686,8 @@ POSTINSTALL_PATH + PATH + Installer/pkgPostInstall.sh PATH_TYPE 1 @@ -939,11 +941,11 @@ LANGUAGE - Simplified Chinese + Traditional Chinese VALUE PATH - Installer/pkgTextWarning-CHS.txt + Installer/pkgTextWarning-CHT.txt PATH_TYPE 1 @@ -961,11 +963,11 @@ LANGUAGE - Traditional Chinese + Simplified Chinese VALUE PATH - Installer/pkgTextWarning-CHT.txt + Installer/pkgTextWarning-CHS.txt PATH_TYPE 1 @@ -989,11 +991,11 @@ LANGUAGE - Simplified Chinese + Traditional Chinese VALUE PATH - LICENSE-CHS.txt + LICENSE-CHT.txt PATH_TYPE 1 @@ -1011,11 +1013,11 @@ LANGUAGE - Traditional Chinese + Simplified Chinese VALUE PATH - LICENSE-CHT.txt + LICENSE-CHS.txt PATH_TYPE 1 @@ -1046,9 +1048,9 @@ LANGUAGE - Traditional Chinese + Simplified Chinese VALUE - 威注音輸入法 + 威注音输入法 LANGUAGE @@ -1058,9 +1060,9 @@ LANGUAGE - Simplified Chinese + Traditional Chinese VALUE - 威注音输入法 + 威注音輸入法 @@ -1097,11 +1099,11 @@ LANGUAGE - Traditional Chinese + Simplified Chinese SECONDARY_VALUE - 至少 macOS 10.11.5 方可滿足威注音對系統內的萬國碼版本支援的需要。 + 至少 macOS 10.11.5 方可满足威注音对系统内的万国码版本支援的需要。 VALUE - 作業系統版本太舊 + 作业系统版本太旧 LANGUAGE @@ -1113,11 +1115,11 @@ LANGUAGE - Simplified Chinese + Traditional Chinese SECONDARY_VALUE - 至少 macOS 10.11.5 方可满足威注音对系统内的万国码版本支援的需要。 + 至少 macOS 10.11.5 方可滿足威注音對系統內的萬國碼版本支援的需要。 VALUE - 作业系统版本太旧 + 作業系統版本太舊 NAME From e5abd5d379ca6fb6fea3a9728be10048ffcdf6f1 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Tue, 22 Mar 2022 00:14:58 +0800 Subject: [PATCH 04/17] NotifierUI // Stop enforcing dark material. - Otherwise, it will look terrible when system-wide dark mode is not enabled. --- Source/UI/NotifierUI/NotifierController.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/UI/NotifierUI/NotifierController.swift b/Source/UI/NotifierUI/NotifierController.swift index bc9b7087..d4f83084 100644 --- a/Source/UI/NotifierUI/NotifierController.swift +++ b/Source/UI/NotifierUI/NotifierController.swift @@ -104,7 +104,6 @@ public class NotifierController: NSWindowController, NotifierWindowDelegate { let transparentVisualEffect = NSVisualEffectView() transparentVisualEffect.blendingMode = .behindWindow transparentVisualEffect.state = .active - transparentVisualEffect.material = .dark let panel = NotifierWindow(contentRect: windowRect, styleMask: styleMask, backing: .buffered, defer: false) panel.contentView = transparentVisualEffect From 489cfd5088269e0e1c6484073a683866281fdd82 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Tue, 22 Mar 2022 13:00:58 +0800 Subject: [PATCH 05/17] Readme // Add NAER authorization notice. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e09de7f3..e140742e 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ 威注音輸入法 macOS 版程式維護:Shiki Suen。特別感謝 Hiraku Wong 等人的技術協力。 -威注音詞庫由孫志貴維護,以 3-Clause BSD License 授權釋出。 +威注音詞庫由 Shiki Suen 維護,以 3-Clause BSD License 授權釋出。其中的詞頻數據[由 NAER 授權用於非商業用途](https://twitter.com/ShikiSuen/status/1479329302713831424)。 使用者可自由使用、散播本軟體,惟散播時必須完整保留版權聲明及軟體授權、且一旦經過修改便不可以再繼續使用威注音的產品名稱。 From ba7f4aea8d4560d66bd387838dbce08dd140202b Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Tue, 22 Mar 2022 14:44:13 +0800 Subject: [PATCH 06/17] UPE // Reduce the usage of RegEx replacement. --- UserPhraseEditor/StringExtension.swift | 861 +++++++++++++------------ 1 file changed, 432 insertions(+), 429 deletions(-) diff --git a/UserPhraseEditor/StringExtension.swift b/UserPhraseEditor/StringExtension.swift index e2f149fa..08b1db62 100644 --- a/UserPhraseEditor/StringExtension.swift +++ b/UserPhraseEditor/StringExtension.swift @@ -27,6 +27,9 @@ extension String { self = regex.stringByReplacingMatches(in: self, options: [], range: range, withTemplate: replaceWith) } catch { return } } + mutating func selfReplace(_ strOf: String, _ strWith: String = "") { + self = self.replacingOccurrences(of: strOf, with: strWith) + } mutating func formatConsolidate(HYPY2BPMF: Bool) { // Step 1: Consolidating formats per line. var strProcessed = self @@ -55,435 +58,435 @@ extension String { // 漢語拼音轉注音,得先從最長的可能的拼音組合開始轉起, // 這樣等轉換到更短的可能的漢語拼音組合時就不會出錯。 // 依此類推,聲調放在最後來轉換。 - varLineData.regReplace(pattern: "chuang", replaceWith: "ㄔㄨㄤ") - varLineData.regReplace(pattern: "shuang", replaceWith: "ㄕㄨㄤ") - varLineData.regReplace(pattern: "zhuang", replaceWith: "ㄓㄨㄤ") - varLineData.regReplace(pattern: "chang", replaceWith: "ㄔㄤ") - varLineData.regReplace(pattern: "cheng", replaceWith: "ㄔㄥ") - varLineData.regReplace(pattern: "chong", replaceWith: "ㄔㄨㄥ") - varLineData.regReplace(pattern: "chuai", replaceWith: "ㄔㄨㄞ") - varLineData.regReplace(pattern: "chuan", replaceWith: "ㄔㄨㄢ") - varLineData.regReplace(pattern: "guang", replaceWith: "ㄍㄨㄤ") - varLineData.regReplace(pattern: "huang", replaceWith: "ㄏㄨㄤ") - varLineData.regReplace(pattern: "jiang", replaceWith: "ㄐㄧㄤ") - varLineData.regReplace(pattern: "jiong", replaceWith: "ㄐㄩㄥ") - varLineData.regReplace(pattern: "kuang", replaceWith: "ㄎㄨㄤ") - varLineData.regReplace(pattern: "liang", replaceWith: "ㄌㄧㄤ") - varLineData.regReplace(pattern: "niang", replaceWith: "ㄋㄧㄤ") - varLineData.regReplace(pattern: "qiang", replaceWith: "ㄑㄧㄤ") - varLineData.regReplace(pattern: "qiong", replaceWith: "ㄑㄩㄥ") - varLineData.regReplace(pattern: "shang", replaceWith: "ㄕㄤ") - varLineData.regReplace(pattern: "sheng", replaceWith: "ㄕㄥ") - varLineData.regReplace(pattern: "shuai", replaceWith: "ㄕㄨㄞ") - varLineData.regReplace(pattern: "shuan", replaceWith: "ㄕㄨㄢ") - varLineData.regReplace(pattern: "xiang", replaceWith: "ㄒㄧㄤ") - varLineData.regReplace(pattern: "xiong", replaceWith: "ㄒㄩㄥ") - varLineData.regReplace(pattern: "zhang", replaceWith: "ㄓㄤ") - varLineData.regReplace(pattern: "zheng", replaceWith: "ㄓㄥ") - varLineData.regReplace(pattern: "zhong", replaceWith: "ㄓㄨㄥ") - varLineData.regReplace(pattern: "zhuai", replaceWith: "ㄓㄨㄞ") - varLineData.regReplace(pattern: "zhuan", replaceWith: "ㄓㄨㄢ") - varLineData.regReplace(pattern: "bang", replaceWith: "ㄅㄤ") - varLineData.regReplace(pattern: "beng", replaceWith: "ㄅㄥ") - varLineData.regReplace(pattern: "bian", replaceWith: "ㄅㄧㄢ") - varLineData.regReplace(pattern: "biao", replaceWith: "ㄅㄧㄠ") - varLineData.regReplace(pattern: "bing", replaceWith: "ㄅㄧㄥ") - varLineData.regReplace(pattern: "cang", replaceWith: "ㄘㄤ") - varLineData.regReplace(pattern: "ceng", replaceWith: "ㄘㄥ") - varLineData.regReplace(pattern: "chai", replaceWith: "ㄔㄞ") - varLineData.regReplace(pattern: "chan", replaceWith: "ㄔㄢ") - varLineData.regReplace(pattern: "chao", replaceWith: "ㄔㄠ") - varLineData.regReplace(pattern: "chen", replaceWith: "ㄔㄣ") - varLineData.regReplace(pattern: "chou", replaceWith: "ㄔㄡ") - varLineData.regReplace(pattern: "chua", replaceWith: "ㄔㄨㄚ") - varLineData.regReplace(pattern: "chui", replaceWith: "ㄔㄨㄟ") - varLineData.regReplace(pattern: "chun", replaceWith: "ㄔㄨㄣ") - varLineData.regReplace(pattern: "chuo", replaceWith: "ㄔㄨㄛ") - varLineData.regReplace(pattern: "cong", replaceWith: "ㄘㄨㄥ") - varLineData.regReplace(pattern: "cuan", replaceWith: "ㄘㄨㄢ") - varLineData.regReplace(pattern: "dang", replaceWith: "ㄉㄤ") - varLineData.regReplace(pattern: "deng", replaceWith: "ㄉㄥ") - varLineData.regReplace(pattern: "dian", replaceWith: "ㄉㄧㄢ") - varLineData.regReplace(pattern: "diao", replaceWith: "ㄉㄧㄠ") - varLineData.regReplace(pattern: "ding", replaceWith: "ㄉㄧㄥ") - varLineData.regReplace(pattern: "dong", replaceWith: "ㄉㄨㄥ") - varLineData.regReplace(pattern: "duan", replaceWith: "ㄉㄨㄢ") - varLineData.regReplace(pattern: "fang", replaceWith: "ㄈㄤ") - varLineData.regReplace(pattern: "feng", replaceWith: "ㄈㄥ") - varLineData.regReplace(pattern: "fiao", replaceWith: "ㄈㄧㄠ") - varLineData.regReplace(pattern: "fong", replaceWith: "ㄈㄨㄥ") - varLineData.regReplace(pattern: "gang", replaceWith: "ㄍㄤ") - varLineData.regReplace(pattern: "geng", replaceWith: "ㄍㄥ") - varLineData.regReplace(pattern: "giao", replaceWith: "ㄍㄧㄠ") - varLineData.regReplace(pattern: "gong", replaceWith: "ㄍㄨㄥ") - varLineData.regReplace(pattern: "guai", replaceWith: "ㄍㄨㄞ") - varLineData.regReplace(pattern: "guan", replaceWith: "ㄍㄨㄢ") - varLineData.regReplace(pattern: "hang", replaceWith: "ㄏㄤ") - varLineData.regReplace(pattern: "heng", replaceWith: "ㄏㄥ") - varLineData.regReplace(pattern: "hong", replaceWith: "ㄏㄨㄥ") - varLineData.regReplace(pattern: "huai", replaceWith: "ㄏㄨㄞ") - varLineData.regReplace(pattern: "huan", replaceWith: "ㄏㄨㄢ") - varLineData.regReplace(pattern: "jian", replaceWith: "ㄐㄧㄢ") - varLineData.regReplace(pattern: "jiao", replaceWith: "ㄐㄧㄠ") - varLineData.regReplace(pattern: "jing", replaceWith: "ㄐㄧㄥ") - varLineData.regReplace(pattern: "juan", replaceWith: "ㄐㄩㄢ") - varLineData.regReplace(pattern: "kang", replaceWith: "ㄎㄤ") - varLineData.regReplace(pattern: "keng", replaceWith: "ㄎㄥ") - varLineData.regReplace(pattern: "kong", replaceWith: "ㄎㄨㄥ") - varLineData.regReplace(pattern: "kuai", replaceWith: "ㄎㄨㄞ") - varLineData.regReplace(pattern: "kuan", replaceWith: "ㄎㄨㄢ") - varLineData.regReplace(pattern: "lang", replaceWith: "ㄌㄤ") - varLineData.regReplace(pattern: "leng", replaceWith: "ㄌㄥ") - varLineData.regReplace(pattern: "lian", replaceWith: "ㄌㄧㄢ") - varLineData.regReplace(pattern: "liao", replaceWith: "ㄌㄧㄠ") - varLineData.regReplace(pattern: "ling", replaceWith: "ㄌㄧㄥ") - varLineData.regReplace(pattern: "long", replaceWith: "ㄌㄨㄥ") - varLineData.regReplace(pattern: "luan", replaceWith: "ㄌㄨㄢ") - varLineData.regReplace(pattern: "lvan", replaceWith: "ㄌㄩㄢ") - varLineData.regReplace(pattern: "mang", replaceWith: "ㄇㄤ") - varLineData.regReplace(pattern: "meng", replaceWith: "ㄇㄥ") - varLineData.regReplace(pattern: "mian", replaceWith: "ㄇㄧㄢ") - varLineData.regReplace(pattern: "miao", replaceWith: "ㄇㄧㄠ") - varLineData.regReplace(pattern: "ming", replaceWith: "ㄇㄧㄥ") - varLineData.regReplace(pattern: "nang", replaceWith: "ㄋㄤ") - varLineData.regReplace(pattern: "neng", replaceWith: "ㄋㄥ") - varLineData.regReplace(pattern: "nian", replaceWith: "ㄋㄧㄢ") - varLineData.regReplace(pattern: "niao", replaceWith: "ㄋㄧㄠ") - varLineData.regReplace(pattern: "ning", replaceWith: "ㄋㄧㄥ") - varLineData.regReplace(pattern: "nong", replaceWith: "ㄋㄨㄥ") - varLineData.regReplace(pattern: "nuan", replaceWith: "ㄋㄨㄢ") - varLineData.regReplace(pattern: "pang", replaceWith: "ㄆㄤ") - varLineData.regReplace(pattern: "peng", replaceWith: "ㄆㄥ") - varLineData.regReplace(pattern: "pian", replaceWith: "ㄆㄧㄢ") - varLineData.regReplace(pattern: "piao", replaceWith: "ㄆㄧㄠ") - varLineData.regReplace(pattern: "ping", replaceWith: "ㄆㄧㄥ") - varLineData.regReplace(pattern: "qian", replaceWith: "ㄑㄧㄢ") - varLineData.regReplace(pattern: "qiao", replaceWith: "ㄑㄧㄠ") - varLineData.regReplace(pattern: "qing", replaceWith: "ㄑㄧㄥ") - varLineData.regReplace(pattern: "quan", replaceWith: "ㄑㄩㄢ") - varLineData.regReplace(pattern: "rang", replaceWith: "ㄖㄤ") - varLineData.regReplace(pattern: "reng", replaceWith: "ㄖㄥ") - varLineData.regReplace(pattern: "rong", replaceWith: "ㄖㄨㄥ") - varLineData.regReplace(pattern: "ruan", replaceWith: "ㄖㄨㄢ") - varLineData.regReplace(pattern: "sang", replaceWith: "ㄙㄤ") - varLineData.regReplace(pattern: "seng", replaceWith: "ㄙㄥ") - varLineData.regReplace(pattern: "shai", replaceWith: "ㄕㄞ") - varLineData.regReplace(pattern: "shan", replaceWith: "ㄕㄢ") - varLineData.regReplace(pattern: "shao", replaceWith: "ㄕㄠ") - varLineData.regReplace(pattern: "shei", replaceWith: "ㄕㄟ") - varLineData.regReplace(pattern: "shen", replaceWith: "ㄕㄣ") - varLineData.regReplace(pattern: "shou", replaceWith: "ㄕㄡ") - varLineData.regReplace(pattern: "shua", replaceWith: "ㄕㄨㄚ") - varLineData.regReplace(pattern: "shui", replaceWith: "ㄕㄨㄟ") - varLineData.regReplace(pattern: "shun", replaceWith: "ㄕㄨㄣ") - varLineData.regReplace(pattern: "shuo", replaceWith: "ㄕㄨㄛ") - varLineData.regReplace(pattern: "song", replaceWith: "ㄙㄨㄥ") - varLineData.regReplace(pattern: "suan", replaceWith: "ㄙㄨㄢ") - varLineData.regReplace(pattern: "tang", replaceWith: "ㄊㄤ") - varLineData.regReplace(pattern: "teng", replaceWith: "ㄊㄥ") - varLineData.regReplace(pattern: "tian", replaceWith: "ㄊㄧㄢ") - varLineData.regReplace(pattern: "tiao", replaceWith: "ㄊㄧㄠ") - varLineData.regReplace(pattern: "ting", replaceWith: "ㄊㄧㄥ") - varLineData.regReplace(pattern: "tong", replaceWith: "ㄊㄨㄥ") - varLineData.regReplace(pattern: "tuan", replaceWith: "ㄊㄨㄢ") - varLineData.regReplace(pattern: "wang", replaceWith: "ㄨㄤ") - varLineData.regReplace(pattern: "weng", replaceWith: "ㄨㄥ") - varLineData.regReplace(pattern: "xian", replaceWith: "ㄒㄧㄢ") - varLineData.regReplace(pattern: "xiao", replaceWith: "ㄒㄧㄠ") - varLineData.regReplace(pattern: "xing", replaceWith: "ㄒㄧㄥ") - varLineData.regReplace(pattern: "xuan", replaceWith: "ㄒㄩㄢ") - varLineData.regReplace(pattern: "yang", replaceWith: "ㄧㄤ") - varLineData.regReplace(pattern: "ying", replaceWith: "ㄧㄥ") - varLineData.regReplace(pattern: "yong", replaceWith: "ㄩㄥ") - varLineData.regReplace(pattern: "yuan", replaceWith: "ㄩㄢ") - varLineData.regReplace(pattern: "zang", replaceWith: "ㄗㄤ") - varLineData.regReplace(pattern: "zeng", replaceWith: "ㄗㄥ") - varLineData.regReplace(pattern: "zhai", replaceWith: "ㄓㄞ") - varLineData.regReplace(pattern: "zhan", replaceWith: "ㄓㄢ") - varLineData.regReplace(pattern: "zhao", replaceWith: "ㄓㄠ") - varLineData.regReplace(pattern: "zhei", replaceWith: "ㄓㄟ") - varLineData.regReplace(pattern: "zhen", replaceWith: "ㄓㄣ") - varLineData.regReplace(pattern: "zhou", replaceWith: "ㄓㄡ") - varLineData.regReplace(pattern: "zhua", replaceWith: "ㄓㄨㄚ") - varLineData.regReplace(pattern: "zhui", replaceWith: "ㄓㄨㄟ") - varLineData.regReplace(pattern: "zhun", replaceWith: "ㄓㄨㄣ") - varLineData.regReplace(pattern: "zhuo", replaceWith: "ㄓㄨㄛ") - varLineData.regReplace(pattern: "zong", replaceWith: "ㄗㄨㄥ") - varLineData.regReplace(pattern: "zuan", replaceWith: "ㄗㄨㄢ") - varLineData.regReplace(pattern: "jun", replaceWith: "ㄐㄩㄣ") - varLineData.regReplace(pattern: "ang", replaceWith: "ㄤ") - varLineData.regReplace(pattern: "bai", replaceWith: "ㄅㄞ") - varLineData.regReplace(pattern: "ban", replaceWith: "ㄅㄢ") - varLineData.regReplace(pattern: "bao", replaceWith: "ㄅㄠ") - varLineData.regReplace(pattern: "bei", replaceWith: "ㄅㄟ") - varLineData.regReplace(pattern: "ben", replaceWith: "ㄅㄣ") - varLineData.regReplace(pattern: "bie", replaceWith: "ㄅㄧㄝ") - varLineData.regReplace(pattern: "bin", replaceWith: "ㄅㄧㄣ") - varLineData.regReplace(pattern: "cai", replaceWith: "ㄘㄞ") - varLineData.regReplace(pattern: "can", replaceWith: "ㄘㄢ") - varLineData.regReplace(pattern: "cao", replaceWith: "ㄘㄠ") - varLineData.regReplace(pattern: "cei", replaceWith: "ㄘㄟ") - varLineData.regReplace(pattern: "cen", replaceWith: "ㄘㄣ") - varLineData.regReplace(pattern: "cha", replaceWith: "ㄔㄚ") - varLineData.regReplace(pattern: "che", replaceWith: "ㄔㄜ") - varLineData.regReplace(pattern: "chi", replaceWith: "ㄔ") - varLineData.regReplace(pattern: "chu", replaceWith: "ㄔㄨ") - varLineData.regReplace(pattern: "cou", replaceWith: "ㄘㄡ") - varLineData.regReplace(pattern: "cui", replaceWith: "ㄘㄨㄟ") - varLineData.regReplace(pattern: "cun", replaceWith: "ㄘㄨㄣ") - varLineData.regReplace(pattern: "cuo", replaceWith: "ㄘㄨㄛ") - varLineData.regReplace(pattern: "dai", replaceWith: "ㄉㄞ") - varLineData.regReplace(pattern: "dan", replaceWith: "ㄉㄢ") - varLineData.regReplace(pattern: "dao", replaceWith: "ㄉㄠ") - varLineData.regReplace(pattern: "dei", replaceWith: "ㄉㄟ") - varLineData.regReplace(pattern: "den", replaceWith: "ㄉㄣ") - varLineData.regReplace(pattern: "dia", replaceWith: "ㄉㄧㄚ") - varLineData.regReplace(pattern: "die", replaceWith: "ㄉㄧㄝ") - varLineData.regReplace(pattern: "diu", replaceWith: "ㄉㄧㄡ") - varLineData.regReplace(pattern: "dou", replaceWith: "ㄉㄡ") - varLineData.regReplace(pattern: "dui", replaceWith: "ㄉㄨㄟ") - varLineData.regReplace(pattern: "dun", replaceWith: "ㄉㄨㄣ") - varLineData.regReplace(pattern: "duo", replaceWith: "ㄉㄨㄛ") - varLineData.regReplace(pattern: "eng", replaceWith: "ㄥ") - varLineData.regReplace(pattern: "fan", replaceWith: "ㄈㄢ") - varLineData.regReplace(pattern: "fei", replaceWith: "ㄈㄟ") - varLineData.regReplace(pattern: "fen", replaceWith: "ㄈㄣ") - varLineData.regReplace(pattern: "fou", replaceWith: "ㄈㄡ") - varLineData.regReplace(pattern: "gai", replaceWith: "ㄍㄞ") - varLineData.regReplace(pattern: "gan", replaceWith: "ㄍㄢ") - varLineData.regReplace(pattern: "gao", replaceWith: "ㄍㄠ") - varLineData.regReplace(pattern: "gei", replaceWith: "ㄍㄟ") - varLineData.regReplace(pattern: "gin", replaceWith: "ㄍㄧㄣ") - varLineData.regReplace(pattern: "gen", replaceWith: "ㄍㄣ") - varLineData.regReplace(pattern: "gou", replaceWith: "ㄍㄡ") - varLineData.regReplace(pattern: "gua", replaceWith: "ㄍㄨㄚ") - varLineData.regReplace(pattern: "gue", replaceWith: "ㄍㄨㄜ") - varLineData.regReplace(pattern: "gui", replaceWith: "ㄍㄨㄟ") - varLineData.regReplace(pattern: "gun", replaceWith: "ㄍㄨㄣ") - varLineData.regReplace(pattern: "guo", replaceWith: "ㄍㄨㄛ") - varLineData.regReplace(pattern: "hai", replaceWith: "ㄏㄞ") - varLineData.regReplace(pattern: "han", replaceWith: "ㄏㄢ") - varLineData.regReplace(pattern: "hao", replaceWith: "ㄏㄠ") - varLineData.regReplace(pattern: "hei", replaceWith: "ㄏㄟ") - varLineData.regReplace(pattern: "hen", replaceWith: "ㄏㄣ") - varLineData.regReplace(pattern: "hou", replaceWith: "ㄏㄡ") - varLineData.regReplace(pattern: "hua", replaceWith: "ㄏㄨㄚ") - varLineData.regReplace(pattern: "hui", replaceWith: "ㄏㄨㄟ") - varLineData.regReplace(pattern: "hun", replaceWith: "ㄏㄨㄣ") - varLineData.regReplace(pattern: "huo", replaceWith: "ㄏㄨㄛ") - varLineData.regReplace(pattern: "jia", replaceWith: "ㄐㄧㄚ") - varLineData.regReplace(pattern: "jie", replaceWith: "ㄐㄧㄝ") - varLineData.regReplace(pattern: "jin", replaceWith: "ㄐㄧㄣ") - varLineData.regReplace(pattern: "jiu", replaceWith: "ㄐㄧㄡ") - varLineData.regReplace(pattern: "jue", replaceWith: "ㄐㄩㄝ") - varLineData.regReplace(pattern: "kai", replaceWith: "ㄎㄞ") - varLineData.regReplace(pattern: "kan", replaceWith: "ㄎㄢ") - varLineData.regReplace(pattern: "kao", replaceWith: "ㄎㄠ") - varLineData.regReplace(pattern: "ken", replaceWith: "ㄎㄣ") - varLineData.regReplace(pattern: "kiu", replaceWith: "ㄎㄧㄡ") - varLineData.regReplace(pattern: "kou", replaceWith: "ㄎㄡ") - varLineData.regReplace(pattern: "kua", replaceWith: "ㄎㄨㄚ") - varLineData.regReplace(pattern: "kui", replaceWith: "ㄎㄨㄟ") - varLineData.regReplace(pattern: "kun", replaceWith: "ㄎㄨㄣ") - varLineData.regReplace(pattern: "kuo", replaceWith: "ㄎㄨㄛ") - varLineData.regReplace(pattern: "lai", replaceWith: "ㄌㄞ") - varLineData.regReplace(pattern: "lan", replaceWith: "ㄌㄢ") - varLineData.regReplace(pattern: "lao", replaceWith: "ㄌㄠ") - varLineData.regReplace(pattern: "lei", replaceWith: "ㄌㄟ") - varLineData.regReplace(pattern: "lia", replaceWith: "ㄌㄧㄚ") - varLineData.regReplace(pattern: "lie", replaceWith: "ㄌㄧㄝ") - varLineData.regReplace(pattern: "lin", replaceWith: "ㄌㄧㄣ") - varLineData.regReplace(pattern: "liu", replaceWith: "ㄌㄧㄡ") - varLineData.regReplace(pattern: "lou", replaceWith: "ㄌㄡ") - varLineData.regReplace(pattern: "lun", replaceWith: "ㄌㄨㄣ") - varLineData.regReplace(pattern: "luo", replaceWith: "ㄌㄨㄛ") - varLineData.regReplace(pattern: "lve", replaceWith: "ㄌㄩㄝ") - varLineData.regReplace(pattern: "mai", replaceWith: "ㄇㄞ") - varLineData.regReplace(pattern: "man", replaceWith: "ㄇㄢ") - varLineData.regReplace(pattern: "mao", replaceWith: "ㄇㄠ") - varLineData.regReplace(pattern: "mei", replaceWith: "ㄇㄟ") - varLineData.regReplace(pattern: "men", replaceWith: "ㄇㄣ") - varLineData.regReplace(pattern: "mie", replaceWith: "ㄇㄧㄝ") - varLineData.regReplace(pattern: "min", replaceWith: "ㄇㄧㄣ") - varLineData.regReplace(pattern: "miu", replaceWith: "ㄇㄧㄡ") - varLineData.regReplace(pattern: "mou", replaceWith: "ㄇㄡ") - varLineData.regReplace(pattern: "nai", replaceWith: "ㄋㄞ") - varLineData.regReplace(pattern: "nan", replaceWith: "ㄋㄢ") - varLineData.regReplace(pattern: "nao", replaceWith: "ㄋㄠ") - varLineData.regReplace(pattern: "nei", replaceWith: "ㄋㄟ") - varLineData.regReplace(pattern: "nen", replaceWith: "ㄋㄣ") - varLineData.regReplace(pattern: "nie", replaceWith: "ㄋㄧㄝ") - varLineData.regReplace(pattern: "nin", replaceWith: "ㄋㄧㄣ") - varLineData.regReplace(pattern: "niu", replaceWith: "ㄋㄧㄡ") - varLineData.regReplace(pattern: "nou", replaceWith: "ㄋㄡ") - varLineData.regReplace(pattern: "nui", replaceWith: "ㄋㄨㄟ") - varLineData.regReplace(pattern: "nun", replaceWith: "ㄋㄨㄣ") - varLineData.regReplace(pattern: "nuo", replaceWith: "ㄋㄨㄛ") - varLineData.regReplace(pattern: "nve", replaceWith: "ㄋㄩㄝ") - varLineData.regReplace(pattern: "pai", replaceWith: "ㄆㄞ") - varLineData.regReplace(pattern: "pan", replaceWith: "ㄆㄢ") - varLineData.regReplace(pattern: "pao", replaceWith: "ㄆㄠ") - varLineData.regReplace(pattern: "pei", replaceWith: "ㄆㄟ") - varLineData.regReplace(pattern: "pen", replaceWith: "ㄆㄣ") - varLineData.regReplace(pattern: "pia", replaceWith: "ㄆㄧㄚ") - varLineData.regReplace(pattern: "pie", replaceWith: "ㄆㄧㄝ") - varLineData.regReplace(pattern: "pin", replaceWith: "ㄆㄧㄣ") - varLineData.regReplace(pattern: "pou", replaceWith: "ㄆㄡ") - varLineData.regReplace(pattern: "qia", replaceWith: "ㄑㄧㄚ") - varLineData.regReplace(pattern: "qie", replaceWith: "ㄑㄧㄝ") - varLineData.regReplace(pattern: "qin", replaceWith: "ㄑㄧㄣ") - varLineData.regReplace(pattern: "qiu", replaceWith: "ㄑㄧㄡ") - varLineData.regReplace(pattern: "que", replaceWith: "ㄑㄩㄝ") - varLineData.regReplace(pattern: "qun", replaceWith: "ㄑㄩㄣ") - varLineData.regReplace(pattern: "ran", replaceWith: "ㄖㄢ") - varLineData.regReplace(pattern: "rao", replaceWith: "ㄖㄠ") - varLineData.regReplace(pattern: "ren", replaceWith: "ㄖㄣ") - varLineData.regReplace(pattern: "rou", replaceWith: "ㄖㄡ") - varLineData.regReplace(pattern: "rui", replaceWith: "ㄖㄨㄟ") - varLineData.regReplace(pattern: "run", replaceWith: "ㄖㄨㄣ") - varLineData.regReplace(pattern: "ruo", replaceWith: "ㄖㄨㄛ") - varLineData.regReplace(pattern: "sai", replaceWith: "ㄙㄞ") - varLineData.regReplace(pattern: "san", replaceWith: "ㄙㄢ") - varLineData.regReplace(pattern: "sao", replaceWith: "ㄙㄠ") - varLineData.regReplace(pattern: "sei", replaceWith: "ㄙㄟ") - varLineData.regReplace(pattern: "sen", replaceWith: "ㄙㄣ") - varLineData.regReplace(pattern: "sha", replaceWith: "ㄕㄚ") - varLineData.regReplace(pattern: "she", replaceWith: "ㄕㄜ") - varLineData.regReplace(pattern: "shi", replaceWith: "ㄕ") - varLineData.regReplace(pattern: "shu", replaceWith: "ㄕㄨ") - varLineData.regReplace(pattern: "sou", replaceWith: "ㄙㄡ") - varLineData.regReplace(pattern: "sui", replaceWith: "ㄙㄨㄟ") - varLineData.regReplace(pattern: "sun", replaceWith: "ㄙㄨㄣ") - varLineData.regReplace(pattern: "suo", replaceWith: "ㄙㄨㄛ") - varLineData.regReplace(pattern: "tai", replaceWith: "ㄊㄞ") - varLineData.regReplace(pattern: "tan", replaceWith: "ㄊㄢ") - varLineData.regReplace(pattern: "tao", replaceWith: "ㄊㄠ") - varLineData.regReplace(pattern: "tie", replaceWith: "ㄊㄧㄝ") - varLineData.regReplace(pattern: "tou", replaceWith: "ㄊㄡ") - varLineData.regReplace(pattern: "tui", replaceWith: "ㄊㄨㄟ") - varLineData.regReplace(pattern: "tun", replaceWith: "ㄊㄨㄣ") - varLineData.regReplace(pattern: "tuo", replaceWith: "ㄊㄨㄛ") - varLineData.regReplace(pattern: "wai", replaceWith: "ㄨㄞ") - varLineData.regReplace(pattern: "wan", replaceWith: "ㄨㄢ") - varLineData.regReplace(pattern: "wei", replaceWith: "ㄨㄟ") - varLineData.regReplace(pattern: "wen", replaceWith: "ㄨㄣ") - varLineData.regReplace(pattern: "xia", replaceWith: "ㄒㄧㄚ") - varLineData.regReplace(pattern: "xie", replaceWith: "ㄒㄧㄝ") - varLineData.regReplace(pattern: "xin", replaceWith: "ㄒㄧㄣ") - varLineData.regReplace(pattern: "xiu", replaceWith: "ㄒㄧㄡ") - varLineData.regReplace(pattern: "xue", replaceWith: "ㄒㄩㄝ") - varLineData.regReplace(pattern: "xun", replaceWith: "ㄒㄩㄣ") - varLineData.regReplace(pattern: "yai", replaceWith: "ㄧㄞ") - varLineData.regReplace(pattern: "yan", replaceWith: "ㄧㄢ") - varLineData.regReplace(pattern: "yao", replaceWith: "ㄧㄠ") - varLineData.regReplace(pattern: "yin", replaceWith: "ㄧㄣ") - varLineData.regReplace(pattern: "you", replaceWith: "ㄧㄡ") - varLineData.regReplace(pattern: "yue", replaceWith: "ㄩㄝ") - varLineData.regReplace(pattern: "yun", replaceWith: "ㄩㄣ") - varLineData.regReplace(pattern: "zai", replaceWith: "ㄗㄞ") - varLineData.regReplace(pattern: "zan", replaceWith: "ㄗㄢ") - varLineData.regReplace(pattern: "zao", replaceWith: "ㄗㄠ") - varLineData.regReplace(pattern: "zei", replaceWith: "ㄗㄟ") - varLineData.regReplace(pattern: "zen", replaceWith: "ㄗㄣ") - varLineData.regReplace(pattern: "zha", replaceWith: "ㄓㄚ") - varLineData.regReplace(pattern: "zhe", replaceWith: "ㄓㄜ") - varLineData.regReplace(pattern: "zhi", replaceWith: "ㄓ") - varLineData.regReplace(pattern: "zhu", replaceWith: "ㄓㄨ") - varLineData.regReplace(pattern: "zou", replaceWith: "ㄗㄡ") - varLineData.regReplace(pattern: "zui", replaceWith: "ㄗㄨㄟ") - varLineData.regReplace(pattern: "zun", replaceWith: "ㄗㄨㄣ") - varLineData.regReplace(pattern: "zuo", replaceWith: "ㄗㄨㄛ") - varLineData.regReplace(pattern: "ai", replaceWith: "ㄞ") - varLineData.regReplace(pattern: "an", replaceWith: "ㄢ") - varLineData.regReplace(pattern: "ao", replaceWith: "ㄠ") - varLineData.regReplace(pattern: "ba", replaceWith: "ㄅㄚ") - varLineData.regReplace(pattern: "bi", replaceWith: "ㄅㄧ") - varLineData.regReplace(pattern: "bo", replaceWith: "ㄅㄛ") - varLineData.regReplace(pattern: "bu", replaceWith: "ㄅㄨ") - varLineData.regReplace(pattern: "ca", replaceWith: "ㄘㄚ") - varLineData.regReplace(pattern: "ce", replaceWith: "ㄘㄜ") - varLineData.regReplace(pattern: "ci", replaceWith: "ㄘ") - varLineData.regReplace(pattern: "cu", replaceWith: "ㄘㄨ") - varLineData.regReplace(pattern: "da", replaceWith: "ㄉㄚ") - varLineData.regReplace(pattern: "de", replaceWith: "ㄉㄜ") - varLineData.regReplace(pattern: "di", replaceWith: "ㄉㄧ") - varLineData.regReplace(pattern: "du", replaceWith: "ㄉㄨ") - varLineData.regReplace(pattern: "eh", replaceWith: "ㄝ") - varLineData.regReplace(pattern: "ei", replaceWith: "ㄟ") - varLineData.regReplace(pattern: "en", replaceWith: "ㄣ") - varLineData.regReplace(pattern: "er", replaceWith: "ㄦ") - varLineData.regReplace(pattern: "fa", replaceWith: "ㄈㄚ") - varLineData.regReplace(pattern: "fo", replaceWith: "ㄈㄛ") - varLineData.regReplace(pattern: "fu", replaceWith: "ㄈㄨ") - varLineData.regReplace(pattern: "ga", replaceWith: "ㄍㄚ") - varLineData.regReplace(pattern: "ge", replaceWith: "ㄍㄜ") - varLineData.regReplace(pattern: "gi", replaceWith: "ㄍㄧ") - varLineData.regReplace(pattern: "gu", replaceWith: "ㄍㄨ") - varLineData.regReplace(pattern: "ha", replaceWith: "ㄏㄚ") - varLineData.regReplace(pattern: "he", replaceWith: "ㄏㄜ") - varLineData.regReplace(pattern: "hu", replaceWith: "ㄏㄨ") - varLineData.regReplace(pattern: "ji", replaceWith: "ㄐㄧ") - varLineData.regReplace(pattern: "ju", replaceWith: "ㄐㄩ") - varLineData.regReplace(pattern: "ka", replaceWith: "ㄎㄚ") - varLineData.regReplace(pattern: "ke", replaceWith: "ㄎㄜ") - varLineData.regReplace(pattern: "ku", replaceWith: "ㄎㄨ") - varLineData.regReplace(pattern: "la", replaceWith: "ㄌㄚ") - varLineData.regReplace(pattern: "le", replaceWith: "ㄌㄜ") - varLineData.regReplace(pattern: "li", replaceWith: "ㄌㄧ") - varLineData.regReplace(pattern: "lo", replaceWith: "ㄌㄛ") - varLineData.regReplace(pattern: "lu", replaceWith: "ㄌㄨ") - varLineData.regReplace(pattern: "lv", replaceWith: "ㄌㄩ") - varLineData.regReplace(pattern: "ma", replaceWith: "ㄇㄚ") - varLineData.regReplace(pattern: "me", replaceWith: "ㄇㄜ") - varLineData.regReplace(pattern: "mi", replaceWith: "ㄇㄧ") - varLineData.regReplace(pattern: "mo", replaceWith: "ㄇㄛ") - varLineData.regReplace(pattern: "mu", replaceWith: "ㄇㄨ") - varLineData.regReplace(pattern: "na", replaceWith: "ㄋㄚ") - varLineData.regReplace(pattern: "ne", replaceWith: "ㄋㄜ") - varLineData.regReplace(pattern: "ni", replaceWith: "ㄋㄧ") - varLineData.regReplace(pattern: "nu", replaceWith: "ㄋㄨ") - varLineData.regReplace(pattern: "nv", replaceWith: "ㄋㄩ") - varLineData.regReplace(pattern: "ou", replaceWith: "ㄡ") - varLineData.regReplace(pattern: "pa", replaceWith: "ㄆㄚ") - varLineData.regReplace(pattern: "pi", replaceWith: "ㄆㄧ") - varLineData.regReplace(pattern: "po", replaceWith: "ㄆㄛ") - varLineData.regReplace(pattern: "pu", replaceWith: "ㄆㄨ") - varLineData.regReplace(pattern: "qi", replaceWith: "ㄑㄧ") - varLineData.regReplace(pattern: "qu", replaceWith: "ㄑㄩ") - varLineData.regReplace(pattern: "re", replaceWith: "ㄖㄜ") - varLineData.regReplace(pattern: "ri", replaceWith: "ㄖ") - varLineData.regReplace(pattern: "ru", replaceWith: "ㄖㄨ") - varLineData.regReplace(pattern: "sa", replaceWith: "ㄙㄚ") - varLineData.regReplace(pattern: "se", replaceWith: "ㄙㄜ") - varLineData.regReplace(pattern: "si", replaceWith: "ㄙ") - varLineData.regReplace(pattern: "su", replaceWith: "ㄙㄨ") - varLineData.regReplace(pattern: "ta", replaceWith: "ㄊㄚ") - varLineData.regReplace(pattern: "te", replaceWith: "ㄊㄜ") - varLineData.regReplace(pattern: "ti", replaceWith: "ㄊㄧ") - varLineData.regReplace(pattern: "tu", replaceWith: "ㄊㄨ") - varLineData.regReplace(pattern: "wa", replaceWith: "ㄨㄚ") - varLineData.regReplace(pattern: "wo", replaceWith: "ㄨㄛ") - varLineData.regReplace(pattern: "wu", replaceWith: "ㄨ") - varLineData.regReplace(pattern: "xi", replaceWith: "ㄒㄧ") - varLineData.regReplace(pattern: "xu", replaceWith: "ㄒㄩ") - varLineData.regReplace(pattern: "ya", replaceWith: "ㄧㄚ") - varLineData.regReplace(pattern: "ye", replaceWith: "ㄧㄝ") - varLineData.regReplace(pattern: "yi", replaceWith: "ㄧ") - varLineData.regReplace(pattern: "yo", replaceWith: "ㄧㄛ") - varLineData.regReplace(pattern: "yu", replaceWith: "ㄩ") - varLineData.regReplace(pattern: "za", replaceWith: "ㄗㄚ") - varLineData.regReplace(pattern: "ze", replaceWith: "ㄗㄜ") - varLineData.regReplace(pattern: "zi", replaceWith: "ㄗ") - varLineData.regReplace(pattern: "zu", replaceWith: "ㄗㄨ") - varLineData.regReplace(pattern: "a", replaceWith: "ㄚ") - varLineData.regReplace(pattern: "e", replaceWith: "ㄜ") - varLineData.regReplace(pattern: "o", replaceWith: "ㄛ") - varLineData.regReplace(pattern: "q", replaceWith: "ㄑ") - varLineData.regReplace(pattern: "2", replaceWith: "ˊ") - varLineData.regReplace(pattern: "3", replaceWith: "ˇ") - varLineData.regReplace(pattern: "4", replaceWith: "ˋ") - varLineData.regReplace(pattern: "5", replaceWith: "˙") - varLineData.regReplace(pattern: "1", replaceWith: "") + varLineData.selfReplace("chuang", "ㄔㄨㄤ") + varLineData.selfReplace("shuang", "ㄕㄨㄤ") + varLineData.selfReplace("zhuang", "ㄓㄨㄤ") + varLineData.selfReplace("chang", "ㄔㄤ") + varLineData.selfReplace("cheng", "ㄔㄥ") + varLineData.selfReplace("chong", "ㄔㄨㄥ") + varLineData.selfReplace("chuai", "ㄔㄨㄞ") + varLineData.selfReplace("chuan", "ㄔㄨㄢ") + varLineData.selfReplace("guang", "ㄍㄨㄤ") + varLineData.selfReplace("huang", "ㄏㄨㄤ") + varLineData.selfReplace("jiang", "ㄐㄧㄤ") + varLineData.selfReplace("jiong", "ㄐㄩㄥ") + varLineData.selfReplace("kuang", "ㄎㄨㄤ") + varLineData.selfReplace("liang", "ㄌㄧㄤ") + varLineData.selfReplace("niang", "ㄋㄧㄤ") + varLineData.selfReplace("qiang", "ㄑㄧㄤ") + varLineData.selfReplace("qiong", "ㄑㄩㄥ") + varLineData.selfReplace("shang", "ㄕㄤ") + varLineData.selfReplace("sheng", "ㄕㄥ") + varLineData.selfReplace("shuai", "ㄕㄨㄞ") + varLineData.selfReplace("shuan", "ㄕㄨㄢ") + varLineData.selfReplace("xiang", "ㄒㄧㄤ") + varLineData.selfReplace("xiong", "ㄒㄩㄥ") + varLineData.selfReplace("zhang", "ㄓㄤ") + varLineData.selfReplace("zheng", "ㄓㄥ") + varLineData.selfReplace("zhong", "ㄓㄨㄥ") + varLineData.selfReplace("zhuai", "ㄓㄨㄞ") + varLineData.selfReplace("zhuan", "ㄓㄨㄢ") + varLineData.selfReplace("bang", "ㄅㄤ") + varLineData.selfReplace("beng", "ㄅㄥ") + varLineData.selfReplace("bian", "ㄅㄧㄢ") + varLineData.selfReplace("biao", "ㄅㄧㄠ") + varLineData.selfReplace("bing", "ㄅㄧㄥ") + varLineData.selfReplace("cang", "ㄘㄤ") + varLineData.selfReplace("ceng", "ㄘㄥ") + varLineData.selfReplace("chai", "ㄔㄞ") + varLineData.selfReplace("chan", "ㄔㄢ") + varLineData.selfReplace("chao", "ㄔㄠ") + varLineData.selfReplace("chen", "ㄔㄣ") + varLineData.selfReplace("chou", "ㄔㄡ") + varLineData.selfReplace("chua", "ㄔㄨㄚ") + varLineData.selfReplace("chui", "ㄔㄨㄟ") + varLineData.selfReplace("chun", "ㄔㄨㄣ") + varLineData.selfReplace("chuo", "ㄔㄨㄛ") + varLineData.selfReplace("cong", "ㄘㄨㄥ") + varLineData.selfReplace("cuan", "ㄘㄨㄢ") + varLineData.selfReplace("dang", "ㄉㄤ") + varLineData.selfReplace("deng", "ㄉㄥ") + varLineData.selfReplace("dian", "ㄉㄧㄢ") + varLineData.selfReplace("diao", "ㄉㄧㄠ") + varLineData.selfReplace("ding", "ㄉㄧㄥ") + varLineData.selfReplace("dong", "ㄉㄨㄥ") + varLineData.selfReplace("duan", "ㄉㄨㄢ") + varLineData.selfReplace("fang", "ㄈㄤ") + varLineData.selfReplace("feng", "ㄈㄥ") + varLineData.selfReplace("fiao", "ㄈㄧㄠ") + varLineData.selfReplace("fong", "ㄈㄨㄥ") + varLineData.selfReplace("gang", "ㄍㄤ") + varLineData.selfReplace("geng", "ㄍㄥ") + varLineData.selfReplace("giao", "ㄍㄧㄠ") + varLineData.selfReplace("gong", "ㄍㄨㄥ") + varLineData.selfReplace("guai", "ㄍㄨㄞ") + varLineData.selfReplace("guan", "ㄍㄨㄢ") + varLineData.selfReplace("hang", "ㄏㄤ") + varLineData.selfReplace("heng", "ㄏㄥ") + varLineData.selfReplace("hong", "ㄏㄨㄥ") + varLineData.selfReplace("huai", "ㄏㄨㄞ") + varLineData.selfReplace("huan", "ㄏㄨㄢ") + varLineData.selfReplace("jian", "ㄐㄧㄢ") + varLineData.selfReplace("jiao", "ㄐㄧㄠ") + varLineData.selfReplace("jing", "ㄐㄧㄥ") + varLineData.selfReplace("juan", "ㄐㄩㄢ") + varLineData.selfReplace("kang", "ㄎㄤ") + varLineData.selfReplace("keng", "ㄎㄥ") + varLineData.selfReplace("kong", "ㄎㄨㄥ") + varLineData.selfReplace("kuai", "ㄎㄨㄞ") + varLineData.selfReplace("kuan", "ㄎㄨㄢ") + varLineData.selfReplace("lang", "ㄌㄤ") + varLineData.selfReplace("leng", "ㄌㄥ") + varLineData.selfReplace("lian", "ㄌㄧㄢ") + varLineData.selfReplace("liao", "ㄌㄧㄠ") + varLineData.selfReplace("ling", "ㄌㄧㄥ") + varLineData.selfReplace("long", "ㄌㄨㄥ") + varLineData.selfReplace("luan", "ㄌㄨㄢ") + varLineData.selfReplace("lvan", "ㄌㄩㄢ") + varLineData.selfReplace("mang", "ㄇㄤ") + varLineData.selfReplace("meng", "ㄇㄥ") + varLineData.selfReplace("mian", "ㄇㄧㄢ") + varLineData.selfReplace("miao", "ㄇㄧㄠ") + varLineData.selfReplace("ming", "ㄇㄧㄥ") + varLineData.selfReplace("nang", "ㄋㄤ") + varLineData.selfReplace("neng", "ㄋㄥ") + varLineData.selfReplace("nian", "ㄋㄧㄢ") + varLineData.selfReplace("niao", "ㄋㄧㄠ") + varLineData.selfReplace("ning", "ㄋㄧㄥ") + varLineData.selfReplace("nong", "ㄋㄨㄥ") + varLineData.selfReplace("nuan", "ㄋㄨㄢ") + varLineData.selfReplace("pang", "ㄆㄤ") + varLineData.selfReplace("peng", "ㄆㄥ") + varLineData.selfReplace("pian", "ㄆㄧㄢ") + varLineData.selfReplace("piao", "ㄆㄧㄠ") + varLineData.selfReplace("ping", "ㄆㄧㄥ") + varLineData.selfReplace("qian", "ㄑㄧㄢ") + varLineData.selfReplace("qiao", "ㄑㄧㄠ") + varLineData.selfReplace("qing", "ㄑㄧㄥ") + varLineData.selfReplace("quan", "ㄑㄩㄢ") + varLineData.selfReplace("rang", "ㄖㄤ") + varLineData.selfReplace("reng", "ㄖㄥ") + varLineData.selfReplace("rong", "ㄖㄨㄥ") + varLineData.selfReplace("ruan", "ㄖㄨㄢ") + varLineData.selfReplace("sang", "ㄙㄤ") + varLineData.selfReplace("seng", "ㄙㄥ") + varLineData.selfReplace("shai", "ㄕㄞ") + varLineData.selfReplace("shan", "ㄕㄢ") + varLineData.selfReplace("shao", "ㄕㄠ") + varLineData.selfReplace("shei", "ㄕㄟ") + varLineData.selfReplace("shen", "ㄕㄣ") + varLineData.selfReplace("shou", "ㄕㄡ") + varLineData.selfReplace("shua", "ㄕㄨㄚ") + varLineData.selfReplace("shui", "ㄕㄨㄟ") + varLineData.selfReplace("shun", "ㄕㄨㄣ") + varLineData.selfReplace("shuo", "ㄕㄨㄛ") + varLineData.selfReplace("song", "ㄙㄨㄥ") + varLineData.selfReplace("suan", "ㄙㄨㄢ") + varLineData.selfReplace("tang", "ㄊㄤ") + varLineData.selfReplace("teng", "ㄊㄥ") + varLineData.selfReplace("tian", "ㄊㄧㄢ") + varLineData.selfReplace("tiao", "ㄊㄧㄠ") + varLineData.selfReplace("ting", "ㄊㄧㄥ") + varLineData.selfReplace("tong", "ㄊㄨㄥ") + varLineData.selfReplace("tuan", "ㄊㄨㄢ") + varLineData.selfReplace("wang", "ㄨㄤ") + varLineData.selfReplace("weng", "ㄨㄥ") + varLineData.selfReplace("xian", "ㄒㄧㄢ") + varLineData.selfReplace("xiao", "ㄒㄧㄠ") + varLineData.selfReplace("xing", "ㄒㄧㄥ") + varLineData.selfReplace("xuan", "ㄒㄩㄢ") + varLineData.selfReplace("yang", "ㄧㄤ") + varLineData.selfReplace("ying", "ㄧㄥ") + varLineData.selfReplace("yong", "ㄩㄥ") + varLineData.selfReplace("yuan", "ㄩㄢ") + varLineData.selfReplace("zang", "ㄗㄤ") + varLineData.selfReplace("zeng", "ㄗㄥ") + varLineData.selfReplace("zhai", "ㄓㄞ") + varLineData.selfReplace("zhan", "ㄓㄢ") + varLineData.selfReplace("zhao", "ㄓㄠ") + varLineData.selfReplace("zhei", "ㄓㄟ") + varLineData.selfReplace("zhen", "ㄓㄣ") + varLineData.selfReplace("zhou", "ㄓㄡ") + varLineData.selfReplace("zhua", "ㄓㄨㄚ") + varLineData.selfReplace("zhui", "ㄓㄨㄟ") + varLineData.selfReplace("zhun", "ㄓㄨㄣ") + varLineData.selfReplace("zhuo", "ㄓㄨㄛ") + varLineData.selfReplace("zong", "ㄗㄨㄥ") + varLineData.selfReplace("zuan", "ㄗㄨㄢ") + varLineData.selfReplace("jun", "ㄐㄩㄣ") + varLineData.selfReplace("ang", "ㄤ") + varLineData.selfReplace("bai", "ㄅㄞ") + varLineData.selfReplace("ban", "ㄅㄢ") + varLineData.selfReplace("bao", "ㄅㄠ") + varLineData.selfReplace("bei", "ㄅㄟ") + varLineData.selfReplace("ben", "ㄅㄣ") + varLineData.selfReplace("bie", "ㄅㄧㄝ") + varLineData.selfReplace("bin", "ㄅㄧㄣ") + varLineData.selfReplace("cai", "ㄘㄞ") + varLineData.selfReplace("can", "ㄘㄢ") + varLineData.selfReplace("cao", "ㄘㄠ") + varLineData.selfReplace("cei", "ㄘㄟ") + varLineData.selfReplace("cen", "ㄘㄣ") + varLineData.selfReplace("cha", "ㄔㄚ") + varLineData.selfReplace("che", "ㄔㄜ") + varLineData.selfReplace("chi", "ㄔ") + varLineData.selfReplace("chu", "ㄔㄨ") + varLineData.selfReplace("cou", "ㄘㄡ") + varLineData.selfReplace("cui", "ㄘㄨㄟ") + varLineData.selfReplace("cun", "ㄘㄨㄣ") + varLineData.selfReplace("cuo", "ㄘㄨㄛ") + varLineData.selfReplace("dai", "ㄉㄞ") + varLineData.selfReplace("dan", "ㄉㄢ") + varLineData.selfReplace("dao", "ㄉㄠ") + varLineData.selfReplace("dei", "ㄉㄟ") + varLineData.selfReplace("den", "ㄉㄣ") + varLineData.selfReplace("dia", "ㄉㄧㄚ") + varLineData.selfReplace("die", "ㄉㄧㄝ") + varLineData.selfReplace("diu", "ㄉㄧㄡ") + varLineData.selfReplace("dou", "ㄉㄡ") + varLineData.selfReplace("dui", "ㄉㄨㄟ") + varLineData.selfReplace("dun", "ㄉㄨㄣ") + varLineData.selfReplace("duo", "ㄉㄨㄛ") + varLineData.selfReplace("eng", "ㄥ") + varLineData.selfReplace("fan", "ㄈㄢ") + varLineData.selfReplace("fei", "ㄈㄟ") + varLineData.selfReplace("fen", "ㄈㄣ") + varLineData.selfReplace("fou", "ㄈㄡ") + varLineData.selfReplace("gai", "ㄍㄞ") + varLineData.selfReplace("gan", "ㄍㄢ") + varLineData.selfReplace("gao", "ㄍㄠ") + varLineData.selfReplace("gei", "ㄍㄟ") + varLineData.selfReplace("gin", "ㄍㄧㄣ") + varLineData.selfReplace("gen", "ㄍㄣ") + varLineData.selfReplace("gou", "ㄍㄡ") + varLineData.selfReplace("gua", "ㄍㄨㄚ") + varLineData.selfReplace("gue", "ㄍㄨㄜ") + varLineData.selfReplace("gui", "ㄍㄨㄟ") + varLineData.selfReplace("gun", "ㄍㄨㄣ") + varLineData.selfReplace("guo", "ㄍㄨㄛ") + varLineData.selfReplace("hai", "ㄏㄞ") + varLineData.selfReplace("han", "ㄏㄢ") + varLineData.selfReplace("hao", "ㄏㄠ") + varLineData.selfReplace("hei", "ㄏㄟ") + varLineData.selfReplace("hen", "ㄏㄣ") + varLineData.selfReplace("hou", "ㄏㄡ") + varLineData.selfReplace("hua", "ㄏㄨㄚ") + varLineData.selfReplace("hui", "ㄏㄨㄟ") + varLineData.selfReplace("hun", "ㄏㄨㄣ") + varLineData.selfReplace("huo", "ㄏㄨㄛ") + varLineData.selfReplace("jia", "ㄐㄧㄚ") + varLineData.selfReplace("jie", "ㄐㄧㄝ") + varLineData.selfReplace("jin", "ㄐㄧㄣ") + varLineData.selfReplace("jiu", "ㄐㄧㄡ") + varLineData.selfReplace("jue", "ㄐㄩㄝ") + varLineData.selfReplace("kai", "ㄎㄞ") + varLineData.selfReplace("kan", "ㄎㄢ") + varLineData.selfReplace("kao", "ㄎㄠ") + varLineData.selfReplace("ken", "ㄎㄣ") + varLineData.selfReplace("kiu", "ㄎㄧㄡ") + varLineData.selfReplace("kou", "ㄎㄡ") + varLineData.selfReplace("kua", "ㄎㄨㄚ") + varLineData.selfReplace("kui", "ㄎㄨㄟ") + varLineData.selfReplace("kun", "ㄎㄨㄣ") + varLineData.selfReplace("kuo", "ㄎㄨㄛ") + varLineData.selfReplace("lai", "ㄌㄞ") + varLineData.selfReplace("lan", "ㄌㄢ") + varLineData.selfReplace("lao", "ㄌㄠ") + varLineData.selfReplace("lei", "ㄌㄟ") + varLineData.selfReplace("lia", "ㄌㄧㄚ") + varLineData.selfReplace("lie", "ㄌㄧㄝ") + varLineData.selfReplace("lin", "ㄌㄧㄣ") + varLineData.selfReplace("liu", "ㄌㄧㄡ") + varLineData.selfReplace("lou", "ㄌㄡ") + varLineData.selfReplace("lun", "ㄌㄨㄣ") + varLineData.selfReplace("luo", "ㄌㄨㄛ") + varLineData.selfReplace("lve", "ㄌㄩㄝ") + varLineData.selfReplace("mai", "ㄇㄞ") + varLineData.selfReplace("man", "ㄇㄢ") + varLineData.selfReplace("mao", "ㄇㄠ") + varLineData.selfReplace("mei", "ㄇㄟ") + varLineData.selfReplace("men", "ㄇㄣ") + varLineData.selfReplace("mie", "ㄇㄧㄝ") + varLineData.selfReplace("min", "ㄇㄧㄣ") + varLineData.selfReplace("miu", "ㄇㄧㄡ") + varLineData.selfReplace("mou", "ㄇㄡ") + varLineData.selfReplace("nai", "ㄋㄞ") + varLineData.selfReplace("nan", "ㄋㄢ") + varLineData.selfReplace("nao", "ㄋㄠ") + varLineData.selfReplace("nei", "ㄋㄟ") + varLineData.selfReplace("nen", "ㄋㄣ") + varLineData.selfReplace("nie", "ㄋㄧㄝ") + varLineData.selfReplace("nin", "ㄋㄧㄣ") + varLineData.selfReplace("niu", "ㄋㄧㄡ") + varLineData.selfReplace("nou", "ㄋㄡ") + varLineData.selfReplace("nui", "ㄋㄨㄟ") + varLineData.selfReplace("nun", "ㄋㄨㄣ") + varLineData.selfReplace("nuo", "ㄋㄨㄛ") + varLineData.selfReplace("nve", "ㄋㄩㄝ") + varLineData.selfReplace("pai", "ㄆㄞ") + varLineData.selfReplace("pan", "ㄆㄢ") + varLineData.selfReplace("pao", "ㄆㄠ") + varLineData.selfReplace("pei", "ㄆㄟ") + varLineData.selfReplace("pen", "ㄆㄣ") + varLineData.selfReplace("pia", "ㄆㄧㄚ") + varLineData.selfReplace("pie", "ㄆㄧㄝ") + varLineData.selfReplace("pin", "ㄆㄧㄣ") + varLineData.selfReplace("pou", "ㄆㄡ") + varLineData.selfReplace("qia", "ㄑㄧㄚ") + varLineData.selfReplace("qie", "ㄑㄧㄝ") + varLineData.selfReplace("qin", "ㄑㄧㄣ") + varLineData.selfReplace("qiu", "ㄑㄧㄡ") + varLineData.selfReplace("que", "ㄑㄩㄝ") + varLineData.selfReplace("qun", "ㄑㄩㄣ") + varLineData.selfReplace("ran", "ㄖㄢ") + varLineData.selfReplace("rao", "ㄖㄠ") + varLineData.selfReplace("ren", "ㄖㄣ") + varLineData.selfReplace("rou", "ㄖㄡ") + varLineData.selfReplace("rui", "ㄖㄨㄟ") + varLineData.selfReplace("run", "ㄖㄨㄣ") + varLineData.selfReplace("ruo", "ㄖㄨㄛ") + varLineData.selfReplace("sai", "ㄙㄞ") + varLineData.selfReplace("san", "ㄙㄢ") + varLineData.selfReplace("sao", "ㄙㄠ") + varLineData.selfReplace("sei", "ㄙㄟ") + varLineData.selfReplace("sen", "ㄙㄣ") + varLineData.selfReplace("sha", "ㄕㄚ") + varLineData.selfReplace("she", "ㄕㄜ") + varLineData.selfReplace("shi", "ㄕ") + varLineData.selfReplace("shu", "ㄕㄨ") + varLineData.selfReplace("sou", "ㄙㄡ") + varLineData.selfReplace("sui", "ㄙㄨㄟ") + varLineData.selfReplace("sun", "ㄙㄨㄣ") + varLineData.selfReplace("suo", "ㄙㄨㄛ") + varLineData.selfReplace("tai", "ㄊㄞ") + varLineData.selfReplace("tan", "ㄊㄢ") + varLineData.selfReplace("tao", "ㄊㄠ") + varLineData.selfReplace("tie", "ㄊㄧㄝ") + varLineData.selfReplace("tou", "ㄊㄡ") + varLineData.selfReplace("tui", "ㄊㄨㄟ") + varLineData.selfReplace("tun", "ㄊㄨㄣ") + varLineData.selfReplace("tuo", "ㄊㄨㄛ") + varLineData.selfReplace("wai", "ㄨㄞ") + varLineData.selfReplace("wan", "ㄨㄢ") + varLineData.selfReplace("wei", "ㄨㄟ") + varLineData.selfReplace("wen", "ㄨㄣ") + varLineData.selfReplace("xia", "ㄒㄧㄚ") + varLineData.selfReplace("xie", "ㄒㄧㄝ") + varLineData.selfReplace("xin", "ㄒㄧㄣ") + varLineData.selfReplace("xiu", "ㄒㄧㄡ") + varLineData.selfReplace("xue", "ㄒㄩㄝ") + varLineData.selfReplace("xun", "ㄒㄩㄣ") + varLineData.selfReplace("yai", "ㄧㄞ") + varLineData.selfReplace("yan", "ㄧㄢ") + varLineData.selfReplace("yao", "ㄧㄠ") + varLineData.selfReplace("yin", "ㄧㄣ") + varLineData.selfReplace("you", "ㄧㄡ") + varLineData.selfReplace("yue", "ㄩㄝ") + varLineData.selfReplace("yun", "ㄩㄣ") + varLineData.selfReplace("zai", "ㄗㄞ") + varLineData.selfReplace("zan", "ㄗㄢ") + varLineData.selfReplace("zao", "ㄗㄠ") + varLineData.selfReplace("zei", "ㄗㄟ") + varLineData.selfReplace("zen", "ㄗㄣ") + varLineData.selfReplace("zha", "ㄓㄚ") + varLineData.selfReplace("zhe", "ㄓㄜ") + varLineData.selfReplace("zhi", "ㄓ") + varLineData.selfReplace("zhu", "ㄓㄨ") + varLineData.selfReplace("zou", "ㄗㄡ") + varLineData.selfReplace("zui", "ㄗㄨㄟ") + varLineData.selfReplace("zun", "ㄗㄨㄣ") + varLineData.selfReplace("zuo", "ㄗㄨㄛ") + varLineData.selfReplace("ai", "ㄞ") + varLineData.selfReplace("an", "ㄢ") + varLineData.selfReplace("ao", "ㄠ") + varLineData.selfReplace("ba", "ㄅㄚ") + varLineData.selfReplace("bi", "ㄅㄧ") + varLineData.selfReplace("bo", "ㄅㄛ") + varLineData.selfReplace("bu", "ㄅㄨ") + varLineData.selfReplace("ca", "ㄘㄚ") + varLineData.selfReplace("ce", "ㄘㄜ") + varLineData.selfReplace("ci", "ㄘ") + varLineData.selfReplace("cu", "ㄘㄨ") + varLineData.selfReplace("da", "ㄉㄚ") + varLineData.selfReplace("de", "ㄉㄜ") + varLineData.selfReplace("di", "ㄉㄧ") + varLineData.selfReplace("du", "ㄉㄨ") + varLineData.selfReplace("eh", "ㄝ") + varLineData.selfReplace("ei", "ㄟ") + varLineData.selfReplace("en", "ㄣ") + varLineData.selfReplace("er", "ㄦ") + varLineData.selfReplace("fa", "ㄈㄚ") + varLineData.selfReplace("fo", "ㄈㄛ") + varLineData.selfReplace("fu", "ㄈㄨ") + varLineData.selfReplace("ga", "ㄍㄚ") + varLineData.selfReplace("ge", "ㄍㄜ") + varLineData.selfReplace("gi", "ㄍㄧ") + varLineData.selfReplace("gu", "ㄍㄨ") + varLineData.selfReplace("ha", "ㄏㄚ") + varLineData.selfReplace("he", "ㄏㄜ") + varLineData.selfReplace("hu", "ㄏㄨ") + varLineData.selfReplace("ji", "ㄐㄧ") + varLineData.selfReplace("ju", "ㄐㄩ") + varLineData.selfReplace("ka", "ㄎㄚ") + varLineData.selfReplace("ke", "ㄎㄜ") + varLineData.selfReplace("ku", "ㄎㄨ") + varLineData.selfReplace("la", "ㄌㄚ") + varLineData.selfReplace("le", "ㄌㄜ") + varLineData.selfReplace("li", "ㄌㄧ") + varLineData.selfReplace("lo", "ㄌㄛ") + varLineData.selfReplace("lu", "ㄌㄨ") + varLineData.selfReplace("lv", "ㄌㄩ") + varLineData.selfReplace("ma", "ㄇㄚ") + varLineData.selfReplace("me", "ㄇㄜ") + varLineData.selfReplace("mi", "ㄇㄧ") + varLineData.selfReplace("mo", "ㄇㄛ") + varLineData.selfReplace("mu", "ㄇㄨ") + varLineData.selfReplace("na", "ㄋㄚ") + varLineData.selfReplace("ne", "ㄋㄜ") + varLineData.selfReplace("ni", "ㄋㄧ") + varLineData.selfReplace("nu", "ㄋㄨ") + varLineData.selfReplace("nv", "ㄋㄩ") + varLineData.selfReplace("ou", "ㄡ") + varLineData.selfReplace("pa", "ㄆㄚ") + varLineData.selfReplace("pi", "ㄆㄧ") + varLineData.selfReplace("po", "ㄆㄛ") + varLineData.selfReplace("pu", "ㄆㄨ") + varLineData.selfReplace("qi", "ㄑㄧ") + varLineData.selfReplace("qu", "ㄑㄩ") + varLineData.selfReplace("re", "ㄖㄜ") + varLineData.selfReplace("ri", "ㄖ") + varLineData.selfReplace("ru", "ㄖㄨ") + varLineData.selfReplace("sa", "ㄙㄚ") + varLineData.selfReplace("se", "ㄙㄜ") + varLineData.selfReplace("si", "ㄙ") + varLineData.selfReplace("su", "ㄙㄨ") + varLineData.selfReplace("ta", "ㄊㄚ") + varLineData.selfReplace("te", "ㄊㄜ") + varLineData.selfReplace("ti", "ㄊㄧ") + varLineData.selfReplace("tu", "ㄊㄨ") + varLineData.selfReplace("wa", "ㄨㄚ") + varLineData.selfReplace("wo", "ㄨㄛ") + varLineData.selfReplace("wu", "ㄨ") + varLineData.selfReplace("xi", "ㄒㄧ") + varLineData.selfReplace("xu", "ㄒㄩ") + varLineData.selfReplace("ya", "ㄧㄚ") + varLineData.selfReplace("ye", "ㄧㄝ") + varLineData.selfReplace("yi", "ㄧ") + varLineData.selfReplace("yo", "ㄧㄛ") + varLineData.selfReplace("yu", "ㄩ") + varLineData.selfReplace("za", "ㄗㄚ") + varLineData.selfReplace("ze", "ㄗㄜ") + varLineData.selfReplace("zi", "ㄗ") + varLineData.selfReplace("zu", "ㄗㄨ") + varLineData.selfReplace("a", "ㄚ") + varLineData.selfReplace("e", "ㄜ") + varLineData.selfReplace("o", "ㄛ") + varLineData.selfReplace("q", "ㄑ") + varLineData.selfReplace("2", "ˊ") + varLineData.selfReplace("3", "ˇ") + varLineData.selfReplace("4", "ˋ") + varLineData.selfReplace("5", "˙") + varLineData.selfReplace("1", "") strProcessed += varLineData strProcessed += "\n" } From d91e220b14118a2cc9ce168246bbe0ecd5df2220 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 20 Mar 2022 12:57:17 +0800 Subject: [PATCH 07/17] ctlIME // Optimizing modifier key conditions (Rebased). - Flag Change Conditioning shall not get removed. Otherwise, when in the empty state, the first character being input won't be parsed by the IME. - "return false" is the one that passing trash data to the "still nothing" section of the KeyHandler. Removing the "still nothing" allows these trash data to be passed to IMK but can lead to problems like misbehaved F1-F12 keys, etc., plus triggering "NSInternalInconsistencyException" for each modifier key input. --- .../Modules/IMEModules/ctlInputMethod.swift | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/Source/Modules/IMEModules/ctlInputMethod.swift b/Source/Modules/IMEModules/ctlInputMethod.swift index 7b7a11a3..d3e78100 100644 --- a/Source/Modules/IMEModules/ctlInputMethod.swift +++ b/Source/Modules/IMEModules/ctlInputMethod.swift @@ -188,25 +188,22 @@ class ctlInputMethod: IMKInputController { override func handle(_ event: NSEvent!, client: Any!) -> Bool { - if event.type == .flagsChanged { - let functionKeyKeyboardLayoutID = mgrPrefs.functionKeyboardLayout - let basisKeyboardLayoutID = mgrPrefs.basisKeyboardLayout - - if functionKeyKeyboardLayoutID == basisKeyboardLayoutID { - return false - } - + // 這裡仍舊需要判斷 flags。之前使輸入法狀態卡住無法敲漢字的問題已在 KeyHandler 內修復。 + // 這裡不判斷 flags 的話,用方向鍵前後定位光標之後,再次試圖觸發組字區時、反而會在首次按鍵時失敗。 + // 同時注意:必須將 event.type == .flagsChanged 放在最外圍、且在其結尾插入 return false, + // 否則,每次處理這種判斷時都會觸發 NSInternalInconsistencyException。 + if (mgrPrefs.functionKeyboardLayout != mgrPrefs.basisKeyboardLayout) && (event.type == .flagsChanged) { let includeShift = mgrPrefs.functionKeyKeyboardLayoutOverrideIncludeShiftKey - - if event.modifierFlags.contains(.capsLock) || + if (event.modifierFlags == .capsLock || + event.modifierFlags.contains(.command) || event.modifierFlags.contains(.option) || event.modifierFlags.contains(.control) || event.modifierFlags.contains(.function) || - (event.modifierFlags.contains(.shift) && includeShift) { - (client as? IMKTextInput)?.overrideKeyboard(withKeyboardNamed: functionKeyKeyboardLayoutID) - return false + (event.modifierFlags.contains(.shift) && includeShift)) { + (client as? IMKTextInput)?.overrideKeyboard(withKeyboardNamed: mgrPrefs.functionKeyboardLayout) + } else { + (client as? IMKTextInput)?.overrideKeyboard(withKeyboardNamed: mgrPrefs.basisKeyboardLayout) } - (client as? IMKTextInput)?.overrideKeyboard(withKeyboardNamed: basisKeyboardLayoutID) return false } From d64d1af8a324f45f3ddfac991c179fbe65c2e7ed Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Mon, 21 Mar 2022 21:30:33 +0800 Subject: [PATCH 08/17] KeyHandler // +NSLog: "Still Nothing" (Rebased). - This one is the final input quality check step prior to the language parsing process. It can block trash data from being passed to the Input Method Kit. --- Source/Modules/ControllerModules/KeyHandler.mm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Modules/ControllerModules/KeyHandler.mm b/Source/Modules/ControllerModules/KeyHandler.mm index b7308d79..e74ed04c 100644 --- a/Source/Modules/ControllerModules/KeyHandler.mm +++ b/Source/Modules/ControllerModules/KeyHandler.mm @@ -592,10 +592,10 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot"; } } - // still nothing, then we update the composing buffer (some app has - // strange behavior if we don't do this, "thinking" the key is not - // actually consumed) + // still nothing, then we update the composing buffer (some app has strange behavior if we don't do this, "thinking" the key is not actually consumed) + // 砍掉這一段會導致「F1-F12 按鍵干擾組字區」的問題。暫時只能先恢復這段,且補上偵錯彙報機制,方便今後排查故障。 if ([state isKindOfClass:[InputStateNotEmpty class]] || !_bpmfReadingBuffer->isEmpty()) { + [IME prtDebugIntel:[NSString stringWithFormat:@"Blocked data: charCode: %c, keyCode: %c", charCode, input.keyCode]]; [IME prtDebugIntel:@"A9BFF20E"]; errorCallback(); stateCallback(state); From bdaf0f5286c4f52669bfaedf6d56f7fd12790ded Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 23 Mar 2022 13:19:35 +0800 Subject: [PATCH 09/17] ctlIME // Allow in-place writing to UserExclPhraseData. --- Source/Modules/IMEModules/ctlInputMethod.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Source/Modules/IMEModules/ctlInputMethod.swift b/Source/Modules/IMEModules/ctlInputMethod.swift index d3e78100..6713f2dc 100644 --- a/Source/Modules/IMEModules/ctlInputMethod.swift +++ b/Source/Modules/IMEModules/ctlInputMethod.swift @@ -41,6 +41,8 @@ class ctlInputMethod: IMKInputController { @objc static let kIMEModeCHS = "org.atelierInmu.inputmethod.vChewing.IMECHS"; @objc static let kIMEModeCHT = "org.atelierInmu.inputmethod.vChewing.IMECHT"; @objc static let kIMEModeNULL = "org.atelierInmu.inputmethod.vChewing.IMENULL"; + + @objc static var areWeDeleting = false; private static let tooltipController = TooltipController() @@ -204,6 +206,8 @@ class ctlInputMethod: IMKInputController { } else { (client as? IMKTextInput)?.overrideKeyboard(withKeyboardNamed: mgrPrefs.basisKeyboardLayout) } + // 準備修飾鍵,用來判定是否需要利用就地新增語彙時的 Enter 鍵來砍詞。 + ctlInputMethod.areWeDeleting = event.modifierFlags.contains([.shift, .command]) return false } @@ -644,8 +648,8 @@ extension ctlInputMethod: KeyHandlerDelegate { return false } let InputModeReversed: InputMode = (ctlInputMethod.currentKeyHandler.inputMode == InputMode.imeModeCHT) ? InputMode.imeModeCHS : InputMode.imeModeCHT - mgrLangModel.writeUserPhrase(state.userPhrase, inputMode: keyHandler.inputMode, areWeDuplicating: state.chkIfUserPhraseExists) - mgrLangModel.writeUserPhrase(state.userPhraseConverted, inputMode: InputModeReversed, areWeDuplicating: false) + mgrLangModel.writeUserPhrase(state.userPhrase, inputMode: keyHandler.inputMode, areWeDuplicating: state.chkIfUserPhraseExists, areWeDeleting: ctlInputMethod.areWeDeleting) + mgrLangModel.writeUserPhrase(state.userPhraseConverted, inputMode: InputModeReversed, areWeDuplicating: false, areWeDeleting: ctlInputMethod.areWeDeleting) return true } } From 22a0222c3dc978979aad373a772f6b03c9354f29 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 23 Mar 2022 11:28:16 +0800 Subject: [PATCH 10/17] mgrLM // Allow in-place writing to UserExclPhraseData. --- Source/Modules/LangModelRelated/mgrLangModel.h | 2 +- Source/Modules/LangModelRelated/mgrLangModel.mm | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Modules/LangModelRelated/mgrLangModel.h b/Source/Modules/LangModelRelated/mgrLangModel.h index cfa533dd..ded1aa4e 100644 --- a/Source/Modules/LangModelRelated/mgrLangModel.h +++ b/Source/Modules/LangModelRelated/mgrLangModel.h @@ -33,7 +33,7 @@ NS_ASSUME_NONNULL_BEGIN + (BOOL)checkIfUserDataFolderExists; + (BOOL)checkIfUserPhraseExist:(NSString *)userPhrase inputMode:(InputMode)mode key:(NSString *)key NS_SWIFT_NAME(checkIfUserPhraseExist(userPhrase:mode:key:)); -+ (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode areWeDuplicating:(BOOL)areWeDuplicating; ++ (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode areWeDuplicating:(BOOL)areWeDuplicating areWeDeleting:(BOOL)areWeDeleting; + (void)setPhraseReplacementEnabled:(BOOL)phraseReplacementEnabled; + (void)setCNSEnabled:(BOOL)cnsEnabled; + (void)setSymbolEnabled:(BOOL)symbolEnabled; diff --git a/Source/Modules/LangModelRelated/mgrLangModel.mm b/Source/Modules/LangModelRelated/mgrLangModel.mm index 53c83ddc..da5eb3bc 100644 --- a/Source/Modules/LangModelRelated/mgrLangModel.mm +++ b/Source/Modules/LangModelRelated/mgrLangModel.mm @@ -235,14 +235,14 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing return NO; } -+ (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode areWeDuplicating:(BOOL)areWeDuplicating ++ (BOOL)writeUserPhrase:(NSString *)userPhrase inputMode:(InputMode)mode areWeDuplicating:(BOOL)areWeDuplicating areWeDeleting:(BOOL)areWeDeleting { if (![self checkIfUserLanguageModelFilesExist]) { return NO; } // BOOL addLineBreakAtFront = NO; - NSString *path = [self userPhrasesDataPath:mode]; + NSString *path = areWeDeleting ? [self excludedPhrasesDataPath:mode] : [self userPhrasesDataPath:mode]; // if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { // NSError *error = nil; @@ -267,7 +267,7 @@ static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewing // [currentMarkedPhrase appendString:@"\n"]; // } [currentMarkedPhrase appendString:userPhrase]; - if (areWeDuplicating) { + if (areWeDuplicating && !areWeDeleting) { // Do not use ASCII characters to comment here. // Otherwise, it will be scrambled by HYPY2BPMF module shipped in the vChewing Phrase Editor. [currentMarkedPhrase appendString:@"\t#𝙾𝚟𝚎𝚛𝚛𝚒𝚍𝚎"]; From 5697a2ff6f0909506b6585e1217f01954f207740 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 23 Mar 2022 14:13:18 +0800 Subject: [PATCH 11/17] InputState // Only allow excluding existing words. --- Source/Modules/ControllerModules/InputState.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Modules/ControllerModules/InputState.swift b/Source/Modules/ControllerModules/InputState.swift index 0d9e2914..74359e12 100644 --- a/Source/Modules/ControllerModules/InputState.swift +++ b/Source/Modules/ControllerModules/InputState.swift @@ -158,6 +158,7 @@ class InputState: NSObject { @objc private(set) var markerIndex: UInt @objc private(set) var markedRange: NSRange + @objc private var deleteTargetExists = false @objc var tooltip: String { if composingBuffer.count != readings.count { @@ -192,6 +193,7 @@ class InputState: NSObject { let joined = selectedReadings.joined(separator: "-") let exist = mgrLangModel.checkIfUserPhraseExist(userPhrase: text, mode: ctlInputMethod.currentKeyHandler.inputMode, key: joined) if exist { + deleteTargetExists = exist TooltipController.backgroundColor = NSColor(red: 0.00, green: 0.18, blue: 0.13, alpha: 1.00) TooltipController.textColor = NSColor(red: 0.00, green: 1.00, blue: 0.74, alpha: 1.00) return String(format: NSLocalizedString("\"%@\" already exists, ENTER to boost its priority.", comment: ""), text) @@ -257,6 +259,9 @@ class InputState: NSObject { if markedRange.length > kMaxMarkRangeLength { return false } + if ctlInputMethod.areWeDeleting && !deleteTargetExists { + return false + } return markedRange.length >= kMinMarkRangeLength && markedRange.length <= kMaxMarkRangeLength } From b537af6facb20ded5df4e14505ec210a3b4124da Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 23 Mar 2022 14:42:57 +0800 Subject: [PATCH 12/17] InputState // Update toolTip text for UserExclList function. --- Source/Modules/ControllerModules/InputState.swift | 4 ++-- Source/Resources/Base.lproj/Localizable.strings | 4 ++-- Source/Resources/en.lproj/Localizable.strings | 4 ++-- Source/Resources/ja.lproj/Localizable.strings | 4 ++-- Source/Resources/zh-Hans.lproj/Localizable.strings | 4 ++-- Source/Resources/zh-Hant.lproj/Localizable.strings | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/Modules/ControllerModules/InputState.swift b/Source/Modules/ControllerModules/InputState.swift index 74359e12..31ea38d9 100644 --- a/Source/Modules/ControllerModules/InputState.swift +++ b/Source/Modules/ControllerModules/InputState.swift @@ -196,11 +196,11 @@ class InputState: NSObject { deleteTargetExists = exist TooltipController.backgroundColor = NSColor(red: 0.00, green: 0.18, blue: 0.13, alpha: 1.00) TooltipController.textColor = NSColor(red: 0.00, green: 1.00, blue: 0.74, alpha: 1.00) - return String(format: NSLocalizedString("\"%@\" already exists, ENTER to boost its priority.", comment: ""), text) + return String(format: NSLocalizedString("\"%@\" already exists: ↩ to boost, ⇧⌘↩ to exclude.", comment: ""), text) } TooltipController.backgroundColor = NSColor(red: 0.18, green: 0.18, blue: 0.18, alpha: 1.00) TooltipController.textColor = NSColor.white - return String(format: NSLocalizedString("\"%@\" selected. ENTER to add user phrase.", comment: ""), text) + return String(format: NSLocalizedString("\"%@\" selected. ↩ to add user phrase.", comment: ""), text) } @objc var tooltipForInputting: String = "" diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index 71eaffe8..ede414dc 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -23,8 +23,8 @@ "Half-Width Punctuation Mode" = "Half-Width Punctuation Mode"; "\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase."; "\"%@\" length should ≤ %d for a user phrase." = "\"%@\" length should ≤ %d for a user phrase."; -"\"%@\" selected. ENTER to add user phrase." = "\"%@\" selected. ENTER to add user phrase."; -"\"%@\" already exists, ENTER to boost its priority." = "\"%@\" already exists, ENTER to boost its priority."; +"\"%@\" selected. ↩ to add user phrase." = "\"%@\" selected. ↩ to add user phrase."; +"\"%@\" already exists: ↩ to boost, ⇧⌘↩ to exclude." = "\"%@\" already exists: ↩ to boost, ⇧⌘↩ to exclude."; "Edit Phrase Replacement Table…" = "Edit Phrase Replacement Table…"; "Use Phrase Replacement" = "Use Phrase Replacement"; "Candidates keys cannot be empty." = "Candidates keys cannot be empty."; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 8ee2b1fd..39fa3172 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -23,8 +23,8 @@ "Half-Width Punctuation Mode" = "Half-Width Punctuation Mode"; "\"%@\" length must ≥ 2 for a user phrase." = "\"%@\" length must ≥ 2 for a user phrase."; "\"%@\" length should ≤ %d for a user phrase." = "\"%@\" length should ≤ %d for a user phrase."; -"\"%@\" selected. ENTER to add user phrase." = "\"%@\" selected. ENTER to add user phrase."; -"\"%@\" already exists, ENTER to boost its priority." = "\"%@\" already exists, ENTER to boost its priority."; +"\"%@\" selected. ↩ to add user phrase." = "\"%@\" selected. ↩ to add user phrase."; +"\"%@\" already exists: ↩ to boost, ⇧⌘↩ to exclude." = "\"%@\" already exists: ↩ to boost, ⇧⌘↩ to exclude."; "Edit Phrase Replacement Table…" = "Edit Phrase Replacement Table…"; "Use Phrase Replacement" = "Use Phrase Replacement"; "Candidates keys cannot be empty." = "Candidates keys cannot be empty."; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 55613cb5..9ff2c720 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -23,8 +23,8 @@ "Half-Width Punctuation Mode" = "半角句読モード"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」もう1つ文字のお選びを。"; "\"%@\" length should ≤ %d for a user phrase." = "「%@」文字数過剰で登録不可、%d 文字以内にして下さい。"; -"\"%@\" selected. ENTER to add user phrase." = "「%@」を ENTER で辞書に登録。"; -"\"%@\" already exists, ENTER to boost its priority." = "「%@」は既存語彙であり、ENTER で最優先にする。"; +"\"%@\" selected. ↩ to add user phrase." = "「%@」を ↩ で辞書に登録。"; +"\"%@\" already exists: ↩ to boost, ⇧⌘↩ to exclude." = "「%@」は既存語彙:↩ で最優先にし;⇧⌘↩ で排除。"; "Edit Phrase Replacement Table…" = "言葉置換表を編集…"; "Use Phrase Replacement" = "言葉置換機能"; "Candidates keys cannot be empty." = "言選り用キー陣列に何かキーをご登録ください。"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index fbc66ba3..0515abb8 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -23,8 +23,8 @@ "Half-Width Punctuation Mode" = "半角标点模式"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」字数不足以自订语汇。"; "\"%@\" length should ≤ %d for a user phrase." = "「%@」字数超过 %d、无法自订。"; -"\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自订语汇。"; -"\"%@\" already exists, ENTER to boost its priority." = "「%@」已存在,敲 ENTER 以提升其权重。"; +"\"%@\" selected. ↩ to add user phrase." = "「%@」敲 Enter 添入自订语汇。"; +"\"%@\" already exists: ↩ to boost, ⇧⌘↩ to exclude." = "「%@」已存在:敲 ↩ 以升权;敲 ⇧⌘↩ 以排除。"; "Edit Phrase Replacement Table…" = "编辑语汇置换表…"; "Use Phrase Replacement" = "使用语汇置换"; "Candidates keys cannot be empty." = "您必须指定选字键。"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index a45ea0ce..4dd5e5d3 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -23,8 +23,8 @@ "Half-Width Punctuation Mode" = "半形標點模式"; "\"%@\" length must ≥ 2 for a user phrase." = "「%@」字數不足以自訂語彙。"; "\"%@\" length should ≤ %d for a user phrase." = "「%@」字數超過 %d、無法自訂。"; -"\"%@\" selected. ENTER to add user phrase." = "「%@」敲 Enter 添入自訂語彙。"; -"\"%@\" already exists, ENTER to boost its priority." = "「%@」已存在,敲 ENTER 以提升其權重。"; +"\"%@\" selected. ↩ to add user phrase." = "「%@」敲 Enter 添入自訂語彙。"; +"\"%@\" already exists: ↩ to boost, ⇧⌘↩ to exclude." = "「%@」已存在:敲 ↩ 以升權;敲 ⇧⌘↩ 以排除。"; "Edit Phrase Replacement Table…" = "編輯語彙置換表…"; "Use Phrase Replacement" = "使用語彙置換"; "Candidates keys cannot be empty." = "您必須指定選字鍵。"; From 328081e4ab22899e4dbce0b292c657efa5f90b5c Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 23 Mar 2022 15:03:27 +0800 Subject: [PATCH 13/17] InputState // Another i18n expression fix. --- Source/Modules/ControllerModules/InputState.swift | 2 +- Source/Resources/Base.lproj/Localizable.strings | 2 +- Source/Resources/en.lproj/Localizable.strings | 2 +- Source/Resources/ja.lproj/Localizable.strings | 2 +- Source/Resources/zh-Hans.lproj/Localizable.strings | 2 +- Source/Resources/zh-Hant.lproj/Localizable.strings | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/Modules/ControllerModules/InputState.swift b/Source/Modules/ControllerModules/InputState.swift index 31ea38d9..a2ea1f99 100644 --- a/Source/Modules/ControllerModules/InputState.swift +++ b/Source/Modules/ControllerModules/InputState.swift @@ -164,7 +164,7 @@ class InputState: NSObject { if composingBuffer.count != readings.count { TooltipController.backgroundColor = NSColor(red: 0.55, green: 0.00, blue: 0.00, alpha: 1.00) TooltipController.textColor = NSColor.white - return NSLocalizedString("⚠︎ Unhandlable char selected for user phrases.", comment: "") + return NSLocalizedString("⚠︎ Unhandlable: Chars and Readings in buffer doesn't match.", comment: "") } if mgrPrefs.phraseReplacementEnabled { diff --git a/Source/Resources/Base.lproj/Localizable.strings b/Source/Resources/Base.lproj/Localizable.strings index ede414dc..6c7a07c9 100644 --- a/Source/Resources/Base.lproj/Localizable.strings +++ b/Source/Resources/Base.lproj/Localizable.strings @@ -34,7 +34,7 @@ "Please specify at least 4 candidate keys." = "Please specify at least 4 candidate keys."; "Maximum 15 candidate keys allowed." = "Maximum 15 candidate keys allowed."; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ Phrase replacement mode enabled, interfering user phrase entry."; -"⚠︎ Unhandlable char selected for user phrases." = "⚠︎ Unhandlable char selected for user phrases."; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ Unhandlable: Chars and Readings in buffer doesn't match."; "Per-Char Select Mode" = "Per-Char Select Mode"; "CNS11643 Mode" = "CNS11643 Mode"; "JIS Shinjitai Output" = "JIS Shinjitai Output"; diff --git a/Source/Resources/en.lproj/Localizable.strings b/Source/Resources/en.lproj/Localizable.strings index 39fa3172..fb2ea4e4 100644 --- a/Source/Resources/en.lproj/Localizable.strings +++ b/Source/Resources/en.lproj/Localizable.strings @@ -34,7 +34,7 @@ "Please specify at least 4 candidate keys." = "Please specify at least 4 candidate keys."; "Maximum 15 candidate keys allowed." = "Maximum 15 candidate keys allowed."; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ Phrase replacement mode enabled, interfering user phrase entry."; -"⚠︎ Unhandlable char selected for user phrases." = "⚠︎ Unhandlable char selected for user phrases."; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ Unhandlable: Chars and Readings in buffer doesn't match."; "Per-Char Select Mode" = "Per-Char Select Mode"; "CNS11643 Mode" = "CNS11643 Mode"; "JIS Shinjitai Output" = "JIS Shinjitai Output"; diff --git a/Source/Resources/ja.lproj/Localizable.strings b/Source/Resources/ja.lproj/Localizable.strings index 9ff2c720..5e80f1c4 100644 --- a/Source/Resources/ja.lproj/Localizable.strings +++ b/Source/Resources/ja.lproj/Localizable.strings @@ -34,7 +34,7 @@ "Please specify at least 4 candidate keys." = "言選り用キー陣列に少なくとも4つのキーをご登録ください。"; "Maximum 15 candidate keys allowed." = "言選り用キー陣列には最多15つキー登録できます。"; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 言葉置換機能稼働中、新添付言葉にも影響。"; -"⚠︎ Unhandlable char selected for user phrases." = "⚠︎ ユーザー辞書の対処できない文字は選択されています。"; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 緩衝列の字数は読みの数と不同等のため、対処不可。"; "Per-Char Select Mode" = "全候補入力モード"; "CNS11643 Mode" = "全字庫モード"; "JIS Shinjitai Output" = "JIS 新字体モード"; diff --git a/Source/Resources/zh-Hans.lproj/Localizable.strings b/Source/Resources/zh-Hans.lproj/Localizable.strings index 0515abb8..69fd06db 100644 --- a/Source/Resources/zh-Hans.lproj/Localizable.strings +++ b/Source/Resources/zh-Hans.lproj/Localizable.strings @@ -34,7 +34,7 @@ "Please specify at least 4 candidate keys." = "请至少指定四个选字键。"; "Maximum 15 candidate keys allowed." = "选字键最多只能指定十五个。"; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 语汇置换功能已启用,会波及语汇自订。"; -"⚠︎ Unhandlable char selected for user phrases." = "⚠︎ 已选中无法处理的字符,无法加入自订语汇。"; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 无法处理组字区字数与读音数不对应的情形。"; "Per-Char Select Mode" = "仿真逐字选字输入"; "CNS11643 Mode" = "全字库模式"; "JIS Shinjitai Output" = "JIS 新字体模式"; diff --git a/Source/Resources/zh-Hant.lproj/Localizable.strings b/Source/Resources/zh-Hant.lproj/Localizable.strings index 4dd5e5d3..deab0014 100644 --- a/Source/Resources/zh-Hant.lproj/Localizable.strings +++ b/Source/Resources/zh-Hant.lproj/Localizable.strings @@ -34,7 +34,7 @@ "Please specify at least 4 candidate keys." = "請至少指定四個選字鍵。"; "Maximum 15 candidate keys allowed." = "選字鍵最多只能指定十五個。"; "⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 語彙置換功能已啟用,會波及語彙自訂。"; -"⚠︎ Unhandlable char selected for user phrases." = "⚠︎ 已選中無法處理的字元,無法加入自訂語彙。"; +"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 無法處理組字區字數與讀音數不對應的情形。"; "Per-Char Select Mode" = "模擬逐字選字輸入"; "CNS11643 Mode" = "全字庫模式"; "JIS Shinjitai Output" = "JIS 新字體模式"; From a332132d65e7d051d6eaabc4f403d6cd688cabed Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 23 Mar 2022 19:20:46 +0800 Subject: [PATCH 14/17] KeyHandler // Pass Shift+FWD/BKW in Candidate window. - Sometimes, a user may want to immediately mark phrases even if the IME is in the ChoosingCandidate state, and the IME farts / beeps. Now, these two hotkey combination cancel the current Candidate window, so the user doesn't need to press ESC / Delete / BackSpace. --- Source/Modules/ControllerModules/KeyHandler.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Modules/ControllerModules/KeyHandler.mm b/Source/Modules/ControllerModules/KeyHandler.mm index e74ed04c..c18031f8 100644 --- a/Source/Modules/ControllerModules/KeyHandler.mm +++ b/Source/Modules/ControllerModules/KeyHandler.mm @@ -1002,7 +1002,8 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot"; UniChar charCode = input.charCode; VTCandidateController *gCurrentCandidateController = [self.delegate candidateControllerForKeyHandler:self]; - BOOL cancelCandidateKey = [input isBackSpace] || [input isESC] || [input isDelete]; + BOOL cancelCandidateKey = [input isBackSpace] || [input isESC] || [input isDelete] + || (([input isCursorBackward] || [input isCursorForward]) && [input isShiftHold]); if (cancelCandidateKey) { if ([state isKindOfClass: [InputStateAssociatedPhrases class]]) { From 16a17e1d4ddd5fd89dca99566284fbd406deaddf Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 23 Mar 2022 21:04:18 +0800 Subject: [PATCH 15/17] KeyHandler // Unifying BPMF input key to Ctrl+CMD+Enter. - Ctrl+Enter can cause conflicts with some instant-messenger (web)apps (e.g. WeChat, etc.). We leave it. --- Source/Modules/ControllerModules/KeyHandler.mm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Source/Modules/ControllerModules/KeyHandler.mm b/Source/Modules/ControllerModules/KeyHandler.mm index c18031f8..0bdbcd03 100644 --- a/Source/Modules/ControllerModules/KeyHandler.mm +++ b/Source/Modules/ControllerModules/KeyHandler.mm @@ -525,12 +525,10 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot"; // MARK: Enter if ([input isEnter]) { - if ([input isControlHold]) { - if (ctlInputMethod.areWeUsingOurOwnPhraseEditor || [input isCommandHold]) { - return [self _handleCtrlEnterWithState:state stateCallback:stateCallback errorCallback:errorCallback]; - } - } - return [self _handleEnterWithState:state stateCallback:stateCallback errorCallback:errorCallback]; + return ([input isControlHold] && [input isCommandHold]) ? + [self _handleCtrlCommandEnterWithState:state stateCallback:stateCallback errorCallback:errorCallback] + : + [self _handleEnterWithState:state stateCallback:stateCallback errorCallback:errorCallback]; } // MARK: Punctuation list @@ -850,7 +848,7 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot"; return YES; } -- (BOOL)_handleCtrlEnterWithState:(InputState *)state stateCallback:(void (^)(InputState *))stateCallback errorCallback:(void (^)(void))errorCallback +- (BOOL)_handleCtrlCommandEnterWithState:(InputState *)state stateCallback:(void (^)(InputState *))stateCallback errorCallback:(void (^)(void))errorCallback { if (![state isKindOfClass:[InputStateInputting class]]) return NO; From f93b874b41b6f15e4a96dbf2406b9f8d6464b661 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Tue, 22 Mar 2022 12:50:32 +0800 Subject: [PATCH 16/17] Update Data - 20220324 (Massive Error Fix) --- Source/Data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Data b/Source/Data index 21e4163c..bc21120f 160000 --- a/Source/Data +++ b/Source/Data @@ -1 +1 @@ -Subproject commit 21e4163c6f6f5c9929c1dd5872d091f732f07836 +Subproject commit bc21120f7241f61d968d291c988c2c34df4a1263 From 98978a9d5d97ae4979eab812268c71ec366b910f Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Thu, 24 Mar 2022 09:59:30 +0800 Subject: [PATCH 17/17] Bump version to 1.4.2 Build 1942. --- Update-Info.plist | 4 ++-- vChewing.pkgproj | 38 +++++++++++++++--------------- vChewing.xcodeproj/project.pbxproj | 24 +++++++++---------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Update-Info.plist b/Update-Info.plist index 802055ed..f5f4c724 100644 --- a/Update-Info.plist +++ b/Update-Info.plist @@ -7,8 +7,8 @@ UpdateInfoSite https://gitee.com/vChewing/vChewing-macOS/releases CFBundleVersion - 1940 + 1942 CFBundleShortVersionString - 1.4.0 + 1.4.2 diff --git a/vChewing.pkgproj b/vChewing.pkgproj index 67f043e8..c4d9d51d 100644 --- a/vChewing.pkgproj +++ b/vChewing.pkgproj @@ -726,7 +726,7 @@ USE_HFS+_COMPRESSION VERSION - 1.4.0 + 1.4.2 TYPE 0 @@ -941,11 +941,11 @@ LANGUAGE - Traditional Chinese + Simplified Chinese VALUE PATH - Installer/pkgTextWarning-CHT.txt + Installer/pkgTextWarning-CHS.txt PATH_TYPE 1 @@ -963,11 +963,11 @@ LANGUAGE - Simplified Chinese + Traditional Chinese VALUE PATH - Installer/pkgTextWarning-CHS.txt + Installer/pkgTextWarning-CHT.txt PATH_TYPE 1 @@ -991,11 +991,11 @@ LANGUAGE - Traditional Chinese + Simplified Chinese VALUE PATH - LICENSE-CHT.txt + LICENSE-CHS.txt PATH_TYPE 1 @@ -1013,11 +1013,11 @@ LANGUAGE - Simplified Chinese + Traditional Chinese VALUE PATH - LICENSE-CHS.txt + LICENSE-CHT.txt PATH_TYPE 1 @@ -1048,9 +1048,9 @@ LANGUAGE - Simplified Chinese + Traditional Chinese VALUE - 威注音输入法 + 威注音輸入法 LANGUAGE @@ -1060,9 +1060,9 @@ LANGUAGE - Traditional Chinese + Simplified Chinese VALUE - 威注音輸入法 + 威注音输入法 @@ -1099,11 +1099,11 @@ LANGUAGE - Simplified Chinese + Traditional Chinese SECONDARY_VALUE - 至少 macOS 10.11.5 方可满足威注音对系统内的万国码版本支援的需要。 + 至少 macOS 10.11.5 方可滿足威注音對系統內的萬國碼版本支援的需要。 VALUE - 作业系统版本太旧 + 作業系統版本太舊 LANGUAGE @@ -1115,11 +1115,11 @@ LANGUAGE - Traditional Chinese + Simplified Chinese SECONDARY_VALUE - 至少 macOS 10.11.5 方可滿足威注音對系統內的萬國碼版本支援的需要。 + 至少 macOS 10.11.5 方可满足威注音对系统内的万国码版本支援的需要。 VALUE - 作業系統版本太舊 + 作业系统版本太旧 NAME diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index 9b5c48b7..01fd02fa 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -1179,7 +1179,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1940; + CURRENT_PROJECT_VERSION = 1942; DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; @@ -1202,7 +1202,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.4.0; + MARKETING_VERSION = 1.4.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1235,7 +1235,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1940; + CURRENT_PROJECT_VERSION = 1942; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1254,7 +1254,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.4.0; + MARKETING_VERSION = 1.4.2; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.vChewing.vChewingPhraseEditor; @@ -1369,7 +1369,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1940; + CURRENT_PROJECT_VERSION = 1942; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1404,7 +1404,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.4.0; + MARKETING_VERSION = 1.4.2; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1437,7 +1437,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1940; + CURRENT_PROJECT_VERSION = 1942; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_TEAM = ""; @@ -1467,7 +1467,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.4.0; + MARKETING_VERSION = 1.4.2; PRODUCT_BUNDLE_IDENTIFIER = org.atelierInmu.inputmethod.vChewing; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1551,7 +1551,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1940; + CURRENT_PROJECT_VERSION = 1942; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -1576,7 +1576,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.4.0; + MARKETING_VERSION = 1.4.2; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1604,7 +1604,7 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1940; + CURRENT_PROJECT_VERSION = 1942; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1624,7 +1624,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11.5; - MARKETING_VERSION = 1.4.0; + MARKETING_VERSION = 1.4.2; PRODUCT_BUNDLE_IDENTIFIER = "org.atelierInmu.vChewing.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "";