Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Highlighting multiline text in quotes
Forum Updated to NodeBB v4.3 + New Features

Highlighting multiline text in quotes

Scheduled Pinned Locked Moved Unsolved General and Desktop
9 Posts 2 Posters 754 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    MyNick 0
    wrote on last edited by Christian Ehrlicher
    #1

    Code:

    quotationFormat.setForeground(Qt::darkGreen);
    rule.pattern = QRegularExpression(QStringLiteral("\".*\""));
    rule.format = quotationFormat;
    highlightingRules.append(rule);
    

    highlights text only to the end of the line.
    How to make any number of lines highlighted?

    JonBJ 1 Reply Last reply
    0
    • M MyNick 0

      Code:

      quotationFormat.setForeground(Qt::darkGreen);
      rule.pattern = QRegularExpression(QStringLiteral("\".*\""));
      rule.format = quotationFormat;
      highlightingRules.append(rule);
      

      highlights text only to the end of the line.
      How to make any number of lines highlighted?

      JonBJ Online
      JonBJ Online
      JonB
      wrote on last edited by JonB
      #2

      @MyNick-0
      Difficult to know when the types of quotationFormat and highlightingRules are not mentioned....

      In the absence of that, regular expression for that is usually

      QStringLiteral("\"(.|\\n)*\"")
      

      Or you can use the QRegularExpression::DotMatchesEverythingOption option from https://doc.qt.io/qt-5/qregularexpression.html#PatternOption-enum as an argument to QRegularExpression() and stick with your original pattern.

      1 Reply Last reply
      1
      • M Offline
        M Offline
        MyNick 0
        wrote on last edited by
        #3

        this expression doesn't work for me.

        You need to highlight several lines of subrad, for example:
        "str 1
        str 2
        str 3"

        JonBJ 1 Reply Last reply
        0
        • M MyNick 0

          this expression doesn't work for me.

          You need to highlight several lines of subrad, for example:
          "str 1
          str 2
          str 3"

          JonBJ Online
          JonBJ Online
          JonB
          wrote on last edited by JonB
          #4

          @MyNick-0 said in Highlighting multiline text in quotes:

          this expression doesn't work for me.

          Who knows, since you still don't give any context....

          Try matching the regular expression I gave you against a C string like "Hello\\nGoodbye\\nForever".

          1 Reply Last reply
          0
          • M Offline
            M Offline
            MyNick 0
            wrote on last edited by
            #5

            i have code from documentation:

            #include "highlighter.h"
            
            Highlighter::Highlighter(QTextDocument *parent)
                : QSyntaxHighlighter(parent)
            {
                HighlightingRule rule;
            
                //functionFormat.setFontItalic(true);
                //functionFormat.setFontWeight(QFont::Bold);
                functionFormat.setForeground(QColor(00, 00, 00));
                rule.pattern = QRegularExpression(QStringLiteral("\\b[A-Za-z0-9_]+(?=\\()"));
                rule.format = functionFormat;
                highlightingRules.append(rule);
            
                keywordFormat.setForeground(QColor(00, 80, 80));
                keywordFormat.setFontWeight(QFont::Bold);
                const QString keywordPatternsC[] = {
                    QStringLiteral("\\becho\\b"), QStringLiteral("\\bclass\\b"), QStringLiteral("\\bconst\\b"),
                    QStringLiteral("\\bdouble\\b"), QStringLiteral("\\benum\\b"), QStringLiteral("\\bexplicit\\b"),
                    QStringLiteral("\\bfriend\\b"), QStringLiteral("\\binline\\b"), QStringLiteral("\\bint\\b"),
                    QStringLiteral("\\blong\\b"), QStringLiteral("\\bnamespace\\b"), QStringLiteral("\\boperator\\b"),
                    QStringLiteral("\\bprivate\\b"), QStringLiteral("\\bprotected\\b"), QStringLiteral("\\bpublic\\b"),
                    QStringLiteral("\\bshort\\b"), QStringLiteral("\\bsignals\\b"), QStringLiteral("\\bsigned\\b"),
                    QStringLiteral("\\bslots\\b"), QStringLiteral("\\bstatic\\b"), QStringLiteral("\\bstruct\\b"),
                    QStringLiteral("\\btemplate\\b"), QStringLiteral("\\btypedef\\b"), QStringLiteral("\\btypename\\b"),
                    QStringLiteral("\\bunion\\b"), QStringLiteral("\\bunsigned\\b"), QStringLiteral("\\bvirtual\\b"),
                    QStringLiteral("\\bvoid\\b"), QStringLiteral("\\bvolatile\\b"), QStringLiteral("\\bbool\\b")
                };
                for (const QString &pattern : keywordPatterns) {
                    rule.pattern = QRegularExpression(pattern);
                    rule.format = keywordFormat;
                    highlightingRules.append(rule);
                }
            
                classFormat.setFontWeight(QFont::Bold);
                classFormat.setForeground(Qt::darkMagenta);
                rule.pattern = QRegularExpression(QStringLiteral("\\bQ[A-Za-z]+\\b"));
                rule.format = classFormat;
                highlightingRules.append(rule);
            
                quotationFormat.setForeground(QColor(80, 00, 00));//Qt::darkGreen
                rule.pattern = QRegularExpression(QStringLiteral("\"(.|\\n)*\""));
                rule.format = quotationFormat;
                highlightingRules.append(rule);
            
                singleLineCommentFormat.setForeground(Qt::gray);
                rule.pattern = QRegularExpression(QStringLiteral("#[^\n]*|//[^\n]*"));//"//[^\n]*"
                rule.format = singleLineCommentFormat;
                highlightingRules.append(rule);
            
                multiLineCommentFormat.setForeground(Qt::gray);
            
                commentStartExpression = QRegularExpression(QStringLiteral("/\\*"));
                commentEndExpression = QRegularExpression(QStringLiteral("\\*/"));
            }
            
            void Highlighter::highlightBlock(const QString &text)
            {
                for (const HighlightingRule &rule : qAsConst(highlightingRules)) {
                    QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text);
                    while (matchIterator.hasNext()) {
                        QRegularExpressionMatch match = matchIterator.next();
                        setFormat(match.capturedStart(), match.capturedLength(), rule.format);
                    }
                }
                setCurrentBlockState(0);
            
                int startIndex = 0;
                if (previousBlockState() != 1)
                    startIndex = text.indexOf(commentStartExpression);
            
                while (startIndex >= 0) {
                    QRegularExpressionMatch match = commentEndExpression.match(text, startIndex);
                    int endIndex = match.capturedStart();
                    int commentLength = 0;
                    if (endIndex == -1) {
                        setCurrentBlockState(1);
                        commentLength = text.length() - startIndex;
                    } else {
                        commentLength = endIndex - startIndex
                                        + match.capturedLength();
                    }
                    setFormat(startIndex, commentLength, multiLineCommentFormat);
                    startIndex = text.indexOf(commentStartExpression, startIndex + commentLength);
                }
            }
            

            And I use it like this:

            highlighter = new Highlighter(textEdit->document());
            
            1 Reply Last reply
            0
            • M Offline
              M Offline
              MyNick 0
              wrote on last edited by
              #6

              My operating system, Windows 7 x64

              JonBJ 1 Reply Last reply
              0
              • M MyNick 0

                My operating system, Windows 7 x64

                JonBJ Online
                JonBJ Online
                JonB
                wrote on last edited by
                #7

                @MyNick-0
                This is a lot of code. I don't know why/whether the multiline does not work for you. I gave you the correct regular expression for you to test out. It's your job to reduce the code to minimal if you are having a problem.

                Meanwhile, your "#[^\n]*|//[^\n]*" at least is wrong, I don't know whether that has any effect.

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  MyNick 0
                  wrote on last edited by
                  #8

                  i am using regex you gave me here:

                  quotationFormat.setForeground(QColor(80, 00, 00));
                  rule.pattern = QRegularExpression(QStringLiteral("\"(.|\\n)*\""));
                  rule.format = quotationFormat;
                  highlightingRules.append(rule);
                  
                  JonBJ 1 Reply Last reply
                  0
                  • M MyNick 0

                    i am using regex you gave me here:

                    quotationFormat.setForeground(QColor(80, 00, 00));
                    rule.pattern = QRegularExpression(QStringLiteral("\"(.|\\n)*\""));
                    rule.format = quotationFormat;
                    highlightingRules.append(rule);
                    
                    JonBJ Online
                    JonBJ Online
                    JonB
                    wrote on last edited by JonB
                    #9

                    @MyNick-0
                    I don't know about the behaviour of QSyntaxHighlighter which you have now started mentioning, not mentioned in your topic title or original question. The regular expression I gave should be right as a regular expression.

                    However, in your case of wanting leading & trailing " characters, and * being greedy, you would probably want something more like (even if it works)

                    "\"([^\"]|\\n)*\""
                    

                    Even then it won't work right if your C literal string contain any embedded \" sequences....

                    Start by removing all your code except for this one and only one rule, while you see its behaviour/debug. Test that the reg ex I have given you does work against a multiline string, independent of anything to do with QSyntaxHighlighter.

                    Then, I think but don't know, read carefully what https://doc.qt.io/qt-5/qsyntaxhighlighter.html#details says:

                    Some syntaxes can have constructs that span several text blocks. For example, a C++ syntax highlighter should be able to cope with /*...*/ multiline comments. To deal with these cases it is necessary to know the end state of the previous text block (e.g. "in comment").

                    Since the quoted-string-multiline-format is similar to the C-comment-multiline-format, and the same code you are copying from has special code for that which does not use newline-in-regular-experssion, I'm guessing you need to implement multiline string in an analogous way to how that implements the code for its multiLineCommentFormat? It says:

                    But the multiline comment needs special care due to the design of the QSyntaxHighlighter class.

                    1 Reply Last reply
                    0

                    • Login

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Categories
                    • Recent
                    • Tags
                    • Popular
                    • Users
                    • Groups
                    • Search
                    • Get Qt Extensions
                    • Unsolved