<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>reveal.js - Test Markdown</title> <link rel="stylesheet" href="../dist/reveal.css" /> <link rel="stylesheet" href="../node_modules/qunit/qunit/qunit.css" /> <script src="../node_modules/qunit/qunit/qunit.js"></script> </head> <body style="overflow: auto"> <div id="qunit"></div> <div id="qunit-fixture"></div> <div class="reveal deck1" style="display: none"> <div class="slides"> <section data-markdown data-separator="^\n---\n$" data-separator-vertical="^\n--\n$" > <script type="text/template"> ## Slide 1.1 -- ## Slide 1.2 --- ## Slide 2 </script> </section> </div> </div> <div class="reveal deck2" style="display: none"> <div class="slides"> <section data-markdown="simple.md" data-separator="^\r?\n\r?\n\r?\n" data-separator-vertical="^\r?\n\r?\n" ></section> </div> </div> <div class="reveal deck3" style="display: none"> <div class="slides"> <section data-markdown data-separator="^\n\n\n" data-separator-vertical="^\n\n" data-separator-notes="^Note:" data-attributes="--\s(.*?)$" data-charset="utf-8" > <script type="text/template"> # Test attributes in Markdown ## Slide 1 ## Slide 2 <!-- -- id="slide2" data-transition="zoom" data-background="#A0C66B" --> ## Slide 2.1 <!-- -- data-background="#ff0000" data-transition="fade" --> ## Slide 2.2 [Link to Slide2](#/slide2) ## Slide 3 <!-- -- data-transition="zoom" data-background="#C6916B" --> ## Slide 4 </script> </section> <section data-markdown data-separator="^\n\n\n" data-separator-vertical="^\n\n" data-separator-notes="^Note:" data-charset="utf-8" > <script type="text/template"> # Test attributes in Markdown with default separator ## Slide 1 Def ## Slide 2 Def <!-- .slide: id="slide2def" data-transition="concave" data-background="#A7C66B" --> ## Slide 2.1 Def <!-- .slide: data-background="#f70000" data-transition="page" --> ## Slide 2.2 Def [Link to Slide2](#/slide2def) ## Slide 3 Def <!-- .slide: data-transition="concave" data-background="#C7916B" --> ## Slide 4 </script> </section> <section data-markdown> <script type="text/template"> <!-- .slide: data-background="#ff0000" --> ## Hello world </script> </section> <section data-markdown> <script type="text/template"> ## Hello world <!-- .slide: data-background="#ff0000" --> </script> </section> <section data-markdown> <script type="text/template"> ## Hello world Test <!-- .slide: data-background="#ff0000" --> More Test </script> </section> </div> </div> <div class="reveal deck4" style="display: none"> <div class="slides"> <section data-markdown> <script type="text/template"> ## Testing Markdown Options This "slide" should contain 'smart' quotes. </script> </section> </div> </div> <div class="reveal deck5" style="display: none"> <div class="slides"> <section data-markdown data-separator="^\n---\n$" data-separator-vertical="^\n--\n$" data-element-attributes="{_\s*?([^}]+?)}" > > <script type="text/template"> ## Slide 1.1 <!-- {_class="fragment fade-out" data-fragment-index="1"} --> -- ## Slide 1.2 <!-- {_class="fragment shrink"} --> Paragraph 1 <!-- {_class="fragment grow"} --> Paragraph 2 <!-- {_class="fragment grow"} --> - list item 1 <!-- {_class="fragment grow"} --> - list item 2 <!-- {_class="fragment grow"} --> - list item 3 <!-- {_class="fragment grow"} --> --- ## Slide 2 Paragraph 1.2 multi-line <!-- {_class="fragment highlight-red"} --> Paragraph 2.2 <!-- {_class="fragment highlight-red"} --> Paragraph 2.3 <!-- {_class="fragment highlight-red"} --> Paragraph 2.4 <!-- {_class="fragment highlight-red"} --> - list item 1 <!-- {_class="fragment highlight-green"} --> - list item 2<!-- {_class="fragment highlight-green"} --> - list item 3<!-- {_class="fragment highlight-green"} --> - list item 4 <!-- {_class="fragment highlight-green"} --> - list item 5<!-- {_class="fragment highlight-green"} --> Test  <!-- {_class="reveal stretch"} --> </script> </section> <section data-markdown data-separator="^\n\n\n" data-separator-vertical="^\n\n" data-separator-notes="^Note:" data-charset="utf-8" > <script type="text/template"> # Test attributes in Markdown with default separator ## Slide 1 Def <!-- .element: class="fragment highlight-red" data-fragment-index="1" --> ## Slide 2 Def <!-- .element: class="fragment highlight-red" --> </script> </section> <section data-markdown> <script type="text/template"> ## Hello world A paragraph <!-- .element: class="fragment highlight-blue" --> </script> </section> <section data-markdown> <script type="text/template"> ## Hello world Multiple Line <!-- .element: class="fragment highlight-blue" --> </script> </section> <section data-markdown> <script type="text/template"> ## Hello world Test<!-- .element: class="fragment highlight-blue" --> More Test </script> </section> </div> </div> <div class="reveal deck6" style="display: block"> <div class="slides"> <section data-markdown class="defaults"> <script type="text/template"> ``` code ``` </script> </section> <section data-markdown class="with-language"> <script type="text/template"> ```javascript code ``` </script> </section> <section data-markdown class="with-line-numbers"> <script type="text/template"> ```[] code ``` </script> </section> <section data-markdown class="with-line-highlights"> <script type="text/template"> ```[1,2,3] code ``` </script> </section> <section data-markdown class="with-line-highlights-and-lanugage"> <script type="text/template"> ```javascript [1,2,3] code ``` </script> </section> <section data-markdown class="with-code-in-fragment"> <script type="text/template"> ```js foo.bar(); ``` <!-- .element: class="fragment" --> </script> </section> </div> </div> <script type="module"> import Reveal from "../dist/reveal.esm.js"; import Markdown from "../plugin/markdown/markdown.esm.js"; import Highlight from "../plugin/highlight/highlight.esm.js"; QUnit.config.testTimeout = 30000; let deck1 = new Reveal(document.querySelector(".deck1"), { plugins: [Markdown], }); deck1.addEventListener("ready", function () { QUnit.module("Inline"); QUnit.test("Vertical separator", function (assert) { assert.strictEqual( deck1 .getRevealElement() .querySelectorAll(".reveal .slides>section>section").length, 2, "found two slides" ); }); QUnit.test("Horizontal separator", function (assert) { assert.strictEqual( deck1.getRevealElement().querySelectorAll(".reveal .slides>section") .length, 2, "found two slides" ); }); }); let deck2 = new Reveal(document.querySelector(".deck2"), { plugins: [Markdown], }); deck2.addEventListener("ready", function () { QUnit.module("External"); QUnit.test("Vertical separator", function (assert) { assert.strictEqual( deck2 .getRevealElement() .querySelectorAll(".reveal .slides>section>section").length, 2, "found two slides" ); }); QUnit.test("Horizontal separator", function (assert) { assert.strictEqual( deck2.getRevealElement().querySelectorAll(".reveal .slides>section") .length, 2, "found two slides" ); }); }); let deck3 = new Reveal(document.querySelector(".deck3"), { plugins: [Markdown], }); deck3.addEventListener("ready", function () { QUnit.module("Slide Attributes"); QUnit.test("Id on slide", function (assert) { assert.strictEqual( deck3 .getRevealElement() .querySelectorAll(".reveal .slides>section>section#slide2") .length, 1, "found one slide with id slide2" ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, "found one slide with a link to slide2" ); }); QUnit.test("data-background attributes", function (assert) { assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' ); }); QUnit.test("data-transition attributes", function (assert) { assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' ); }); QUnit.test( "data-background attributes with default separator", function (assert) { assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' ); } ); QUnit.test( "data-transition attributes with default separator", function (assert) { assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' ); assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' ); } ); QUnit.test( "data-transition attributes with inline content", function (assert) { assert.strictEqual( deck3 .getRevealElement() .querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' ); } ); }); let deck4 = new Reveal(document.querySelector(".deck4"), { markdown: { smartypants: true, }, plugins: [Markdown], }); deck4.addEventListener("ready", function () { QUnit.module("Options"); QUnit.test("Options are set", function (assert) { assert.strictEqual( deck4.getPlugin("markdown").marked.defaults.smartypants, true ); }); QUnit.test("Smart quotes are activated", function (assert) { var text = deck4 .getRevealElement() .querySelector(".reveal .slides>section>p").textContent; assert.strictEqual(/['"]/.test(text), false); assert.strictEqual(/[“”‘’]/.test(text), true); }); }); let deck5 = new Reveal(document.querySelector(".deck5"), { plugins: [Markdown], }); deck5.addEventListener("ready", function () { QUnit.module("Element Attributes"); QUnit.test("Vertical separator", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll(".reveal .slides>section>section").length, 4, "found four slides" ); }); QUnit.test( "Attributes on element header in vertical slides", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll( ".reveal .slides section>section h2.fragment.fade-out" ).length, 1, "found one vertical slide with class fragment.fade-out on header" ); assert.strictEqual( deck5 .getRevealElement() .querySelectorAll( ".reveal .slides section>section h2.fragment.shrink" ).length, 1, "found one vertical slide with class fragment.shrink on header" ); } ); QUnit.test( "Attributes on element paragraphs in vertical slides", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll( ".reveal .slides section>section p.fragment.grow" ).length, 2, "found a vertical slide with two paragraphs with class fragment.grow" ); } ); QUnit.test( "Attributes on element list items in vertical slides", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll( ".reveal .slides section>section li.fragment.grow" ).length, 3, "found a vertical slide with three list items with class fragment.grow" ); } ); QUnit.test( "Attributes on element paragraphs in horizontal slides", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll( ".reveal .slides section p.fragment.highlight-red" ).length, 4, "found a horizontal slide with four paragraphs with class fragment.grow" ); } ); QUnit.test( "Attributes on element list items in horizontal slides", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll( ".reveal .slides section li.fragment.highlight-green" ).length, 5, "found a horizontal slide with five list items with class fragment.roll-in" ); } ); QUnit.test( "Attributes on element image in horizontal slides", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll(".reveal .slides section img.reveal.stretch") .length, 1, "found a horizontal slide with stretched image, class img.reveal.stretch" ); } ); QUnit.test( "Attributes on elements in vertical slides with default element attribute separator", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll( ".reveal .slides section h2.fragment.highlight-red" ).length, 2, "found two h2 titles with fragment highlight-red in vertical slides with default element attribute separator" ); } ); QUnit.test( "Attributes on elements in single slides with default element attribute separator", function (assert) { assert.strictEqual( deck5 .getRevealElement() .querySelectorAll( ".reveal .slides section p.fragment.highlight-blue" ).length, 3, "found three elements with fragment highlight-blue in single slide with default element attribute separator" ); } ); }); let deck6 = new Reveal(document.querySelector(".deck6"), { plugins: [Markdown, Highlight], }); deck6.addEventListener("ready", function () { QUnit.module("Code Blocks"); QUnit.test("Defaults to no line numbers", function (assert) { assert.strictEqual( deck6 .getRevealElement() .querySelectorAll(".defaults .hljs:not([data-line-numbers])") .length, 1 ); }); QUnit.test("Can set language", function (assert) { assert.strictEqual( deck6 .getRevealElement() .querySelectorAll( ".with-language .hljs.javascript:not([data-line-numbers])" ).length, 1 ); }); QUnit.test("```[] enables line numbers", function (assert) { assert.strictEqual( deck6 .getRevealElement() .querySelectorAll( '.with-line-numbers .hljs[data-line-numbers=""]' ).length, 1 ); }); QUnit.test("```[1,2,3] enables line highlights", function (assert) { assert.strictEqual( deck6 .getRevealElement() .querySelectorAll( '.with-line-highlights .hljs[data-line-numbers="1,2,3"]' ).length, 1 ); }); QUnit.test( "```javascript [1,2,3] enables line highlights and sets language", function (assert) { assert.strictEqual( deck6 .getRevealElement() .querySelectorAll( '.with-line-highlights-and-lanugage .hljs.javascript[data-line-numbers="1,2,3"]' ).length, 1 ); } ); QUnit.test("```block should allow custom fragment", function (assert) { assert.strictEqual( deck6 .getRevealElement() .querySelectorAll(".with-code-in-fragment pre.fragment").length, 1 ); }); }); deck1.initialize(); deck2.initialize(); deck3.initialize(); deck4.initialize(); deck5.initialize(); deck6.initialize(); </script> </body> </html>