{# A collection of macros used throughout the site. #} {# The renderMenu macro recursively iterates through a menu data structure and renders it as a nested menu. For example, the following YAML structure: label: Main sub: - label: Sub1 url: "http://example.org/sub" - label: Sub2 url: "http://example.org/something-else" ...renders as: Main
  • Sub1
  • Sub2
  • #} {%- macro renderMenu(menu) -%} {%- if menu.url -%}{%- endif -%} {{ menu.label }} {%- if menu.url -%}{%- endif -%} {%- if menu.sub -%} {%- for sub in menu.sub -%}
  • {{ renderMenu(sub) }}
  • {%- endfor -%}
    {%- endif -%} {%- endmacro -%} {# If the first top-level element of the given page is a level-1 heading, return its text content. #} {%- set extractPageHeading = (page) -> page.body[0].type == 'h1' ? page.body[0].children : null -%} {# If the first top-level element of the given page is a level-1 heading, remove it, and return the remaining body; otherwise, return the body unchanged. #} {%- set removePageHeading = (page) -> (page.body[0].type == 'h1' ? page.body|slice(1) : page.body)|default(page|str) -%} {# Get a suitable title for the page. #} {%- set pageTitle = (page) -> (page.meta.title ? page.meta.title|str : null) |default(extractPageHeading(page)) |default(page.props.name|capitalize) |default(page.body[0]|str|capitalize) |default("") -%} {# Render a page preview: title as text, clipped to max. 22 characters, and excerpt, taken from meta or derived from the body. #} {%- macro pagePreview(page) -%}

    {{ pageTitle(page)|ellipse(22) }}

    {{ page.props.mtimeUTC|date('%x') }}

    {%- if page.meta.excerpt %}

    {{ page.meta.excerpt }}

    {%- else -%}

    {{ removePageHeading(page)|ellipse(250) }}

    {% endif -%}
    {%- endmacro -%}