48 const QString start_pattern(
"<%1.*?/?>");
50 rule.start = QRegularExpression(start_pattern.arg(tag));
51 rule.end = QRegularExpression(QString(
"</%1>|<%1[^>]*?/>").arg(tag));
53 if (!parent.isEmpty())
55 QString parent_start = start_pattern.arg(parent);
56 rule.parent = std::find_if(rules_.begin(), rules_.end(), [&](
const std::pair<int, Rule>& rule) {
57 return rule.second.start.pattern() == parent_start;
62 rule.parent = rules_.end();
65 rules_.insert(std::make_pair(rules_.size(), rule));
68XmlSyntaxHighlighter::Rules::const_iterator
69XmlSyntaxHighlighter::highlight(Rules::const_iterator active, QStringView text,
int start,
bool search_end,
int& end)
76#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
77 auto match = active->second.end.matchView(text);
79 auto match = active->second.end.match(text);
82 end = match.hasMatch() ? match.capturedEnd() : text.size();
83 setFormat(start, end, active->second.format);
86 text = text.left(match.capturedStart());
87 next = active->second.parent;
96 for (
auto it = rules_.begin(); it != rules_.end(); ++it)
98 const auto& rule = it->second;
99 if (rule.parent != active)
105#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
106 auto match = rule.start.matchView(text, offset);
108 auto match = rule.start.match(text, offset);
110 if (!match.hasMatch())
113 offset = match.capturedEnd() - match.capturedStart();
114 auto result = highlight(it,
text.mid(match.capturedStart()), start + match.capturedStart(),
true, offset);
116 offset += match.capturedStart();
119 assert(next == active || next == active->second.parent);
120 assert(offset ==
text.size());
132 Rules::const_iterator active = previousBlockState() < 0 ? rules_.end() : rules_.find(previousBlockState());
134 active = highlight(active, QStringView(text), 0, active != rules_.cend(), unused);
135 setCurrentBlockState(active != rules_.cend() ? active->first : -1);
void highlightBlock(const QString &text) override
void addTag(const QString &tag, const QTextCharFormat &format, const QString &parent=QString())
XmlSyntaxHighlighter(QTextDocument *parent=nullptr)