]> Some of my projects - localmylist.git/commitdiff
Add syntax highlighting for AniAdd scripts.
authorAPTX <marek321@gmail.com>
Thu, 6 Jun 2013 00:38:18 +0000 (02:38 +0200)
committerAPTX <marek321@gmail.com>
Thu, 6 Jun 2013 00:38:18 +0000 (02:38 +0200)
The colors are not final.

localmylist-management/aniaddsyntaxhighlighter.cpp [new file with mode: 0644]
localmylist-management/aniaddsyntaxhighlighter.h [new file with mode: 0644]
localmylist-management/localmylist-management.pro
localmylist-management/renamesettingsdialog.cpp
localmylist-management/renamesettingsdialog.h

diff --git a/localmylist-management/aniaddsyntaxhighlighter.cpp b/localmylist-management/aniaddsyntaxhighlighter.cpp
new file mode 100644 (file)
index 0000000..666df08
--- /dev/null
@@ -0,0 +1,107 @@
+#include "anionisyntaxhighlighter.h"
+
+#include <QSqlRecord>
+
+#include <RenameParser/RenameEngine>
+#include "renameutils.h"
+
+#include <QDebug>
+
+AniAddSyntaxHighlighter::AniAddSyntaxHighlighter(QObject *parent) :
+       QSyntaxHighlighter(parent)
+{
+       HighlightingRule rule;
+
+       variable.setForeground(                 QColor(211,  54, 130));
+       builtinVariable.setForeground(  QColor(220,  50,  47));
+       function.setForeground(                 QColor( 38, 139, 210));
+       builtinFunction.setForeground(  QColor(108, 113, 196));
+       number.setForeground(                   QColor( 42, 161, 152));
+       string.setForeground(                   QColor(133, 153,   0));
+       operatorFormat.setForeground(   Qt::darkRed);
+       comment.setForeground(                  Qt::gray);
+
+       rule.pattern = QRegExp("0|[1-9][0-9]*");
+       rule.format = number;
+       highlightingRules << rule;
+
+       const QString name("[a-zA-Z][a-zA-Z0-9]*");
+
+       rule.pattern = QRegExp(name);
+       rule.format = variable;
+       highlightingRules << rule;
+
+       rule.pattern = QRegExp("\\$\\s*" + name);
+       rule.format = function;
+       highlightingRules << rule;
+
+       {
+               QSqlRecord r;
+               RenameParser::Environment env;
+               LocalMyList::setupRenameEnv(r, env);
+               const QStringList variables = env.keys();
+
+               rule.pattern = QRegExp("\\b" + variables.join(QChar('|')) + "\\b");
+               rule.format = builtinVariable;
+               highlightingRules.append(rule);
+       }
+       {
+               const QStringList functions = RenameParser::RenameEngine::registeredFunctions();
+
+               rule.pattern = QRegExp("\\$\\s*(?:" + functions.join(QChar('|')) + ")\\b");
+               rule.format = builtinFunction;
+               highlightingRules << rule;
+       }
+
+       rule.pattern = QRegExp(":?=|[:|?\\[\\]]");
+       rule.format = operatorFormat;
+       highlightingRules << rule;
+
+       rule.pattern = QRegExp("\"[^\"]*\"|'[^']*'");
+       rule.format = string;
+       highlightingRules << rule;
+
+       rule.pattern = QRegExp("^//.*$");
+       rule.format = comment;
+       highlightingRules << rule;
+
+       commentStartExpression = QRegExp("/\\*");
+       commentEndExpression = QRegExp("\\*/");
+}
+
+void AniAddSyntaxHighlighter::highlightBlock(const QString &text)
+{
+       for (const HighlightingRule &rule : highlightingRules)
+       {
+               QRegExp expression(rule.pattern);
+               int index = expression.indexIn(text);
+               while (index >= 0) {
+                       int length = expression.matchedLength();
+                       setFormat(index, length, rule.format);
+                       index = expression.indexIn(text, index + length);
+               }
+       }
+       setCurrentBlockState(0);
+
+       int startIndex = 0;
+       if (previousBlockState() != 1)
+               startIndex = commentStartExpression.indexIn(text);
+
+       while (startIndex >= 0)
+       {
+               int endIndex = commentEndExpression.indexIn(text, startIndex);
+               int commentLength;
+               if (endIndex == -1)
+               {
+                       setCurrentBlockState(1);
+                       commentLength = text.length() - startIndex;
+               }
+               else
+               {
+                       commentLength = endIndex - startIndex
+                                                       + commentEndExpression.matchedLength();
+               }
+               setFormat(startIndex, commentLength, comment);
+               startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
+       }
+}
diff --git a/localmylist-management/aniaddsyntaxhighlighter.h b/localmylist-management/aniaddsyntaxhighlighter.h
new file mode 100644 (file)
index 0000000..df09e17
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef ANIADDSYNTAXHIGHLIGHTER_H
+#define ANIADDSYNTAXHIGHLIGHTER_H
+
+#include <QSyntaxHighlighter>
+
+class AniAddSyntaxHighlighter : public QSyntaxHighlighter
+{
+       Q_OBJECT
+public:
+       explicit AniAddSyntaxHighlighter(QObject *parent = 0);
+
+protected:
+       void highlightBlock(const QString &text);
+
+private:
+       struct HighlightingRule
+       {
+               QRegExp pattern;
+               QTextCharFormat format;
+       };
+       QVector<HighlightingRule> highlightingRules;
+
+       QRegExp commentStartExpression;
+       QRegExp commentEndExpression;
+
+       QTextCharFormat builtinVariable;
+       QTextCharFormat builtinFunction;
+       QTextCharFormat variable;
+       QTextCharFormat function;
+       QTextCharFormat comment;
+       QTextCharFormat operatorFormat;
+       QTextCharFormat string;
+       QTextCharFormat number;
+};
+
+#endif // ANIADDSYNTAXHIGHLIGHTER_H
index 0bd059ba475ee1f07a873dc9f12ea77fa54a8867..03a9f0171fa408cbc38e767a3f012c27003499e0 100644 (file)
@@ -28,7 +28,8 @@ SOURCES += main.cpp\
        registertabs.cpp \
        tabs/databaselogtab.cpp \
        tabs/clientlogtab.cpp \
