From 947268ed2d64f3e874389373746771b1b78578aa Mon Sep 17 00:00:00 2001 From: Volker Christian Date: Wed, 14 Oct 2026 15:38:08 +0200 Subject: [PATCH] docs: fix review findings and SNode.C display names --- README.md | 10 +++------ SECURITY.md | 2 +- docs/media/nav/banner-workflows-compact.svg | 2 +- docs/media/nav/banner-workflows.svg | 2 +- docs/media/nav/organization-dark.svg | 2 +- docs/media/nav/organization-icon-dark.svg | 2 +- docs/media/nav/organization-icon-light.svg | 2 +- docs/media/nav/organization-light.svg | 2 +- docs/media/nav/repository-dark.svg | 2 +- docs/media/nav/repository-icon-dark.svg | 2 +- docs/media/nav/repository-icon-light.svg | 2 +- docs/media/nav/repository-light.svg | 2 +- docs/media/nav/up-snodec-dark.svg | 4 ++-- docs/media/nav/up-snodec-light.svg | 4 ++-- docs/workflow-graph.md | 6 ++--- navigation/PLAN.md | 2 +- navigation/plan.yml | 25 ++++++++++++++++----- profile/README.md | 18 +++++++-------- profile/media/hero-mobile.svg | 4 ++-- profile/media/hero.svg | 4 ++-- profile/template.md | 10 ++++----- tests/test_navigation.py | 9 ++++++-- tests/test_sync.py | 17 +++++++++++++- tools/snodec_sync/__main__.py | 2 +- tools/snodec_sync/navigation.py | 12 +++++----- 25 files changed, 90 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 1701711..eeddab8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -

SNodeC organization

+

SNode.C organization

