Valentin Gagarin <valentin@gagarin.work> writes:
diff --git a/Documentation/_includes/sitemap.html b/Documentation/_includes/sitemap.html new file mode 100644 index 0000000..cd493f8 --- /dev/null +++ b/Documentation/_includes/sitemap.html @@ -0,0 +1,55 @@ +{% comment %} +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: 2026 Valentin Gagarin <valentin@gagarin.work> + +Render a nested sitemap rooted at a given URL prefix. Hierarchy is +derived from URL structure: a page is a direct child of prefix P iff +its URL starts with P, is not P itself, and contains no further path +segments below P. +{% endcomment %} + +{%- assign default_root = "/" -%} +{% comment %} +`prefix` is the URL of the section to list children of. It must end with "/", +which we assume if it is constructed by a directory and contains an index file. +{% endcomment %} +{%- assign prefix = include.prefix | default: default_root -%} +{%- capture inner -%} + {%- assign candidates = site.html_pages + | where_exp: "p", "p.url contains prefix" + | where_exp: "p", "p.url != prefix" -%} + {%- comment %} + Ordered pages first, ascending. The rest after, in URL order, so output is deterministic. + {%- endcomment %} + {%- assign ordered = candidates | where_exp: "p", "p.nav_order" | sort: "nav_order" -%} + {%- assign unordered = candidates | where_exp: "p", "p.nav_order == nil" | sort: "url" -%} + {%- assign sorted = ordered | concat: unordered -%} + {%- for p in sorted -%} + {%- comment %} + `assign` is page-global. A recursive include below may have overwritten `prefix`. + {%- endcomment %} + {%- assign prefix = include.prefix | default: default_root -%} + {%- assign suffix = p.url | remove_first: prefix -%} + {%- assign without_slashes = suffix | replace: "/", "" -%} + {%- assign slashes = suffix.size | minus: without_slashes.size -%} + {%- assign is_index = false -%} + {%- if p.name == "index.adoc" -%}{%- assign is_index = true -%}{%- endif -%} + {%- assign is_page = false -%} + {%- if is_index == false and slashes == 0 -%}{%- assign is_page = true -%}{%- endif -%} + {%- assign is_section = false -%} + {%- if is_index and slashes == 1 -%}{%- assign is_section = true -%}{%- endif -%} + {%- if is_page or is_section %} + <li> + <a href="{{ p.url | relative_url }}">{{ p.title }}</a>{% if p.description %} — {{ p.description }}{% endif %}
Is this right? I see we have pages with descriptions, but when I look at the sitemap I don't see any descriptions rendered.
+ {%- if is_section -%} + {%- include sitemap.html prefix=p.url -%} + {%- endif -%} + </li> + {%- endif -%} + {%- endfor -%} +{%- endcapture -%} +{%- assign trimmed = inner | strip -%} +{%- if trimmed != "" %} +<ul>{{ inner }} +</ul> +{%- endif -%} diff --git a/Documentation/_layouts/page.html b/Documentation/_layouts/page.html new file mode 100644 index 0000000..230b601 --- /dev/null +++ b/Documentation/_layouts/page.html @@ -0,0 +1,31 @@ +{% comment %} +SPDX-License-Identifier: GPL-3.0-or-later +SPDX-FileCopyrightText: 2026 Valentin Gagarin <valentin@gagarin.work> +{% endcomment %} +<!doctype html> +<html lang="en"> + +<head> + +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> + +{% include favicon.html %} +<link rel="stylesheet" href="/style.css"> + +<title>{{ page.title }}</title> + +<body> + +<nav aria-label="Breadcrumb"> + <ol> + <li><a href="/">Spectrum</a></li> + <li><a href="/doc/">Documentation</a></li> + <li aria-current="page">{{ page.title }}</li>
This probably ought to be ommitted if the current page is /doc. Otherwise I see "Spectrum / Documentation / Spectrum Documentation". (Not a huge deal though — I see that it's fixed in patch #3.)
diff --git a/Documentation/style.css b/Documentation/style.css index f4d4c4e..7f51a0a 100644 --- a/Documentation/style.css +++ b/Documentation/style.css @@ -25,3 +25,61 @@ var { :target { background: yellow; } + +nav[aria-label="Breadcrumb"] ol { + list-style: none; + padding: 0; + display: flex; + flex-wrap: wrap; +} + +nav[aria-label="Breadcrumb"] li + li::before { + content: "/"; + padding: 0 0.5em; +} + +:root { + --bg: Canvas; + --code-bg: whitesmoke; +} + +code { + background: var(--code-bg); + padding: 0.1em 0.3em; +} + +pre { + background: var(--code-bg); + padding: 1rem; + line-height: 1.5; + overflow-x: auto; +} + +pre code { + background: none; + padding: 0; + border-radius: 0; +} + +.admonitionblock { + border-left: 0.5rem solid var(--callout-accent, --bg); + background: var(--callout-bg, --code-bg); + margin: 1rem 0;
Something's off with your indentation here.
+} + +.admonitionblock td { + padding: 1rem; + vertical-align: top;
And here.
+} + +.admonitionblock td.icon { + white-space: nowrap; + color: var(--callout-accent); + font-weight: bold; +} + +.admonitionblock.note { --callout-accent: steelblue; --callout-bg: aliceblue; } +.admonitionblock.tip { --callout-accent: seagreen; --callout-bg: honeydew; } +.admonitionblock.important { --callout-accent: indigo; --callout-bg: ghostwhite; } +.admonitionblock.warning { --callout-accent: orangered; --callout-bg: seashell; } +.admonitionblock.caution { --callout-accent: red; --callout-bg: mistyrose}
For consistency this should be: ; } New styles are looking lovely. :)