resolveDocument function
Merges route-owned document fragments from root to leaf.
Implementation
ResolvedDocument resolveDocument(Iterable<RouteDocument> documents) {
String? language;
String? baseHref;
String? title;
final meta = <String, DocumentMeta>{};
final links = <String, DocumentLink>{};
final jsonLd = <Object?>[];
final htmlAttributes = <String, String?>{};
final bodyAttributes = <String, String?>{};
final bodies = <HtmlNode>[];
for (final document in documents) {
language = document.language ?? language;
baseHref = document.baseHref ?? baseHref;
title = document.title ?? title;
if (document.description case final description?) {
const key = 'name:description';
meta[key] = DocumentMeta.name('description', description);
}
for (final item in document.meta) {
meta[item.identity] = item;
}
if (document.canonical case final canonical?) {
links['canonical'] = DocumentLink(rel: 'canonical', href: canonical);
}
for (final item in document.links) {
links[item.identity] = item;
}
jsonLd.addAll(document.jsonLd);
htmlAttributes.addAll(document.htmlAttributes);
bodyAttributes.addAll(document.bodyAttributes);
if (document.body case final body?) bodies.add(body);
}
return ResolvedDocument._(
language: language,
baseHref: baseHref,
title: title,
meta: List<DocumentMeta>.unmodifiable(meta.values),
links: List<DocumentLink>.unmodifiable(links.values),
jsonLd: List<Object?>.unmodifiable(jsonLd),
htmlAttributes: Map<String, String?>.unmodifiable(htmlAttributes),
bodyAttributes: Map<String, String?>.unmodifiable(bodyAttributes),
body: _composeBodies(bodies),
);
}