-# SNodeC control repository +# SNode.C control repository This repository owns the organization catalog and the [profile](profile/README.md) generated from catalog rows and authored prose. Brand tokens define the shared accents, contrast pairs and glyphs. The shared Verify workflow provides reusable, manifest-driven verification. The navigation plan, page-header generator and optional `docs-audit` command keep documentation paths, generated navigation and tracked-page reachability reviewable from one control point. @@ -33,8 +33,6 @@ python tools/snodec_sync check python tools/snodec_sync profile git diff --exit-code profile/README.md python -m unittest discover -s tests -v -python tools/snodec_sync profile --output /tmp/snodec-profile.md -diff -u profile/README.md /tmp/snodec-profile.md ``` `check` reports all catalog validation errors and exits non-zero. @@ -122,7 +120,7 @@ files against existing repository formatting policies. Documentation and present The five product callers and `templates/build-and-test.yml` use `verify-project.yml@main`, following the API-verified default branch of this control repository. A merged shared-workflow change is used by their next manually started CI runs; it does not start those runs. Callers pass no secrets unless Verify actually reads one (currently none). Product CI remains `workflow_dispatch`-only, independent of version-tag package pipelines. -Existing tags are historical snapshots and are never moved. Page-header, menu and profile generation are separate from build CI; documentation changes require neither a Verify release nor caller updates. `docs-audit` is optional local/PR review tooling and is never a build, signing or publication gate. +This control repository publishes no release tags; callers follow `verify-project.yml@main`. Page-header, menu and profile generation are separate from build CI; documentation changes require neither a Verify release nor caller updates. `docs-audit` is optional local/PR review tooling and is never a build, signing or publication gate. Tests execute the actual inline workflow scripts, including ordered source builds and a real CMake/CTest/staged-install consumer, Python commands and @@ -132,5 +130,3 @@ publication options and publisher workflows are absent or rejected. Repository README frames and generated navigation are governed by the [navigation plan](navigation/README.md). Package/release publication remains a separate responsibility. Historical rollout and design records live only in [history](history/README.md); they are not current release policy. See also [brand values](brand/README.md), [contributing](CONTRIBUTING.md) and [security](SECURITY.md). - -Verify no longer enforces documentation. Existing `v1.0`–`v1.3` tags remain unchanged. diff --git a/SECURITY.md b/SECURITY.md index 072803d..dc8d7e8 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -3,6 +3,6 @@ Do not include credentials or sensitive exploit details in public issues or pull requests. Contact the organization maintainer privately at [me@vchrist.at](mailto:me@vchrist.at), the address published in the -[SNodeC organization metadata](https://api.github.com/orgs/SNodeC). +[SNode.C organization metadata](https://api.github.com/orgs/SNodeC). Use the private maintainer contact above rather than a public issue. This policy does not promise a response time or a configured GitHub private-reporting channel. diff --git a/docs/media/nav/banner-workflows-compact.svg b/docs/media/nav/banner-workflows-compact.svg index 818fc6e..b7347e9 100644 --- a/docs/media/nav/banner-workflows-compact.svg +++ b/docs/media/nav/banner-workflows-compact.svg @@ -1 +1 @@ -SNodeC — WorkflowsSNodeCWorkflows +SNode.C — WorkflowsSNode.CWorkflows diff --git a/docs/media/nav/banner-workflows.svg b/docs/media/nav/banner-workflows.svg index 7f3c9b3..25459fd 100644 --- a/docs/media/nav/banner-workflows.svg +++ b/docs/media/nav/banner-workflows.svg @@ -1 +1 @@ -SNodeC — WorkflowsSNodeCWorkflows +SNode.C — WorkflowsSNode.CWorkflows diff --git a/docs/media/nav/organization-dark.svg b/docs/media/nav/organization-dark.svg index a63a53c..b7f440f 100644 --- a/docs/media/nav/organization-dark.svg +++ b/docs/media/nav/organization-dark.svg @@ -1,4 +1,4 @@ -SNodeC organizationSNodeC + -->SNode.C diff --git a/docs/media/nav/up-snodec-light.svg b/docs/media/nav/up-snodec-light.svg index e874b04..409c20c 100644 --- a/docs/media/nav/up-snodec-light.svg +++ b/docs/media/nav/up-snodec-light.svg @@ -1,4 +1,4 @@ -Up to SNodeCSNodeC + -->SNode.C diff --git a/docs/workflow-graph.md b/docs/workflow-graph.md index 845b80e..7969d76 100644 --- a/docs/workflow-graph.md +++ b/docs/workflow-graph.md @@ -1,10 +1,10 @@ -

SNodeC — Workflows

-

Up to SNodeCSNodeC organizationSNodeC repository

+

SNode.C — Workflows

+

Up to SNode.CSNode.C organizationSNode.C repository

