tokenize static method
Tokenizes XML for syntax highlighting. Returns a list of XmlToken objects.
Implementation
static List<XmlToken> tokenize(String xmlContent) {
final tokens = <XmlToken>[];
final pattern = RegExp(
r'(<!--.*?-->)|' // comment
r'(<\?[^?]*\?>)|' // processing instruction
r'(</[a-zA-Z:_][^\s>]*>)|' // closing tag
r'(<[a-zA-Z:_][^\s>/]*)' // opening tag start
r'|(/>)|' // self-close
r'|(>)|' // close bracket
r'(\s[a-zA-Z:_][^\s=]*)=' // attribute name
r'("([^"]*)")|' // attribute value
r"('([^']*)')|" // attribute value single-quote
r'([^<]+)', // text content
dotAll: true,
);
for (final m in pattern.allMatches(xmlContent)) {
if (m.group(1) != null) {
tokens.add(XmlToken(XmlTokenType.comment, m.group(1)!));
} else if (m.group(2) != null) {
tokens.add(XmlToken(XmlTokenType.processing, m.group(2)!));
} else if (m.group(3) != null) {
tokens.add(XmlToken(XmlTokenType.closingTag, m.group(3)!));
} else if (m.group(4) != null) {
tokens.add(XmlToken(XmlTokenType.openingTag, m.group(4)!));
} else if (m.group(5) != null) {
tokens.add(XmlToken(XmlTokenType.selfClose, '/>'));
} else if (m.group(6) != null) {
tokens.add(XmlToken(XmlTokenType.bracket, '>'));
} else if (m.group(7) != null) {
tokens.add(XmlToken(XmlTokenType.attributeName, m.group(7)!));
if (m.group(8) != null) {
tokens.add(XmlToken(XmlTokenType.attributeValue, m.group(8)!));
} else if (m.group(10) != null) {
tokens.add(XmlToken(XmlTokenType.attributeValue, m.group(10)!));
}
} else if (m.group(12) != null) {
tokens.add(XmlToken(XmlTokenType.text, m.group(12)!));
}
}
return tokens;
}