qscripthighlighter.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 460 行 · 第 1/2 页

CPP
460
字号
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer 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://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qscripthighlighter_p.h"#include <QtCore/QSet>static const QSet<QString> &qscriptKeywords() {    static QSet<QString> keywords;    if (keywords.empty()) {        keywords.insert(QLatin1String("Infinity"));        keywords.insert(QLatin1String("NaN"));        keywords.insert(QLatin1String("abstract"));        keywords.insert(QLatin1String("boolean"));        keywords.insert(QLatin1String("break"));        keywords.insert(QLatin1String("byte"));        keywords.insert(QLatin1String("case"));        keywords.insert(QLatin1String("catch"));        keywords.insert(QLatin1String("char"));        keywords.insert(QLatin1String("class"));        keywords.insert(QLatin1String("const"));        keywords.insert(QLatin1String("constructor"));        keywords.insert(QLatin1String("continue"));        keywords.insert(QLatin1String("debugger"));        keywords.insert(QLatin1String("default"));        keywords.insert(QLatin1String("delete"));        keywords.insert(QLatin1String("do"));        keywords.insert(QLatin1String("double"));        keywords.insert(QLatin1String("else"));        keywords.insert(QLatin1String("enum"));        keywords.insert(QLatin1String("export"));        keywords.insert(QLatin1String("extends"));        keywords.insert(QLatin1String("false"));        keywords.insert(QLatin1String("final"));        keywords.insert(QLatin1String("finally"));        keywords.insert(QLatin1String("float"));        keywords.insert(QLatin1String("for"));        keywords.insert(QLatin1String("function"));        keywords.insert(QLatin1String("goto"));        keywords.insert(QLatin1String("if"));        keywords.insert(QLatin1String("implements"));        keywords.insert(QLatin1String("import"));        keywords.insert(QLatin1String("in"));        keywords.insert(QLatin1String("instanceof"));        keywords.insert(QLatin1String("int"));        keywords.insert(QLatin1String("interface"));        keywords.insert(QLatin1String("long"));        keywords.insert(QLatin1String("native"));        keywords.insert(QLatin1String("new"));        keywords.insert(QLatin1String("package"));        keywords.insert(QLatin1String("private"));        keywords.insert(QLatin1String("protected"));        keywords.insert(QLatin1String("public"));        keywords.insert(QLatin1String("return"));        keywords.insert(QLatin1String("short"));        keywords.insert(QLatin1String("static"));        keywords.insert(QLatin1String("super"));        keywords.insert(QLatin1String("switch"));        keywords.insert(QLatin1String("synchronized"));        keywords.insert(QLatin1String("this"));        keywords.insert(QLatin1String("throw"));        keywords.insert(QLatin1String("throws"));        keywords.insert(QLatin1String("transient"));        keywords.insert(QLatin1String("true"));        keywords.insert(QLatin1String("try"));        keywords.insert(QLatin1String("typeof"));        keywords.insert(QLatin1String("undefined"));        keywords.insert(QLatin1String("var"));        keywords.insert(QLatin1String("void"));        keywords.insert(QLatin1String("volatile"));        keywords.insert(QLatin1String("while"));        keywords.insert(QLatin1String("with"));    // end    }    return keywords;}static QSet<QChar> alphaChars() {    QSet<QChar> rc;    const QString alpha = QLatin1String("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");    foreach (QChar chr, alpha)        rc.insert(chr);    return rc;}namespace qdesigner_internal {QScriptHighlighter::QScriptHighlighter(QTextDocument *parent)    : QSyntaxHighlighter(parent){    m_numberFormat.setForeground(Qt::blue);    m_stringFormat.setForeground(Qt::darkGreen);    m_typeFormat.setForeground(Qt::darkMagenta);    m_keywordFormat.setForeground(Qt::darkYellow);    m_labelFormat.setForeground(Qt::darkRed);    m_commentFormat.setForeground(Qt::red);    //m_commentFormat.setFontFamily("times");    m_commentFormat.setFontItalic(true);    m_preProcessorFormat.setForeground(Qt::darkBlue);}void QScriptHighlighter::highlightBlock(const QString &text){    // states    enum {        StateStandard,        StateCommentStart1,        StateCCommentStart2,        StateCppCommentStart2,        StateCComment,        StateCppComment,        StateCCommentEnd1,        StateCCommentEnd2,        StateStringStart,        StateString,        StateStringEnd,        StateString2Start,        StateString2,        StateString2End,        StateNumber,        StatePreProcessor,        NumStates    };    // tokens    enum {        InputAlpha,        InputNumber,        InputAsterix,        InputSlash,        InputParen,        InputSpace,        InputHash,        InputQuotation,        InputApostrophe,        InputSep,        NumInputs    };    static const uchar table[NumStates][NumInputs] = {        { StateStandard,      StateNumber,     StateStandard,       StateCommentStart1,    StateStandard,   StateStandard,   StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateStandard        { StateStandard,      StateNumber,   StateCCommentStart2, StateCppCommentStart2, StateStandard,   StateStandard,   StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateCommentStart1        { StateCComment,      StateCComment,   StateCCommentEnd1,   StateCComment,         StateCComment,   StateCComment,   StateCComment,     StateCComment,    StateCComment,     StateCComment }, // StateCCommentStart2        { StateCppComment,    StateCppComment, StateCppComment,     StateCppComment,       StateCppComment, StateCppComment, StateCppComment,   StateCppComment,  StateCppComment,   StateCppComment }, // CppCommentStart2        { StateCComment,      StateCComment,   StateCCommentEnd1,   StateCComment,         StateCComment,   StateCComment,   StateCComment,     StateCComment,    StateCComment,     StateCComment }, // StateCComment        { StateCppComment,    StateCppComment, StateCppComment,     StateCppComment,       StateCppComment, StateCppComment, StateCppComment,   StateCppComment,  StateCppComment,   StateCppComment }, // StateCppComment        { StateCComment,      StateCComment,   StateCCommentEnd1,   StateCCommentEnd2,     StateCComment,   StateCComment,   StateCComment,     StateCComment,    StateCComment,     StateCComment }, // StateCCommentEnd1        { StateStandard,      StateNumber,     StateStandard,       StateCommentStart1,    StateStandard,   StateStandard,   StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateCCommentEnd2        { StateString,        StateString,     StateString,         StateString,           StateString,     StateString,     StateString,       StateStringEnd,   StateString,       StateString }, // StateStringStart        { StateString,        StateString,     StateString,         StateString,           StateString,     StateString,     StateString,       StateStringEnd,   StateString,       StateString }, // StateString        { StateStandard,      StateStandard,   StateStandard,       StateCommentStart1,    StateStandard,   StateStandard,   StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateStringEnd        { StateString2,       StateString2,    StateString2,        StateString2,          StateString2,    StateString2,    StateString2,      StateString2,     StateString2End,   StateString2 }, // StateString2Start        { StateString2,       StateString2,    StateString2,        StateString2,          StateString2,    StateString2,    StateString2,      StateString2,     StateString2End,   StateString2 }, // StateString2        { StateStandard,      StateStandard,   StateStandard,       StateCommentStart1,    StateStandard,   StateStandard,   StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateString2End        { StateNumber,        StateNumber,     StateStandard,       StateCommentStart1,    StateStandard,   StateStandard,   StatePreProcessor, StateStringStart, StateString2Start, StateStandard }, // StateNumber        { StatePreProcessor,  StateStandard,   StateStandard,       StateCommentStart1,    StateStandard,   StateStandard,   StatePreProcessor, StateStringStart, StateString2Start, StateStandard } // StatePreProcessor    };    QString buffer;    buffer.reserve(text.length());    QTextCharFormat emptyFormat;    int state = StateStandard;    const int previousState = previousBlockState();    if (previousState != -1)        state = previousState;    if (text.isEmpty()) {        setCurrentBlockState(previousState);        return;    }    int input = -1;    int i = 0;    bool lastWasBackSlash = false;    bool makeLastStandard = false;    static const QSet<QChar> alphabeth = alphaChars();    static const QString mathChars = QString::fromLatin1("xXeE");    static const QString numbers = QString::fromLatin1("0123456789");    bool questionMark = false;    QChar lastChar;    QString firstWord;    forever {        const QChar c = text.at(i);        if (lastWasBackSlash) {            input = InputSep;        } else {            switch (c.toLatin1()) {                case '*':                    input = InputAsterix;                    break;                case '/':                    input = InputSlash;                    break;                case '(': case '[': case '{':                    input = InputParen;                    if (state == StateStandard

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?