From 29dc9bb3c95c98efb7a10e8432be182c8d651e92 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 11 Sep 2026 17:36:59 +0200 Subject: [PATCH 1/2] fix: apply book-level website tool options in book projects HTML books are websites, and the documented contract is that website tools go under the `book` key in a book project rather than under `website`. The book project type implements this by copying a hand-maintained list of website keys from `book` into the internal website config. Keys added to the website schema after that list was written were never added to it, so those options validated against the book schema and then silently did nothing, with no warning. This adds the five keys that had drifted out of sync: `plausible-analytics`, `llms-txt`, `announcement`, `back-to-top-navigation`, and `image-alt`. Setting these under a top-level `website` key in a book project happened to work before, because a key absent from the copy list was left untouched. Now that they are on the list they follow the same rule as every other website tool in a book and are read from `book`, so that incidental form no longer applies. Closes #10114 Closes #14276 Closes #14879 --- news/changelog-1.11.md | 8 ++++++++ src/project/types/book/book-config.ts | 10 ++++++++++ .../docs/smoke-all/book/announcement/.gitignore | 3 +++ .../smoke-all/book/announcement/_quarto.yml | 14 ++++++++++++++ .../docs/smoke-all/book/announcement/index.qmd | 13 +++++++++++++ .../book/back-to-top-navigation/.gitignore | 3 +++ .../book/back-to-top-navigation/_quarto.yml | 12 ++++++++++++ .../book/back-to-top-navigation/index.qmd | 13 +++++++++++++ tests/docs/smoke-all/book/image-alt/.gitignore | 3 +++ tests/docs/smoke-all/book/image-alt/_quarto.yml | 16 ++++++++++++++++ tests/docs/smoke-all/book/image-alt/cover.png | Bin 0 -> 51194 bytes tests/docs/smoke-all/book/image-alt/index.qmd | 14 ++++++++++++++ tests/docs/smoke-all/book/llms-txt/.gitignore | 3 +++ tests/docs/smoke-all/book/llms-txt/_quarto.yml | 13 +++++++++++++ tests/docs/smoke-all/book/llms-txt/index.qmd | 16 ++++++++++++++++ .../book/plausible-analytics/.gitignore | 3 +++ .../plausible-analytics/_plausible_snippet.html | 1 + .../book/plausible-analytics/_quarto.yml | 13 +++++++++++++ .../book/plausible-analytics/index.qmd | 13 +++++++++++++ 19 files changed, 171 insertions(+) create mode 100644 tests/docs/smoke-all/book/announcement/.gitignore create mode 100644 tests/docs/smoke-all/book/announcement/_quarto.yml create mode 100644 tests/docs/smoke-all/book/announcement/index.qmd create mode 100644 tests/docs/smoke-all/book/back-to-top-navigation/.gitignore create mode 100644 tests/docs/smoke-all/book/back-to-top-navigation/_quarto.yml create mode 100644 tests/docs/smoke-all/book/back-to-top-navigation/index.qmd create mode 100644 tests/docs/smoke-all/book/image-alt/.gitignore create mode 100644 tests/docs/smoke-all/book/image-alt/_quarto.yml create mode 100644 tests/docs/smoke-all/book/image-alt/cover.png create mode 100644 tests/docs/smoke-all/book/image-alt/index.qmd create mode 100644 tests/docs/smoke-all/book/llms-txt/.gitignore create mode 100644 tests/docs/smoke-all/book/llms-txt/_quarto.yml create mode 100644 tests/docs/smoke-all/book/llms-txt/index.qmd create mode 100644 tests/docs/smoke-all/book/plausible-analytics/.gitignore create mode 100644 tests/docs/smoke-all/book/plausible-analytics/_plausible_snippet.html create mode 100644 tests/docs/smoke-all/book/plausible-analytics/_quarto.yml create mode 100644 tests/docs/smoke-all/book/plausible-analytics/index.qmd diff --git a/news/changelog-1.11.md b/news/changelog-1.11.md index 9125563e868..066c539bf2e 100644 --- a/news/changelog-1.11.md +++ b/news/changelog-1.11.md @@ -35,6 +35,14 @@ All changes included in 1.11: - ([#14847](https://github.com/quarto-dev/quarto-cli/pull/14847)): Fix `toc_title` auto-fallback in typst outline template that was ignoring the computed fallback value when `toc_title` is `none`. +## Projects + +### Books + +- ([#10114](https://github.com/quarto-dev/quarto-cli/issues/10114)): Support `announcement` under the `book` key, which previously had no effect. +- ([#14276](https://github.com/quarto-dev/quarto-cli/issues/14276)): Support `llms-txt` under the `book` key, which previously had no effect. +- ([#14879](https://github.com/quarto-dev/quarto-cli/issues/14879)): Support `plausible-analytics`, `back-to-top-navigation`, and `image-alt` under the `book` key, which previously had no effect. + ## Commands ### `call` diff --git a/src/project/types/book/book-config.ts b/src/project/types/book/book-config.ts index bb721e9526d..255947ae3a3 100644 --- a/src/project/types/book/book-config.ts +++ b/src/project/types/book/book-config.ts @@ -37,11 +37,15 @@ import { import { kProjectRender, ProjectConfig } from "../../types.ts"; import { + kAnnouncement, + kBackToTopNavigation, kBodyFooter, kBodyHeader, kBreadCrumbNavigation, kContents, kImage, + kImageAlt, + kLlmsTxt, kMarginFooter, kMarginHeader, kOpenGraph, @@ -114,6 +118,7 @@ import { import { kCookieConsent, kGoogleAnalytics, + kPlausibleAnalytics, } from "../website/website-analytics.ts"; import { RenderFlags } from "../../../command/render/types.ts"; import { formatLanguage } from "../../../core/language.ts"; @@ -162,6 +167,7 @@ export async function bookProjectConfig( site[kOpenGraph] = book[kOpenGraph]; site[kTwitterCard] = book[kTwitterCard]; site[kImage] = book[kImage]; + site[kImageAlt] = book[kImageAlt]; site[kMarginHeader] = book[kMarginHeader]; site[kMarginFooter] = book[kMarginFooter]; site[kBodyHeader] = book[kBodyHeader]; @@ -169,7 +175,11 @@ export async function bookProjectConfig( site[kBookSearch] = book[kBookSearch]; site[kSiteReaderMode] = book[kSiteReaderMode]; site[kGoogleAnalytics] = book[kGoogleAnalytics]; + site[kPlausibleAnalytics] = book[kPlausibleAnalytics]; site[kCookieConsent] = book[kCookieConsent]; + site[kAnnouncement] = book[kAnnouncement]; + site[kBackToTopNavigation] = book[kBackToTopNavigation]; + site[kLlmsTxt] = book[kLlmsTxt]; site[kComments] = book[kComments]; site[kBreadCrumbNavigation] = book[kBreadCrumbNavigation]; site[kOtherLinks] = book[kOtherLinks]; diff --git a/tests/docs/smoke-all/book/announcement/.gitignore b/tests/docs/smoke-all/book/announcement/.gitignore new file mode 100644 index 00000000000..1805b039507 --- /dev/null +++ b/tests/docs/smoke-all/book/announcement/.gitignore @@ -0,0 +1,3 @@ +/.quarto/ +/_book/ +**/*.quarto_ipynb diff --git a/tests/docs/smoke-all/book/announcement/_quarto.yml b/tests/docs/smoke-all/book/announcement/_quarto.yml new file mode 100644 index 00000000000..9c02efcb72a --- /dev/null +++ b/tests/docs/smoke-all/book/announcement/_quarto.yml @@ -0,0 +1,14 @@ +project: + type: book + +book: + title: "Announcement Book" + announcement: + content: "Some information you should pay attention to" + type: primary + chapters: + - index.qmd + +format: + html: + theme: cosmo diff --git a/tests/docs/smoke-all/book/announcement/index.qmd b/tests/docs/smoke-all/book/announcement/index.qmd new file mode 100644 index 00000000000..bff7664ad20 --- /dev/null +++ b/tests/docs/smoke-all/book/announcement/index.qmd @@ -0,0 +1,13 @@ +--- +_quarto: + tests: + html: + ensureHtmlElements: + - + - 'div#quarto-announcement.alert-primary div.quarto-announcement-content' +--- + +# Preface {.unnumbered} + +An announcement configured under the `book` key must render the announcement +bar in the book website output. diff --git a/tests/docs/smoke-all/book/back-to-top-navigation/.gitignore b/tests/docs/smoke-all/book/back-to-top-navigation/.gitignore new file mode 100644 index 00000000000..1805b039507 --- /dev/null +++ b/tests/docs/smoke-all/book/back-to-top-navigation/.gitignore @@ -0,0 +1,3 @@ +/.quarto/ +/_book/ +**/*.quarto_ipynb diff --git a/tests/docs/smoke-all/book/back-to-top-navigation/_quarto.yml b/tests/docs/smoke-all/book/back-to-top-navigation/_quarto.yml new file mode 100644 index 00000000000..3696b2d17b0 --- /dev/null +++ b/tests/docs/smoke-all/book/back-to-top-navigation/_quarto.yml @@ -0,0 +1,12 @@ +project: + type: book + +book: + title: "Back To Top Book" + back-to-top-navigation: true + chapters: + - index.qmd + +format: + html: + theme: cosmo diff --git a/tests/docs/smoke-all/book/back-to-top-navigation/index.qmd b/tests/docs/smoke-all/book/back-to-top-navigation/index.qmd new file mode 100644 index 00000000000..f23cff94b63 --- /dev/null +++ b/tests/docs/smoke-all/book/back-to-top-navigation/index.qmd @@ -0,0 +1,13 @@ +--- +_quarto: + tests: + html: + ensureHtmlElements: + - + - 'a#quarto-back-to-top[role="button"]' +--- + +# Preface {.unnumbered} + +`back-to-top-navigation` under the `book` key must add the back to top control +to the book website output. diff --git a/tests/docs/smoke-all/book/image-alt/.gitignore b/tests/docs/smoke-all/book/image-alt/.gitignore new file mode 100644 index 00000000000..1805b039507 --- /dev/null +++ b/tests/docs/smoke-all/book/image-alt/.gitignore @@ -0,0 +1,3 @@ +/.quarto/ +/_book/ +**/*.quarto_ipynb diff --git a/tests/docs/smoke-all/book/image-alt/_quarto.yml b/tests/docs/smoke-all/book/image-alt/_quarto.yml new file mode 100644 index 00000000000..4f5bd8ee46d --- /dev/null +++ b/tests/docs/smoke-all/book/image-alt/_quarto.yml @@ -0,0 +1,16 @@ +project: + type: book + +book: + title: "Image Alt Book" + site-url: "https://example.com" + open-graph: true + twitter-card: true + image: cover.png + image-alt: "A description of the preview image" + chapters: + - index.qmd + +format: + html: + theme: cosmo diff --git a/tests/docs/smoke-all/book/image-alt/cover.png b/tests/docs/smoke-all/book/image-alt/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f5bc61d11049afe5b5dc2a67a3a32f406be964 GIT binary patch literal 51194 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

