diff options
Diffstat (limited to 'desktop-utilities/lumina-textedit/syntaxSupport.h')
-rw-r--r-- | desktop-utilities/lumina-textedit/syntaxSupport.h | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/desktop-utilities/lumina-textedit/syntaxSupport.h b/desktop-utilities/lumina-textedit/syntaxSupport.h index e8944aa4..a4f36822 100644 --- a/desktop-utilities/lumina-textedit/syntaxSupport.h +++ b/desktop-utilities/lumina-textedit/syntaxSupport.h @@ -12,15 +12,23 @@ #include <QTextCharFormat> #include <QString> +//Simple syntax rules struct SyntaxRule{ QRegExp pattern; QTextCharFormat format; }; +//Complicated/multi-line rules +struct SyntaxRuleSplit{ + QRegExp startPattern, endPattern; + QTextCharFormat format; +}; class Custom_Syntax : public QSyntaxHighlighter{ Q_OBJECT private: QVector<SyntaxRule> rules; + QVector<SyntaxRuleSplit> splitrules; + public: Custom_Syntax(QTextDocument *parent = 0) : QSyntaxHighlighter(parent){ } @@ -39,7 +47,39 @@ protected: setFormat(index, len, rules[i].format); index = patt.indexIn(text, index+len); //go to the next match } - } + }//end loop over normal (single-line) patterns + //Now look for any multi-line patterns (starting/continuing/ending) + int start = 0; + int splitactive = previousBlockState(); + if(splitactive>splitrules.length()-1){ splitactive = -1; } //just in case + while(start>=0 && start<text.length()-1){ + //qDebug() << "split check:" << start << splitactive; + if(splitactive>=0){ + //Find the end of the current rule + int end = splitrules[splitactive].endPattern.indexIn(text, start); + if(end==-1){ + //rule did not finish - apply to all + setFormat(start, text.length()-start, splitrules[splitactive].format); + break; //stop looking for more multi-line patterns + }else{ + //Found end point + int len = end-start+splitrules[splitactive].endPattern.matchedLength(); + setFormat(start, len , splitrules[splitactive].format); + start+=len; //move pointer to the end of handled range + splitactive = -1; //done with this rule + } + } //end check for end match + //Look for the start of any new split rule + for(int i=0; i<splitrules.length() && splitactive<0; i++){ + int newstart = splitrules[i].startPattern.indexIn(text,start); + if(newstart>=start){ + splitactive = i; + start = newstart; + } + } + if(splitactive<0){ break; } //no other rules found - go ahead and exit the loop + } + setCurrentBlockState(splitactive); } }; #endif
\ No newline at end of file |