{#- 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 %}