-       fonts.cpp
+       fonts.cpp \
+       aniaddsyntaxhighlighter.cpp
 
 HEADERS += mainwindow.h \
        databaseconnectiondialog.h \
@@ -47,7 +48,8 @@ HEADERS += mainwindow.h \
        tabs/pendingrequesttab.h \
        tabs/databaselogtab.h \
        tabs/clientlogtab.h \
-       fonts.h
+       fonts.h \
+       aniaddsyntaxhighlighter.h
 
 FORMS += mainwindow.ui \
        databaseconnectiondialog.ui \
index 18389a1205a71428c5d0932cde2d8c1ec7cfbbe8..3671958413143519518b598f43c95f9f20ed3ea2 100644 (file)
@@ -9,6 +9,7 @@
 #include <QSqlRecord>
 
 #include "fonts.h"
+#include "anionisyntaxhighlighter.h"
 
 static const char *rulesStrAniAdd =
                "AT := [%ATr%, %ATe%, %ATk%]\n"
@@ -113,6 +114,20 @@ RenameSettingsDialog::RenameSettingsDialog(QWidget *parent) :
        ui->scriptLanguage->addItems(parsers);
        originalParserType = RenameParser::RenameEngine::ParserType(LocalMyList::instance()->settings()->get("renameLanguage").toInt());
        setParserType(originalParserType);
+
+       inputHighlighter = new AniAddSyntaxHighlighter(this);
+       resultHighlighter = new AniAddSyntaxHighlighter(this);
+       scriptHighlighter = 0;
+
+       inputHighlighter->setDocument(ui->input->document());
+       resultHighlighter->setDocument(ui->result->document());
+
+       if (parserType() == RenameParser::RenameEngine::AniAdd)
+       {
+               scriptHighlighter = new AniAddSyntaxHighlighter(this);
+               scriptHighlighter->setDocument(ui->renameScript->document());
+       }
+
 }
 
 RenameSettingsDialog::~RenameSettingsDialog()
@@ -255,6 +270,20 @@ void RenameSettingsDialog::on_scriptLanguage_currentIndexChanged()
 {
        rulesEngine->setCurrentParserType(RenameParser::RenameEngine::ParserType(ui->scriptLanguage->currentIndex()));
        on_input_textChanged();
+
+       if (parserType() == RenameParser::RenameEngine::AniAdd)
+       {
+               if (!scriptHighlighter)
+               {
+                       scriptHighlighter = new AniAddSyntaxHighlighter(this);
+                       scriptHighlighter->setDocument(ui->renameScript->document());
+               }
+       }
+       else if (scriptHighlighter)
+       {
+               delete scriptHighlighter;
+               scriptHighlighter = 0;
+       }
 }
 
 void RenameSettingsDialog::updateResult(const RenameParser::Environment &env)
index 851386ec5d63986d50a2d5c6801cf9463e7aaed7..15ff966f5148261f27965b1c8d0291204ff9b85a 100644 (file)
@@ -5,19 +5,20 @@
 #include <RenameParser/RenameEngine>
 
 namespace Ui {
-    class RenameSettingsDialog;
+       class RenameSettingsDialog;
 }
 
 class QAbstractButton;
+class AniAddSyntaxHighlighter;
 
 class RenameSettingsDialog : public QDialog
 {
-    Q_OBJECT
+       Q_OBJECT
        Q_PROPERTY(QString renameString READ renameString WRITE setRenameString)
 
 public:
-    explicit RenameSettingsDialog(QWidget *parent = 0);
-    ~RenameSettingsDialog();
+       explicit RenameSettingsDialog(QWidget *parent = 0);
+       ~RenameSettingsDialog();
 
        QString renameString() const;
        void setRenameString(const QString &renameString);
@@ -49,7 +50,7 @@ private slots:
 private:
        void updateResult(const RenameParser::Environment &env);
 
-    Ui::RenameSettingsDialog *ui;
+       Ui::RenameSettingsDialog *ui;
 
 
        RenameParser::RenameEngine *environmentEngine;
@@ -60,6 +61,10 @@ private:
        QString originalEnv;
        RenameParser::RenameEngine::ParserType originalParserType;
        QString originalScript;
+
+       AniAddSyntaxHighlighter *inputHighlighter;
+       AniAddSyntaxHighlighter *resultHighlighter;
+       AniAddSyntaxHighlighter *scriptHighlighter;
 };
 
 #endif // RENAMESETTINGSDIALOG_H