X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=src%2Fhighlighter.cpp;fp=src%2Fhighlighter.cpp;h=99374c3177babb7c4fe3457215b697ad0887d04a;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=0000000000000000000000000000000000000000;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/src/highlighter.cpp b/src/highlighter.cpp new file mode 100644 index 0000000..99374c3 --- /dev/null +++ b/src/highlighter.cpp @@ -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 + +#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); + } +}