diff --git a/framework/src/syntaxhighlighter.cpp b/framework/src/syntaxhighlighter.cpp index e53ed1c9..de71d8bc 100644 --- a/framework/src/syntaxhighlighter.cpp +++ b/framework/src/syntaxhighlighter.cpp @@ -1,41 +1,50 @@ /* Copyright (c) 2020 Christian Mollekopf This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "syntaxhighlighter.h" #include -QVector split(QTextBoundaryFinder::BoundaryType boundary, const QString &text) +QVector split(QTextBoundaryFinder::BoundaryType boundary, const QString &text, int reasonMask) { QVector parts; QTextBoundaryFinder boundaryFinder(boundary, text); while (boundaryFinder.position() < text.length()) { const int start = boundaryFinder.position(); - const int end = boundaryFinder.toNextBoundary(); - if (end == -1) { - break; + + //Advance until we find a break that matches the mask or are at the end + for (;;) { + if (boundaryFinder.toNextBoundary() == -1) { + boundaryFinder.toEnd(); + break; + } + if (!reasonMask || boundaryFinder.boundaryReasons() & reasonMask) { + break; + } } - const int length = end - start; + + const auto length = boundaryFinder.position() - start; + if (length < 1) { continue; } parts << QStringRef{&text, start, length}; } return parts; } diff --git a/framework/src/syntaxhighlighter.h b/framework/src/syntaxhighlighter.h index 2ba791e8..770de541 100644 --- a/framework/src/syntaxhighlighter.h +++ b/framework/src/syntaxhighlighter.h @@ -1,23 +1,23 @@ /* Copyright (c) 2020 Christian Mollekopf This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #pragma once #include -QVector split(QTextBoundaryFinder::BoundaryType boundary, const QString &text); +QVector split(QTextBoundaryFinder::BoundaryType boundary, const QString &text, int reason = 0); diff --git a/framework/src/viewhighlighter.cpp b/framework/src/viewhighlighter.cpp index a03dc7c2..04a07c31 100644 --- a/framework/src/viewhighlighter.cpp +++ b/framework/src/viewhighlighter.cpp @@ -1,105 +1,105 @@ /* Copyright (c) 2018 Christian Mollekopf This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "viewhighlighter.h" #include #include #include #include #include "syntaxhighlighter.h" class Highlighter : public QSyntaxHighlighter { Q_OBJECT public: using QSyntaxHighlighter::QSyntaxHighlighter; void setSearchString(const QString &s) { mSearchString = s; rehighlight(); } protected: void highlightBlock(const QString &text) override { highlightQuotes(text); if (!mSearchString.isEmpty()) { QTextCharFormat format; format.setFontWeight(QFont::Bold); format.setBackground(QColor{"#f67400"}); QRegularExpression expression(mSearchString, QRegularExpression::CaseInsensitiveOption); auto i = expression.globalMatch(text); while (i.hasNext()) { auto match = i.next(); setFormat(match.capturedStart(), match.capturedLength(), format); } } } private: void highlightQuotes(const QString &text) { static auto quoteFormat = [] { QTextCharFormat quoteFormat; quoteFormat.setForeground(QColor{"#7f8c8d"}); return quoteFormat; }(); - for (const auto &part : split(QTextBoundaryFinder::Line, text)) { + for (const auto &part : split(QTextBoundaryFinder::Line, text, QTextBoundaryFinder::MandatoryBreak)) { if (!part.isEmpty() && part.at(0) == QChar{'>'}) { setFormat(part.position(), part.length(), quoteFormat); } } } QString mSearchString; }; struct ViewHighlighter::Private { Highlighter *searchHighligher; }; ViewHighlighter::ViewHighlighter(QObject *parent) : QObject(parent), d{new Private} { } void ViewHighlighter::setTextDocument(QQuickTextDocument *document) { if (document) { d->searchHighligher = new Highlighter{document->textDocument()}; } } void ViewHighlighter::setSearchString(const QString &s) { if (d->searchHighligher) { d->searchHighligher->setSearchString(s); } } #include "viewhighlighter.moc"