tokenize static method

List<XmlToken> tokenize(
  1. String xmlContent
)

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;
}