sLQu|F-aZhE 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�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 Vyw!|9>LU1OnX%cT*addJ{|^#&e**vj literal 0 HcmV?d00001 diff --git a/tests/docs/smoke-all/book/image-alt/index.qmd b/tests/docs/smoke-all/book/image-alt/index.qmd new file mode 100644 index 00000000000..0cbcd460c5b --- /dev/null +++ b/tests/docs/smoke-all/book/image-alt/index.qmd @@ -0,0 +1,14 @@ +--- +_quarto: + tests: + html: + ensureHtmlElements: + - + - 'meta[property="og:image:alt"][content="A description of the preview image"]' + - 'meta[name="twitter:image:alt"][content="A description of the preview image"]' +--- + +# Preface {.unnumbered} + +`image-alt` under the `book` key must set the alt text on the social metadata +preview image. diff --git a/tests/docs/smoke-all/book/llms-txt/.gitignore b/tests/docs/smoke-all/book/llms-txt/.gitignore new file mode 100644 index 00000000000..1805b039507 --- /dev/null +++ b/tests/docs/smoke-all/book/llms-txt/.gitignore @@ -0,0 +1,3 @@ +/.quarto/ +/_book/ +**/*.quarto_ipynb diff --git a/tests/docs/smoke-all/book/llms-txt/_quarto.yml b/tests/docs/smoke-all/book/llms-txt/_quarto.yml new file mode 100644 index 00000000000..20c1bb64286 --- /dev/null +++ b/tests/docs/smoke-all/book/llms-txt/_quarto.yml @@ -0,0 +1,13 @@ +project: + type: book + +book: + title: "llms-txt Book" + site-url: "https://example.com" + llms-txt: true + chapters: + - index.qmd + +format: + html: + theme: cosmo diff --git a/tests/docs/smoke-all/book/llms-txt/index.qmd b/tests/docs/smoke-all/book/llms-txt/index.qmd new file mode 100644 index 00000000000..82528270613 --- /dev/null +++ b/tests/docs/smoke-all/book/llms-txt/index.qmd @@ -0,0 +1,16 @@ +--- +_quarto: + render-project: true + tests: + html: + ensureLlmsTxtExists: true + ensureLlmsMdExists: true + ensureLlmsTxtRegexMatches: + - ['^# llms-txt Book', '^## Pages', '\[.*\]\(.*\.llms\.md\)'] + - [] +--- + +# Preface {.unnumbered} + +`llms-txt` set under the `book` key must generate the llms.txt index, the same +way it does under `website`. diff --git a/tests/docs/smoke-all/book/plausible-analytics/.gitignore b/tests/docs/smoke-all/book/plausible-analytics/.gitignore new file mode 100644 index 00000000000..1805b039507 --- /dev/null +++ b/tests/docs/smoke-all/book/plausible-analytics/.gitignore @@ -0,0 +1,3 @@ +/.quarto/ +/_book/ +**/*.quarto_ipynb diff --git a/tests/docs/smoke-all/book/plausible-analytics/_plausible_snippet.html b/tests/docs/smoke-all/book/plausible-analytics/_plausible_snippet.html new file mode 100644 index 00000000000..92af7a8e81f --- /dev/null +++ b/tests/docs/smoke-all/book/plausible-analytics/_plausible_snippet.html @@ -0,0 +1 @@ + diff --git a/tests/docs/smoke-all/book/plausible-analytics/_quarto.yml b/tests/docs/smoke-all/book/plausible-analytics/_quarto.yml new file mode 100644 index 00000000000..704bf271bc3 --- /dev/null +++ b/tests/docs/smoke-all/book/plausible-analytics/_quarto.yml @@ -0,0 +1,13 @@ +project: + type: book + +book: + title: "Plausible Analytics Book" + chapters: + - index.qmd + plausible-analytics: + path: _plausible_snippet.html + +format: + html: + theme: cosmo diff --git a/tests/docs/smoke-all/book/plausible-analytics/index.qmd b/tests/docs/smoke-all/book/plausible-analytics/index.qmd new file mode 100644 index 00000000000..c57e3f1d52d --- /dev/null +++ b/tests/docs/smoke-all/book/plausible-analytics/index.qmd @@ -0,0 +1,13 @@ +--- +_quarto: + tests: + html: + ensureHtmlElements: + - + - 'script[async][src="https://plausible.io/js/pa-BOOKFILE99.js"]' +--- + +# Preface {.unnumbered} + +Plausible Analytics configured under the `book` key must be applied to the +rendered book website, the same way `google-analytics` is. From b364978888e24f7bb57835bb8caeec7c950c917b Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 11 Sep 2026 17:49:05 +0200 Subject: [PATCH 2/2] test: ignore search.json and site_libs in two llms-txt website tests Both tests render with `output-dir: .`, so search.json and site_libs/ land in the source directory and show up as untracked files after any run of the website suite. Their sibling llms-txt-shortcode already ignores both; these two were copied from an earlier version of that list. search.json is spelled out rather than globbed as *.json because llms-txt-listing has a tracked listings.json fixture. --- tests/docs/smoke-all/website/llms-txt-drafts/.gitignore | 2 ++ tests/docs/smoke-all/website/llms-txt-listing/.gitignore | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tests/docs/smoke-all/website/llms-txt-drafts/.gitignore b/tests/docs/smoke-all/website/llms-txt-drafts/.gitignore index c96a27a6e40..1252e779970 100644 --- a/tests/docs/smoke-all/website/llms-txt-drafts/.gitignore +++ b/tests/docs/smoke-all/website/llms-txt-drafts/.gitignore @@ -2,6 +2,8 @@ *.html *.llms.md llms.txt +search.json +site_libs/ *_files/ **/*.quarto_ipynb diff --git a/tests/docs/smoke-all/website/llms-txt-listing/.gitignore b/tests/docs/smoke-all/website/llms-txt-listing/.gitignore index c96a27a6e40..1252e779970 100644 --- a/tests/docs/smoke-all/website/llms-txt-listing/.gitignore +++ b/tests/docs/smoke-all/website/llms-txt-listing/.gitignore @@ -2,6 +2,8 @@ *.html *.llms.md llms.txt +search.json +site_libs/ *_files/ **/*.quarto_ipynb