-# SNodeC workflow graph +# SNode.C workflow graph This guide describes the current workflow entry points, repository handoffs and publication boundaries. Workflow YAML and the invoked scripts remain the executable authority. Repository operational guides provide detailed build and release procedures. The inventory was checked against default branches on 14 October 2026. diff --git a/navigation/PLAN.md b/navigation/PLAN.md index dd260d8..71592d6 100644 --- a/navigation/PLAN.md +++ b/navigation/PLAN.md @@ -237,7 +237,7 @@ Generated inventory of all subpages: proposed path, banner text and upward butto | Repository | Finding | Recommendation | | --- | --- | --- | -| snode.c | The two Vite scaffolding READMEs under `src/apps/oauth2/**/vue-frontend-*` ("Vue 3 + TypeScript + Vite") are template boilerplate, not SNodeC documentation. | Exclude from the header (no banner, no button). | +| snode.c | The two Vite scaffolding READMEs under `src/apps/oauth2/**/vue-frontend-*` ("Vue 3 + TypeScript + Vite") are template boilerplate, not SNode.C documentation. | Exclude from the header (no banner, no button). | | snode.c | `docs/config-comment-metadata.md` is referenced from source comments in 5 files of `src/tools/snodec-control` (ConfigModel.h, Json.h, Metadata.h, ui/UiState.cpp, tests/SnodecControlConfigParserTest.cpp). | Update those path mentions in the move commit (comment-only change). | | snode.c, mqttsuite | `docs/assets/` is used by Doxygen (`cmake/doxygen.cmake`) and, in mqttsuite, by `mqttbridge/html/index.html`. | Do not move `docs/assets/`; it is build input, not page media. | | AISuite, CodexUI | `docs/media/README.md` ("Landing-page assets") documents image sources, it is not a reader page. | Exclude from the header. | diff --git a/navigation/plan.yml b/navigation/plan.yml index dd98699..42df4a4 100644 --- a/navigation/plan.yml +++ b/navigation/plan.yml @@ -1,5 +1,5 @@ .github: - display: SNodeC + display: SNode.C source: .github sections: {} media: [] @@ -7,10 +7,10 @@ - old: docs/workflow-graph.md new: docs/workflow-graph.md kind: doc - title: SNodeC workflow graph + title: SNode.C workflow graph label: Workflows up: README.md - up_label: SNodeC + up_label: SNodeC # Stable asset key; displayed through menu_labels below. snode.c: display: SNode.C source: snode.c @@ -251,6 +251,20 @@ mqttsuite: label: Documentation up: docs/README.md up_label: Documentation + - old: mqttbridge/ui/README.md + new: mqttbridge/ui/README.md + kind: doc + title: MQTT Bridge Configuration UI + label: Bridge UI + up: docs/guides/bridging.md + up_label: Bridging + - old: mqttintegrator/ui/README.md + new: mqttintegrator/ui/README.md + kind: doc + title: MQTT Integrator Mapping UI + label: Integrator UI + up: docs/guides/mapping.md + up_label: Mapping AISuite: display: AISuite source: AISuite @@ -937,9 +951,10 @@ Packages: - pages: [status/snodec.md, status/mqttsuite.md] label: All projects remove: true -# Visible-label shortening required by the approved 160px menu rule. -# Destinations, tooltips and alternative text remain unchanged. +# Visible labels may differ from stable asset keys. +# Menu shortening preserves destinations, tooltips and alternative text. menu_labels: + SNodeC: SNode.C Native Linux build: Native Linux OpenWrt cross-compilation: OpenWrt diff --git a/profile/README.md b/profile/README.md index 0a9d77e..c9be240 100644 --- a/profile/README.md +++ b/profile/README.md @@ -2,11 +2,11 @@

- SNodeC — one event loop, a whole ecosystem: SNode.C, MQTTSuite, AISuite, CodexUI, Packages, the Book Companion and community projects. + SNode.C — one event loop, a whole ecosystem: SNode.C, MQTTSuite, AISuite, CodexUI, Packages, the Book Companion and community projects.

-# SNodeC +# SNode.C @@ -19,7 +19,7 @@ **Write the protocol. Run the messages. Ship it signed.** -SNodeC builds event-driven networking in C++. At its centre is [SNode.C](https://github.com/SNodeC/snode.c#project-overview), a C++20 framework for Linux; around it are MQTT and AI suites, a coding-agent workspace and signed packages for six Linux distributions. +SNode.C builds event-driven networking in C++. At its centre is [SNode.C](https://github.com/SNodeC/snode.c#project-overview), a C++20 framework for Linux; around it are MQTT and AI suites, a coding-agent workspace and signed packages for six Linux distributions.

