buildHead method

  1. @mustCallSuper
Iterable<Component> buildHead(
  1. Page page
)

Implementation

@mustCallSuper
Iterable<Component> buildHead(Page page) sync* {
  final pageData = page.data.page;
  final siteData = page.data.site;

  final pageTitle = pageData['title'] ?? siteData['title'];
  final pageTitleBase = pageData['titleBase'] ?? siteData['titleBase'];

  final title = switch ((pageTitle, pageTitleBase)) {
    (final String title, final String base) => '$title | $base',
    (final String title, _) => title,
    (_, final String base) => base,
    _ => '',
  };

  yield Component.element(tag: 'title', children: [Component.text(title)]);
  yield meta(attributes: {'property': 'og:title'}, content: title);

  if (siteData['favicon'] case final String faviconHref) {
    yield link(rel: 'icon', type: 'image/png', href: faviconHref);
  }

  final description = pageData['description'];
  final keywords = pageData['keywords'];
  final image = pageData['image'];
  final metaData = pageData['meta'];

  if (description case final desc?) {
    yield meta(name: 'description', content: desc.toString());
  }
  if (keywords case final keys?) {
    yield meta(name: 'keywords', content: keys is List ? keys.join(', ') : keys.toString());
  }
  if (metaData case final Map<String, Object?> metaData?) {
    for (final MapEntry(key: name, value: content) in metaData.entries) {
      yield meta(name: name, content: content as String?);
    }
  }

  if (description case final desc?) {
    yield meta(attributes: {'property': 'og:description'}, content: desc.toString());
  }
  if (image case final img?) {
    yield meta(attributes: {'property': 'og:image'}, content: img.toString());
  }
  if (metaData case final List<Object?> metaData?) {
    for (final item in metaData) {
      if (item is Map<Object?, Object?>) {
        yield meta(attributes: item.cast());
      }
    }
  }
}