]> git.sven.stormbind.net Git - sven/vym.git/blobdiff - src/highlighter.cpp
New upstream version 2.9.22
[sven/vym.git] / src / highlighter.cpp
diff --git a/src/highlighter.cpp b/src/highlighter.cpp
new file mode 100644 (file)
index 0000000..99374c3
--- /dev/null
@@ -0,0 +1,137 @@
+/****************************************************************************
+**
+** Copyright (C) 2005-2006 Trolltech ASA. All rights reserved.
+**
+** This file is part of the example classes of the Qt Toolkit.
+**
+** This file may be used under the terms of the GNU General Public
+** License version 2.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of
+** this file.  Please review the following information to ensure GNU
+** General Public Licensing requirements will be met:
+** http://www.trolltech.com/products/qt/opensource.html
+**
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://www.trolltech.com/products/qt/licensing.html or contact the
+** sales department at sales@trolltech.com.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+****************************************************************************/
+
+// highlighting rules have been adapted by Uwe Drechsel to match vym syntax
+
+#include <QtGui>
+
+#include "highlighter.h"
+
+extern bool usingDarkTheme;
+
+Highlighter::Highlighter(QTextDocument *parent) : QSyntaxHighlighter(parent)
+{
+
+    HighlightingRule rule;
+
+    if (usingDarkTheme)
+        keywordFormat.setForeground(Qt::cyan);
+    else
+        keywordFormat.setForeground(Qt::darkBlue);
+
+    keywordFormat.setFontWeight(QFont::Bold);
+
+    // QT keywords
+    /*
+    classFormat.setFontWeight(QFont::Bold);
+    classFormat.setForeground(Qt::darkMagenta);
+    rule.pattern = QRegExp("\\bQ[A-Za-z]+\\b");
+    rule.format = classFormat;
+    highlightingRules.append(rule);
+    */
+
+    // Single line comments
+    if (usingDarkTheme)
+        singleLineCommentFormat.setForeground(Qt::magenta);
+    else
+        singleLineCommentFormat.setForeground(Qt::darkMagenta);
+    rule.pattern = QRegExp("//[^\n]*");
+    rule.format = singleLineCommentFormat;
+    highlightingRules.append(rule);
+
+    // multiline comments
+    if (usingDarkTheme)
+        multiLineCommentFormat.setForeground(Qt::magenta);
+    else
+        multiLineCommentFormat.setForeground(Qt::darkMagenta);
+    commentStartExpression = QRegExp("/\\*");
+    commentEndExpression = QRegExp("\\*/");
+
+    // Quotations
+    quotationFormat.setForeground(Qt::red);
+    rule.pattern = QRegExp("\".*\"");
+    rule.format = quotationFormat;
+    highlightingRules.append(rule);
+
+    QStringList valuePatterns;
+    valuePatterns << "\\btrue\\b"
+                  << "\\bfalse\\b";
+    foreach (QString pattern, valuePatterns) {
+        rule.pattern = QRegExp(pattern);
+        rule.format = quotationFormat;
+        highlightingRules.append(rule);
+    }
+
+    // Funtions
+    /*
+    functionFormat.setFontItalic(true);
+    functionFormat.setForeground(Qt::blue);
+    rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()");
+    rule.format = functionFormat;
+    highlightingRules.append(rule);
+    */
+}
+
+void Highlighter::addKeywords(const QStringList &list)
+{
+    HighlightingRule rule;
+    foreach (QString pattern, list) {
+        rule.pattern = QRegExp(pattern);
+        rule.format = keywordFormat;
+        highlightingRules.append(rule);
+    }
+}
+
+void Highlighter::highlightBlock(const QString &text)
+{
+    foreach (HighlightingRule rule, highlightingRules) {
+        QRegExp expression(rule.pattern);
+        int index = text.indexOf(expression);
+        while (index >= 0) {
+            int length = expression.matchedLength();
+            setFormat(index, length, rule.format);
+            index = text.indexOf(expression, index + length);
+        }
+    }
+    setCurrentBlockState(0);
+
+    int startIndex = 0;
+    if (previousBlockState() != 1)
+        startIndex = text.indexOf(commentStartExpression);
+
+    while (startIndex >= 0) {
+        int endIndex = text.indexOf(commentEndExpression, startIndex);
+        int commentLength;
+        if (endIndex == -1) {
+            setCurrentBlockState(1);
+            commentLength = text.length() - startIndex;
+        }
+        else {
+            commentLength =
+                endIndex - startIndex + commentEndExpression.matchedLength();
+        }
+        setFormat(startIndex, commentLength, multiLineCommentFormat);
+        startIndex =
+            text.indexOf(commentStartExpression, startIndex + commentLength);
+    }
+}