Release v0.6.47: allow multi-word auto-correction replacements

This commit is contained in:
agrynco committed 2026-11-05 22:51:57 +02:00
1 parent 5de5b791bf
commit e33387c2d5
13 files changed
+48 -29

No files matched your search

+2 -2
View File
@@ -901,7 +901,7 @@ int main(int argc, char **argv) {
"personal dictionary field fits options window");
}
SetDlgItemTextW(autoOptions,412,L"Релізик\r\nрелізик, словечко");
SetDlgItemTextW(autoOptions,416,L" Првиіт = Привіт\r\nhelo=hello");
SetDlgItemTextW(autoOptions,416,L" Првиіт = Привіт\r\nhelo=hello\r\n Мамамила = Мама мила ");
SendDlgItemMessageW(autoOptions,414,BM_SETCHECK,BST_CHECKED,0);
SendDlgItemMessageW(autoOptions,415,BM_SETCHECK,BST_CHECKED,0);
SendMessageW(autoOptions,WM_COMMAND,IDOK,0);
@@ -923,7 +923,7 @@ int main(int argc, char **argv) {
"personal dictionary normalizes case, newlines and duplicate words");
wchar_t pairs[128]{};
GetDlgItemTextW(autoOptions,416,pairs,128);
require(std::wstring(pairs)==L"helo=hello\r\nпрвиіт=привіт\r\n" &&
require(std::wstring(pairs)==L"helo=hello\r\nмамамила=мама мила\r\nпрвиіт=привіт\r\n" &&
SendDlgItemMessageW(autoOptions,414,BM_GETCHECK,0,0)==BST_CHECKED &&
SendDlgItemMessageW(autoOptions,415,BM_GETCHECK,0,0)==BST_CHECKED,
"typo options and normalized replacement pairs survive reopening");
+4 -4
View File
@@ -802,14 +802,14 @@ LRESULT CALLBACK procedure(HWND w, UINT msg, WPARAM wp, LPARAM lp)
case 22:
require(text() == L"робить ", "automatic correction selects and converts the whole word across an internal comma");
app->settings.autoReplace = true;
app->settings.autoReplacements = {{L"helo", L"hello"}};
app->settings.autoReplacements = {{L"helo", L"hello world"}};
ActivateKeyboardLayout(app->layouts[en].handle, 0);
prepare(L"(Helo)! ", false);
record(L"(Helo)! ");
app->transform(ks::AutoCorrect);
break;
case 23:
require(text() == L"(Hello)! ", "explicit typo pair replaces verified text with punctuation and capital");
require(text() == L"(Hello world)! ", "explicit phrase pair replaces verified text with punctuation and capital");
app->transform(ks::Undo);
break;
case 24:
@@ -835,7 +835,7 @@ LRESULT CALLBACK procedure(HWND w, UINT msg, WPARAM wp, LPARAM lp)
case 27:
require(text() == L"kswithcer ", "Undo suppresses the rejected spelling correction");
app->settings.autoReplace = true;
app->settings.autoReplacements = {{L"tehh", L"the"}};
app->settings.autoReplacements = {{L"tehh", L"the word"}};
app->autoPredictor.configure(L"dictionaries", app->settings.autoLanguages);
prepare(L"", false);
{
@@ -852,7 +852,7 @@ LRESULT CALLBACK procedure(HWND w, UINT msg, WPARAM wp, LPARAM lp)
}
break;
case 28:
require(text() == L"the x", "custom replacement through keyboard hook preserves subsequent typing");
require(text() == L"the word x", "custom phrase replacement through keyboard hook preserves subsequent typing");
app->settings.autoReplace = false;
app->settings.autoTypos = false;
if (typosOnly) { finish(); break; }
+14 -2
View File
@@ -590,6 +590,12 @@ int main(int argc, char **argv)
options.autoNever = {L"hlelo"};
require(!edited.suggest(L"hlelo ", 0, layouts, options), "never-correct overrides explicit pairs");
options.autoNever.clear();
options.autoReplacements[L"мамамила"] = L"мама мила";
correction = edited.suggest(L"(Мамамила)! ", 2, layouts, options);
require(correction && correction->text == L"(Мама мила)! " && correction->target == 2,
"joined words split while preserving capitalization, punctuation and layout");
edited.reject(L"мамамила ", options);
require(!edited.suggest(L"мамамила ", 2, layouts, options), "undo suppresses phrase replacements");
edited.reject(L"(Hlelo)! ", options);
require(!edited.suggest(L"hlelo ", 0, layouts, options), "undo rejection suppresses custom replacements");
options.autoReplace = false;
@@ -711,7 +717,7 @@ int main(int argc, char **argv)
settings.elevatedAutostart = true;
settings.autoCorrect = true;
settings.autoReplace = settings.autoTypos = true;
settings.autoReplacements = {{L"првиіт", L"привіт"}, {L"helo", L"hello"}};
settings.autoReplacements = {{L"првиіт", L"привіт"}, {L"helo", L"hello"}, {L"мамамила", L"мама мила"}};
settings.autoMaxRank = 10000;
settings.autoMinLength = 5;
settings.autoPrefixChars = L"(#";
@@ -726,7 +732,13 @@ int main(int argc, char **argv)
require(restored.autoWords == settings.autoWords, "personal dictionaries survive settings roundtrip");
require(restored.autoReplace && restored.autoTypos && restored.autoReplacements == settings.autoReplacements,
"typo options and Unicode pairs survive settings roundtrip");
for (const auto &pair : {std::pair{L"hello", L"привіт"}, {L"hello", L"hello"}, {L"hi!", L"hello"}})
for (const auto &pair : {std::pair{L"hello", L"привіт"}, {L"hello", L"hello"}, {L"hi!", L"hello"},
{L"helloworld", L" hello world"}, {L"helloworld", L"hello world "},
{L"helloworld", L"hello world"}, {L"helloworld", L"hello\tworld"},
{L"helloworld", L"hello\nworld"}, {L"hello world", L"helloworld"},
{L"helloworld", L"hello світ"}, {L"helloworld", L"hello world!"},
{L"helloworld", L"hello Hello"}, {L"helloworld", L""},
{L"helloworld", L"abcdefghijklmnopqrstuvwxyz abcdef"}})
{
auto invalid = settings;
invalid.autoReplacements = {{pair.first, pair.second}};