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;
61 rule.parent = rules_.end();
63 rules_.insert(std::make_pair(rules_.size(), rule));
66XmlSyntaxHighlighter::Rules::const_iterator
67XmlSyntaxHighlighter::highlight(Rules::const_iterator active, QStringView text,
int start,
bool search_end,
int& end)
74#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
75 auto match = active->second.end.matchView(text);
77 auto match = active->second.end.match(text);
80 end = match.hasMatch() ? match.capturedEnd() : text.size();
81 setFormat(start, end, active->second.format);
84 text = text.left(match.capturedStart());
85 next = active->second.parent;
94 for (
auto it = rules_.begin(); it != rules_.end(); ++it)
96 const auto& rule = it->second;
97 if (rule.parent != active)
103#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
104 auto match = rule.start.matchView(text, offset);
106 auto match = rule.start.match(text, offset);
108 if (!match.hasMatch())
111 offset = match.capturedEnd() - match.capturedStart();
112 auto result = highlight(it,
text.mid(match.capturedStart()), start + match.capturedStart(),
true, offset);
114 offset += match.capturedStart();
117 assert(next == active || next == active->second.parent);
118 assert(offset ==
text.size());
130 Rules::const_iterator active = previousBlockState() < 0 ? rules_.end() : rules_.find(previousBlockState());
132 active = highlight(active, QStringView(text), 0, active != rules_.cend(), unused);
133 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)