Commit Graph

481 Commits

Author SHA1 Message Date
zonble b5220cbfe3 Add tests. 2022-02-03 00:02:23 +08:00
Lukhnos Liu 68732e6b15 Merge pull request #271 from zonble/dev/tests
Adds unit test cases for the key handler
2022-02-02 07:52:10 -08:00
zonble f39b4fa0bc Moves the Swift StringUtils class to a Swift package. 2022-02-02 22:47:15 +08:00
zonble 56ced2dd0f Adds test cases. 2022-02-02 21:25:51 +08:00
zonble 44ecf223d7 Adds test cases. 2022-02-02 21:10:26 +08:00
zonble cac954a00b Updates test cases. 2022-02-02 20:29:23 +08:00
zonble 5849478fe5 Removes the dependency on OpenVanilla. 2022-02-02 18:07:41 +08:00
zonble 4743889e2f Removes the usage of OVUTF8Helper in the key handler. 2022-02-02 17:58:45 +08:00
Weizhong Yang a.k.a zonble 8e1e3d184b Merge pull request #269 from lukhnos/mandarin-refactoring
Refactor the Bopomofo syllable library for better thread safety
2022-02-02 17:57:14 +08:00
Lukhnos Liu 55971131f0 Expand tests 2022-02-01 18:41:24 -08:00
Lukhnos Liu f591a4668c Use thread-safe init for keyboard layouts 2022-02-01 18:41:20 -08:00
Lukhnos Liu 44f6167a38 Use C++ UTF-8 literals and remove MSVC escapes 2022-02-01 18:41:14 -08:00
Lukhnos Liu 385fd34476 Rename member variables 2022-02-01 18:41:09 -08:00
Lukhnos Liu 2f567cddc2 Use constexpr for Bopomofo Components 2022-02-01 18:41:02 -08:00
Lukhnos Liu f4a0f2fe93 Update copyright headers and include guard 2022-02-01 18:40:56 -08:00
Lukhnos Liu a455aef587 Fix most cpplint warnings 2022-02-01 18:40:50 -08:00
Lukhnos Liu f0222c023d Use default copy/move ctors and assignment ops 2022-02-01 18:40:43 -08:00
Lukhnos Liu aa27cbbb02 Remove the "using namespace std;" usage 2022-02-01 18:40:39 -08:00
Lukhnos Liu 71b69cae50 Reformat with clang-format 2022-02-01 18:40:33 -08:00
Lukhnos Liu 4ebe1a1a11 Remove OpenVanilla dependencies
This removes one overengineered method from BopomofoSyllable and
rewrites a helper using a simpler UTF-8 heuristics.

Also adds the CMake project file and a unit test suite.
2022-02-01 18:40:18 -08:00
zonble 49f998ad5d Adds tests. 2022-02-02 07:24:47 +08:00
zonble 9c8d740fc6 Adds tests. 2022-02-02 07:24:47 +08:00
zonble 118a1243de Removes unused lines. 2022-02-02 06:02:44 +08:00
zonble bd291be340 Removes a log. 2022-02-02 01:33:22 +08:00
zonble cbdbfa2518 Prevents the key handler to see reserved keys like page up/down as BPMF keys. 2022-02-02 01:31:53 +08:00
zonble 5afc5defdd Shows a tooltip when then cursor in a phrase whose length and count of readings do not match.
McBopomofo allows users to input pheases with a different length of the
characters and Bopomofo readings, for example, users can input ∴ with ㄙㄨㄛˇ-ㄧˇ.
When the cursor if between ㄙㄨㄛˇ and ㄧˇ, the users have no clue where
the cursor exactly is. The tooltip is to tell the users the cursor is
now betwen ㄙㄨㄛˇ and ㄧˇ.
2022-02-02 01:04:49 +08:00
zonble 82dbed7815 Fixes a crash on adding user phrases. 2022-02-01 08:41:36 +08:00
zonble 347560e36b Disables adding phrases with shift-arraw keys when the length of the composing buffer and readings do not match. 2022-02-01 08:11:09 +08:00
zonble 74509ce3cb Corrects the selection range while using Shift + Arrow keys to add new phrases. 2022-02-01 06:18:40 +08:00
zonble 536c9d1fc7 Adds some punctuations using control key.
It allows users ever use Microsoft Bopomofo to input punctuations using
keys like ctrl + comma.
2022-02-01 02:32:55 +08:00
zonble 8573332879 Removes unused localization. 2022-01-31 23:42:02 +08:00
zonble 169d03ab9b Minor changes on the associated phrases.
1. Removes the tooltip on the candidate window to make the exprience
   looks like OpenVanilla.
