renderDocumentStart function

String renderDocumentStart(
  1. ResolvedDocument document, {
  2. String? baseHref,
})

Renders a resolved document's opening HTML, head, and semantic body.

The returned source intentionally omits the closing body and html tags so the server can append handoff frames while queries are still resolving. Invalid element or attribute serialization names throw ArgumentError.

Implementation

String renderDocumentStart(ResolvedDocument document, {String? baseHref}) {
  final output = StringBuffer('<!doctype html><html');
  if (!document.htmlAttributes.containsKey('lang')) {
    if (document.language case final language?) {
      _writeAttribute(output, 'lang', language);
    }
  }
  _writeAttributes(output, document.htmlAttributes);
  output.write('><head><meta charset="utf-8">');
  output.write(
    '<meta name="viewport" content="width=device-width,initial-scale=1">',
  );
  final resolvedBaseHref = baseHref ?? document.baseHref;
  if (resolvedBaseHref != null) {
    output.write('<base');
    _writeAttribute(output, 'href', resolvedBaseHref);
    output.write('>');
  }
  if (document.title case final title?) {
    output
      ..write('<title>')
      ..write(_escapeText(title))
      ..write('</title>');
  }
  for (final item in document.meta) {
    output.write('<meta');
    if (item.charset case final charset?) {
      _writeAttribute(output, 'charset', charset);
    } else {
      _writeAttribute(output, item.attribute!, item.key);
      _writeAttribute(output, 'content', item.content);
    }
    output.write('>');
  }
  for (final item in document.links) {
    output.write('<link');
    _writeAttribute(output, 'rel', item.rel);
    _writeAttribute(output, 'href', item.href);
    if (item.hreflang case final value?) {
      _writeAttribute(output, 'hreflang', value);
    }
    if (item.media case final value?) {
      _writeAttribute(output, 'media', value);
    }
    if (item.type case final value?) {
      _writeAttribute(output, 'type', value);
    }
    if (item.as case final value?) {
      _writeAttribute(output, 'as', value);
    }
    if (item.crossorigin case final value?) {
      _writeAttribute(output, 'crossorigin', value);
    }
    output.write('>');
  }
  for (final value in document.jsonLd) {
    final encoded = jsonEncode(
      value,
    ).replaceAllMapped(_scriptEnd, (_) => r'<\/script');
    output
      ..write('<script type="application/ld+json">')
      ..write(encoded)
      ..write('</script>');
  }
  output.write('</head><body');
  _writeAttributes(output, document.bodyAttributes);
  output.write('>');
  if (document.body case final body?) {
    output.write('<div id="__odroe_document__">');
    _writeNode(output, body);
    output.write('</div>');
  }
  return output.toString();
}