From: APTX Date: Thu, 6 Jun 2013 00:38:18 +0000 (+0200) Subject: Add syntax highlighting for AniAdd scripts. X-Git-Url: https://gitweb.tyo.aptx.org/?a=commitdiff_plain;h=8cb756a716a4489433ae84376fa1e7665715f2a0;p=localmylist.git Add syntax highlighting for AniAdd scripts. The colors are not final. --- diff --git a/localmylist-management/aniaddsyntaxhighlighter.cpp b/localmylist-management/aniaddsyntaxhighlighter.cpp new file mode 100644 index 0000000..666df08 --- /dev/null +++ b/localmylist-management/aniaddsyntaxhighlighter.cpp @@ -0,0 +1,107 @@ +#include "anionisyntaxhighlighter.h" + +#include + +#include +#include "renameutils.h" + +#include + +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 index 0000000..df09e17 --- /dev/null +++ b/localmylist-management/aniaddsyntaxhighlighter.h @@ -0,0 +1,36 @@ +#ifndef ANIADDSYNTAXHIGHLIGHTER_H +#define ANIADDSYNTAXHIGHLIGHTER_H + +#include + +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 highlightingRules; + + QRegExp commentStartExpression; + QRegExp commentEndExpression; + + QTextCharFormat builtinVariable; + QTextCharFormat builtinFunction; + QTextCharFormat variable; + QTextCharFormat function; + QTextCharFormat comment; + QTextCharFormat operatorFormat; + QTextCharFormat string; + QTextCharFormat number; +}; + +#endif // ANIADDSYNTAXHIGHLIGHTER_H diff --git a/localmylist-management/localmylist-management.pro b/localmylist-management/localmylist-management.pro index 0bd059b..03a9f01 100644 --- a/localmylist-management/localmylist-management.pro +++ b/localmylist-management/localmylist-management.pro @@ -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 \ diff --git a/localmylist-management/renamesettingsdialog.cpp b/localmylist-management/renamesettingsdialog.cpp index 18389a1..3671958 100644 --- a/localmylist-management/renamesettingsdialog.cpp +++ b/localmylist-management/renamesettingsdialog.cpp @@ -9,6 +9,7 @@ #include #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) diff --git a/localmylist-management/renamesettingsdialog.h b/localmylist-management/renamesettingsdialog.h index 851386e..15ff966 100644 --- a/localmylist-management/renamesettingsdialog.h +++ b/localmylist-management/renamesettingsdialog.h @@ -5,19 +5,20 @@ #include 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