diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4245730..459fcfa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -144,6 +144,7 @@ set(HEADER_FILES SeerSourceHighlighter.h SeerCppSourceHighlighter.h SeerOdinSourceHighlighter.h + SeerRustSourceHighlighter.h SeerAboutDialog.h SeerSlashProcDialog.h SeerHighlighterSettings.h @@ -248,6 +249,7 @@ set(SOURCE_FILES SeerSourceHighlighter.cpp SeerCppSourceHighlighter.cpp SeerOdinSourceHighlighter.cpp + SeerRustSourceHighlighter.cpp SeerAboutDialog.cpp SeerSlashProcDialog.cpp SeerHighlighterSettings.cpp diff --git a/src/SeerCppSourceHighlighter.h b/src/SeerCppSourceHighlighter.h index 92d2287..0ba1f1b 100644 --- a/src/SeerCppSourceHighlighter.h +++ b/src/SeerCppSourceHighlighter.h @@ -7,13 +7,6 @@ #include "SeerHighlighterSettings.h" #include "SeerSourceHighlighter.h" -#include -#include -#include -#include -#include -#include - class SeerCppSourceHighlighter : public SeerSourceHighlighter { Q_OBJECT diff --git a/src/SeerOdinSourceHighlighter.cpp b/src/SeerOdinSourceHighlighter.cpp index 8111976..bed6477 100644 --- a/src/SeerOdinSourceHighlighter.cpp +++ b/src/SeerOdinSourceHighlighter.cpp @@ -63,10 +63,6 @@ void SeerOdinSourceHighlighter::setHighlighterSettings (const SeerHighlighterSet QStringLiteral("@(\\([^\\)]*\\)|\\w+)"), }; - const QString typePatterns[] = { - QStringLiteral("") - }; - _highlightingRules.clear(); // Clear old rules. HighlightingRule rule; diff --git a/src/SeerOdinSourceHighlighter.h b/src/SeerOdinSourceHighlighter.h index eb51315..926d4b0 100644 --- a/src/SeerOdinSourceHighlighter.h +++ b/src/SeerOdinSourceHighlighter.h @@ -7,13 +7,6 @@ #include "SeerHighlighterSettings.h" #include "SeerSourceHighlighter.h" -#include -#include -#include -#include -#include -#include - class SeerOdinSourceHighlighter : public SeerSourceHighlighter { Q_OBJECT diff --git a/src/SeerRustSourceHighlighter.cpp b/src/SeerRustSourceHighlighter.cpp new file mode 100644 index 0000000..ee5078d --- /dev/null +++ b/src/SeerRustSourceHighlighter.cpp @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: 2021 Ernie Pasveer +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "SeerRustSourceHighlighter.h" + +SeerRustSourceHighlighter::SeerRustSourceHighlighter(QTextDocument *parent) + : SeerSourceHighlighter(parent) { + + // Set to default formats. + setHighlighterSettings(SeerHighlighterSettings::populate("")); +} + +const SeerHighlighterSettings & +SeerRustSourceHighlighter::highlighterSettings() { + + return _highlighterSettings; +} + +void SeerRustSourceHighlighter::setHighlighterSettings( + const SeerHighlighterSettings &settings) { + _highlighterSettings = settings; + + _classFormat = _highlighterSettings.get("Class"); + _quotationFormat = _highlighterSettings.get("Quotation"); + _functionFormat = _highlighterSettings.get("Function"); + _singleLineCommentFormat = _highlighterSettings.get("Comment"); + _multiLineCommentFormat = _highlighterSettings.get("Multiline Comment"); + _keywordFormat = _highlighterSettings.get("Keyword"); + + const QString keywordPatterns[] = { + QStringLiteral("\\bas\\b"), QStringLiteral("\\bbreak\\b"), + QStringLiteral("\\bconst\\b"), QStringLiteral("\\bcontinue\\b"), + QStringLiteral("\\bcrate\\b"), QStringLiteral("\\belse\\b"), + QStringLiteral("\\benum\\b"), QStringLiteral("\\bextern\\b"), + QStringLiteral("\\bfalse\\b"), QStringLiteral("\\bfn\\b"), + QStringLiteral("\\bfor\\b"), QStringLiteral("\\bif\\b"), + QStringLiteral("\\bimpl\\b"), QStringLiteral("\\bin\\b"), + QStringLiteral("\\blet\\b"), QStringLiteral("\\bloop\\b"), + QStringLiteral("\\bmatch\\b"), QStringLiteral("\\bmod\\b"), + QStringLiteral("\\bmove\\b"), QStringLiteral("\\bmut\\b"), + QStringLiteral("\\bpub\\b"), QStringLiteral("\\bref\\b"), + QStringLiteral("\\breturn\\b"), QStringLiteral("\\bself\\b"), + QStringLiteral("\\bSelf\\b"), QStringLiteral("\\bstatic\\b"), + QStringLiteral("\\bstruct\\b"), QStringLiteral("\\bsuper\\b"), + QStringLiteral("\\btrait\\b"), QStringLiteral("\\btrue\\b"), + QStringLiteral("\\btype\\b"), QStringLiteral("\\bunsafe\\b"), + QStringLiteral("\\buse\\b"), QStringLiteral("\\bwhere\\b"), + QStringLiteral("\\bwhile\\b"), QStringLiteral("\\basync\\b"), + QStringLiteral("\\bawait\\b"), QStringLiteral("\\bdyn\\b"), + QStringLiteral("\\babstract\\b"), QStringLiteral("\\bbecome\\b"), + QStringLiteral("\\bbox\\b"), QStringLiteral("\\bdo\\b"), + QStringLiteral("\\bfinal\\b"), QStringLiteral("\\bmacro\\b"), + QStringLiteral("\\boverride\\b"), QStringLiteral("\\bpriv\\b"), + QStringLiteral("\\btypeof\\b"), QStringLiteral("\\bunsized\\b"), + QStringLiteral("\\bvirtual\\b"), QStringLiteral("\\byield\\b"), + QStringLiteral("\\btry\\b"), QStringLiteral("\\bgen\\b"), + + QStringLiteral("#!?\\[.*\\]"), + }; + + _highlightingRules.clear(); // Clear old rules. + + HighlightingRule rule; + + // Set class format and expression. + rule.pattern = QRegularExpression(QStringLiteral("\\b[A-Z][A-z0-9_]*\\b")); + rule.format = _classFormat; + _highlightingRules.append(rule); + + // Set quote format and expression. + rule.pattern = QRegularExpression(QStringLiteral("\".*\"")); + rule.format = _quotationFormat; + _highlightingRules.append(rule); + + // Set function format and expression. + rule.pattern = + QRegularExpression(QStringLiteral("\\b[A-Za-z0-9_!]+(?=\\s*\\()")); + rule.format = _functionFormat; + _highlightingRules.append(rule); + + // Set keywords format and expression (must have precedence over functions) + for (const QString &pattern : keywordPatterns) { + rule.pattern = QRegularExpression(pattern); + rule.format = _keywordFormat; + + _highlightingRules.append(rule); + } + + // Set single line comment format and expression. + rule.pattern = QRegularExpression(QStringLiteral("//[^\n]*")); + rule.format = _singleLineCommentFormat; + _highlightingRules.append(rule); + + // Set multi-line comment expression. Format is defined later. + _commentStartExpression = QRegularExpression(QStringLiteral("/\\*")); + _commentEndExpression = QRegularExpression(QStringLiteral("\\*/")); +} diff --git a/src/SeerRustSourceHighlighter.h b/src/SeerRustSourceHighlighter.h new file mode 100644 index 0000000..ac84cb8 --- /dev/null +++ b/src/SeerRustSourceHighlighter.h @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2021 Ernie Pasveer +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "SeerHighlighterSettings.h" +#include "SeerSourceHighlighter.h" + +class SeerRustSourceHighlighter : public SeerSourceHighlighter { + + Q_OBJECT + +public: + SeerRustSourceHighlighter(QTextDocument *parent = 0); + + virtual const SeerHighlighterSettings &highlighterSettings() override; + virtual void + setHighlighterSettings(const SeerHighlighterSettings &settings) override; +}; diff --git a/src/SeerSourceHighlighter.cpp b/src/SeerSourceHighlighter.cpp index d9c4cfb..732afe9 100644 --- a/src/SeerSourceHighlighter.cpp +++ b/src/SeerSourceHighlighter.cpp @@ -5,6 +5,7 @@ #include "SeerSourceHighlighter.h" #include "SeerOdinSourceHighlighter.h" #include "SeerCppSourceHighlighter.h" +#include "SeerRustSourceHighlighter.h" SeerSourceHighlighter::SeerSourceHighlighter (QTextDocument* parent) : QSyntaxHighlighter(parent) {} @@ -18,6 +19,10 @@ SeerSourceHighlighter* getSourceHighlighter(QString const& file, SeerHighlighter return new SeerOdinSourceHighlighter(0); } + if (file.endsWith(".rs")) { + return new SeerRustSourceHighlighter(0); + } + return nullptr; } diff --git a/src/SeerSourceHighlighter.h b/src/SeerSourceHighlighter.h index 4c00c27..731d7ef 100644 --- a/src/SeerSourceHighlighter.h +++ b/src/SeerSourceHighlighter.h @@ -1,9 +1,17 @@ +/* + +## Syntax highlighting + +To add syntax highlighting to a language. Subclass `SeerSourceHighlighter` +and then instatiate your highlighter by matching the filename in the `getSourceHighlighter` function. + +*/ + #pragma once #include "SeerHighlighterSettings.h" #include #include -#include class SeerSourceHighlighter : public QSyntaxHighlighter {