From d10eb9d8161030ca87a31e6c0a2b334fe927725f Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 10 Oct 2024 08:09:45 +0200 Subject: [PATCH] TextEditor: Register as code highlighter Change-Id: Ie79cf3805d81f6fef240e88b51569ebc12e1c012 Reviewed-by: hjk --- src/plugins/texteditor/highlighterhelper.cpp | 45 ++++++++++++++++++++ src/plugins/texteditor/highlighterhelper.h | 7 +++ src/plugins/texteditor/texteditorplugin.cpp | 5 ++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/plugins/texteditor/highlighterhelper.cpp b/src/plugins/texteditor/highlighterhelper.cpp index e25b935f8ac..ed2e4f7ef02 100644 --- a/src/plugins/texteditor/highlighterhelper.cpp +++ b/src/plugins/texteditor/highlighterhelper.cpp @@ -222,4 +222,49 @@ void handleShutdown() delete highlightRepository(); } +QFuture highlightCode(const QString &code, const QString &mimeType) +{ + QTextDocument *document = new QTextDocument; + document->setPlainText(code); + + const HighlighterHelper::Definitions definitions = HighlighterHelper::definitionsForMimeType( + mimeType); + + std::shared_ptr> promise + = std::make_shared>(); + + promise->start(); + + if (definitions.isEmpty()) { + promise->addResult(document); + promise->finish(); + return promise->future(); + } + + auto definition = definitions.first(); + + const QString definitionFilesPath + = TextEditorSettings::highlighterSettings().definitionFilesPath().toString(); + + Highlighter *highlighter = new Highlighter(definitionFilesPath); + QObject::connect(highlighter, &Highlighter::finished, document, [document, promise]() { + promise->addResult(document); + promise->finish(); + }); + + QFutureWatcher *watcher = new QFutureWatcher(document); + QObject::connect(watcher, &QFutureWatcher::canceled, document, [document]() { + document->deleteLater(); + }); + watcher->setFuture(promise->future()); + + highlighter->setDefinition(definition); + highlighter->setParent(document); + highlighter->setFontSettings(TextEditorSettings::fontSettings()); + highlighter->setMimeType(mimeType); + highlighter->setDocument(document); + + return promise->future(); +} + } // namespace TextEditor::HighlighterHelper diff --git a/src/plugins/texteditor/highlighterhelper.h b/src/plugins/texteditor/highlighterhelper.h index 6bd1e3161d8..53ca2ad2297 100644 --- a/src/plugins/texteditor/highlighterhelper.h +++ b/src/plugins/texteditor/highlighterhelper.h @@ -3,8 +3,13 @@ #pragma once +#include "texteditor_global.h" + #include +#include +#include + namespace Utils { class FilePath; } namespace TextEditor { @@ -30,6 +35,8 @@ void reload(); void handleShutdown(); +QFuture highlightCode(const QString &code, const QString &mimeType); + } // namespace HighlighterHelper } // namespace TextEditor diff --git a/src/plugins/texteditor/texteditorplugin.cpp b/src/plugins/texteditor/texteditorplugin.cpp index c81035906d9..d423c75e4d8 100644 --- a/src/plugins/texteditor/texteditorplugin.cpp +++ b/src/plugins/texteditor/texteditorplugin.cpp @@ -49,8 +49,9 @@ #include #include -#include #include +#include +#include #include #include @@ -137,6 +138,8 @@ void TextEditorPlugin::initialize() addTestCreator(createCodeAssistTests); addTestCreator(createGenericHighlighterTests); #endif + + Utils::Text::setCodeHighlighter(HighlighterHelper::highlightCode); } void TextEditorPlugin::extensionsInitialized()