aboutsummaryrefslogtreecommitdiff
path: root/desktop-utilities/lumina-textedit/syntaxSupport.h
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-utilities/lumina-textedit/syntaxSupport.h')
-rw-r--r--desktop-utilities/lumina-textedit/syntaxSupport.h42
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
bgstack15