From 51cf01074968cf13c43db523e64e6275dc770da3 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 3 Sep 2024 11:02:41 +0200 Subject: [PATCH 1/8] revealjs - Move quarto-auto-generated-content outside of slides it contains slide-logo and footer default moved around by quarto-support revealjs plugin --- src/format/reveal/format-reveal.ts | 33 ++++++++---------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/format/reveal/format-reveal.ts b/src/format/reveal/format-reveal.ts index 3633603df17..b96888bfeb8 100644 --- a/src/format/reveal/format-reveal.ts +++ b/src/format/reveal/format-reveal.ts @@ -320,7 +320,7 @@ export function revealjsFormat() { function revealMarkdownAfterBody(format: Format) { const lines: string[] = []; - lines.push("::: {.quarto-auto-generated-content}\n"); + lines.push("::: {.quarto-auto-generated-content style='display: none;'}\n"); if (format.metadata[kSlideLogo]) { lines.push( ``, @@ -396,30 +396,13 @@ const handleHashTypeNumber = ( }; const handleAutoGeneratedContent = (doc: Document) => { - // bugfix for #6800 - // if slides have content that was added by quarto then move that to the parent node - for (const slide of doc.querySelectorAll("section.slide")) { - const slideContentFromQuarto = (slide as Element).querySelector( - ".quarto-auto-generated-content", - ); - if ( - slideContentFromQuarto && - (slide as Element).getAttribute("data-visibility") === "hidden" - ) { - if (slideContentFromQuarto.childElementCount === 0) { - slideContentFromQuarto.remove(); - } else { - for (const otherSlide of doc.querySelectorAll("section.slide")) { - if ( - (otherSlide as Element).getAttribute("data-visibility") !== - "hidden" - ) { - otherSlide.appendChild(slideContentFromQuarto); - break; - } - } - } - } + // Move quarto auto-generated content outside of slides and hide it + // Content is moved with appendChild in quarto-support plugin + const slideContentFromQuarto = doc.querySelector( + ".quarto-auto-generated-content", + ); + if (slideContentFromQuarto) { + doc.querySelector("div.reveal")?.appendChild(slideContentFromQuarto); } }; From 9f49861fc6a3bda4039d94eed25fc483a350f9d8 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 3 Sep 2024 11:03:57 +0200 Subject: [PATCH 2/8] reveal - Remove empty quarto-auto-generated-content node once emptied slide-logo and footer are moved from there. --- .../formats/revealjs/plugins/support/support.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/resources/formats/revealjs/plugins/support/support.js b/src/resources/formats/revealjs/plugins/support/support.js index 2ca3ab1d99d..4a293a50f93 100644 --- a/src/resources/formats/revealjs/plugins/support/support.js +++ b/src/resources/formats/revealjs/plugins/support/support.js @@ -318,6 +318,13 @@ window.QuartoSupport = function () { } } + function cleanEmptyAutpGeneratedContent(deck) { + const div = document.querySelector('div.quarto-auto-generated-content') + if (div.textContent.trim() === '') { + div.remove() + } + } + return { id: "quarto-support", init: function (deck) { @@ -333,6 +340,8 @@ window.QuartoSupport = function () { handleSlideChanges(deck); workaroundMermaidDistance(deck); handleWhiteSpaceInColumns(deck); + // should stay last + cleanEmptyAutpGeneratedContent(deck); }, }; }; From d429a7557cb527029fa56f4e6209d027e206f34a Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 3 Sep 2024 11:05:18 +0200 Subject: [PATCH 3/8] revealjs - add footer default to test --- tests/docs/smoke-all/2023/09/11/6800.qmd | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/docs/smoke-all/2023/09/11/6800.qmd b/tests/docs/smoke-all/2023/09/11/6800.qmd index bb8f3ffbc38..7fc5ccb5183 100644 --- a/tests/docs/smoke-all/2023/09/11/6800.qmd +++ b/tests/docs/smoke-all/2023/09/11/6800.qmd @@ -3,12 +3,11 @@ title: "test" format: revealjs: footer: "hello world" -keep-md: true _quarto: tests: revealjs: ensureHtmlElements: - - ["div.footer"] + - ["div.footer", "div.footer-default"] --- ## Quarto From 83c9caf6251ce806d1b83183c687987df54a794d Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 3 Sep 2024 11:20:24 +0200 Subject: [PATCH 4/8] revealjs - allow to ask for no footer on slide useful when default footer is set, but a slide would be better without one e.g ```markdown --- title: footers format: revealjs: footer: "Default footer" --- ## Slide with footer Content ## Slide with no footer {footer="false"} Content ``` --- .../formats/revealjs/plugins/support/support.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/resources/formats/revealjs/plugins/support/support.js b/src/resources/formats/revealjs/plugins/support/support.js index 4a293a50f93..573c42c4ef2 100644 --- a/src/resources/formats/revealjs/plugins/support/support.js +++ b/src/resources/formats/revealjs/plugins/support/support.js @@ -138,13 +138,16 @@ window.QuartoSupport = function () { // add footer text function addFooter(deck) { - const revealParent = deck.getRevealElement(); - const defaultFooterDiv = document.querySelector(".footer-default"); - if (defaultFooterDiv) { + const revealParent = deck.getRevealElement(); + const defaultFooterDiv = document.querySelector(".footer-default"); + if (defaultFooterDiv) { + // move default footnote to the div.reveal element revealParent.appendChild(defaultFooterDiv); handleLinkClickEvents(deck, defaultFooterDiv); if (!isPrintView()) { deck.on("slidechanged", function (ev) { + // Set per slide footer if any defined, + // or show default unless data-footer="false" for no footer on this slide const prevSlideFooter = document.querySelector( ".reveal > .footer:not(.footer-default)" ); @@ -160,6 +163,8 @@ window.QuartoSupport = function () { handleLinkClickEvents(deck, slideFooter); deck.getRevealElement().appendChild(slideFooter); toggleBackgroundTheme(slideFooter, onDarkBackground, onLightBackground) + } else if (ev.currentSlide.getAttribute("data-footer") === "false") { + defaultFooterDiv.style.display = "none"; } else { defaultFooterDiv.style.display = "block"; toggleBackgroundTheme(defaultFooterDiv, onDarkBackground, onLightBackground) From bd0a9a58b7d239a98328d0182d9444458f6a5a4d Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 3 Sep 2024 11:27:09 +0200 Subject: [PATCH 5/8] revealjs - add to changelog the new no footer feature --- news/changelog-1.6.md | 1 + 1 file changed, 1 insertion(+) diff --git a/news/changelog-1.6.md b/news/changelog-1.6.md index 748574276dd..f31147ff22f 100644 --- a/news/changelog-1.6.md +++ b/news/changelog-1.6.md @@ -19,6 +19,7 @@ All changes included in 1.6: - Remove wrong `sourceMappingUrl` entry in SASS built css. - ([#7715](https://github.com/quarto-dev/quarto-cli/issues/7715)): Revealjs don't support anymore special Pandoc syntax making BulletList in Blockquotes become incremental list. This was confusing and unexpected behavior. Supported syntax for incremental list is documented at . - ([#9742](https://github.com/quarto-dev/quarto-cli/issues/9742)): Links to cross-referenced images correctly works. +- ([#9558](https://github.com/quarto-dev/quarto-cli/issues/9558)): To prevent default footer to show on slide, set `footer='false'` attribute on the slide header, e.g. `## Slide with no footer {footer='false'}` ## `typst` Format From 47de223e14d9aba135cfa10c8686b77e14def765 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 3 Sep 2024 12:04:52 +0200 Subject: [PATCH 6/8] revealjs - add footer customization for first loaded slide `slidechanged` event is not called on first slide. So `ready` event is necessary to add footer to first slide. --- .../revealjs/plugins/support/support.js | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/resources/formats/revealjs/plugins/support/support.js b/src/resources/formats/revealjs/plugins/support/support.js index 573c42c4ef2..b1b2ce50615 100644 --- a/src/resources/formats/revealjs/plugins/support/support.js +++ b/src/resources/formats/revealjs/plugins/support/support.js @@ -136,39 +136,51 @@ window.QuartoSupport = function () { }) } - // add footer text - function addFooter(deck) { - const revealParent = deck.getRevealElement(); - const defaultFooterDiv = document.querySelector(".footer-default"); - if (defaultFooterDiv) { + // add footer text + function addFooter(deck) { + const revealParent = deck.getRevealElement(); + const defaultFooterDiv = document.querySelector(".footer-default"); + // Set per slide footer if any defined, + // or show default unless data-footer="false" for no footer on this slide + const setSlideFooter = (ev, defaultFooterDiv) => { + const currentSlideFooter = ev.currentSlide.querySelector(".footer"); + const onDarkBackground = deck.getSlideBackground(ev.indexh, ev.indexv).classList.contains('has-dark-background') + const onLightBackground = deck.getSlideBackground(ev.indexh, ev.indexv).classList.contains('has-light-background') + if (currentSlideFooter) { + defaultFooterDiv.style.display = "none"; + const slideFooter = currentSlideFooter.cloneNode(true); + handleLinkClickEvents(deck, slideFooter); + deck.getRevealElement().appendChild(slideFooter); + toggleBackgroundTheme(slideFooter, onDarkBackground, onLightBackground) + } else if (ev.currentSlide.getAttribute("data-footer") === "false") { + defaultFooterDiv.style.display = "none"; + } else { + defaultFooterDiv.style.display = "block"; + toggleBackgroundTheme(defaultFooterDiv, onDarkBackground, onLightBackground) + } + } + if (defaultFooterDiv) { // move default footnote to the div.reveal element revealParent.appendChild(defaultFooterDiv); handleLinkClickEvents(deck, defaultFooterDiv); + if (!isPrintView()) { + // Ready even is needed so that footer customization applies on first loaded slide + deck.on('ready', (ev) => { + // Set footer (custom, default or none) + setSlideFooter(ev, defaultFooterDiv) + }); + // Any new navigated new slide will get the custom footnote check deck.on("slidechanged", function (ev) { - // Set per slide footer if any defined, - // or show default unless data-footer="false" for no footer on this slide + // Remove presentation footer defined by previous slide const prevSlideFooter = document.querySelector( ".reveal > .footer:not(.footer-default)" ); if (prevSlideFooter) { prevSlideFooter.remove(); } - const currentSlideFooter = ev.currentSlide.querySelector(".footer"); - const onDarkBackground = Reveal.getSlideBackground(ev.indexh, ev.indexv).classList.contains('has-dark-background') - const onLightBackground = Reveal.getSlideBackground(ev.indexh, ev.indexv).classList.contains('has-light-background') - if (currentSlideFooter) { - defaultFooterDiv.style.display = "none"; - const slideFooter = currentSlideFooter.cloneNode(true); - handleLinkClickEvents(deck, slideFooter); - deck.getRevealElement().appendChild(slideFooter); - toggleBackgroundTheme(slideFooter, onDarkBackground, onLightBackground) - } else if (ev.currentSlide.getAttribute("data-footer") === "false") { - defaultFooterDiv.style.display = "none"; - } else { - defaultFooterDiv.style.display = "block"; - toggleBackgroundTheme(defaultFooterDiv, onDarkBackground, onLightBackground) - } + // Set new one (custom, default or none) + setSlideFooter(ev, defaultFooterDiv) }); } } From 19d810787b9489e9ea661c0dba41870c419584a1 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 19 Sep 2024 19:29:33 +0200 Subject: [PATCH 7/8] Add a playwright test for footer and logo --- tests/docs/playwright/revealjs/.gitignore | 3 ++ .../docs/playwright/revealjs/logo-footer.qmd | 26 ++++++++++++++++++ tests/docs/playwright/revealjs/quarto.png | Bin 0 -> 11810 bytes .../playwright/tests/revealjs.spec.ts | 17 ++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 tests/docs/playwright/revealjs/.gitignore create mode 100644 tests/docs/playwright/revealjs/logo-footer.qmd create mode 100644 tests/docs/playwright/revealjs/quarto.png create mode 100644 tests/integration/playwright/tests/revealjs.spec.ts diff --git a/tests/docs/playwright/revealjs/.gitignore b/tests/docs/playwright/revealjs/.gitignore new file mode 100644 index 00000000000..762b9bc6af0 --- /dev/null +++ b/tests/docs/playwright/revealjs/.gitignore @@ -0,0 +1,3 @@ +.quarto/ +*.html +*_files/ \ No newline at end of file diff --git a/tests/docs/playwright/revealjs/logo-footer.qmd b/tests/docs/playwright/revealjs/logo-footer.qmd new file mode 100644 index 00000000000..38e0974c5b6 --- /dev/null +++ b/tests/docs/playwright/revealjs/logo-footer.qmd @@ -0,0 +1,26 @@ +--- +format: + revealjs: + logo: quarto.png + footer: "Footer text" +--- + +## Slide 1 + +Footer is shown on all slides + +## Slide 2 + +Like logo + +## Slide 3 {footer=false} + +unless `{footer=false}` is set, which will remove the footer + +## Slide 4 + +Custom footer can also be set + +::: {.footer} +A different footer +::: diff --git a/tests/docs/playwright/revealjs/quarto.png b/tests/docs/playwright/revealjs/quarto.png new file mode 100644 index 0000000000000000000000000000000000000000..616d17b92cb7f142afa346bb27bb505ad26ae908 GIT binary patch literal 11810 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

2y z6(;TAA{R3KcB}wRG4H+QOr+t_LDvIpzj{dzWRSqu(GVmF@Gyj(#fcO)#^Uq(zK>nE zX|dg_q14B;je3ywKyQfUbDPWB4V6Lp$@C*8X|$stF9e7XH=iEp6wBP;v$|J|XEn;j zM3FY}4GBuJ?Hsc`gXA7%?hS2jpeXv}+05HO^FLYsyamDkBB!z=p!n5aH-aY2G;ZG5 zG6)fmM0#BO5%1W^+v#iMn3LnTfCRuxtoUjIQxv1jsdlE=!oZq7;Je04}os{ynlWxjdcZl0%-!;RP>(LvRONf-1}wD4d>A!%64tG>iWsj+WRum0{XrgG8MLI z(c^ck)6M_k%@E=5P-i(7hy*D-IPT1JDmx}X>UaI z10VvJTvm1Gw<^^(bKngP1#c^D-1fI&msaJcPTpT~h~wtP5F0v3TtGgFwDu|fqjj=B oA4&gkm;JGV|Cgq2w0sl##jV&$be9bIfW84T5{lwgqK1M02Ttn$=Kufz literal 0 HcmV?d00001 diff --git a/tests/integration/playwright/tests/revealjs.spec.ts b/tests/integration/playwright/tests/revealjs.spec.ts new file mode 100644 index 00000000000..03d33e621f9 --- /dev/null +++ b/tests/integration/playwright/tests/revealjs.spec.ts @@ -0,0 +1,17 @@ +import { test, expect } from '@playwright/test'; + +test('logo and footer are correctly shown', async ({ page }) => { + await page.goto('./revealjs/logo-footer.html#/slide-1'); + await expect(page.locator('.reveal > .footer.footer-default')).toContainText('Footer text'); + await expect(page.locator('.slide-logo')).toHaveAttribute("src", "quarto.png"); + await page.keyboard.press('ArrowRight'); // Next slide + await expect(page.locator('.reveal > .footer.footer-default')).toContainText('Footer text'); + await expect(page.locator('.slide-logo')).toHaveAttribute("src", "quarto.png"); + await page.keyboard.press('ArrowRight'); // Next slide + await expect(page.locator('.reveal > .footer')).toBeHidden(); + await expect(page.locator('.slide-logo')).toHaveAttribute("src", "quarto.png"); + await page.keyboard.press('ArrowRight'); // Next slide + await expect(page.locator('.reveal > .footer.footer-default')).toBeHidden(); + await expect(page.locator('.reveal > .footer:not(.footer-default)')).toContainText('A different footer'); + await expect(page.locator('.slide-logo')).toHaveAttribute("src", "quarto.png"); +}); \ No newline at end of file From da6cb8dc757191739f97a254c2965289eaca72a3 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Fri, 20 Sep 2024 10:21:33 +0200 Subject: [PATCH 8/8] don't force formats when rendering before playwright use the format from the doc. --- .../playwright/ojs/test-ojs-echo-false-codetools-dropdown-2.qmd | 1 + .../playwright/ojs/test-ojs-echo-false-codetools-dropdown.qmd | 1 + tests/integration/playwright-tests.test.ts | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/docs/playwright/ojs/test-ojs-echo-false-codetools-dropdown-2.qmd b/tests/docs/playwright/ojs/test-ojs-echo-false-codetools-dropdown-2.qmd index e77978341dc..3d8d543362c 100644 --- a/tests/docs/playwright/ojs/test-ojs-echo-false-codetools-dropdown-2.qmd +++ b/tests/docs/playwright/ojs/test-ojs-echo-false-codetools-dropdown-2.qmd @@ -1,5 +1,6 @@ --- title: Reproing a bug on codetools dropdown +format: html code-tools: true --- diff --git a/tests/docs/playwright/ojs/test-ojs-echo-false-codetools-dropdown.qmd b/tests/docs/playwright/ojs/test-ojs-echo-false-codetools-dropdown.qmd index 7ed5cd84b88..9d7e82bee6a 100644 --- a/tests/docs/playwright/ojs/test-ojs-echo-false-codetools-dropdown.qmd +++ b/tests/docs/playwright/ojs/test-ojs-echo-false-codetools-dropdown.qmd @@ -1,5 +1,6 @@ --- title: Reproing a bug on codetools dropdown +format: html code-tools: true --- diff --git a/tests/integration/playwright-tests.test.ts b/tests/integration/playwright-tests.test.ts index f2354c63e1a..0dd4bb319da 100644 --- a/tests/integration/playwright-tests.test.ts +++ b/tests/integration/playwright-tests.test.ts @@ -39,7 +39,7 @@ for (const { path: fileName } of globOutput) { // mediabag inspection if we don't wait all renders // individually. This is very slow.. await execProcess({ - cmd: [quartoDevCmd(), "render", input, "--to", "html"], + cmd: [quartoDevCmd(), "render", input], }); fileNames.push(fileName); }