From 8effbada13d17937e6868b32f42fd8c360224940 Mon Sep 17 00:00:00 2001 From: Henk <henk@waag.org> Date: Mon, 26 Feb 2024 16:17:56 +0100 Subject: [PATCH] combined slides nicolas + henk --- recitation/debugging/demo.html | 481 -------- recitation/debugging/examples/500-slides.html | 526 --------- .../debugging/examples/assets/beeping.txt | 2 - .../debugging/examples/assets/beeping.wav | Bin 422472 -> 0 bytes .../debugging/examples/assets/image1.png | Bin 21991 -> 0 bytes .../debugging/examples/assets/image2.png | Bin 10237 -> 0 bytes .../debugging/examples/auto-animate.html | 225 ---- .../debugging/examples/backgrounds.html | 141 --- recitation/debugging/examples/barebones.html | 32 - .../debugging/examples/layout-helpers.html | 160 --- recitation/debugging/examples/markdown.html | 161 --- recitation/debugging/examples/markdown.md | 41 - recitation/debugging/examples/math.html | 206 ---- recitation/debugging/examples/media.html | 75 -- .../examples/multiple-presentations.html | 102 -- recitation/debugging/examples/scroll.html | 118 -- .../debugging/examples/transitions.html | 97 -- recitation/debugging/index.html | 1048 ++++++++++++++++- .../test/assets/external-script-a.js | 1 - .../test/assets/external-script-b.js | 1 - .../test/assets/external-script-c.js | 1 - .../test/assets/external-script-d.js | 1 - recitation/debugging/test/simple.md | 12 - .../debugging/test/test-auto-animate.html | 167 --- .../test/test-dependencies-async.html | 78 -- .../debugging/test/test-dependencies.html | 55 - .../debugging/test/test-grid-navigation.html | 75 -- .../test/test-iframe-backgrounds.html | 100 -- recitation/debugging/test/test-iframes.html | 104 -- recitation/debugging/test/test-markdown.html | 516 -------- .../test/test-multiple-instances-es5.html | 86 -- .../test/test-multiple-instances.html | 104 -- recitation/debugging/test/test-pdf.html | 97 -- recitation/debugging/test/test-plugins.html | 108 -- recitation/debugging/test/test-scroll.html | 115 -- recitation/debugging/test/test-state.html | 134 --- recitation/debugging/test/test.html | 900 -------------- 37 files changed, 1026 insertions(+), 5044 deletions(-) delete mode 100644 recitation/debugging/demo.html delete mode 100644 recitation/debugging/examples/500-slides.html delete mode 100644 recitation/debugging/examples/assets/beeping.txt delete mode 100644 recitation/debugging/examples/assets/beeping.wav delete mode 100644 recitation/debugging/examples/assets/image1.png delete mode 100644 recitation/debugging/examples/assets/image2.png delete mode 100644 recitation/debugging/examples/auto-animate.html delete mode 100644 recitation/debugging/examples/backgrounds.html delete mode 100644 recitation/debugging/examples/barebones.html delete mode 100644 recitation/debugging/examples/layout-helpers.html delete mode 100644 recitation/debugging/examples/markdown.html delete mode 100644 recitation/debugging/examples/markdown.md delete mode 100644 recitation/debugging/examples/math.html delete mode 100644 recitation/debugging/examples/media.html delete mode 100644 recitation/debugging/examples/multiple-presentations.html delete mode 100644 recitation/debugging/examples/scroll.html delete mode 100644 recitation/debugging/examples/transitions.html delete mode 100644 recitation/debugging/test/assets/external-script-a.js delete mode 100644 recitation/debugging/test/assets/external-script-b.js delete mode 100644 recitation/debugging/test/assets/external-script-c.js delete mode 100644 recitation/debugging/test/assets/external-script-d.js delete mode 100644 recitation/debugging/test/simple.md delete mode 100644 recitation/debugging/test/test-auto-animate.html delete mode 100644 recitation/debugging/test/test-dependencies-async.html delete mode 100644 recitation/debugging/test/test-dependencies.html delete mode 100644 recitation/debugging/test/test-grid-navigation.html delete mode 100644 recitation/debugging/test/test-iframe-backgrounds.html delete mode 100644 recitation/debugging/test/test-iframes.html delete mode 100644 recitation/debugging/test/test-markdown.html delete mode 100644 recitation/debugging/test/test-multiple-instances-es5.html delete mode 100644 recitation/debugging/test/test-multiple-instances.html delete mode 100644 recitation/debugging/test/test-pdf.html delete mode 100644 recitation/debugging/test/test-plugins.html delete mode 100644 recitation/debugging/test/test-scroll.html delete mode 100644 recitation/debugging/test/test-state.html delete mode 100644 recitation/debugging/test/test.html diff --git a/recitation/debugging/demo.html b/recitation/debugging/demo.html deleted file mode 100644 index 5a8ba36..0000000 --- a/recitation/debugging/demo.html +++ /dev/null @@ -1,481 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js – The HTML Presentation Framework</title> - - <meta name="description" content="A framework for easily creating beautiful presentations using HTML"> - <meta name="author" content="Hakim El Hattab"> - - <meta name="apple-mobile-web-app-capable" content="yes"> - <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> - - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - - <link rel="stylesheet" href="dist/reset.css"> - <link rel="stylesheet" href="dist/reveal.css"> - <link rel="stylesheet" href="dist/theme/black.css" id="theme"> - - <!-- Theme used for syntax highlighting of code --> - <link rel="stylesheet" href="plugin/highlight/monokai.css"> - </head> - - <body> - - <div class="reveal"> - - <!-- Any section element inside of this container is displayed as a slide --> - <div class="slides"> - <section> - <a href="https://revealjs.com"> - <img src="https://static.slid.es/reveal/logo-v1/reveal-white-text.svg" alt="reveal.js logo" style="height: 180px; margin: 0 auto 4rem auto; background: transparent;" class="demo-logo"> - </a> - <h3>The HTML Presentation Framework</h3> - <p> - <small>Created by <a href="http://hakim.se">Hakim El Hattab</a> and <a href="https://github.com/hakimel/reveal.js/graphs/contributors">contributors</a></small> - </p> - </section> - - <section> - <h2>Hello There</h2> - <p> - reveal.js enables you to create beautiful interactive slide decks using HTML. This presentation will show you examples of what it can do. - </p> - </section> - - <!-- Example of nested vertical slides --> - <section> - <section> - <h2>Vertical Slides</h2> - <p>Slides can be nested inside of each other.</p> - <p>Use the <em>Space</em> key to navigate through all slides.</p> - <br> - <a href="#/2/1" class="navigate-down"> - <img class="r-frame" style="background: rgba(255,255,255,0.1);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Down arrow"> - </a> - </section> - <section> - <h2>Basement Level 1</h2> - <p>Nested slides are useful for adding additional detail underneath a high level horizontal slide.</p> - </section> - <section> - <h2>Basement Level 2</h2> - <p>That's it, time to go back up.</p> - <br> - <a href="#/2"> - <img class="r-frame" style="background: rgba(255,255,255,0.1); transform: rotate(180deg);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Up arrow"> - </a> - </section> - </section> - - <section> - <h2>Slides</h2> - <p> - Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at <a href="https://slides.com" target="_blank">https://slides.com</a>. - </p> - </section> - - <section data-visibility="hidden"> - <h2>Hidden Slides</h2> - <p> - This slide is visible in the source, but hidden when the presentation is viewed. You can show all hidden slides by setting the `showHiddenSlides` config option to `true`. - </p> - </section> - - <section data-auto-animate> - <h2 data-id="code-title">Pretty Code</h2> - <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers> - import React, { useState } from 'react'; - - function Example() { - const [count, setCount] = useState(0); - - return ( - ... - ); - } - </code></pre> - <p>Code syntax highlighting courtesy of <a href="https://highlightjs.org/usage/">highlight.js</a>.</p> - </section> - - <section data-auto-animate> - <h2 data-id="code-title">With Animations</h2> - <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|4,8-11|17|22-24"><script type="text/template"> - import React, { useState } from 'react'; - - function Example() { - const [count, setCount] = useState(0); - - return ( - <div> - <p>You clicked {count} times</p> - <button onClick={() => setCount(count + 1)}> - Click me - </button> - </div> - ); - } - - function SecondExample() { - const [count, setCount] = useState(0); - - return ( - <div> - <p>You clicked {count} times</p> - <button onClick={() => setCount(count + 1)}> - Click me - </button> - </div> - ); - } - </script></code></pre> - </section> - - <section> - <h2>Point of View</h2> - <p> - Press <strong>ESC</strong> to enter the slide overview. - </p> - <p> - Hold down the <strong>alt</strong> key (<strong>ctrl</strong> in Linux) and click on any element to zoom towards it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>. Click again to zoom back out. - </p> - <p> - (NOTE: Use ctrl + click in Linux.) - </p> - </section> - - <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> - <h2>Auto-Animate</h2> - <p>Automatically animate matching elements across slides with <a href="https://revealjs.com/auto-animate/">Auto-Animate</a>.</p> - <div class="r-hstack justify-center"> - <div data-id="box1" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> - <div data-id="box2" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> - <div data-id="box3" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> - </div> - </section> - <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> - <div class="r-hstack justify-center"> - <div data-id="box1" data-auto-animate-delay="0" style="background: cyan; width: 150px; height: 100px; margin: 10px;"></div> - <div data-id="box2" data-auto-animate-delay="0.1" style="background: magenta; width: 150px; height: 100px; margin: 10px;"></div> - <div data-id="box3" data-auto-animate-delay="0.2" style="background: yellow; width: 150px; height: 100px; margin: 10px;"></div> - </div> - <h2 style="margin-top: 20px;">Auto-Animate</h2> - </section> - <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> - <div class="r-stack"> - <div data-id="box1" style="background: cyan; width: 300px; height: 300px; border-radius: 200px;"></div> - <div data-id="box2" style="background: magenta; width: 200px; height: 200px; border-radius: 200px;"></div> - <div data-id="box3" style="background: yellow; width: 100px; height: 100px; border-radius: 200px;"></div> - </div> - <h2 style="margin-top: 20px;">Auto-Animate</h2> - </section> - - <section> - <h2>Touch Optimized</h2> - <p> - Presentations look great on touch devices, like mobile phones and tablets. Simply swipe through your slides. - </p> - </section> - - <section data-markdown> - <script type="text/template"> - ## Markdown Support - - Write content using inline or external Markdown. - Instructions and more info available in the [docs](https://revealjs.com/markdown/). - - ```html [] - <section data-markdown> - ## Markdown Support - - Write content using inline or external Markdown. - Instructions and more info available in the [docs](https://revealjs.com/markdown/). - </section> - ``` - </script> - </section> - - <section> - <p>Add the <code>r-fit-text</code> class to auto-size text</p> - <h2 class="r-fit-text">FIT TEXT</h2> - </section> - - <section> - <section id="fragments"> - <h2>Fragments</h2> - <p>Hit the next arrow...</p> - <p class="fragment">... to step through ...</p> - <p><span class="fragment">... a</span> <span class="fragment">fragmented</span> <span class="fragment">slide.</span></p> - - <aside class="notes"> - This slide has fragments which are also stepped through in the notes window. - </aside> - </section> - <section> - <h2>Fragment Styles</h2> - <p>There's different types of fragments, like:</p> - <p class="fragment grow">grow</p> - <p class="fragment shrink">shrink</p> - <p class="fragment fade-out">fade-out</p> - <p> - <span style="display: inline-block;" class="fragment fade-right">fade-right, </span> - <span style="display: inline-block;" class="fragment fade-up">up, </span> - <span style="display: inline-block;" class="fragment fade-down">down, </span> - <span style="display: inline-block;" class="fragment fade-left">left</span> - </p> - <p class="fragment fade-in-then-out">fade-in-then-out</p> - <p class="fragment fade-in-then-semi-out">fade-in-then-semi-out</p> - <p>Highlight <span class="fragment highlight-red">red</span> <span class="fragment highlight-blue">blue</span> <span class="fragment highlight-green">green</span></p> - </section> - </section> - - <section id="transitions"> - <h2>Transition Styles</h2> - <p> - You can select from different transitions, like: <br> - <a href="?transition=none#/transitions">None</a> - - <a href="?transition=fade#/transitions">Fade</a> - - <a href="?transition=slide#/transitions">Slide</a> - - <a href="?transition=convex#/transitions">Convex</a> - - <a href="?transition=concave#/transitions">Concave</a> - - <a href="?transition=zoom#/transitions">Zoom</a> - </p> - </section> - - <section id="themes"> - <h2>Themes</h2> - <p> - reveal.js comes with a few themes built in: <br> - <!-- Hacks to swap themes after the page has loaded. Not flexible and only intended for the reveal.js demo deck. --> - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/black.css'); return false;">Black (default)</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/white.css'); return false;">White</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/league.css'); return false;">League</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/sky.css'); return false;">Sky</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/beige.css'); return false;">Beige</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/simple.css'); return false;">Simple</a> <br> - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/serif.css'); return false;">Serif</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/blood.css'); return false;">Blood</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/night.css'); return false;">Night</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/moon.css'); return false;">Moon</a> - - <a href="#/themes" onclick="document.getElementById('theme').setAttribute('href','dist/theme/solarized.css'); return false;">Solarized</a> - </p> - </section> - - <section> - <section data-background="#dddddd"> - <h2>Slide Backgrounds</h2> - <p> - Set <code>data-background="#dddddd"</code> on a slide to change the background color. All CSS color formats are supported. - </p> - <a href="#" class="navigate-down"> - <img class="r-frame" style="background: rgba(255,255,255,0.1);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Down arrow"> - </a> - </section> - <section data-background-gradient="linear-gradient(to bottom, #283b95, #17b2c3)"> - <h2>Gradient Backgrounds</h2> - <pre><code class="hljs html wrap"><section data-background-gradient= - "linear-gradient(to bottom, #ddd, #191919)"></code></pre> - </section> - <section data-background="https://static.slid.es/reveal/image-placeholder.png"> - <h2>Image Backgrounds</h2> - <pre><code class="hljs html"><section data-background="image.png"></code></pre> - </section> - <section data-background="https://static.slid.es/reveal/image-placeholder.png" data-background-repeat="repeat" data-background-size="100px"> - <h2>Tiled Backgrounds</h2> - <pre><code class="hljs html" style="word-wrap: break-word;"><section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"></code></pre> - </section> - <section data-background-video="https://static.slid.es/site/homepage/v1/homepage-video-editor.mp4" data-background-color="#000000"> - <div style="background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px;"> - <h2>Video Backgrounds</h2> - <pre><code class="hljs html" style="word-wrap: break-word;"><section data-background-video="video.mp4,video.webm"></code></pre> - </div> - </section> - <section data-background="http://i.giphy.com/90F8aUepslB84.gif"> - <h2>... and GIFs!</h2> - </section> - </section> - - <section data-transition="slide" data-background="#4d7e65" data-background-transition="zoom"> - <h2>Background Transitions</h2> - <p> - Different background transitions are available via the backgroundTransition option. This one's called "zoom". - </p> - <pre><code class="hljs javascript">Reveal.configure({ backgroundTransition: 'zoom' })</code></pre> - </section> - - <section data-transition="slide" data-background="#b5533c" data-background-transition="zoom"> - <h2>Background Transitions</h2> - <p> - You can override background transitions per-slide. - </p> - <pre><code class="hljs html" style="word-wrap: break-word;"><section data-background-transition="zoom"></code></pre> - </section> - - <section data-background-iframe="https://hakim.se" data-background-interactive> - <div style="position: absolute; width: 40%; right: 0; box-shadow: 0 1px 4px rgba(0,0,0,0.5), 0 5px 25px rgba(0,0,0,0.2); background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px; font-size: 20px; text-align: left;"> - <h2>Iframe Backgrounds</h2> - <p>Since reveal.js runs on the web, you can easily embed other web content. Try interacting with the page in the background.</p> - </div> - </section> - - <section> - <h2>Marvelous List</h2> - <ul> - <li>No order here</li> - <li>Or here</li> - <li>Or here</li> - <li>Or here</li> - </ul> - </section> - - <section> - <h2>Fantastic Ordered List</h2> - <ol> - <li>One is smaller than...</li> - <li>Two is smaller than...</li> - <li>Three!</li> - </ol> - </section> - - <section> - <h2>Tabular Tables</h2> - <table> - <thead> - <tr> - <th>Item</th> - <th>Value</th> - <th>Quantity</th> - </tr> - </thead> - <tbody> - <tr> - <td>Apples</td> - <td>$1</td> - <td>7</td> - </tr> - <tr> - <td>Lemonade</td> - <td>$2</td> - <td>18</td> - </tr> - <tr> - <td>Bread</td> - <td>$3</td> - <td>2</td> - </tr> - </tbody> - </table> - </section> - - <section> - <h2>Clever Quotes</h2> - <p> - These guys come in two forms, inline: <q cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">The nice thing about standards is that there are so many to choose from</q> and block: - </p> - <blockquote cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations"> - “For years there has been a theory that millions of monkeys typing at random on millions of typewriters would - reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.” - </blockquote> - </section> - - <section> - <h2>Intergalactic Interconnections</h2> - <p> - You can link between slides internally, - <a href="#/2/3">like this</a>. - </p> - </section> - - <section> - <h2>Speaker View</h2> - <p>There's a <a href="https://revealjs.com/speaker-view/">speaker view</a>. It includes a timer, preview of the upcoming slide as well as your speaker notes.</p> - <p>Press the <em>S</em> key to try it out.</p> - - <aside class="notes"> - Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard). - </aside> - </section> - - <section> - <h2>Export to PDF</h2> - <p>Presentations can be <a href="https://revealjs.com/pdf-export/">exported to PDF</a>, here's an example:</p> - <iframe data-src="https://www.slideshare.net/slideshow/embed_code/42840540" width="445" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:3px solid #666; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> - </section> - - <section> - <h2>Global State</h2> - <p> - Set <code>data-state="something"</code> on a slide and <code>"something"</code> - will be added as a class to the document element when the slide is open. This lets you - apply broader style changes, like switching the page background. - </p> - </section> - - <section data-state="customevent"> - <h2>State Events</h2> - <p> - Additionally custom events can be triggered on a per slide basis by binding to the <code>data-state</code> name. - </p> - <pre><code class="javascript" data-trim contenteditable style="font-size: 18px;"> -Reveal.on( 'customevent', function() { - console.log( '"customevent" has fired' ); -} ); - </code></pre> - </section> - - <section> - <h2>Take a Moment</h2> - <p> - Press B or . on your keyboard to pause the presentation. This is helpful when you're on stage and want to take distracting slides off the screen. - </p> - </section> - - <section> - <h2>Much more</h2> - <ul> - <li>Right-to-left support</li> - <li><a href="https://revealjs.com/api/">Extensive JavaScript API</a></li> - <li><a href="https://revealjs.com/auto-slide/">Auto-progression</a></li> - <li><a href="https://revealjs.com/backgrounds/#parallax-background">Parallax backgrounds</a></li> - <li><a href="https://revealjs.com/keyboard/">Custom keyboard bindings</a></li> - </ul> - </section> - - <section style="text-align: left;"> - <h1>THE END</h1> - <p> - - <a href="https://slides.com">Try the online editor</a> <br> - - <a href="https://github.com/hakimel/reveal.js">Source code & documentation</a> - </p> - </section> - - </div> - - </div> - - <script src="dist/reveal.js"></script> - <script src="plugin/zoom/zoom.js"></script> - <script src="plugin/notes/notes.js"></script> - <script src="plugin/search/search.js"></script> - <script src="plugin/markdown/markdown.js"></script> - <script src="plugin/highlight/highlight.js"></script> - <script> - - // Also available as an ES module, see: - // https://revealjs.com/initialization/ - Reveal.initialize({ - controls: true, - progress: true, - center: true, - hash: true, - - // Learn about plugins: https://revealjs.com/plugins/ - plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ] - }); - - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/500-slides.html b/recitation/debugging/examples/500-slides.html deleted file mode 100644 index 2270c74..0000000 --- a/recitation/debugging/examples/500-slides.html +++ /dev/null @@ -1,526 +0,0 @@ -<!doctype html> -<html lang="en"> - <head> - <meta charset="utf-8"> - - <title>reveal.js - 500 slides</title> - - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/black.css"> - </head> - - <body> - <div class="reveal"> - <div class="slides"> - <section><h1>1</h1></section> - <section><h1>2</h1></section> - <section><h1>3</h1></section> - <section><h1>4</h1></section> - <section><h1>5</h1></section> - <section><h1>6</h1></section> - <section><h1>7</h1></section> - <section><h1>8</h1></section> - <section><h1>9</h1></section> - <section><h1>10</h1></section> - <section><h1>11</h1></section> - <section><h1>12</h1></section> - <section><h1>13</h1></section> - <section><h1>14</h1></section> - <section><h1>15</h1></section> - <section><h1>16</h1></section> - <section><h1>17</h1></section> - <section><h1>18</h1></section> - <section><h1>19</h1></section> - <section><h1>20</h1></section> - <section><h1>21</h1></section> - <section><h1>22</h1></section> - <section><h1>23</h1></section> - <section><h1>24</h1></section> - <section><h1>25</h1></section> - <section><h1>26</h1></section> - <section><h1>27</h1></section> - <section><h1>28</h1></section> - <section><h1>29</h1></section> - <section><h1>30</h1></section> - <section><h1>31</h1></section> - <section><h1>32</h1></section> - <section><h1>33</h1></section> - <section><h1>34</h1></section> - <section><h1>35</h1></section> - <section><h1>36</h1></section> - <section><h1>37</h1></section> - <section><h1>38</h1></section> - <section><h1>39</h1></section> - <section><h1>40</h1></section> - <section><h1>41</h1></section> - <section><h1>42</h1></section> - <section><h1>43</h1></section> - <section><h1>44</h1></section> - <section><h1>45</h1></section> - <section><h1>46</h1></section> - <section><h1>47</h1></section> - <section><h1>48</h1></section> - <section><h1>49</h1></section> - <section><h1>50</h1></section> - <section><h1>51</h1></section> - <section><h1>52</h1></section> - <section><h1>53</h1></section> - <section><h1>54</h1></section> - <section><h1>55</h1></section> - <section><h1>56</h1></section> - <section><h1>57</h1></section> - <section><h1>58</h1></section> - <section><h1>59</h1></section> - <section><h1>60</h1></section> - <section><h1>61</h1></section> - <section><h1>62</h1></section> - <section><h1>63</h1></section> - <section><h1>64</h1></section> - <section><h1>65</h1></section> - <section><h1>66</h1></section> - <section><h1>67</h1></section> - <section><h1>68</h1></section> - <section><h1>69</h1></section> - <section><h1>70</h1></section> - <section><h1>71</h1></section> - <section><h1>72</h1></section> - <section><h1>73</h1></section> - <section><h1>74</h1></section> - <section><h1>75</h1></section> - <section><h1>76</h1></section> - <section><h1>77</h1></section> - <section><h1>78</h1></section> - <section><h1>79</h1></section> - <section><h1>80</h1></section> - <section><h1>81</h1></section> - <section><h1>82</h1></section> - <section><h1>83</h1></section> - <section><h1>84</h1></section> - <section><h1>85</h1></section> - <section><h1>86</h1></section> - <section><h1>87</h1></section> - <section><h1>88</h1></section> - <section><h1>89</h1></section> - <section><h1>90</h1></section> - <section><h1>91</h1></section> - <section><h1>92</h1></section> - <section><h1>93</h1></section> - <section><h1>94</h1></section> - <section><h1>95</h1></section> - <section><h1>96</h1></section> - <section><h1>97</h1></section> - <section><h1>98</h1></section> - <section><h1>99</h1></section> - <section><h1>100</h1></section> - <section><h1>101</h1></section> - <section><h1>102</h1></section> - <section><h1>103</h1></section> - <section><h1>104</h1></section> - <section><h1>105</h1></section> - <section><h1>106</h1></section> - <section><h1>107</h1></section> - <section><h1>108</h1></section> - <section><h1>109</h1></section> - <section><h1>110</h1></section> - <section><h1>111</h1></section> - <section><h1>112</h1></section> - <section><h1>113</h1></section> - <section><h1>114</h1></section> - <section><h1>115</h1></section> - <section><h1>116</h1></section> - <section><h1>117</h1></section> - <section><h1>118</h1></section> - <section><h1>119</h1></section> - <section><h1>120</h1></section> - <section><h1>121</h1></section> - <section><h1>122</h1></section> - <section><h1>123</h1></section> - <section><h1>124</h1></section> - <section><h1>125</h1></section> - <section><h1>126</h1></section> - <section><h1>127</h1></section> - <section><h1>128</h1></section> - <section><h1>129</h1></section> - <section><h1>130</h1></section> - <section><h1>131</h1></section> - <section><h1>132</h1></section> - <section><h1>133</h1></section> - <section><h1>134</h1></section> - <section><h1>135</h1></section> - <section><h1>136</h1></section> - <section><h1>137</h1></section> - <section><h1>138</h1></section> - <section><h1>139</h1></section> - <section><h1>140</h1></section> - <section><h1>141</h1></section> - <section><h1>142</h1></section> - <section><h1>143</h1></section> - <section><h1>144</h1></section> - <section><h1>145</h1></section> - <section><h1>146</h1></section> - <section><h1>147</h1></section> - <section><h1>148</h1></section> - <section><h1>149</h1></section> - <section><h1>150</h1></section> - <section><h1>151</h1></section> - <section><h1>152</h1></section> - <section><h1>153</h1></section> - <section><h1>154</h1></section> - <section><h1>155</h1></section> - <section><h1>156</h1></section> - <section><h1>157</h1></section> - <section><h1>158</h1></section> - <section><h1>159</h1></section> - <section><h1>160</h1></section> - <section><h1>161</h1></section> - <section><h1>162</h1></section> - <section><h1>163</h1></section> - <section><h1>164</h1></section> - <section><h1>165</h1></section> - <section><h1>166</h1></section> - <section><h1>167</h1></section> - <section><h1>168</h1></section> - <section><h1>169</h1></section> - <section><h1>170</h1></section> - <section><h1>171</h1></section> - <section><h1>172</h1></section> - <section><h1>173</h1></section> - <section><h1>174</h1></section> - <section><h1>175</h1></section> - <section><h1>176</h1></section> - <section><h1>177</h1></section> - <section><h1>178</h1></section> - <section><h1>179</h1></section> - <section><h1>180</h1></section> - <section><h1>181</h1></section> - <section><h1>182</h1></section> - <section><h1>183</h1></section> - <section><h1>184</h1></section> - <section><h1>185</h1></section> - <section><h1>186</h1></section> - <section><h1>187</h1></section> - <section><h1>188</h1></section> - <section><h1>189</h1></section> - <section><h1>190</h1></section> - <section><h1>191</h1></section> - <section><h1>192</h1></section> - <section><h1>193</h1></section> - <section><h1>194</h1></section> - <section><h1>195</h1></section> - <section><h1>196</h1></section> - <section><h1>197</h1></section> - <section><h1>198</h1></section> - <section><h1>199</h1></section> - <section><h1>200</h1></section> - <section><h1>201</h1></section> - <section><h1>202</h1></section> - <section><h1>203</h1></section> - <section><h1>204</h1></section> - <section><h1>205</h1></section> - <section><h1>206</h1></section> - <section><h1>207</h1></section> - <section><h1>208</h1></section> - <section><h1>209</h1></section> - <section><h1>210</h1></section> - <section><h1>211</h1></section> - <section><h1>212</h1></section> - <section><h1>213</h1></section> - <section><h1>214</h1></section> - <section><h1>215</h1></section> - <section><h1>216</h1></section> - <section><h1>217</h1></section> - <section><h1>218</h1></section> - <section><h1>219</h1></section> - <section><h1>220</h1></section> - <section><h1>221</h1></section> - <section><h1>222</h1></section> - <section><h1>223</h1></section> - <section><h1>224</h1></section> - <section><h1>225</h1></section> - <section><h1>226</h1></section> - <section><h1>227</h1></section> - <section><h1>228</h1></section> - <section><h1>229</h1></section> - <section><h1>230</h1></section> - <section><h1>231</h1></section> - <section><h1>232</h1></section> - <section><h1>233</h1></section> - <section><h1>234</h1></section> - <section><h1>235</h1></section> - <section><h1>236</h1></section> - <section><h1>237</h1></section> - <section><h1>238</h1></section> - <section><h1>239</h1></section> - <section><h1>240</h1></section> - <section><h1>241</h1></section> - <section><h1>242</h1></section> - <section><h1>243</h1></section> - <section><h1>244</h1></section> - <section><h1>245</h1></section> - <section><h1>246</h1></section> - <section><h1>247</h1></section> - <section><h1>248</h1></section> - <section><h1>249</h1></section> - <section><h1>250</h1></section> - <section><h1>251</h1></section> - <section><h1>252</h1></section> - <section><h1>253</h1></section> - <section><h1>254</h1></section> - <section><h1>255</h1></section> - <section><h1>256</h1></section> - <section><h1>257</h1></section> - <section><h1>258</h1></section> - <section><h1>259</h1></section> - <section><h1>260</h1></section> - <section><h1>261</h1></section> - <section><h1>262</h1></section> - <section><h1>263</h1></section> - <section><h1>264</h1></section> - <section><h1>265</h1></section> - <section><h1>266</h1></section> - <section><h1>267</h1></section> - <section><h1>268</h1></section> - <section><h1>269</h1></section> - <section><h1>270</h1></section> - <section><h1>271</h1></section> - <section><h1>272</h1></section> - <section><h1>273</h1></section> - <section><h1>274</h1></section> - <section><h1>275</h1></section> - <section><h1>276</h1></section> - <section><h1>277</h1></section> - <section><h1>278</h1></section> - <section><h1>279</h1></section> - <section><h1>280</h1></section> - <section><h1>281</h1></section> - <section><h1>282</h1></section> - <section><h1>283</h1></section> - <section><h1>284</h1></section> - <section><h1>285</h1></section> - <section><h1>286</h1></section> - <section><h1>287</h1></section> - <section><h1>288</h1></section> - <section><h1>289</h1></section> - <section><h1>290</h1></section> - <section><h1>291</h1></section> - <section><h1>292</h1></section> - <section><h1>293</h1></section> - <section><h1>294</h1></section> - <section><h1>295</h1></section> - <section><h1>296</h1></section> - <section><h1>297</h1></section> - <section><h1>298</h1></section> - <section><h1>299</h1></section> - <section><h1>300</h1></section> - <section><h1>301</h1></section> - <section><h1>302</h1></section> - <section><h1>303</h1></section> - <section><h1>304</h1></section> - <section><h1>305</h1></section> - <section><h1>306</h1></section> - <section><h1>307</h1></section> - <section><h1>308</h1></section> - <section><h1>309</h1></section> - <section><h1>310</h1></section> - <section><h1>311</h1></section> - <section><h1>312</h1></section> - <section><h1>313</h1></section> - <section><h1>314</h1></section> - <section><h1>315</h1></section> - <section><h1>316</h1></section> - <section><h1>317</h1></section> - <section><h1>318</h1></section> - <section><h1>319</h1></section> - <section><h1>320</h1></section> - <section><h1>321</h1></section> - <section><h1>322</h1></section> - <section><h1>323</h1></section> - <section><h1>324</h1></section> - <section><h1>325</h1></section> - <section><h1>326</h1></section> - <section><h1>327</h1></section> - <section><h1>328</h1></section> - <section><h1>329</h1></section> - <section><h1>330</h1></section> - <section><h1>331</h1></section> - <section><h1>332</h1></section> - <section><h1>333</h1></section> - <section><h1>334</h1></section> - <section><h1>335</h1></section> - <section><h1>336</h1></section> - <section><h1>337</h1></section> - <section><h1>338</h1></section> - <section><h1>339</h1></section> - <section><h1>340</h1></section> - <section><h1>341</h1></section> - <section><h1>342</h1></section> - <section><h1>343</h1></section> - <section><h1>344</h1></section> - <section><h1>345</h1></section> - <section><h1>346</h1></section> - <section><h1>347</h1></section> - <section><h1>348</h1></section> - <section><h1>349</h1></section> - <section><h1>350</h1></section> - <section><h1>351</h1></section> - <section><h1>352</h1></section> - <section><h1>353</h1></section> - <section><h1>354</h1></section> - <section><h1>355</h1></section> - <section><h1>356</h1></section> - <section><h1>357</h1></section> - <section><h1>358</h1></section> - <section><h1>359</h1></section> - <section><h1>360</h1></section> - <section><h1>361</h1></section> - <section><h1>362</h1></section> - <section><h1>363</h1></section> - <section><h1>364</h1></section> - <section><h1>365</h1></section> - <section><h1>366</h1></section> - <section><h1>367</h1></section> - <section><h1>368</h1></section> - <section><h1>369</h1></section> - <section><h1>370</h1></section> - <section><h1>371</h1></section> - <section><h1>372</h1></section> - <section><h1>373</h1></section> - <section><h1>374</h1></section> - <section><h1>375</h1></section> - <section><h1>376</h1></section> - <section><h1>377</h1></section> - <section><h1>378</h1></section> - <section><h1>379</h1></section> - <section><h1>380</h1></section> - <section><h1>381</h1></section> - <section><h1>382</h1></section> - <section><h1>383</h1></section> - <section><h1>384</h1></section> - <section><h1>385</h1></section> - <section><h1>386</h1></section> - <section><h1>387</h1></section> - <section><h1>388</h1></section> - <section><h1>389</h1></section> - <section><h1>390</h1></section> - <section><h1>391</h1></section> - <section><h1>392</h1></section> - <section><h1>393</h1></section> - <section><h1>394</h1></section> - <section><h1>395</h1></section> - <section><h1>396</h1></section> - <section><h1>397</h1></section> - <section><h1>398</h1></section> - <section><h1>399</h1></section> - <section><h1>400</h1></section> - <section><h1>401</h1></section> - <section><h1>402</h1></section> - <section><h1>403</h1></section> - <section><h1>404</h1></section> - <section><h1>405</h1></section> - <section><h1>406</h1></section> - <section><h1>407</h1></section> - <section><h1>408</h1></section> - <section><h1>409</h1></section> - <section><h1>410</h1></section> - <section><h1>411</h1></section> - <section><h1>412</h1></section> - <section><h1>413</h1></section> - <section><h1>414</h1></section> - <section><h1>415</h1></section> - <section><h1>416</h1></section> - <section><h1>417</h1></section> - <section><h1>418</h1></section> - <section><h1>419</h1></section> - <section><h1>420</h1></section> - <section><h1>421</h1></section> - <section><h1>422</h1></section> - <section><h1>423</h1></section> - <section><h1>424</h1></section> - <section><h1>425</h1></section> - <section><h1>426</h1></section> - <section><h1>427</h1></section> - <section><h1>428</h1></section> - <section><h1>429</h1></section> - <section><h1>430</h1></section> - <section><h1>431</h1></section> - <section><h1>432</h1></section> - <section><h1>433</h1></section> - <section><h1>434</h1></section> - <section><h1>435</h1></section> - <section><h1>436</h1></section> - <section><h1>437</h1></section> - <section><h1>438</h1></section> - <section><h1>439</h1></section> - <section><h1>440</h1></section> - <section><h1>441</h1></section> - <section><h1>442</h1></section> - <section><h1>443</h1></section> - <section><h1>444</h1></section> - <section><h1>445</h1></section> - <section><h1>446</h1></section> - <section><h1>447</h1></section> - <section><h1>448</h1></section> - <section><h1>449</h1></section> - <section><h1>450</h1></section> - <section><h1>451</h1></section> - <section><h1>452</h1></section> - <section><h1>453</h1></section> - <section><h1>454</h1></section> - <section><h1>455</h1></section> - <section><h1>456</h1></section> - <section><h1>457</h1></section> - <section><h1>458</h1></section> - <section><h1>459</h1></section> - <section><h1>460</h1></section> - <section><h1>461</h1></section> - <section><h1>462</h1></section> - <section><h1>463</h1></section> - <section><h1>464</h1></section> - <section><h1>465</h1></section> - <section><h1>466</h1></section> - <section><h1>467</h1></section> - <section><h1>468</h1></section> - <section><h1>469</h1></section> - <section><h1>470</h1></section> - <section><h1>471</h1></section> - <section><h1>472</h1></section> - <section><h1>473</h1></section> - <section><h1>474</h1></section> - <section><h1>475</h1></section> - <section><h1>476</h1></section> - <section><h1>477</h1></section> - <section><h1>478</h1></section> - <section><h1>479</h1></section> - <section><h1>480</h1></section> - <section><h1>481</h1></section> - <section><h1>482</h1></section> - <section><h1>483</h1></section> - <section><h1>484</h1></section> - <section><h1>485</h1></section> - <section><h1>486</h1></section> - <section><h1>487</h1></section> - <section><h1>488</h1></section> - <section><h1>489</h1></section> - <section><h1>490</h1></section> - <section><h1>491</h1></section> - <section><h1>492</h1></section> - <section><h1>493</h1></section> - <section><h1>494</h1></section> - <section><h1>495</h1></section> - <section><h1>496</h1></section> - <section><h1>497</h1></section> - <section><h1>498</h1></section> - <section><h1>499</h1></section> - </div> - </div> - - <script src="../dist/reveal.js"></script> - <script> - Reveal.initialize({ - transition: 'linear' - }); - </script> - </body> -</html> diff --git a/recitation/debugging/examples/assets/beeping.txt b/recitation/debugging/examples/assets/beeping.txt deleted file mode 100644 index bf41997..0000000 --- a/recitation/debugging/examples/assets/beeping.txt +++ /dev/null @@ -1,2 +0,0 @@ -Source: https://freesound.org/people/fennelliott/sounds/379419/ -License: CC0 (public domain) \ No newline at end of file diff --git a/recitation/debugging/examples/assets/beeping.wav b/recitation/debugging/examples/assets/beeping.wav deleted file mode 100644 index 38747a533a78497c52134dc0ea13ba197eec9e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422472 zcmeFaWtbedvo9>Edw6GOnG9=Ywi8p#Oo^G96Enn)A!cTdnK_2U%#5*PW{PRoUf$tp zkaSC)<CFhA=eZx=&+qO$voqV>DpmbdDwU*CZR;it8`d6aL>=n1Z_t0p=zL)aA&dyB zzYn3XKM9gi80y<=bgz3OjBqFCCkKHX1ac6_K_CZ#90YO@$Uz_nfgA*K5XeCw2Z0;} zauCQtAP0dQ1ac6_K_CZ#90YO@$Uz_nfgA*K5XeCw2Z0;}auCQtAP0dQ1ac6_K_CZ# z90YO@$Uz_nfgA*K5XeCw2Z0;}auCQtAP0dQ1ac6_K_CZ#90YO@$Uz_nfgA*K5XeCw z2Z8@TA;9^+(*EanaTR~LC4L9Lefjf${QA!_;`@I-iBa(G*K1$zi_hS9&e?yL;qXI{ z1a}yGk}tLDT;mw7X<Ua-@y(1B_|CZupOpLHB`A2|Q<OHqi@=>IWJRGsDHKY^ARA&l zz*Tr60MEL(lN*o`Xi;v0r(;lFpc)QO$Dwo{hCXmVSK!%fp7!ON8RZ6w)-TljaK*zP zavORNoIQf8S-c?1gF;XQibti910@1|6>14bsZjnie*=^#&*C3}V^N<4soV{<n2_K- z6=d;o3rglmP)5j!P#TnrMzJ7C5U1Qg-v$!K!xbBpPX`{%kSig;T~OKtPZoxfGAe*7 zqI~cyLZ83L|B3(2pYl^c?Jd6w-?Ml=K&2VV;8mea2jJKN<vw!<aGK4pK%G&j5Gn!J z4X7cCLlw{iK=eBBc$;71yMT_2{7_>SAW#Z@i}C}dP*e&eP2*LNpY1}M`8E`Z?!)z0 zs5{!gKk<A#gE!+H&>=RB4`h9K3wD54=M&J6s3u;-xALW^8k$Lpksas+P@c(#;Y`4_ zDKE>MtP3m0kFtHNl>S`H<#&3o`-*#ZD`S0ss7(Xgv5t}*H^YV{Ov>Fa*Xq3G<NnGO z5nDE4wC%WkurtA3;Nz~O!O8hQX&-<4*z{9kvLU-=hS6KvSw$`2m-%0MB*~9H8t)ob zo5q<I88#TY8{!O|r19h|DTR9(?S|Rb3D%d^CpN$7qord=O$Q5G9eL4s$NY>=M6cK- zd|2zi+W0Ce&9d@3Ns{!@|6%YuIpuJ&H7zP-xpPBy3;u}hv+cGV3sr43?BTXv5l<Z9 z@oi#h!i`)z5<2Eii!Kx!5k4Uz-2NuCIBG`LxVQN_yUuy9xe9xKciwVmXPtHCNnQN8 z<mdGt9%mFz>F7*K@9i3rH99cPKMv310}MyV2)UBf&a}z6DD0IZB4J&^+`K5?(Oi#m z&yU#?iy~vAkC-Rg_9^?Q-CJIL=IgGSJxzVfvd%aQr2UdoEXDfaSjMO16z8S111@jo zYj0)WQ!SERL<6K}c!;5~w9I(GwmYO(?5dbHiCgp5OWd2cU%W3aEQZ7!bo?9|f)Db> zN=N0KdP<oYxZzvqeD3`9bGek}@4tP2<zwlj8!1y$m!`Wj%4KhK$NJu@z4hbh8LLR9 zq0jht%YEbAxRnvL3+>L^uJF-(6Z5Xk#o}+oH;jsku4>wADMQbZ;+hqwDPFqIv)F$p z^=+E+F6Qmfcl}@2{8agUt@I9`3S<q>SmgQLe_Jb#FSEXeCCqL#OVvz|9o-#D9z!li z!Bcr|B{quxDOa(Wb}^kJir8OT^N~!_RFC6}HI2Rqyi^xEr?|I%+Wx7<`$2DWe{v*k zNq3}H&4^8J=`7@V7;w<tx)q1eg~ZE~r5o0wwl#6T$J|Zqn7d`->x4H6DKVbtQjtv@ z*&%o2@1>jc5v@$G>Swis>Yv_RzAb6n)3QGdes4;)Cml&kN%d!(�H}cLh9$l+Oxd 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	x<!JzTaZ*FsDIm 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 z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y z5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y 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≫3ZEarH~xrHBVj{4GFnEEY@`rc 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	fM=9{qE4H}`h;0{c+MZu1)J4X&|qom@(L8(bu8 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뫶{cSbMwDfUT{_ONi%9w9mr@JdqvZh?S&n+`K+}9i5fOhiy6%A z3bpIX{BN&d9@!BE*jjuI2aT1vU<AR~g3p;XZ*|&>h$Qy<#r_#RWAHbK271=^Aiy?p zp6uuB`_12AMuHxjdAHgu=t(ddD|Hr?K+D<ZtQ=a25A<n(j(yFvWalKXgGLVQEoeDd z;V(*v`INPuRs#pU3#84;gZ&$<dfQ*y&p<C*d9mxnjy>p?wJ3IFzbG{pX>+aM*J5dV zYugWA2{5sr3EmfAWNo5(k3lq81I9`kMyo`gDr1WcYUaoG&d!aUSKF4=d{&ap+*y3A z)(IY)_RX&uO&~k=nr7tY+AnG*Yoih^p!q+Tf7_Q}taiNySGRIz=gd~sF*6&C+4L>= zv8Y%{GwqunI|nb`o0+vb$GkrnQE(00YGAhlEbM*oH^AN8zj$Tam!KDkx-4-fY-^^i z08zW%|F4C&dd%WyF|?2E8n)7G<kZx&GX78C8(1bXt4Ykr?PskHNc?N{uJKXL&G=>( z(O|Ys&&}!zS~icYcD0|h<217rXsW<-vHdXpNt`2lH7jY)r-VO2zl=7tS2q1HQfMX7 z`X2WGL{trK7H@-|y;;e#5@=<@`mRPR2bR*zTlf<q5F!vF5F!vF5F!vF5F!vF5F!vF z5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF z5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF z5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF z5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF z5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF5F!vF m5F!vF5F!vF5F!vF5F!vF@c$QqDpkK|Ta`<ioBV&g^#1_kOUY{h diff --git a/recitation/debugging/examples/assets/image1.png b/recitation/debugging/examples/assets/image1.png deleted file mode 100644 index 87475945d0700ff26588a761aa87cab03d28a752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21991 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 diff --git a/recitation/debugging/examples/assets/image2.png b/recitation/debugging/examples/assets/image2.png deleted file mode 100644 index 6c403a0d20be97d7f4ce000487fac783764dbaf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10237 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 Gg#Hhj!X@AU diff --git a/recitation/debugging/examples/auto-animate.html b/recitation/debugging/examples/auto-animate.html deleted file mode 100644 index 199810e..0000000 --- a/recitation/debugging/examples/auto-animate.html +++ /dev/null @@ -1,225 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Auto Animate</title> - - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/black.css" id="theme"> - <link rel="stylesheet" href="../plugin/highlight/monokai.css"> - </head> - - <body> - - <div class="reveal"> - - <div class="slides"> - <section data-auto-animate data-auto-animate-unmatched="fade"> - <h3>Auto-Animate Example</h3> - <p>This will fade out</p> - <img src="assets/image1.png" style="height: 100px;"> - <pre data-id="code"><code data-line-numbers class="hljs" data-trim> - function Example() { - const [count, setCount] = useState(0); - } - </code></pre> - </section> - <section data-auto-animate data-auto-animate-unmatched="fade"> - <h3>Auto-Animate Example</h3> - <p style="opacity: 0.2; margin-top: 100px;">This will fade out</p> - <p>This element is unmatched</p> - <img src="assets/image1.png" style="height: 150px;"> - <pre data-id="code"><code data-line-numbers class="hljs" data-trim> - function Example() { - New line! - const [count, setCount] = useState(0); - } - </code></pre> - </section> - - <section data-auto-animate> - <p data-id="text-props" style="background: #555; line-height: 1em; letter-spacing: 0em;">Line Height & Letter Spacing</p> - </section> - <section data-auto-animate> - <p data-id="text-props" style="background: #555; line-height: 3em; letter-spacing: 0.2em;">Line Height & Letter Spacing</p> - </section> - - <section> - <section data-auto-animate> - <pre data-id="code"><code data-line-numbers class="hljs" data-trim> - import React, { useState } from 'react'; - - function Example() { - const [count, setCount] = useState(0); - - return ( - ... - ); - } - </code></pre> - </section> - <section data-auto-animate> - <pre data-id="code"><code data-line-numbers class="hljs" data-trim> - function Example() { - const [count, setCount] = useState(0); - - return ( - <div> - <p>You clicked {count} times</p> - <button onClick={() => setCount(count + 1)}> - Click me - </button> - </div> - ); - } - </code></pre> - </section> - <section data-auto-animate> - <pre data-id="code"><code data-line-numbers class="hljs" data-trim> - function Example() { - // A comment! - const [count, setCount] = useState(0); - - return ( - <div> - <p>You clicked {count} times</p> - <button onClick={() => setCount(count + 1)}> - Click me - </button> - </div> - ); - } - </code></pre> - </section> - </section> - - <section> - <section data-auto-animate> - <h3>Swapping list items</h3> - <ul> - <li>One</li> - <li>Two</li> - <li>Three</li> - </ul> - </section> - <section data-auto-animate> - <h3>Swapping list items</h3> - <ul> - <li>Two</li> - <li>One</li> - <li>Three</li> - </ul> - </section> - <section data-auto-animate> - <h3>Swapping list items</h3> - <ul> - <li>Two</li> - <li>Three</li> - <li>One</li> - </ul> - </section> - </section> - - <section data-auto-animate style="height: 600px"> - <h3 style="opacity: 0.3; font-size: 18px;">SLIDE 1</h3> - <h2 data-id="title" style="margin-top: 260px;">Animate Anything</h2> - <div data-id="1" style="background: white; position: absolute; top: 150px; left: 16%; width: 60px; height: 60px;"></div> - <div data-id="2" style="background: white; position: absolute; top: 150px; left: 36%; width: 60px; height: 60px;"></div> - <div data-id="3" style="background: white; position: absolute; top: 150px; left: 56%; width: 60px; height: 60px;"></div> - <div data-id="4" style="background: white; position: absolute; top: 150px; left: 76%; width: 60px; height: 60px;"></div> - </section> - <section data-auto-animate style="height: 600px"> - <h3 style="opacity: 0.3; font-size: 18px;">SLIDE 2</h3> - <h2 data-id="title" style="margin-top: 500px">With Auto Animate</h2> - <div data-id="1" style="background: cyan; position: absolute; bottom: 190px; left: 16%; width: 60px; height: 60px;"></div> - <div data-id="2" style="background: magenta; position: absolute; bottom: 190px; left: 36%; width: 60px; height: 160px;"></div> - <div data-id="3" style="background: yellow; position: absolute; bottom: 190px; left: 56%; width: 60px; height: 260px;"></div> - <div data-id="4" style="background: red; position: absolute; bottom: 190px; left: 76%; width: 60px; height: 360px;"></div> - </section> - <section data-auto-animate style="height: 600px"> - <h3 style="opacity: 0.3; font-size: 18px;">SLIDE 3</h3> - <h2 data-id="title" style="margin-top: 500px; opacity: 0;">With Auto Animate</h2> - <div data-id="1" style="background: cyan; position: absolute; top: 50%; left: 50%; width: 400px; height: 400px; margin: -200px 0 0 -200px; border-radius: 400px;"></div> - <div data-id="2" style="background: magenta; position: absolute; top: 50%; left: 50%; width: 300px; height: 300px; margin: -150px 0 0 -150px; border-radius: 400px;"></div> - <div data-id="3" style="background: yellow; position: absolute; top: 50%; left: 50%; width: 200px; height: 200px; margin: -100px 0 0 -100px; border-radius: 400px;"></div> - <div data-id="4" style="background: red; position: absolute; top: 50%; left: 50%; width: 100px; height: 100px; margin: -50px 0 0 -50px; border-radius: 400px;"></div> - </section> - <section data-auto-animate style="height: 600px"> - <h3 style="opacity: 0.3; font-size: 18px;">SLIDE 3</h3> - <h2 data-id="title" style="margin-top: 500px; opacity: 0;">With Auto Animate</h2> - <div data-id="1" style="background: red; position: absolute; top: 250px; left: 16%; width: 60px; height: 60px;"></div> - <div data-id="2" style="background: yellow; position: absolute; top: 250px; left: 36%; width: 60px; height: 60px;"></div> - <div data-id="3" style="background: magenta; position: absolute; top: 250px; left: 56%; width: 60px; height: 60px;"></div> - <div data-id="4" style="background: cyan; position: absolute; top: 250px; left: 76%; width: 60px; height: 60px;"></div> - </section> - - <section data-auto-animate data-auto-animate-id="a"> - <h2>data-auto-animate-id="a"</h2> - <h3>A1</h3> - </section> - <section data-auto-animate data-auto-animate-id="a"> - <h2>data-auto-animate-id="a"</h2> - <h3>A1</h3> - <h3>A2</h3> - </section> - <section data-auto-animate data-auto-animate-id="b"> - <h2>data-auto-animate-id="b"</h2> - <h3>B1</h3> - </section> - <section data-auto-animate data-auto-animate-id="b"> - <h2>data-auto-animate-id="b"</h2> - <h3>B1</h3> - <h3>B2</h3> - </section> - - <section> - <section id="stacked-slide-1" data-auto-animate> - <a href="#/stacked-slide-1">Slide 1</a><br> - <a href="#/stacked-slide-2">Slide 2</a><br> - <a href="#/stacked-slide-3">Slide 3</a><br> - <a href="#/stacked-slide-4">Slide 4</a><br> - <div data-id="anim" style="background: indigo; padding: 8px; width: 50px; height: 50px; position: absolute; left: 0px;">A</div> - </section> - <section id="stacked-slide-2" data-auto-animate> - <a href="#/stacked-slide-1">Slide 1</a><br> - <a href="#/stacked-slide-2">Slide 2</a><br> - <a href="#/stacked-slide-3">Slide 3</a><br> - <a href="#/stacked-slide-4">Slide 4</a><br> - <div data-id="anim" style="background: indigo; padding: 8px; width: 50px; height: 50px; position: absolute; left: 25%;">A</div> - </section> - <section id="stacked-slide-3" data-auto-animate> - <a href="#/stacked-slide-1">Slide 1</a><br> - <a href="#/stacked-slide-2">Slide 2</a><br> - <a href="#/stacked-slide-3">Slide 3</a><br> - <a href="#/stacked-slide-4">Slide 4</a><br> - <div data-id="anim" style="background: indigo; padding: 8px; width: 50px; height: 50px; position: absolute; left: 50%;">A</div> - </section> - <section id="stacked-slide-4" data-auto-animate> - <a href="#/stacked-slide-1">Slide 1</a><br> - <a href="#/stacked-slide-2">Slide 2</a><br> - <a href="#/stacked-slide-3">Slide 3</a><br> - <a href="#/stacked-slide-4">Slide 4</a><br> - <div data-id="anim" style="background: indigo; padding: 8px; width: 50px; height: 50px; position: absolute; left: 75%;">A</div> - </section> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script src="../plugin/highlight/highlight.js"></script> - <script> - Reveal.initialize({ - center: true, - hash: true, - plugins: [ RevealHighlight ] - }); - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/backgrounds.html b/recitation/debugging/examples/backgrounds.html deleted file mode 100644 index 19d40c3..0000000 --- a/recitation/debugging/examples/backgrounds.html +++ /dev/null @@ -1,141 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Slide Backgrounds</title> - - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/serif.css" id="theme"> - <style type="text/css" media="screen"> - .slides section.has-dark-background, - .slides section.has-dark-background h2 { - color: #fff; - } - .slides section.has-light-background, - .slides section.has-light-background h2 { - color: #222; - } - </style> - </head> - - <body> - - <div class="reveal"> - - <div class="slides"> - - <section data-background="#00ffff"> - <h2>data-background: #00ffff</h2> - </section> - - <section data-background="#bb00bb"> - <h2>data-background: #bb00bb</h2> - </section> - - <section data-background-color="lightblue"> - <h2>data-background: lightblue</h2> - </section> - - <section> - <section data-background="#ff0000"> - <h2>data-background: #ff0000</h2> - </section> - <section data-background="rgba(0, 0, 0, 0.2)"> - <h2>data-background: rgba(0, 0, 0, 0.2)</h2> - </section> - <section data-background="salmon"> - <h2>data-background: salmon</h2> - </section> - </section> - - <section data-background="rgba(0, 100, 100, 0.2)"> - <section> - <h2>Background applied to stack</h2> - </section> - <section> - <h2>Background applied to stack</h2> - </section> - <section data-background="rgb(66, 66, 66)"> - <h2>Background applied to slide inside of stack</h2> - </section> - </section> - - <section data-background-transition="slide" data-background="assets/image1.png"> - <h2>Background image</h2> - </section> - - <section> - <section data-background-transition="slide" data-background="assets/image1.png"> - <h2>Background image</h2> - </section> - <section data-background-transition="slide" data-background="assets/image1.png"> - <h2>Background image</h2> - </section> - </section> - - <section data-background="assets/image2.png" data-background-size="100px" data-background-repeat="repeat" data-background-color="#111"> - <h2>Background image</h2> - <pre>data-background-size="100px" data-background-repeat="repeat" data-background-color="#111"</pre> - </section> - - <section data-background="#888888"> - <h2>Same background twice (1/2)</h2> - </section> - <section data-background="#888888"> - <h2>Same background twice (2/2)</h2> - </section> - - <section data-background-video="https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.mp4,https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.webm"> - <h2>Video background</h2> - </section> - - <section data-background-iframe="https://slides.com/news/make-better-presentations/embed?style=hidden&autoSlide=4000"> - <h2>Iframe background</h2> - </section> - - <section> - <section data-background="#417203"> - <h2>Same background twice vertical (1/2)</h2> - </section> - <section data-background="#417203"> - <h2>Same background twice vertical (2/2)</h2> - </section> - </section> - - <section data-background="#934f4d"> - <h2>Same background from horizontal to vertical (1/3)</h2> - </section> - <section> - <section data-background="#934f4d"> - <h2>Same background from horizontal to vertical (2/3)</h2> - </section> - <section data-background="#934f4d"> - <h2>Same background from horizontal to vertical (3/3)</h2> - </section> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - - // Full list of configuration options: - // https://revealjs.revealjs.com/config/ - Reveal.initialize({ - center: true, - - transition: 'linear', - // transitionSpeed: 'slow', - // backgroundTransition: 'slide' - }); - - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/barebones.html b/recitation/debugging/examples/barebones.html deleted file mode 100644 index 50adcb8..0000000 --- a/recitation/debugging/examples/barebones.html +++ /dev/null @@ -1,32 +0,0 @@ -<!doctype html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <title>reveal.js - Barebones</title> - <link rel="stylesheet" href="../dist/reveal.css"> - </head> - <body> - - <div class="reveal"> - <div class="slides"> - - <section> - <h2>Barebones Presentation</h2> - <p>This example contains the bare minimum includes and markup required to run a reveal.js presentation.</p> - </section> - - <section> - <h2>No Theme</h2> - <p>There's no theme included, so it will fall back on browser defaults.</p> - </section> - - </div> - </div> - - <script src="../dist/reveal.js"></script> - <script> - Reveal.initialize(); - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/layout-helpers.html b/recitation/debugging/examples/layout-helpers.html deleted file mode 100644 index a129811..0000000 --- a/recitation/debugging/examples/layout-helpers.html +++ /dev/null @@ -1,160 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Layout Helpers</title> - - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/white.css" id="theme"> - <link rel="stylesheet" href="../plugin/highlight/monokai.css"> - </head> - - <body> - - <div class="reveal"> - - <div class="slides"> - - <section> - <h2>Layout Helper Examples</h2> - <ul> - <li><a href="#/fit-text">Big Text</a></li> - <li><a href="#/stretch">Stretch</a></li> - <li><a href="#/stack">Stack</a></li> - <li><a href="#/hstack">HStack</a></li> - <li><a href="#/vstack">VStack</a></li> - </ul> - </section> - - <section id="fit-text"> - <h2>Fit Text</h2> - <p>Resizes text to be as large as possible within its container.</p> - <pre><code class="html" data-trim data-line-numbers> - <h2 class="r-fit-text">FIT</h2> - </code></pre> - </section> - - <section> - <h2 class="r-fit-text">FIT</h2> - </section> - - <section> - <h2 class="r-fit-text">HELLO WORLD</h2> - <h2 class="r-fit-text">BOTH THESE TITLES USE FIT-TEXT</h2> - </section> - - <section id="stretch"> - <h2>Stretch</h2> - <p>Makes an element as tall as possible while remaining within the slide bounds.</p> - <pre><code class="html" data-trim data-line-numbers> - <h2>Stretch Example</h2> - <img src="assets/image2.png" class="r-stretch"> - <p>Image byline</p> - </code></pre> - </section> - - <section> - <h2>Stretch Example</h2> - <img src="assets/image2.png" class="r-stretch"> - <p>Image byline</p> - </section> - - <section id="stack"> - <h2>Stack</h2> - <p>Stacks multiple elements on top of each other, for use with fragments.</p> - <pre><code class="html" data-trim data-line-numbers> - <div class="r-stack"> - <img class="fragment" width="450" height="300" src="..."> - <img class="fragment" width="300" height="450" src="..."> - <img class="fragment" width="400" height="400" src="..."> - </div> - </code></pre> - </section> - - <section> - <h2>Stack Example</h2> - <div class="r-stack"> - <p class="fragment fade-in-then-out">One</p> - <p class="fragment fade-in-then-out">Two</p> - <p class="fragment fade-in-then-out">Three</p> - <p class="fragment fade-in-then-out">Four</p> - </div> - <div class="r-stack"> - <img src="https://placekitten.com/450/300" width="450" height="300" class="fragment"> - <img src="https://placekitten.com/300/450" width="300" height="450" class="fragment"> - <img src="https://placekitten.com/400/400" width="400" height="400" class="fragment"> - </div> - </section> - - <section> - <h2>Stack Example</h2> - <p>fade-in-then-out fragments</p> - <div class="r-stack"> - <img src="https://placekitten.com/450/300" width="450" height="300" class="fragment fade-in-then-out"> - <img src="https://placekitten.com/300/450" width="300" height="450" class="fragment fade-in-then-out"> - <img src="https://placekitten.com/400/400" width="400" height="400" class="fragment fade-in-then-out"> - </div> - </section> - - <section id="hstack"> - <h2>HStack</h2> - <p>Stacks multiple elements horizontally.</p> - <pre><code class="html" data-trim data-line-numbers> - <div class="r-hstack"> - <img width="450" height="300" src="..."> - <img width="300" height="450" src="..."> - <img width="400" height="400" src="..."> - </div> - </code></pre> - </section> - - <section data-auto-animate> - <h2>HStack Example</h2> - <div class="r-hstack"> - <p style="padding: 0.50em; background: #eee; margin: 0.25em">One</p> - <p style="padding: 0.75em; background: #eee; margin: 0.25em">Two</p> - <p style="padding: 1.00em; background: #eee; margin: 0.25em">Three</p> - </div> - </section> - - <section id="vstack"> - <h2>VStack</h2> - <p>Stacks multiple elements vertically.</p> - <pre><code class="html" data-trim data-line-numbers> - <div class="r-vstack"> - <img width="450" height="300" src="..."> - <img width="300" height="450" src="..."> - <img width="400" height="400" src="..."> - </div> - </code></pre> - </section> - - <section data-auto-animate> - <h2>VStack Example</h2> - <div class="r-vstack"> - <p style="padding: 0.50em; background: #eee; margin: 0.25em">One</p> - <p style="padding: 0.75em; background: #eee; margin: 0.25em">Two</p> - <p style="padding: 1.00em; background: #eee; margin: 0.25em">Three</p> - </div> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script src="../plugin/highlight/highlight.js"></script> - <script> - Reveal.initialize({ - center: true, - hash: true, - plugins: [ RevealHighlight ] - }); - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/markdown.html b/recitation/debugging/examples/markdown.html deleted file mode 100644 index 4d69f05..0000000 --- a/recitation/debugging/examples/markdown.html +++ /dev/null @@ -1,161 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Markdown Example</title> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/white.css" id="theme"> - - <link rel="stylesheet" href="../plugin/highlight/monokai.css"> - </head> - - <body> - - <div class="reveal"> - - <div class="slides"> - - <!-- Use external markdown resource, separate slides by three newlines; vertical slides by two newlines --> - <section data-markdown="markdown.md" data-separator="^\n\n\n" data-separator-vertical="^\n\n"></section> - - <!-- Slides are separated by three dashes (the default) --> - <section data-markdown> - <script type="text/template"> - ## Demo 1 - Slide 1 - --- - ## Demo 1 - Slide 2 - --- - ## Demo 1 - Slide 3 - </script> - </section> - - <!-- Slides are separated by regexp matching newline + three dashes + newline, vertical slides identical but two dashes --> - <section data-markdown data-separator="^\n---\n$" data-separator-vertical="^\n--\n$"> - <script type="text/template"> - ## Demo 2 - Slide 1.1 - - -- - - ## Demo 2 - Slide 1.2 - - --- - - ## Demo 2 - Slide 2 - </script> - </section> - - <!-- No "extra" slides, since the separator can't be matched ("---" will become horizontal rulers) --> - <section data-markdown data-separator="$x"> - <script type="text/template"> - A - - --- - - B - - --- - - C - </script> - </section> - - <!-- Slide attributes --> - <section data-markdown> - <script type="text/template"> - <!-- .slide: data-background="#000000" --> - ## Slide attributes - </script> - </section> - - <!-- Element attributes --> - <section data-markdown> - <script type="text/template"> - ## Element attributes - - Item 1 <!-- .element: class="fragment" data-fragment-index="2" --> - - Item 2 <!-- .element: class="fragment" data-fragment-index="1" --> - </script> - </section> - - <!-- Code --> - <section data-markdown> - <script type="text/template"> - ```php [1|3-5] - public function foo() - { - $foo = array( - 'bar' => 'bar' - ) - } - ``` - </script> - </section> - - <!-- add optional line count offset, in this case 287 --> - <section data-markdown> - <script type="text/template"> - ## echo.c - - ```c [287: 2|4,6] - /* All of the options in this arg are valid, so handle them. */ - p = arg + 1; - do { - if (*p == 'n') - nflag = 0; - if (*p == 'e') - eflag = '\\'; - } while (*++p); - ``` - [source](https://git.busybox.net/busybox/tree/coreutils/echo.c?h=1_36_stable#n287) - </script> - </section> - - <!-- Images --> - <section data-markdown> - <script type="text/template"> -  - </script> - </section> - - <!-- Math --> - <section data-markdown> - ## The Lorenz Equations - `\[\begin{aligned} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{aligned} \]` - </section> - - </div> - </div> - - <script src="../dist/reveal.js"></script> - <script src="../plugin/markdown/markdown.js"></script> - <script src="../plugin/highlight/highlight.js"></script> - <script src="../plugin/notes/notes.js"></script> - <script src="../plugin/math/math.js"></script> - - <script> - - Reveal.initialize({ - controls: true, - progress: true, - history: true, - center: true, - - plugins: [ RevealMarkdown, RevealHighlight, RevealNotes, RevealMath.KaTeX ] - }); - - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/markdown.md b/recitation/debugging/examples/markdown.md deleted file mode 100644 index 1315172..0000000 --- a/recitation/debugging/examples/markdown.md +++ /dev/null @@ -1,41 +0,0 @@ -# Markdown Demo - - - -## External 1.1 - -Content 1.1 - -Note: This will only appear in the speaker notes window. - - -## External 1.2 - -Content 1.2 - - - -## External 2 - -Content 2.1 - - - -## External 3.1 - -Content 3.1 - - -## External 3.2 - -Content 3.2 - - -## External 3.3 (Image) - - - - -## External 3.4 (Math) - -`\[ J(\theta_0,\theta_1) = \sum_{i=0} \]` diff --git a/recitation/debugging/examples/math.html b/recitation/debugging/examples/math.html deleted file mode 100644 index bd2e75a..0000000 --- a/recitation/debugging/examples/math.html +++ /dev/null @@ -1,206 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Math Plugin</title> - - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/night.css" id="theme"> - </head> - - <body> - - <div class="reveal"> - - <div class="slides"> - - <section> - <h2>reveal.js Math Plugin</h2> - <p>Render math with KaTeX, MathJax 2 or MathJax 3</p> - </section> - - <section> - <h3>The Lorenz Equations</h3> - - \[\begin{aligned} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{aligned} \] - </section> - - <section> - <h3>The Cauchy-Schwarz Inequality</h3> - - <script type="math/tex; mode=display"> - \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) - </script> - </section> - - <section> - <h3>A Cross Product Formula</h3> - - \[\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix} - \mathbf{i} & \mathbf{j} & \mathbf{k} \\ - \frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ - \frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 - \end{vmatrix} \] - </section> - - <section> - <h3>The probability of getting \(k\) heads when flipping \(n\) coins is</h3> - - \[P(E) = {n \choose k} p^k (1-p)^{ n-k} \] - </section> - - <section> - <h3>An Identity of Ramanujan</h3> - - \[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = - 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} - {1+\frac{e^{-8\pi}} {1+\ldots} } } } \] - </section> - - <section> - <h3>A Rogers-Ramanujan Identity</h3> - - \[ 1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = - \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\] - </section> - - <section> - <h3>Maxwell’s Equations</h3> - - \[ \begin{aligned} - \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ - \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ - \nabla \cdot \vec{\mathbf{B}} & = 0 \end{aligned} - \] - </section> - - <section> - <h3>TeX Macros</h3> - - Here is a common vector space: - \[L^2(\R) = \set{u : \R \to \R}{\int_\R |u|^2 < +\infty}\] - used in functional analysis. - </section> - - <section> - <section> - <h3>The Lorenz Equations</h3> - - <div class="fragment"> - \[\begin{aligned} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{aligned} \] - </div> - </section> - - <section> - <h3>The Cauchy-Schwarz Inequality</h3> - - <div class="fragment"> - \[ \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \] - </div> - </section> - - <section> - <h3>A Cross Product Formula</h3> - - <div class="fragment"> - \[\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix} - \mathbf{i} & \mathbf{j} & \mathbf{k} \\ - \frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ - \frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 - \end{vmatrix} \] - </div> - </section> - - <section> - <h3>The probability of getting \(k\) heads when flipping \(n\) coins is</h3> - - <div class="fragment"> - \[P(E) = {n \choose k} p^k (1-p)^{ n-k} \] - </div> - </section> - - <section> - <h3>An Identity of Ramanujan</h3> - - <div class="fragment"> - \[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = - 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} - {1+\frac{e^{-8\pi}} {1+\ldots} } } } \] - </div> - </section> - - <section> - <h3>A Rogers-Ramanujan Identity</h3> - - <div class="fragment"> - \[ 1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = - \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\] - </div> - </section> - - <section> - <h3>Maxwell’s Equations</h3> - - <div class="fragment"> - \[ \begin{aligned} - \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ - \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ - \nabla \cdot \vec{\mathbf{B}} & = 0 \end{aligned} - \] - </div> - </section> - - <section> - <h3>TeX Macros</h3> - - Here is a common vector space: - \[L^2(\R) = \set{u : \R \to \R}{\int_\R |u|^2 < +\infty}\] - used in functional analysis. - </section> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script src="../plugin/math/math.js"></script> - <script> - Reveal.initialize({ - history: true, - transition: 'linear', - - mathjax2: { - config: 'TeX-AMS_HTML-full', - TeX: { - Macros: { - R: '\\mathbb{R}', - set: [ '\\left\\{#1 \\; ; \\; #2\\right\\}', 2 ] - } - } - }, - - // There are three typesetters available - // RevealMath.MathJax2 (default) - // RevealMath.MathJax3 - // RevealMath.KaTeX - // - // More info at https://revealjs.com/math/ - plugins: [ RevealMath.MathJax2 ] - }); - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/media.html b/recitation/debugging/examples/media.html deleted file mode 100644 index 388208f..0000000 --- a/recitation/debugging/examples/media.html +++ /dev/null @@ -1,75 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Video, Audio and Iframes</title> - - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/white.css" id="theme"> - </head> - - <body> - - <div class="reveal"> - - <div class="slides"> - - <section> - <h2>Examples of embedded Video, Audio and Iframes</h2> - </section> - - <section> - <h2>Iframe</h2> - <iframe data-autoplay width="700" height="540" src="https://slides.com/news/auto-animate/embed" frameborder="0"></iframe> - </section> - - <section data-background-iframe="https://www.youtube.com/embed/h1_nyI3z8gI" data-background-interactive> - <h2 style="color: #fff;">Iframe Background</h2> - </section> - - <section> - <h2>Video</h2> - <video src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" data-autoplay></video> - </section> - - <section data-background-video="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"> - <h2>Background Video</h2> - </section> - - <section> - <h2>Auto-playing audio</h2> - <audio src="assets/beeping.wav" data-autoplay></audio> - </section> - - <section> - <h2>Audio inside slide fragments</h2> - <div class="fragment"> - Beep 1 - <audio src="assets/beeping.wav" data-autoplay></audio> - </div> - <div class="fragment"> - Beep 2 - <audio src="assets/beeping.wav" data-autoplay></audio> - </div> - </section> - - <section> - <h2>Audio with controls</h2> - <audio src="assets/beeping.wav" controls></audio> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - Reveal.initialize({hash: true}); - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/multiple-presentations.html b/recitation/debugging/examples/multiple-presentations.html deleted file mode 100644 index e5347d4..0000000 --- a/recitation/debugging/examples/multiple-presentations.html +++ /dev/null @@ -1,102 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Multiple Presentations</title> - - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/white.css" id="theme"> - <link rel="stylesheet" href="../plugin/highlight/monokai.css"> - </head> - - <body style="background: #ddd;"> - - <div style="display: flex; flex-direction: row;"> - <div class="reveal deck1" style="width: 100%; height: 50vh; margin: 10px;"> - <div class="slides"> - <section>Deck 1, Slide 1</section> - <section>Deck 1, Slide 2</section> - <section> - <pre data-id="code-animation"><code class="hljs" data-trim data-line-numbers> - import React, { useState } from 'react'; - function Example() { - const [count, setCount] = useState(0); - } - </code></pre> - </section> - </div> - </div> - - <div class="reveal deck2" style="width: 100%; height: 50vh; margin: 10px;"> - <div class="slides"> - <section>Deck 2, Slide 1</section> - <section>Deck 2, Slide 2</section> - <section data-markdown> - <script type="text/template"> - ## Markdown plugin - - - 1 - - 2 - - 3 - </script> - </section> - <section> - <h3>The Lorenz Equations</h3> - - \[\begin{aligned} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{aligned} \] - </section> - </div> - </div> - </div> - - <style> - .reveal { - border: 4px solid #ccc; - } - .reveal.focused { - border-color: #94b5ff; - } - </style> - - <script src="../dist/reveal.js"></script> - <script src="../plugin/highlight/highlight.js"></script> - <script src="../plugin/markdown/markdown.js"></script> - <script src="../plugin/math/math.js"></script> - <script> - - let deck1 = new Reveal( document.querySelector( '.deck1' ), { - embedded: true, - progress: false, - keyboardCondition: 'focused', - plugins: [ RevealHighlight ] - } ); - deck1.on( 'slidechanged', () => { - console.log( 'Deck 1 slide changed' ); - } ); - deck1.initialize(); - - let deck2 = new Reveal( document.querySelector( '.deck2' ), { - embedded: true, - progress: false, - keyboardCondition: 'focused', - plugins: [ RevealMarkdown, RevealMath ] - } ); - deck2.initialize().then( () => { - deck2.slide(1); - } ); - deck2.on( 'slidechanged', () => { - console.log( 'Deck 2 slide changed' ); - } ); - - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/scroll.html b/recitation/debugging/examples/scroll.html deleted file mode 100644 index 546ca1c..0000000 --- a/recitation/debugging/examples/scroll.html +++ /dev/null @@ -1,118 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Scroll View</title> - - <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - - <link rel="stylesheet" href="../dist/reset.css"> - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/black.css" id="theme"> - <link rel="stylesheet" href="../plugin/highlight/monokai.css"> - </head> - - <body> - - <div class="reveal"> - - <div class="slides"> - - <section><h1>Scroll View</h1></section> - <section data-background="indigo"> - <h2>Scroll triggered fragments</h2> - <ul> - <li class="fragment fade-left">Step one</li> - <li class="fragment fade-left">Step two</li> - <li class="fragment fade-left">Step three</li> - </ul> - </section> - <section data-background-color="#fff"><h2>Scrollbar inverts<br>based on slide bg</h2></section> - <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> - <h2>Auto-Animate</h2> - <p>Scroll triggered auto-animations ðŸ˜</p> - <div class="r-hstack justify-center"> - <div data-id="box1" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> - <div data-id="box2" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> - <div data-id="box3" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div> - </div> - </section> - <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> - <div class="r-hstack justify-center"> - <div data-id="box1" data-auto-animate-delay="0" style="background: cyan; width: 150px; height: 100px; margin: 10px;"></div> - <div data-id="box2" data-auto-animate-delay="0.1" style="background: magenta; width: 150px; height: 100px; margin: 10px;"></div> - <div data-id="box3" data-auto-animate-delay="0.2" style="background: yellow; width: 150px; height: 100px; margin: 10px;"></div> - </div> - <h2 style="margin-top: 20px;">Auto-Animate</h2> - </section> - <section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)"> - <div class="r-stack"> - <div data-id="box1" style="background: cyan; width: 300px; height: 300px; border-radius: 200px;"></div> - <div data-id="box2" style="background: magenta; width: 200px; height: 200px; border-radius: 200px;"></div> - <div data-id="box3" style="background: yellow; width: 100px; height: 100px; border-radius: 200px;"></div> - </div> - <h2 style="margin-top: 20px;">Auto-Animate</h2> - </section> - <section data-background-gradient="linear-gradient(to bottom, #283b95, #17b2c3)" id="gradient-bg"> - <h2 data-id="code-title">Code highlights,<br />meet scroll triggers</h2> - <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|4,8-11|17|22-24"><script type="text/template"> - import React, { useState } from 'react'; - - function Example() { - const [count, setCount] = useState(0); - - return ( - <div> - <p>You clicked {count} times</p> - <button onClick={() => setCount(count + 1)}> - Click me - </button> - </div> - ); - } - - function SecondExample() { - const [count, setCount] = useState(0); - - return ( - <div> - <p>You clicked {count} times</p> - <button onClick={() => setCount(count + 1)}> - Click me - </button> - </div> - ); - } - </script></code></pre> - </section> - <section class="stack"> - <section data-background="https://static.slid.es/reveal/image-placeholder.png" id="image-bg"> - <h2>Image Backgrounds</h2> - </section> - <section data-background-video-muted data-background-video="https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.mp4,https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.webm"> - <h2>Video background</h2> - </section> - </section> - <section><h2>The end</h2></section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script src="../plugin/notes/notes.js"></script> - <script src="../plugin/markdown/markdown.js"></script> - <script src="../plugin/highlight/highlight.js"></script> - <script> - Reveal.initialize({ - view: 'scroll', - hash: true, - - plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ] - }); - </script> - - </body> -</html> diff --git a/recitation/debugging/examples/transitions.html b/recitation/debugging/examples/transitions.html deleted file mode 100644 index adbfd15..0000000 --- a/recitation/debugging/examples/transitions.html +++ /dev/null @@ -1,97 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Slide Transitions</title> - - <link rel="stylesheet" href="../dist/reveal.css"> - <link rel="stylesheet" href="../dist/theme/white.css" id="theme"> - <style type="text/css" media="screen"> - .slides section.has-dark-background, - .slides section.has-dark-background h3 { - color: #fff; - } - .slides section.has-light-background, - .slides section.has-light-background h3 { - color: #222; - } - </style> - </head> - - <body> - - <div class="reveal"> - - <div class="slides"> - - <section> - <h3>Default</h3> - </section> - - <section> - <h3>Default</h3> - </section> - - <section data-transition="zoom"> - <h3>data-transition: zoom</h3> - </section> - - <section data-transition="zoom-in fade-out"> - <h3>data-transition: zoom-in fade-out</h3> - </section> - - <section> - <h3>Default</h3> - </section> - - <section data-transition="convex"> - <h3>data-transition: convex</h3> - </section> - - <section data-transition="convex-in concave-out"> - <h3>data-transition: convex-in concave-out</h3> - </section> - - <section> - <section data-transition="zoom"> - <h3>Default</h3> - </section> - <section data-transition="concave"> - <h3>data-transition: concave</h3> - </section> - <section data-transition="convex-in fade-out"> - <h3>data-transition: convex-in fade-out</h3> - </section> - <section> - <h3>Default</h3> - </section> - </section> - - <section data-transition="none"> - <h3>data-transition: none</h3> - </section> - - <section> - <h3>Default</h3> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - Reveal.initialize({ - center: true, - history: true, - - // transition: 'slide', - // transitionSpeed: 'slow', - // backgroundTransition: 'slide' - }); - </script> - - </body> -</html> diff --git a/recitation/debugging/index.html b/recitation/debugging/index.html index 2097df3..585a104 100644 --- a/recitation/debugging/index.html +++ b/recitation/debugging/index.html @@ -4,7 +4,7 @@ <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - <title>reveal.js</title> + <title>Programming recitation</title> <link rel="stylesheet" href="dist/reset.css"> <link rel="stylesheet" href="dist/reveal.css"> @@ -16,25 +16,1029 @@ <body> <div class="reveal"> <div class="slides"> - <section>Slide 1</section> - <section>Slide 2</section> - </div> - </div> - - <script src="dist/reveal.js"></script> - <script src="plugin/notes/notes.js"></script> - <script src="plugin/markdown/markdown.js"></script> - <script src="plugin/highlight/highlight.js"></script> - <script> - // More info about initialization & config: - // - https://revealjs.com/initialization/ - // - https://revealjs.com/config/ - Reveal.initialize({ - hash: true, - - // Learn about plugins: https://revealjs.com/plugins/ - plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ] - }); - </script> - </body> + +<section> + <h1>Microcontroller programming</h1> + <figure><img src="img/mc.png" style="height:150px;"></figure> + <p>2024-02-26</p> + <p>Nicolas <span style="font-variant: small-caps;">De Coster</span> & Henk <span style="font-variant: small-caps;">Buursen</span></p> +</section> + +<section> + <h2>Choose microcontroller</h2> + <section> + <h3>Better "fit for purpose"</h3> + <p>Consider: + <ul> + <li>processing power</li> + <li>memory</li> + <li>I/O capabilities</li> + <li>power consumption</li> + <li>existing libraries / support</li> + </ul> + </p> + </section> + + <section> + <h3>AtTiny (412 / 1614 / 3216 / ...)</h3> + <p>AtTiny microcontrollers are low-cost and low-power devices suitable for simple embedded applications with limited processing and I/O requirements.</p> + <p>Programming : UPDI (older : ISP)</p> + </section> + + <section> + <figure> + <img src="img/8pins.png" style="width : 25%"> + </figure> + <p>AtTiny (412 / 1614 / 3216 / ...)</p> + <ul> + <li>8 bits - 1MHz-20Mhz (→ 32MHz overclock)</li> + <li>Versatile I/O (analog, pwm, i²c, UART, SPI, ...)</li> + <li>Single pin programming (UPDI)</li> + <li>Sandbox board : <a href="http://fabacademy.org/2020/labs/leon/students/adrian-torres/adrianino.html">Adrianino</a></li> + </ul> + <aside class="notes"> + 8bits doesn't mean unable to handle 32bits numbers + </aside> + </section> + + <section> + <h3>SAMD (11C, 11D, 21E, D51)</h3> + <p>SAMD microcontrollers offer a balance of performance and power efficiency, making them suitable for a wide range of applications including IoT devices and wearables.</p> + <p>Programming : SWD / JTAG</p> + <aside class="notes"> + I pre-program bootloaders + </aside> + </section> + + <section> + <figure> + <img src="img/32pins.png" style="width : 25%"> + </figure> + <p>SAMD (11C, 11D, 21E, D51)</p> + <ul> + <li>32 bits - 48MHz - Single ARM Cortex-M0+</li> + <li>Native USB support (+CDC +HID)</li> + <li>Versatile I/O (analog, pwm, i²c, UART, SPI, ...)</li> + <li>Sandbox board : <a href="https://fabacademy.org/2020/labs/leon/students/adrian-torres/samdino.html">Samdino</a> + </ul> + </section> + + <section> + <h3>RP2040</h3> + <p>The RP2040, developed by Raspberry Pi, is a dual-core ARM Cortex-M0+ microcontroller with versatile I/O capabilities (PIO!), making it ideal for projects requiring multitasking and connectivity.</p> + <p>Programming : UF2</p> + </section> + + <section> + <figure> + <img src="img/rp2040.png" style="width : 25%"> + </figure> + <p>RP2040</p> + <ul> + <li>32 bits - 133MHz (→ >250MHz overclocking)</li> + <li>Dual ARM Cortex-M0+</li> + <li>Hardcoded bootloader - XIAO module or RPi Zero</li> + <li>Sandbox board : <a href="https://fabacademy.org/2020/labs/leon/students/adrian-torres/fabxiao.html">FabXIAO</a> + </ul> + </section> + + <section> + <h3>ESP32-C3/S3</h3> + <p>ESP32-C3 and ESP32-S3 are microcontrollers developed by Espressif Systems, known for their built-in Wi-Fi and Bluetooth capabilities. They are commonly used in IoT projects requiring wireless connectivity.</p> + <ul> + <li>RISC-V - 160MHz</li> + <li>Wifi 4 - BlueTooth 5 (LE)</li> + <li>Versatile I/O</li> + <li>Sandbox board : <a href="https://fabacademy.org/2020/labs/leon/students/adrian-torres/fabxiao.html">FabXIAO</a></li> + </ul> + </section> + + <section> + <h3>Others</h3> + <p> + <dl> + <dd><a href="https://www.st.com/en/evaluation-tools/stm32-nucleo-boards.html">STM32</a></dd> + </dt></dt> + <dd><a href="https://www.microchip.com/en-us/products/microcontrollers-and-microprocessors">PIC (Microchip)</a></dd> + <dt></dt> + <dd><a href="https://www.ti.com/microcontrollers-mcus-processors/msp430-microcontrollers/overview.html">MSP/TI</a></dd> + <dt></dt> + <dd>...</dd> + <dt></dt> + </dl> + </p> + </section> + + <section> + <h3>General rule : RTFM / RTFDatasheet</h3> + <p>Always refer to the microcontroller's datasheet and reference manual for detailed specifications and usage instructions. These documents provide essential information for programming and configuring the microcontroller.</p> + </section> + <section> + <figure> + <img src="img/rtfm.png"> + </figure> + </section> +</section> + + + +<section> + <h2>Choose language</h2> + <section> + <figure> + <img src="img/compiling.png" style="width:50%"> + </figure> + <p>Bootcamp instructors 2024 : <a href="https://academany.fabcloud.io/fabacademy/2024/bootcamp-instructors/workshops/programming-languages/" target="programming_lang">different languages tests</a></p> + </section> + <section style="background-image: url('img/matrix.jpg'); background-size:cover;"> + <h3>Assembly / PIO / VHDL / Verilog</h3> + <p>Assembly language provides direct control over the microcontroller's hardware, making it efficient but complex to write. Programmable I/O (PIO) offers a way to offload I/O operations from the CPU, enhancing performance in certain scenarios.</p> + <p>Learn binary/logic basics! (worth it!)</p> + </section> + + <section> + <figure> + <img src="img/cpp.png" style="height:150px;"> + </figure> + <p>C and C++ are widely used for microcontroller programming due to their efficiency and low-level access to hardware. They are compiled languages, meaning the code is translated into machine language before execution.</p> + <p>Note : Arduino is C++ based</p> + </section> + + <section> + <figure> + <img src="img/rust.png" style="height:150px;"> + </figure> + <p>Rust is gaining popularity for microcontroller development due to its strong safety guarantees and modern features. Like C and C++, Rust code is compiled before execution.</p> + <p>E.g.<a href="https://fab.cba.mit.edu/classes/863.23/EECS/people/Yohan/week2/">Minecraft rendering on RP2040</a></p> + </section> + + <section> + <figure> + <a href="https://wiki.seeedstudio.com/XIAO-RP2040-with-MicroPython/"><img src="img/micropython.png" style="height:150px;"></a> + </figure> + <p>MicroPython offers a higher level of abstraction compared to C and assembly, making it easier to write and understand code. It can be either interpreted directly or precompiled into bytecode for execution.</p> + </section> + + <section> + <figure> + <a href="https://kalumajs.org/"><img src="img/js.png" style="height:150px;"></a> + </figure> + <p>JavaScript can be used for microcontroller programming (<a href="https://kalumajs.org/">Kaluma</a> / <a href="https://www.espruino.com/">Esrpuino</a>). It offers a familiar syntax for web developers but typically requires more resources compared to lower-level languages like C.</p> + </section> + + <section> + <h3>Mixed languages</h3> + <p>Mixing languages might give you the best of each world. E.g. : ASM → C → C++</p> + </section> + + <section> + <h4>Mixing microPython and PIO "assembly" on RP2040</h4> + <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|15-19|21-36"><script type="text/template"> +import array, time +import rp2 +import machine +NUM_LEDS = 10 +BLACK = (0, 0, 0) +RED = (255, 0, 0) +YELLOW = (255, 150, 0) +GREEN = (0, 255, 0) +CYAN = (0, 255, 255) +BLUE = (0, 0, 255) +PURPLE = (180, 0, 255) +WHITE = (255, 255, 255) +COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE) +BRIGHTNESS = 0.1 +def setColor(color): + r = int(color[0]*BRIGHTNESS) + g = int(color[1]*BRIGHTNESS) + b = int(color[2]*BRIGHTNESS) + return (g<<16) + (r<<8) + b + +@rp2.asm_pio(set_init=rp2.PIO.OUT_LOW, out_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24) +def ws2812(): + # 1 step = 0.2us (clock frequency must be set to 5MHz) + wrap_target() + # 1 step at 0 (to wait for data in low state, reset code) + out(x, 1) + # start of the cycle + # 2 step at 1 + set(pins, 1) [1] + # 2 step at x + mov(pins, x) [1] + # 1 step at 0 + set(pins, 0) + wrap() +sm = rp2.StateMachine(0, ws2812, freq=5_000_000, set_base=machine.Pin(12), out_base=machine.Pin(12)) +sm.active(1) + +ar = array.array("I", [0 for _ in range(NUM_LEDS)]) + +# Set all leds to green +for i in range(NUM_LEDS): + ar[i] = setColor(GREEN) +sm.put(ar, 8) +time.sleep_ms(50) + +# Rotate one red led +cpt = 1 +while True: + ar[cpt-1] = setColor(GREEN) + ar[cpt] = setColor(RED) + sm.put(ar, 8) + time.sleep_ms(50) + cpt = (cpt+1)%NUM_LEDS + </script></code></pre> + </section> +</section> + +<section> + <h2>Programming</h2> + <section> + <h3>Direct programming :<br> UPDI / ISP / SWD / JTAG</h3> + <p>These are various methods for directly programming microcontrollers. They involve using specialized hardware interfaces to transfer compiled code into the microcontroller's memory.</p> + </section> + + <section> + <figure> + <img src="img/bootloader.png"> + </figure> + <p>Bootloader : small program stored memory that initialize the µC and load/rewrite code from a secondary storage device such as serial port (USB/UART), flash memory or EEPROM.</p> + </section> + + <section> + <h3>Hardcoded bootloader (<a href="https://github.com/microsoft/uf2">UF2</a>)</h3> + <p>Hardcoded bootloaders like UF2 provide a convenient way to load firmware onto a microcontroller without requiring a separate programming tool. They are often used in development boards and single-board computers. (e.g. : XIAO2040)</p> + </section> + + <section> + <h3>One programmer to rule them all</h3> + <a href="https://gitlab.fabcloud.org/pub/programmers/quentorres"><figure> + <img src="img/ring.png" style="height : 150px;"> + <figcaption>Quentorres</figcaption> + </figure></a> + <p>Basic board for using Alex Tardov's <a href="https://github.com/ataradov/free-dap">Free DAP</a></p> + </section> + +</section> + +<section> + <h2>Arduino (C/C++)</h2> + <section> + <h3>Know the differences:</h3> + <p>Understanding the distinction between Arduino as a hardware platform, the Arduino libraries, and the Arduino IDE is essential for effective microcontroller programming with Arduino-compatible boards.</p> + </section> + + <section> + <h3>Arduino Uno = board = hardware</h3> + <p>The Arduino Uno refers to a specific hardware board featuring an Atmel ATmega328P microcontroller. It is (was?) one of the most commonly used Arduino boards for prototyping and educational purposes.</p> + </section> + + <section> + <figure> + <img src="img/arduino_uno.png" style="width:40%"> + <figcaption>Arduino Uno R3 board (quite outdated)</figcaption> + </figure> + </section> + + <section> + <h3>Arduino is a set of libraries</h3> + <p>Arduino provides a rich set of libraries that simplify common tasks such as reading analog inputs, controlling digital outputs, and communicating with peripherals like sensors and displays.</p> + <ul> + <li>Let you write code without knowing all the registers details and in a portable (various chips) way.</li> + <li>Generated code usually (much) less efficient.</li> + </ul> + </section> + + <section data-auto-animate> + <h3 data-id="code-title">"Pure C" VS Arduino</h3> + <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|27-30|44-47"><script type="text/template"> +// +// ring.t412.ino +// +// ATtiny412 ring oscillator test +// +// Neil Gershenfeld 11/13/20 +// +// This work may be reproduced, modified, distributed, +// performed, and displayed for any purpose, but must +// acknowledge this project. Copyright is retained and +// must be preserved. The work is provided as is; no +// warranty is provided, and users accept all liability. +// + +void setup() { + CPU_CCP = CCP_IOREG_gc; // unprotect clock + CLKCTRL.MCLKCTRLB = 0; // turn off prescalar (20 MHz) + PORTA.DIRSET = PIN6_bm; // set output pin + } + +void loop() { + while(1) { + // + // VPORT: 1.808 MHz + // 250 ns high (5 cycles), 300 ns low (6 cycles) + // + if (VPORTA.IN & PIN7_bm) + VPORTA.OUT &= ~PIN6_bm; + else + VPORTA.OUT |= PIN6_bm; + // + // PORT: 1.056 MHz + // + /* + if (PORTA.IN & PIN7_bm) + PORTA.OUTCLR = PIN6_bm; + else + PORTA.OUTSET = PIN6_bm; + */ + // + // digitalRead/Write: 0.331 MHz + // + //* + if (digitalRead(1)) + digitalWrite(0,LOW); + else + digitalWrite(0,HIGH); + */ + // + // digitalReadFast/WriteFast: 1.808 MHz + // + /* + if (digitalReadFast(1)) + digitalWriteFast(0,LOW); + else + digitalWriteFast(0,HIGH); + */ + } + } + </script></code></pre> + </section> + + + <section> + <p> + <ul> + <li><a href="http://drazzy.com/package_drazzy.com_index.json">AtTiny</a> : Spence Konde</li> + <li><a href="https://raw.githubusercontent.com/qbolsee/ArduinoCore-fab-sam/master/json/package_Fab_SAM_index.json">SAMD</a> : MattairTech. Fork Fab maintainted (<a href="https://github.com/qbolsee/ArduinoCore-fab-sam">QB fork</a>)</li> + <li><a href="https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json">Rp2040</a> : Earle F. Philhower porting</li> + <li><a href="https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json">ESP32</a> : Espressif</li> + <li>...</li> + </ul> + → add them to arduino preferences : additional boards manager + </p> + <textarea id="arduinoJsons" rows="4" cols="120"> + http://drazzy.com/package_drazzy.com_index.json + https://raw.githubusercontent.com/qbolsee/ArduinoCore-fab-sam/master/json/package_Fab_SAM_index.json + https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json + https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json + </textarea><br><button onclick="copyToClipboard('arduinoJsons')">Copy them in clipboard!</button> + </section> + + <section> + <h3>Arduino IDE is a development environment</h3> + <p>The Arduino Integrated Development Environment (IDE) is a software tool used for writing, compiling, and uploading code to Arduino boards. It includes features like syntax highlighting, serial monitor, and library management.</p> + </section> + <section> + <p>Be aware : + <ul> + <li>IDE v2 has a better editor BUT has compatibility issues with some libraries (AtTiny port!)</li> + <li>IDE v1.9 and above works fine but less user friendly (use external editor... [preferences > ])</li> + </ul> + </p> + </section> + <section> + <figure> + <img src="img/ide2.png" style="width : 70%"> + <figcaption>Arduino IDE 2</figcaption> + </figure> + </section> +</section> + +<section> + <h2>Good practice</h2> + + <section> + <h3>Document your code</h3> + <p>Every programming language contains special section of "commented" code.</p> + <figure> + <img src="img/commented.png" style="width:70%"> + </figure> + </section> + + <section> + <figure> + <img src="img/comments.jpg" style="width:50%"> + </figure> + </section> + + <section> + <h3>Fit-for-purpose processor</h3> + <p>Selecting a microcontroller with appropriate processing power for your application can help conserve energy and reduce cost. Underclocking, or running the microcontroller at a lower frequency, may be beneficial for power-sensitive projects.</p> + <p>Underclocking may be as usefull as overclocking!</p> + </section> + + <section> + <h3>Write modular and readable</h3> + <p>Breaking down your code into modular components enhances readability and maintainability. Organize your code into separate functions or modules based on their functionality to facilitate debugging and future updates.</p> + <p>Flat files are difficult to modify / maintain.</p> + </section> + + <section data-auto-animate> + <h3 data-id="code-title">Modular writing</h3> + <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|7-8|11-12|15-16|19-20|26-29|33-38"><script type="text/template"> +// Flat File: Single File + +... + +void loop() { + // Turn on the LED + digitalWrite(LED_PIN, HIGH); + delay(200); // Wait for 200ms + + // Turn off the LED + digitalWrite(LED_PIN, LOW); + delay(1000); // Wait for 1 second + + // Turn on the LED + digitalWrite(LED_PIN, HIGH); + delay(400); // Wait for 400ms + + // Turn off the LED + digitalWrite(LED_PIN, LOW); + delay(2000); // Wait for 1 second +} + + +// Modular writing : + +void flipAndWait(uint8_t pin, unsigned long time){ + digitalWrite(pin, !digitalRead(pin)); + delay(time); +} + +void loop() { + // Turn on the LED + digitalWrite(LED_PIN, HIGH); + delay(200); // Wait for 1 second + + flipAndWait(LED_PIN, 1000); + flipAndWait(LED_PIN, 400); + flipAndWait(LED_PIN, 2000); +} + </script></code></pre> + <aside class="notes"> + - don't go too far... (but using inline etc)<br> + - repeated blocs of code => function<br> + - modular devices init, pins config, etc.<br> + </aside> + </section> + + <section> + <h3>Write "parametric"</h3> + <p> + <dl> + <dt>const / #DEFINE</dt><dd>Avoid constants/values directly into your code <br>→ use symbolic names or macros defined with const variables or #define directives.</dd> + <!--<li>Classes</li>--> + </dl> + </p> + <p> This improves code clarity and allows for easier modifications in the future.</p> + </section> + + <section data-auto-animate> + <h3 data-id="code-title">Parametric : Example</h3> + <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|5,11,13|12,14"><script type="text/template"> +// the setup function runs once when you press reset or power the board +void setup() +{ + // initialize digital pin (led connected to pin7) as an output. + pinMode(7, OUTPUT); +} + +// the loop function runs over and over again forever +void loop() +{ + digitalWrite(7, HIGH); // turn the LED on (HIGH is the voltage level) + delay(200); // flash for 200ms + digitalWrite(7, LOW); // turn the LED off by making the voltage LOW + delay(800); // wait for 800ms (total = ~1sec) +} +</script></code></pre> + </section> + + <section data-auto-animate> + <h3 data-id="code-title">Parametric : Example</h3> + <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|1-3|8,14,16|15,17"><script type="text/template"> +#define LED 7 +#define PERIOD 1000 +#define FLASH_TIME 200 +// the setup function runs once when you press reset or power the board +void setup() +{ + // initialize digital pin LED as an output. + pinMode(LED, OUTPUT); +} + +// the loop function runs over and over again forever +void loop() +{ + digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) + delay(FLASH_TIME); // wait for a ON_TIME + digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW + delay(PERIOD-FLASH_TIME); // wait to get a periodic time of ~PERIOD +} +</script></code></pre> + </section> + + <section> + <h3>Use Classes</h3> + <p>Class: + <ul> + <li>Allows you to "think as objects"</li> + <li>Is called "object oriented" (C++ vs C) + <li>Widely used by Arduino hardware specific libraries</li> + </ul> + </p> + </section> + + <section data-auto-animate> + <h3 data-id="code-title">Classes</h3> + <pre data-id="code-animation"><code class="hljs javascript" data-trim data-line-numbers="|13-16|29-33|41,46-47"><script type="text/template"> +// Definition of the LEDControl class +class LEDControl { + private: + int pin; // Class variable to store the pin number + + public: + // Constructor of the class to initialize the pin + LEDControl(int pinNumber) { + pin = pinNumber; + pinMode(pin, OUTPUT); + } + + // Method to turn on the LED + void turnOn() { + digitalWrite(pin, HIGH); + } + + // Method to turn off the LED + void turnOff() { + digitalWrite(pin, LOW); + } + + // Method to toggle the state of the LED + void toggle() { + digitalWrite(pin, !digitalRead(pin)); + } + + // Method to flash the LED for a specified time + void flash(int flashTime) { + turnOn(); // Turn on the LED + delay(flashTime); // Wait for the specified time + turnOff(); // Turn off the LED + } +}; + +// Using the LEDControl class +const int LED_PIN = 13; // LED pin number + +void setup() { + // Create an instance of LEDControl with pin 13 + LEDControl myLED(LED_PIN); +} + +void loop() { + // Turn on the LED for 1 second + myLED.flash(200); + delay(1000); +} + + </script></code></pre> + </section> + <section> + <h3>Optimizations</h3> + <p>Some tips : + <ul> + <li class="fragment fade-in">lookup tables (vs complex maths)</li> + <li class="fragment fade-in">inline</li> + <li class="fragment fade-in">pointers</li> + <li class="fragment fade-in">"simple" arithmetics : 2<sup>n</sup> divisions = >> </li> + <li class="fragment fade-in">Proper type : uint8_t, int16_t, etc. (pecularly on 8bits proc)</li> + <li class="fragment fade-in">...</li> + </ul> + </p> + </section> +</section> +<section> + <h3>Credits</h3> + <ul> + <li>Comics : <a href="https://xkcd.com/">XKCD</a></li> + <li>Beautiful microprocessors B&W : <a href="http://pinouts.org/">pinouts.org</a></li> + <li>Fragments of codes : some AI like chatGPT and Neil</li> + </ul> +</section> + +<section> + <h3>Time for debugging</h3> + <figure> + <a href="debugging.html"><img src="img/fixing_problems.png" style="width:50%"></a> + </figure> +</section> + + + +<!-- Example of nested vertical slides --> +<section> +<section> + + <img style="height: 620px; margin: 0 auto 4rem auto; background: transparent;" data-src="./img/hhg_question.png" alt="Attitude"> + + </a> +<aside class="notes"> +<p>The answer never is: "it doesnt work!" In case of a just +designed and produced circuitboard, break the "problem into pieces".</p> +- is the board powered? +- after producing the pcb you did a visual check. Do it again! +- are the components soldered correctly? +- are the components the right ones? +- are the components placed correctly? +</aside> +</section> +<section> + <p><img style="height: 100%; margin: 0 auto 4rem auto; background: transparent;" data-src="./img/jump.jpg"></p> +<aside class="notes"> +<p>Don't jump to conclusions. It's easy to assume that the +problem is in the most complex part of the system. Or even +worse: blaming the manifacturer of the components for faulty +or misbehaving components. But it's often in the simplest +part of the system. Maybe it's a mistake you made. You actually +designed, milled, stuffed and programmed the circuit. </p> +<p>Time pressure can be a factor in jumping to fast conclusions. + But it's better to stay calm and think of a step by step + approach.</p> +</aside> +</section> + +<section> + <p><img style="height: 300px; margin: 0 auto 4rem auto; background: transparent;" data-src="./img/memory.jpg"></p> +<aside class="notes">Debugging is difficult, and it's easy +to forget what you've done. Writing down what you've done +can help you remember what you've tried and what you haven't +tried. It often also helps you to write down what you think +the problem is. This can help you to think more clearly +about the problem and the solution. + And last but not least: Often you break something while + trying to fix something else. Writing down what you did + can help you to undo what you did. +</aside> + + <h2>Write down what you do</h2> + +</section> +<section> + <img style="background: rgba(255,255,255,0.1);" data-src="./img/ThePragmaticProgrammer.jpeg"> +<p><h5><a href="https://en.wikipedia.org/wiki/The_Pragmatic_Programmer">The Pragmatic Programmer</a></h5></p> + <aside class="notes"> + <p>A good read is "The Pragmatic Programmer", a + collection of tips to improve the development process in + a pragmatic way.</p> +</section> + +<section> +<img style="height: 440px; background: rgba(255,255,255,0.1);" data-src="./img/duck.webp"> + +<h2>Talk to me</h2> + +<aside class="notes"> +In software engineering, rubber duck debugging (or +rubberducking) is a method of debugging code by articulating +a problem in spoken or written natural language. Carry +around a rubber duck and debug what you did by forcing +yourself to explain what you did, step by step, to the duck. +You can also use your instructor, fabacademy +student or friend. Advantage of the duck is that it won't judge you. +</aside> +</section> + +</section> + +<section> +<section> +<img style="margin: 0 auto 4rem auto; background: transparent;" data-src="./img/dontpanic.jpg"> + +<aside class="notes"> +<p>Don't panic. It's easy to get frustrated when you can't +find the problem. But it's important to stay calm. If you +get frustrated, you're more likely to make mistakes. And +mistakes can make the problem worse. </p> +<p>It's also important to remember that debugging is a +normal part of the development process. It's not a sign that +you're a bad engineer. It's a sign that you're a good +engineer. </p> +</aside> + +</section> + +<section> +<video data-autoplay style="height: 800px; margin: 0 auto +4rem auto; background: transparent;" +data-src="./img/Debugging_strategy.mp4" controls></video> +<aside class="notes"> So you are building something together +with a lot of bricks. Narrow down the issue. Fixing a bug +that is not, leads to a new bug, that <B>WAS</B> not a bug. And you +don't want to end up a situation where you trashed the whole +project because you can't localize the "bug" that wasn't a bug from the +beginning. </aside> + + +</section> +<section> + <h2>Narrowing down the problem</h2> +</section> +<section data-auto-animate> +<ul> + <li>Reproduce the problem</li> +</ul> +</section> +<section data-auto-animate> +<ul> + <li>Reproduce the problem</li> + <li>Always first do visual check</li> +</ul> +</section> +<section data-auto-animate> +<ul> + <li>Reproduce the problem</li> + <li>Always first do visual check</li> + <ol>traces</ol> + <ol>soldering</ol> + <ol>components</ol></li> +</ul> +</section> +<section data-auto-animate> +<ul> +<li>Reproduce the problem</li> +<li>Always first do visual check</li> +<ol>traces</ol> +<ol>soldering</ol> +<ol>components</ol></li> +<li>Keep in mind that the problem <br> + might not be visible without a microscope</li> +</ul> +</section> + +<section> +<img src="img/visual.jpg" height="600"> +</section> + +<section> +<div class="r-stack"> +<img class="fragment" src="img/D11Cserial.jpg"> +<img class="fragment" src="img/D11Cserial-1.jpg"> +<img class="fragment" src="img/D11Cserial-2.jpg"> +<img class="fragment" src="img/D11Cserial-3.jpg"> +</div> +<aside class="notes"> + <p>Concentrate only on the relevant parts. Isolate the problem.</p> + <p>The microcontroller is not receiving voltage / the wrong voltage></p> + <p>Can't program the microcontroller</p> + <p>Programmed, unable to program other microcontrollers</p> +</aside> +</section> +</section> +<section> +<section> +<h2>Multimeter</h2> + +<img class="fragment" src="img/multimeter.jpg" height="400px"> + + +<aside class="notes"> +A digital multimeter (DMM) is a hardware tool that can be +used to measure two or more electrical values, usually +voltage (in volts), current (in amps), and resistance (in +ohms). Multimeters are great tools and one of the most fundamental +pieces of test equipment that can be used to debug +electrical problems within an embedded system. </aside> +</section> + +<section> +<h2>Continuity</h2> + +<img class="fragment" src="img/continuity.jpg" height="300px"> +<ul> +<li>Test power supply to power pins continuity</li> +<li>Check fuses, diodes orientations, ...</li> +<li>Check short-circuits</li> +<li>Check traces</li> +</ul> +</section> + +<section> + +<img class="fragment" src="img/parallel.png" height="300px"> +<ul><li>Parallel measurement => check your cables!</li> +<li>! absolute maximum ratings (may burn your component)</li> +<li>Power supply impedence / max power, badly selected</li> +<li>GND/VCC loop</li> +</ul> + +</section> + +<section> +<h2>Continuity</h2> +<video data-autoplay style="height: 620px;" data-src="./img/multimeter.mp4" controls></video> +</section> + +<section> +<h2>Voltage drop</h2> +<video data-autoplay style="height: 620px;" data-src="./img/voltage_drop.mp4" muted controls></video> +</section> +</section> +<section> +<section> +<h2>Logic Analyzer</h2> +<video data-autoplay style="height: 620px;" data-src="./img/logicanalyzer.mp4" muted controls></video> +<aside class="notes"> +A logic analyzer is a hardware tool designed specifically +for capturing, displaying, and measuring electrical signals +in a digital circuit. This tool consists of several digital +inputs pins capable of detecting whether an electric signal +is at a specific logic level (1 or 0). Logic analyzers are +also capable of showing the relationship and timing of +different electrical signals in a digital circuit and often +capable also of analyzing digital communication protocols +UART, I2C, SPI or 1-wire protocol. Logic analyzers can be +used to debug hardware, software, and firmware. </aside> + + +</section> + +<section> +<h2>Logic Analayzer</h2> +<ul> + <li><a href="https://www.amazon.com/KeeYees-Analyzer-Device-Channel-Arduino/dp/B07K6HXDH1">"logic analyzer 8 channel"</li> + <li><a href="https://www.amazon.nl/-/en/dp/B0BGQD8LKB">"logic analyzer 16 channel"</a></li> + <li><a href="https://www.digikey.com/en/products/detail/e-z-hook/XKMRED/528231">"Digikey 461-1010-ND: MICRO-HOOK RED 0.025" SQ PINS"</a></li> + <li><a href="https://www.digikey.com/en/products/detail/e-z-hook/XKMBLK/528230?s">"Digikey 461-1010-ND: MICRO-HOOK BLACK 0.025" SQ PINS"</a></li> +</ul> +</section> + +<section> +<h2>Miniware LA104</h2> +<img class="fragment" src="img/24.jpg" height="400px"> +<p><a href="https://e-design.com.cn/en/Logic-Analyzer-LA104-PG9226719">LA104</a> and <a href="https://github.com/gabonator/LA104">alternative firmware and apps</a></p> + +</section> + +</section> +<section> +<section> + +<h2>Oscilloscope</h2> + +<video data-autoplay style="height: 620px;" data-src="./img/oscilloscope_blink.mp4" muted controls> + + <aside class="notes"> +An oscilloscope is a hardware tool that graphically displays +electrical signals and shows how those signals change over +time. +This video is showing a blinking LED. The oscilloscope is +connected to GND and the LED . The LED is blinking at an +interval of 1 second. The oscilloscope is showing the +voltage over time. </aside> + +</section> +<section> +<video data-autoplay style="height: 620px;" data-src="./img/oscilloscope_button.mp4" muted controls> +</video> +</section> + +</section> +<section> +<section> +<h2>Radio communications</h2> +<div class="r-stack"> +<img class="fragment" src="img/dvb-t.jpg" height="400"> +<img class="fragment" src="img/rtl_sdr.jpg" height="400"> +<img class="fragment" src="img/scope_fft.jpg" height="400"> +</div> +<small><a href="https://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/">RTL-SDR RTL2832U DVB-T Tuner Dongles</a></small> +<aside class="notes"> +<p>RTL-SDR is a very cheap software defined radio that uses +a DVB-T TV tuner dongle based on the RTL2832U chipset. With the right +software the DVB-T TV tuner to be converted into a wideband +software defined radio via a new software driver. </p> +<p>Gnuradio can be used to debug your wireless projects.</p> +</aside> +</section> + +<section> +<video data-autoplay style="height: 620px;" data-src="./img/sdr.mp4" controls></video> +</section> + +</section> + +<section> +<section> +<h2>Flashing your board</h2> +<small>and what can go wrong</small> +<aside class="notes"> + <p>A small chapter to talk about workflow how to actually program your boards</p> + <p>Using XIAO boards life looks easier, but its overkill for many projects. So also + try to use and understand the workflows how to program other MCU's. </p> + </p> +</aside> +</section> + +<section> +<h2>USB</h2> +<video data-autoplay style="height: 620px;" data-src="./img/dmesg.mp4" controls></video> + +</section> + +<section> +<h2>SWD/JTag</h2> +<img class="fragment" src="img/programmer_jtag.jpg" height="400px"> +<aside class="notes"> + <p>Serial Wire Debug and Joint Test Action Group</p> + <p><UL><li>Connect a CMSIS-DAP SWD adapter</li> + <li>10-pin 1.27mm connectors are convenient, but triple check the orientation</li> + <li>If VCC pin is unused, power your target device separately</li> + <li>Make sure the programmer is on 3.3V if programming SAMD</li> + </ul> + </p> +</section> + +<section> +<h2>UPDI</h2> +<p>Unified Program and Debug Interface</p> +<img class="fragment" src="img/hello.serial-UPDI.3.jpg" height="400px"> +<aside class="notes"> +<ul><li>All you need is a serial adapter</li> + <li>RX and TX connected together with a 4.7k resistor or diode + (any res. between 1.5k and 10k will work)</li> + <li>VCC is optional but ensures both chips talk at the same logic level</li> + <li>Programming is initiated with a break (LOW level for a long duration)</li> +</ul> +</section> + +<section> +<h2>Serial (or any) "Hello world!"</h2> +<pre><code data-line-numbers="2|5,6"> +#define DEBUG_MODE 1 + ... +#if DEBUG_MODE + Serial.print("DEBUG -- MyVal value = "); + Serial.println(MyVal, DEC); +#endif +</code> +</pre> +<aside class="notes"> + <p>Serial.print() and Serial.println() are your best friends</p> + <p>Serial.begin() is the first thing you do in setup()</p> + <p>Serial monitor is the first thing you open when debugging</p> +</aside> +</section> + +</section> + +<section> +<section> + +<div class="r-stack"> +<h4>Read The F*cking Manual</h4> + <img class="fragment" src="img/tldr.jpg" width="650" height="400"> + <img class="fragment" src="img/rtfm1.jpg" width="600" height="600"> +<img class="fragment" src="img/solderfrust.png" width="700" height="700"> +<img class="fragment" src="img/dontpanic.jpg" width="600" height="600"> +</div> + +</section> +</section> + +</section> + +<script src="dist/reveal.js"></script> +<script src="plugin/zoom/zoom.js"></script> +<script src="plugin/notes/notes.js"></script> +<script src="plugin/search/search.js"></script> +<script src="plugin/markdown/markdown.js"></script> +<script src="plugin/highlight/highlight.js"></script> +<script> + +// Also available as an ES module, see: +// https://revealjs.com/initialization/ +Reveal.initialize({ +controls: true, +progress: true, +center: true, +hash: true, + +// Learn about plugins: https://revealjs.com/plugins/ +plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ] +}); + +</script> + +</body> </html> diff --git a/recitation/debugging/test/assets/external-script-a.js b/recitation/debugging/test/assets/external-script-a.js deleted file mode 100644 index cbc8da1..0000000 --- a/recitation/debugging/test/assets/external-script-a.js +++ /dev/null @@ -1 +0,0 @@ -window.externalScriptSequence += 'A'; \ No newline at end of file diff --git a/recitation/debugging/test/assets/external-script-b.js b/recitation/debugging/test/assets/external-script-b.js deleted file mode 100644 index e5bca5a..0000000 --- a/recitation/debugging/test/assets/external-script-b.js +++ /dev/null @@ -1 +0,0 @@ -window.externalScriptSequence += 'B'; \ No newline at end of file diff --git a/recitation/debugging/test/assets/external-script-c.js b/recitation/debugging/test/assets/external-script-c.js deleted file mode 100644 index 7d4ccf6..0000000 --- a/recitation/debugging/test/assets/external-script-c.js +++ /dev/null @@ -1 +0,0 @@ -window.externalScriptSequence += 'C'; \ No newline at end of file diff --git a/recitation/debugging/test/assets/external-script-d.js b/recitation/debugging/test/assets/external-script-d.js deleted file mode 100644 index 1c5925b..0000000 --- a/recitation/debugging/test/assets/external-script-d.js +++ /dev/null @@ -1 +0,0 @@ -window.externalScriptSequence += 'D'; \ No newline at end of file diff --git a/recitation/debugging/test/simple.md b/recitation/debugging/test/simple.md deleted file mode 100644 index 97bae7e..0000000 --- a/recitation/debugging/test/simple.md +++ /dev/null @@ -1,12 +0,0 @@ -## Slide 1.1 - -```js -var a = 1; -``` - - -## Slide 1.2 - - - -## Slide 2 \ No newline at end of file diff --git a/recitation/debugging/test/test-auto-animate.html b/recitation/debugging/test/test-auto-animate.html deleted file mode 100644 index a9c71f7..0000000 --- a/recitation/debugging/test/test-auto-animate.html +++ /dev/null @@ -1,167 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Auto-Animate</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"> - - <div class="slides"> - - <section data-auto-animate> - <h1>h1</h1> - <h2>h2</h2> - <h3 style="position: absolute; left: 0;">h3</h3> - </section> - - <section data-auto-animate> - <h1 data-auto-animate-duration="0.1">h1</h1> - <h2 style="opacity: 0;">h2</h2> - <h3 style="position: absolute; left: 100px;">h3</h3> - </section> - - <section data-auto-animate data-auto-animate-duration="0.1"> - <h1>h1</h1> - <h2>h2</h2> - <h3>h3</h3> - </section> - - <section> - <h1>Non-auto-animate slide</h1> - </section> - - <section data-auto-animate> - <h1 class="fragment">h1</h1> - <h2 class="fragment">h2</h2> - <h3>h3</h3> - </section> - - <section data-auto-animate> - <h1 class="fragment">h1</h1> - <h2 class="fragment">h2</h2> - <h3 class="fragment">h3</h3> - </section> - - <section> - <h1>Non-auto-animate slide</h1> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - - QUnit.config.testTimeout = 30000; - QUnit.config.reorder = false; - - const slides = Array.prototype.map.call( document.querySelectorAll( '.slides section' ), slide => { - return { - slide: slide, - h1: slide.querySelector( 'h1' ), - h2: slide.querySelector( 'h2' ), - h3: slide.querySelector( 'h3' ) - }; - } ); - - Reveal.initialize().then( async () => { - - QUnit.module( 'Auto-Animate' ); - - QUnit.test( 'Adds data-auto-animate-target', assert => { - Reveal.slide(1); - assert.strictEqual( slides[0].h1.getAttribute( 'data-auto-animate-target' ), '', 'From elements have blank data-auto-animate-target' ); - assert.ok( slides[1].h1.getAttribute( 'data-auto-animate-target' ).length > 0, 'To elements have a data-auto-animate-target value' ); - }); - - QUnit.test( 'Ends on correct target styles', assert => { - Reveal.slide(1); - assert.strictEqual( slides[1].h2.style.opacity, "0" ); - assert.strictEqual( slides[1].h3.offsetLeft, 100 ); - }); - - QUnit.test( 'Does not add [data-auto-animate] on non auto-animated slides', assert => { - Reveal.slide(2); - Reveal.next(); - assert.ok( slides[3].slide.hasAttribute( 'data-auto-animate' ) === false ) - }); - - QUnit.test( 'autoAnimate config option', assert => { - Reveal.configure({ autoAnimate: false }); - - assert.ok( document.querySelectorAll( 'data-auto-animate-target' ).length === 0, 'Removes all [data-auto-animate-target]' ) - assert.ok( Array.prototype.every.call( document.querySelectorAll( 'section[data-auto-animate]' ), el => { - return el.dataset.autoAnimate === ''; - }, 'All data-auto-animate attributes are reset' ) ); - - Reveal.configure({ autoAnimate: true }); - }); - - QUnit.test( 'Carries forward matching fragment visibility', assert => { - Reveal.slide(4); - assert.ok( !slides[5].h1.classList.contains( 'visible' ) ) - Reveal.next(); - Reveal.next(); - Reveal.next(); - assert.ok( slides[5].h1.classList.contains( 'visible' ) ) - assert.ok( slides[5].h2.classList.contains( 'visible' ) ) - assert.ok( !slides[5].h3.classList.contains( 'visible' ) ) - Reveal.next(); - assert.ok( slides[5].h3.classList.contains( 'visible' ) ) - Reveal.next(); - assert.ok( slides[6].slide === Reveal.getCurrentSlide() ) - }); - - QUnit.test( 'Slide specific data-auto-animate-duration', assert => { - assert.timeout( 400 ); - assert.expect( 1 ); - - return new Promise( resolve => { - let callback = () => { - slides[2].h3.removeEventListener( 'transitionend', callback ); - assert.ok( true, 'Transition ended within time window' ); - resolve(); - } - - Reveal.slide(1); - Reveal.slide(2); - - slides[2].h3.addEventListener( 'transitionend', callback ); - } ); - }); - - // QUnit.test( 'Element specific data-auto-animate-duration', assert => { - // assert.timeout( 400 ); - // assert.expect( 1 ); - - // return new Promise( resolve => { - // let callback = () => { - // slides[1].h1.removeEventListener( 'transitionend', callback ); - // assert.ok( true, 'Transition ended within time window' ); - // resolve() - // } - - - // Reveal.slide(1); - // slides[1].h1.addEventListener( 'transitionend', callback ); - // } ); - // }); - - } ); - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-dependencies-async.html b/recitation/debugging/test/test-dependencies-async.html deleted file mode 100644 index de14042..0000000 --- a/recitation/debugging/test/test-dependencies-async.html +++ /dev/null @@ -1,78 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Async Dependencies</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" style="display: none;"> - - <div class="slides"> - - <section>Slide content</section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - var externalScriptSequence = ''; - var scriptCount = 0; - - QUnit.config.testTimeout = 30000; - QUnit.config.autostart = false; - QUnit.module( 'Async Dependencies' ); - - QUnit.test( 'Async scripts are loaded', function( assert ) { - assert.expect( 5 ); - var done = assert.async( 5 ); - - function callback( event ) { - if( externalScriptSequence.length === 1 ) { - assert.ok( externalScriptSequence === 'A', 'first callback was sync script' ); - done(); - } - else { - assert.ok( true, 'async script loaded' ); - done(); - } - - if( externalScriptSequence.length === 4 ) { - assert.ok( externalScriptSequence.indexOf( 'A' ) !== -1 && - externalScriptSequence.indexOf( 'B' ) !== -1 && - externalScriptSequence.indexOf( 'C' ) !== -1 && - externalScriptSequence.indexOf( 'D' ) !== -1, 'four unique scripts were loaded' ); - done(); - } - - scriptCount ++; - } - - Reveal.initialize({ - dependencies: [ - { src: 'assets/external-script-a.js', async: false, callback: callback }, - { src: 'assets/external-script-b.js', async: true, callback: callback }, - { src: 'assets/external-script-c.js', async: true, callback: callback }, - { src: 'assets/external-script-d.js', async: true, callback: callback } - ] - }); - }); - - QUnit.start(); - - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-dependencies.html b/recitation/debugging/test/test-dependencies.html deleted file mode 100644 index cf3cf0e..0000000 --- a/recitation/debugging/test/test-dependencies.html +++ /dev/null @@ -1,55 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Dependencies</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" style="display: none;"> - - <div class="slides"> - - <section>Slide content</section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - window.externalScriptSequence = ''; - - QUnit.config.testTimeout = 30000; - QUnit.config.autostart = false; - QUnit.module( 'Dependencies' ); - - Reveal.initialize({ - dependencies: [ - { src: 'assets/external-script-a.js' }, - { src: 'assets/external-script-b.js' }, - { src: 'assets/external-script-c.js' } - ] - }).then( () => { - - QUnit.start(); - - QUnit.test( 'Load synchronous scripts', function( assert ) { - assert.strictEqual( window.externalScriptSequence, 'ABC', 'Loaded and executed in order' ); - }); - - } ); - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-grid-navigation.html b/recitation/debugging/test/test-grid-navigation.html deleted file mode 100644 index 837764c..0000000 --- a/recitation/debugging/test/test-grid-navigation.html +++ /dev/null @@ -1,75 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Grid</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" style="display: none;"> - - <div class="slides"> - - <section>0</section> - <section> - <section>1.1</section> - <section>1.2</section> - <section>1.3</section> - <section>1.4</section> - </section> - <section> - <section>2.1</section> - <section>2.2</section> - <section>2.3</section> - <section>2.4</section> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - QUnit.config.testTimeout = 30000; - QUnit.config.autostart = false; - QUnit.module( 'Grid Navigation' ); - - Reveal.initialize().then( () => { - - QUnit.start(); - - QUnit.test( 'Disabled', function( assert ) { - Reveal.right(); - Reveal.down(); - Reveal.down(); - assert.deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined }, 'Correct starting point' ); - Reveal.right(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: undefined }, 'Moves to top when going to adjacent stack' ); - }); - - QUnit.test( 'Enabled', function( assert ) { - Reveal.configure({ navigationMode: 'grid' }); - Reveal.slide( 0, 0 ); - Reveal.right(); - Reveal.down(); - Reveal.down(); - assert.deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined }, 'Correct starting point' ); - Reveal.right(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 2, f: undefined }, 'Remains at same vertical index when going to adjacent stack' ); - }); - - } ); - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-iframe-backgrounds.html b/recitation/debugging/test/test-iframe-backgrounds.html deleted file mode 100644 index 7df99a1..0000000 --- a/recitation/debugging/test/test-iframe-backgrounds.html +++ /dev/null @@ -1,100 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Iframe Backgrounds</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" style="display: none;"> - - <div class="slides"> - - <section data-background-iframe="https://revealjs.com">1</section> - <section data-background-iframe="https://revealjs.com">2</section> - <section data-background-iframe="https://revealjs.com" data-preload>3</section> - <section data-background-iframe="https://revealjs.com">4</section> - <section data-background-iframe="https://revealjs.com">5</section> - <section data-background-iframe="https://revealjs.com">6</section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - - QUnit.config.testTimeout = 30000; - - Reveal.initialize({ viewDistance: 3 }).then( () => { - - function getIframe( index ) { - return document.querySelectorAll( '.slide-background' )[index].querySelector( 'iframe' ); - } - - QUnit.module( 'Iframe' ); - - QUnit.test( 'Using default settings', function( assert ) { - - Reveal.slide(0); - assert.strictEqual( getIframe(1).hasAttribute( 'src' ), false, 'not preloaded when within viewDistance' ); - - Reveal.slide(1); - assert.strictEqual( getIframe(1).hasAttribute( 'src' ), true, 'loaded when slide becomes visible' ); - - Reveal.slide(0); - assert.strictEqual( getIframe(1).hasAttribute( 'src' ), false, 'unloaded when slide becomes invisible' ); - - }); - - QUnit.test( 'Using data-preload', function( assert ) { - - Reveal.slide(1); - assert.strictEqual( getIframe(2).hasAttribute( 'src' ), true, 'preloaded within viewDistance' ); - assert.strictEqual( getIframe(1).hasAttribute( 'src' ), true, 'loaded when slide becomes visible' ); - - Reveal.slide(0); - assert.strictEqual( getIframe(3).hasAttribute( 'src' ), false, 'unloads outside of viewDistance' ); - - }); - - QUnit.test( 'Using preloadIframes: true', function( assert ) { - - Reveal.configure({ preloadIframes: true }); - - Reveal.slide(1); - assert.strictEqual( getIframe(0).hasAttribute( 'src' ), true, 'preloaded within viewDistance' ); - assert.strictEqual( getIframe(1).hasAttribute( 'src' ), true, 'preloaded within viewDistance' ); - assert.strictEqual( getIframe(2).hasAttribute( 'src' ), true, 'preloaded within viewDistance' ); - - }); - - QUnit.test( 'Using preloadIframes: false', function( assert ) { - - Reveal.configure({ preloadIframes: false }); - - Reveal.slide(0); - assert.strictEqual( getIframe(1).hasAttribute( 'src' ), false, 'not preloaded within viewDistance' ); - assert.strictEqual( getIframe(2).hasAttribute( 'src' ), false, 'not preloaded within viewDistance' ); - - Reveal.slide(1); - assert.strictEqual( getIframe(1).hasAttribute( 'src' ), true, 'loaded when slide becomes visible' ); - - - }); - - } ); - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-iframes.html b/recitation/debugging/test/test-iframes.html deleted file mode 100644 index fa4b434..0000000 --- a/recitation/debugging/test/test-iframes.html +++ /dev/null @@ -1,104 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Iframes</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" style="display: none;"> - - <div class="slides"> - - <section>1</section> - <section>2</section> - <section> - <iframe class="default-iframe" data-src="#"></iframe> - <iframe class="preload-iframe" data-src="#" data-preload></iframe> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - - QUnit.config.testTimeout = 30000; - - Reveal.initialize({ viewDistance: 2 }).then( () => { - - var defaultIframe = document.querySelector( '.default-iframe' ), - preloadIframe = document.querySelector( '.preload-iframe' ); - - QUnit.module( 'Iframe' ); - - QUnit.test( 'Using default settings', function( assert ) { - - Reveal.slide(1); - assert.strictEqual( defaultIframe.hasAttribute( 'src' ), false, 'not preloaded when within viewDistance' ); - - Reveal.slide(2); - assert.strictEqual( defaultIframe.hasAttribute( 'src' ), true, 'loaded when slide becomes visible' ); - - Reveal.slide(1); - assert.strictEqual( defaultIframe.hasAttribute( 'src' ), false, 'unloaded when slide becomes invisible' ); - - }); - - QUnit.test( 'Using data-preload', function( assert ) { - - Reveal.slide(1); - assert.strictEqual( preloadIframe.hasAttribute( 'src' ), true, 'preloaded within viewDistance' ); - - Reveal.slide(2); - assert.strictEqual( preloadIframe.hasAttribute( 'src' ), true, 'loaded when slide becoems visible' ); - - Reveal.slide(0); - assert.strictEqual( preloadIframe.hasAttribute( 'src' ), false, 'unloads outside of viewDistance' ); - - }); - - QUnit.test( 'Using preloadIframes: true', function( assert ) { - - Reveal.configure({ preloadIframes: true }); - - Reveal.slide(1); - assert.strictEqual( defaultIframe.hasAttribute( 'src' ), true, 'preloaded within viewDistance' ); - assert.strictEqual( preloadIframe.hasAttribute( 'src' ), true, 'preloaded within viewDistance' ); - - Reveal.slide(2); - assert.strictEqual( defaultIframe.hasAttribute( 'src' ), true, 'loaded when slide becomes visible' ); - assert.strictEqual( preloadIframe.hasAttribute( 'src' ), true, 'loaded when slide becomes visible' ); - - }); - - QUnit.test( 'Using preloadIframes: false', function( assert ) { - - Reveal.configure({ preloadIframes: false }); - - Reveal.slide(0); - assert.strictEqual( defaultIframe.hasAttribute( 'src' ), false, 'not preloaded within viewDistance' ); - assert.strictEqual( preloadIframe.hasAttribute( 'src' ), false, 'not preloaded within viewDistance' ); - - Reveal.slide(2); - assert.strictEqual( defaultIframe.hasAttribute( 'src' ), true, 'loaded when slide becomes visible' ); - assert.strictEqual( preloadIframe.hasAttribute( 'src' ), true, 'loaded when slide becomes visible' ); - - }); - - } ); - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-markdown.html b/recitation/debugging/test/test-markdown.html deleted file mode 100644 index e877284..0000000 --- a/recitation/debugging/test/test-markdown.html +++ /dev/null @@ -1,516 +0,0 @@ -<!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-offset"> - <script type="text/template"> - ```[123:] - 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-line-highlights-offset-and-lanugage"> - <script type="text/template"> - ```javascript [456: 3,4,5] - code - ``` - </script> - </section> - <section data-markdown class="with-line-offset-and-lanugage"> - <script type="text/template"> - ```javascript [756:] - 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( '```[234: ] line offset only', function( assert ) { - assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-offset .hljs[data-ln-start-from="123"]' ).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( '```javascript [123: 3,4,5] add line offset and enables line highlights and sets language', function( assert ) { - assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-highlights-offset-and-lanugage .hljs.javascript[data-line-numbers="3,4,5"]' ).length, 1 ); - assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-highlights-offset-and-lanugage .hljs.javascript[data-ln-start-from="456"]' ).length, 1 ); - }); - - QUnit.test( '```javascript [756:] add line offset and sets no line highlights and sets language', function( assert ) { - assert.strictEqual( deck6.getRevealElement().querySelectorAll( '.with-line-offset-and-lanugage .hljs.javascript[data-ln-start-from="756"]' ).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> diff --git a/recitation/debugging/test/test-multiple-instances-es5.html b/recitation/debugging/test/test-multiple-instances-es5.html deleted file mode 100644 index c8bb189..0000000 --- a/recitation/debugging/test/test-multiple-instances-es5.html +++ /dev/null @@ -1,86 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Iframes</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="deck1"> - <div class="reveal" style="display: none;"> - <div class="slides"> - <section>1.1</section> - <section>1.2</section> - <section>1.3</section> - </div> - </div> - </div> - - <div class="deck2"> - <div class="reveal" style="display: none;"> - <div class="slides"> - <section>2.1</section> - <section>2.2</section> - <section>2.3</section> - </div> - </div> - </div> - - <script src="../dist/reveal.js"></script> - <script src="../plugin/zoom/zoom.js"></script> - <script> - - QUnit.config.testTimeout = 30000; - QUnit.module( 'Multiple reveal.js instances' ); - - let r1 = new Reveal( document.querySelector( '.deck1 .reveal' ), { - embedded: true, - keyboard: true, - plugins: [RevealZoom()] - } ); - r1.initialize(); - - let r2 = new Reveal( document.querySelector( '.deck2 .reveal' ), { - embedded: true, - keyboard: false - } ); - r2.initialize(); - - QUnit.test( 'Can make independent changes', function( assert ) { - - r1.slide(1); - r2.slide(2); - assert.strictEqual( r1.getCurrentSlide().textContent, '1.2' ); - assert.strictEqual( r2.getCurrentSlide().textContent, '2.3' ); - - r2.toggleOverview( true ); - assert.strictEqual( r1.isOverview(), false ); - assert.strictEqual( r2.isOverview(), true ); - r2.toggleOverview( false ); - - assert.strictEqual( r1.getConfig().keyboard, true ); - assert.strictEqual( r2.getConfig().keyboard, false ); - - }); - - QUnit.test( 'Can register plugins independently', function( assert ) { - - assert.ok( r1.hasPlugin( 'zoom' ) ); - assert.notOk( r2.hasPlugin( 'zoom' ) ); - - }); - - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-multiple-instances.html b/recitation/debugging/test/test-multiple-instances.html deleted file mode 100644 index 4f16d7e..0000000 --- a/recitation/debugging/test/test-multiple-instances.html +++ /dev/null @@ -1,104 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Iframes</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="deck1"> - <div class="reveal" style="display: none;"> - <div class="slides"> - <section>1.1</section> - <section data-state="deck1slide2">1.2</section> - <section>1.3</section> - </div> - </div> - </div> - - <div class="deck2"> - <div class="reveal" style="display: none;"> - <div class="slides"> - <section>2.1</section> - <section>2.2</section> - <section>2.3</section> - </div> - </div> - </div> - - <script type="module"> - - import Reveal from '../dist/reveal.esm.js'; - import Zoom from '../plugin/zoom/zoom.esm.js'; - - QUnit.config.testTimeout = 30000; - QUnit.module( 'Multiple reveal.js instances' ); - - let r1 = new Reveal( document.querySelector( '.deck1 .reveal' ), { - embedded: true, - keyboard: true, - plugins: [ Zoom ] - } ); - r1.initialize(); - - let r2 = new Reveal( document.querySelector( '.deck2 .reveal' ), { - embedded: true, - keyboard: false - } ); - r2.initialize(); - - QUnit.test( 'Can make independent changes', function( assert ) { - - r1.slide(1); - r2.slide(2); - assert.strictEqual( r1.getCurrentSlide().textContent, '1.2' ); - assert.strictEqual( r2.getCurrentSlide().textContent, '2.3' ); - - r2.toggleOverview( true ); - assert.strictEqual( r1.isOverview(), false ); - assert.strictEqual( r2.isOverview(), true ); - r2.toggleOverview( false ); - - assert.strictEqual( r1.getConfig().keyboard, true ); - assert.strictEqual( r2.getConfig().keyboard, false ); - - }); - - QUnit.test( 'Can register plugins independently', function( assert ) { - - assert.ok( r1.hasPlugin( 'zoom' ) ); - assert.notOk( r2.hasPlugin( 'zoom' ) ); - - }); - - QUnit.test( 'Slide state is set at the viewport level', function( assert ) { - - r1.slide(1); - - assert.ok( r1.getViewportElement().classList.contains( r1.getCurrentSlide().getAttribute( 'data-state' ) ) ); - - r1.slide(2); - - assert.ok( !r1.getViewportElement().classList.contains( r1.getCurrentSlide().getAttribute( 'data-state' ) ), 'unset' ); - - }); - - </script> - <script> - QUnit.test( 'Reveal does not leak to window', function( assert ) { - assert.strictEqual( window.Reveal, undefined ); - }); - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-pdf.html b/recitation/debugging/test/test-pdf.html deleted file mode 100644 index 8fa102a..0000000 --- a/recitation/debugging/test/test-pdf.html +++ /dev/null @@ -1,97 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test PDF exports</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" style="display: none;"> - - <div class="slides"> - - <section> - <h1>1</h1> - <img data-src=""> - </section> - - <section> - <section> - <h1>2.1</h1> - </section> - <section> - <h1>2.2</h1> - </section> - <section> - <h1>2.3</h1> - </section> - </section> - - <section id="fragment-slides"> - <section> - <h1>3.1</h1> - <ul> - <li class="fragment">4.1</li> - <li class="fragment">4.2</li> - <li class="fragment">4.3</li> - </ul> - </section> - - <section> - <h1>3.2</h1> - <ul> - <li class="fragment" data-fragment-index="0">4.1</li> - <li class="fragment" data-fragment-index="0">4.2</li> - </ul> - </section> - - <section> - <h1>3.3</h1> - <ul> - <li class="fragment" data-fragment-index="1">3.3.1</li> - <li class="fragment" data-fragment-index="4">3.3.2</li> - <li class="fragment" data-fragment-index="4">3.3.3</li> - </ul> - </section> - </section> - - <section> - <h1>4</h1> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - QUnit.config.testTimeout = 30000; - QUnit.config.autostart = false; - - Reveal.initialize({ pdf: true }).then( function() { - - QUnit.start(); - - // Only one test for now, we're mainly ensuring that there - // are no execution errors when running PDF mode - - QUnit.test( 'Reveal.isReady', function( assert ) { - assert.strictEqual( Reveal.isReady(), true, 'returns true' ); - }); - - } ); - - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-plugins.html b/recitation/debugging/test/test-plugins.html deleted file mode 100644 index f9cd5b1..0000000 --- a/recitation/debugging/test/test-plugins.html +++ /dev/null @@ -1,108 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Plugins</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" style="display: none;"> - - <div class="slides"> - - <section>Slide content</section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - - QUnit.config.testTimeout = 30000; - QUnit.module( 'Plugins' ); - - var initCounter = { PluginB: 0, PluginC: 0, PluginD: 0 }; - - // Plugin with no init method - var PluginA = { id: 'PluginA' }; - - // Plugin with init method - var PluginB = { id: 'PluginB', init: function() { - initCounter['PluginB'] += 1; - } }; - - // Async plugin with init method - var PluginC = { id: 'PluginC', init: function() { - return new Promise(function( resolve ) { - setTimeout( () => { - initCounter['PluginC'] += 1; - resolve(); - }, 1000 ); - }); - } }; - - // Plugin initialized after reveal.js is ready - var PluginD = { id: 'PluginD', init: function() { - initCounter['PluginD'] += 1; - } }; - - var PluginE = { id: 'PluginE' }; - - var reveal = new Reveal( document.querySelector( '.reveal' ), { - plugins: [ PluginA ] - } ); - - reveal.registerPlugin( PluginB ); - reveal.registerPlugin( PluginC ); - - reveal.initialize(); - - QUnit.test( 'Can initialize synchronously', function( assert ) { - assert.strictEqual( initCounter['PluginB'], 1 ); - - reveal.registerPlugin( PluginB ); - - assert.strictEqual( initCounter['PluginB'], 1, 'prevents duplicate registration' ); - }); - - QUnit.test( 'Can initialize asynchronously', function( assert ) { - assert.expect( 3 ); - var done = assert.async( 2 ); - - assert.strictEqual( initCounter['PluginC'], 0, 'async plugin not immediately initialized' ); - - reveal.on( 'ready', function() { - assert.strictEqual( initCounter['PluginC'], 1, 'finsihed initializing when reveal.js dispatches "ready"' ); - done(); - - reveal.registerPlugin( PluginD ); - assert.strictEqual( initCounter['PluginD'], 1, 'plugin registered after reveal.js is ready still initiailizes' ); - done(); - }); - } ); - - QUnit.test( 'Can check if plugin is registered', function( assert ) { - assert.strictEqual( reveal.hasPlugin( 'PluginA' ), true ); - assert.strictEqual( reveal.hasPlugin( 'PluginE' ), false ); - reveal.registerPlugin( PluginE ); - assert.strictEqual( reveal.hasPlugin( 'PluginE' ), true ); - } ); - - QUnit.test( 'Can retrieve plugin instance', function( assert ) { - assert.strictEqual( reveal.getPlugin( 'PluginB' ), PluginB ); - } ); - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-scroll.html b/recitation/debugging/test/test-scroll.html deleted file mode 100644 index 786298b..0000000 --- a/recitation/debugging/test/test-scroll.html +++ /dev/null @@ -1,115 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test Scroll View</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" style="opacity: 0; pointer-events: none;"> - - <div class="slides"> - - <section> - <h1>slide 1</h1> - </section> - - <section> - <h1>slide 2</h1> - </section> - - <section> - <h1>slide 3</h1> - <p class="fragment">fragment 1</p> - <p class="fragment">fragment 2</p> - <p class="fragment">fragment 3</p> - </section> - - <section> - <h1>slide 4</h1> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - - QUnit.config.testTimeout = 30000; - QUnit.config.reorder = false; - - function getScrollHeight() { - return Reveal.getViewportElement().scrollHeight; - } - - function getViewportHeight() { - return Reveal.getViewportElement().offsetHeight; - } - - Reveal.initialize({ view: 'scroll' }).then( async () => { - - QUnit.module( 'Scroll View' ); - - QUnit.test( 'Activates', assert => { - assert.ok( getScrollHeight() > getViewportHeight(), 'Is overflowing' ); - }); - - QUnit.test( 'Can be toggled via API', assert => { - Reveal.toggleScrollView( false ); - assert.ok( getScrollHeight() <= getViewportHeight(), 'Is not overflowing' ); - Reveal.toggleScrollView( true ); - assert.ok( getScrollHeight() > getViewportHeight(), 'Is overflowing' ); - }); - - QUnit.test( 'Changes present slide when scrolling', assert => { - assert.timeout( 200 ); - assert.expect( 2 ); - - const slides = document.querySelectorAll( '.reveal .slides section' ); - - assert.ok( slides[0].classList.contains( 'present' ), 'First slide is present' ); - Reveal.getViewportElement().scrollTop = getViewportHeight() * 1; - - return new Promise( resolve => { - setTimeout(() => { - assert.ok( slides[1].classList.contains( 'present' ), 'Second slide is present' ); - resolve(); - }, 100); - } ); - }); - - QUnit.test( 'Fires slideschanged event when scrolling', assert => { - assert.timeout( 200 ); - assert.expect( 2 ); - - const slides = document.querySelectorAll( '.reveal .slides section' ); - - return new Promise( resolve => { - let callback = ( event ) => { - Reveal.off( 'slidechanged', callback ); - assert.ok( true, 'slidechanged event fired' ); - assert.ok( event.currentSlide.classList.contains( 'present' ), 'slidechanged provides reference to currentSlide' ); - resolve(); - } - - Reveal.on( 'slidechanged', callback ); - Reveal.getViewportElement().scrollTop = getViewportHeight() * 2; - }); - }); - - } ); - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test-state.html b/recitation/debugging/test/test-state.html deleted file mode 100644 index c2d5055..0000000 --- a/recitation/debugging/test/test-state.html +++ /dev/null @@ -1,134 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Test State</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" style="display: none;"> - - <div class="slides"> - - <section>No state</section> - <section id="slide2" data-state="state1">State 1</section> - <section data-state="state1">State 1</section> - <section data-state="state2">State 2</section> - <section> - <section>No state</section> - <section data-state="state1">State 1</section> - <section data-state="state3">State 3</section> - <section>No state</section> - </section> - <section>No state</section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - - Reveal.initialize(); - - QUnit.module( 'State' ); - - QUnit.test( 'Fire events when changing slide', function( assert ) { - assert.expect( 2 ); - var state1 = assert.async(); - var state2 = assert.async(); - - var _onState1 = function( event ) { - assert.ok( true, 'state1 fired' ); - state1(); - } - - var _onState2 = function( event ) { - assert.ok( true, 'state2 fired' ); - state2(); - } - - Reveal.on( 'state1', _onState1 ); - Reveal.on( 'state2', _onState2 ); - - Reveal.slide( 1 ); - Reveal.slide( 3 ); - - Reveal.off( 'state1', _onState1 ); - Reveal.off( 'state2', _onState2 ); - }); - - QUnit.test( 'Fire state events for vertical slides', function( assert ) { - assert.expect( 2 ); - var done = assert.async( 2 ); - - var _onState1 = function( event ) { - assert.ok( true, 'state1 fired' ); - done(); - } - - var _onState3 = function( event ) { - assert.ok( true, 'state3 fired' ); - done(); - } - - Reveal.on( 'state1', _onState1 ); - Reveal.on( 'state3', _onState3 ); - - Reveal.slide( 0 ); - Reveal.slide( 4, 1 ); - Reveal.slide( 4, 2 ); - - Reveal.off( 'state1', _onState1 ); - Reveal.off( 'state3', _onState3 ); - }); - - QUnit.test( 'No events if state remains unchanged', function( assert ) { - var stateChanges = 0; - - var _onEvent = function( event ) { - stateChanges += 1; - } - - Reveal.on( 'state1', _onEvent ); - - Reveal.slide( 0 ); // no state - Reveal.slide( 1 ); // state1 - Reveal.slide( 2 ); // state1 - Reveal.prev(); // state1 - Reveal.next(); // state1 - Reveal.slide( 4, 1 ); // state1 - Reveal.slide( 0 ); // no state - - Reveal.off( 'state1', _onEvent ); - - assert.strictEqual( stateChanges, 1, 'no event was fired when going to slide with same state' ); - }); - - QUnit.test( 'Event order', function( assert ) { - var _onEvent = function( event ) { - assert.ok( Reveal.getCurrentSlide() == document.querySelector( '#slide2' ), 'correct current slide immediately after state event' ); - } - - Reveal.on( 'state1', _onEvent ); - - Reveal.slide( 0 ); - Reveal.slide( 1 ); - - Reveal.off( 'state1', _onEvent ); - }); - - </script> - - </body> -</html> diff --git a/recitation/debugging/test/test.html b/recitation/debugging/test/test.html deleted file mode 100644 index ab44922..0000000 --- a/recitation/debugging/test/test.html +++ /dev/null @@ -1,900 +0,0 @@ -<!doctype html> -<html lang="en"> - - <head> - <meta charset="utf-8"> - - <title>reveal.js - Tests</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" style="visibility: hidden;"> - - <div class="slides"> - - <section data-visibility="hidden"> - This should be remove by reveal.js before our tests run. - </section> - - <section data-background-image="examples/assets/image1.png"> - <h1>1</h1> - <img data-src=""> - <video data-src=""></video> - <audio data-src=""></audio> - <aside class="notes">speaker notes 1</aside> - </section> - - <section> - <section data-background="examples/assets/image2.png" data-notes="speaker notes 2"> - <h1>2.1</h1> - </section> - <section data-background-image="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApkZXNjAAAA/"> - <h1>2.2</h1> - </section> - <section> - <h1>2.3</h1> - </section> - </section> - - <section id="fragment-slides"> - <section> - <h1>3.1</h1> - <ul> - <li class="fragment">4.1</li> - <li class="fragment">4.2</li> - <li class="fragment">4.3</li> - </ul> - </section> - - <section> - <h1>3.2</h1> - <ul> - <li class="fragment" data-fragment-index="0">4.1</li> - <li class="fragment" data-fragment-index="0">4.2</li> - </ul> - <iframe data-src="http://example.com"></iframe> - </section> - - <section id="fragments3"> - <h1>3.3</h1> - <ul> - <li class="fragment" data-fragment-index="1">3.3.1</li> - <li class="fragment" data-fragment-index="4">3.3.2</li> - <li class="fragment" data-fragment-index="4">3.3.3</li> - </ul> - </section> - </section> - - <section> - <h1>4</h1> - </section> - - </div> - - </div> - - <script src="../dist/reveal.js"></script> - <script> - QUnit.config.testTimeout = 30000; - - window.location.hash = ''; - - Reveal.configure({maxScale: 1.11}); - - // These tests expect the DOM to contain a presentation - // with the following slide structure: - // - // 1 - // 2 - Three sub-slides - // 3 - Three fragment elements - // 3 - Two fragments with same data-fragment-index - // 4 - Reveal.initialize().then( function() { - - // Helper methods - function triggerKeyboardEvent(config) { - document.dispatchEvent( new KeyboardEvent( 'keydown', config ) ); - } - - // --------------------------------------------------------------- - // DOM TESTS - - QUnit.module( 'DOM' ); - - QUnit.test( 'Initial slides classes', function( assert ) { - var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' ) - - assert.strictEqual( document.querySelectorAll( '.reveal .slides section[data-visibility="hidden"]' ).length, 0, 'no data-visibility="hidden" slides' ); - assert.strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' ); - assert.strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' ); - assert.strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' ); - - assert.strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' ); - - assert.ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' ); - }); - - // --------------------------------------------------------------- - // API TESTS - - QUnit.module( 'API' ); - - QUnit.test( 'Reveal.configure before initialization', function( assert ) { - assert.strictEqual( Reveal.getConfig().maxScale, 1.11 ); - }); - - QUnit.test( 'Reveal.isReady', function( assert ) { - assert.strictEqual( Reveal.isReady(), true, 'returns true' ); - }); - - QUnit.test( 'Reveal.isOverview', function( assert ) { - assert.strictEqual( Reveal.isOverview(), false, 'false by default' ); - - Reveal.toggleOverview(); - assert.strictEqual( Reveal.isOverview(), true, 'true after toggling on' ); - - Reveal.toggleOverview(); - assert.strictEqual( Reveal.isOverview(), false, 'false after toggling off' ); - }); - - QUnit.test( 'Reveal.isPaused', function( assert ) { - assert.strictEqual( Reveal.isPaused(), false, 'false by default' ); - - Reveal.togglePause(); - assert.strictEqual( Reveal.isPaused(), true, 'true after pausing' ); - - Reveal.togglePause(); - assert.strictEqual( Reveal.isPaused(), false, 'false after resuming' ); - }); - - QUnit.test( 'Reveal.isFirstSlide', function( assert ) { - Reveal.slide( 0, 0 ); - assert.strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); - - Reveal.slide( 1, 0 ); - assert.strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' ); - - Reveal.slide( 0, 0 ); - assert.strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); - }); - - QUnit.test( 'Reveal.isFirstSlide after vertical slide', function( assert ) { - Reveal.slide( 1, 1 ); - Reveal.slide( 0, 0 ); - assert.strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( 0, 0 )' ); - }); - - QUnit.test( 'Reveal.isLastSlide', function( assert ) { - Reveal.slide( 0, 0 ); - assert.strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); - - var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; - - Reveal.slide( lastSlideIndex, 0 ); - assert.strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( '+ lastSlideIndex +', 0 )' ); - - Reveal.slide( 0, 0 ); - assert.strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); - }); - - QUnit.test( 'Reveal.isLastSlide after vertical slide', function( assert ) { - var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; - - Reveal.slide( 1, 1 ); - Reveal.slide( lastSlideIndex ); - assert.strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( '+ lastSlideIndex +', 0 )' ); - }); - - QUnit.test( 'Reveal.getTotalSlides', function( assert ) { - assert.strictEqual( Reveal.getTotalSlides(), 8, 'eight slides in total' ); - }); - - QUnit.test( 'Reveal.getIndices', function( assert ) { - var indices = Reveal.getIndices(); - - assert.ok( indices.hasOwnProperty( 'h' ), 'h exists' ); - assert.ok( indices.hasOwnProperty( 'v' ), 'v exists' ); - assert.ok( indices.hasOwnProperty( 'f' ), 'f exists' ); - - Reveal.slide( 1, 0 ); - assert.strictEqual( Reveal.getIndices().h, 1, 'h 1' ); - assert.strictEqual( Reveal.getIndices().v, 0, 'v 0' ); - - Reveal.slide( 1, 2 ); - assert.strictEqual( Reveal.getIndices().h, 1, 'h 1' ); - assert.strictEqual( Reveal.getIndices().v, 2, 'v 2' ); - - Reveal.slide( 0, 0 ); - assert.strictEqual( Reveal.getIndices().h, 0, 'h 0' ); - assert.strictEqual( Reveal.getIndices().v, 0, 'v 0' ); - }); - - QUnit.test( 'Reveal.getSlide', function( assert ) { - assert.equal( Reveal.getSlide( 0 ), document.querySelector( '.reveal .slides>section:first-child' ), 'gets correct first slide' ); - assert.equal( Reveal.getSlide( 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)' ), 'no v index returns stack' ); - assert.equal( Reveal.getSlide( 1, 0 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(1)' ), 'v index 0 returns first vertical child' ); - assert.equal( Reveal.getSlide( 1, 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(2)' ), 'v index 1 returns second vertical child' ); - - assert.strictEqual( Reveal.getSlide( 100 ), undefined, 'undefined when out of horizontal bounds' ); - assert.strictEqual( Reveal.getSlide( 1, 100 ), undefined, 'undefined when out of vertical bounds' ); - }); - - QUnit.test( 'Reveal.getSlideBackground', function( assert ) { - assert.equal( Reveal.getSlideBackground( 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:first-child' ), 'gets correct first background' ); - assert.equal( Reveal.getSlideBackground( 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2)' ), 'no v index returns stack' ); - assert.equal( Reveal.getSlideBackground( 1, 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(2)' ), 'v index 0 returns first vertical child' ); - assert.equal( Reveal.getSlideBackground( 1, 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(3)' ), 'v index 1 returns second vertical child' ); - - assert.strictEqual( Reveal.getSlideBackground( 100 ), undefined, 'undefined when out of horizontal bounds' ); - assert.strictEqual( Reveal.getSlideBackground( 1, 100 ), undefined, 'undefined when out of vertical bounds' ); - }); - - QUnit.test( 'Reveal.getSlideNotes', function( assert ) { - Reveal.slide( 0, 0 ); - assert.ok( Reveal.getSlideNotes() === 'speaker notes 1', 'works with <aside class="notes">' ); - - Reveal.slide( 1, 0 ); - assert.ok( Reveal.getSlideNotes() === 'speaker notes 2', 'works with <section data-notes="">' ); - }); - - QUnit.test( 'Reveal.getPreviousSlide/getCurrentSlide', function( assert ) { - Reveal.slide( 0, 0 ); - Reveal.slide( 1, 0 ); - - var firstSlide = document.querySelector( '.reveal .slides>section:first-child' ); - var secondSlide = document.querySelector( '.reveal .slides>section:nth-child(2)>section' ); - - assert.equal( Reveal.getPreviousSlide(), firstSlide, 'previous is slide #0' ); - assert.equal( Reveal.getCurrentSlide(), secondSlide, 'current is slide #1' ); - }); - - QUnit.test( 'Reveal.getProgress', function( assert ) { - Reveal.slide( 0, 0 ); - assert.strictEqual( Reveal.getProgress(), 0, 'progress is 0 on first slide' ); - - var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; - - Reveal.slide( lastSlideIndex, 0 ); - assert.strictEqual( Reveal.getProgress(), 1, 'progress is 1 on last slide' ); - }); - - QUnit.test( 'Reveal.getScale', function( assert ) { - assert.ok( typeof Reveal.getScale() === 'number', 'has scale' ); - }); - - QUnit.test( 'Reveal.getConfig', function( assert ) { - assert.ok( typeof Reveal.getConfig() === 'object', 'has config' ); - }); - - QUnit.test( 'Reveal.configure', function( assert ) { - assert.strictEqual( Reveal.getConfig().loop, false, '"loop" is false to start with' ); - - Reveal.configure({ loop: true }); - assert.strictEqual( Reveal.getConfig().loop, true, '"loop" has changed to true' ); - - Reveal.configure({ loop: false, customTestValue: 1 }); - assert.strictEqual( Reveal.getConfig().customTestValue, 1, 'supports custom values' ); - }); - - QUnit.test( 'Reveal.availableRoutes', function( assert ) { - Reveal.slide( 0, 0 ); - assert.deepEqual( Reveal.availableRoutes(), { left: false, up: false, down: false, right: true }, 'correct for first slide' ); - - Reveal.slide( 1, 0 ); - assert.deepEqual( Reveal.availableRoutes(), { left: true, up: false, down: true, right: true }, 'correct for vertical slide' ); - - Reveal.slide( 0, 0 ); - assert.deepEqual( Reveal.availableRoutes({ includeFragments: true }), { left: false, up: false, down: false, right: true }, 'correct with fragments included' ); - }); - - QUnit.test( 'Reveal.next', function( assert ) { - Reveal.slide( 0, 0 ); - - // Step through vertical child slides - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 1, v: 0, f: undefined } ); - - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 1, v: 1, f: undefined } ); - - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined } ); - - // Step through fragments - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 } ); - - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 } ); - - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 } ); - - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 } ); - }); - - QUnit.test( 'Reveal.next at end', function( assert ) { - Reveal.slide( 3 ); - - // We're at the end, this should have no effect - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } ); - - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } ); - }); - - - // --------------------------------------------------------------- - // URL TESTS - - QUnit.module( 'URL' ); - - QUnit.test( 'Write (fragmentInURL: false)', function( assert ) { - Reveal.configure({ hash: true, fragmentInURL: false }); - - Reveal.slide( 2, 0 ); - assert.strictEqual( Reveal.getSlidePath(), '/2' ); - - Reveal.slide( 2, 1 ); - assert.strictEqual( Reveal.getSlidePath(), '/2/1' ); - - Reveal.slide( 2, 0, 1 ); - assert.strictEqual( Reveal.getSlidePath(), '/2' ); - - Reveal.slide( 2, 2, 0 ); - assert.strictEqual( Reveal.getSlidePath(), '/fragments3' ); - - Reveal.slide( 2, 2, 1 ); - assert.strictEqual( Reveal.getSlidePath(), '/fragments3' ); - }); - - QUnit.test( 'Write (fragmentInURL: true)', function( assert ) { - Reveal.configure({ hash: true, fragmentInURL: true }); - - Reveal.slide( 2, 0, -1 ); - assert.strictEqual( Reveal.getSlidePath(), '/2' ); - - Reveal.slide( 2, 1, -1 ); - assert.strictEqual( Reveal.getSlidePath(), '/2/1' ); - - Reveal.slide( 2, 0, 1 ); - assert.strictEqual( Reveal.getSlidePath(), '/2/0/1' ); - - Reveal.slide( 2, 2, -1 ); - assert.strictEqual( Reveal.getSlidePath(), '/fragments3' ); - - Reveal.slide( 2, 2, 1 ); - assert.strictEqual( Reveal.getSlidePath(), '/fragments3/1' ); - }); - - QUnit.test( 'Read', async function( assert ) { - Reveal.configure({ hash: true, fragmentInURL: true }); - - let test = function( hash, indices ) { - return new Promise( resolve => { - window.onhashchange = () => { - assert.deepEqual( Reveal.getIndices(), indices ); - resolve(); - }; - window.location.hash = hash; - } ); - } - - await test( '#/0', { h: 0, v: 0, f: undefined } ); // horizontal - await test( '#/1/1', { h: 1, v: 1, f: undefined } ); // vertical - await test( '#/0/', { h: 0, v: 0, f: undefined } ); // trailing / - await test( '#/1/1/', { h: 1, v: 1, f: undefined } ); // trailing / - await test( '#/2/0/1', { h: 2, v: 0, f: 1 } ); // fragment - }); - - // --------------------------------------------------------------- - // KEYBOARD TESTS - - QUnit.module( 'Keyboard' ); - - QUnit.test( 'Add key bindings', function( assert ) { - var done = assert.async( 1 ); - - Reveal.addKeyBinding({keyCode: 88, key: 'X', description: 'X-SHORTCUT-X'}, function() { - assert.ok( true, 'callback triggered' ); - done(); - } ); - - Reveal.toggleHelp( true ); - assert.ok( /X\-SHORTCUT\-X/.test( document.body.innerHTML ), 'binding is added to help overlay' ); - Reveal.toggleHelp( false ); - - triggerKeyboardEvent({ keyCode: 88 }); - - Reveal.removeKeyBinding( 88 ); - - // should do nothing - triggerKeyboardEvent({ keyCode: 88 }); - }); - - QUnit.test( 'Navigation bindings', function( assert ) { - Reveal.slide( 0 ); - - // right arrow - triggerKeyboardEvent({ keyCode: 39 }); - assert.strictEqual( Reveal.getIndices().h, 1 ); - - // down arrow + shift - triggerKeyboardEvent({ keyCode: 40, shiftKey: true }); - assert.strictEqual( Reveal.getIndices().v, 2, 'shift + down arrow goes to last vertical slide' ); - - // up arrow - triggerKeyboardEvent({ keyCode: 38 }); - assert.strictEqual( Reveal.getIndices().v, 1 ); - - // right arrow + shift - triggerKeyboardEvent({ keyCode: 39, shiftKey: true }); - assert.ok( Reveal.isLastSlide(), 'shift + right arrow goes to last horizontal slide' ); - - - // right arrow on slide with fragments - Reveal.slide( 2, 0, -1 ); - triggerKeyboardEvent({ keyCode: 39 }); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'right arrow shows fragment' ); - - triggerKeyboardEvent({ keyCode: 39, altKey: true }); - assert.strictEqual( Reveal.getIndices().h, 3, 'right arrow skips fragments when alt key is pressed' ); - }); - - // --------------------------------------------------------------- - // FRAGMENT TESTS - - QUnit.module( 'Fragments' ); - - QUnit.test( 'Sliding to fragments', function( assert ) { - Reveal.slide( 2, 0, -1 ); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 }, 'Reveal.slide( 2, 0, -1 )' ); - - Reveal.slide( 2, 0, 0 ); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'Reveal.slide( 2, 0, 0 )' ); - - Reveal.slide( 2, 0, 2 ); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'Reveal.slide( 2, 0, 2 )' ); - - Reveal.slide( 2, 0, 1 ); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'Reveal.slide( 2, 0, 1 )' ); - }); - - QUnit.test( 'data-fragment is set on slide <section>', function( assert ) { - Reveal.slide( 2, 0, -1 ); - assert.deepEqual( Reveal.getCurrentSlide().getAttribute( 'data-fragment' ), '-1' ); - - Reveal.slide( 2, 0, 2 ); - assert.deepEqual( Reveal.getCurrentSlide().getAttribute( 'data-fragment' ), '2' ); - - Reveal.slide( 2, 0, 0 ); - assert.deepEqual( Reveal.getCurrentSlide().getAttribute( 'data-fragment' ), '0' ); - - var fragmentSlide = Reveal.getCurrentSlide(); - - Reveal.slide( 3, 0 ); - assert.deepEqual( fragmentSlide.getAttribute( 'data-fragment' ), '0', 'data-fragment persists when jumping to another slide' ); - }); - - QUnit.test( 'Hiding all fragments', function( assert ) { - var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' ); - - Reveal.slide( 2, 0, 0 ); - assert.strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 1, 'one fragment visible when index is 0' ); - - Reveal.slide( 2, 0, -1 ); - assert.strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when index is -1' ); - }); - - QUnit.test( 'Current fragment', function( assert ) { - var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' ); - var lastFragmentIndex = [].slice.call( fragmentSlide.querySelectorAll( '.fragment' ) ).pop().getAttribute( 'data-fragment-index' ); - - Reveal.slide( 2, 0 ); - assert.strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment at index -1' ); - - Reveal.slide( 2, 0, 0 ); - assert.strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 1, 'one current fragment at index 0' ); - - Reveal.slide( 1, 0, 0 ); - assert.strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to previous slide' ); - - Reveal.slide( 3, 0, 0 ); - assert.strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to next slide' ); - - Reveal.slide( 2, 1, -1 ); - Reveal.prev(); - assert.strictEqual( fragmentSlide.querySelector( '.fragment.current-fragment' ).getAttribute( 'data-fragment-index' ), lastFragmentIndex, 'last fragment is current fragment when returning from future slide' ); - }); - - QUnit.test( 'Stepping through fragments', function( assert ) { - Reveal.slide( 2, 0, -1 ); - - // forwards: - - Reveal.next(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'next() goes to next fragment' ); - - Reveal.right(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'right() goes to next fragment' ); - - Reveal.down(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'down() goes to next fragment' ); - - Reveal.down(); // moves to f #3 - - // backwards: - - Reveal.prev(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'prev() goes to prev fragment' ); - - Reveal.left(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'left() goes to prev fragment' ); - - Reveal.up(); - assert.deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'up() goes to prev fragment' ); - }); - - QUnit.test( 'Stepping past fragments', function( assert ) { - var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' ); - - Reveal.slide( 0, 0, 0 ); - assert.equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when on previous slide' ); - - Reveal.slide( 3, 0, 0 ); - assert.equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 3, 'all fragments visible when on future slide' ); - }); - - QUnit.test( 'Fragment indices', function( assert ) { - var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(2)' ); - - Reveal.slide( 3, 0, 0 ); - assert.equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 2, 'both fragments of same index are shown' ); - - // This slide has three fragments, first one is index 0, second and third have index 1 - Reveal.slide( 2, 2, 0 ); - assert.equal( Reveal.getIndices().f, 0, 'returns correct index for first fragment' ); - - Reveal.slide( 2, 2, 1 ); - assert.equal( Reveal.getIndices().f, 1, 'returns correct index for two fragments with same index' ); - }); - - QUnit.test( 'Index generation', function( assert ) { - var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' ); - - // These have no indices defined to start with - assert.equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' ); - assert.equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' ); - assert.equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '2' ); - }); - - QUnit.test( 'Index normalization', function( assert ) { - var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(3)' ); - - // These start out as 1-4-4 and should normalize to 0-1-1 - assert.equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' ); - assert.equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' ); - assert.equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '1' ); - }); - - QUnit.test( 'fragmentshown event', function( assert ) { - assert.expect( 2 ); - var done = assert.async( 2 ); - - var _onEvent = function( event ) { - assert.ok( true, 'event fired' ); - done(); - } - - Reveal.on( 'fragmentshown', _onEvent ); - - Reveal.slide( 2, 0 ); - Reveal.slide( 2, 0 ); // should do nothing - Reveal.slide( 2, 0, 0 ); // should do nothing - Reveal.next(); - Reveal.next(); - Reveal.prev(); // shouldn't fire fragmentshown - - Reveal.off( 'fragmentshown', _onEvent ); - }); - - QUnit.test( 'fragmenthidden event', function( assert ) { - assert.expect( 2 ); - var done = assert.async( 2 ); - - var _onEvent = function( event ) { - assert.ok( true, 'event fired' ); - done(); - } - - Reveal.on( 'fragmenthidden', _onEvent ); - - Reveal.slide( 2, 0, 2 ); - Reveal.slide( 2, 0, 2 ); // should do nothing - Reveal.prev(); - Reveal.prev(); - Reveal.next(); // shouldn't fire fragmenthidden - - Reveal.off( 'fragmenthidden', _onEvent ); - }); - - - // --------------------------------------------------------------- - // AUTO-SLIDE TESTS - - QUnit.module( 'Auto Sliding' ); - - QUnit.test( 'Reveal.isAutoSliding', function( assert ) { - assert.strictEqual( Reveal.isAutoSliding(), false, 'false by default' ); - - Reveal.configure({ autoSlide: 10000 }); - assert.strictEqual( Reveal.isAutoSliding(), true, 'true after starting' ); - - Reveal.configure({ autoSlide: 0 }); - assert.strictEqual( Reveal.isAutoSliding(), false, 'false after setting to 0' ); - }); - - QUnit.test( 'Reveal.toggleAutoSlide', function( assert ) { - Reveal.configure({ autoSlide: 10000 }); - - Reveal.toggleAutoSlide(); - assert.strictEqual( Reveal.isAutoSliding(), false, 'false after first toggle' ); - Reveal.toggleAutoSlide(); - assert.strictEqual( Reveal.isAutoSliding(), true, 'true after second toggle' ); - - Reveal.configure({ autoSlide: 0 }); - }); - - QUnit.test( 'autoslidepaused', function( assert ) { - assert.expect( 1 ); - var done = assert.async(); - - var _onEvent = function( event ) { - assert.ok( true, 'event fired' ); - done(); - } - - Reveal.on( 'autoslidepaused', _onEvent ); - Reveal.configure({ autoSlide: 10000 }); - Reveal.toggleAutoSlide(); - - // cleanup - Reveal.configure({ autoSlide: 0 }); - Reveal.off( 'autoslidepaused', _onEvent ); - }); - - QUnit.test( 'autoslideresumed', function( assert ) { - assert.expect( 1 ); - var done = assert.async(); - - var _onEvent = function( event ) { - assert.ok( true, 'event fired' ); - done(); - } - - Reveal.on( 'autoslideresumed', _onEvent ); - Reveal.configure({ autoSlide: 10000 }); - Reveal.toggleAutoSlide(); - Reveal.toggleAutoSlide(); - - // cleanup - Reveal.configure({ autoSlide: 0 }); - Reveal.off( 'autoslideresumed', _onEvent ); - }); - - - // --------------------------------------------------------------- - // CONFIGURATION VALUES - - QUnit.module( 'Configuration' ); - - QUnit.test( 'Controls', function( assert ) { - var controlsElement = document.querySelector( '.reveal>.controls' ); - - Reveal.configure({ controls: false }); - assert.equal( controlsElement.style.display, 'none', 'controls are hidden' ); - - Reveal.configure({ controls: true }); - assert.equal( controlsElement.style.display, 'block', 'controls are visible' ); - }); - - QUnit.test( 'Progress', function( assert ) { - var progressElement = document.querySelector( '.reveal>.progress' ); - - Reveal.configure({ progress: false }); - assert.equal( progressElement.style.display, 'none', 'progress are hidden' ); - - Reveal.configure({ progress: true }); - assert.equal( progressElement.style.display, 'block', 'progress are visible' ); - }); - - QUnit.test( 'Loop', function( assert ) { - Reveal.configure({ loop: true }); - - Reveal.slide( 0, 0 ); - - Reveal.left(); - assert.notEqual( Reveal.getIndices().h, 0, 'looped from start to end' ); - - Reveal.right(); - assert.equal( Reveal.getIndices().h, 0, 'looped from end to start' ); - - Reveal.configure({ navigationMode: 'linear' }); - Reveal.slide( 0, 0 ); - - Reveal.prev(); - assert.notEqual( Reveal.getIndices().h, 0, 'looped from start to end in linear mode' ); - - Reveal.next(); - assert.equal( Reveal.getIndices().h, 0, 'looped from end to start in linear mode' ); - - Reveal.configure({ loop: false, navigationMode: 'default' }); - }); - - - // --------------------------------------------------------------- - // LAZY-LOADING TESTS - - QUnit.module( 'Lazy-Loading' ); - - QUnit.test( 'img with data-src', function( assert ) { - assert.strictEqual( document.querySelectorAll( '.reveal section img[src]' ).length, 1, 'Image source has been set' ); - }); - - QUnit.test( 'video with data-src', function( assert ) { - assert.strictEqual( document.querySelectorAll( '.reveal section video[src]' ).length, 1, 'Video source has been set' ); - }); - - QUnit.test( 'audio with data-src', function( assert ) { - assert.strictEqual( document.querySelectorAll( '.reveal section audio[src]' ).length, 1, 'Audio source has been set' ); - }); - - QUnit.test( 'iframe with data-src', function( assert ) { - Reveal.slide( 0, 0 ); - assert.strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 0, 'Iframe source is not set' ); - Reveal.slide( 2, 1 ); - assert.strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 1, 'Iframe source is set' ); - Reveal.slide( 2, 2 ); - assert.strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 0, 'Iframe source is not set' ); - }); - - QUnit.test( 'background images', function( assert ) { - var imageSource1 = Reveal.getSlide( 0 ).getAttribute( 'data-background-image' ); - var imageSource2 = Reveal.getSlide( 1, 0 ).getAttribute( 'data-background' ); - var imageSource3 = Reveal.getSlide( 1, 1 ).getAttribute( 'data-background-image' ); - - // check that the images are applied to the background elements - assert.ok( Reveal.getSlideBackground( 0 ).querySelector( '.slide-background-content' ).style.backgroundImage.indexOf( imageSource1 ) !== -1, 'data-background-image worked' ); - assert.ok( Reveal.getSlideBackground( 1, 0 ).querySelector( '.slide-background-content' ).style.backgroundImage.indexOf( imageSource2 ) !== -1, 'data-background worked' ); - assert.ok( Reveal.getSlideBackground( 1, 1 ).querySelector( '.slide-background-content' ).style.backgroundImage.indexOf( imageSource3 ) !== -1, 'data-background worked' ); - }); - - - // --------------------------------------------------------------- - // EVENT TESTS - - QUnit.module( 'Events' ); - - QUnit.test( 'beforeslidechange', function( assert ) { - var done = assert.async( 2 ); - - var normalEvent = function( event ) { - assert.ok( true, 'event fired' ); - done(); - } - var blockingEvent = function( event ) { - event.preventDefault(); - assert.ok( true, 'event fired' ); - done(); - } - - Reveal.on( 'beforeslidechange', normalEvent ); - Reveal.slide( 2, 0 ); - Reveal.off( 'beforeslidechange', normalEvent ); - - Reveal.on( 'beforeslidechange', blockingEvent ); - Reveal.slide( 3, 0 ); - Reveal.off( 'beforeslidechange', blockingEvent ); - - assert.strictEqual( Reveal.getIndices().h, 2, 'preventing "beforeslidechange" blocks navigation ' ); - - }); - - QUnit.test( 'slidechanged', function( assert ) { - assert.expect( 3 ); - var done = assert.async( 3 ); - - var _onEvent = function( event ) { - assert.ok( true, 'event fired' ); - done(); - } - - Reveal.on( 'slidechanged', _onEvent ); - - Reveal.slide( 1, 0 ); // should trigger - Reveal.slide( 1, 0 ); // should do nothing - Reveal.next(); // should trigger - Reveal.slide( 3, 0 ); // should trigger - Reveal.next(); // should do nothing - - Reveal.off( 'slidechanged', _onEvent ); - - }); - - /* Fails intermittently... - QUnit.test( 'slidetransitionend', function( assert ) { - assert.expect( 2 ); - let done = assert.async( 2 ); - let time = Date.now(); - - let horizontalCallback = event => { - assert.ok( Date.now() - time > 200, 'horizontal event fired' ); - done(); - - let verticalCallback = event => { - assert.ok( true, 'vertical event fired' ); - done(); - Reveal.off( 'slidetransitionend', verticalCallback ); - } - - Reveal.off( 'slidetransitionend', horizontalCallback ); - Reveal.on( 'slidetransitionend', verticalCallback ); - Reveal.slide( 1, 1 ); - } - - Reveal.slide( 0, 0 ); - Reveal.on( 'slidetransitionend', horizontalCallback ); - Reveal.slide( 1, 0 ); - - }); - */ - - QUnit.test( 'paused', function( assert ) { - assert.expect( 1 ); - var done = assert.async(); - - var _onEvent = function( event ) { - assert.ok( true, 'event fired' ); - done(); - } - - Reveal.on( 'paused', _onEvent ); - - Reveal.togglePause(); - Reveal.togglePause(); - - Reveal.off( 'paused', _onEvent ); - }); - - QUnit.test( 'resumed', function( assert ) { - assert.expect( 1 ); - var done = assert.async(); - - var _onEvent = function( event ) { - assert.ok( true, 'event fired' ); - done(); - } - - Reveal.on( 'resumed', _onEvent ); - - Reveal.togglePause(); - Reveal.togglePause(); - - Reveal.off( 'resumed', _onEvent ); - }); - - } ); - </script> - - </body> -</html> -- GitLab