2. Adds a Shift key symbol on the key label.
2022-01-31 14:16:16 +08:00
zonble 2ebc789030 Implements the associated phrases function.
Since we use states manage the input flow in McBopomofo, implementing this function becomes easy. What I did is to create a new state, Associated Phrases state, and let the key handler to emit such a state just after emitting a Committing state.

When the input method controller is under Associated Phrase state, it shows the candidate window with a tooltip, and only accept candidate keys with the shift key. The key handler uses the characters without modifiers in an NSEvent object to find if there is any matching candidate label, so I added a new member "inputTextIgnoringModifiers" to KeyHandlerInput.

I use KeyValueBlobReader to read the associated phrases. I use the cin file from OpenVanilla project but removed the head and tail of the file to pass KeyValueBlobReader's validation.
2022-01-31 13:23:49 +08:00
Lukhnos Liu 2dd398f6ca Merge pull request #264 from zonble/dev/fseventstream
Loads the user phrases just after the files are changes.
2022-01-30 13:37:17 -08:00
zonble 3851f91d6c Fixes the bug that Shift+Space did not commit current composing buffer. 2022-01-31 04:47:45 +08:00
zonble 1c339c622e Loads the user phrases just after the files are changes.
The revision uses a FSEventStream to monitor the change of the folder
that stores user phrases.
2022-01-31 04:29:53 +08:00
zonble c59560dba2 Fixes the behavior to use ESC to clear the input buffer area. 2022-01-30 20:37:05 +08:00
zonble 8ba4b9dfdf Prevents loading data models repeatedly. 2022-01-30 20:27:33 +08:00
zonble fe67daceee Modifies the interface of LanguageModelManager to note that some methods are for testing only. 2022-01-30 20:18:43 +08:00
zonble ae9b524caa Updates the descriptions of the states. 2022-01-30 09:28:26 +08:00
zonble 4681465a68 Fixes a typo. 2022-01-30 08:53:59 +08:00
zonble 5ba7365cd3 Fixes typos. 2022-01-30 08:26:32 +08:00
zonble 8a05e4d6f7 Makes variables in LanguageModelManager static. 2022-01-30 08:18:45 +08:00
zonble 5e19e70c70 Fixes a typo. 2022-01-30 08:07:34 +08:00
zonble 2c0a12f43f Lazy loads language models. 2022-01-30 08:06:22 +08:00
zonble c3d953c618 Converts input mode into a typed enum. 2022-01-30 08:06:22 +08:00
zonble 0b1975bfeb Converts test cases to Swift. 2022-01-30 08:06:22 +08:00
zonble bce641608b Updates the copyright title and the README file. 2022-01-30 08:06:22 +08:00
zonble 4c358c1c1d Converts InputMethodController to Swift. 2022-01-30 08:06:22 +08:00
zonble 485925634a Adds unit tests for the key handler. 2022-01-28 20:43:43 +08:00
zonble bb4550b9da Notifies if half-size punctuation is on or off. 2022-01-28 19:37:38 +08:00
zonble 220696a70d Adds a hotkey to toggle half/full width punctuation. 2022-01-28 19:30:43 +08:00
zonble 464a54f98a Also uses the backspace key to cancel candidate in smart BPMF mode.
Going and Chewing also use backspace to do this.
2022-01-28 19:23:55 +08:00
zonble c3304bc5f7 Allows users to input letters when candidate window is open in plain BPMF mode. 2022-01-28 19:10:01 +08:00
zonble 43eef1fc1f Suppresses a log. 2022-01-28 18:56:51 +08:00
zonble 618065b881 Fixes the state from handling enter in plain BPMF mode. 2022-01-28 18:55:58 +08:00
zonble 439bb99ef5 Removes logs. 2022-01-28 17:53:32 +08:00
zonble 75dc93a2ce Fixes the position of the tooltip. 2022-01-28 17:04:07 +08:00
zonble ee521b6ee2 Fixes the behavior of the delete and backspace key. 2022-01-28 16:59:28 +08:00
zonble 9612aa6ba0 Code clean-up. 2022-01-28 16:51:25 +08:00
zonble b13da10ec0 Code clean-up. 2022-01-28 16:16:52 +08:00
zonble 0bc9468ba2 Splits Input Method controller into two classes. 2022-01-28 15:02:00 +08:00
zonble dd803b6c31 Removes logs and add copyright information. 2022-01-28 04:40:53 +08:00
zonble 056ffeabfd Tunes the interface. 2022-01-28 04:04:44 +08:00
zonble 7ee955a55c Cleans-up KeyHandlerInput. 2022-01-28 03:24:06 +08:00
zonble 87702f76c5 Cleans-up the interface. 2022-01-28 03:18:10 +08:00
zonble e17d06fd2a Fixes the cursor index when choosing candidates. 2022-01-28 01:58:25 +08:00
zonble 9351d877ba Fixes the issue on presenting the candidate window. 2022-01-28 01:44:50 +08:00
zonble fc0c077193 Fixes the bug on handling arrow keys. 2022-01-28 01:35:15 +08:00
zonble 2bbaa4a793 Fixes NSCoding exceptions. 2022-01-28 00:23:31 +08:00
zonble 56c393cefa Prevents using global state as possible. 2022-01-27 23:19:27 +08:00
zonble 1ad9e23918 Refactors the input controller. 2022-01-27 22:54:53 +08:00
zonble 6fe2fc59f3 Moves the way to render attributed string to the states. 2022-01-24 21:47:24 +08:00
zonble 82a916c433 Adds a new file KeyHandler.swift to start to break input controller to testable modules. 2022-01-24 17:46:34 +08:00
zonble 177cba5d56 [WIP] Starts to extract input states from the input controller. 2022-01-24 02:13:18 +08:00
zonble 6f254bf75d Updates copyright information. 2022-01-22 11:24:22 +08:00
zonble 3bba134e2f Adds Credits.rtf. 2022-01-22 00:34:48 +08:00
zonble 8717625d2e Adds a missing line back to the installer. 2022-01-22 00:07:07 +08:00
zonble bfb66cb080 Converts the installer to Swift. 2022-01-22 00:01:21 +08:00
zonble 5fe1c28ae7 Converts main to Swift. 2022-01-21 19:17:36 +08:00
Lukhnos Liu 957b66a96b Bump to version 2.0.1 2022-01-20 15:37:31 -08:00
Lukhnos Liu 6c76b2cae0 Delete a duplicate key in McBopomofo-Info.plist 2022-01-20 15:36:33 -08:00
zonble cb05937478 Fixes the order of the keyboard layouts.
Fixes #250.
2022-01-20 14:20:10 +08:00
Lukhnos Liu 25c50e67a4 Bump to version 2.0 2022-01-19 10:05:48 -08:00
Lukhnos Liu 42c4441d05 Introduce a Swift class to the Installer
This is so that the Installer will be built with the correct Swift
settings, especially those that instruct the Xcode to package the Swift
runtime libraries. This is needed because the Installer now depends on
InputSourceHelper, which is written in Swift. Without this, the app
would not be packaged with the Swift runtime libraries, which caused
the installer to be unusable on older but supported macOS versions.
2022-01-19 10:05:38 -08:00
Lukhnos Liu 29df72b79f Bump to version 2.0-alpha 2022-01-18 23:31:07 -08:00
Lukhnos Liu 8c692e6c3b Update copyright years 2022-01-18 23:28:08 -08:00
Lukhnos Liu 202b1fa058 Also make PhraseReplacementMap more tolerant
This also clarifies the test expectations and how parsing errors are
handled.
2022-01-18 22:46:26 -08:00
Weizhong Yang a.k.a zonble 9bc3536630 Merge branch 'master' into more-tolerant-userphraseslm 2022-01-19 14:01:23 +08:00
Weizhong Yang a.k.a zonble 04d2ff5a4d Merge pull request #244 from lukhnos/custom-data-templates
Writes templates the first time custom data is used
2022-01-19 13:31:15 +08:00
Weizhong Yang a.k.a zonble 777994edcc Merge pull request #245 from lukhnos/update-copyright-headers
Update copyright headers (fixes #213)
2022-01-19 13:29:23 +08:00
Lukhnos Liu c8f65580bb Make UserPhrasesLM more tolerant
This lets UserPhrasesLM consumes as much user data as possible before
bailing. This makes it more tolerant to data errors and will not fail
entirely just because the user has one faulty line in a data file.

Also removes FastFM from the benchmarking suite.

This also runs the CMake-based C++ tests as part of the GitHub CI.
2022-01-18 16:20:25 -08:00
Lukhnos Liu 75f321f088 Update copyright headers (fixes #213) 2022-01-18 14:21:55 -08:00
Lukhnos Liu 61f55670fb Write templates the first time custom data is used
Now that we allow comments in the custom data files, this change writes
localized templates as well as basic instructions. Links to McBopomofo
User's Manual are also provided.
2022-01-18 13:42:45 -08:00
zonble 7e2d3df5ba Prevents users from adding custom phrases with more than 6 characters.
Also fixes typos.
2022-01-19 00:49:50 +08:00
zonble d2c039c42d Notifies the users it is not suggested to add phrase when model is converted. 2022-01-18 22:19:25 +08:00
zonble aa9c31ffcf Fixes the location of the tooltip. 2022-01-18 22:04:09 +08:00
zonble 0d80d28e0e Formats Swift code. 2022-01-18 21:16:07 +08:00
zonble dd1310d40a Makes version update testable. 2022-01-18 18:39:21 +08:00
zonble 29813f93e5 Adds test cases. 2022-01-18 17:05:51 +08:00
zonble e9b1a8ad4a Removes unused comments. 2022-01-17 00:55:36 +08:00
zonble a75c7b7086 Allows users to type Latin letters while using shift + letter keys.
Fixes issue #162.
2022-01-17 00:48:29 +08:00
zonble 8249c612ff Adds a validator for candidate keys in the preference window. 2022-01-16 23:33:35 +08:00
zonble 4ec4eed562 Removes unused files. 2022-01-16 15:15:41 +08:00
zonble 5ff6f378e6 Fixes a bug on selecting the candidate keys in the preference UI. 2022-01-16 15:14:49 +08:00
zonble c4259c4c4e Updates comments and fixes a typo. 2022-01-16 15:04:20 +08:00
zonble 4e56f350e8 Fixes a wrong API call. 2022-01-16 15:04:20 +08:00
zonble 5c0a14deeb Refactors the function to filter and transform unigrams in McBopomofoLM. 2022-01-16 15:04:20 +08:00
zonble b627e8e3b6 Adds an option to let users to choose Chinse conversion style.
Option 0: converts the output.
Option 1: converts the models.
2022-01-16 15:04:20 +08:00
zonble b348a05735 Filters duplicated unigram values properly. 2022-01-16 15:04:18 +08:00
Lukhnos Liu d064f420e4 Use a parseless phrase db to speed up LM loading
We take advantage of the fact that no one is able to modify the phrase
databases shipped with the binary (guranteed by macOS's integrity check
for notarized apps), and we can simply pre-sort the phrases in the
database files.

With this change, we can speed up McBopomofo's language model loading
during the app initialization by about 500-800x on a 2018 Intel MacBook
Pro. The LM loading used to take 300-400 ms, but now it's done within a
sub-millisecond range (0.5-0.6 ms). Microbenchmarking shows that
ParselessLM is about 16000x faster than FastLM. We amortize the latency
during the query time, and even by deferring the parsing, ParselessLM is
only ~1.5x slower than FastLM, and both LM classes serve queries unedr 6
microseconds (that's 0.006 ms), which means the tradeoff only
contributes to neglible overall latency.

This PR requires some small changes to the phrase db cooking scripts.
Python 3 is now used and the (value, reading, score) tuples are
rearranged to (reading, value, score) and sorted by reading ("key"). A
header is added to the phrase databases to call out the fact that these
are pre-sorted.

clang-format is used to apply WebKit C++ style to the new code. This
also applies to KeyValueBlobReader that was added recently.

Microbenchmark result below:

```
---------------------------------------------------------------------
Benchmark                           Time             CPU   Iterations
---------------------------------------------------------------------
BM_ParselessLMOpenClose         17710 ns        17199 ns        33422
BM_FastLMOpenClose          376520248 ns    367526500 ns            2
BM_ParselessLMFindUnigrams       5967 ns         5899 ns       113729
BM_FastLMFindUnigrams            2268 ns         2265 ns       307038
```
2022-01-15 16:15:02 -08:00
zonble 136ac34f22 Introduces in-place phrase replacement.
Since we have implemented the functions to add and exlcude phrases, the
commit allows users to use a table to change the output of a phrase
without changing its BPMF reading and score, when the "phrase replacement"
mode is on.

It could help users to switch a specific input scenario and the ordinary
one. For example, if a user wants to work on financial Chinese numbers
like 壹、貳、參, he or she may want the characters to have higher score
as the normal numbers like 一、二、三. The commit can let the users to
temporarily replace 一、二、三 to 壹、貳、參 by just turn on "phrase
replacement" mode and prepare a custom table.

The conversion is not done on the output phase like how we do
Traditional/Simplified Chinese conversion. What the phrase replacement
table does is to slightly modify the language model. The replacement
takes place on walking the nodes and candidates list.

A user can enable the mode and edit the table from the input menu. Since
the function is quite advanced, the menu items are hidden until the user
holds the option key.

The table is a plain text file. Each line contains a "from" and "to".
For example

```
一 壹
```

However, if the user also want all other phrase contain 一 to become 壹,
all of the phrases have to be built into the table

```
一百 壹佰
一千 壹仟
一萬 壹萬
一百萬 壹百萬
```
2022-01-15 06:23:09 +08:00
zonble 7edf011e42 Fixes a typo. 2022-01-14 22:36:58 +08:00
zonble 5ce581e0c6 Brings back VXHanConvert. 2022-01-14 22:15:17 +08:00
zonble 7a5cb635e9 Fixes the bugs in the preferences like typos. 2022-01-14 20:31:39 +08:00
zonble aa325f73aa Fixes the typo for the enum of McBopomofo keys. 2022-01-14 20:18:45 +08:00
zonble 95648caa0c Simplifies the code to build the input menu. 2022-01-14 19:55:08 +08:00
zonble d11daacbd2 Refactors the keyboard layout enum. 2022-01-14 19:47:53 +08:00
zonble 83354f7c48 Adds icons for keyboard layouts in preference. 2022-01-14 19:37:48 +08:00
zonble 9faed2153f Uses property wrappers to manage preferences. 2022-01-14 18:06:26 +08:00
Lukhnos Liu c698c61432 Merge pull request #220 from lukhnos/custom-phrase-reader
Use a more tolerant parser for user phrases
2022-01-13 23:43:35 -08:00
Lukhnos Liu d6cc5479f6 Use a more tolerant parser for user phrases
A generic key-value blob reader, KeyValueBlobReader, is implemented to
allow more flexibility in user-editable files. For example, this allows
comments in the file, as well as tolerating leading or trailing spaces,
tabs, or even Windows CR LF line endings.

Unit tests are supplied for KeyValueBlobReader although they are not
part of the Xcode project. A separate CMakeLists.txt is provided.

UserPhrasesLM is refactored to use KeyValueBlobReader. A small stylistic
change is appiled to reduce "using namespace" uses, but otherwise no
major style changes were applied to UserPhrasesLM.

Please note that McBopomofo's user phrase LM uses the value in a
key-value pair as the reading, and the key as the actual "value". We
don't plan to change that order so that we don't have to migrate data.

std::string_view is used to allow efficient reference to char buffers
and interop with std::string (and so no c_str() is needed). C++17 is now
enabled for the project to enable the use of std::string_view.

Copyright headers are added to McBopomofoLM and UserPhrasesLM.
2022-01-13 23:27:31 -08:00
zonble fcdd59dd6b Wraps OpenCCBridge into a SPM package. 2022-01-14 00:57:41 +08:00
zonble e01eb46c9f Wraps InputSourceHelper to a SPM package. 2022-01-14 00:43:21 +08:00
zonble d4772ffa99 Adds notifier UI to notify user Chinese conversion on/off. 2022-01-13 23:38:56 +08:00
zonble a7e38b5b2d Fine-tunes tooltip UI. 2022-01-13 22:00:29 +08:00
zonble 366453820d Adds a tiny tooltop for shift-left/right selections. 2022-01-13 21:47:52 +08:00
zonble 4c1781d970 Renames half-size to half-width. 2022-01-13 19:59:49 +08:00
zonble 9cd2306313 Adds emacs-style hotkeys. 2022-01-13 19:57:08 +08:00
zonble 232a944953 Implements half-size punctuations. 2022-01-13 17:07:22 +08:00
zonble d590d748f8 Adds UserPhrasesLM for user phrases.
Since there is no probability information for users' custom phrases,
they should be stored in a format differs from data.txt. Using the same
format and FastLM to parse user phrases just because of laziness but it
is not the right way.

The pull request adds a new language model class to parse user phrases.
It also update the input method controller to adopt the new user phrase
format.
2022-01-12 16:53:51 +08:00
zonble f1e56a7e01 Lets McBopomofoLM to accept NULL as the parameter in loadUserPhrases. 2022-01-12 13:17:41 +08:00
zonble 84fc2f068b Removes unused code and fixes a typo. 2022-01-12 13:16:10 +08:00
zonble abdf97f652 Adds McBopomofoLM as the facade of three language models.
- main language model
- user phrases
- user excluded phrases
2022-01-12 12:26:24 +08:00
zonble 56896625e3 Removes unused comments. 2022-01-12 01:17:39 +08:00
zonble cbd21cbe1d Updates localization. 2022-01-12 01:10:39 +08:00
zonble ea36061a41 Implements excluding punctuations. 2022-01-12 00:36:55 +08:00
zonble 9b485b799c Implements excluding phrases. 2022-01-12 00:16:55 +08:00
zonble 144d133463 Adds Language Model Manager.
The reference of the global language models were stored in the class
InputMethodController, however, the global models are global but not a
part of the input method controller, and the input method controller
only use one of the models (McBopomofo/Plain Bopomofo). I guess it
somehow violates SRP and there should be a better place for the global
models.
2022-01-11 17:12:58 +08:00
zonble f339948219 Fixes duplicated code and typos. 2022-01-11 13:46:29 +08:00
zonble df3914eeed Fixes a minor bug in the new Swift app delegate. 2022-01-11 02:35:31 +08:00
zonble a7b2edcf26 Converts AppDelegate to Swift. 2022-01-11 02:22:13 +08:00
zonble 61e2751702 Converts candidate UI to a Swift package. 2022-01-11 01:07:17 +08:00
zonble 867a828722 Fixes minor layout issues. 2022-01-11 00:47:48 +08:00
zonble f7e927d67d Starts to use Swift candidate UI.
There are bugs still.
2022-01-11 00:30:02 +08:00
zonble a97cc5ca6c Converts VerticalCandidateController to Swift. 2022-01-11 00:03:32 +08:00
zonble 5aafe64751 Starts to convert candidate UI to Swift. 2022-01-10 22:01:40 +08:00
zonble ba6889fa63 Converts OVInputSourceHelper to Swift. 2022-01-10 22:01:40 +08:00
zonble 84849bdb3d Converts the preference and non modal view controller to Swift. 2022-01-10 22:01:40 +08:00
zonble 75a0f68a9c Fixes the bug that I forgot to create the user phrases folder.
There was a legacy user override model which creates a folder and a
plist file. If a user uses McBopomofo for years, the folder would
exist. However, when the old override model was removed, I forgot
to create the folder for the new user phrase file.

The bug would let the users with new installation of McBopomofo unable
to add user phrases.
2022-01-10 21:59:18 +08:00