apply method
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));
}
}
}