Release v0.6.28: typo correction, partial sync and selection diagnostics
This commit is contained in:
@@ -108,6 +108,19 @@ void validateSettings(const Settings &s)
|
||||
throw std::runtime_error("Unsupported auto-correction language");
|
||||
if (s.autoNever.size() > 10000 || s.autoExcluded.size() > 1000)
|
||||
throw std::runtime_error("Too many auto-correction exceptions");
|
||||
if (s.autoReplacements.size() > 10000)
|
||||
throw std::runtime_error("Too many automatic replacements");
|
||||
for (const auto &[from, to] : s.autoReplacements)
|
||||
{
|
||||
bool valid = false;
|
||||
for (auto alphabet : {L"abcdefghijklmnopqrstuvwxyz", L"абвгґдеєжзиіїйклмнопрстуфхцчшщьюя",
|
||||
L"абвгдеёжзийклмнопрстуфхцчшщъыьэюя"})
|
||||
valid |= !from.empty() && !to.empty() && from.size() <= 32 && to.size() <= 32 &&
|
||||
from == lower(from) && to == lower(to) && from != to &&
|
||||
from.find_first_not_of(alphabet) == from.npos && to.find_first_not_of(alphabet) == to.npos;
|
||||
if (!valid)
|
||||
throw std::runtime_error("Replacement pairs must be different lowercase words of 1-32 letters in the same language");
|
||||
}
|
||||
for (const auto &[language, words] : s.autoWords)
|
||||
{
|
||||
std::wstring alphabet = language == L"en" ? L"abcdefghijklmnopqrstuvwxyz" :
|
||||
@@ -172,6 +185,15 @@ Settings decodeSettings(const Bytes &bytes, const std::vector<Layout> &layouts)
|
||||
s.elevatedAutostart = j.value("autostartAsAdministrator", false);
|
||||
s.awake = j.value("preventScreenLock", false);
|
||||
s.autoCorrect = j.value("autoCorrectLayout", false);
|
||||
s.autoReplace = j.value("autoCorrectReplace", false);
|
||||
s.autoTypos = j.value("autoCorrectTypos", false);
|
||||
if (j.contains("autoCorrectReplacements"))
|
||||
for (auto &[from, to] : j.at("autoCorrectReplacements").items())
|
||||
{
|
||||
auto key = lower(wide(from));
|
||||
if (!s.autoReplacements.emplace(key, lower(wide(to.get<std::string>()))).second)
|
||||
throw std::runtime_error("Duplicate automatic replacement");
|
||||
}
|
||||
s.autoMaxRank = j.value("autoCorrectMaxRank", 0);
|
||||
s.autoMinLength = j.value("autoCorrectMinLength", 3);
|
||||
s.autoPrefixChars = str(j, "autoCorrectPrefixChars", s.autoPrefixChars);
|
||||
@@ -268,6 +290,11 @@ Bytes encodeSettings(const Settings &s)
|
||||
for (auto &id : s.cycle)
|
||||
j["layouts"].push_back(utf8(id));
|
||||
j["autoCorrectLayout"] = s.autoCorrect;
|
||||
j["autoCorrectReplace"] = s.autoReplace;
|
||||
j["autoCorrectTypos"] = s.autoTypos;
|
||||
j["autoCorrectReplacements"] = Json::object();
|
||||
for (const auto &[from, to] : s.autoReplacements)
|
||||
j["autoCorrectReplacements"][utf8(from)] = utf8(to);
|
||||
j["autoCorrectMaxRank"] = s.autoMaxRank;
|
||||
j["autoCorrectMinLength"] = s.autoMinLength;
|
||||
j["autoCorrectPrefixChars"] = utf8(s.autoPrefixChars);
|
||||
|
||||
Reference in New Issue
Block a user