From bd0758302f66fed83472de250eba84116f190856 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 8 Mar 2025 22:09:27 -0800 Subject: [PATCH 1/8] [Feature] Syntax highlighting header file --- include/Syntax.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 include/Syntax.h diff --git a/include/Syntax.h b/include/Syntax.h new file mode 100644 index 0000000..df3f918 --- /dev/null +++ b/include/Syntax.h @@ -0,0 +1,31 @@ +#ifndef SYNTAX_H +#define SYNTAX_H + +#include +#include +#include +#include + +class Syntax : public QSyntaxHighlighter +{ + Q_OBJECT + +public: + Syntax(QTextDocument *parent = nullptr); + +protected: + void highlightBlock(const QString &text) override; + +private: + struct SyntaxRule + { + QRegularExpression pattern; + QTextCharFormat format; + }; + QList syntaxRules; + + QTextCharFormat keywordFormat; + QTextCharFormat singleLineCommentFormat; +}; + +#endif // SYNTAX_H \ No newline at end of file From a40822b137cf0dd509b0d3face1cb264a5cc7eb4 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 8 Mar 2025 22:09:50 -0800 Subject: [PATCH 2/8] [Feature] Syntax highlighting foundation implementation --- src/Syntax.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/Syntax.cpp diff --git a/src/Syntax.cpp b/src/Syntax.cpp new file mode 100644 index 0000000..a451dcf --- /dev/null +++ b/src/Syntax.cpp @@ -0,0 +1,45 @@ +#include "Syntax.h" + +Syntax::Syntax(QTextDocument *parent) : QSyntaxHighlighter(parent) +{ + SyntaxRule rule; + + keywordFormat.setForeground(Qt::darkBlue); + keywordFormat.setFontWeight(QFont::Bold); + QStringList keywordPatterns; + keywordPatterns << "\\bchar\\b" << "\\bclass\\b" << "\\bconst\\b" + << "\\bdouble\\b" << "\\benum\\b" << "\\bexplicit\\b" + << "\\bfriend\\b" << "\\binline\\b" << "\\bint\\b" + << "\\blong\\b" << "\\bnamespace\\b" << "\\boperator\\b" + << "\\bprivate\\b" << "\\bprotected\\b" << "\\bpublic\\b" + << "\\bshort\\b" << "\\bsignals\\b" << "\\bsigned\\b" + << "\\bslots\\b" << "\\bstatic\\b" << "\\bstruct\\b" + << "\\btemplate\\b" << "\\btypedef\\b" << "\\btypename\\b" + << "\\bunion\\b" << "\\bunsigned\\b" << "\\bvirtual\\b" + << "\\bvoid\\b" << "\\bvolatile\\b"; + foreach (const QString &pattern, keywordPatterns) + { + rule.pattern = QRegularExpression(pattern); + rule.format = keywordFormat; + syntaxRules.append(rule); + } + + // Single line comment format expression + singleLineCommentFormat.setForeground(Qt::red); + rule.pattern = QRegularExpression(QStringLiteral("//[^\n]*")); + rule.format = singleLineCommentFormat; + syntaxRules.append(rule); +} + +void Syntax::highlightBlock(const QString &text) +{ + foreach (const SyntaxRule &rule, syntaxRules) + { + QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text); + while (matchIterator.hasNext()) + { + QRegularExpressionMatch match = matchIterator.next(); + setFormat(match.capturedStart(), match.capturedLength(), rule.format); + } + } +} From cbf1d03c3f182b8ec4a21c4ff3590a0cbbfe2107 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 8 Mar 2025 22:10:20 -0800 Subject: [PATCH 3/8] [Build] Added Syntax Highlighter files to build --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49c46d0..b7d7024 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,8 +54,10 @@ add_executable(${TARGET_NAME} src/main.cpp src/MainWindow.cpp src/CodeEditor.cpp + src/Syntax.cpp include/MainWindow.h include/CodeEditor.h + include/Syntax.h ) qt_add_resources(APP_RESOURCES resources.qrc) From 7d5821a389c4b709b472dc68449d5c2540c4564a Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 8 Mar 2025 22:10:52 -0800 Subject: [PATCH 4/8] [Feature] Added syntax highlighter call to main window --- include/MainWindow.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/MainWindow.h b/include/MainWindow.h index a4a7099..4960d60 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -2,6 +2,7 @@ #define MAINWINDOW_H #include "CodeEditor.h" +#include "Syntax.h" #include #include #include @@ -34,6 +35,7 @@ private slots: void (MainWindow::*slot)()); CodeEditor *editor; QString currentFileName; + Syntax *syntax; }; #endif // MAINWINDOW_H From 8a74fe92484852b2b5c8bb6b16975616838fb1e4 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 8 Mar 2025 22:11:08 -0800 Subject: [PATCH 5/8] [Feature] Added syntax highlighter call to main window --- src/MainWindow.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index ae44543..c454126 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1,4 +1,5 @@ #include "MainWindow.h" +#include "Syntax.h" #include #include @@ -15,8 +16,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) resize(800, 600); editor = new CodeEditor(this); - setCentralWidget(editor); + syntax = new Syntax(editor->document()); + setCentralWidget(editor); createMenuBar(); } From 5a71fd99c18068ca6d811ad6be4fd6eccfbe2158 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 9 Mar 2025 09:05:48 -0700 Subject: [PATCH 6/8] [Update] Added more regex pattern --- include/Syntax.h | 4 ++++ src/Syntax.cpp | 32 +++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/include/Syntax.h b/include/Syntax.h index df3f918..87eab2e 100644 --- a/include/Syntax.h +++ b/include/Syntax.h @@ -26,6 +26,10 @@ class Syntax : public QSyntaxHighlighter QTextCharFormat keywordFormat; QTextCharFormat singleLineCommentFormat; + QTextCharFormat quotationMark; + QTextCharFormat functionFormat; + QTextCharFormat parenthesisFormat; + QTextCharFormat charFormat; }; #endif // SYNTAX_H \ No newline at end of file diff --git a/src/Syntax.cpp b/src/Syntax.cpp index a451dcf..14ffd67 100644 --- a/src/Syntax.cpp +++ b/src/Syntax.cpp @@ -4,7 +4,7 @@ Syntax::Syntax(QTextDocument *parent) : QSyntaxHighlighter(parent) { SyntaxRule rule; - keywordFormat.setForeground(Qt::darkBlue); + keywordFormat.setForeground(Qt::blue); keywordFormat.setFontWeight(QFont::Bold); QStringList keywordPatterns; keywordPatterns << "\\bchar\\b" << "\\bclass\\b" << "\\bconst\\b" @@ -16,7 +16,7 @@ Syntax::Syntax(QTextDocument *parent) : QSyntaxHighlighter(parent) << "\\bslots\\b" << "\\bstatic\\b" << "\\bstruct\\b" << "\\btemplate\\b" << "\\btypedef\\b" << "\\btypename\\b" << "\\bunion\\b" << "\\bunsigned\\b" << "\\bvirtual\\b" - << "\\bvoid\\b" << "\\bvolatile\\b"; + << "\\bvoid\\b" << "\\bvolatile\\b" << "\\bforeach\\b"; foreach (const QString &pattern, keywordPatterns) { rule.pattern = QRegularExpression(pattern); @@ -25,10 +25,36 @@ Syntax::Syntax(QTextDocument *parent) : QSyntaxHighlighter(parent) } // Single line comment format expression - singleLineCommentFormat.setForeground(Qt::red); + singleLineCommentFormat.setForeground(Qt::darkGray); rule.pattern = QRegularExpression(QStringLiteral("//[^\n]*")); rule.format = singleLineCommentFormat; syntaxRules.append(rule); + + // Double quotation mark for string + quotationMark.setForeground(Qt::darkGreen); + rule.pattern = QRegularExpression(QStringLiteral("\".*\"")); + rule.format = quotationMark; + syntaxRules.append(rule); + + // Function format expression + functionFormat.setFontItalic(true); + functionFormat.setForeground(Qt::darkYellow); + rule.pattern = QRegularExpression(QStringLiteral("\\b[a-zA-Z_][a-zA-Z0-9_]*(?=\\s*\\()")); + rule.format = functionFormat; + syntaxRules.append(rule); + + // Color pattern for parenthesis + QColor parenthesisColor("#6495ED"); + parenthesisFormat.setForeground(parenthesisColor); + rule.pattern = QRegularExpression(QStringLiteral("[()]")); + rule.format = parenthesisFormat; + syntaxRules.append(rule); + + // Regex for single character format 'a', '\n', etc + charFormat.setForeground(Qt::darkCyan); + rule.pattern = QRegularExpression(QStringLiteral("'(\\\\.|[^'])'")); + rule.format = charFormat; + syntaxRules.append(rule); } void Syntax::highlightBlock(const QString &text) From 6cd7078ba02eec30484357d517e9125b28a1ba3a Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 9 Mar 2025 09:13:28 -0700 Subject: [PATCH 7/8] [Refactor] Added modularity in adding pattern --- include/Syntax.h | 2 ++ src/Syntax.cpp | 33 +++++++++++++++------------------ 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/include/Syntax.h b/include/Syntax.h index 87eab2e..4b40f5a 100644 --- a/include/Syntax.h +++ b/include/Syntax.h @@ -30,6 +30,8 @@ class Syntax : public QSyntaxHighlighter QTextCharFormat functionFormat; QTextCharFormat parenthesisFormat; QTextCharFormat charFormat; + + void addPattern(const QString &pattern, const QTextCharFormat &format); }; #endif // SYNTAX_H \ No newline at end of file diff --git a/src/Syntax.cpp b/src/Syntax.cpp index 14ffd67..5d97701 100644 --- a/src/Syntax.cpp +++ b/src/Syntax.cpp @@ -19,42 +19,39 @@ Syntax::Syntax(QTextDocument *parent) : QSyntaxHighlighter(parent) << "\\bvoid\\b" << "\\bvolatile\\b" << "\\bforeach\\b"; foreach (const QString &pattern, keywordPatterns) { - rule.pattern = QRegularExpression(pattern); - rule.format = keywordFormat; - syntaxRules.append(rule); + addPattern(pattern, keywordFormat); } // Single line comment format expression singleLineCommentFormat.setForeground(Qt::darkGray); - rule.pattern = QRegularExpression(QStringLiteral("//[^\n]*")); - rule.format = singleLineCommentFormat; - syntaxRules.append(rule); + addPattern("//[^\n]*", singleLineCommentFormat); // Double quotation mark for string quotationMark.setForeground(Qt::darkGreen); - rule.pattern = QRegularExpression(QStringLiteral("\".*\"")); - rule.format = quotationMark; - syntaxRules.append(rule); + addPattern("\".*\"", quotationMark); // Function format expression functionFormat.setFontItalic(true); functionFormat.setForeground(Qt::darkYellow); - rule.pattern = QRegularExpression(QStringLiteral("\\b[a-zA-Z_][a-zA-Z0-9_]*(?=\\s*\\()")); - rule.format = functionFormat; - syntaxRules.append(rule); + addPattern("\\b[a-zA-Z_][a-zA-Z0-9_]*(?=\\s*\\()", functionFormat); // Color pattern for parenthesis QColor parenthesisColor("#6495ED"); parenthesisFormat.setForeground(parenthesisColor); - rule.pattern = QRegularExpression(QStringLiteral("[()]")); - rule.format = parenthesisFormat; - syntaxRules.append(rule); + addPattern("[()]", parenthesisFormat); // Regex for single character format 'a', '\n', etc charFormat.setForeground(Qt::darkCyan); - rule.pattern = QRegularExpression(QStringLiteral("'(\\\\.|[^'])'")); - rule.format = charFormat; - syntaxRules.append(rule); + addPattern("'(\\\\.|[^'])'", charFormat); +} + +// Add syntax highlighting patterns +void Syntax::addPattern(const QString &pattern, const QTextCharFormat &format) +{ + SyntaxRule rule; + rule.pattern = QRegularExpression(pattern); + rule.format = format; + syntaxRules.append(rule); } void Syntax::highlightBlock(const QString &text) From 50b645be00a4cfdd7be5e2cf43bf19833ea8a4ee Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 9 Mar 2025 09:19:50 -0700 Subject: [PATCH 8/8] [Refactor] Remove dead code --- src/Syntax.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Syntax.cpp b/src/Syntax.cpp index 5d97701..553c927 100644 --- a/src/Syntax.cpp +++ b/src/Syntax.cpp @@ -2,8 +2,6 @@ Syntax::Syntax(QTextDocument *parent) : QSyntaxHighlighter(parent) { - SyntaxRule rule; - keywordFormat.setForeground(Qt::blue); keywordFormat.setFontWeight(QFont::Bold); QStringList keywordPatterns;