@@ -34,10 +34,10 @@ SNodeC builds event-driven networking in C++. At its centre is [SNode.C](https:/ | Project | What it is for | Status | | --- | --- | --- | -| **[SNode.C](https://github.com/SNodeC/snode.c#project-overview)** | Write networked programs and your own protocols in C++: event-driven, with HTTP, WebSocket, SSE and MQTT
[Quick start](https://github.com/SNodeC/snode.c#quick-start) · [Install](https://github.com/SNodeC/snode.c#install) · [Releases](https://github.com/SNodeC/snode.c/releases) | [![CI](https://github.com/SNodeC/snode.c/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/snode.c/actions/workflows/build-and-test.yml) | -| **[MQTTSuite](https://github.com/SNodeC/mqttsuite#project-overview)** | Run an MQTT broker, translate topics, bridge brokers and store messages
[Quick start](https://github.com/SNodeC/mqttsuite#quick-start) · [Install](https://github.com/SNodeC/mqttsuite#install) · [Releases](https://github.com/SNodeC/mqttsuite/releases) | [![CI](https://github.com/SNodeC/mqttsuite/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/mqttsuite/actions/workflows/build-and-test.yml) | -| **[AISuite](https://github.com/SNodeC/AISuite#project-overview)** | Connect applications to coding agents: asynchronous C++ and TypeScript
[Quick start](https://github.com/SNodeC/AISuite#quick-start) · [Install](https://github.com/SNodeC/AISuite#install) | [![CI](https://github.com/SNodeC/AISuite/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/AISuite/actions/workflows/build-and-test.yml) | -| **[Codex(W)UI](https://github.com/SNodeC/CodexUI#project-overview)** | Follow a coding agent's work in a native Qt or browser workspace
[Quick start](https://github.com/SNodeC/CodexUI#quick-start) · [Install](https://github.com/SNodeC/CodexUI#install) | [![CI](https://github.com/SNodeC/CodexUI/actions/workflows/build-and-qualify.yml/badge.svg?branch=master)](https://github.com/SNodeC/CodexUI/actions/workflows/build-and-qualify.yml) | +| **[SNode.C](https://github.com/SNodeC/snode.c#project-overview)** | Write networked programs and your own protocols in C++: event-driven, with HTTP, WebSocket, SSE and MQTT
[Quick start](https://github.com/SNodeC/snode.c#quick-start) · [Install](https://github.com/SNodeC/snode.c#install) · [Releases](https://github.com/SNodeC/snode.c/releases) | [![CI](https://img.shields.io/github/actions/workflow/status/SNodeC/snode.c/build-and-test.yml?branch=master&label=CI&style=flat)](https://github.com/SNodeC/snode.c/actions/workflows/build-and-test.yml) | +| **[MQTTSuite](https://github.com/SNodeC/mqttsuite#project-overview)** | Run an MQTT broker, translate topics, bridge brokers and store messages
[Quick start](https://github.com/SNodeC/mqttsuite#quick-start) · [Install](https://github.com/SNodeC/mqttsuite#install) · [Releases](https://github.com/SNodeC/mqttsuite/releases) | [![CI](https://img.shields.io/github/actions/workflow/status/SNodeC/mqttsuite/build-and-test.yml?branch=master&label=CI&style=flat)](https://github.com/SNodeC/mqttsuite/actions/workflows/build-and-test.yml) | +| **[AISuite](https://github.com/SNodeC/AISuite#project-overview)** | Connect applications to coding agents: asynchronous C++ and TypeScript
[Quick start](https://github.com/SNodeC/AISuite#quick-start) · [Install](https://github.com/SNodeC/AISuite#install) | [![CI](https://img.shields.io/github/actions/workflow/status/SNodeC/AISuite/build-and-test.yml?branch=master&label=CI&style=flat)](https://github.com/SNodeC/AISuite/actions/workflows/build-and-test.yml) | +| **[Codex(W)UI](https://github.com/SNodeC/CodexUI#project-overview)** | Follow a coding agent's work in a native Qt or browser workspace
[Quick start](https://github.com/SNodeC/CodexUI#quick-start) · [Install](https://github.com/SNodeC/CodexUI#install) | [![CI](https://img.shields.io/github/actions/workflow/status/SNodeC/CodexUI/build-and-qualify.yml?branch=master&label=CI&style=flat)](https://github.com/SNodeC/CodexUI/actions/workflows/build-and-qualify.yml) | | **[SNode.C-idp](https://github.com/SNodeC/snode.c-idp)** | SNode.C Identity Provider: OAuth2 and OpenID Connect with TOTP multi-factor authentication | | ## Install @@ -64,9 +64,9 @@ Supported releases, architectures and current builds: [package status](https://g | **[Websocket-echo](https://github.com/SNodeC/websocket-echo)** | WebSocket echo server, client and browser demo built on SNode.C | | **[Talks](https://github.com/SNodeC/talks)** | Talks and slides about SNode.C | -Further example programs are listed under [More from SNodeC](#more-from-snodec). +Further example programs are listed under [More from SNode.C](#more-from-snodec). -## More from SNodeC +## More from SNode.C

Examples — small programs built on SNode.C diff --git a/profile/media/hero-mobile.svg b/profile/media/hero-mobile.svg index f1f346f..b4bfb64 100644 --- a/profile/media/hero-mobile.svg +++ b/profile/media/hero-mobile.svg @@ -1,4 +1,4 @@ -SNodeCSNodeC organization — SNode.C, an event-driven C++ networking framework, at the centre of an animated constellation: MQTTSuite, AISuite, CodexUI, Packages, the Book Companion, and community projects. diff --git a/profile/media/hero.svg b/profile/media/hero.svg index 491b55b..fa8260d 100644 --- a/profile/media/hero.svg +++ b/profile/media/hero.svg @@ -1,4 +1,4 @@ -SNodeCSNodeC organization — SNode.C, an event-driven C++ networking framework, at the centre of an animated constellation: MQTTSuite, AISuite, CodexUI, Packages, the Book Companion, and community projects. diff --git a/profile/template.md b/profile/template.md index 67df67b..5760f1a 100644 --- a/profile/template.md +++ b/profile/template.md @@ -2,11 +2,11 @@

- SNodeC — one event loop, a whole ecosystem: SNode.C, MQTTSuite, AISuite, CodexUI, Packages, the Book Companion and community projects. + SNode.C — one event loop, a whole ecosystem: SNode.C, MQTTSuite, AISuite, CodexUI, Packages, the Book Companion and community projects.

-# SNodeC +# SNode.C @@ -19,7 +19,7 @@ **Write the protocol. Run the messages. Ship it signed.** -SNodeC builds event-driven networking in C++. At its centre is [SNode.C](https://github.com/SNodeC/snode.c#project-overview), a C++20 framework for Linux; around it are MQTT and AI suites, a coding-agent workspace and signed packages for six Linux distributions. +SNode.C builds event-driven networking in C++. At its centre is [SNode.C](https://github.com/SNodeC/snode.c#project-overview), a C++20 framework for Linux; around it are MQTT and AI suites, a coding-agent workspace and signed packages for six Linux distributions.

@@ -53,9 +53,9 @@ Supported releases, architectures and current builds: [package status](https://g -Further example programs are listed under [More from SNodeC](#more-from-snodec). +Further example programs are listed under [More from SNode.C](#more-from-snodec). -## More from SNodeC +## More from SNode.C diff --git a/tests/test_navigation.py b/tests/test_navigation.py index cd21e89..f94152b 100644 --- a/tests/test_navigation.py +++ b/tests/test_navigation.py @@ -28,7 +28,7 @@ def fixture(self, name): if name == '.github': root = repo / 'README.md' root.write_text('\n' - '

SNodeC

\n' + '

SNode.C

\n' '\n\n' + root.read_text()) menu = repo / 'docs/media/menu' menu.mkdir(parents=True) @@ -67,6 +67,11 @@ def test_control_repository_uses_declared_navigation(self): guide = (repo / 'docs/workflow-graph.md').read_text() self.assertIn(render_header('.github', 'docs/workflow-graph.md'), guide) self.assertIn('One physical prose paragraph.', guide) + self.assertIn('Up to SNode.C', guide) + self.assertIn('SNode.C repository', guide) + self.assertIn('up-snodec-light.svg', guide) + self.assertFalse((repo / 'docs/media/nav/up-snode-c-light.svg').exists()) + self.assertIn('SNode.C', (repo / 'docs/media/nav/up-snodec-light.svg').read_text()) self.assertEqual(page_headers(repo, check=True), []) def test_plan_chains_and_label_limit(self): @@ -202,7 +207,7 @@ def test_mobile_sources_intrinsic_sizes_and_shared_font_spec(self): import xml.etree.ElementTree as ET from tools.snodec_sync.navigation import _header_button, FONT header = render_header('snode.c', 'docs/guides/README.md') - self.assertLess(header.index('SNodeC organization'), header.index('SNode.C repository')) + self.assertLess(header.index('SNode.C organization'), header.index('SNode.C repository')) self.assertEqual(header.count('(max-width: 640px) and (prefers-color-scheme: dark)'), 2) self.assertEqual(header.count('width="160" height="28"'), 1) for width in (36, 160): diff --git a/tests/test_sync.py b/tests/test_sync.py index 49b5321..15ae615 100644 --- a/tests/test_sync.py +++ b/tests/test_sync.py @@ -6,6 +6,7 @@ import tempfile import unittest from pathlib import Path +from urllib.parse import quote import yaml @@ -111,6 +112,13 @@ def test_every_catalog_entry_has_exact_row_coverage(self): if entry.get('tier') == 'install': self.assertRegex(self.template, r'https://github.com/SNodeC/' + re.escape(entry['name']) + r'(?=[)#/])') + def test_organization_name_preserves_more_anchor(self): + from tools.snodec_sync.docs_audit import _document + self.assertIn('# SNode.C\n', self.profile) + self.assertIn('## More from SNode.C', self.profile) + self.assertIn('(#more-from-snodec)', self.profile) + self.assertIn('more-from-snodec', _document(self.profile)[1]) + def test_no_unknown_repository_links(self): names = {entry['name'] for entry in self.catalog} linked = set(re.findall(r'https://github.com/SNodeC/([^/#?\s)]+)(?=[)#/])', self.profile)) @@ -124,6 +132,12 @@ def test_only_verified_product_workflows_and_releases(self): row = next(line for line in self.profile.splitlines() if line.startswith(f"| **[{entry['title']}](")) self.assertEqual('[![CI]' in row, bool(self.metadata[name].get('workflow'))) self.assertEqual('[Releases]' in row, bool(self.metadata[name].get('release'))) + if self.metadata[name].get('workflow'): + workflow = quote(Path(self.metadata[name]['workflow']).name, safe='') + branch = quote(self.metadata[name]['default_branch'], safe='') + self.assertIn(f'https://img.shields.io/github/actions/workflow/status/SNodeC/{quote(name, safe="")}/{workflow}?branch={branch}&label=CI&style=flat', row) + self.assertIn(f'](https://github.com/SNodeC/{quote(name, safe="")}/actions/workflows/{workflow})', row) + self.assertNotIn('/badge.svg', row) for key in ['workflow', 'release']: self.metadata['snode.c'].pop(key) rendered = render_profile(self.catalog, self.metadata) @@ -148,9 +162,10 @@ def test_repository_navigation_uses_metadata_anchors_only(self): def test_default_branch_comes_from_metadata(self): self.metadata['.github']['default_branch'] = 'control/branch' self.metadata['snode.c']['default_branch'] = 'framework/branch' + self.metadata['snode.c']['workflow'] = '.github/workflows/build and test.yml' rendered = render_profile(self.catalog, self.metadata) self.assertIn('/blob/control%2Fbranch/', rendered) - self.assertIn('?branch=framework%2Fbranch', rendered) + self.assertIn('snode.c/build%20and%20test.yml?branch=framework%2Fbranch&label=CI&style=flat', rendered) def test_authored_text_cannot_break_table_or_inject_html(self): for field in ['title', 'purpose', 'summary']: diff --git a/tools/snodec_sync/__main__.py b/tools/snodec_sync/__main__.py index 7100d6f..ed21c75 100644 --- a/tools/snodec_sync/__main__.py +++ b/tools/snodec_sync/__main__.py @@ -121,7 +121,7 @@ def render_profile(catalog, metadata, template=None): if info.get("workflow"): workflow = f"{url}/actions/workflows/{quote(Path(info['workflow']).name, safe='')}" branch = quote(info["default_branch"], safe="") - badge = f"[![CI]({workflow}/badge.svg?branch={branch})]({workflow})" + badge = f"[![CI](https://img.shields.io/github/actions/workflow/status/SNodeC/{quote(name, safe='')}/{quote(Path(info['workflow']).name, safe='')}?branch={branch}&label=CI&style=flat)]({workflow})" products.append(f"| **[{text(entry['title'])}]({repo_url(name, anchor)})** | {purpose} | {badge} |") elif tier == "learn": learn.append(f"| **[{text(entry.get('title', name))}]({url})** | {text(entry['summary'])} |") diff --git a/tools/snodec_sync/navigation.py b/tools/snodec_sync/navigation.py index 6dcccc4..1831184 100644 --- a/tools/snodec_sync/navigation.py +++ b/tools/snodec_sync/navigation.py @@ -79,7 +79,7 @@ def _config(repo): if name in plan: config = plan[name] elif name in ('.github', 'SNode.C-Book-Companion'): - config = {'display': 'SNodeC' if name == '.github' else 'SNode.C Book Companion', 'pages': [], 'sections': {}} + config = {'display': 'SNode.C' if name == '.github' else 'SNode.C Book Companion', 'pages': [], 'sections': {}} else: raise ValueError(f'Checkout is not in navigation/plan.yml: {repo}') catalog = yaml.safe_load((ROOT / 'catalog.yml').read_text()) @@ -126,7 +126,7 @@ def _button(nav, stem, title, href, right=False, mobile=False): def _organization(): return ('\n

' + - _button('docs/media/nav', 'organization', 'SNodeC organization', + _button('docs/media/nav', 'organization', 'SNode.C organization', 'https://github.com/SNodeC', True) + '

\n') @@ -137,9 +137,9 @@ def _header(config, page_path): nav = _relative('docs/media/nav', page_path) escape = lambda text: html.escape(text, quote=True) up_fragment = 'project-overview' if page['up'] == 'README.md' else 'page-overview' - buttons = [_button(nav, 'up-' + slug(page['up_label']), 'Up to ' + page['up_label'], + buttons = [_button(nav, 'up-' + slug(page['up_label']), 'Up to ' + config['menu_labels'].get(page['up_label'], page['up_label']), _relative(page['up'], page_path) + '#' + up_fragment), - _button(nav, 'organization', 'SNodeC organization', 'https://github.com/SNodeC', True, True), + _button(nav, 'organization', 'SNode.C organization', 'https://github.com/SNodeC', True, True), _button(nav, 'repository', display + ' repository', _relative('README.md', page_path) + '#project-overview', True, True)] return ('\n\n' @@ -373,8 +373,8 @@ def page_headers(repo, check=False): for compact in (False, True): outputs[f'docs/media/nav/banner-{slug(label)}{"-compact" if compact else ""}.svg'] = _banner(name, config['display'], label, accent['dark']['text'], compact) buttons = [('repository', 'Repository', config['display'] + ' repository', 'repo', accent), - ('organization', 'Organization', 'SNodeC organization', 'organization', org_accent)] - buttons += [('up-' + slug(label), label, 'Up to ' + label, 'arrow-up', accent) + ('organization', 'Organization', 'SNode.C organization', 'organization', org_accent)] + buttons += [('up-' + slug(label), config['menu_labels'].get(label, label), 'Up to ' + config['menu_labels'].get(label, label), 'arrow-up', accent) for label in sorted({p['up_label'] for p in active})] buttons = [button for button in buttons if active or button[0] == 'organization'] if active or root_organization: