From 6c67ac99c01d408c5f925df15d3f134c28a99675 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Thu, 2 Jul 2026 06:30:38 +0100 Subject: [PATCH] docs: dark manual twin + cross-linked documentation (release prep) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit assets/readme/manual-dark.pdf renders the SAME manual.md through DefaultMarkdownTheme.dark() — one theme object swapped, whole document reskinned; the manual's closing section says so and ManualTest.darkManualComposer() pins it (same page count/structure as light, dark chrome intact). The footer now uses the theme's muted ink so it reads on both surfaces. Documentation is now interlinked for the release: README links both manuals; docs/{architecture,theming,custom-renderers}.md cross-link the manual; theming.md gains the FooterTokens page-chrome section; custom-renderers.md gains the renderer-swap section with the BookTocRenderer example. Suite green (181). --- CHANGELOG.md | 9 ++++++ README.md | 3 +- assets/readme/manual-dark.pdf | Bin 0 -> 43815 bytes assets/readme/manual.md | 4 +++ assets/readme/manual.pdf | Bin 43214 -> 43702 bytes docs/architecture.md | 3 ++ docs/custom-renderers.md | 18 +++++++++++ docs/theming.md | 19 ++++++++++++ .../github/demchaav/markdown/ManualTest.java | 29 ++++++++++++++++-- 9 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 assets/readme/manual-dark.pdf diff --git a/CHANGELOG.md b/CHANGELOG.md index c6e062a..01eab42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,15 @@ and the project follows [Semantic Versioning](https://semver.org/). needs the import updated. `BuiltinRenderers` drops from ~750 to ~440 lines. ### Added +- **Self-rendered user manual, in light and dark.** `assets/readme/manual.md` is a complete + guide — install, quick start, a live tour of every feature, theming, navigation/chrome, + extension seams, CLI — rendered **by the library itself** to `manual.pdf` and, from the same + source through `DefaultMarkdownTheme.dark()`, `manual-dark.pdf`: book-style contents with + live page numbers, "Page N of M" footer, auto-opened outline, vector emoji, smart + punctuation. `ManualTest` keeps the committed PDFs, the test composer and the manual's own + "How this PDF was made" snippet in lockstep. The docs guides (`architecture`, `theming`, + `custom-renderers`) now cross-link the manual and cover `FooterTokens` and the + `BookTocRenderer` swap. - **Opt-in smart punctuation — `MarkdownComposer.builder().smartPunctuation(true)`.** Typographic replacements at parse time: straight quotes become curly quotes (nested formatting inside the quotes survives), apostrophes curl (`don't` → `don’t`), `--` becomes an en-dash, `---` an diff --git a/README.md b/README.md index e28446c..b40729d 100644 --- a/README.md +++ b/README.md @@ -436,7 +436,8 @@ See [examples/README.md](examples/README.md) for the full list. ## Documentation -- **[User manual](assets/readme/manual.md)** → **[manual.pdf](assets/readme/manual.pdf)** — the +- **[User manual](assets/readme/manual.md)** → **[manual.pdf](assets/readme/manual.pdf)** + / **[manual-dark.pdf](assets/readme/manual-dark.pdf)** (same source, dark theme) — the full guide, written in Markdown and rendered to PDF *by the library itself*: book-style contents with live page numbers, "Page N of M" footer, vector emoji, smart punctuation — every feature it documents is demonstrated on its own pages. diff --git a/assets/readme/manual-dark.pdf b/assets/readme/manual-dark.pdf new file mode 100644 index 0000000000000000000000000000000000000000..adb8189995621cb8538134f4bd6c5befeceb4659 GIT binary patch literal 43815 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 D*u&(_ diff --git a/docs/architecture.md b/docs/architecture.md index f557040..ef7ddca 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,5 +1,8 @@ # Architecture +> New here? The [user manual](../assets/readme/manual.md) walks the whole feature set in +> one self-rendered document ([PDF](../assets/readme/manual.pdf)). + graphcompose-markdown is a pipeline of small, decoupled stages. Each stage hands the next a stable data structure, so any stage can be swapped or driven directly. diff --git a/docs/custom-renderers.md b/docs/custom-renderers.md index 60e79b6..7f7f3fa 100644 --- a/docs/custom-renderers.md +++ b/docs/custom-renderers.md @@ -1,5 +1,8 @@ # Custom renderers +> The [user manual](../assets/readme/manual.md) is rendered with a swapped renderer — +> its page-numbered contents is `BookTocRenderer` replacing the default `[TOC]` renderer. + A `NodeRenderer` decides *how* one kind of semantic node becomes a GraphCompose document fragment. Override one to restyle a single element; bundle a set into a `RendererPack` to ship a whole behaviour layer; register one against a `:::` type to @@ -160,3 +163,18 @@ concatenation of all token texts must equal the input verbatim (the renderer rel this to preserve whitespace and indentation). See also: [architecture.md](architecture.md) · [theming.md](theming.md) + +## Swapping a built-in renderer + +Every built-in is replaceable per node type. The library ships one such alternative +itself: `BookTocRenderer` turns the `[TOC]` marker into a print-style contents page with +dot leaders and live page numbers, in place of the default clickable link list: + +```java +MarkdownTheme book = MarkdownTheme.builder(DefaultMarkdownTheme.light()) + .renderer(TocNode.class, new BookTocRenderer("Contents")) + .build(); +``` + +The same seam accepts your own renderer for any node type — tables, code blocks, +headings — while every other component is reused. diff --git a/docs/theming.md b/docs/theming.md index 9c7f26f..5d4b1c7 100644 --- a/docs/theming.md +++ b/docs/theming.md @@ -1,5 +1,10 @@ # Theming +> Want to *see* every theming feature in one rendered document? Open the +> [user manual](../assets/readme/manual.md) and its PDFs — +> [light](../assets/readme/manual.pdf) / [dark](../assets/readme/manual-dark.pdf) are the +> **same Markdown source** through two themes. + A `MarkdownTheme` decides how a document looks. It is built from three layers so you override exactly what you need and reuse everything else. @@ -126,3 +131,17 @@ names, the rich code path is intended for regular-weight code. local and classpath paths; network fetching is opt-in (implement your own resolver). See also: [architecture.md](architecture.md) · [custom-renderers.md](custom-renderers.md) + +## Page chrome: the running footer + +`FooterTokens` is the token group for an optional page footer. It is **disabled by +default**; enable the ready-made "Page N of M" preset, or build a custom one +(`left`/`center`/`right` templates with `{page}`, `{pages}`, `{date}` placeholders, +font size, colour, `showOnFirstPage`): + +```java +MarkdownTheme t = DefaultMarkdownTheme.light(); +MarkdownTheme numbered = MarkdownTheme.builder(t) + .tokens(t.tokens().withFooter(FooterTokens.pageNumbers())) + .build(); +``` diff --git a/src/test/java/io/github/demchaav/markdown/ManualTest.java b/src/test/java/io/github/demchaav/markdown/ManualTest.java index dbb4e89..ef9070a 100644 --- a/src/test/java/io/github/demchaav/markdown/ManualTest.java +++ b/src/test/java/io/github/demchaav/markdown/ManualTest.java @@ -29,10 +29,20 @@ class ManualTest { /** The composer the manual's "How this PDF was made" section shows — kept in lockstep. */ static MarkdownComposer manualComposer() { - MarkdownTheme base = DefaultMarkdownTheme.light(); + return manualComposer(DefaultMarkdownTheme.light()); + } + + /** The dark twin: the same document, reskinned — the committed {@code manual-dark.pdf}. */ + static MarkdownComposer darkManualComposer() { + return manualComposer(DefaultMarkdownTheme.dark()); + } + + private static MarkdownComposer manualComposer(MarkdownTheme base) { MarkdownTheme manualTheme = MarkdownTheme.builder(base) .renderer(TocNode.class, new BookTocRenderer()) - .tokens(base.tokens().withFooter(FooterTokens.pageNumbers())) + .tokens(base.tokens().withFooter( + // The footer picks up the theme's muted ink so it reads on both surfaces. + FooterTokens.pageNumbers().withColor(base.tokens().colors().muted()))) .imageResolver(new DefaultImageResolver(BASE)) .build(); return MarkdownComposer.builder() @@ -73,6 +83,21 @@ void theManualRendersItsWholeFeatureSet() throws Exception { } } + @Test + void theDarkManualRendersTheSameDocumentReskinned() throws Exception { + byte[] light = manualComposer().renderFile(BASE.resolve("manual.md")).toPdfBytes(); + byte[] dark = darkManualComposer().renderFile(BASE.resolve("manual.md")).toPdfBytes(); + + try (PDDocument lightDoc = Loader.loadPDF(light); PDDocument darkDoc = Loader.loadPDF(dark)) { + // Same content, same structure — only the skin differs. + assertThat(darkDoc.getNumberOfPages()).isEqualTo(lightDoc.getNumberOfPages()); + assertThat(darkDoc.getDocumentCatalog().getPageMode()).isEqualTo(PageMode.USE_OUTLINES); + String text = new PDFTextStripper().getText(darkDoc); + assertThat(text).contains("GraphCompose Markdown") + .contains("Page 1 of " + darkDoc.getNumberOfPages()); + } + } + @Test void theManualContentsResolvesPageNumbers() throws Exception { byte[] pdf = manualComposer().renderFile(BASE.resolve("manual.md")).toPdfBytes();