${escapeHtml(code)}${escapeHtml(content)}
+ ${escapeHtml(content)}${escapeHtml(content)}
+ ${escapeHtml(codeText)}`;
+ }
+ break;
+ case "RawInline":
+ if (mode === "inline" || mode === "full") {
+ html += processRawInlineInline(inline, mode);
+ } else {
+ const [format, content] = inline.c;
+ html += `${escapeHtml(content)}`;
+ }
+ break;
+ case "Link":
+ if (mode === "inline" || mode === "full") {
+ html += processLinkInline(inline, mode);
+ } else {
+ const [[, linkClasses], linkText, [url, title]] = inline.c;
+ html += `${processInlines(linkText, mode)}`;
+ }
+ break;
+ case "Image":
+ if (mode === "inline" || mode === "full") {
+ html += processImageInline(inline, mode);
+ } else {
+ const [[imgId, imgClasses, imgAttrs], altText, [url, title]] = inline.c;
+ // In block mode, represent the image as markdown-like syntax in a code tag
+ let imgMarkdown = ` {
+ imgMarkdown += ` "${title}"`;
+ }
+ imgMarkdown += ')';
+
+ // Add attributes if present
+ if (imgId || imgClasses.length > 0 || imgAttrs.length > 0) {
+ imgMarkdown += '{';
+ if (imgId) {
+ imgMarkdown += `#${imgId}`;
+ }
+ for (const cls of imgClasses) {
+ imgMarkdown += ` .${cls}`;
+ }
+ for (const [k, v] of imgAttrs) {
+ imgMarkdown += ` ${k}=${v}`;
+ }
+ imgMarkdown += '}';
+ }
+
+ html += `${escapeHtml(imgMarkdown)}`;
+ }
+ break;
+ case "Math":
+ if (mode === "inline" || mode === "full") {
+ html += processMathInline(inline, mode);
+ } else {
+ const [mathType, content] = inline.c;
+ const type = mathType.t;
+ const isDisplay = type === 'DisplayMath';
+
+ // In block mode, represent the math as TeX/LaTeX in a code tag
+ const delimiter = isDisplay ? '$$' : '$';
+ html += `${delimiter}${escapeHtml(content)}${delimiter}`;
+ }
+ break;
+ case "Quoted":
+ if (mode === "inline" || mode === "full") {
+ html += processQuotedInline(inline, mode);
+ } else {
+ const [quoteType, content] = inline.c;
+ const type = quoteType.t;
+ const isSingle = type === 'SingleQuote';
+
+ // In block mode, represent the quoted text with actual quote marks
+ const quote = isSingle ? "'" : '"';
+ html += `${quote}${processInlines(content, mode)}${quote}`;
+ }
+ break;
+ case "Note":
+ // Note is a special inline element that contains block elements
+ // We always use processNoteInline regardless of mode to properly visualize its structure
+ html += processNoteInline(inline, mode);
+ break;
+ case "Cite":
+ if (mode === "inline" || mode === "full") {
+ html += processCiteInline(inline, mode);
+ } else {
+ // In block mode, just use the text representation
+ const [_, text] = inline.c;
+ html += processInlines(text, mode);
+ }
+ break;
+ case "Span":
+ if (mode === "inline" || mode === "full") {
+ html += processSpanInline(inline, mode);
+ } else {
+ const [[spanId, spanClasses], spanContent] = inline.c;
+ const spanClassAttr = spanClasses.length > 0 ? ` class="${spanClasses.join(' ')}"` : '';
+ const spanIdAttr = spanId ? ` id="${spanId}"` : '';
+ html += `${processInlines(spanContent, mode)}`;
+ }
+ break;
+ // Simple inline types processed with the generic function
+ case "Emph":
+ case "Strong":
+ case "SmallCaps":
+ case "Strikeout":
+ case "Subscript":
+ case "Superscript":
+ case "Underline":
+ if (mode === "inline" || mode === "full") {
+ html += processSimpleInline(inline, mode);
+ } else {
+ const tag = inline.t === "Emph" ? "em" :
+ inline.t === "Strong" ? "strong" :
+ inline.t === "SmallCaps" ? "span class=\"small-caps\"" :
+ inline.t === "Strikeout" ? "s" :
+ inline.t === "Subscript" ? "sub" :
+ inline.t === "Superscript" ? "sup" :
+ inline.t === "Underline" ? "u" : "span";
+ html += `<${tag}>${processInlines(inline.c, mode)}${tag.split(" ")[0]}>`;
+ }
+ break;
+ // Add other inline types as needed
+ default:
+ html += `#${id}`;
+ }
+
+ // Add classes if present
+ if (classes.length > 0) {
+ result += ` ${classes.map(c => `.${c}`).join(' ')}`;
+ }
+
+ // Add attributes if present
+ if (attrs.length > 0) {
+ result += ` ${attrs.map(([k, v]) => `${k}="${v}"`).join(' ')}`;
+ }
+
+ return result;
+}
+
+/**
+ * Simple HTML escape function
+ */
+function escapeHtml(unsafe: string): string {
+ return unsafe
+ .replace(/&/g, "&")
+ .replace(//g, ">")
+ .replace(/"/g, """)
+ .replace(/'/g, "'");
+}
\ No newline at end of file
diff --git a/src/resources/tools/ast-diagram/main.ts b/src/resources/tools/ast-diagram/main.ts
new file mode 100755
index 00000000000..7e35855ff4e
--- /dev/null
+++ b/src/resources/tools/ast-diagram/main.ts
@@ -0,0 +1,119 @@
+#!/usr/bin/env -S deno run --allow-read --allow-write --allow-run
+
+import { join } from "https://deno.land/std/path/mod.ts";
+import { renderPandocAstToBlockDiagram } from "./ast-diagram.ts";
+import { PandocAST } from "./types.ts";
+
+/**
+ * Convert a markdown file to an HTML block diagram
+ */
+async function renderMarkdownToBlockDiagram(
+ markdownFile: string,
+ outputFile: string,
+ mode = "block",
+) {
+ console.log(`Processing ${markdownFile}...`);
+
+ try {
+ // Read the markdown file content
+ console.log("Reading markdown source file...");
+ // Read the CSS file
+ const scriptDir = new URL(".", import.meta.url).pathname;
+ const cssPath = join(scriptDir, "style.css");
+ const cssContent = await Deno.readTextFile(cssPath);
+
+ // Run pandoc to convert markdown to JSON
+ console.log("Running pandoc to convert to JSON...");
+ const command = new Deno.Command("quarto", {
+ args: ["pandoc", "-t", "json", markdownFile],
+ stdout: "piped",
+ });
+
+ const { code, stdout } = await command.output();
+ if (code !== 0) {
+ throw new Error(`Pandoc command failed with exit code ${code}`);
+ }
+
+ const jsonOutput = new TextDecoder().decode(stdout);
+
+ // Parse the JSON
+ console.log("Parsing Pandoc JSON...");
+ const pandocAst = JSON.parse(jsonOutput) as PandocAST;
+ const fullHtml = renderPandocAstToBlockDiagram(pandocAst, cssContent, mode);
+
+ // Write the result to the output file
+ console.log(`Writing output to ${outputFile}...`);
+ await Deno.writeTextFile(outputFile, fullHtml);
+
+ console.log("Done!");
+ return true;
+ } catch (err) {
+ // deno-lint-ignore no-explicit-any
+ console.error("Error:", (err as unknown as any).message);
+ return false;
+ }
+}
+
+// Check if script is run directly
+if (import.meta.main) {
+ // Get markdown file from command line arguments
+ const args = Deno.args;
+
+ // Check for --mode flag and its value
+ let mode = "block";
+ const modeIndex = args.indexOf("--mode");
+ if (modeIndex !== -1 && modeIndex + 1 < args.length) {
+ const modeValue = args[modeIndex + 1];
+ if (
+ modeValue === "block" || modeValue === "inline" || modeValue === "full"
+ ) {
+ mode = modeValue;
+ } else {
+ console.error(
+ "Invalid mode value. Must be 'block', 'inline', or 'full'.",
+ );
+ Deno.exit(1);
+ }
+ }
+
+ // Backwards compatibility for --verbose flag
+ const verboseIndex = args.indexOf("--verbose");
+ if (verboseIndex !== -1) {
+ mode = "inline";
+ }
+
+ // Remove the --mode flag and its value, or --verbose flag for the rest of argument processing
+ const cleanedArgs = [...args];
+ if (modeIndex !== -1) {
+ cleanedArgs.splice(modeIndex, 2); // Remove both flag and value
+ } else if (verboseIndex !== -1) {
+ cleanedArgs.splice(verboseIndex, 1); // Remove just the flag
+ }
+
+ if (cleanedArgs.length < 1) {
+ console.log(
+ "Usage: main.ts [--mode
'
+ - '
'
+ - []
+---
+
+
+{{< brand logo full >}}
+
+Here's some text and [a link](https://example.com).
+
+{{< brand logo header >}}
diff --git a/tests/docs/smoke-all/brand/logo/project-subdirs/html/index.qmd b/tests/docs/smoke-all/brand/logo/project-subdirs/html/index.qmd
new file mode 100644
index 00000000000..b8b0abe8e37
--- /dev/null
+++ b/tests/docs/smoke-all/brand/logo/project-subdirs/html/index.qmd
@@ -0,0 +1,19 @@
+---
+title: "tmpsite"
+_quarto:
+ tests:
+ html:
+ ensureFileRegexMatches:
+ -
+ - '
}}
+
+Here's some text and [a link](https://example.com).
+
+{{< brand logo header >}}
diff --git a/tests/docs/smoke-all/brand/logo/project-subdirs/slides.qmd b/tests/docs/smoke-all/brand/logo/project-subdirs/slides.qmd
new file mode 100644
index 00000000000..b2a8e96ddd0
--- /dev/null
+++ b/tests/docs/smoke-all/brand/logo/project-subdirs/slides.qmd
@@ -0,0 +1,22 @@
+---
+title: "Untitled"
+format: revealjs
+_quarto:
+ tests:
+ revealjs:
+ ensureFileRegexMatches:
+ -
+ - '
}}
+
+Here's some text and [a link](https://example.com).
+
+{{< brand logo header >}}
diff --git a/tests/docs/smoke-all/brand/logo/project-subdirs/typst/typst.qmd b/tests/docs/smoke-all/brand/logo/project-subdirs/typst/typst.qmd
new file mode 100644
index 00000000000..b5d5a07c210
--- /dev/null
+++ b/tests/docs/smoke-all/brand/logo/project-subdirs/typst/typst.qmd
@@ -0,0 +1,22 @@
+---
+title: "tmpsite"
+format:
+ typst:
+ output-ext: typ
+_quarto:
+ tests:
+ typst:
+ ensureTypstFileRegexMatches:
+ -
+ - '#set page\(background:.*image\("\.\.(/|\\\\)brand(/|\\\\)images(/|\\\\)favicon\.png'
+ - '#box\(image\("\.\.(/|\\\\)brand(/|\\\\)images(/|\\\\)logo.png"\)\)'
+ - '#box\(image\("\.\.(/|\\\\)brand(/|\\\\)images(/|\\\\)header.png"\)\)'
+ - []
+---
+
+
+{{< brand logo full >}}
+
+Here's some text and [a link](https://example.com).
+
+{{< brand logo header >}}
diff --git a/tests/docs/smoke-all/brand/logo/sidebar/brand-default/.gitignore b/tests/docs/smoke-all/brand/logo/sidebar/brand-default/.gitignore
index 075b2542afb..0e3521a7d0f 100644
--- a/tests/docs/smoke-all/brand/logo/sidebar/brand-default/.gitignore
+++ b/tests/docs/smoke-all/brand/logo/sidebar/brand-default/.gitignore
@@ -1 +1,3 @@
/.quarto/
+
+**/*.quarto_ipynb
diff --git a/tests/docs/smoke-all/brand/logo/sidebar/brand-override-alt/.gitignore b/tests/docs/smoke-all/brand/logo/sidebar/brand-override-alt/.gitignore
index 075b2542afb..0e3521a7d0f 100644
--- a/tests/docs/smoke-all/brand/logo/sidebar/brand-override-alt/.gitignore
+++ b/tests/docs/smoke-all/brand/logo/sidebar/brand-override-alt/.gitignore
@@ -1 +1,3 @@
/.quarto/
+
+**/*.quarto_ipynb
diff --git a/tests/docs/smoke-all/brand/logo/sidebar/brand-override-resources/.gitignore b/tests/docs/smoke-all/brand/logo/sidebar/brand-override-resources/.gitignore
index 075b2542afb..0e3521a7d0f 100644
--- a/tests/docs/smoke-all/brand/logo/sidebar/brand-override-resources/.gitignore
+++ b/tests/docs/smoke-all/brand/logo/sidebar/brand-override-resources/.gitignore
@@ -1 +1,3 @@
/.quarto/
+
+**/*.quarto_ipynb
diff --git a/tests/docs/smoke-all/brand/logo/sidebar/mode-first-search/.gitignore b/tests/docs/smoke-all/brand/logo/sidebar/mode-first-search/.gitignore
index 9e01345e0d5..a31c1396976 100644
--- a/tests/docs/smoke-all/brand/logo/sidebar/mode-first-search/.gitignore
+++ b/tests/docs/smoke-all/brand/logo/sidebar/mode-first-search/.gitignore
@@ -1,2 +1,4 @@
_site/
/.quarto/
+
+**/*.quarto_ipynb
diff --git a/tests/docs/smoke-all/brand/logo/sidebar/size-preference-order/.gitignore b/tests/docs/smoke-all/brand/logo/sidebar/size-preference-order/.gitignore
index 9e01345e0d5..a31c1396976 100644
--- a/tests/docs/smoke-all/brand/logo/sidebar/size-preference-order/.gitignore
+++ b/tests/docs/smoke-all/brand/logo/sidebar/size-preference-order/.gitignore
@@ -1,2 +1,4 @@
_site/
/.quarto/
+
+**/*.quarto_ipynb
diff --git a/tests/docs/smoke-all/brand/logo/sidebar/theme-dark-mode-enables-dark-logo/.gitignore b/tests/docs/smoke-all/brand/logo/sidebar/theme-dark-mode-enables-dark-logo/.gitignore
index 075b2542afb..0e3521a7d0f 100644
--- a/tests/docs/smoke-all/brand/logo/sidebar/theme-dark-mode-enables-dark-logo/.gitignore
+++ b/tests/docs/smoke-all/brand/logo/sidebar/theme-dark-mode-enables-dark-logo/.gitignore
@@ -1 +1,3 @@
/.quarto/
+
+**/*.quarto_ipynb
diff --git a/tests/docs/smoke-all/brand/logo/source-sans-pro/.gitignore b/tests/docs/smoke-all/brand/logo/source-sans-pro/.gitignore
new file mode 100644
index 00000000000..0a60a0663a7
--- /dev/null
+++ b/tests/docs/smoke-all/brand/logo/source-sans-pro/.gitignore
@@ -0,0 +1,2 @@
+*.html
+*_files/
diff --git a/tests/docs/smoke-all/brand/logo/source-sans-pro/_brand.yml b/tests/docs/smoke-all/brand/logo/source-sans-pro/_brand.yml
new file mode 100644
index 00000000000..34d5763b1c2
--- /dev/null
+++ b/tests/docs/smoke-all/brand/logo/source-sans-pro/_brand.yml
@@ -0,0 +1,17 @@
+typography:
+ fonts:
+ - family: "Source Sans Pro"
+ source: file
+ files:
+ - fonts/source-sans-pro/source-sans-pro-regular.woff
+ - path: fonts/source-sans-pro/source-sans-pro-italic.woff
+ style: italic
+ - path: fonts/source-sans-pro/source-sans-pro-semibold.woff
+ weight: 600
+ - path: fonts/source-sans-pro/source-sans-pro-semibolditalic.woff
+ style: italic
+ weight: 600
+ base:
+ family: Source Sans Pro
+ line-height: 1.25
+ size: 1rem
diff --git a/tests/docs/smoke-all/brand/logo/source-sans-pro/brand.yml b/tests/docs/smoke-all/brand/logo/source-sans-pro/brand.yml
new file mode 100644
index 00000000000..f547767203c
--- /dev/null
+++ b/tests/docs/smoke-all/brand/logo/source-sans-pro/brand.yml
@@ -0,0 +1,28 @@
+typography:
+ fonts:
+ - family: "Source Sans Pro"
+ source: file
+ files:
+ - path: fonts/source-sans-pro/source-sans-pro-regular.woff
+
+ - family: "Fira Code"
+ source: file
+ files:
+ - fonts/firacode/FiraCode-VF.ttf
+ - family: "Roboto Slab"
+ source: file
+ files:
+ - path: fonts/robotoslab/RobotoSlab-VariableFont_wght.ttf
+ weight: 600
+ style: normal
+ base:
+ family: Source Sans Pro
+ line-height: 1.25
+ size: 1rem
+ headings:
+ family: Roboto Slab
+ color: primary
+ weight: 600
+ monospace:
+ family: Fira Code
+ size: 0.9em
diff --git a/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-italic.woff b/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-italic.woff
new file mode 100755
index 00000000000..ceecbf17f3b
Binary files /dev/null and b/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-italic.woff differ
diff --git a/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-regular.woff b/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-regular.woff
new file mode 100755
index 00000000000..630754abf39
Binary files /dev/null and b/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-regular.woff differ
diff --git a/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-semibold.woff b/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-semibold.woff
new file mode 100755
index 00000000000..8888cf8d4f9
Binary files /dev/null and b/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-semibold.woff differ
diff --git a/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff b/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff
new file mode 100755
index 00000000000..7c2d3c74f19
Binary files /dev/null and b/tests/docs/smoke-all/brand/logo/source-sans-pro/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff differ
diff --git a/tests/docs/smoke-all/brand/logo/source-sans-pro/source-sans-pro.qmd b/tests/docs/smoke-all/brand/logo/source-sans-pro/source-sans-pro.qmd
new file mode 100644
index 00000000000..0976817b984
--- /dev/null
+++ b/tests/docs/smoke-all/brand/logo/source-sans-pro/source-sans-pro.qmd
@@ -0,0 +1,14 @@
+---
+title: Source Sans Pro
+---
+
+This text **should be** in Source Sans Pro, _and_ some ***variants***.
+
+{{< lipsum 1 >}}
+
+**{{< lipsum 1 >}}**
+
+*{{< lipsum 1 >}}*
+
+***{{< lipsum 1 >}}***
+
diff --git a/tests/docs/smoke-all/brand/logo/theme-dark-project-brand-file-light/.gitignore b/tests/docs/smoke-all/brand/logo/theme-dark-project-brand-file-light/.gitignore
index 075b2542afb..0e3521a7d0f 100644
--- a/tests/docs/smoke-all/brand/logo/theme-dark-project-brand-file-light/.gitignore
+++ b/tests/docs/smoke-all/brand/logo/theme-dark-project-brand-file-light/.gitignore
@@ -1 +1,3 @@
/.quarto/
+
+**/*.quarto_ipynb
diff --git a/tests/docs/smoke-all/brand/logo/url-logo.qmd b/tests/docs/smoke-all/brand/logo/url-logo.qmd
index 45babc67aaa..b9aed9809a7 100644
--- a/tests/docs/smoke-all/brand/logo/url-logo.qmd
+++ b/tests/docs/smoke-all/brand/logo/url-logo.qmd
@@ -1,7 +1,6 @@
---
title: "Reproducible Quarto Document"
format:
- html: default
dashboard: default
revealjs: default
typst:
@@ -15,12 +14,6 @@ brand:
small: quarto-logo
_quarto:
tests:
- html:
- ensureHtmlElements:
- -
- - 'img[class*="light-content"][src="https://quarto.org/quarto.png"][alt="Quarto icon"]'
- -
- - 'img[class*="dark-content"]'
dashboard:
ensureHtmlElements:
-
@@ -44,6 +37,4 @@ This is a reproducible Quarto document using `format: html`. It is written in Ma
{{< lipsum 1 >}}
-{{< brand logo small>}}
-
The end.
\ No newline at end of file
diff --git a/tests/docs/smoke-all/brand/logo/website-favicon/.gitignore b/tests/docs/smoke-all/brand/logo/website-favicon/.gitignore
index 075b2542afb..0e3521a7d0f 100644
--- a/tests/docs/smoke-all/brand/logo/website-favicon/.gitignore
+++ b/tests/docs/smoke-all/brand/logo/website-favicon/.gitignore
@@ -1 +1,3 @@
/.quarto/
+
+**/*.quarto_ipynb
diff --git a/tests/docs/smoke-all/issues/4820-giscus-dark-mode/README b/tests/docs/smoke-all/issues/4820-giscus-dark-mode/README
new file mode 100644
index 00000000000..1876f70978c
--- /dev/null
+++ b/tests/docs/smoke-all/issues/4820-giscus-dark-mode/README
@@ -0,0 +1 @@
+29-08-2025 - Those tests are for now ignored because they rely on a repo that is not accessible anymore. They need to be recreated, and it could take time. We don't want our test suites to be blocked by this.
diff --git a/tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-default/index.qmd b/tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-default/_index.qmd
similarity index 100%
rename from tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-default/index.qmd
rename to tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-default/_index.qmd
diff --git a/tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-light-cobalt/index.qmd b/tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-light-cobalt/_index.qmd
similarity index 100%
rename from tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-light-cobalt/index.qmd
rename to tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-light-cobalt/_index.qmd
diff --git a/tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-light-dark/index.qmd b/tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-light-dark/_index.qmd
similarity index 100%
rename from tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-light-dark/index.qmd
rename to tests/docs/smoke-all/issues/4820-giscus-dark-mode/darkly-light-dark/_index.qmd
diff --git a/tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-cobalt_only/index.qmd b/tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-cobalt_only/_index.qmd
similarity index 100%
rename from tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-cobalt_only/index.qmd
rename to tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-cobalt_only/_index.qmd
diff --git a/tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-default/index.qmd b/tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-default/_index.qmd
similarity index 100%
rename from tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-default/index.qmd
rename to tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-default/_index.qmd
diff --git a/tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-light-cobalt/index.qmd b/tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-light-cobalt/_index.qmd
similarity index 100%
rename from tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-light-cobalt/index.qmd
rename to tests/docs/smoke-all/issues/4820-giscus-dark-mode/lightly-light-cobalt/_index.qmd
diff --git a/tests/docs/smoke-all/shortcodes/brand-logo-both.qmd b/tests/docs/smoke-all/shortcodes/brand-logo-both.qmd
index d91b4708056..5780c12ddea 100644
--- a/tests/docs/smoke-all/shortcodes/brand-logo-both.qmd
+++ b/tests/docs/smoke-all/shortcodes/brand-logo-both.qmd
@@ -19,10 +19,10 @@ brand:
_quarto:
tests:
html:
- ensureHtmlElements:
+ ensureFileRegexMatches:
-
- - 'img[src="sun.png"][alt="sun"][class*="light-content"]'
- - 'img[src="moon.png"][alt="moon"][class*="dark-content"]'
+ - '
'
+ - '
'
- []
---
diff --git a/tests/docs/smoke-all/shortcodes/brand-logo-dark.qmd b/tests/docs/smoke-all/shortcodes/brand-logo-dark.qmd
index c20a00ba174..5af745241cb 100644
--- a/tests/docs/smoke-all/shortcodes/brand-logo-dark.qmd
+++ b/tests/docs/smoke-all/shortcodes/brand-logo-dark.qmd
@@ -11,9 +11,9 @@ brand:
_quarto:
tests:
html:
- ensureHtmlElements:
+ ensureFileRegexMatches:
-
- - 'img[src="moon.png"][class*="dark-content"]'
+ - '
'
+ - '
'
+ - '
'
- []
---
diff --git a/tests/docs/smoke-all/shortcodes/brand-logo-unified-brand-both.qmd b/tests/docs/smoke-all/shortcodes/brand-logo-unified-brand-both.qmd
index 418995f8f18..0eb1f368329 100644
--- a/tests/docs/smoke-all/shortcodes/brand-logo-unified-brand-both.qmd
+++ b/tests/docs/smoke-all/shortcodes/brand-logo-unified-brand-both.qmd
@@ -13,10 +13,10 @@ brand:
_quarto:
tests:
html:
- ensureHtmlElements:
+ ensureFileRegexMatches:
-
- - 'img[src="sun.png"][class*="light-content"]'
- - 'img[src="moon.png"][class*="dark-content"]'
+ - '
'
---
diff --git a/tests/docs/smoke-all/shortcodes/brand-logo-unified-brand.qmd b/tests/docs/smoke-all/shortcodes/brand-logo-unified-brand.qmd
index 5e7e06085c8..855405b726e 100644
--- a/tests/docs/smoke-all/shortcodes/brand-logo-unified-brand.qmd
+++ b/tests/docs/smoke-all/shortcodes/brand-logo-unified-brand.qmd
@@ -11,10 +11,10 @@ brand:
_quarto:
tests:
html:
- ensureHtmlElements:
+ ensureFileRegexMatches:
-
- - 'img[src="sun.png"][class*="light-content"]'
- - 'img[src="sun.png"][class*="dark-content"]'
+ - '
assertFound("! LaTeX Error: File `framed.sty' not found.", "framed.sty");
assertFound("/usr/local/bin/mktexpk: line 123: mf: command not found", "mf");
assertFound("or the language definition file ngerman.ldf was not found", "ngerman.ldf");
+ assertFound(`Package babel Error: Unknown option 'ngerman'. Either you misspelled it
+ (babel) or the language definition file ngerman.ldf
+ (babel) was not found.
+ (babel) There is a locale ini file for this language.
+ (babel) If it’s the main language, try adding \`provide=*'
+ (babel) to the babel package options.`, "ngerman.ldf")
assertFound("!pdfTeX error: pdflatex (file 8r.enc): cannot open encoding file for reading", "8r.enc");
assertFound("! CTeX fontset `fandol' is unavailable in current mode", "fandol");
assertFound('Package widetext error: Install the flushend package which is a part of sttools', "flushend.sty");
diff --git a/tests/verify.ts b/tests/verify.ts
index f871dfe22c3..bd8689bec0a 100644
--- a/tests/verify.ts
+++ b/tests/verify.ts
@@ -153,6 +153,11 @@ export const noErrorsOrWarnings: Verify = {
const isErrorOrWarning = (output: ExecuteOutput) => {
return output.levelName.toLowerCase() === "warn" ||
output.levelName.toLowerCase() === "error";
+ // I'd like to do this but many many of our tests
+ // would fail right now because we're assuming noErrorsOrWarnings
+ // doesn't include warnings from the lua subsystem
+ // ||
+ // output.msg.startsWith("(W)"); // this is a warning from quarto.log.warning()
};
const errorsOrWarnings = outputs.some(isErrorOrWarning);
diff --git a/version.txt b/version.txt
index 2fef18adb3a..1ebc94b454c 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-1.8.21
+1.8.22