apply method

  1. @override
void apply(
  1. MarkupRenderObject root
)
override

Implementation

@override
void apply(MarkupRenderObject root) {
  final (html, head, body) = createDocumentStructure(root);

  String? keyFor(MarkupRenderObject n) {
    return switch (n) {
      MarkupRenderElement(id: String id) when id.isNotEmpty => id,
      MarkupRenderElement(tag: "title" || "base") => '__${n.tag}',
      MarkupRenderElement(tag: "meta", attributes: {'name': String name}) => '__meta:$name',
      _ => null,
    };
  }

  for (final MapEntry(:key, :value) in entries.entries) {
    var target = switch (key) {
      'html' => html,
      'head' => head,
      'body' => body,
      _ => throw StateError('Unknown target $key'),
    };

    if (value.attributes.isNotEmpty) {
      (target.attributes ??= {}).addAll(value.attributes);
    }

    if (value.children.isNotEmpty) {
      target.children.insertBefore(target.createChildRenderText(r'<!--$-->', true));

      List<MarkupRenderObject> nodes = [];
      Map<String, (int, int)> indices = {};

      void visitRenderObject(MarkupRenderObject o, int depth) {
        if (o is MarkupRenderFragment) {
          for (final child in o.children) {
            visitRenderObject(child, depth);
          }
          return;
        }

        var key = keyFor(o);
        if (key == null) {
          nodes.add(o);
          return;
        }
        var index = indices[key];
        if (index == null) {
          nodes.add(o);
          indices[key] = (nodes.length - 1, depth);
        }
        if (index != null && depth >= index.$2) {
          nodes[index.$1] = o;
        }
      }

      for (var e in value.children) {
        e.$1.remove();
        for (var n in e.$1) {
          visitRenderObject(n, e.$2);
        }
      }

      for (var n in nodes) {
        target.children.insertBefore(n);
      }

      target.children.insertBefore(target.createChildRenderText(r'<!--/-->', true));
    }
  }
}