From 339e677011cf2df7821cc5d62ecc9441e9f9cc5e Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 4 Feb 2022 21:44:49 +0800 Subject: [PATCH] v1.2.1 // Reorganizing project folder structure. - The color contrast of the menu icon for Simplified Chinese mode has been tweaked for better legibility. - Chinese localized name changed for both CHS and CHT input modes. - Changed the way how Xcode manages the app versions. - Renamed certain Window NIBs and their controllers to enforce Hungary naming convention. - Rebrand FastLM to CoreLM. - Rebrand LMManager to mgrLM. --- .../Installer => Installer}/AppDelegate.swift | 0 .../Installer => Installer}/ArchiveUtil.swift | 0 .../Installer => Installer}/Chronosphere.h | 0 .../Installer => Installer}/Chronosphere.m | 0 .../Installer-Info.plist | 8 +- .../Installer-Prefix.pch | 0 .../NotarizedArchives/README.md | 0 .../Resources}/Base.lproj/MainMenu.xib | 2 +- .../Resources}/en.lproj/InfoPlist.strings | 0 .../Resources}/en.lproj/Localizable.strings | 0 .../Resources}/en.lproj/MainMenu.strings | 4 +- .../Resources}/ja.lproj/InfoPlist.strings | 0 .../Resources}/ja.lproj/Localizable.strings | 0 .../Resources}/ja.lproj/MainMenu.strings | 2 +- .../zh-Hans.lproj/InfoPlist.strings | 0 .../zh-Hans.lproj/Localizable.strings | 0 .../Resources}/zh-Hans.lproj/MainMenu.strings | 0 .../zh-Hant.lproj/InfoPlist.strings | 0 .../zh-Hant.lproj/Localizable.strings | 0 .../Resources}/zh-Hant.lproj/MainMenu.strings | 0 .../vChewingInstaller-Bridging-Header.h | 0 Source/Beep.aif | Bin 232754 -> 0 bytes Source/Engine/LanguageModel/FastLM.h | 61 --- Source/Fart.aif | Bin 63414 -> 0 bytes .../{ => Headers}/vChewing-Bridging-Header.h | 2 +- Source/{ => Headers}/vChewing-Prefix.pch | 0 Source/Images/Bopomofo.tiff | Bin 5168 -> 0 bytes Source/Images/Bopomofo@2x.tiff | Bin 6528 -> 0 bytes Source/Images/SimpBopomofo.tiff | Bin 5156 -> 0 bytes Source/Images/SimpBopomofo@2x.tiff | Bin 6332 -> 0 bytes Source/{ => Modules}/AppDelegate.swift | 48 +- .../ControllerModules/InputState.swift | 0 .../ControllerModules/KeyHandler.h | 0 .../ControllerModules/KeyHandler.mm | 14 +- .../ControllerModules/KeyHandlerInput.swift | 0 .../ControllerModules/KeyValueBlobReader.cpp | 0 .../ControllerModules/KeyValueBlobReader.h | 0 .../ControllerModules/StringUtils.swift | 0 .../FileHandlers}/FSEventStreamHelper.swift | 0 .../FileHandlers}/LMConsolidator.h | 0 .../FileHandlers}/LMConsolidator.mm | 0 .../IMEModules}/InputSourceHelper.swift | 0 .../IMEModules}/OpenCCBridge.swift | 0 .../IMEModules}/PreferencesModule.swift | 0 .../IMEModules/ctlInputMethod.h} | 4 +- .../IMEModules/ctlInputMethod.mm} | 60 +-- .../SubLanguageModels}/CNSLM.h | 0 .../SubLanguageModels}/CNSLM.mm | 0 .../SubLanguageModels/CoreLM.h | 64 +++ .../SubLanguageModels/CoreLM.mm} | 32 +- .../SubLanguageModels}/PhraseReplacementMap.h | 0 .../PhraseReplacementMap.mm | 0 .../SubLanguageModels}/UserOverrideModel.h | 0 .../SubLanguageModels}/UserOverrideModel.mm | 0 .../SubLanguageModels}/UserPhrasesLM.h | 0 .../SubLanguageModels}/UserPhrasesLM.mm | 0 .../LangModelRelated/mgrLangModel.h} | 5 +- .../LangModelRelated/mgrLangModel.mm} | 10 +- .../LangModelRelated}/vChewingLM.h | 4 +- .../LangModelRelated}/vChewingLM.mm | 0 .../LanguageParsers}/Gramambular/Bigram.h | 0 .../Gramambular/BlockReadingBuilder.h | 0 .../Gramambular/Gramambular.h | 0 .../LanguageParsers}/Gramambular/Grid.h | 0 .../Gramambular/KeyValuePair.h | 0 .../Gramambular/LanguageModel.h | 0 .../LanguageParsers}/Gramambular/Node.h | 0 .../LanguageParsers}/Gramambular/NodeAnchor.h | 0 .../LanguageParsers}/Gramambular/Span.h | 0 .../LanguageParsers}/Gramambular/Unigram.h | 0 .../LanguageParsers}/Gramambular/Walker.h | 0 Source/{Engine => Modules}/SFX/clsSFX.swift | 0 Source/{ => Modules}/main.swift | 0 Source/Resources/Beep.m4a | Bin 0 -> 14940 bytes Source/Resources/Fart.m4a | Bin 0 -> 8804 bytes .../AboutBanner.imageset/AboutBanner.png | Bin .../AboutBanner.imageset/AboutBanner@2x.png | Bin .../AboutBanner.imageset/AboutBanner@3x.png | Bin .../AboutBanner.imageset/Contents.json | 0 .../AlertIcon.imageset/128X128.png | Bin .../AlertIcon.imageset/192x192.png | Bin .../AlertIcon.imageset/64X64.png | Bin .../AlertIcon.imageset/Contents.json | 0 .../AppIcon.appiconset/1024X1024.png | Bin .../AppIcon.appiconset/128X128.png | Bin .../AppIcon.appiconset/16X16.png | Bin .../AppIcon.appiconset/256X256.png | Bin .../AppIcon.appiconset/32X32.png | Bin .../AppIcon.appiconset/512X512.png | Bin .../AppIcon.appiconset/64X64.png | Bin .../AppIcon.appiconset/Contents.json | 0 .../Images/Images.xcassets/Contents.json | 0 Source/{ => Resources}/Images/RAW/March.jpg | Bin .../{ => Resources}/Images/RAW/vChewing.svg | 0 .../Localization}/en.lproj/InfoPlist.strings | 0 .../en.lproj/Localizable.strings | 0 .../Localization}/ja.lproj/InfoPlist.strings | 0 .../ja.lproj/Localizable.strings | 0 .../zh-Hans.lproj/InfoPlist.strings | 4 +- .../zh-Hans.lproj/Localizable.strings | 0 .../zh-Hant.lproj/InfoPlist.strings | 4 +- .../zh-Hant.lproj/Localizable.strings | 0 Source/Resources/MenuIcons/MenuIcon-SCVIM.png | Bin 0 -> 3871 bytes .../Resources/MenuIcons/MenuIcon-SCVIM@2x.png | Bin 0 -> 4945 bytes Source/Resources/MenuIcons/MenuIcon-TCVIM.png | Bin 0 -> 3603 bytes .../Resources/MenuIcons/MenuIcon-TCVIM@2x.png | Bin 0 -> 5105 bytes Source/Tools/genRTF.py | 66 --- Source/Tools/tistool.m | 115 ----- .../ctlAboutWindow.swift} | 4 +- .../ctlNonModalAlertWindow.swift} | 22 +- .../ctlPrefWindow.swift} | 8 +- .../{ => WindowNIBs}/Base.lproj/MainMenu.xib | 0 .../Base.lproj/frmAboutWindow.xib | 2 +- .../Base.lproj/frmNonModalAlertWindow.xib} | 19 +- .../Base.lproj/frmPreferences.xib} | 4 +- .../NonModalAlertWindowController.strings | 12 + .../en.lproj/frmAboutWindow.strings | 4 +- .../en.lproj/frmPreferences.strings} | 0 .../NonModalAlertWindowController.strings | 12 + .../ja.lproj/frmAboutWindow.strings | 0 .../ja.lproj/frmPreferences.strings} | 0 .../NonModalAlertWindowController.strings | 12 + .../zh-Hans.lproj/frmAboutWindow.strings | 2 +- .../zh-Hans.lproj/frmPreferences.strings} | 0 .../NonModalAlertWindowController.strings | 12 + .../zh-Hant.lproj/frmAboutWindow.strings | 2 +- .../zh-Hant.lproj/frmPreferences.strings} | 0 Source/en.lproj/BSDLicense.txt | 11 - Source/ja.lproj/BSDLicense.txt | 9 - Source/vChewing-Info.plist | 80 +-- Source/zh-Hans.lproj/BSDLicense.txt | 9 - Source/zh-Hant.lproj/BSDLicense.txt | 9 - vChewing.xcodeproj/project.pbxproj | 457 ++++++++++-------- 133 files changed, 558 insertions(+), 641 deletions(-) rename {Source/Installer => Installer}/AppDelegate.swift (100%) rename {Source/Installer => Installer}/ArchiveUtil.swift (100%) rename {Source/Installer => Installer}/Chronosphere.h (100%) rename {Source/Installer => Installer}/Chronosphere.m (100%) rename {Source/Installer => Installer}/Installer-Info.plist (93%) rename {Source/Installer => Installer}/Installer-Prefix.pch (100%) rename {Source/Installer => Installer}/NotarizedArchives/README.md (100%) rename {Source/Installer => Installer/Resources}/Base.lproj/MainMenu.xib (99%) rename {Source/Installer => Installer/Resources}/en.lproj/InfoPlist.strings (100%) rename {Source/Installer => Installer/Resources}/en.lproj/Localizable.strings (100%) rename {Source/Installer => Installer/Resources}/en.lproj/MainMenu.strings (95%) rename {Source/Installer => Installer/Resources}/ja.lproj/InfoPlist.strings (100%) rename {Source/Installer => Installer/Resources}/ja.lproj/Localizable.strings (100%) rename {Source/Installer => Installer/Resources}/ja.lproj/MainMenu.strings (97%) rename {Source/Installer => Installer/Resources}/zh-Hans.lproj/InfoPlist.strings (100%) rename {Source/Installer => Installer/Resources}/zh-Hans.lproj/Localizable.strings (100%) rename {Source/Installer => Installer/Resources}/zh-Hans.lproj/MainMenu.strings (100%) rename {Source/Installer => Installer/Resources}/zh-Hant.lproj/InfoPlist.strings (100%) rename {Source/Installer => Installer/Resources}/zh-Hant.lproj/Localizable.strings (100%) rename {Source/Installer => Installer/Resources}/zh-Hant.lproj/MainMenu.strings (100%) rename {Source => Installer}/vChewingInstaller-Bridging-Header.h (100%) delete mode 100644 Source/Beep.aif delete mode 100644 Source/Engine/LanguageModel/FastLM.h delete mode 100644 Source/Fart.aif rename Source/{ => Headers}/vChewing-Bridging-Header.h (93%) rename Source/{ => Headers}/vChewing-Prefix.pch (100%) delete mode 100644 Source/Images/Bopomofo.tiff delete mode 100644 Source/Images/Bopomofo@2x.tiff delete mode 100644 Source/Images/SimpBopomofo.tiff delete mode 100644 Source/Images/SimpBopomofo@2x.tiff rename Source/{ => Modules}/AppDelegate.swift (81%) rename Source/{Engine => Modules}/ControllerModules/InputState.swift (100%) rename Source/{Engine => Modules}/ControllerModules/KeyHandler.h (100%) rename Source/{Engine => Modules}/ControllerModules/KeyHandler.mm (98%) rename Source/{Engine => Modules}/ControllerModules/KeyHandlerInput.swift (100%) rename Source/{Engine => Modules}/ControllerModules/KeyValueBlobReader.cpp (100%) rename Source/{Engine => Modules}/ControllerModules/KeyValueBlobReader.h (100%) rename Source/{Engine => Modules}/ControllerModules/StringUtils.swift (100%) rename Source/{Engine/LanguageModel => Modules/FileHandlers}/FSEventStreamHelper.swift (100%) rename Source/{Engine/LanguageModel => Modules/FileHandlers}/LMConsolidator.h (100%) rename Source/{Engine/LanguageModel => Modules/FileHandlers}/LMConsolidator.mm (100%) rename Source/{ => Modules/IMEModules}/InputSourceHelper.swift (100%) rename Source/{ => Modules/IMEModules}/OpenCCBridge.swift (100%) rename Source/{ => Modules/IMEModules}/PreferencesModule.swift (100%) rename Source/{InputMethodController.h => Modules/IMEModules/ctlInputMethod.h} (79%) rename Source/{InputMethodController.mm => Modules/IMEModules/ctlInputMethod.mm} (91%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated/SubLanguageModels}/CNSLM.h (100%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated/SubLanguageModels}/CNSLM.mm (100%) create mode 100644 Source/Modules/LangModelRelated/SubLanguageModels/CoreLM.h rename Source/{Engine/LanguageModel/FastLM.mm => Modules/LangModelRelated/SubLanguageModels/CoreLM.mm} (90%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated/SubLanguageModels}/PhraseReplacementMap.h (100%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated/SubLanguageModels}/PhraseReplacementMap.mm (100%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated/SubLanguageModels}/UserOverrideModel.h (100%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated/SubLanguageModels}/UserOverrideModel.mm (100%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated/SubLanguageModels}/UserPhrasesLM.h (100%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated/SubLanguageModels}/UserPhrasesLM.mm (100%) rename Source/{LanguageModelManager.h => Modules/LangModelRelated/mgrLangModel.h} (93%) rename Source/{LanguageModelManager.mm => Modules/LangModelRelated/mgrLangModel.mm} (97%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated}/vChewingLM.h (97%) rename Source/{Engine/LanguageModel => Modules/LangModelRelated}/vChewingLM.mm (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/Bigram.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/BlockReadingBuilder.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/Gramambular.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/Grid.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/KeyValuePair.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/LanguageModel.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/Node.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/NodeAnchor.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/Span.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/Unigram.h (100%) rename Source/{Engine => Modules/LanguageParsers}/Gramambular/Walker.h (100%) rename Source/{Engine => Modules}/SFX/clsSFX.swift (100%) rename Source/{ => Modules}/main.swift (100%) create mode 100644 Source/Resources/Beep.m4a create mode 100644 Source/Resources/Fart.m4a rename Source/{ => Resources}/Images/Images.xcassets/AboutBanner.imageset/AboutBanner.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@2x.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@3x.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AboutBanner.imageset/Contents.json (100%) rename Source/{ => Resources}/Images/Images.xcassets/AlertIcon.imageset/128X128.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AlertIcon.imageset/192x192.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AlertIcon.imageset/64X64.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AlertIcon.imageset/Contents.json (100%) rename Source/{ => Resources}/Images/Images.xcassets/AppIcon.appiconset/1024X1024.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AppIcon.appiconset/128X128.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AppIcon.appiconset/16X16.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AppIcon.appiconset/256X256.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AppIcon.appiconset/32X32.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AppIcon.appiconset/512X512.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AppIcon.appiconset/64X64.png (100%) rename Source/{ => Resources}/Images/Images.xcassets/AppIcon.appiconset/Contents.json (100%) rename Source/{ => Resources}/Images/Images.xcassets/Contents.json (100%) rename Source/{ => Resources}/Images/RAW/March.jpg (100%) rename Source/{ => Resources}/Images/RAW/vChewing.svg (100%) rename Source/{ => Resources/Localization}/en.lproj/InfoPlist.strings (100%) rename Source/{ => Resources/Localization}/en.lproj/Localizable.strings (100%) rename Source/{ => Resources/Localization}/ja.lproj/InfoPlist.strings (100%) rename Source/{ => Resources/Localization}/ja.lproj/Localizable.strings (100%) rename Source/{ => Resources/Localization}/zh-Hans.lproj/InfoPlist.strings (95%) rename Source/{ => Resources/Localization}/zh-Hans.lproj/Localizable.strings (100%) rename Source/{ => Resources/Localization}/zh-Hant.lproj/InfoPlist.strings (95%) rename Source/{ => Resources/Localization}/zh-Hant.lproj/Localizable.strings (100%) create mode 100644 Source/Resources/MenuIcons/MenuIcon-SCVIM.png create mode 100644 Source/Resources/MenuIcons/MenuIcon-SCVIM@2x.png create mode 100644 Source/Resources/MenuIcons/MenuIcon-TCVIM.png create mode 100644 Source/Resources/MenuIcons/MenuIcon-TCVIM@2x.png delete mode 100755 Source/Tools/genRTF.py delete mode 100644 Source/Tools/tistool.m rename Source/{frmAboutWindow.swift => WindowControllers/ctlAboutWindow.swift} (93%) rename Source/{NonModalAlertWindowController.swift => WindowControllers/ctlNonModalAlertWindow.swift} (82%) rename Source/{PreferencesWindowController.swift => WindowControllers/ctlPrefWindow.swift} (96%) rename Source/{ => WindowNIBs}/Base.lproj/MainMenu.xib (100%) rename Source/{ => WindowNIBs}/Base.lproj/frmAboutWindow.xib (99%) rename Source/{NonModalAlertWindowController.xib => WindowNIBs/Base.lproj/frmNonModalAlertWindow.xib} (90%) rename Source/{Base.lproj/preferences.xib => WindowNIBs/Base.lproj/frmPreferences.xib} (99%) create mode 100644 Source/WindowNIBs/en.lproj/NonModalAlertWindowController.strings rename Source/{ => WindowNIBs}/en.lproj/frmAboutWindow.strings (91%) rename Source/{en.lproj/preferences.strings => WindowNIBs/en.lproj/frmPreferences.strings} (100%) create mode 100644 Source/WindowNIBs/ja.lproj/NonModalAlertWindowController.strings rename Source/{ => WindowNIBs}/ja.lproj/frmAboutWindow.strings (100%) rename Source/{ja.lproj/preferences.strings => WindowNIBs/ja.lproj/frmPreferences.strings} (100%) create mode 100644 Source/WindowNIBs/zh-Hans.lproj/NonModalAlertWindowController.strings rename Source/{ => WindowNIBs}/zh-Hans.lproj/frmAboutWindow.strings (95%) rename Source/{zh-Hans.lproj/preferences.strings => WindowNIBs/zh-Hans.lproj/frmPreferences.strings} (100%) create mode 100644 Source/WindowNIBs/zh-Hant.lproj/NonModalAlertWindowController.strings rename Source/{ => WindowNIBs}/zh-Hant.lproj/frmAboutWindow.strings (95%) rename Source/{zh-Hant.lproj/preferences.strings => WindowNIBs/zh-Hant.lproj/frmPreferences.strings} (100%) delete mode 100644 Source/en.lproj/BSDLicense.txt delete mode 100644 Source/ja.lproj/BSDLicense.txt delete mode 100644 Source/zh-Hans.lproj/BSDLicense.txt delete mode 100644 Source/zh-Hant.lproj/BSDLicense.txt diff --git a/Source/Installer/AppDelegate.swift b/Installer/AppDelegate.swift similarity index 100% rename from Source/Installer/AppDelegate.swift rename to Installer/AppDelegate.swift diff --git a/Source/Installer/ArchiveUtil.swift b/Installer/ArchiveUtil.swift similarity index 100% rename from Source/Installer/ArchiveUtil.swift rename to Installer/ArchiveUtil.swift diff --git a/Source/Installer/Chronosphere.h b/Installer/Chronosphere.h similarity index 100% rename from Source/Installer/Chronosphere.h rename to Installer/Chronosphere.h diff --git a/Source/Installer/Chronosphere.m b/Installer/Chronosphere.m similarity index 100% rename from Source/Installer/Chronosphere.m rename to Installer/Chronosphere.m diff --git a/Source/Installer/Installer-Info.plist b/Installer/Installer-Info.plist similarity index 93% rename from Source/Installer/Installer-Info.plist rename to Installer/Installer-Info.plist index 083859b0..4f418f3e 100644 --- a/Source/Installer/Installer-Info.plist +++ b/Installer/Installer-Info.plist @@ -2,8 +2,6 @@ - CFEULAContent - License texts used in the customized about window. CFBundleDevelopmentRegion en CFBundleExecutable @@ -17,11 +15,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.2.0 + $(MARKETING_VERSION) CFBundleSignature MBIN CFBundleVersion - 893 + $(CURRENT_PROJECT_VERSION) + CFEULAContent + License texts used in the customized about window. LSApplicationCategoryType public.app-category.utilities LSHasLocalizedDisplayName diff --git a/Source/Installer/Installer-Prefix.pch b/Installer/Installer-Prefix.pch similarity index 100% rename from Source/Installer/Installer-Prefix.pch rename to Installer/Installer-Prefix.pch diff --git a/Source/Installer/NotarizedArchives/README.md b/Installer/NotarizedArchives/README.md similarity index 100% rename from Source/Installer/NotarizedArchives/README.md rename to Installer/NotarizedArchives/README.md diff --git a/Source/Installer/Base.lproj/MainMenu.xib b/Installer/Resources/Base.lproj/MainMenu.xib similarity index 99% rename from Source/Installer/Base.lproj/MainMenu.xib rename to Installer/Resources/Base.lproj/MainMenu.xib index 965dfaf3..c78e887e 100644 --- a/Source/Installer/Base.lproj/MainMenu.xib +++ b/Installer/Resources/Base.lproj/MainMenu.xib @@ -91,7 +91,7 @@ - + diff --git a/Source/Installer/en.lproj/InfoPlist.strings b/Installer/Resources/en.lproj/InfoPlist.strings similarity index 100% rename from Source/Installer/en.lproj/InfoPlist.strings rename to Installer/Resources/en.lproj/InfoPlist.strings diff --git a/Source/Installer/en.lproj/Localizable.strings b/Installer/Resources/en.lproj/Localizable.strings similarity index 100% rename from Source/Installer/en.lproj/Localizable.strings rename to Installer/Resources/en.lproj/Localizable.strings diff --git a/Source/Installer/en.lproj/MainMenu.strings b/Installer/Resources/en.lproj/MainMenu.strings similarity index 95% rename from Source/Installer/en.lproj/MainMenu.strings rename to Installer/Resources/en.lproj/MainMenu.strings index 61361985..4a3f46d6 100644 --- a/Source/Installer/en.lproj/MainMenu.strings +++ b/Installer/Resources/en.lproj/MainMenu.strings @@ -56,8 +56,8 @@ /* Class = "NSTextFieldCell"; title = "Derived from OpenVanilla McBopopmofo Project."; ObjectID = "QYf-Nf-hoi"; */ "QYf-Nf-hoi.title" = "Derived from OpenVanilla McBopopmofo Project."; -/* Class = "NSTextFieldCell"; title = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development Reinforced by Hiraku Wang.
vChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "VW8-s5-Wpn"; */ -"VW8-s5-Wpn.title" = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development Reinforced by Hiraku Wang.
vChewing Phrase Database Maintained by Shiki Suen."; +/* Class = "NSTextFieldCell"; title = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development Reinforced by Hiraku Wang.\nvChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "VW8-s5-Wpn"; */ +"VW8-s5-Wpn.title" = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development Reinforced by Hiraku Wang.\nvChewing Phrase Database Maintained by 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/Source/Installer/ja.lproj/InfoPlist.strings b/Installer/Resources/ja.lproj/InfoPlist.strings similarity index 100% rename from Source/Installer/ja.lproj/InfoPlist.strings rename to Installer/Resources/ja.lproj/InfoPlist.strings diff --git a/Source/Installer/ja.lproj/Localizable.strings b/Installer/Resources/ja.lproj/Localizable.strings similarity index 100% rename from Source/Installer/ja.lproj/Localizable.strings rename to Installer/Resources/ja.lproj/Localizable.strings diff --git a/Source/Installer/ja.lproj/MainMenu.strings b/Installer/Resources/ja.lproj/MainMenu.strings similarity index 97% rename from Source/Installer/ja.lproj/MainMenu.strings rename to Installer/Resources/ja.lproj/MainMenu.strings index 5c86d3b6..8e72bb27 100644 --- a/Source/Installer/ja.lproj/MainMenu.strings +++ b/Installer/Resources/ja.lproj/MainMenu.strings @@ -56,7 +56,7 @@ /* Class = "NSTextFieldCell"; title = "Derived from OpenVanilla McBopopmofo Project."; ObjectID = "QYf-Nf-hoi"; */ "QYf-Nf-hoi.title" = "OpenVanilla 小麦注音プロジェクトから派生。"; -/* Class = "NSTextFieldCell"; title = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development Reinforced by Hiraku Wang.
vChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "VW8-s5-Wpn"; */ +/* Class = "NSTextFieldCell"; title = "McBopomofo Engine by Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, et al.\nvChewing macOS Development Reinforced by Hiraku Wang.\nvChewing Phrase Database Maintained by Shiki Suen."; ObjectID = "VW8-s5-Wpn"; */ "VW8-s5-Wpn.title" = "小麦注音入力エンジン開発:Mengjuei Hsieh, Lukhnos Liu, Zonble Yang, など。\nmacOS 版の開発協力:Hiraku Wang。\n威注音語彙データの維持:孫志貴 (Shiki Suen)。"; /* Class = "NSTextFieldCell"; title = "Placeholder for showing copyright information."; ObjectID = "eo3-TK-0rB"; */ diff --git a/Source/Installer/zh-Hans.lproj/InfoPlist.strings b/Installer/Resources/zh-Hans.lproj/InfoPlist.strings similarity index 100% rename from Source/Installer/zh-Hans.lproj/InfoPlist.strings rename to Installer/Resources/zh-Hans.lproj/InfoPlist.strings diff --git a/Source/Installer/zh-Hans.lproj/Localizable.strings b/Installer/Resources/zh-Hans.lproj/Localizable.strings similarity index 100% rename from Source/Installer/zh-Hans.lproj/Localizable.strings rename to Installer/Resources/zh-Hans.lproj/Localizable.strings diff --git a/Source/Installer/zh-Hans.lproj/MainMenu.strings b/Installer/Resources/zh-Hans.lproj/MainMenu.strings similarity index 100% rename from Source/Installer/zh-Hans.lproj/MainMenu.strings rename to Installer/Resources/zh-Hans.lproj/MainMenu.strings diff --git a/Source/Installer/zh-Hant.lproj/InfoPlist.strings b/Installer/Resources/zh-Hant.lproj/InfoPlist.strings similarity index 100% rename from Source/Installer/zh-Hant.lproj/InfoPlist.strings rename to Installer/Resources/zh-Hant.lproj/InfoPlist.strings diff --git a/Source/Installer/zh-Hant.lproj/Localizable.strings b/Installer/Resources/zh-Hant.lproj/Localizable.strings similarity index 100% rename from Source/Installer/zh-Hant.lproj/Localizable.strings rename to Installer/Resources/zh-Hant.lproj/Localizable.strings diff --git a/Source/Installer/zh-Hant.lproj/MainMenu.strings b/Installer/Resources/zh-Hant.lproj/MainMenu.strings similarity index 100% rename from Source/Installer/zh-Hant.lproj/MainMenu.strings rename to Installer/Resources/zh-Hant.lproj/MainMenu.strings diff --git a/Source/vChewingInstaller-Bridging-Header.h b/Installer/vChewingInstaller-Bridging-Header.h similarity index 100% rename from Source/vChewingInstaller-Bridging-Header.h rename to Installer/vChewingInstaller-Bridging-Header.h diff --git a/Source/Beep.aif b/Source/Beep.aif deleted file mode 100644 index ba0f98952465879463384a516a7c0ec6e05d2027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232754 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 diff --git a/Source/Engine/LanguageModel/FastLM.h b/Source/Engine/LanguageModel/FastLM.h deleted file mode 100644 index aa94a005..00000000 --- a/Source/Engine/LanguageModel/FastLM.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * FastLM.h - * - * Copyright 2021-2022 vChewing Project (3-Clause BSD License). - * Derived from 2011-2022 OpenVanilla Project (MIT License). - * Some rights reserved. See "LICENSE.TXT" for details. - */ - -#ifndef FASTLM_H -#define FASTLM_H - -#include -#include -#include -#include "LanguageModel.h" - -// this class relies on the fact that we have a space-separated data -// format, and we use mmap and zero-out the separators and line feeds -// to avoid creating new string objects; the parser is a simple DFA - -namespace Taiyan { - namespace Gramambular { - class FastLM : public LanguageModel - { - public: - FastLM(); - ~FastLM(); - - bool open(const char *path); - void close(); - void dump(); - - virtual const vector bigramsForKeys(const string& preceedingKey, const string& key); - virtual const vector unigramsForKey(const string& key); - virtual bool hasUnigramsForKey(const string& key); - - protected: - struct CStringCmp - { - bool operator()(const char* s1, const char* s2) const - { - return strcmp(s1, s2) < 0; - } - }; - - struct Row { - const char *key; - const char *value; - const char *logProbability; - }; - - map, CStringCmp> keyRowMap; - int fd; - void *data; - size_t length; - }; - - } -} - -#endif diff --git a/Source/Fart.aif b/Source/Fart.aif deleted file mode 100644 index 84c06b3997edfe0754f2137d1e4ddf1748b5376a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63414 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 // @import Foundation; #import "SSZipArchive.h" // Zip Archive Support; -@interface LanguageModelManager : NSObject +@interface mgrLangModel : NSObject + (void)loadDataModels; + (void)loadCNSData; + (void)loadUserPhrases; diff --git a/Source/vChewing-Prefix.pch b/Source/Headers/vChewing-Prefix.pch similarity index 100% rename from Source/vChewing-Prefix.pch rename to Source/Headers/vChewing-Prefix.pch diff --git a/Source/Images/Bopomofo.tiff b/Source/Images/Bopomofo.tiff deleted file mode 100644 index 4d1ada39ac0cace9d78db47e69c46985b0c51e39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5168 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 P7^B2kh*bw+*aiOr!^FRf diff --git a/Source/Images/SimpBopomofo.tiff b/Source/Images/SimpBopomofo.tiff deleted file mode 100644 index 3a73e5859c9fa85085848f09725f2176137bf66e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5156 zcmeHLeN+=y7QX}#h@glRzu1}%l;TG|2o)hDP(TWJjIsfjkFu*FnUE|=W|)~kfUOpB z3)__yMMMF&3LF$Fw6UTI%QZ%FToPd;(Hw7dNJ<|NVl(@Sda{iUnK&HhQV@YtUmLL1*Yb;Y#t zNb9vh*DuLZuZ7%{UwEBvXqex8=(VFwZVOLb6Mu6r&9B1o^`4Z3!qC9L{DzNnO`RL6sw%Pv>#wAe{(b*Azq((gx?U69{5uzaw;6{A z25M^#*lo|x5BO!;wmlt+x{6)iXNUOrx(^#1_gtyXl~(uNIkh@J^pA|``l*hN-R%)3 z=dzvq75=mO+fAm>4nxn5l`n3Msp~4f;5cXB;O#%heE3b=g^#;a(n`-AUfk9B-Tk5X z4J}=ZpB?OVb#2v%BkDgdkf)Nq9%T9Iv?PD`OT9j!{Pu>Rs=l51fo+SiSL?o5=2-Fj z(nJ3J>FKQ{#jW-2GqUm|4ojbj#C&$Vxuc-B?#zOwPT38na!=xdlbOHquI?w_iKA!T zJnJ^oK1SeF)V<_rY;D2byUG1#vhdgIZ{7^iZ`!=@-oXW7ZORW`apyi)yuGK=zCP)> z%a{B4f*ZS2OXk(}$j|rgyZW#0Mb6clukr6an!J`5fWEOr9-8o0rrs6%I{dx6mw(n< zr#M7YP=yOi_lKwkdY z>UGYdO)ofXsd(tObJl}UF4y;ZS=pJY`ugN`F)>dXTwGdOKDgSZ{xFj4qsu+MiaGIq zV`JmToP8HbejvT~)@I`ichCR)JA1GLU=i4j!5oAg zkgU-jz}_ZzM*SH!%t3gLorA@em3!FatgmNmn6>w^;nxtJXVbrcj2GHDT5Kzk|3x-j zgRu7)KQbF;=TeN3(?w2@h=lJVeYVA-o1J&~=?vBjfRm_K8E6L)fWgR6ikL`Va!M-C z=@xL%#RV6zSE^_-B0hc%>u2KjU8lu4e9mWmO{_Dibfy}oRVX@^qA(RnF$l9^uE}9Y z7VkpXQ>9g^5k7?QatZ~A@E5E+-HLCsIKzq`vzSU$M4{Z+CF5m`!RceLN=q4#4$2&S z4SExb!O~coTyf+21oXtv?F}?2AO<3V2XPP$Q4j;_dBRkYad8IXhVvESmH4?z_+R)I0=K-9` z0G^Z%4gGLnXy{1|s=~hkv>He4iTwbEC@zjZD^-0MzgX#uVwtShqa@_!=y^v)BD z#A1nv{qO>UB>@2vu^6P`W>Trj#2H>Xo}n|!u)gCh7*D5`VM#0GA~_j_Yjv@C6rPZ` zHc^$AsR~hJ;bB~_F-LEeXK(JmC})njxh3ApUQN?#K0j7JgZegT#p-YBSQ-V z1OdXa`lOa%2wF>!BW6ZgV98COA`HTjVPq&8XNU-y*u<ZRG(1mG`asx zn_W zq-rTQc9bSGOpcPmBQg;CGAu%)(HV72E)P|zF2jgZJXCKY!HeUKaAwLx$6oLN diff --git a/Source/Images/SimpBopomofo@2x.tiff b/Source/Images/SimpBopomofo@2x.tiff deleted file mode 100644 index 49695293f6e27324885e54cbe962da740218611a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6332 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 F{2RfJpO63m diff --git a/Source/AppDelegate.swift b/Source/Modules/AppDelegate.swift similarity index 81% rename from Source/AppDelegate.swift rename to Source/Modules/AppDelegate.swift index 02f4d82a..21222298 100644 --- a/Source/AppDelegate.swift +++ b/Source/Modules/AppDelegate.swift @@ -128,27 +128,27 @@ struct VersionUpdateApi { } @objc(AppDelegate) -class AppDelegate: NSObject, NSApplicationDelegate, NonModalAlertWindowControllerDelegate, FSEventStreamHelperDelegate { +class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelegate, FSEventStreamHelperDelegate { func helper(_ helper: FSEventStreamHelper, didReceive events: [FSEventStreamHelper.Event]) { DispatchQueue.main.async { if Preferences.shouldAutoReloadUserDataFiles { - LanguageModelManager.loadUserPhrases() - LanguageModelManager.loadUserPhraseReplacement() + mgrLangModel.loadUserPhrases() + mgrLangModel.loadUserPhraseReplacement() } } } @IBOutlet weak var window: NSWindow? - private var preferencesWindowController: PreferencesWindowController? - private var aboutWindowController: frmAboutWindow? // New About Window + private var ctlPrefWindowInstance: ctlPrefWindow? + private var ctlAboutWindowInstance: ctlAboutWindow? // New About Window private var checkTask: URLSessionTask? private var updateNextStepURL: URL? - private var fsStreamHelper = FSEventStreamHelper(path: LanguageModelManager.dataFolderPath, queue: DispatchQueue(label: "User Phrases")) + private var fsStreamHelper = FSEventStreamHelper(path: mgrLangModel.dataFolderPath, queue: DispatchQueue(label: "User Phrases")) // 補上 dealloc deinit { - preferencesWindowController = nil - aboutWindowController = nil + ctlPrefWindowInstance = nil + ctlAboutWindowInstance = nil checkTask = nil updateNextStepURL = nil fsStreamHelper.stop() @@ -156,10 +156,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NonModalAlertWindowControlle } func applicationDidFinishLaunching(_ notification: Notification) { - LanguageModelManager.loadDataModels() - LanguageModelManager.loadCNSData() - LanguageModelManager.loadUserPhrases() - LanguageModelManager.loadUserPhraseReplacement() + mgrLangModel.loadDataModels() + mgrLangModel.loadCNSData() + mgrLangModel.loadUserPhrases() + mgrLangModel.loadUserPhraseReplacement() fsStreamHelper.delegate = self _ = fsStreamHelper.start() @@ -172,20 +172,20 @@ class AppDelegate: NSObject, NSApplicationDelegate, NonModalAlertWindowControlle } @objc func showPreferences() { - if (preferencesWindowController == nil) { - preferencesWindowController = PreferencesWindowController(windowNibName: "preferences") + if (ctlPrefWindowInstance == nil) { + ctlPrefWindowInstance = ctlPrefWindow.init(windowNibName: "frmPrefWindow") } - preferencesWindowController?.window?.center() - preferencesWindowController?.window?.orderFrontRegardless() // 逼著屬性視窗往最前方顯示 + ctlPrefWindowInstance?.window?.center() + ctlPrefWindowInstance?.window?.orderFrontRegardless() // 逼著屬性視窗往最前方顯示 } // New About Window @objc func showAbout() { - if (aboutWindowController == nil) { - aboutWindowController = frmAboutWindow.init(windowNibName: "frmAboutWindow") + if (ctlAboutWindowInstance == nil) { + ctlAboutWindowInstance = ctlAboutWindow.init(windowNibName: "frmAboutWindow") } - aboutWindowController?.window?.center() - aboutWindowController?.window?.orderFrontRegardless() // 逼著關於視窗往最前方顯示 + ctlAboutWindowInstance?.window?.center() + ctlAboutWindowInstance?.window?.orderFrontRegardless() // 逼著關於視窗往最前方顯示 } @objc(checkForUpdate) @@ -231,7 +231,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NonModalAlertWindowControlle report.remoteShortVersion, report.remoteVersion, report.versionDescription) - NonModalAlertWindowController.shared.show(title: NSLocalizedString("New Version Available", comment: ""), content: content, confirmButtonTitle: NSLocalizedString("Visit Website", comment: ""), cancelButtonTitle: NSLocalizedString("Not Now", comment: ""), cancelAsDefault: false, delegate: self) + ctlNonModalAlertWindow.shared.show(title: NSLocalizedString("New Version Available", comment: ""), content: content, confirmButtonTitle: NSLocalizedString("Visit Website", comment: ""), cancelButtonTitle: NSLocalizedString("Not Now", comment: ""), cancelAsDefault: false, delegate: self) case .noNeedToUpdate, .ignored: break } @@ -241,7 +241,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NonModalAlertWindowControlle let title = NSLocalizedString("Update Check Failed", comment: "") let content = String(format: NSLocalizedString("There may be no internet connection or the server failed to respond.\n\nError message: %@", comment: ""), message) let buttonTitle = NSLocalizedString("Dismiss", comment: "") - NonModalAlertWindowController.shared.show(title: title, content: content, confirmButtonTitle: buttonTitle, cancelButtonTitle: nil, cancelAsDefault: false, delegate: nil) + ctlNonModalAlertWindow.shared.show(title: title, content: content, confirmButtonTitle: buttonTitle, cancelButtonTitle: nil, cancelAsDefault: false, delegate: nil) default: break } @@ -249,14 +249,14 @@ class AppDelegate: NSObject, NSApplicationDelegate, NonModalAlertWindowControlle } } - func nonModalAlertWindowControllerDidConfirm(_ controller: NonModalAlertWindowController) { + func ctlNonModalAlertWindowDidConfirm(_ controller: ctlNonModalAlertWindow) { if let updateNextStepURL = updateNextStepURL { NSWorkspace.shared.open(updateNextStepURL) } updateNextStepURL = nil } - func nonModalAlertWindowControllerDidCancel(_ controller: NonModalAlertWindowController) { + func ctlNonModalAlertWindowDidCancel(_ controller: ctlNonModalAlertWindow) { updateNextStepURL = nil } diff --git a/Source/Engine/ControllerModules/InputState.swift b/Source/Modules/ControllerModules/InputState.swift similarity index 100% rename from Source/Engine/ControllerModules/InputState.swift rename to Source/Modules/ControllerModules/InputState.swift diff --git a/Source/Engine/ControllerModules/KeyHandler.h b/Source/Modules/ControllerModules/KeyHandler.h similarity index 100% rename from Source/Engine/ControllerModules/KeyHandler.h rename to Source/Modules/ControllerModules/KeyHandler.h diff --git a/Source/Engine/ControllerModules/KeyHandler.mm b/Source/Modules/ControllerModules/KeyHandler.mm similarity index 98% rename from Source/Engine/ControllerModules/KeyHandler.mm rename to Source/Modules/ControllerModules/KeyHandler.mm index 4602bfde..ba459544 100644 --- a/Source/Engine/ControllerModules/KeyHandler.mm +++ b/Source/Modules/ControllerModules/KeyHandler.mm @@ -10,7 +10,7 @@ #import "Gramambular.h" #import "vChewingLM.h" #import "UserOverrideModel.h" -#import "LanguageModelManager.h" +#import "mgrLangModel.h" #import "KeyHandler.h" #import "vChewing-Swift.h" @@ -87,12 +87,12 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot"; if ([value isKindOfClass:[NSString class]] && [value isEqual:kBopomofoModeIdentifierCHS]) { newInputMode = kBopomofoModeIdentifierCHS; - newLanguageModel = [LanguageModelManager languageModelCoreCHS]; - newUserOverrideModel = [LanguageModelManager userOverrideModelCHS]; + newLanguageModel = [mgrLangModel languageModelCoreCHS]; + newUserOverrideModel = [mgrLangModel userOverrideModelCHS]; } else { newInputMode = kBopomofoModeIdentifierCHT; - newLanguageModel = [LanguageModelManager languageModelCoreCHT]; - newUserOverrideModel = [LanguageModelManager userOverrideModelCHT]; + newLanguageModel = [mgrLangModel languageModelCoreCHT]; + newUserOverrideModel = [mgrLangModel userOverrideModelCHT]; } // 自 Preferences 模組讀入自訂語彙置換功能開關狀態。 @@ -140,10 +140,10 @@ static NSString *const kGraphVizOutputfile = @"/tmp/vChewing-visualization.dot"; _bpmfReadingBuffer = new BopomofoReadingBuffer(BopomofoKeyboardLayout::StandardLayout()); // create the lattice builder - _languageModel = [LanguageModelManager languageModelCoreCHT]; + _languageModel = [mgrLangModel languageModelCoreCHT]; _languageModel->setPhraseReplacementEnabled(Preferences.phraseReplacementEnabled); _languageModel->setCNSEnabled(Preferences.cns11643Enabled); - _userOverrideModel = [LanguageModelManager userOverrideModelCHT]; + _userOverrideModel = [mgrLangModel userOverrideModelCHT]; _builder = new BlockReadingBuilder(_languageModel); diff --git a/Source/Engine/ControllerModules/KeyHandlerInput.swift b/Source/Modules/ControllerModules/KeyHandlerInput.swift similarity index 100% rename from Source/Engine/ControllerModules/KeyHandlerInput.swift rename to Source/Modules/ControllerModules/KeyHandlerInput.swift diff --git a/Source/Engine/ControllerModules/KeyValueBlobReader.cpp b/Source/Modules/ControllerModules/KeyValueBlobReader.cpp similarity index 100% rename from Source/Engine/ControllerModules/KeyValueBlobReader.cpp rename to Source/Modules/ControllerModules/KeyValueBlobReader.cpp diff --git a/Source/Engine/ControllerModules/KeyValueBlobReader.h b/Source/Modules/ControllerModules/KeyValueBlobReader.h similarity index 100% rename from Source/Engine/ControllerModules/KeyValueBlobReader.h rename to Source/Modules/ControllerModules/KeyValueBlobReader.h diff --git a/Source/Engine/ControllerModules/StringUtils.swift b/Source/Modules/ControllerModules/StringUtils.swift similarity index 100% rename from Source/Engine/ControllerModules/StringUtils.swift rename to Source/Modules/ControllerModules/StringUtils.swift diff --git a/Source/Engine/LanguageModel/FSEventStreamHelper.swift b/Source/Modules/FileHandlers/FSEventStreamHelper.swift similarity index 100% rename from Source/Engine/LanguageModel/FSEventStreamHelper.swift rename to Source/Modules/FileHandlers/FSEventStreamHelper.swift diff --git a/Source/Engine/LanguageModel/LMConsolidator.h b/Source/Modules/FileHandlers/LMConsolidator.h similarity index 100% rename from Source/Engine/LanguageModel/LMConsolidator.h rename to Source/Modules/FileHandlers/LMConsolidator.h diff --git a/Source/Engine/LanguageModel/LMConsolidator.mm b/Source/Modules/FileHandlers/LMConsolidator.mm similarity index 100% rename from Source/Engine/LanguageModel/LMConsolidator.mm rename to Source/Modules/FileHandlers/LMConsolidator.mm diff --git a/Source/InputSourceHelper.swift b/Source/Modules/IMEModules/InputSourceHelper.swift similarity index 100% rename from Source/InputSourceHelper.swift rename to Source/Modules/IMEModules/InputSourceHelper.swift diff --git a/Source/OpenCCBridge.swift b/Source/Modules/IMEModules/OpenCCBridge.swift similarity index 100% rename from Source/OpenCCBridge.swift rename to Source/Modules/IMEModules/OpenCCBridge.swift diff --git a/Source/PreferencesModule.swift b/Source/Modules/IMEModules/PreferencesModule.swift similarity index 100% rename from Source/PreferencesModule.swift rename to Source/Modules/IMEModules/PreferencesModule.swift diff --git a/Source/InputMethodController.h b/Source/Modules/IMEModules/ctlInputMethod.h similarity index 79% rename from Source/InputMethodController.h rename to Source/Modules/IMEModules/ctlInputMethod.h index 3ae0fe35..dad41093 100644 --- a/Source/InputMethodController.h +++ b/Source/Modules/IMEModules/ctlInputMethod.h @@ -1,5 +1,5 @@ /* - * InputMethodController.h + * ctlInputMethod.h * * Copyright 2021-2022 vChewing Project (3-Clause BSD License). * Derived from 2011-2022 OpenVanilla Project (MIT License). @@ -10,6 +10,6 @@ #import #import "vChewing-Swift.h" -@interface vChewingInputMethodController : IMKInputController +@interface ctlInputMethod : IMKInputController - (void)handleState:(InputState *)newState client:(id)client; @end diff --git a/Source/InputMethodController.mm b/Source/Modules/IMEModules/ctlInputMethod.mm similarity index 91% rename from Source/InputMethodController.mm rename to Source/Modules/IMEModules/ctlInputMethod.mm index 439a054a..2d927b27 100644 --- a/Source/InputMethodController.mm +++ b/Source/Modules/IMEModules/ctlInputMethod.mm @@ -1,5 +1,5 @@ /* - * InputMethodController.mm + * ctlInputMethod.mm * * Copyright 2021-2022 vChewing Project (3-Clause BSD License). * Derived from 2011-2022 OpenVanilla Project (MIT License). @@ -7,9 +7,9 @@ */ #import "vChewingLM.h" -#import "InputMethodController.h" +#import "ctlInputMethod.h" #import "KeyHandler.h" -#import "LanguageModelManager.h" +#import "mgrLangModel.h" using namespace std; using namespace vChewing; @@ -23,7 +23,7 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { return s; } -@interface vChewingInputMethodController () +@interface ctlInputMethod () { // the current text input client; we need to keep this when candidate panel is on id _currentCandidateClient; @@ -36,13 +36,13 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { } @end -@interface vChewingInputMethodController (VTCandidateController) +@interface ctlInputMethod (VTCandidateController) @end -@interface vChewingInputMethodController (KeyHandlerDelegate) +@interface ctlInputMethod (KeyHandlerDelegate) @end -@interface vChewingInputMethodController (UI) +@interface ctlInputMethod (UI) + (VTHorizontalCandidateController *)horizontalCandidateController; + (VTVerticalCandidateController *)verticalCandidateController; + (TooltipController *)tooltipController; @@ -50,7 +50,7 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { - (void)_hideTooltip; @end -@implementation vChewingInputMethodController +@implementation ctlInputMethod - (id)initWithServer:(IMKServer *)server delegate:(id)delegate client:(id)client { @@ -398,11 +398,11 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { BOOL useVerticalMode = state.useVerticalMode; if (useVerticalMode) { - gCurrentCandidateController = [vChewingInputMethodController verticalCandidateController]; + gCurrentCandidateController = [ctlInputMethod verticalCandidateController]; } else if (Preferences.useHorizontalCandidateList) { - gCurrentCandidateController = [vChewingInputMethodController horizontalCandidateController]; + gCurrentCandidateController = [ctlInputMethod horizontalCandidateController]; } else { - gCurrentCandidateController = [vChewingInputMethodController verticalCandidateController]; + gCurrentCandidateController = [ctlInputMethod verticalCandidateController]; } // set the attributes for the candidate panel (which uses NSAttributedString) @@ -495,19 +495,19 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { - (void)togglePhraseReplacementEnabled:(id)sender { if (_keyHandler.inputMode == kBopomofoModeIdentifierCHT){ - [LanguageModelManager languageModelCoreCHT]->setPhraseReplacementEnabled([Preferences togglePhraseReplacementEnabled]); + [mgrLangModel languageModelCoreCHT]->setPhraseReplacementEnabled([Preferences togglePhraseReplacementEnabled]); } else { - [LanguageModelManager languageModelCoreCHS]->setPhraseReplacementEnabled([Preferences togglePhraseReplacementEnabled]); + [mgrLangModel languageModelCoreCHS]->setPhraseReplacementEnabled([Preferences togglePhraseReplacementEnabled]); } } - (void)toggleCNS11643Enabled:(id)sender { if (_keyHandler.inputMode == kBopomofoModeIdentifierCHT){ - [LanguageModelManager languageModelCoreCHT]->setCNSEnabled([Preferences toggleCNS11643Enabled]); + [mgrLangModel languageModelCoreCHT]->setCNSEnabled([Preferences toggleCNS11643Enabled]); } else { - [LanguageModelManager languageModelCoreCHS]->setCNSEnabled([Preferences toggleCNS11643Enabled]); + [mgrLangModel languageModelCoreCHS]->setCNSEnabled([Preferences toggleCNS11643Enabled]); } // 注意上面這一行已經動過開關了,所以接下來就不要 toggle。 [NotifierController notifyWithMessage:[NSString stringWithFormat:@"%@%@%@", NSLocalizedString(@"CNS11643 Mode", @""), @"\n", [Preferences cns11643Enabled] ? NSLocalizedString(@"NotificationSwitchON", @"") : NSLocalizedString(@"NotificationSwitchOFF", @"")] stay:NO]; @@ -526,9 +526,9 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { - (BOOL)_checkUserFiles { - if (![LanguageModelManager checkIfUserLanguageModelFilesExist]) { - NSString *content = [NSString stringWithFormat:NSLocalizedString(@"Please check the permission of at \"%@\".", @""), [LanguageModelManager dataFolderPath]]; - [[NonModalAlertWindowController sharedInstance] showWithTitle:NSLocalizedString(@"Unable to create the user phrase file.", @"") content:content confirmButtonTitle:NSLocalizedString(@"OK", @"") cancelButtonTitle:nil cancelAsDefault:NO delegate:nil]; + if (![mgrLangModel checkIfUserLanguageModelFilesExist]) { + NSString *content = [NSString stringWithFormat:NSLocalizedString(@"Please check the permission of at \"%@\".", @""), [mgrLangModel dataFolderPath]]; + [[ctlNonModalAlertWindow sharedInstance] showWithTitle:NSLocalizedString(@"Unable to create the user phrase file.", @"") content:content confirmButtonTitle:NSLocalizedString(@"OK", @"") cancelButtonTitle:nil cancelAsDefault:NO delegate:nil]; return NO; } @@ -545,23 +545,23 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { - (void)openUserPhrases:(id)sender { - [self _openUserFile:[LanguageModelManager userPhrasesDataPath:_keyHandler.inputMode]]; + [self _openUserFile:[mgrLangModel userPhrasesDataPath:_keyHandler.inputMode]]; } - (void)openExcludedPhrases:(id)sender { - [self _openUserFile:[LanguageModelManager excludedPhrasesDataPath:_keyHandler.inputMode]]; + [self _openUserFile:[mgrLangModel excludedPhrasesDataPath:_keyHandler.inputMode]]; } - (void)openPhraseReplacement:(id)sender { - [self _openUserFile:[LanguageModelManager phraseReplacementDataPath:_keyHandler.inputMode]]; + [self _openUserFile:[mgrLangModel phraseReplacementDataPath:_keyHandler.inputMode]]; } - (void)reloadUserPhrases:(id)sender { - [LanguageModelManager loadUserPhrases]; - [LanguageModelManager loadUserPhraseReplacement]; + [mgrLangModel loadUserPhrases]; + [mgrLangModel loadUserPhraseReplacement]; } - (void)showAbout:(id)sender @@ -575,7 +575,7 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { #pragma mark - Voltaire -@implementation vChewingInputMethodController (VTCandidateController) +@implementation ctlInputMethod (VTCandidateController) - (NSUInteger)candidateCountForController:(VTCandidateController *)controller { @@ -623,7 +623,7 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { #pragma mark - Implementation -@implementation vChewingInputMethodController (KeyHandlerDelegate) +@implementation ctlInputMethod (KeyHandlerDelegate) - (nonnull VTCandidateController *)candidateControllerForKeyHandler:(nonnull KeyHandler *)keyHandler { @@ -636,7 +636,7 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { return NO; } NSString *userPhrase = state.userPhrase; - return [LanguageModelManager writeUserPhrase:userPhrase inputMode:_keyHandler.inputMode]; + return [mgrLangModel writeUserPhrase:userPhrase inputMode:_keyHandler.inputMode]; return YES; } @@ -648,7 +648,7 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { @end -@implementation vChewingInputMethodController (UI) +@implementation ctlInputMethod (UI) + (VTHorizontalCandidateController *)horizontalCandidateController { @@ -701,13 +701,13 @@ static inline NSString *LocalizationNotNeeded(NSString *s) { NSLog(@"%@", exception); } - [[vChewingInputMethodController tooltipController] showTooltip:tooltip atPoint:lineHeightRect.origin]; + [[ctlInputMethod tooltipController] showTooltip:tooltip atPoint:lineHeightRect.origin]; } - (void)_hideTooltip { - if ([vChewingInputMethodController tooltipController].window.isVisible) { - [[vChewingInputMethodController tooltipController] hide]; + if ([ctlInputMethod tooltipController].window.isVisible) { + [[ctlInputMethod tooltipController] hide]; } } diff --git a/Source/Engine/LanguageModel/CNSLM.h b/Source/Modules/LangModelRelated/SubLanguageModels/CNSLM.h similarity index 100% rename from Source/Engine/LanguageModel/CNSLM.h rename to Source/Modules/LangModelRelated/SubLanguageModels/CNSLM.h diff --git a/Source/Engine/LanguageModel/CNSLM.mm b/Source/Modules/LangModelRelated/SubLanguageModels/CNSLM.mm similarity index 100% rename from Source/Engine/LanguageModel/CNSLM.mm rename to Source/Modules/LangModelRelated/SubLanguageModels/CNSLM.mm diff --git a/Source/Modules/LangModelRelated/SubLanguageModels/CoreLM.h b/Source/Modules/LangModelRelated/SubLanguageModels/CoreLM.h new file mode 100644 index 00000000..9261b304 --- /dev/null +++ b/Source/Modules/LangModelRelated/SubLanguageModels/CoreLM.h @@ -0,0 +1,64 @@ +/* + * CoreLM.hh + * + * Copyright 2021-2022 vChewing Project (3-Clause BSD License). + * Derived from 2011-2022 OpenVanilla Project (MIT License). + * Some rights reserved. See "LICENSE.TXT" for details. + */ + +#ifndef CoreLM_H +#define CoreLM_H + +#include "LanguageModel.h" +#include +#include +#include +#include + +// this class relies on the fact that we have a space-separated data +// format, and we use mmap and zero-out the separators and line feeds +// to avoid creating new string objects; the parser is a simple DFA + +using namespace std; +using namespace Taiyan::Gramambular; + +namespace vChewing { + +class CoreLM : public Taiyan::Gramambular::LanguageModel { +public: + CoreLM(); + ~CoreLM(); + + bool isLoaded(); + bool open(const char *path); + void close(); + void dump(); + + virtual const vector bigramsForKeys(const string& preceedingKey, const string& key); + virtual const vector unigramsForKey(const string& key); + virtual bool hasUnigramsForKey(const string& key); + +protected: + struct CStringCmp + { + bool operator()(const char* s1, const char* s2) const + { + return strcmp(s1, s2) < 0; + } + }; + + struct Row { + const char *key; + const char *value; + const char *logProbability; + }; + + map, CStringCmp> keyRowMap; + int fd; + void *data; + size_t length; +}; + +}; // namespace vChewing + +#endif diff --git a/Source/Engine/LanguageModel/FastLM.mm b/Source/Modules/LangModelRelated/SubLanguageModels/CoreLM.mm similarity index 90% rename from Source/Engine/LanguageModel/FastLM.mm rename to Source/Modules/LangModelRelated/SubLanguageModels/CoreLM.mm index fc90914b..d5900fde 100644 --- a/Source/Engine/LanguageModel/FastLM.mm +++ b/Source/Modules/LangModelRelated/SubLanguageModels/CoreLM.mm @@ -1,12 +1,12 @@ -/* - * FastLM.mm - * +/* + * CoreLM.mm + * * Copyright 2021-2022 vChewing Project (3-Clause BSD License). * Derived from 2011-2022 OpenVanilla Project (MIT License). * Some rights reserved. See "LICENSE.TXT" for details. */ -#include "FastLM.h" +#include "CoreLM.h" #include #include #include @@ -16,21 +16,29 @@ using namespace Taiyan::Gramambular; -FastLM::FastLM() +vChewing::CoreLM::CoreLM() : fd(-1) , data(0) , length(0) { } -FastLM::~FastLM() +vChewing::CoreLM::~CoreLM() { if (data) { close(); } } -bool FastLM::open(const char *path) +bool vChewing::CoreLM::isLoaded() +{ + if (data) { + return true; + } + return false; +} + +bool vChewing::CoreLM::open(const char *path) { if (data) { return false; @@ -238,7 +246,7 @@ end: return true; } -void FastLM::close() +void vChewing::CoreLM::close() { if (data) { munmap(data, length); @@ -249,7 +257,7 @@ void FastLM::close() keyRowMap.clear(); } -void FastLM::dump() +void vChewing::CoreLM::dump() { size_t rows = 0; for (map >::const_iterator i = keyRowMap.begin(), e = keyRowMap.end(); i != e; ++i) { @@ -262,12 +270,12 @@ void FastLM::dump() } } -const vector FastLM::bigramsForKeys(const string& preceedingKey, const string& key) +const vector vChewing::CoreLM::bigramsForKeys(const string& preceedingKey, const string& key) { return vector(); } -const vector FastLM::unigramsForKey(const string& key) +const vector vChewing::CoreLM::unigramsForKey(const string& key) { vector v; map >::const_iterator i = keyRowMap.find(key.c_str()); @@ -286,7 +294,7 @@ const vector FastLM::unigramsForKey(const string& key) return v; } -bool FastLM::hasUnigramsForKey(const string& key) +bool vChewing::CoreLM::hasUnigramsForKey(const string& key) { return keyRowMap.find(key.c_str()) != keyRowMap.end(); } diff --git a/Source/Engine/LanguageModel/PhraseReplacementMap.h b/Source/Modules/LangModelRelated/SubLanguageModels/PhraseReplacementMap.h similarity index 100% rename from Source/Engine/LanguageModel/PhraseReplacementMap.h rename to Source/Modules/LangModelRelated/SubLanguageModels/PhraseReplacementMap.h diff --git a/Source/Engine/LanguageModel/PhraseReplacementMap.mm b/Source/Modules/LangModelRelated/SubLanguageModels/PhraseReplacementMap.mm similarity index 100% rename from Source/Engine/LanguageModel/PhraseReplacementMap.mm rename to Source/Modules/LangModelRelated/SubLanguageModels/PhraseReplacementMap.mm diff --git a/Source/Engine/LanguageModel/UserOverrideModel.h b/Source/Modules/LangModelRelated/SubLanguageModels/UserOverrideModel.h similarity index 100% rename from Source/Engine/LanguageModel/UserOverrideModel.h rename to Source/Modules/LangModelRelated/SubLanguageModels/UserOverrideModel.h diff --git a/Source/Engine/LanguageModel/UserOverrideModel.mm b/Source/Modules/LangModelRelated/SubLanguageModels/UserOverrideModel.mm similarity index 100% rename from Source/Engine/LanguageModel/UserOverrideModel.mm rename to Source/Modules/LangModelRelated/SubLanguageModels/UserOverrideModel.mm diff --git a/Source/Engine/LanguageModel/UserPhrasesLM.h b/Source/Modules/LangModelRelated/SubLanguageModels/UserPhrasesLM.h similarity index 100% rename from Source/Engine/LanguageModel/UserPhrasesLM.h rename to Source/Modules/LangModelRelated/SubLanguageModels/UserPhrasesLM.h diff --git a/Source/Engine/LanguageModel/UserPhrasesLM.mm b/Source/Modules/LangModelRelated/SubLanguageModels/UserPhrasesLM.mm similarity index 100% rename from Source/Engine/LanguageModel/UserPhrasesLM.mm rename to Source/Modules/LangModelRelated/SubLanguageModels/UserPhrasesLM.mm diff --git a/Source/LanguageModelManager.h b/Source/Modules/LangModelRelated/mgrLangModel.h similarity index 93% rename from Source/LanguageModelManager.h rename to Source/Modules/LangModelRelated/mgrLangModel.h index 52507e57..28136324 100644 --- a/Source/LanguageModelManager.h +++ b/Source/Modules/LangModelRelated/mgrLangModel.h @@ -1,5 +1,5 @@ /* - * LanguageModelManager.h + * mgrLangModel.h * * Copyright 2021-2022 vChewing Project (3-Clause BSD License). * Derived from 2011-2022 OpenVanilla Project (MIT License). @@ -7,7 +7,6 @@ */ #import -#import "FastLM.h" #import "UserOverrideModel.h" #import "vChewingLM.h" #import "SSZipArchive.h" @@ -15,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN -@interface LanguageModelManager : NSObject +@interface mgrLangModel : NSObject + (void)loadDataModels; + (void)deployZipDataFile:(NSString *)filenameWithoutExtension; diff --git a/Source/LanguageModelManager.mm b/Source/Modules/LangModelRelated/mgrLangModel.mm similarity index 97% rename from Source/LanguageModelManager.mm rename to Source/Modules/LangModelRelated/mgrLangModel.mm index ceefa187..9380fb79 100644 --- a/Source/LanguageModelManager.mm +++ b/Source/Modules/LangModelRelated/mgrLangModel.mm @@ -1,12 +1,12 @@ /* - * LanguageModelManager.mm + * mgrLangModel.mm * * Copyright 2021-2022 vChewing Project (3-Clause BSD License). * Derived from 2011-2022 OpenVanilla Project (MIT License). * Some rights reserved. See "LICENSE.TXT" for details. */ -#import "LanguageModelManager.h" +#import "mgrLangModel.h" using namespace std; using namespace vChewing; @@ -24,11 +24,11 @@ UserOverrideModel gUserOverrideModelCHT(kUserOverrideModelCapacity, kObservedOve static NSString *const kBopomofoModeIdentifierCHT = @"org.atelierInmu.inputmethod.vChewing.TradBopomofo"; static NSString *const kBopomofoModeIdentifierCHS = @"org.atelierInmu.inputmethod.vChewing.SimpBopomofo"; -@implementation LanguageModelManager +@implementation mgrLangModel + (void)deployZipDataFile:(NSString *)filenameWithoutExtension { - Class cls = NSClassFromString(@"vChewingInputMethodController"); + Class cls = NSClassFromString(@"ctlInputMethod"); NSString *zipPath = [[NSBundle bundleForClass:cls] pathForResource:filenameWithoutExtension ofType:@"zip"]; NSString *destinationPath = [self dataFolderPath]; [SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath]; @@ -39,7 +39,7 @@ static NSString *const kBopomofoModeIdentifierCHS = @"org.atelierInmu.inputmetho static void LTLoadLanguageModelFile(NSString *filenameWithoutExtension, vChewingLM &lm) { - Class cls = NSClassFromString(@"vChewingInputMethodController"); + Class cls = NSClassFromString(@"ctlInputMethod"); NSString *dataPath = [[NSBundle bundleForClass:cls] pathForResource:filenameWithoutExtension ofType:@"txt"]; lm.loadLanguageModel([dataPath UTF8String]); } diff --git a/Source/Engine/LanguageModel/vChewingLM.h b/Source/Modules/LangModelRelated/vChewingLM.h similarity index 97% rename from Source/Engine/LanguageModel/vChewingLM.h rename to Source/Modules/LangModelRelated/vChewingLM.h index 3378e5de..1b86f751 100644 --- a/Source/Engine/LanguageModel/vChewingLM.h +++ b/Source/Modules/LangModelRelated/vChewingLM.h @@ -10,7 +10,7 @@ #define VCHEWINGLM_H #include -#include "FastLM.h" +#include "CoreLM.h" #include "CNSLM.h" #include "UserPhrasesLM.h" #include "PhraseReplacementMap.h" @@ -45,7 +45,7 @@ protected: const std::unordered_set& excludedValues, std::unordered_set& insertedValues); - FastLM m_languageModel; + CoreLM m_languageModel; CNSLM m_cnsModel; UserPhrasesLM m_userPhrases; UserPhrasesLM m_excludedPhrases; diff --git a/Source/Engine/LanguageModel/vChewingLM.mm b/Source/Modules/LangModelRelated/vChewingLM.mm similarity index 100% rename from Source/Engine/LanguageModel/vChewingLM.mm rename to Source/Modules/LangModelRelated/vChewingLM.mm diff --git a/Source/Engine/Gramambular/Bigram.h b/Source/Modules/LanguageParsers/Gramambular/Bigram.h similarity index 100% rename from Source/Engine/Gramambular/Bigram.h rename to Source/Modules/LanguageParsers/Gramambular/Bigram.h diff --git a/Source/Engine/Gramambular/BlockReadingBuilder.h b/Source/Modules/LanguageParsers/Gramambular/BlockReadingBuilder.h similarity index 100% rename from Source/Engine/Gramambular/BlockReadingBuilder.h rename to Source/Modules/LanguageParsers/Gramambular/BlockReadingBuilder.h diff --git a/Source/Engine/Gramambular/Gramambular.h b/Source/Modules/LanguageParsers/Gramambular/Gramambular.h similarity index 100% rename from Source/Engine/Gramambular/Gramambular.h rename to Source/Modules/LanguageParsers/Gramambular/Gramambular.h diff --git a/Source/Engine/Gramambular/Grid.h b/Source/Modules/LanguageParsers/Gramambular/Grid.h similarity index 100% rename from Source/Engine/Gramambular/Grid.h rename to Source/Modules/LanguageParsers/Gramambular/Grid.h diff --git a/Source/Engine/Gramambular/KeyValuePair.h b/Source/Modules/LanguageParsers/Gramambular/KeyValuePair.h similarity index 100% rename from Source/Engine/Gramambular/KeyValuePair.h rename to Source/Modules/LanguageParsers/Gramambular/KeyValuePair.h diff --git a/Source/Engine/Gramambular/LanguageModel.h b/Source/Modules/LanguageParsers/Gramambular/LanguageModel.h similarity index 100% rename from Source/Engine/Gramambular/LanguageModel.h rename to Source/Modules/LanguageParsers/Gramambular/LanguageModel.h diff --git a/Source/Engine/Gramambular/Node.h b/Source/Modules/LanguageParsers/Gramambular/Node.h similarity index 100% rename from Source/Engine/Gramambular/Node.h rename to Source/Modules/LanguageParsers/Gramambular/Node.h diff --git a/Source/Engine/Gramambular/NodeAnchor.h b/Source/Modules/LanguageParsers/Gramambular/NodeAnchor.h similarity index 100% rename from Source/Engine/Gramambular/NodeAnchor.h rename to Source/Modules/LanguageParsers/Gramambular/NodeAnchor.h diff --git a/Source/Engine/Gramambular/Span.h b/Source/Modules/LanguageParsers/Gramambular/Span.h similarity index 100% rename from Source/Engine/Gramambular/Span.h rename to Source/Modules/LanguageParsers/Gramambular/Span.h diff --git a/Source/Engine/Gramambular/Unigram.h b/Source/Modules/LanguageParsers/Gramambular/Unigram.h similarity index 100% rename from Source/Engine/Gramambular/Unigram.h rename to Source/Modules/LanguageParsers/Gramambular/Unigram.h diff --git a/Source/Engine/Gramambular/Walker.h b/Source/Modules/LanguageParsers/Gramambular/Walker.h similarity index 100% rename from Source/Engine/Gramambular/Walker.h rename to Source/Modules/LanguageParsers/Gramambular/Walker.h diff --git a/Source/Engine/SFX/clsSFX.swift b/Source/Modules/SFX/clsSFX.swift similarity index 100% rename from Source/Engine/SFX/clsSFX.swift rename to Source/Modules/SFX/clsSFX.swift diff --git a/Source/main.swift b/Source/Modules/main.swift similarity index 100% rename from Source/main.swift rename to Source/Modules/main.swift diff --git a/Source/Resources/Beep.m4a b/Source/Resources/Beep.m4a new file mode 100644 index 0000000000000000000000000000000000000000..6e4e31508a274bb6de069f7aee7ce673153f9d8a GIT binary patch literal 14940 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 literal 0 HcmV?d00001 diff --git a/Source/Resources/Fart.m4a b/Source/Resources/Fart.m4a new file mode 100644 index 0000000000000000000000000000000000000000..82a7711ad7990045445aaad0ff43f4a58a379a9e GIT binary patch literal 8804 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 literal 0 HcmV?d00001 diff --git a/Source/Images/Images.xcassets/AboutBanner.imageset/AboutBanner.png b/Source/Resources/Images/Images.xcassets/AboutBanner.imageset/AboutBanner.png similarity index 100% rename from Source/Images/Images.xcassets/AboutBanner.imageset/AboutBanner.png rename to Source/Resources/Images/Images.xcassets/AboutBanner.imageset/AboutBanner.png diff --git a/Source/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@2x.png b/Source/Resources/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@2x.png similarity index 100% rename from Source/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@2x.png rename to Source/Resources/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@2x.png diff --git a/Source/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@3x.png b/Source/Resources/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@3x.png similarity index 100% rename from Source/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@3x.png rename to Source/Resources/Images/Images.xcassets/AboutBanner.imageset/AboutBanner@3x.png diff --git a/Source/Images/Images.xcassets/AboutBanner.imageset/Contents.json b/Source/Resources/Images/Images.xcassets/AboutBanner.imageset/Contents.json similarity index 100% rename from Source/Images/Images.xcassets/AboutBanner.imageset/Contents.json rename to Source/Resources/Images/Images.xcassets/AboutBanner.imageset/Contents.json diff --git a/Source/Images/Images.xcassets/AlertIcon.imageset/128X128.png b/Source/Resources/Images/Images.xcassets/AlertIcon.imageset/128X128.png similarity index 100% rename from Source/Images/Images.xcassets/AlertIcon.imageset/128X128.png rename to Source/Resources/Images/Images.xcassets/AlertIcon.imageset/128X128.png diff --git a/Source/Images/Images.xcassets/AlertIcon.imageset/192x192.png b/Source/Resources/Images/Images.xcassets/AlertIcon.imageset/192x192.png similarity index 100% rename from Source/Images/Images.xcassets/AlertIcon.imageset/192x192.png rename to Source/Resources/Images/Images.xcassets/AlertIcon.imageset/192x192.png diff --git a/Source/Images/Images.xcassets/AlertIcon.imageset/64X64.png b/Source/Resources/Images/Images.xcassets/AlertIcon.imageset/64X64.png similarity index 100% rename from Source/Images/Images.xcassets/AlertIcon.imageset/64X64.png rename to Source/Resources/Images/Images.xcassets/AlertIcon.imageset/64X64.png diff --git a/Source/Images/Images.xcassets/AlertIcon.imageset/Contents.json b/Source/Resources/Images/Images.xcassets/AlertIcon.imageset/Contents.json similarity index 100% rename from Source/Images/Images.xcassets/AlertIcon.imageset/Contents.json rename to Source/Resources/Images/Images.xcassets/AlertIcon.imageset/Contents.json diff --git a/Source/Images/Images.xcassets/AppIcon.appiconset/1024X1024.png b/Source/Resources/Images/Images.xcassets/AppIcon.appiconset/1024X1024.png similarity index 100% rename from Source/Images/Images.xcassets/AppIcon.appiconset/1024X1024.png rename to Source/Resources/Images/Images.xcassets/AppIcon.appiconset/1024X1024.png diff --git a/Source/Images/Images.xcassets/AppIcon.appiconset/128X128.png b/Source/Resources/Images/Images.xcassets/AppIcon.appiconset/128X128.png similarity index 100% rename from Source/Images/Images.xcassets/AppIcon.appiconset/128X128.png rename to Source/Resources/Images/Images.xcassets/AppIcon.appiconset/128X128.png diff --git a/Source/Images/Images.xcassets/AppIcon.appiconset/16X16.png b/Source/Resources/Images/Images.xcassets/AppIcon.appiconset/16X16.png similarity index 100% rename from Source/Images/Images.xcassets/AppIcon.appiconset/16X16.png rename to Source/Resources/Images/Images.xcassets/AppIcon.appiconset/16X16.png diff --git a/Source/Images/Images.xcassets/AppIcon.appiconset/256X256.png b/Source/Resources/Images/Images.xcassets/AppIcon.appiconset/256X256.png similarity index 100% rename from Source/Images/Images.xcassets/AppIcon.appiconset/256X256.png rename to Source/Resources/Images/Images.xcassets/AppIcon.appiconset/256X256.png diff --git a/Source/Images/Images.xcassets/AppIcon.appiconset/32X32.png b/Source/Resources/Images/Images.xcassets/AppIcon.appiconset/32X32.png similarity index 100% rename from Source/Images/Images.xcassets/AppIcon.appiconset/32X32.png rename to Source/Resources/Images/Images.xcassets/AppIcon.appiconset/32X32.png diff --git a/Source/Images/Images.xcassets/AppIcon.appiconset/512X512.png b/Source/Resources/Images/Images.xcassets/AppIcon.appiconset/512X512.png similarity index 100% rename from Source/Images/Images.xcassets/AppIcon.appiconset/512X512.png rename to Source/Resources/Images/Images.xcassets/AppIcon.appiconset/512X512.png diff --git a/Source/Images/Images.xcassets/AppIcon.appiconset/64X64.png b/Source/Resources/Images/Images.xcassets/AppIcon.appiconset/64X64.png similarity index 100% rename from Source/Images/Images.xcassets/AppIcon.appiconset/64X64.png rename to Source/Resources/Images/Images.xcassets/AppIcon.appiconset/64X64.png diff --git a/Source/Images/Images.xcassets/AppIcon.appiconset/Contents.json b/Source/Resources/Images/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Source/Images/Images.xcassets/AppIcon.appiconset/Contents.json rename to Source/Resources/Images/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/Source/Images/Images.xcassets/Contents.json b/Source/Resources/Images/Images.xcassets/Contents.json similarity index 100% rename from Source/Images/Images.xcassets/Contents.json rename to Source/Resources/Images/Images.xcassets/Contents.json diff --git a/Source/Images/RAW/March.jpg b/Source/Resources/Images/RAW/March.jpg similarity index 100% rename from Source/Images/RAW/March.jpg rename to Source/Resources/Images/RAW/March.jpg diff --git a/Source/Images/RAW/vChewing.svg b/Source/Resources/Images/RAW/vChewing.svg similarity index 100% rename from Source/Images/RAW/vChewing.svg rename to Source/Resources/Images/RAW/vChewing.svg diff --git a/Source/en.lproj/InfoPlist.strings b/Source/Resources/Localization/en.lproj/InfoPlist.strings similarity index 100% rename from Source/en.lproj/InfoPlist.strings rename to Source/Resources/Localization/en.lproj/InfoPlist.strings diff --git a/Source/en.lproj/Localizable.strings b/Source/Resources/Localization/en.lproj/Localizable.strings similarity index 100% rename from Source/en.lproj/Localizable.strings rename to Source/Resources/Localization/en.lproj/Localizable.strings diff --git a/Source/ja.lproj/InfoPlist.strings b/Source/Resources/Localization/ja.lproj/InfoPlist.strings similarity index 100% rename from Source/ja.lproj/InfoPlist.strings rename to Source/Resources/Localization/ja.lproj/InfoPlist.strings diff --git a/Source/ja.lproj/Localizable.strings b/Source/Resources/Localization/ja.lproj/Localizable.strings similarity index 100% rename from Source/ja.lproj/Localizable.strings rename to Source/Resources/Localization/ja.lproj/Localizable.strings diff --git a/Source/zh-Hans.lproj/InfoPlist.strings b/Source/Resources/Localization/zh-Hans.lproj/InfoPlist.strings similarity index 95% rename from Source/zh-Hans.lproj/InfoPlist.strings rename to Source/Resources/Localization/zh-Hans.lproj/InfoPlist.strings index 7691e23b..093d7507 100644 --- a/Source/zh-Hans.lproj/InfoPlist.strings +++ b/Source/Resources/Localization/zh-Hans.lproj/InfoPlist.strings @@ -1,6 +1,6 @@ CFBundleName = "威注音"; CFBundleDisplayName = "威注音"; NSHumanReadableCopyright = "© 2011-2022 OpenVanilla Project & © 2021-2022 vChewing Project."; -"org.atelierInmu.inputmethod.vChewing.TradBopomofo" = "威註音"; -"org.atelierInmu.inputmethod.vChewing.SimpBopomofo" = "威注音"; +"org.atelierInmu.inputmethod.vChewing.TradBopomofo" = "威注音-繁"; +"org.atelierInmu.inputmethod.vChewing.SimpBopomofo" = "威注音-简"; CFEULAContent = "该授权条款,在使用者符合以下诸条件之情形下,授予使用者使用及再散播本软件套件装原始码及二进位可执行形式之权利,无论此包装是否经改作皆然:\n\n1)对于本软件原始码之再散播,必须保留上述之著作权宣告、此诸条件表列,以及下述之免责声明。\n2)对于本套件二进位可执行形式之再散播,必须连带以档案以及/或者其他附于散播包装中之媒介方式,重制上述之著作权宣告、此诸条件表列,以及下述之免责声明。\n3)未获事前取得书面授权,不得使用威注音或本软件贡献者之名称,来为本软件之衍生物做任何表示支援、认可或推广、促销之行为。\n\n免责声明:本软件由威注音及本软件之贡献者以现状(「as is」)提供,本软件套件装不负任何明示或默示之担保责任,包括但不限于就适售性以及特定目之之适用性为默示性担保。威注音及本软件之贡献者,无论任何条件、无论成因或任何责任主义、无论此责任为因合约关系、无过失责任主义或因非违约之侵权(包括过失或其他原因等)而起,对于任何因使用本软件套件装所产生之任何直接性、间接性、偶发性、特殊性、惩罚性或任何结果之损害(包括但不限于替代商品或劳务之购用、使用损失、资料损失、利益损失、业务中断等等),不负任何责任,即在该种使用已获事前告知可能会造成此类损害之情形下亦然。\n"; diff --git a/Source/zh-Hans.lproj/Localizable.strings b/Source/Resources/Localization/zh-Hans.lproj/Localizable.strings similarity index 100% rename from Source/zh-Hans.lproj/Localizable.strings rename to Source/Resources/Localization/zh-Hans.lproj/Localizable.strings diff --git a/Source/zh-Hant.lproj/InfoPlist.strings b/Source/Resources/Localization/zh-Hant.lproj/InfoPlist.strings similarity index 95% rename from Source/zh-Hant.lproj/InfoPlist.strings rename to Source/Resources/Localization/zh-Hant.lproj/InfoPlist.strings index 8be0ef40..6ddf208a 100644 --- a/Source/zh-Hant.lproj/InfoPlist.strings +++ b/Source/Resources/Localization/zh-Hant.lproj/InfoPlist.strings @@ -1,6 +1,6 @@ CFBundleName = "威注音"; CFBundleDisplayName = "威注音"; NSHumanReadableCopyright = "© 2011-2022 OpenVanilla Project & © 2021-2022 vChewing Project."; -"org.atelierInmu.inputmethod.vChewing.TradBopomofo" = "威註音"; -"org.atelierInmu.inputmethod.vChewing.SimpBopomofo" = "威注音"; +"org.atelierInmu.inputmethod.vChewing.TradBopomofo" = "威注音-繁"; +"org.atelierInmu.inputmethod.vChewing.SimpBopomofo" = "威注音-簡"; CFEULAContent = "該授權條款,在使用者符合以下諸條件之情形下,授予使用者使用及再散播本軟體套件裝原始碼及二進位可執行形式之權利,無論此包裝是否經改作皆然:\n\n1)對於本軟體原始碼之再散播,必須保留上述之著作權宣告、此諸條件表列,以及下述之免責聲明。\n2)對於本套件二進位可執行形式之再散播,必須連帶以檔案以及/或者其他附於散播包裝中之媒介方式,重製上述之著作權宣告、此諸條件表列,以及下述之免責聲明。\n3)未獲事前取得書面授權,不得使用威注音或本軟體貢獻者之名稱,來為本軟體之衍生物做任何表示支援、認可或推廣、促銷之行為。\n\n免責聲明:本軟體由威注音及本軟體之貢獻者以現狀(「as is」)提供,本軟體套件裝不負任何明示或默示之擔保責任,包括但不限於就適售性以及特定目之之適用性為默示性擔保。威注音及本軟體之貢獻者,無論任何條件、無論成因或任何責任主義、無論此責任為因合約關係、無過失責任主義或因非違約之侵權(包括過失或其他原因等)而起,對於任何因使用本軟體套件裝所產生之任何直接性、間接性、偶發性、特殊性、懲罰性或任何結果之損害(包括但不限於替代商品或勞務之購用、使用損失、資料損失、利益損失、業務中斷等等),不負任何責任,即在該種使用已獲事前告知可能會造成此類損害之情形下亦然。\n"; diff --git a/Source/zh-Hant.lproj/Localizable.strings b/Source/Resources/Localization/zh-Hant.lproj/Localizable.strings similarity index 100% rename from Source/zh-Hant.lproj/Localizable.strings rename to Source/Resources/Localization/zh-Hant.lproj/Localizable.strings diff --git a/Source/Resources/MenuIcons/MenuIcon-SCVIM.png b/Source/Resources/MenuIcons/MenuIcon-SCVIM.png new file mode 100644 index 0000000000000000000000000000000000000000..86c8e604a4d9910c12a6296e2e50daed36cd9b9f GIT binary patch literal 3871 zcmc&%eN+=y79T!>fRJIm zz>gK}3Kl`odQ@B$t1Z&1r&tj1h}~A*R+eJ1$D`HVF0yP}ty=a?5<-aKobDgHJ7+## z?z_MH?z{JQ-+L*~NKXq4m>vK@P@qCCQ-N;~{fzem?-_$b7zBA8B&5;|g;WY>m`Och zz#%AVpH{8DrHF~@#CU3T=gsK30p>zgS=nxt`tA0Xww6!fPWWp5frG17^|6BbS|ML# z`foN}YHt~Tl>4`mu9cT|7b;I=KIoaFY-|$#qZ!`P5Y8~2I5u^T071-9cfoZ=>a3)u zaTRA)y`_RQkDzXLYEqh4cOYDVZWS}y(o4=Q-}0BOzKK5F8@Cv?J=onA0>7A8aps+x zH~)B}rNx)OW|qG~i3ZP4I1xAPNqEIlt74Nx@XJsAb#l=6|8yc$1n#Q^dX8*GG>CjOBwxOY+)xLL_%=dhX zDv*-uYv-P!K2rHSpVB|C@Z0|G1s3bh7X4rc$XFNouj8d14?wDp;n@nkQVIPQw8ul^ zy!;>^(DH)3!7JF&_5$tc5W^;iAdOe3v%S_U%0-_~qo5G*n0FA6uS0)3_|lggJiwCu z%SZTp6ajY}%u7J|Jd`hlAn$r_Cn~7kXQWNTPv!PBgO9&SzQO`Q6Qj*Ef8t%5FWFCN9Y_S(QhIf^@ z>n}AEfH(HhKzeQNy2{-3vqz>VNf@4=tI!>=!V|z%=mOAbQHr1pxC;jX6K(5KvVj^c z9qup?^m>IFFk_CGZH?98dMw{Su_ftvp+cFugv=pDTzUaA5To&S>1eYet_Kf9fICVh zDkm%yX)bazLR(&juOBUSagFXbVP*?X*Q%IJ$AT_a=UQnmH2d2zkcHG!g_s#n&H;&$ zBN9;qqRq3=``%HifL_xGMPzTz82RF!yV$WafP`! zpy6;~@iTd#p5jqN=u%j~3!9d^5zle|uLQ?dAOHWz@WAfQ|DQ+3wpF+h!AYCZk@2MJ zo;Er`cD>g)GfF%*ZZv0JUySW${sYd~nKZi2h8g^NU5ZS@8y*Ud>7CVo6BhzxRW7`A4PJ>GXuCNiY17&yAZN{PE+$Kk zPvS%dF=k#paekZvyA_~R`fPlvh-CQt?^wwUI1+W_4t6&0X7Beu)?T<-wdthKCog&j zYx{qi|4m)Ql1Go$Rf)r24lbI#{>r5n-8~s6_XuZ}@2i{0Op-?<(c>FxvqIKi*A##F z{^Z$J6V{2vC&NRf@~p*kyV@D7rIDZZCP7brk;G+fE1+NCQwb2+U2TaBo$F72Rd=&wB!_Pu;D zV4aP9*9_r(>x|oXslsZiQ>OH48c)m8)5bOIlIKo8oH2DlWu^Mm$t}{xuULCy4|^@2 zxv%Qgt5v*&=n44(!QH_P1GyUSd%df}H(^wWdG3L4?tS)ChqvluVpZAYZ=?znaw&wj#2<`tBn9gL!dD$2NZ#!q^b}(Yv*K zxJ5;*(`Up9^XK=-??+try%d>zWaWkHPb}uAXBsE%@BKr6Yb&xm>wYFSGx#ceyW`3> z#+{FPW4hO-Eb7zzUL1KS5dBzrEH3rus?)zKW9kLFaon1fxpnQ&dyR&^WigfTKYdb8 zl`m2%cgEZZlFN>Vc5j6Cq}LtV_3X2WZ+#v*aQ5uCl|6gT9e-XPDx6wDe2JD8OX11o zYXch_TOUy8Szn*n-n5@2H-+umvExWKd*I-V&(ky)S&J9(UuZ*XYT7cEO{w!f)G}{F zZjqlf^5iK?NL;Od$f=NPRhxUJ&A2$Bw)Wwg=;)js-d1ee=-E$?}`X z&5X{&694MsKcqD^6*OkY^gn(%?`rb1{%a4vpH-7s{(Rig*!#I(ye$F$NFYd&nl3w= HqAvM2T;=18 literal 0 HcmV?d00001 diff --git a/Source/Resources/MenuIcons/MenuIcon-SCVIM@2x.png b/Source/Resources/MenuIcons/MenuIcon-SCVIM@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2511631aa817242a1d02f75520304bc404245a05 GIT binary patch literal 4945 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 RN68-)GzS;TSv&vOe*uh{0D}Mk literal 0 HcmV?d00001 diff --git a/Source/Resources/MenuIcons/MenuIcon-TCVIM.png b/Source/Resources/MenuIcons/MenuIcon-TCVIM.png new file mode 100644 index 0000000000000000000000000000000000000000..e88ae4d5d47809e390e9f073f964cb9b7c50fd02 GIT binary patch literal 3603 zcmbVO2~<;88h&Au2A8l1g4V`p6;a4Sh42WmKv1Ft89)sv){wlwt06DG_rlVS6etKH z3NCcq1{g<0J;;H&R1~yAD_TX0;0AS}J<3c)p|x5WQ0BfQgph`FI+OF3oB#gbfB*aa z%ez~mB9~60d(a^Wnj{VvMT0kky6x@2^Su|tG6b-P+LAC!T=3NKl;ch&moeuXo1%3m@73oDzGx{d+?K~orP;P! zUj2`}L-iY~8P(1SUXu;mr9!6L3i&uRMW=_2*x>fbCZ-vL!Etf&+1vq`FBVmY2L zcc8oDIsbUT{nO7o{ijQoE-!RiTL`57>SCY002XYgtp_^~u%GtehufX!}e?JBZUEL@HKFB#;*v z+d~s*c91m~(I6}Ea59W(VC(_e>f{iVNSkgPe@yc<(dSVp$OYVZJ_^|w^f!Yy^$Q0# zu%v(UI6NNAp)Mwu4|BON&mV%UDy)nsMuqk0n1av0`7b_ry`u?_BOu7ZnYwAvz5~;M z-_>ZWl$1&$U^$lJBU50Bh);TohC)GtbQla%5K_iWPf@7}I6a7^(}2O460=!MoeH@j zh$WRoF+(vNVfy)Sd^jv2oylYhaD@_%7A-Nr!M`9@GD&J+HajgX%_q&*2g8%t+<<@p zHiyUN@w|bCH<6(xW$E5(Vz%DMh#e6^$Z=FdqL`XV*_9|U|L*`grx#cW?LdklZ=rVk&KN) zmvLIZdtEB%BP5{sheI(HhR0}Razw}#=t5#D8jYu3I|@xlR8kQNcp*USgWUpHwFMkL%;5;wW}4wG1WD( zL*)-l1w*B!l76KcC51cz+mhHE6-5OIR49(h#cC44H8@yT~nF4zI1epLjRHdnF`GTah3q4LKA>O4wERULQHZHWTLJw z1*^!h(vb-jO7$yPB~vE_vC_R2h*G9ikt|^(k|vgfMPNyofK4?Z6*?BLmyR_nU|aA& z0CGnnfx}UP#PAF=Bb4PBWaC(=iEGrnMurmzRjWZPiVLb(jlEJ|X!@sNAp%p9X)+uM zP6B}u1}l{)NTm!WXsBqC8o`;M*KmA3(4{nRYpnJtmqx<|t1`JRp)@$A(8>|T2;3kZ zAD5PlfHWLaSR6l?!#61`;Dt`h+=yk~|6g)+4bg17MsjrZVPwXVs=0HN8+yGzFf&Fx zKF$I&y07~PGkP=s12cNQ#%9w(XB@1?LAL9e6!*77^0Fz{|_PiRYYH6dcQU zER9YGkC9Ewym9Y#=HK^65>E~sJ9={Aq4=W-BL6M-MQ>wc>aXNXyPYR;qg#KT=@{zb zymgKTt8_tB@UN?Eoi`@KhjZM$Iu73KZWR!fzxS$;j8yl6eKtLe=VRQf6oQj2 zi7J;{f9w3q6MpgYEpuZZRAtxk-BwPjD`~cIJV;ErpuXg+L7`1^&CxX}tPoy^PgSSDH6(aB%CVO?;}jUXQrkyov-Y3qu|N2Acf^Nc z2ior9IgR}`nqJ1HlE+Db>rcBj`UYmDy*T-n>6Yv~I|pjH>yhxR-@4j%cNreyRoY$< zP_*q{MX_%cR(0aSoX!`XrEN!MWO&qdwKddy*72a~--Nh5p*mBku6|z{tB8+_kDpQb z$i4A$BtFqQdf2Y4XL`fB^47%K>rwUPB_F=VoS)neWBg|z{|$sb?kq}RKs%{Zwm2+O JR2{ND=fAS!zG(me literal 0 HcmV?d00001 diff --git a/Source/Resources/MenuIcons/MenuIcon-TCVIM@2x.png b/Source/Resources/MenuIcons/MenuIcon-TCVIM@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ca92d0eca45b953486389cc5c01ba284fba40b12 GIT binary patch literal 5105 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 literal 0 HcmV?d00001 diff --git a/Source/Tools/genRTF.py b/Source/Tools/genRTF.py deleted file mode 100755 index 28e36840..00000000 --- a/Source/Tools/genRTF.py +++ /dev/null @@ -1,66 +0,0 @@ -""" - genRTF.py - - Copyright 2021-2022 vChewing Project (3-Clause BSD License). - Derived from 2011-2022 OpenVanilla Project (MIT License). - Some rights reserved. See "LICENSE.TXT" for details. -""" - -#!/usr/bin/env python -import sys, os -import platform -myversion, _, _ = platform.mac_ver() -myversion = float('.'.join(myversion.split('.')[:2])) - -if myversion == 10.8: - os.environ["MACOSX_DEPLOYMENT_TARGET"] = "10.8" - print myversion -else: - os.environ["MACOSX_DEPLOYMENT_TARGET"] = "10.7" - -os.environ["PYTHONPATH"] = "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/" - -import subprocess, getopt -from Foundation import * -from AppKit import * - -def generateRTF(inString="", inFile=""): - if len(inString) == 0: return - if len(inFile) == 0: return - paragraphStyle = NSMutableParagraphStyle.alloc().init() - paragraphStyle.setAlignment_(NSCenterTextAlignment) - attributedString = NSAttributedString.alloc().initWithString_attributes_(inString, { - NSParagraphStyleAttributeName: paragraphStyle, - NSFontAttributeName: NSFont.systemFontOfSize_(11) - }) - data = attributedString.RTFFromRange_documentAttributes_(NSMakeRange(0, len(inString)), None) - try: os.remove(inFile) - except: pass - data.writeToFile_atomically_(inFile, True) - os.utime(inFile, None) # Touch the file - -def main(argv=None): - if argv is None: - argv = sys.argv - try: - path = argv[1] - except: - return - - path = os.path.abspath(path) - cmd = "/usr/bin/git log --format='%h' -1" - try: - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - lines = "" - while True: - line = p.stdout.readline() - if not line: break - line = line.strip() - if len(line): lines += line + "\n" - lines = lines.strip() - generateRTF("Build: " + lines, os.path.join(path, "Credits.rtf")) - except Exception, e: - pass - -if __name__ == "__main__": - sys.exit(main()) diff --git a/Source/Tools/tistool.m b/Source/Tools/tistool.m deleted file mode 100644 index 2800c23b..00000000 --- a/Source/Tools/tistool.m +++ /dev/null @@ -1,115 +0,0 @@ -/* - * tistool.m - * - * Copyright 2021-2022 vChewing Project (3-Clause BSD License). - * Derived from 2011-2022 OpenVanilla Project (MIT License). - * Some rights reserved. See "LICENSE.TXT" for details. - */ - -#import "OVInputSourceHelper.h" - -static void PrintUsage(); - -int main(int argc, char **argv) -{ - // we'll let the OS clean up this pool for us - [NSAutoreleasePool new]; - - if (argc < 2) { - PrintUsage(); - return 1; - } - - int opt; - while ((opt = getopt(argc, argv, "lr:e:d:s:")) != -1) { - switch (opt) { - case 'l': - { - for (id source in [OVInputSourceHelper allInstalledInputSources]) { - if (TISGetInputSourceProperty((TISInputSourceRef)source, kTISPropertyInputSourceType) != kTISTypeKeyboardInputMode) { - printf("%s\n", [(id)TISGetInputSourceProperty((TISInputSourceRef)source, kTISPropertyInputSourceID) UTF8String]); - } - } - break; - } - - case 'r': - { - NSURL *bundle = [NSURL fileURLWithPath:[NSString stringWithUTF8String:optarg]]; - if (bundle) { - BOOL status = [OVInputSourceHelper registerInputSource:bundle]; - NSLog(@"register input source at: %@, result: %d", [bundle absoluteString], status); - } - break; - } - - - case 'e': - { - TISInputSourceRef inputSource = [OVInputSourceHelper inputSourceForInputSourceID:[NSString stringWithUTF8String:optarg]]; - if (!inputSource) { - NSLog(@"Cannot find input source: %s", optarg); - return 1; - } - - BOOL status = [OVInputSourceHelper enableInputSource:inputSource]; - NSLog(@"Enable input source: %s, result: %d", optarg, status); - return status; - } - - case 'd': - { - TISInputSourceRef inputSource = [OVInputSourceHelper inputSourceForInputSourceID:[NSString stringWithUTF8String:optarg]]; - if (!inputSource) { - NSLog(@"Cannot find input source: %s", optarg); - return 1; - } - - BOOL status = [OVInputSourceHelper disableInputSource:inputSource]; - NSLog(@"Disable input source: %s, result: %d", optarg, status); - return status; - } - - case 's': - { - TISInputSourceRef inputSource = [OVInputSourceHelper inputSourceForInputSourceID:[NSString stringWithUTF8String:optarg]]; - if (!inputSource) { - NSLog(@"Cannot find input source: %s", optarg); - return 1; - } - - BOOL status = [OVInputSourceHelper inputSourceEnabled:inputSource]; - NSLog(@"Input source: %s, enabled: %@", optarg, (status ? @"yes" : @"no")); - return 0; - } - default: - PrintUsage(); - return 1; - } - } - - return 0; -} - -static void PrintUsage() -{ - fprintf(stderr, "usage: tistool [options]\n" - "options:\n" - " -l list all input sources\n" - " -r register an input source\n" - " -e enable an input source\n" - " -d disable an input source\n" - " -s check if an input source is enabled\n\n" - " is an input source id, a few examples:\n" - " com.apple.inputmethod.Kotoeri (Apple's Japanese input method)\n" - " com.apple.CharacterPaletteIM (Keyboard/Character Viewer palettes)\n" - " com.apple.keylayout.German (German keyboard layout)\n" - "\n" - " must be a bundle in one of the directories:\n" - " ~/Library/Input Methods/\n" - " /Library/Input Methods/\n" - " ~/Library/Keyboard Layouts/\n" - " /Library/Keyboard Layouts/\n" - "\n" - ); -} diff --git a/Source/frmAboutWindow.swift b/Source/WindowControllers/ctlAboutWindow.swift similarity index 93% rename from Source/frmAboutWindow.swift rename to Source/WindowControllers/ctlAboutWindow.swift index 102c0178..267657a3 100644 --- a/Source/frmAboutWindow.swift +++ b/Source/WindowControllers/ctlAboutWindow.swift @@ -1,5 +1,5 @@ /* - * frmAboutWindow.swift + * AboutWindow.swift * * Copyright 2021-2022 vChewing Project (3-Clause BSD License). * Derived from 2011-2022 OpenVanilla Project (MIT License). @@ -8,7 +8,7 @@ import Cocoa -@objc(frmAboutWindow) class frmAboutWindow: NSWindowController { +@objc(AboutWindow) class ctlAboutWindow: NSWindowController { @IBOutlet weak var appVersionLabel: NSTextField! @IBOutlet weak var appCopyrightLabel: NSTextField! @IBOutlet var appEULAContent: NSTextView! diff --git a/Source/NonModalAlertWindowController.swift b/Source/WindowControllers/ctlNonModalAlertWindow.swift similarity index 82% rename from Source/NonModalAlertWindowController.swift rename to Source/WindowControllers/ctlNonModalAlertWindow.swift index 1b79ec8c..0bc349a4 100644 --- a/Source/NonModalAlertWindowController.swift +++ b/Source/WindowControllers/ctlNonModalAlertWindow.swift @@ -1,5 +1,5 @@ /* - * NonModalAlertWindowController.swift + * ctlNonModalAlertWindow.swift * * Copyright 2021-2022 vChewing Project (3-Clause BSD License). * Derived from 2011-2022 OpenVanilla Project (MIT License). @@ -8,25 +8,25 @@ import Cocoa -@objc protocol NonModalAlertWindowControllerDelegate: AnyObject { - func nonModalAlertWindowControllerDidConfirm(_ controller: NonModalAlertWindowController) - func nonModalAlertWindowControllerDidCancel(_ controller: NonModalAlertWindowController) +@objc protocol ctlNonModalAlertWindowDelegate: AnyObject { + func ctlNonModalAlertWindowDidConfirm(_ controller: ctlNonModalAlertWindow) + func ctlNonModalAlertWindowDidCancel(_ controller: ctlNonModalAlertWindow) } -class NonModalAlertWindowController: NSWindowController { +class ctlNonModalAlertWindow: NSWindowController { @objc(sharedInstance) - static let shared = NonModalAlertWindowController(windowNibName: "NonModalAlertWindowController") + static let shared = ctlNonModalAlertWindow(windowNibName: "ctlNonModalAlertWindow") @IBOutlet weak var titleTextField: NSTextField! @IBOutlet weak var contentTextField: NSTextField! @IBOutlet weak var confirmButton: NSButton! @IBOutlet weak var cancelButton: NSButton! - weak var delegate: NonModalAlertWindowControllerDelegate? + weak var delegate: ctlNonModalAlertWindowDelegate? - @objc func show(title: String, content: String, confirmButtonTitle: String, cancelButtonTitle: String?, cancelAsDefault: Bool, delegate: NonModalAlertWindowControllerDelegate?) { + @objc func show(title: String, content: String, confirmButtonTitle: String, cancelButtonTitle: String?, cancelAsDefault: Bool, delegate: ctlNonModalAlertWindowDelegate?) { if window?.isVisible == true { - self.delegate?.nonModalAlertWindowControllerDidCancel(self) + self.delegate?.ctlNonModalAlertWindowDidCancel(self) } self.delegate = delegate @@ -91,7 +91,7 @@ class NonModalAlertWindowController: NSWindowController { } @IBAction func confirmButtonAction(_ sender: Any) { - delegate?.nonModalAlertWindowControllerDidConfirm(self) + delegate?.ctlNonModalAlertWindowDidConfirm(self) window?.orderOut(self) } @@ -100,7 +100,7 @@ class NonModalAlertWindowController: NSWindowController { } func cancel(_ sender: Any) { - delegate?.nonModalAlertWindowControllerDidCancel(self) + delegate?.ctlNonModalAlertWindowDidCancel(self) delegate = nil window?.orderOut(self) } diff --git a/Source/PreferencesWindowController.swift b/Source/WindowControllers/ctlPrefWindow.swift similarity index 96% rename from Source/PreferencesWindowController.swift rename to Source/WindowControllers/ctlPrefWindow.swift index 4729477a..7ac2ecca 100644 --- a/Source/PreferencesWindowController.swift +++ b/Source/WindowControllers/ctlPrefWindow.swift @@ -1,5 +1,5 @@ /* - * PreferencesWindowController.swift + * ctlPrefWindow.swift * * Copyright 2021-2022 vChewing Project (3-Clause BSD License). * Derived from 2011-2022 OpenVanilla Project (MIT License). @@ -17,10 +17,10 @@ extension RangeReplaceableCollection where Element: Hashable { } } -// Please note that the class should be exposed as "PreferencesWindowController" +// Please note that the class should be exposed as "ctlPrefWindow" // in Objective-C in order to let IMK to see the same class name as -// the "InputMethodServerPreferencesWindowControllerClass" in Info.plist. -@objc(PreferencesWindowController) class PreferencesWindowController: NSWindowController { +// the "InputMethodServerctlPrefWindowClass" in Info.plist. +@objc(ctlPrefWindow) class ctlPrefWindow: NSWindowController { @IBOutlet weak var fontSizePopUpButton: NSPopUpButton! @IBOutlet weak var uiLanguageButton: NSPopUpButton! @IBOutlet weak var basisKeyboardLayoutButton: NSPopUpButton! diff --git a/Source/Base.lproj/MainMenu.xib b/Source/WindowNIBs/Base.lproj/MainMenu.xib similarity index 100% rename from Source/Base.lproj/MainMenu.xib rename to Source/WindowNIBs/Base.lproj/MainMenu.xib diff --git a/Source/Base.lproj/frmAboutWindow.xib b/Source/WindowNIBs/Base.lproj/frmAboutWindow.xib similarity index 99% rename from Source/Base.lproj/frmAboutWindow.xib rename to Source/WindowNIBs/Base.lproj/frmAboutWindow.xib index ab42cf91..c6030e04 100644 --- a/Source/Base.lproj/frmAboutWindow.xib +++ b/Source/WindowNIBs/Base.lproj/frmAboutWindow.xib @@ -6,7 +6,7 @@ - + diff --git a/Source/NonModalAlertWindowController.xib b/Source/WindowNIBs/Base.lproj/frmNonModalAlertWindow.xib similarity index 90% rename from Source/NonModalAlertWindowController.xib rename to Source/WindowNIBs/Base.lproj/frmNonModalAlertWindow.xib index 8dc2d753..9a161183 100644 --- a/Source/NonModalAlertWindowController.xib +++ b/Source/WindowNIBs/Base.lproj/frmNonModalAlertWindow.xib @@ -6,7 +6,7 @@ - + @@ -29,7 +29,7 @@