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));
 
   66 XmlSyntaxHighlighter::Rules::const_iterator
 
   67 XmlSyntaxHighlighter::highlight(Rules::const_iterator active, QStringRef 
text, 
int start, 
bool search_end, 
int& end)
 
   74     auto match = active->second.end.match(
text);
 
   76     end = match.hasMatch() ? match.capturedEnd() : 
text.size();
 
   77     setFormat(start, end, active->second.format);
 
   80       text = 
text.left(match.capturedStart());  
 
   81       next = active->second.parent;
 
   90   for (
auto it = rules.begin(); it != rules.end(); ++it)
 
   92     const auto& rule = it->second;
 
   93     if (rule.parent != active)
 
   99       auto match = rule.start.match(
text, offset);
 
  100       if (!match.hasMatch())
 
  103       offset = match.capturedEnd() - match.capturedStart();  
 
  104       auto result = highlight(it, 
text.mid(match.capturedStart()), start + match.capturedStart(), 
true, offset);
 
  106       offset += match.capturedStart();
 
  109         assert(next == active || next == active->second.parent);
 
  110         assert(offset == 
text.size());  
 
  122   Rules::const_iterator active = previousBlockState() < 0 ? rules.end() : rules.find(previousBlockState());
 
  124   active = highlight(active, QStringRef(&
text, 0, 
text.size()), 0, active != rules.cend(), unused);
 
  125   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)