Release v0.6.48: chat language profiles and tabbed settings

This commit is contained in:
agrynco committed 2026-11-05 23:25:33 +02:00
1 parent e33387c2d5
commit 4e7a683c47
20 files changed
+729 -70

No files matched your search

+32
View File
@@ -61,6 +61,25 @@ bool validId(const std::wstring &id)
} // namespace
void validateSettings(const Settings &s)
{
if (s.chatCycles.size() > 1000) throw std::runtime_error("Too many chat language profiles");
for (const auto &[key, cycle] : s.chatCycles)
{
auto separator = key.find(L'\n');
if (separator == key.npos || separator + 1 == key.size() || key.size() > 1024 ||
key.find(L'\n', separator + 1) != key.npos || key.find(L'\r') != key.npos ||
(key.substr(0, separator) != L"telegram" && key.substr(0, separator) != L"ms-teams"))
throw std::runtime_error("Invalid chat language profile");
if (cycle.empty() || cycle.size() > 64) throw std::runtime_error("Select at least one chat language");
std::vector<std::wstring> seen;
for (const auto &id : cycle)
{
if (id.size() != 12 || !id.starts_with(L"win:") ||
id.find_first_not_of(L"0123456789abcdefABCDEF", 4) != id.npos ||
std::find(seen.begin(), seen.end(), id) != seen.end())
throw std::runtime_error("Invalid or duplicate chat layout");
seen.push_back(id);
}
}
if (s.tesseractPath.size() > 32700 || s.tesseractPath.find_first_of(L"\r\n\"") != s.tesseractPath.npos)
throw std::runtime_error("Invalid Tesseract executable path");
if (s.tesseractLanguages.empty() || s.tesseractLanguages.size() > 128 ||
@@ -234,6 +253,16 @@ Settings decodeSettings(const Bytes &bytes, const std::vector<Layout> &layouts)
s.cycle.push_back(w);
}
}
if (j.contains("chatCycles"))
{
if (!j.at("chatCycles").is_object()) throw std::runtime_error("Invalid chat profiles object");
for (const auto &[key, cycle] : j.at("chatCycles").items())
{
if (!cycle.is_array() || cycle.empty()) throw std::runtime_error("Empty chat language profile");
for (const auto &id : cycle)
s.chatCycles[wide(key)].push_back(wide(id.get<std::string>()));
}
}
if (j.contains("layoutHotkeys"))
{
std::fill(s.direct.begin(), s.direct.end(), L"");
@@ -290,6 +319,9 @@ Bytes encodeSettings(const Settings &s)
{"screenshotHotkey", utf8(s.screenshot)},
{"screenshotAutoOpenEditor", s.screenshotAutoOpenEditor}};
j["layouts"] = Json::array();
j["chatCycles"] = Json::object();
for (const auto &[key, cycle] : s.chatCycles)
for (const auto &id : cycle) j["chatCycles"][utf8(key)].push_back(utf8(id));
for (auto &id : s.cycle)
j["layouts"].push_back(utf8(id));
j["autoCorrectLayout"] = s.autoCorrect;