Files
sqlitebrowser/src/SQLiteSyntaxHighlighter.cpp
2013-01-02 19:01:47 +01:00

108 lines
4.6 KiB
C++

#include "SQLiteSyntaxHighlighter.h"
SQLiteSyntaxHighlighter::SQLiteSyntaxHighlighter(QTextDocument *parent) :
QSyntaxHighlighter(parent)
{
HighlightingRule rule;
tableFormat.setForeground(Qt::darkCyan);
tableFormat.setFontWeight(QFont::Bold);
keywordFormat.setForeground(Qt::darkBlue);
keywordFormat.setFontWeight(QFont::Bold);
QStringList keywordPatterns;
keywordPatterns
<< "\\bREINDEX\\b" << "\\bINDEXED\\b" << "\\bINDEX\\b"
<< "\\bDESC\\b" << "\\bESCAPE\\b" << "\\bEACH\\b"
<< "\\bCHECK\\b" << "\\bKEY\\b" << "\\bBEFORE\\b"
<< "\\bFOREIGN\\b" << "\\bFOR\\b" << "\\bIGNORE\\b"
<< "\\bREGEXP\\b" << "\\bEXPLAIN\\b" << "\\bINSTEAD\\b"
<< "\\bADD\\b" << "\\bDATABASE\\b" << "\\bAS\\b"
<< "\\bSELECT\\b" << "\\bTABLE\\b" << "\\bLEFT\\b"
<< "\\bTHEN\\b" << "\\bEND\\b" << "\\bDEFERRABLE\\b"
<< "\\bELSE\\b" << "\\bEXCEPT\\b" << "\\bTRANSACTION\\b"
<< "\\bACTION\\b" << "\\bON\\b" << "\\bNATURAL\\b"
<< "\\bALTER\\b" << "\\bRAISE\\b" << "\\bEXCLUSIVE\\b"
<< "\\bEXISTS\\b" << "\\bSAVEPOINT\\b" << "\\bINTERSECT\\b"
<< "\\bTRIGGER\\b" << "\\bREFERENCES\\b" << "\\bCONSTRAINT\\b"
<< "\\bINTO\\b" << "\\bOFFSET\\b" << "\\bOF\\b"
<< "\\bSET\\b" << "\\bTEMPORARY\\b" << "\\bTEMP\\b"
<< "\\bOR\\b" << "\\bUNIQUE\\b" << "\\bQUERY\\b"
<< "\\bATTACH\\b" << "\\bHAVING\\b" << "\\bGROUP\\b"
<< "\\bUPDATE\\b" << "\\bBEGIN\\b" << "\\bINNER\\b"
<< "\\bRELEASE\\b" << "\\bBETWEEN\\b" << "\\bNOTNULL\\b"
<< "\\bNOT\\b" << "\\bNO\\b" << "\\bNULL\\b"
<< "\\bLIKE\\b" << "\\bCASCADE\\b" << "\\bASC\\b"
<< "\\bDELETE\\b" << "\\bCASE\\b" << "\\bCOLLATE\\b"
<< "\\bCREATE\\b" << "\\bCURRENT_DATE\\b" << "\\bDETACH\\b"
<< "\\bIMMEDIATE\\b" << "\\bJOIN\\b" << "\\bINSERT\\b"
<< "\\bMATCH\\b" << "\\bPLAN\\b" << "\\bANALYZE\\b"
<< "\\bPRAGMA\\b" << "\\bABORT\\b" << "\\bVALUES\\b"
<< "\\bVIRTUAL\\b" << "\\bLIMIT\\b" << "\\bWHEN\\b"
<< "\\bWHERE\\b" << "\\bRENAME\\b" << "\\bAFTER\\b"
<< "\\bREPLACE\\b" << "\\bAND\\b" << "\\bDEFAULT\\b"
<< "\\bAUTOINCREMENT\\b" << "\\bTO\\b" << "\\bIN\\b"
<< "\\bCAST\\b" << "\\bCOLUMN\\b" << "\\bCOMMIT\\b"
<< "\\bCONFLICT\\b" << "\\bCROSS\\b" << "\\bCURRENT_TIMESTAMP\\b"
<< "\\bCURRENT_TIME\\b" << "\\bPRIMARY\\b" << "\\bDEFERRED\\b"
<< "\\bDISTINCT\\b" << "\\bIS\\b" << "\\bDROP\\b"
<< "\\bFAIL\\b" << "\\bFROM\\b" << "\\bFULL\\b"
<< "\\bGLOB\\b" << "\\bBY\\b" << "\\bIF\\b"
<< "\\bISNULL\\b" << "\\bORDER\\b" << "\\bRESTRICT\\b"
<< "\\bOUTER\\b" << "\\bRIGHT\\b" << "\\bROLLBACK\\b"
<< "\\bROW\\b" << "\\bUNION\\b"
<< "\\bUSING\\b" << "\\bVACUUM\\b" << "\\bVIEW\\b"
<< "\\bINITIALLY\\b" << "\\bALL\\b" << "\\bSELECT\\b";
foreach (const QString &pattern, keywordPatterns) {
rule.pattern = QRegExp(pattern);
rule.pattern.setCaseSensitivity(Qt::CaseInsensitive);
rule.format = keywordFormat;
highlightingRules.append(rule);
}
singleLineCommentFormat.setForeground(Qt::darkGreen);
rule.pattern = QRegExp("--[^\n]*");
rule.format = singleLineCommentFormat;
highlightingRules.append(rule);
quotationFormat.setForeground(Qt::red);
rule.pattern = QRegExp("\".*\"");
rule.format = quotationFormat;
highlightingRules.append(rule);
rule.pattern = QRegExp("'.*'");
rule.format = quotationFormat;
highlightingRules.append(rule);
}
void SQLiteSyntaxHighlighter::setTableNames(const QStringList &tablenames)
{
tableNameRules.clear();
foreach(const QString& tblname, tablenames) {
HighlightingRule rule;
rule.pattern = QRegExp(tblname);
rule.format = tableFormat;
tableNameRules.append(rule);
}
}
void SQLiteSyntaxHighlighter::highlightBlockVector(const QString& text, const QVector<HighlightingRule>& vec)
{
foreach (const HighlightingRule &rule, vec) {
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);
}
}
}
void SQLiteSyntaxHighlighter::highlightBlock(const QString &text)
{
highlightBlockVector(text, tableNameRules);
highlightBlockVector(text, highlightingRules);
}