apply method
Implementation
@override
void apply(MarkupRenderObject root) {
final (html, head, body) = createDocumentStructure(root);
String? keyFor(MarkupRenderObject n) {
return switch (n) {
MarkupRenderElement(id: final String id) when id.isNotEmpty => id,
MarkupRenderElement(tag: 'title' || 'base') => '__${n.tag}',
MarkupRenderElement(tag: 'meta', attributes: {'name': final String name}) => '__meta:$name',
_ => null,
};
}
for (final MapEntry(:key, :value) in entries.entries) {
final 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));
final List<MarkupRenderObject> nodes = [];
final 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;
}
final key = keyFor(o);
if (key == null) {
nodes.add(o);
return;
}
final 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 (final e in value.children) {
e.$1.remove();
for (final n in e.$1) {
visitRenderObject(n, e.$2);
}
}
for (final n in nodes) {
target.children.insertBefore(n);
}
target.children.insertBefore(target.createChildRenderText(r'<!--/-->', true));
}
}
}