{#-
Article + Organization + WebSite JSON-LD Structured Data
Emits three schema.org graphs for SEO and AI discovery:
1. Organization (publisher identity) — site-wide, from site.organization config.
2. WebSite + SearchAction — homepage only, advertising the on-site search so
search engines can surface a sitelinks search box.
3. TechArticle (docs) / BlogPosting (posts) — content pages, with the
Organization as `publisher`.
URLs are absolute (origin + path) once site.baseurl carries a full scheme/host
(see config/_default/site.yaml), matching the canonical/og:url surface.
Uses page: title, description, date, section, word_count, toc_items, author, kind
Uses site: baseurl, title, organization
Uses config: structured_data.article (default: true)
Usage in base.html head:
{% include "partials/article-jsonld.html" %}
-#}
{%- set article_enabled = (config.structured_data ?? {}).article ?? true %}
{%- set is_doc = page.type == 'doc' or page.kind == 'doc' %}
{%- set is_post = page.type == 'post' or page.kind == 'post' %}
{%- set is_home = (page.kind ?? '') == 'home' %}
{%- set _toc = page.toc_items ?? toc_items ?? [] %}
{#- Organization publisher identity (reused as article `publisher`).
`site.organization` is unset on special pages (404/search) and other configs,
so coalesce with `?? {}` — a bare attribute access raises K-RUN-001 under
kida strict_undefined. Guard on a mapping before subscripting. -#}
{%- set _org_raw = site.organization ?? {} %}
{%- set _org = _org_raw if (_org_raw is mapping) else {} %}
{%- set _org_name = _org.get('name') ?? site.title ?? '' %}
{%- set _org_url = (_org.get('url') ?? '/') | absolute_url %}
{%- set _org_logo = _org.get('logo') ?? '' %}
{%- if _org_name %}
{% end %}
{#- Homepage WebSite node with on-site SearchAction (sitelinks search box). -#}
{%- if is_home %}
{% end %}
{%- if article_enabled and (is_doc or is_post) %}
{% end %}