parse method

List<TextSpan> parse()

Converts HTML content to a list of TextSpan objects

Implementation

List<TextSpan> parse() {
  List<TextSpan> spans = List.empty(growable: true);
  _events.forEach((event) {
    if (event is xmle.XmlStartElementEvent) {
      if (!event.isSelfClosing) {
        var styles = "";
        if (event.name == 'b' || event.name == 'strong') {
          styles = "font-weight: bold;";
        } else if (event.name == 'i' || event.name == 'em') {
          styles = "font-style: italic;";
        } else if (event.name == 'u') {
          styles = "text-decoration: underline;";
        } else if (event.name == 'strike' ||
            event.name == 'del' ||
            event.name == 's') {
          styles = "text-decoration: line-through;";
        } else if (event.name == 'a') {
          styles = "visit_link:__#TO_GET#__;text-decoration: underline; color: #0000ff";
        }

        if (event.name == 'tgYellow') {
          styles = 'background:#FFFF00';
        } else if (event.name == 'tgCyan') {
          styles = 'background:#00FFFF';
        } else if (event.name == 'tgPink') {
          styles = 'background:#FF69B4';
        } else if (event.name == 'tgGreen') {
          styles = 'background:#90EE90';
        } else if (event.name == 'tgOrange') {
          styles = 'background:#FFA07A';
        } else if (event.name == 'tgLilac') {
          styles = 'background:#DDA0DD';
        }

        for (var attribute in event.attributes) {
          if (attribute.name == "style") {
            styles = "$styles;${attribute.value}";
          } else if (attribute.name == "href") {
            styles = styles.replaceFirst(r"__#TO_GET#__",
                attribute.value.replaceAll(r":", "__#COLON#__"));
          }
        }

        _stack.add(_Tag(event.name, styles));
      } else {
        if (event.name == "br") {
          spans.add(const TextSpan(text: "\n"));
        }
      }
    }

    if (event is xmle.XmlEndElementEvent) {
      dynamic top;
      if (_stack.isNotEmpty) {
        top = _stack.removeLast();
      }
      if (top.name != event.name) {
        return;
      }
      if (event.name == "p") {
        spans.add(const TextSpan(text: "\n"));
      }
    }

    if (event is xmle.XmlTextEvent) {
      final currentSpan = _handleText(event.value);
      if (currentSpan.text!.isNotEmpty) {
        spans.add(currentSpan);
      }
    }
  });

  // for the last p tag
  // if (spans[spans.length - 1].text == '\n') {
  //   spans.removeLast();
  // }
  return spans;
}