parseHTML function

List<DOMNode>? parseHTML(
  1. String? html
)

Parses a html to nodes.

Implementation

List<DOMNode>? parseHTML(String? html) {
  if (html == null) return null;

  var dependentTagMatch = _regexpDependentTag.firstMatch(html);

  if (dependentTagMatch != null) {
    var dependentTagName = dependentTagMatch.group(1)!.toLowerCase();

    late Object parsed;
    if (dependentTagName == 'td' || dependentTagName == 'th') {
      parsed =
          _domHTML.parse('<table><tbody><tr></tr>\n$html\n</tbody></table>')!;
    } else if (dependentTagName == 'tbody' ||
        dependentTagName == 'thead' ||
        dependentTagName == 'tfoot') {
      parsed = _domHTML.parse('<table>\n$html\n</table>')!;
    }

    var node = _domHTML.querySelector(parsed, dependentTagName);
    return [DOMNode.from(node)!];
  }

  var parsed = _domHTML.parse(html);

  if (parsed is DOMNode) {
    return <DOMNode>[parsed];
  } else if (parsed is List<DOMNode>) {
    return parsed;
  }

  var parsedNodes = _domHTML.getChildrenNodes(parsed);

  if (parsedNodes.isEmpty) {
    return null;
  } else if (parsedNodes.length == 1) {
    var node = parsedNodes[0];
    return [DOMNode.from(node)!];
  } else {
    while (parsedNodes.isNotEmpty) {
      var o = parsedNodes[0];
      if (_domHTML.isEmptyTextNode(o)) {
        parsedNodes.removeAt(0);
      } else {
        break;
      }
    }

    while (parsedNodes.isNotEmpty) {
      var i = parsedNodes.length - 1;
      var o = parsedNodes[i];
      if (_domHTML.isEmptyTextNode(o)) {
        parsedNodes.removeAt(i);
      } else {
        break;
      }
    }

    var domList =
        parsedNodes.map((e) => DOMNode.from(e)).whereType<DOMNode>().toList();

    return domList;
  }
}