Skip to content

Fix raw-TeX formulas and other documentation infrastructure debt - #5736

Merged
nlohmann merged 9 commits into
developfrom
techdebt/5718-docs-infra
Sep 30, 2026
Merged

nlohmann merged 9 commits into
developfrom
techdebt/5718-docs-infra

Conversation

@nlohmann

@nlohmann nlohmann commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

Summary

This removes six independent pieces of documentation-infrastructure debt identified in the #5718 tech-debt review: math formulas silently rendering as raw TeX on the published site, a docs-publish workflow that misses several embedded source files and persists unneeded git credentials, an example build that hides accidental deprecated-API calls, a structure checker with a parsing bug that silently disables NOLINT for several section names, a docset README/Info.plist pointing at a dead target and a stale URL, and two orphaned Doxygen-era files. Each commit is exactly one checklist item of #5718 and can be reviewed and merged on its own. Note that the math-formula fix (item 1) removes MathJax entirely and rewrites the 10 affected formulas as plain HTML (<sup>, <i>) rather than repairing the MathJax configuration or migrating to MathJax 3 — a reviewer may prefer keeping MathJax and fixing the config/privacy-plugin interaction instead. The follow-up commits listed under "Remaining checklist items" implement every item that was left open, so this PR now closes #5718; see "Public API" for their effects.

Changes

Tests

  • make check_output_portable -j3 -k was run over all 480 docs/Makefile examples with -Werror=deprecated-declarations: every example compiled cleanly except the three in DEPRECATED_EXAMPLES, which compiled with -Wno-deprecated-declarations as intended; the only failures were pre-existing unordered_map iteration-order flakiness in three unrelated example tests, confirmed to fail identically on unmodified develop
  • make style_check (docs/mkdocs) gave 0 warnings before and after the check_structure.py fix; the regex fix was also verified directly against <!-- NOLINT Notes -->, which previously mangled to 'otes'
  • The site was built locally with mkdocs build; the built site/ contains no MathJax/arithmatex references, and the rewritten formulas (e.g. 2<sup>53</sup>, <i>n</i>) appear in the built HTML
  • All three edited workflow YAML files were validated with yaml.safe_load
  • git grep confirmed the two removed .link files and the docset's old make target/URL are unreferenced anywhere else in the tree
  • make check-amalgamation passes; no include/ files are touched by this branch, so single_include/nlohmann/json.hpp is unchanged
  • CI must confirm: the full CI compiler matrix (GCC/Clang/MSVC/ICC/NVHPC) and ci_test_documentation/ci_test_examples/actionlint/zizmor jobs; that the extended publish_documentation.yml path filter actually triggers a real run for the newly added file patterns; and that no artipacked finding remains for the workflow checkouts

Public API

