File indexing completed on 2024-05-12 09:56:57

0001 /*
0002     SPDX-FileCopyrightText: 2007-2008 Robert Knight <robertknight@gmail.com>
0003     SPDX-FileCopyrightText: 2020 Tomaz Canabrava <tcanabrava@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "RegExpFilter.h"
0009 
0010 #include "RegExpFilterHotspot.h"
0011 
0012 using namespace Konsole;
0013 
0014 RegExpFilter::RegExpFilter()
0015     : _searchText(QRegularExpression())
0016 {
0017 }
0018 
0019 void RegExpFilter::setRegExp(const QRegularExpression &regExp)
0020 {
0021     _searchText = regExp;
0022     _searchText.optimize();
0023 }
0024 
0025 QRegularExpression RegExpFilter::regExp() const
0026 {
0027     return _searchText;
0028 }
0029 
0030 void RegExpFilter::process()
0031 {
0032     const QString *text = buffer();
0033 
0034     Q_ASSERT(text);
0035 
0036     if (!_searchText.isValid() || _searchText.pattern().isEmpty()) {
0037         return;
0038     }
0039 
0040     QRegularExpressionMatchIterator iterator(_searchText.globalMatch(*text));
0041     int prevline = 0;
0042     while (iterator.hasNext()) {
0043         QRegularExpressionMatch match(iterator.next());
0044         std::pair<int, int> start = getLineColumn(prevline, match.capturedStart());
0045         prevline = start.first;
0046         std::pair<int, int> end = getLineColumn(prevline, match.capturedEnd());
0047         prevline = end.first;
0048 
0049         QSharedPointer<HotSpot> spot(newHotSpot(start.first, start.second, end.first, end.second, match.capturedTexts()));
0050 
0051         if (spot == nullptr) {
0052             continue;
0053         }
0054 
0055         addHotSpot(spot);
0056     }
0057 }
0058 
0059 QSharedPointer<HotSpot> RegExpFilter::newHotSpot(int startLine, int startColumn, int endLine, int endColumn, const QStringList &capturedTexts)
0060 {
0061     return QSharedPointer<HotSpot>(new RegExpFilterHotSpot(startLine, startColumn, endLine, endColumn, capturedTexts));
0062 }