resolveDocument function

ResolvedDocument resolveDocument(
  1. Iterable<RouteDocument> documents
)

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),
  );
}