46 const QString start_pattern(
"<%1.*?/?>");
48 rule.
start = QRegularExpression(start_pattern.arg(tag));
49 rule.
end = QRegularExpression(QString(
"</%1>|<%1[^>]*?/>").arg(tag));
51 if (!parent.isEmpty())
53 QString parent_start = start_pattern.arg(parent);
54 rule.
parent = std::find_if(
rules.begin(),
rules.end(), [&](
const std::pair<int, Rule>& rule) {
55 return rule.second.start.pattern() == parent_start;
61 rules.insert(std::make_pair(
rules.size(), rule));
64 XmlSyntaxHighlighter::Rules::const_iterator
65 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
76 auto match = active->second.end.match(
text);
78 end = match.hasMatch() ? match.capturedEnd() :
text.size();
79 setFormat(
start, end, active->second.format);
82 text =
text.left(match.capturedStart());
83 next = active->second.parent;
92 for (
auto it = rules.begin(); it != rules.end(); ++it)
94 const auto& rule = it->second;
95 if (rule.parent != active)
101 auto match = rule.start.match(
text, offset);
102 if (!match.hasMatch())
105 offset = match.capturedEnd() - match.capturedStart();
106 auto result = highlight(it,
text.mid(match.capturedStart()),
start + match.capturedStart(),
true, offset);
108 offset += match.capturedStart();
111 assert(
next == active ||
next == active->second.parent);
112 assert(offset ==
text.size());
124 Rules::const_iterator active = previousBlockState() < 0 ?
rules.end() :
rules.find(previousBlockState());
126 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
131 setCurrentBlockState(active !=
rules.cend() ? active->first : -1);