From a9fb0310132bc645ffcfb3734bd2ca53f1fb39fa Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 4 Oct 2023 17:29:16 +0400 Subject: [PATCH] Add syntax highlighting with libprisma. --- CMakeLists.txt | 14 +- highlighting/grammars.dat | Bin 0 -> 225814 bytes highlighting/highlighting.qrc | 5 + spellcheck/spellcheck_highlight_syntax.cpp | 287 +++++++++++++++++++++ spellcheck/spellcheck_highlight_syntax.h | 19 ++ 5 files changed, 322 insertions(+), 3 deletions(-) create mode 100644 highlighting/grammars.dat create mode 100644 highlighting/highlighting.qrc create mode 100644 spellcheck/spellcheck_highlight_syntax.cpp create mode 100644 spellcheck/spellcheck_highlight_syntax.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 90ad239..b20c23d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,8 @@ endif() target_precompile_headers(lib_spellcheck PRIVATE ${src_loc}/spellcheck/spellcheck_pch.h) nice_target_sources(lib_spellcheck ${src_loc} PRIVATE + highlighting/highlighting.qrc + spellcheck/platform/linux/language_linux.cpp spellcheck/platform/linux/language_linux.h spellcheck/platform/linux/linux_enchant.cpp @@ -57,19 +59,23 @@ PRIVATE spellcheck/third_party/hunspell_controller.h spellcheck/third_party/spellcheck_hunspell.cpp spellcheck/third_party/spellcheck_hunspell.h + spellcheck/spellcheck_types.h + spellcheck/spellcheck_highlight_syntax.cpp + spellcheck/spellcheck_highlight_syntax.h spellcheck/spellcheck_utils.cpp spellcheck/spellcheck_utils.h - spellcheck/spellcheck_types.h + spellcheck/spellcheck_value.cpp + spellcheck/spellcheck_value.h spellcheck/spelling_highlighter.cpp spellcheck/spelling_highlighter.h spellcheck/spelling_highlighter_helper.cpp spellcheck/spelling_highlighter_helper.h - spellcheck/spellcheck_value.cpp - spellcheck/spellcheck_value.h spellcheck/spellcheck_pch.h ) +target_prepare_qrc(lib_spellcheck) + if (system_spellchecker) remove_target_sources(lib_spellcheck ${src_loc} spellcheck/third_party/spellcheck_hunspell.cpp @@ -126,9 +132,11 @@ PRIVATE desktop-app::lib_base desktop-app::lib_rpl desktop-app::lib_crl + desktop-app::lib_prisma desktop-app::external_qt desktop-app::external_ranges desktop-app::external_gsl + desktop-app::external_xxhash ) if (LINUX AND use_enchant) diff --git a/highlighting/grammars.dat b/highlighting/grammars.dat new file mode 100644 index 0000000000000000000000000000000000000000..b1645708fa3b51e5d4da0c22b56e0b37e214951d GIT binary patch literal 225814 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 literal 0 HcmV?d00001 diff --git a/highlighting/highlighting.qrc b/highlighting/highlighting.qrc new file mode 100644 index 0000000..0346f28 --- /dev/null +++ b/highlighting/highlighting.qrc @@ -0,0 +1,5 @@ + + + grammars.dat + + diff --git a/spellcheck/spellcheck_highlight_syntax.cpp b/spellcheck/spellcheck_highlight_syntax.cpp new file mode 100644 index 0000000..67cd63c --- /dev/null +++ b/spellcheck/spellcheck_highlight_syntax.cpp @@ -0,0 +1,287 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#include "spellcheck/spellcheck_highlight_syntax.h" + +#include "base/base_file_utilities.h" +#include "base/debug_log.h" +#include "base/flat_map.h" +#include "crl/crl_object_on_queue.h" + +#include "SyntaxHighlighter.h" + +#include + +#include +#include +#include + +void spellchecker_InitHighlightingResource() { +#ifdef Q_OS_MAC // Use resources from the .app bundle on macOS. + + base::RegisterBundledResources(u"lib_spellcheck.rcc"_q); + +#else // Q_OS_MAC + + Q_INIT_RESOURCE(highlighting); + +#endif // Q_OS_MAC +} + +namespace Spellchecker { +namespace { + +base::flat_map Cache; +HighlightProcessId ProcessIdAutoIncrement/* = 0*/; +rpl::event_stream ReadyStream; + +class QueuedHighlighter final { +public: + QueuedHighlighter(); + + struct Request { + uint64 hash = 0; + QString text; + QString language; + }; + void process(Request request); + void notify(HighlightProcessId id); + +private: + using Task = std::variant; + + std::vector _tasks; + + std::unique_ptr _highlighter; + +}; + +[[nodiscard]] crl::object_on_queue &Highlighter() { + static auto result = crl::object_on_queue(); + return result; +} + +QueuedHighlighter::QueuedHighlighter() { + spellchecker_InitHighlightingResource(); +} + +void QueuedHighlighter::process(Request request) { + if (!_highlighter) { + auto file = QFile(":/misc/grammars.dat"); + const auto size = file.size(); + const auto ok1 = file.open(QIODevice::ReadOnly); + auto grammars = std::string(); + grammars.resize(size); + const auto ok2 = (file.read(grammars.data(), size) == size); + Assert(ok1 && ok2); + + _highlighter = std::make_unique(grammars); + } + + const auto text = request.text.toStdString(); + const auto language = request.language.toStdString(); + const auto tokens = _highlighter->tokenize(text, language); + + static const auto colors = base::flat_map{ + { "comment" , 1 }, + { "block-comment", 1 }, + { "prolog" , 1 }, + { "doctype" , 1 }, + { "cdata" , 1 }, + { "punctuation" , 2 }, + { "property" , 3 }, + { "tag" , 3 }, + { "boolean" , 3 }, + { "number" , 3 }, + { "constant" , 3 }, + { "symbol" , 3 }, + { "deleted" , 3 }, + { "selector" , 4 }, + { "attr-name" , 4 }, + { "string" , 4 }, + { "char" , 4 }, + { "builtin" , 4 }, + { "inserted" , 4 }, + { "operator" , 5 }, + { "entity" , 5 }, + { "url" , 5 }, + { "atrule" , 6 }, + { "attr-value" , 6 }, + { "keyword" , 6 }, + { "function" , 6 }, + { "class-name" , 7 }, + }; + + auto offset = 0; + auto entities = EntitiesInText(); + auto rebuilt = QString(); + rebuilt.reserve(request.text.size()); + const auto enumerate = [&]( + const TokenList &list, + const std::string &type, + auto &&self) -> void { + for (const auto &node : list) { + if (node.isSyntax()) { + const auto &syntax = static_cast(node); + self(syntax.children(), syntax.type(), self); + } else { + const auto text = static_cast(node).value(); + const auto utf16 = QString::fromUtf8( + text.data(), + text.size()); + const auto length = utf16.size(); + rebuilt.append(utf16); + if (!type.empty()) { + const auto i = colors.find(type); + if (i != end(colors)) { + entities.push_back(EntityInText( + EntityType::Colorized, + offset, + length, + QChar(ushort(i->second)))); + } + } + offset += length; + } + } + }; + enumerate(tokens, std::string(), enumerate); + const auto hash = request.hash; + if (offset != request.text.size()) { + // Something went wrong. + LOG(("Highlighting Error: for language '%1', text: %2" + ).arg(request.language + ).arg(request.text)); + entities.clear(); + } + crl::on_main([hash, entities = std::move(entities)]() mutable { + Cache.emplace(hash, std::move(entities)); + }); +} + +void QueuedHighlighter::notify(HighlightProcessId id) { + crl::on_main([=] { + ReadyStream.fire_copy(id); + }); +} + +struct CacheResult { + uint64 hash = 0; + const EntitiesInText *list = nullptr; + + explicit operator bool() const { + return list != nullptr; + } +}; +[[nodiscard]] CacheResult FindInCache( + const TextWithEntities &text, + EntitiesInText::const_iterator i) { + const auto view = QStringView(text.text).mid(i->offset(), i->length()); + const auto language = i->data(); + + struct Destroyer { + void operator()(XXH64_state_t *state) { + if (state) { + XXH64_freeState(state); + } + } + }; + static const auto S = std::unique_ptr( + XXH64_createState()); + + const auto state = S.get(); + XXH64_reset(state, 0); + XXH64_update(state, view.data(), view.size() * sizeof(ushort)); + XXH64_update(state, language.data(), language.size() * sizeof(ushort)); + const auto hash = XXH64_digest(state); + + const auto j = Cache.find(hash); + return { hash, (j != Cache.cend()) ? &j->second : nullptr }; +} + +EntitiesInText::iterator Insert( + TextWithEntities &text, + EntitiesInText::iterator i, + const EntitiesInText &entities) { + auto next = i + 1; + if (entities.empty()) { + return next; + } + const auto offset = i->offset(); + if (next != text.entities.cend() + && next->type() == entities.front().type() + && next->offset() == offset + entities.front().offset()) { + return next; + } + const auto length = i->length(); + for (const auto &entity : entities) { + if (entity.offset() + entity.length() >= length) { + break; + } + auto j = text.entities.insert(next, entity); + j->shiftRight(offset); + next = j + 1; + } + return next; +} + +void Schedule( + uint64 hash, + const TextWithEntities &text, + EntitiesInText::const_iterator i) { + Highlighter().with([ + hash, + text = text.text.mid(i->offset(), i->length()), + language = i->data() + ](QueuedHighlighter &instance) mutable { + instance.process({ hash, std::move(text), std::move(language) }); + }); +} + +void Notify(uint64 processId) { + Highlighter().with([processId](QueuedHighlighter &instance) { + instance.notify(processId); + }); +} + +} // namespace + +HighlightProcessId TryHighlightSyntax(TextWithEntities &text) { + auto b = text.entities.begin(); + auto i = b; + auto e = text.entities.end(); + const auto checking = [](const EntityInText &entity) { + return (entity.type() == EntityType::Pre) + && !entity.data().isEmpty(); + }; + auto processId = HighlightProcessId(); + while (true) { + i = std::find_if(i, e, checking); + if (i == e) { + break; + } else if (const auto already = FindInCache(text, i)) { + i = Insert(text, i, *already.list); + b = text.entities.begin(); + e = text.entities.end(); + } else { + Schedule(already.hash, text, i); + if (!processId) { + processId = ++ProcessIdAutoIncrement; + } + ++i; + } + } + if (processId) { + Notify(processId); + } + return processId; +} + +rpl::producer HighlightReady() { + return ReadyStream.events(); +} + +} // namespace Spellchecker diff --git a/spellcheck/spellcheck_highlight_syntax.h b/spellcheck/spellcheck_highlight_syntax.h new file mode 100644 index 0000000..7cc1068 --- /dev/null +++ b/spellcheck/spellcheck_highlight_syntax.h @@ -0,0 +1,19 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#pragma once + +#include "ui/text/text_entity.h" + +namespace Spellchecker { + +using HighlightProcessId = uint64; + +// Returning zero means we highlighted everything already. +[[nodiscard]] HighlightProcessId TryHighlightSyntax(TextWithEntities &text); +[[nodiscard]] rpl::producer HighlightReady(); + +} // namespace Spellchecker