No breaking changes. This PR touches only documentation content and infrastructure (docs/mkdocs/**, .github/workflows/publish_documentation.yml, .github/workflows/ubuntu.yml, .github/workflows/windows.yml, docs/Makefile, docs/mkdocs/scripts/check_structure.py, docs/docset/README.md, docs/docset/Info.plist) and two unreferenced example .link files. No file under include/ or single_include/ is changed, so the public API, ABI and compile-time behavior of the library are unaffected.

Follow-up commits:

  • Docs infrastructure only.

Remaining checklist items (follow-up commits)

The parts that were left open are now implemented here as well, so this PR closes #5718.

Tests for these commits:

  • list_missing_pages/list_removed_paths give byte-identical output to the old loops against the real docSet.sql and docs tree, with GNU Make 3.81 and 4.4.1 and in two locales
  • publish_documentation.yml parses

c0aa5f0e5 overlaps #5638, which edits the same checkout step. #5718 item 5 suggested removing the two targets once #5638's check_docset() exists; until then they are kept, but fixed.

Closes #5718


This PR was written by Claude Code on behalf of @nlohmann.

🤖 Generated with Claude Code

The privacy plugin self-hosts MathJax 2.7.0 but drops its
?config=TeX-MML-AM_CHTML query string, so the rehosted script loads no
input jax and the 10 formulas across 6 pages render as raw TeX to
readers. Remove pymdownx.arithmatex and the MathJax extra_javascript
entry, and rewrite the formulas in plain HTML (<sup>, <i>) instead.
This also drops a nine-year-old third-party script from every page.

Part of #5718

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
publish_documentation.yml only triggered on docs/mkdocs/** pushes, but
the site also embeds .github/CODE_OF_CONDUCT.md, CONTRIBUTING.md,
SECURITY.md, cmake/{clang,gcc}_flags.cmake, .clang-tidy,
tools/astyle/.astylerc and tests/fmt_formatter/project/main.cpp via
pymdownx.snippets, so changes to those files never republished the
site. Extend the path filter to cover them, and switch runs-on from
the long-pinned ubuntu-22.04 to ubuntu-latest to match
ci_test_documentation.

Also add persist-credentials: false to the checkouts in ci_icpx and
ci_nvhpc (ubuntu.yml) and msvc-vs2026/msvc-arm64 (windows.yml), none
of which pushes with git, matching every other checkout in these
workflows.

Part of #5718

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
docs/Makefile's debug echo used a space instead of a comma in
$(call cxx_standard ...), so it always printed an empty standard.
Every example was also compiled with -Wno-deprecated-declarations,
which would silently hide an accidental deprecated-API call in any of
them. Factor the duplicated compile flags into EXAMPLE_CPPFLAGS/
EXAMPLE_WARNFLAGS, build with -Werror=deprecated-declarations by
default, and only allow the three examples that intentionally
document deprecated API (the DEPRECATED_EXAMPLES list) to suppress it.

Part of #5718

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
`line.strip("<!-- NOLINT")` followed by `.strip(" -->")` strips any of
the characters in those sets from both ends, not a literal prefix; it
only happened to work for "Examples". A NOLINT'd section name
starting with N, O, L, I or T (e.g. "Notes", "Template parameters",
"Iterator invalidation", "Literals") was silently mangled, so the
suppression did not apply and the checker could report a spurious
missing/misordered section. Parse the comment with a regex instead.
The same fragile strip() pattern was used for heading text; replace it
with a plain prefix slice. Also fix the admonition_title report, which
used the 0-based line index while every other report in the file uses
lineno+1.

Part of #5718

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
The README told readers to run `make nlohmann_json.docset`, but the
Makefile's targets are `all`, `JSON_for_Modern_C++.docset` and
`install_docset_zeal`; the documented command has failed with "No
rule to make target" since #2967 (2021). Point the README at the real
target and folder name. Info.plist's DashDocSetFallbackURL also still
pointed at the old nlohmann.github.io/json/ URL instead of the
canonical https://json.nlohmann.me/ from mkdocs.yml's site_url.

Leave list_missing_pages/list_removed_paths alone: they may become
redundant once #5638's check_docset() lands, which is a follow-up.

Part of #5718

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
parse__iterator_pair.link and parse__pointers.link each held only a
Wandbox "online" permalink from the old Doxygen docs. #3071 deleted
every other .link file in 2021; these two came in through a parallel
PR (#3100) and were never referenced by any page, script or config.

Part of #5718

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
The MacPorts "Example: CMake" block included
integration/homebrew/example.cpp and
integration/homebrew/CMakeLists.txt instead of the MacPorts files
right next to it, a copy-paste slip from the Homebrew section. Nothing
referenced integration/macports/CMakeLists.txt as a result. The page
rendered correctly only because the homebrew, macports and
vcpkg/CMakeLists.txt snippets are byte-identical, so a future edit to
the MacPorts files would not have shown up on the page.

Part of #5718 item 6

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
The checkout step in publish_documentation.yml left the default
persist-credentials: true, so GITHUB_TOKEN stayed writable in
.git/config for the rest of the job (zizmor's artipacked finding). The
Deploy documentation step authenticates through its own github_token
input to peaceiris/actions-gh-pages and does not push with the
checked-out credentials, so persist-credentials: false is safe here,
matching every other checkout in the workflow set.

Overlaps #5638, which edits this same checkout step (adds
fetch-depth: 0); expect a rebase conflict there.

Part of #5718 item 2

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
The docset Makefile's list_missing_pages ran one sqlite3 query per
mkdocs page, and list_removed_paths nested a loop over all mkdocs pages
inside a loop over all docset index paths (O(n*m) shell iteration).
Issue #5718 item 5 suggested removing or reducing these targets once
#5638's check_docset() lands, but that PR is still open and covers only
API pages and macros, not the full page set these targets check.
Replace the loops with two sorted path lists (DOCSET_PAGE_PATHS from
mkdocs' markdown sources, DOCSET_INDEX_PATHS from the built docset
index) compared with a single comm(1) call each, verified to produce
output identical to the old loops against the current docSet.dsidx.

The sed expression used '#' as its delimiter, which GNU Make reads as
a comment character even inside a variable assignment, truncating the
line and orphaning the closing paren of $(shell ...) ("unterminated
call to function 'shell': missing ')'"). Use '@' as the delimiter
instead.

Part of #5718 item 5

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
@nlohmann nlohmann added the review needed It would be great if someone could review the proposed changes. label Sep 30, 2026
@nlohmann nlohmann added 🚀 ready to merge Ready to merge - just waiting for CI to complete. and removed review needed It would be great if someone could review the proposed changes. labels Sep 30, 2026
@nlohmann nlohmann added this to the Release 3.13.0 milestone Sep 30, 2026
@nlohmann
nlohmann merged commit 791cd88 into develop Sep 30, 2026
92 of 159 checks passed
@nlohmann
nlohmann deleted the techdebt/5718-docs-infra branch September 30, 2026 20:15
@github-actions github-actions Bot added documentation aspect: binary formats BSON, CBOR, MessagePack, UBJSON L CI python Pull requests that update Python code labels Oct 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aspect: binary formats BSON, CBOR, MessagePack, UBJSON CI documentation L python Pull requests that update Python code 🚀 ready to merge Ready to merge - just waiting for CI to complete.

Projects

None yet

2 participants