From 6bb45e4d1ba014c1dd33bedff49be8afa9426d17 Mon Sep 17 00:00:00 2001 From: Morgan Richomme Date: Thu, 13 Oct 2016 18:02:06 +0200 Subject: [PATCH] remove 3rd part files with MIT or BSD license Change-Id: I941093e91897d1425720b5acdbf072cf620f131d Signed-off-by: Morgan Richomme --- docs/com/CONTRIBUTING.md | 23 - docs/com/Gruntfile.js | 172 - docs/com/LICENSE | 19 - docs/com/README.md | 1024 ----- docs/com/README.txt | 9 + docs/com/bower.json | 27 - docs/com/css/print/paper.css | 202 - docs/com/css/print/pdf.css | 168 - docs/com/css/reveal.css | 1211 ----- docs/com/css/reveal.scss | 1362 ------ docs/com/css/theme/README.md | 23 - docs/com/css/theme/beige.css | 273 -- docs/com/css/theme/black.css | 269 -- docs/com/css/theme/blood.css | 287 -- docs/com/css/theme/league.css | 275 -- docs/com/css/theme/moon.css | 273 -- docs/com/css/theme/night.css | 267 -- docs/com/css/theme/serif.css | 269 -- docs/com/css/theme/simple.css | 269 -- docs/com/css/theme/sky.css | 276 -- docs/com/css/theme/solarized.css | 273 -- docs/com/css/theme/source/beige.scss | 39 - docs/com/css/theme/source/black.scss | 49 - docs/com/css/theme/source/blood.scss | 79 - docs/com/css/theme/source/league.scss | 34 - docs/com/css/theme/source/moon.scss | 57 - docs/com/css/theme/source/night.scss | 35 - docs/com/css/theme/source/serif.scss | 35 - docs/com/css/theme/source/simple.scss | 38 - docs/com/css/theme/source/sky.scss | 46 - docs/com/css/theme/source/solarized.scss | 63 - docs/com/css/theme/source/white.scss | 49 - docs/com/css/theme/template/mixins.scss | 29 - docs/com/css/theme/template/settings.scss | 43 - docs/com/css/theme/template/theme.scss | 352 -- docs/com/css/theme/white.css | 269 -- docs/com/js/reveal.js | 4619 -------------------- docs/com/lib/css/zenburn.css | 115 - docs/com/lib/font/league-gothic/LICENSE | 2 - docs/com/lib/font/league-gothic/league-gothic.css | 10 - docs/com/lib/font/league-gothic/league-gothic.eot | Bin 25696 -> 0 bytes docs/com/lib/font/league-gothic/league-gothic.ttf | Bin 64256 -> 0 bytes docs/com/lib/font/league-gothic/league-gothic.woff | Bin 30764 -> 0 bytes docs/com/lib/js/classList.js | 2 - docs/com/lib/js/head.min.js | 8 - docs/com/lib/js/html5shiv.js | 7 - docs/com/package.json | 45 - docs/com/plugin/highlight/highlight.js | 31 - docs/com/plugin/markdown/example.html | 129 - docs/com/plugin/markdown/example.md | 31 - docs/com/plugin/markdown/markdown.js | 402 -- docs/com/plugin/markdown/marked.js | 6 - docs/com/plugin/math/math.js | 67 - docs/com/plugin/multiplex/client.js | 13 - docs/com/plugin/multiplex/index.js | 56 - docs/com/plugin/multiplex/master.js | 31 - docs/com/plugin/notes-server/client.js | 60 - docs/com/plugin/notes-server/index.js | 64 - docs/com/plugin/notes-server/notes.html | 400 -- docs/com/plugin/notes/notes.html | 407 -- docs/com/plugin/notes/notes.js | 124 - docs/com/plugin/print-pdf/print-pdf.js | 48 - docs/com/plugin/remotes/remotes.js | 39 - docs/com/plugin/search/search.js | 196 - docs/com/plugin/zoom-js/zoom.js | 278 -- .../{ => Summit/Berlin-2016}/conversation.html | 32 +- .../{ => Summit/Berlin-2016}/summit-Berlin.html | 40 +- .../com/pres/{ => Summit/Berlin-2016}/testapi.html | 34 +- docs/com/pres/index.template.html | 378 -- docs/com/test/examples/assets/image1.png | Bin 21991 -> 0 bytes docs/com/test/examples/assets/image2.png | Bin 10237 -> 0 bytes docs/com/test/examples/barebones.html | 41 - docs/com/test/examples/embedded-media.html | 49 - docs/com/test/examples/math.html | 185 - docs/com/test/examples/slide-backgrounds.html | 144 - docs/com/test/examples/slide-transitions.html | 101 - docs/com/test/qunit-1.12.0.css | 244 -- docs/com/test/qunit-1.12.0.js | 2212 ---------- .../com/test/test-markdown-element-attributes.html | 134 - docs/com/test/test-markdown-element-attributes.js | 46 - docs/com/test/test-markdown-slide-attributes.html | 128 - docs/com/test/test-markdown-slide-attributes.js | 47 - docs/com/test/test-markdown.html | 52 - docs/com/test/test-markdown.js | 15 - docs/com/test/test-pdf.html | 83 - docs/com/test/test-pdf.js | 15 - docs/com/test/test.html | 86 - docs/com/test/test.js | 597 --- 88 files changed, 62 insertions(+), 19979 deletions(-) delete mode 100755 docs/com/CONTRIBUTING.md delete mode 100755 docs/com/Gruntfile.js delete mode 100755 docs/com/LICENSE delete mode 100755 docs/com/README.md create mode 100644 docs/com/README.txt delete mode 100755 docs/com/bower.json delete mode 100755 docs/com/css/print/paper.css delete mode 100755 docs/com/css/print/pdf.css delete mode 100755 docs/com/css/reveal.css delete mode 100755 docs/com/css/reveal.scss delete mode 100755 docs/com/css/theme/README.md delete mode 100755 docs/com/css/theme/beige.css delete mode 100755 docs/com/css/theme/black.css delete mode 100755 docs/com/css/theme/blood.css delete mode 100755 docs/com/css/theme/league.css delete mode 100755 docs/com/css/theme/moon.css delete mode 100755 docs/com/css/theme/night.css delete mode 100755 docs/com/css/theme/serif.css delete mode 100755 docs/com/css/theme/simple.css delete mode 100755 docs/com/css/theme/sky.css delete mode 100755 docs/com/css/theme/solarized.css delete mode 100755 docs/com/css/theme/source/beige.scss delete mode 100755 docs/com/css/theme/source/black.scss delete mode 100755 docs/com/css/theme/source/blood.scss delete mode 100755 docs/com/css/theme/source/league.scss delete mode 100755 docs/com/css/theme/source/moon.scss delete mode 100755 docs/com/css/theme/source/night.scss delete mode 100755 docs/com/css/theme/source/serif.scss delete mode 100755 docs/com/css/theme/source/simple.scss delete mode 100755 docs/com/css/theme/source/sky.scss delete mode 100755 docs/com/css/theme/source/solarized.scss delete mode 100755 docs/com/css/theme/source/white.scss delete mode 100755 docs/com/css/theme/template/mixins.scss delete mode 100755 docs/com/css/theme/template/settings.scss delete mode 100755 docs/com/css/theme/template/theme.scss delete mode 100755 docs/com/css/theme/white.css delete mode 100755 docs/com/js/reveal.js delete mode 100755 docs/com/lib/css/zenburn.css delete mode 100755 docs/com/lib/font/league-gothic/LICENSE delete mode 100755 docs/com/lib/font/league-gothic/league-gothic.css delete mode 100755 docs/com/lib/font/league-gothic/league-gothic.eot delete mode 100755 docs/com/lib/font/league-gothic/league-gothic.ttf delete mode 100755 docs/com/lib/font/league-gothic/league-gothic.woff delete mode 100755 docs/com/lib/js/classList.js delete mode 100755 docs/com/lib/js/head.min.js delete mode 100755 docs/com/lib/js/html5shiv.js delete mode 100755 docs/com/package.json delete mode 100755 docs/com/plugin/highlight/highlight.js delete mode 100755 docs/com/plugin/markdown/example.html delete mode 100755 docs/com/plugin/markdown/example.md delete mode 100755 docs/com/plugin/markdown/markdown.js delete mode 100755 docs/com/plugin/markdown/marked.js delete mode 100755 docs/com/plugin/math/math.js delete mode 100755 docs/com/plugin/multiplex/client.js delete mode 100755 docs/com/plugin/multiplex/index.js delete mode 100755 docs/com/plugin/multiplex/master.js delete mode 100755 docs/com/plugin/notes-server/client.js delete mode 100755 docs/com/plugin/notes-server/index.js delete mode 100755 docs/com/plugin/notes-server/notes.html delete mode 100755 docs/com/plugin/notes/notes.html delete mode 100755 docs/com/plugin/notes/notes.js delete mode 100755 docs/com/plugin/print-pdf/print-pdf.js delete mode 100755 docs/com/plugin/remotes/remotes.js delete mode 100755 docs/com/plugin/search/search.js delete mode 100755 docs/com/plugin/zoom-js/zoom.js rename docs/com/pres/{ => Summit/Berlin-2016}/conversation.html (83%) rename docs/com/pres/{ => Summit/Berlin-2016}/summit-Berlin.html (82%) rename docs/com/pres/{ => Summit/Berlin-2016}/testapi.html (84%) delete mode 100755 docs/com/pres/index.template.html delete mode 100755 docs/com/test/examples/assets/image1.png delete mode 100755 docs/com/test/examples/assets/image2.png delete mode 100755 docs/com/test/examples/barebones.html delete mode 100755 docs/com/test/examples/embedded-media.html delete mode 100755 docs/com/test/examples/math.html delete mode 100755 docs/com/test/examples/slide-backgrounds.html delete mode 100755 docs/com/test/examples/slide-transitions.html delete mode 100755 docs/com/test/qunit-1.12.0.css delete mode 100755 docs/com/test/qunit-1.12.0.js delete mode 100755 docs/com/test/test-markdown-element-attributes.html delete mode 100755 docs/com/test/test-markdown-element-attributes.js delete mode 100755 docs/com/test/test-markdown-slide-attributes.html delete mode 100755 docs/com/test/test-markdown-slide-attributes.js delete mode 100755 docs/com/test/test-markdown.html delete mode 100755 docs/com/test/test-markdown.js delete mode 100755 docs/com/test/test-pdf.html delete mode 100755 docs/com/test/test-pdf.js delete mode 100755 docs/com/test/test.html delete mode 100755 docs/com/test/test.js diff --git a/docs/com/CONTRIBUTING.md b/docs/com/CONTRIBUTING.md deleted file mode 100755 index c2091e88f..000000000 --- a/docs/com/CONTRIBUTING.md +++ /dev/null @@ -1,23 +0,0 @@ -## Contributing - -Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. - - -### Personal Support -If you have personal support or setup questions the best place to ask those are [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js). - - -### Bug Reports -When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested. - - -### Pull Requests -- Should follow the coding style of the file you work in, most importantly: - - Tabs to indent - - Single-quoted strings -- Should be made towards the **dev branch** -- Should be submitted from a feature/topic branch (not your master) - - -### Plugins -Please do not submit plugins as pull requests. They should be maintained in their own separate repository. More information here: https://github.com/hakimel/reveal.js/wiki/Plugin-Guidelines diff --git a/docs/com/Gruntfile.js b/docs/com/Gruntfile.js deleted file mode 100755 index a85184512..000000000 --- a/docs/com/Gruntfile.js +++ /dev/null @@ -1,172 +0,0 @@ -/* global module:false */ -module.exports = function(grunt) { - var port = grunt.option('port') || 8000; - var base = grunt.option('base') || '.'; - - // Project configuration - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - meta: { - banner: - '/*!\n' + - ' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' + - ' * http://lab.hakim.se/reveal-js\n' + - ' * MIT licensed\n' + - ' *\n' + - ' * Copyright (C) 2015 Hakim El Hattab, http://hakim.se\n' + - ' */' - }, - - qunit: { - files: [ 'test/*.html' ] - }, - - uglify: { - options: { - banner: '<%= meta.banner %>\n' - }, - build: { - src: 'js/reveal.js', - dest: 'js/reveal.min.js' - } - }, - - sass: { - core: { - files: { - 'css/reveal.css': 'css/reveal.scss', - } - }, - themes: { - files: [ - { - expand: true, - cwd: 'css/theme/source', - src: ['*.scss'], - dest: 'css/theme', - ext: '.css' - } - ] - } - }, - - autoprefixer: { - dist: { - src: 'css/reveal.css' - } - }, - - cssmin: { - compress: { - files: { - 'css/reveal.min.css': [ 'css/reveal.css' ] - } - } - }, - - jshint: { - options: { - curly: false, - eqeqeq: true, - immed: true, - latedef: true, - newcap: true, - noarg: true, - sub: true, - undef: true, - eqnull: true, - browser: true, - expr: true, - globals: { - head: false, - module: false, - console: false, - unescape: false, - define: false, - exports: false - } - }, - files: [ 'Gruntfile.js', 'js/reveal.js' ] - }, - - connect: { - server: { - options: { - port: port, - base: base, - livereload: true, - open: true - } - } - }, - - zip: { - 'reveal-js-presentation.zip': [ - 'index.html', - 'css/**', - 'js/**', - 'lib/**', - 'images/**', - 'plugin/**' - ] - }, - - watch: { - options: { - livereload: true - }, - js: { - files: [ 'Gruntfile.js', 'js/reveal.js' ], - tasks: 'js' - }, - theme: { - files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ], - tasks: 'css-themes' - }, - css: { - files: [ 'css/reveal.scss' ], - tasks: 'css-core' - }, - html: { - files: [ 'index.html'] - } - } - - }); - - // Dependencies - grunt.loadNpmTasks( 'grunt-contrib-qunit' ); - grunt.loadNpmTasks( 'grunt-contrib-jshint' ); - grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); - grunt.loadNpmTasks( 'grunt-contrib-uglify' ); - grunt.loadNpmTasks( 'grunt-contrib-watch' ); - grunt.loadNpmTasks( 'grunt-sass' ); - grunt.loadNpmTasks( 'grunt-contrib-connect' ); - grunt.loadNpmTasks( 'grunt-autoprefixer' ); - grunt.loadNpmTasks( 'grunt-zip' ); - - // Default task - grunt.registerTask( 'default', [ 'css', 'js' ] ); - - // JS task - grunt.registerTask( 'js', [ 'jshint', 'uglify', 'qunit' ] ); - - // Theme CSS - grunt.registerTask( 'css-themes', [ 'sass:themes' ] ); - - // Core framework CSS - grunt.registerTask( 'css-core', [ 'sass:core', 'autoprefixer', 'cssmin' ] ); - - // All CSS - grunt.registerTask( 'css', [ 'sass', 'autoprefixer', 'cssmin' ] ); - - // Package presentation to archive - grunt.registerTask( 'package', [ 'default', 'zip' ] ); - - // Serve presentation locally - grunt.registerTask( 'serve', [ 'connect', 'watch' ] ); - - // Run tests - grunt.registerTask( 'test', [ 'jshint', 'qunit' ] ); - -}; diff --git a/docs/com/LICENSE b/docs/com/LICENSE deleted file mode 100755 index 09623076f..000000000 --- a/docs/com/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2015 Hakim El Hattab, http://hakim.se - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/docs/com/README.md b/docs/com/README.md deleted file mode 100755 index a58254943..000000000 --- a/docs/com/README.md +++ /dev/null @@ -1,1024 +0,0 @@ -# reveal.js [![Build Status](https://travis-ci.org/hakimel/reveal.js.svg?branch=master)](https://travis-ci.org/hakimel/reveal.js) - -A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://lab.hakim.se/reveal-js/). - -reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [Markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). It's best viewed in a modern browser but [fallbacks](https://github.com/hakimel/reveal.js/wiki/Browser-Support) are available to make sure your presentation can still be viewed elsewhere. - - -#### More reading: -- [Installation](#installation): Step-by-step instructions for getting reveal.js running on your computer. -- [Changelog](https://github.com/hakimel/reveal.js/releases): Up-to-date version history. -- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own! -- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks. -- [Plugins](https://github.com/hakimel/reveal.js/wiki/Plugins,-Tools-and-Hardware): A list of plugins that can be used to extend reveal.js. - -## Online Editor - -Presentations are written using HTML or Markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [http://slides.com](http://slides.com). - - -## Instructions - -### Markup - -Markup hierarchy needs to be ``
`` where the ``
`` represents one slide and can be repeated indefinitely. If you place multiple ``
``'s inside of another ``
`` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and it will be included in the horizontal sequence. For example: - -```html -
-
-
Single Horizontal Slide
-
-
Vertical Slide 1
-
Vertical Slide 2
-
-
-
-``` - -### Markdown - -It's possible to write your slides using Markdown. To enable Markdown, add the ```data-markdown``` attribute to your ```
``` elements and wrap the contents in a ``` -
-``` - -#### External Markdown - -You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file. The ```data-charset``` attribute is optional and specifies which charset to use when loading the external file. - -When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup). - -```html -
-
-``` - -#### Element Attributes - -Special syntax (in html comment) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things. - -```html -
- -
-``` - -#### Slide Attributes - -Special syntax (in html comment) is available for adding attributes to the slide `
` elements generated by your Markdown. - -```html -
- -
-``` - - -### Configuration - -At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below. - -```javascript -Reveal.initialize({ - - // Display controls in the bottom right corner - controls: true, - - // Display a presentation progress bar - progress: true, - - // Display the page number of the current slide - slideNumber: false, - - // Push each slide change to the browser history - history: false, - - // Enable keyboard shortcuts for navigation - keyboard: true, - - // Enable the slide overview mode - overview: true, - - // Vertical centering of slides - center: true, - - // Enables touch navigation on devices with touch input - touch: true, - - // Loop the presentation - loop: false, - - // Change the presentation direction to be RTL - rtl: false, - - // Turns fragments on and off globally - fragments: true, - - // Flags if the presentation is running in an embedded mode, - // i.e. contained within a limited portion of the screen - embedded: false, - - // Flags if we should show a help overlay when the questionmark - // key is pressed - help: true, - - // Flags if speaker notes should be visible to all viewers - showNotes: false, - - // Number of milliseconds between automatically proceeding to the - // next slide, disabled when set to 0, this value can be overwritten - // by using a data-autoslide attribute on your slides - autoSlide: 0, - - // Stop auto-sliding after user input - autoSlideStoppable: true, - - // Enable slide navigation via mouse wheel - mouseWheel: false, - - // Hides the address bar on mobile devices - hideAddressBar: true, - - // Opens links in an iframe preview overlay - previewLinks: false, - - // Transition style - transition: 'default', // none/fade/slide/convex/concave/zoom - - // Transition speed - transitionSpeed: 'default', // default/fast/slow - - // Transition style for full page slide backgrounds - backgroundTransition: 'default', // none/fade/slide/convex/concave/zoom - - // Number of slides away from the current that are visible - viewDistance: 3, - - // Parallax background image - parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'" - - // Parallax background size - parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - - // Amount to move parallax background (horizontal and vertical) on slide change - // Number, e.g. 100 - parallaxBackgroundHorizontal: '', - parallaxBackgroundVertical: '' - -}); -``` - - -The configuration can be updated after initialization using the ```configure``` method: - -```javascript -// Turn autoSlide off -Reveal.configure({ autoSlide: 0 }); - -// Start auto-sliding every 5s -Reveal.configure({ autoSlide: 5000 }); -``` - - -### Dependencies - -Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example: - -```javascript -Reveal.initialize({ - dependencies: [ - // Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/ - { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }, - - // Interpret Markdown in
elements - { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, - { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, - - // Syntax highlight for elements - { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, - - // Zoom in and out with Alt+click - { src: 'plugin/zoom-js/zoom.js', async: true }, - - // Speaker notes - { src: 'plugin/notes/notes.js', async: true }, - - // Remote control your reveal.js presentation using a touch device - { src: 'plugin/remotes/remotes.js', async: true }, - - // MathJax - { src: 'plugin/math/math.js', async: true } - ] -}); -``` - -You can add your own extensions using the same syntax. The following properties are available for each dependency object: -- **src**: Path to the script to load -- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false -- **callback**: [optional] Function to execute when the script has loaded -- **condition**: [optional] Function which must return true for the script to be loaded - - -### Ready Event - -A 'ready' event is fired when reveal.js has loaded all non-async dependencies and is ready to start navigating. To check if reveal.js is already 'ready' you can call `Reveal.isReady()`. - -```javascript -Reveal.addEventListener( 'ready', function( event ) { - // event.currentSlide, event.indexh, event.indexv -} ); -``` - - -### Presentation Size - -All presentations have a normal size, that is the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport. - -See below for a list of configuration options related to sizing, including default values: - -```javascript -Reveal.initialize({ - - ... - - // The "normal" size of the presentation, aspect ratio will be preserved - // when the presentation is scaled to fit different resolutions. Can be - // specified using percentage units. - width: 960, - height: 700, - - // Factor of the display size that should remain empty around the content - margin: 0.1, - - // Bounds for smallest/largest possible scale to apply to content - minScale: 0.2, - maxScale: 1.5 - -}); -``` - - -### Auto-sliding - -Presentations can be configured to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides: - -```javascript -// Slide every five seconds -Reveal.configure({ - autoSlide: 5000 -}); -``` -When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Alternatively, sliding can be paused or resumed by pressing »a« on the keyboard. Sliding is paused automatically as soon as the user starts navigating. You can disable these controls by specifying ```autoSlideStoppable: false``` in your reveal.js config. - -You can also override the slide duration for individual slides and fragments by using the ```data-autoslide``` attribute: - -```html -
-

After 2 seconds the first fragment will be shown.

-

After 10 seconds the next fragment will be shown.

-

Now, the fragment is displayed for 2 seconds before the next slide is shown.

-
-``` - -Whenever the auto-slide mode is resumed or paused the ```autoslideresumed``` and ```autoslidepaused``` events are fired. - - -### Keyboard Bindings - -If you're unhappy with any of the default keyboard bindings you can override them using the ```keyboard``` config option: - -```javascript -Reveal.configure({ - keyboard: { - 13: 'next', // go to the next slide when the ENTER key is pressed - 27: function() {}, // do something custom when ESC is pressed - 32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding) - } -}); -``` - -### Touch Navigation - -You can swipe to navigate through a presentation on any touch-enabled device. Horizontal swipes change between horizontal slides, vertical swipes change between vertical slides. If you wish to disable this you can set the `touch` config option to false when initializing reveal.js. - -If there's some part of your content that needs to remain accessible to touch events you'll need to highlight this by adding a `data-prevent-swipe` attribute to the element. One common example where this is useful is elements that need to be scrolled. - - -### Lazy Loading - -When working on presentation with a lot of media or iframe content it's important to load lazily. Lazy loading means that reveal.js will only load content for the few slides nearest to the current slide. The number of slides that are preloaded is determined by the `viewDistance` configuration option. - -To enable lazy loading all you need to do is change your "src" attributes to "data-src" as shown below. This is supported for image, video, audio and iframe elements. Lazy loaded iframes will also unload when the containing slide is no longer visible. - -```html -
- - - -
-``` - - -### API - -The ``Reveal`` object exposes a JavaScript API for controlling navigation and reading state: - -```javascript -// Navigation -Reveal.slide( indexh, indexv, indexf ); -Reveal.left(); -Reveal.right(); -Reveal.up(); -Reveal.down(); -Reveal.prev(); -Reveal.next(); -Reveal.prevFragment(); -Reveal.nextFragment(); - -// Toggle presentation states, optionally pass true/false to force on/off -Reveal.toggleOverview(); -Reveal.togglePause(); -Reveal.toggleAutoSlide(); - -// Change a config value at runtime -Reveal.configure({ controls: true }); - -// Returns the present configuration options -Reveal.getConfig(); - -// Fetch the current scale of the presentation -Reveal.getScale(); - -// Retrieves the previous and current slide elements -Reveal.getPreviousSlide(); -Reveal.getCurrentSlide(); - -Reveal.getIndices(); // { h: 0, v: 0 } } -Reveal.getProgress(); // 0-1 -Reveal.getTotalSlides(); - -// Returns the speaker notes for the current slide -Reveal.getSlideNotes(); - -// State checks -Reveal.isFirstSlide(); -Reveal.isLastSlide(); -Reveal.isOverview(); -Reveal.isPaused(); -Reveal.isAutoSliding(); -``` - -### Slide Changed Event - -A 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes. - -Some libraries, like MathJax (see [#226](https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609)), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback. - -```javascript -Reveal.addEventListener( 'slidechanged', function( event ) { - // event.previousSlide, event.currentSlide, event.indexh, event.indexv -} ); -``` - -### Presentation State - -The presentation's current state can be fetched by using the `getState` method. A state object contains all of the information required to put the presentation back as it was when `getState` was first called. Sort of like a snapshot. It's a simple object that can easily be stringified and persisted or sent over the wire. - -```javascript -Reveal.slide( 1 ); -// we're on slide 1 - -var state = Reveal.getState(); - -Reveal.slide( 3 ); -// we're on slide 3 - -Reveal.setState( state ); -// we're back on slide 1 -``` - -### Slide States - -If you set ``data-state="somestate"`` on a slide ``
``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide. - -Furthermore you can also listen to these changes in state via JavaScript: - -```javascript -Reveal.addEventListener( 'somestate', function() { - // TODO: Sprinkle magic -}, false ); -``` - -### Slide Backgrounds - -Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page backgrounds outside of the slide area by adding a ```data-background``` attribute to your ```
``` elements. Four different types of backgrounds are supported: color, image, video and iframe. Below are a few examples. - -```html -
-

All CSS color formats are supported, like rgba() or hsl().

-
-
-

This slide will have a full-size background image.

-
-
-

This background image will be sized to 100px and repeated.

-
-
-

Video. Multiple sources can be defined using a comma separated list. Video will loop when the data-background-video-loop attribute is provided.

-
-
-

Embeds a web page as a background. Note that the page won't be interactive.

-
-``` - -Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing ```backgroundTransition: 'slide'``` to the ```Reveal.initialize()``` call. Alternatively you can set ```data-background-transition``` on any section with a background to override that specific transition. - - -### Parallax Background - -If you want to use a parallax scrolling background, set the first two config properties below when initializing reveal.js (the other two are optional). - -```javascript -Reveal.initialize({ - - // Parallax background image - parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg" - - // Parallax background size - parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto) - - // Amount of pixels to move the parallax background per slide step, - // a value of 0 disables movement along the given axis - // These are optional, if they aren't specified they'll be calculated automatically - parallaxBackgroundHorizontal: 200, - parallaxBackgroundVertical: 50 - -}); -``` - -Make sure that the background size is much bigger than screen size to allow for some scrolling. [View example](http://lab.hakim.se/reveal-js/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg¶llaxBackgroundSize=2100px%20900px). - - - -### Slide Transitions -The global presentation transition is set using the ```transition``` config value. You can override the global transition for a specific slide by using the ```data-transition``` attribute: - -```html -
-

This slide will override the presentation transition and zoom!

-
- -
-

Choose from three transition speeds: default, fast or slow!

-
-``` - -You can also use different in and out transitions for the same slide: - -```html -
- The train goes on … -
-
- and on … -
-
- and stops. -
-
- (Passengers entering and leaving) -
-
- And it starts again. -
-``` - - -Note that this does not work with the page and cube transitions. - - -### Internal links - -It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```
```): - -```html -Link -Link -``` - -You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an ```enabled``` class when it's a valid navigation route based on the current slide. - -```html - - - - - - -``` - - -### Fragments -Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://lab.hakim.se/reveal-js/#/fragments - -The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment: - -```html -
-

grow

-

shrink

-

fade-out

-

visible only once

-

blue only once

-

highlight-red

-

highlight-green

-

highlight-blue

-
-``` - -Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second. - -```html -
- - I'll fade in, then out - -
-``` - -The display order of fragments can be controlled using the ```data-fragment-index``` attribute. - -```html -
-

Appears last

-

Appears first

-

Appears second

-
-``` - -### Fragment events - -When a slide fragment is either shown or hidden reveal.js will dispatch an event. - -Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback. - -```javascript -Reveal.addEventListener( 'fragmentshown', function( event ) { - // event.fragment = the fragment DOM element -} ); -Reveal.addEventListener( 'fragmenthidden', function( event ) { - // event.fragment = the fragment DOM element -} ); -``` - -### Code syntax highlighting - -By default, Reveal is configured with [highlight.js](http://softwaremaniacs.org/soft/highlight/en/) for code syntax highlighting. Below is an example with clojure code that will be syntax highlighted. When the `data-trim` attribute is present surrounding whitespace is automatically removed. - -```html -
-

-(def lazy-fib
-  (concat
-   [0 1]
-   ((fn rfib [a b]
-        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
-	
-
-``` - -### Slide number -If you would like to display the page number of the current slide you can do so using the ```slideNumber``` configuration value. - -```javascript -// Shows the slide number using default formatting -Reveal.configure({ slideNumber: true }); - -// Slide number formatting can be configured using these variables: -// h: current slide's horizontal index -// v: current slide's vertical index -// c: current slide index (flattened) -// t: total number of slides (flattened) -Reveal.configure({ slideNumber: 'c / t' }); - -``` - - -### Overview mode - -Press "Esc" or "o" keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides, -as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks: - -```javascript -Reveal.addEventListener( 'overviewshown', function( event ) { /* ... */ } ); -Reveal.addEventListener( 'overviewhidden', function( event ) { /* ... */ } ); - -// Toggle the overview mode programmatically -Reveal.toggleOverview(); -``` - -### Fullscreen mode -Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode. - - -### Embedded media -Embedded HTML5 `
- - + + @@ -40,7 +40,7 @@
- - + + @@ -40,7 +40,7 @@
-
+





Test API

Clean, Easy, Complete

@@ -105,7 +105,7 @@
## API in Brahmaputra - ![testapi](../img/testapi0.png) + ![testapi](../../../img/testapi0.png) https://wiki.opnfv.org/display/functest/Collection+Of+Test+Results
@@ -195,7 +195,7 @@
http://testresults.opnfv.org/test/swagger/spec.html - ![alt text](../img/testapi1.png "Test API swagger interface") + ![alt text](../../../img/testapi1.png "Test API swagger interface")

unit tests

@@ -233,17 +233,17 @@ OK

Thank you

- tests + tests
- - + + - - - - - - -
- -
- -
-
-

Project

-

subtitle

-


-
John Doe
-
-
whenever you want
-
- -
- -
-
- “Good job. Chris Price - ” -
-
- -
-

item

-
    -
  • another one
  • -
  • one more time
  • -
-
- - - -
-
- # Cool in markdow - ## really cool - - yep -
-
-

OPNFV

- OPNFV -
-
- # Markdown - ![OPNFV](https://www.opnfv.org/sites/all/themes/opnfv/logo.png "OPNFV") -
-
- - -
-

THE END

-

- - Try the online editor
- - Source code & documentation -

-
- -
-

Slides

-

- Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at http://slides.com. -

-
- -
-

Point of View

-

- Press ESC to enter the slide overview. -

-

- Hold down alt and click on any element to zoom in on it using zoom.js. Alt + click anywhere to zoom back out. -

-
- -
-

Touch Optimized

-

- Presentations look great on touch devices, like mobile phones and tablets. Simply swipe through your slides. -

-
- -
-

Transition Styles

-

- You can select from different transitions, like:
- None - - Fade - - Slide - - Convex - - Concave - - Zoom -

-
- -
-

Themes

-

- reveal.js comes with a few themes built in:
- - Black (default) - - White - - League - - Sky - - Beige - - Simple
- Serif - - Blood - - Night - - Moon - - Solarized -

-
- -
-
-

Slide Backgrounds

-

- Set data-background="#dddddd" on a slide to change the background color. All CSS color formats are supported. -

- - Down arrow - -
-
-

Image Backgrounds

-
<section data-background="image.png">
-
-
-

Tiled Backgrounds

-
<section data-background="image.png" data-background-repeat="repeat" data-background-size="100px">
-
-
-
-

Video Backgrounds

-
<section data-background-video="video.mp4,video.webm">
-
-
-
-

... and GIFs!

-
-
- -
-

Background Transitions

-

- Different background transitions are available via the backgroundTransition option. This one's called "zoom". -

-
Reveal.configure({ backgroundTransition: 'zoom' })
-
- -
-

Background Transitions

-

- You can override background transitions per-slide. -

-
<section data-background-transition="zoom">
-
- -
-

Pretty Code

-

-function linkify( selector ) {
-  if( supports3DTransforms ) {
-
-    var nodes = document.querySelectorAll( selector );
-
-    for( var i = 0, len = nodes.length; i < len; i++ ) {
-      var node = nodes[i];
-
-      if( !node.className ) {
-        node.className += ' roll';
-      }
-    }
-  }
-}
-					
-

Code syntax highlighting courtesy of highlight.js.

-
- -
-

Marvelous List

-
    -
  • No order here
  • -
  • Or here
  • -
  • Or here
  • -
  • Or here
  • -
-
- -
-

Fantastic Ordered List

-
    -
  1. One is smaller than...
  2. -
  3. Two is smaller than...
  4. -
  5. Three!
  6. -
-
- -
-

Tabular Tables

- - - - - - - - - - - - - - - - - - - - - - - - - -
ItemValueQuantity
Apples$17
Lemonade$218
Bread$32
-
- -
-

Clever Quotes

-

- These guys come in two forms, inline: - “The nice thing about standards is that there are so many to choose from” and block: -

-
- “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.” -
-
- -
-

Intergalactic Interconnections

-

- You can link between slides internally, - like this. -

-
- -
-

Speaker View

-

There's a speaker view. It includes a timer, preview of the upcoming slide as well as your speaker notes.

-

Press the S key to try it out.

- - -
- -
-

Export to PDF

-

Presentations can be exported to PDF, here's an example:

- -
- -
-

Global State

-

- Set data-state="something" on a slide and "something" - 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. -

-
- -
-

State Events

-

- Additionally custom events can be triggered on a per slide basis by binding to the data-state name. -

-

-Reveal.addEventListener( 'customevent', function() {
-	console.log( '"customevent" has fired' );
-} );
-					
-
- -
-

Take a Moment

-

- 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. -

-
- -
-

Much more

- -
- - -
- -
- - - - - - - - diff --git a/docs/com/test/examples/assets/image1.png b/docs/com/test/examples/assets/image1.png deleted file mode 100755 index 87475945d0700ff26588a761aa87cab03d28a752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21991 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 diff --git a/docs/com/test/examples/assets/image2.png b/docs/com/test/examples/assets/image2.png deleted file mode 100755 index 6c403a0d20be97d7f4ce000487fac783764dbaf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10237 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 Gg#Hhj!X@AU diff --git a/docs/com/test/examples/barebones.html b/docs/com/test/examples/barebones.html deleted file mode 100755 index 2bee3cb02..000000000 --- a/docs/com/test/examples/barebones.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - reveal.js - Barebones - - - - - - -
- -
- -
-

Barebones Presentation

-

This example contains the bare minimum includes and markup required to run a reveal.js presentation.

-
- -
-

No Theme

-

There's no theme included, so it will fall back on browser defaults.

-
- -
- -
- - - - - - - diff --git a/docs/com/test/examples/embedded-media.html b/docs/com/test/examples/embedded-media.html deleted file mode 100755 index bbad4be3b..000000000 --- a/docs/com/test/examples/embedded-media.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - reveal.js - Embedded Media - - - - - - - - - -
- -
- -
-

Embedded Media Test

-
- -
- -
- -
-

Empty Slide

-
- -
- -
- - - - - - - - diff --git a/docs/com/test/examples/math.html b/docs/com/test/examples/math.html deleted file mode 100755 index 1b80e034d..000000000 --- a/docs/com/test/examples/math.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - reveal.js - Math Plugin - - - - - - - - - -
- -
- -
-

reveal.js Math Plugin

-

A thin wrapper for MathJax

-
- -
-

The Lorenz Equations

- - \[\begin{aligned} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{aligned} \] -
- -
-

The Cauchy-Schwarz Inequality

- - -
- -
-

A Cross Product Formula

- - \[\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} \] -
- -
-

The probability of getting \(k\) heads when flipping \(n\) coins is

- - \[P(E) = {n \choose k} p^k (1-p)^{ n-k} \] -
- -
-

An Identity of Ramanujan

- - \[ \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} } } } \] -
- -
-

A Rogers-Ramanujan Identity

- - \[ 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})}\] -
- -
-

Maxwell’s Equations

- - \[ \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} - \] -
- -
-
-

The Lorenz Equations

- -
- \[\begin{aligned} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{aligned} \] -
-
- -
-

The Cauchy-Schwarz Inequality

- -
- \[ \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) \] -
-
- -
-

A Cross Product Formula

- -
- \[\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} \] -
-
- -
-

The probability of getting \(k\) heads when flipping \(n\) coins is

- -
- \[P(E) = {n \choose k} p^k (1-p)^{ n-k} \] -
-
- -
-

An Identity of Ramanujan

- -
- \[ \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} } } } \] -
-
- -
-

A Rogers-Ramanujan Identity

- -
- \[ 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})}\] -
-
- -
-

Maxwell’s Equations

- -
- \[ \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} - \] -
-
-
- -
- -
- - - - - - - - diff --git a/docs/com/test/examples/slide-backgrounds.html b/docs/com/test/examples/slide-backgrounds.html deleted file mode 100755 index 4e5e40617..000000000 --- a/docs/com/test/examples/slide-backgrounds.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - reveal.js - Slide Backgrounds - - - - - - - - - - -
- -
- -
-

data-background: #00ffff

-
- -
-

data-background: #bb00bb

-
- -
-

data-background: lightblue

-
- -
-
-

data-background: #ff0000

-
-
-

data-background: rgba(0, 0, 0, 0.2)

-
-
-

data-background: salmon

-
-
- -
-
-

Background applied to stack

-
-
-

Background applied to stack

-
-
-

Background applied to slide inside of stack

-
-
- -
-

Background image

-
- -
-
-

Background image

-
-
-

Background image

-
-
- -
-

Background image

-
data-background-size="100px" data-background-repeat="repeat" data-background-color="#111"
-
- -
-

Same background twice (1/2)

-
-
-

Same background twice (2/2)

-
- -
-

Video background

-
- -
-

Iframe background

-
- -
-
-

Same background twice vertical (1/2)

-
-
-

Same background twice vertical (2/2)

-
-
- -
-

Same background from horizontal to vertical (1/3)

-
-
-
-

Same background from horizontal to vertical (2/3)

-
-
-

Same background from horizontal to vertical (3/3)

-
-
- -
- -
- - - - - - - - diff --git a/docs/com/test/examples/slide-transitions.html b/docs/com/test/examples/slide-transitions.html deleted file mode 100755 index 88119dc72..000000000 --- a/docs/com/test/examples/slide-transitions.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - reveal.js - Slide Transitions - - - - - - - - -
- -
- -
-

Default

-
- -
-

Default

-
- -
-

data-transition: zoom

-
- -
-

data-transition: zoom-in fade-out

-
- -
-

Default

-
- -
-

data-transition: convex

-
- -
-

data-transition: convex-in concave-out

-
- -
-
-

Default

-
-
-

data-transition: concave

-
-
-

data-transition: convex-in fade-out

-
-
-

Default

-
-
- -
-

data-transition: none

-
- -
-

Default

-
- -
- -
- - - - - - - - diff --git a/docs/com/test/qunit-1.12.0.css b/docs/com/test/qunit-1.12.0.css deleted file mode 100755 index 00ac1d3c7..000000000 --- a/docs/com/test/qunit-1.12.0.css +++ /dev/null @@ -1,244 +0,0 @@ -/** - * QUnit v1.12.0 - A JavaScript Unit Testing Framework - * - * http://qunitjs.com - * - * Copyright 2012 jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ - -/** Font Family and Sizes */ - -#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { - font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; -} - -#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } -#qunit-tests { font-size: smaller; } - - -/** Resets */ - -#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { - margin: 0; - padding: 0; -} - - -/** Header */ - -#qunit-header { - padding: 0.5em 0 0.5em 1em; - - color: #8699a4; - background-color: #0d3349; - - font-size: 1.5em; - line-height: 1em; - font-weight: normal; - - border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-top-right-radius: 5px; - -webkit-border-top-left-radius: 5px; -} - -#qunit-header a { - text-decoration: none; - color: #c2ccd1; -} - -#qunit-header a:hover, -#qunit-header a:focus { - color: #fff; -} - -#qunit-testrunner-toolbar label { - display: inline-block; - padding: 0 .5em 0 .1em; -} - -#qunit-banner { - height: 5px; -} - -#qunit-testrunner-toolbar { - padding: 0.5em 0 0.5em 2em; - color: #5E740B; - background-color: #eee; - overflow: hidden; -} - -#qunit-userAgent { - padding: 0.5em 0 0.5em 2.5em; - background-color: #2b81af; - color: #fff; - text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; -} - -#qunit-modulefilter-container { - float: right; -} - -/** Tests: Pass/Fail */ - -#qunit-tests { - list-style-position: inside; -} - -#qunit-tests li { - padding: 0.4em 0.5em 0.4em 2.5em; - border-bottom: 1px solid #fff; - list-style-position: inside; -} - -#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { - display: none; -} - -#qunit-tests li strong { - cursor: pointer; -} - -#qunit-tests li a { - padding: 0.5em; - color: #c2ccd1; - text-decoration: none; -} -#qunit-tests li a:hover, -#qunit-tests li a:focus { - color: #000; -} - -#qunit-tests li .runtime { - float: right; - font-size: smaller; -} - -.qunit-assert-list { - margin-top: 0.5em; - padding: 0.5em; - - background-color: #fff; - - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - -.qunit-collapsed { - display: none; -} - -#qunit-tests table { - border-collapse: collapse; - margin-top: .2em; -} - -#qunit-tests th { - text-align: right; - vertical-align: top; - padding: 0 .5em 0 0; -} - -#qunit-tests td { - vertical-align: top; -} - -#qunit-tests pre { - margin: 0; - white-space: pre-wrap; - word-wrap: break-word; -} - -#qunit-tests del { - background-color: #e0f2be; - color: #374e0c; - text-decoration: none; -} - -#qunit-tests ins { - background-color: #ffcaca; - color: #500; - text-decoration: none; -} - -/*** Test Counts */ - -#qunit-tests b.counts { color: black; } -#qunit-tests b.passed { color: #5E740B; } -#qunit-tests b.failed { color: #710909; } - -#qunit-tests li li { - padding: 5px; - background-color: #fff; - border-bottom: none; - list-style-position: inside; -} - -/*** Passing Styles */ - -#qunit-tests li li.pass { - color: #3c510c; - background-color: #fff; - border-left: 10px solid #C6E746; -} - -#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } -#qunit-tests .pass .test-name { color: #366097; } - -#qunit-tests .pass .test-actual, -#qunit-tests .pass .test-expected { color: #999999; } - -#qunit-banner.qunit-pass { background-color: #C6E746; } - -/*** Failing Styles */ - -#qunit-tests li li.fail { - color: #710909; - background-color: #fff; - border-left: 10px solid #EE5757; - white-space: pre; -} - -#qunit-tests > li:last-child { - border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - -webkit-border-bottom-right-radius: 5px; - -webkit-border-bottom-left-radius: 5px; -} - -#qunit-tests .fail { color: #000000; background-color: #EE5757; } -#qunit-tests .fail .test-name, -#qunit-tests .fail .module-name { color: #000000; } - -#qunit-tests .fail .test-actual { color: #EE5757; } -#qunit-tests .fail .test-expected { color: green; } - -#qunit-banner.qunit-fail { background-color: #EE5757; } - - -/** Result */ - -#qunit-testresult { - padding: 0.5em 0.5em 0.5em 2.5em; - - color: #2b81af; - background-color: #D2E0E6; - - border-bottom: 1px solid white; -} -#qunit-testresult .module-name { - font-weight: bold; -} - -/** Fixture */ - -#qunit-fixture { - position: absolute; - top: -10000px; - left: -10000px; - width: 1000px; - height: 1000px; -} \ No newline at end of file diff --git a/docs/com/test/qunit-1.12.0.js b/docs/com/test/qunit-1.12.0.js deleted file mode 100755 index 61af483d2..000000000 --- a/docs/com/test/qunit-1.12.0.js +++ /dev/null @@ -1,2212 +0,0 @@ -/** - * QUnit v1.12.0 - A JavaScript Unit Testing Framework - * - * http://qunitjs.com - * - * Copyright 2013 jQuery Foundation and other contributors - * Released under the MIT license. - * https://jquery.org/license/ - */ - -(function( window ) { - -var QUnit, - assert, - config, - onErrorFnPrev, - testId = 0, - fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""), - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - // Keep a local reference to Date (GH-283) - Date = window.Date, - setTimeout = window.setTimeout, - defined = { - setTimeout: typeof window.setTimeout !== "undefined", - sessionStorage: (function() { - var x = "qunit-test-string"; - try { - sessionStorage.setItem( x, x ); - sessionStorage.removeItem( x ); - return true; - } catch( e ) { - return false; - } - }()) - }, - /** - * Provides a normalized error string, correcting an issue - * with IE 7 (and prior) where Error.prototype.toString is - * not properly implemented - * - * Based on http://es5.github.com/#x15.11.4.4 - * - * @param {String|Error} error - * @return {String} error message - */ - errorString = function( error ) { - var name, message, - errorString = error.toString(); - if ( errorString.substring( 0, 7 ) === "[object" ) { - name = error.name ? error.name.toString() : "Error"; - message = error.message ? error.message.toString() : ""; - if ( name && message ) { - return name + ": " + message; - } else if ( name ) { - return name; - } else if ( message ) { - return message; - } else { - return "Error"; - } - } else { - return errorString; - } - }, - /** - * Makes a clone of an object using only Array or Object as base, - * and copies over the own enumerable properties. - * - * @param {Object} obj - * @return {Object} New object with only the own properties (recursively). - */ - objectValues = function( obj ) { - // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392. - /*jshint newcap: false */ - var key, val, - vals = QUnit.is( "array", obj ) ? [] : {}; - for ( key in obj ) { - if ( hasOwn.call( obj, key ) ) { - val = obj[key]; - vals[key] = val === Object(val) ? objectValues(val) : val; - } - } - return vals; - }; - -function Test( settings ) { - extend( this, settings ); - this.assertions = []; - this.testNumber = ++Test.count; -} - -Test.count = 0; - -Test.prototype = { - init: function() { - var a, b, li, - tests = id( "qunit-tests" ); - - if ( tests ) { - b = document.createElement( "strong" ); - b.innerHTML = this.nameHtml; - - // `a` initialized at top of scope - a = document.createElement( "a" ); - a.innerHTML = "Rerun"; - a.href = QUnit.url({ testNumber: this.testNumber }); - - li = document.createElement( "li" ); - li.appendChild( b ); - li.appendChild( a ); - li.className = "running"; - li.id = this.id = "qunit-test-output" + testId++; - - tests.appendChild( li ); - } - }, - setup: function() { - if ( - // Emit moduleStart when we're switching from one module to another - this.module !== config.previousModule || - // They could be equal (both undefined) but if the previousModule property doesn't - // yet exist it means this is the first test in a suite that isn't wrapped in a - // module, in which case we'll just emit a moduleStart event for 'undefined'. - // Without this, reporters can get testStart before moduleStart which is a problem. - !hasOwn.call( config, "previousModule" ) - ) { - if ( hasOwn.call( config, "previousModule" ) ) { - runLoggingCallbacks( "moduleDone", QUnit, { - name: config.previousModule, - failed: config.moduleStats.bad, - passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all - }); - } - config.previousModule = this.module; - config.moduleStats = { all: 0, bad: 0 }; - runLoggingCallbacks( "moduleStart", QUnit, { - name: this.module - }); - } - - config.current = this; - - this.testEnvironment = extend({ - setup: function() {}, - teardown: function() {} - }, this.moduleTestEnvironment ); - - this.started = +new Date(); - runLoggingCallbacks( "testStart", QUnit, { - name: this.testName, - module: this.module - }); - - /*jshint camelcase:false */ - - - /** - * Expose the current test environment. - * - * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead. - */ - QUnit.current_testEnvironment = this.testEnvironment; - - /*jshint camelcase:true */ - - if ( !config.pollution ) { - saveGlobal(); - } - if ( config.notrycatch ) { - this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert ); - return; - } - try { - this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert ); - } catch( e ) { - QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); - } - }, - run: function() { - config.current = this; - - var running = id( "qunit-testresult" ); - - if ( running ) { - running.innerHTML = "Running:
" + this.nameHtml; - } - - if ( this.async ) { - QUnit.stop(); - } - - this.callbackStarted = +new Date(); - - if ( config.notrycatch ) { - this.callback.call( this.testEnvironment, QUnit.assert ); - this.callbackRuntime = +new Date() - this.callbackStarted; - return; - } - - try { - this.callback.call( this.testEnvironment, QUnit.assert ); - this.callbackRuntime = +new Date() - this.callbackStarted; - } catch( e ) { - this.callbackRuntime = +new Date() - this.callbackStarted; - - QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); - // else next test will carry the responsibility - saveGlobal(); - - // Restart the tests if they're blocking - if ( config.blocking ) { - QUnit.start(); - } - } - }, - teardown: function() { - config.current = this; - if ( config.notrycatch ) { - if ( typeof this.callbackRuntime === "undefined" ) { - this.callbackRuntime = +new Date() - this.callbackStarted; - } - this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert ); - return; - } else { - try { - this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert ); - } catch( e ) { - QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); - } - } - checkPollution(); - }, - finish: function() { - config.current = this; - if ( config.requireExpects && this.expected === null ) { - QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack ); - } else if ( this.expected !== null && this.expected !== this.assertions.length ) { - QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack ); - } else if ( this.expected === null && !this.assertions.length ) { - QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack ); - } - - var i, assertion, a, b, time, li, ol, - test = this, - good = 0, - bad = 0, - tests = id( "qunit-tests" ); - - this.runtime = +new Date() - this.started; - config.stats.all += this.assertions.length; - config.moduleStats.all += this.assertions.length; - - if ( tests ) { - ol = document.createElement( "ol" ); - ol.className = "qunit-assert-list"; - - for ( i = 0; i < this.assertions.length; i++ ) { - assertion = this.assertions[i]; - - li = document.createElement( "li" ); - li.className = assertion.result ? "pass" : "fail"; - li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" ); - ol.appendChild( li ); - - if ( assertion.result ) { - good++; - } else { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - - // store result when possible - if ( QUnit.config.reorder && defined.sessionStorage ) { - if ( bad ) { - sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad ); - } else { - sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName ); - } - } - - if ( bad === 0 ) { - addClass( ol, "qunit-collapsed" ); - } - - // `b` initialized at top of scope - b = document.createElement( "strong" ); - b.innerHTML = this.nameHtml + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; - - addEvent(b, "click", function() { - var next = b.parentNode.lastChild, - collapsed = hasClass( next, "qunit-collapsed" ); - ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" ); - }); - - addEvent(b, "dblclick", function( e ) { - var target = e && e.target ? e.target : window.event.srcElement; - if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) { - target = target.parentNode; - } - if ( window.location && target.nodeName.toLowerCase() === "strong" ) { - window.location = QUnit.url({ testNumber: test.testNumber }); - } - }); - - // `time` initialized at top of scope - time = document.createElement( "span" ); - time.className = "runtime"; - time.innerHTML = this.runtime + " ms"; - - // `li` initialized at top of scope - li = id( this.id ); - li.className = bad ? "fail" : "pass"; - li.removeChild( li.firstChild ); - a = li.firstChild; - li.appendChild( b ); - li.appendChild( a ); - li.appendChild( time ); - li.appendChild( ol ); - - } else { - for ( i = 0; i < this.assertions.length; i++ ) { - if ( !this.assertions[i].result ) { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - } - - runLoggingCallbacks( "testDone", QUnit, { - name: this.testName, - module: this.module, - failed: bad, - passed: this.assertions.length - bad, - total: this.assertions.length, - duration: this.runtime - }); - - QUnit.reset(); - - config.current = undefined; - }, - - queue: function() { - var bad, - test = this; - - synchronize(function() { - test.init(); - }); - function run() { - // each of these can by async - synchronize(function() { - test.setup(); - }); - synchronize(function() { - test.run(); - }); - synchronize(function() { - test.teardown(); - }); - synchronize(function() { - test.finish(); - }); - } - - // `bad` initialized at top of scope - // defer when previous test run passed, if storage is available - bad = QUnit.config.reorder && defined.sessionStorage && - +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName ); - - if ( bad ) { - run(); - } else { - synchronize( run, true ); - } - } -}; - -// Root QUnit object. -// `QUnit` initialized at top of scope -QUnit = { - - // call on start of module test to prepend name to all tests - module: function( name, testEnvironment ) { - config.currentModule = name; - config.currentModuleTestEnvironment = testEnvironment; - config.modules[name] = true; - }, - - asyncTest: function( testName, expected, callback ) { - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - QUnit.test( testName, expected, callback, true ); - }, - - test: function( testName, expected, callback, async ) { - var test, - nameHtml = "" + escapeText( testName ) + ""; - - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - if ( config.currentModule ) { - nameHtml = "" + escapeText( config.currentModule ) + ": " + nameHtml; - } - - test = new Test({ - nameHtml: nameHtml, - testName: testName, - expected: expected, - async: async, - callback: callback, - module: config.currentModule, - moduleTestEnvironment: config.currentModuleTestEnvironment, - stack: sourceFromStacktrace( 2 ) - }); - - if ( !validTest( test ) ) { - return; - } - - test.queue(); - }, - - // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through. - expect: function( asserts ) { - if (arguments.length === 1) { - config.current.expected = asserts; - } else { - return config.current.expected; - } - }, - - start: function( count ) { - // QUnit hasn't been initialized yet. - // Note: RequireJS (et al) may delay onLoad - if ( config.semaphore === undefined ) { - QUnit.begin(function() { - // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first - setTimeout(function() { - QUnit.start( count ); - }); - }); - return; - } - - config.semaphore -= count || 1; - // don't start until equal number of stop-calls - if ( config.semaphore > 0 ) { - return; - } - // ignore if start is called more often then stop - if ( config.semaphore < 0 ) { - config.semaphore = 0; - QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) ); - return; - } - // A slight delay, to avoid any current callbacks - if ( defined.setTimeout ) { - setTimeout(function() { - if ( config.semaphore > 0 ) { - return; - } - if ( config.timeout ) { - clearTimeout( config.timeout ); - } - - config.blocking = false; - process( true ); - }, 13); - } else { - config.blocking = false; - process( true ); - } - }, - - stop: function( count ) { - config.semaphore += count || 1; - config.blocking = true; - - if ( config.testTimeout && defined.setTimeout ) { - clearTimeout( config.timeout ); - config.timeout = setTimeout(function() { - QUnit.ok( false, "Test timed out" ); - config.semaphore = 1; - QUnit.start(); - }, config.testTimeout ); - } - } -}; - -// `assert` initialized at top of scope -// Assert helpers -// All of these must either call QUnit.push() or manually do: -// - runLoggingCallbacks( "log", .. ); -// - config.current.assertions.push({ .. }); -// We attach it to the QUnit object *after* we expose the public API, -// otherwise `assert` will become a global variable in browsers (#341). -assert = { - /** - * Asserts rough true-ish result. - * @name ok - * @function - * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); - */ - ok: function( result, msg ) { - if ( !config.current ) { - throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) ); - } - result = !!result; - msg = msg || (result ? "okay" : "failed" ); - - var source, - details = { - module: config.current.module, - name: config.current.testName, - result: result, - message: msg - }; - - msg = "" + escapeText( msg ) + ""; - - if ( !result ) { - source = sourceFromStacktrace( 2 ); - if ( source ) { - details.source = source; - msg += "
Source:
" + escapeText( source ) + "
"; - } - } - runLoggingCallbacks( "log", QUnit, details ); - config.current.assertions.push({ - result: result, - message: msg - }); - }, - - /** - * Assert that the first two arguments are equal, with an optional message. - * Prints out both actual and expected values. - * @name equal - * @function - * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" ); - */ - equal: function( actual, expected, message ) { - /*jshint eqeqeq:false */ - QUnit.push( expected == actual, actual, expected, message ); - }, - - /** - * @name notEqual - * @function - */ - notEqual: function( actual, expected, message ) { - /*jshint eqeqeq:false */ - QUnit.push( expected != actual, actual, expected, message ); - }, - - /** - * @name propEqual - * @function - */ - propEqual: function( actual, expected, message ) { - actual = objectValues(actual); - expected = objectValues(expected); - QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name notPropEqual - * @function - */ - notPropEqual: function( actual, expected, message ) { - actual = objectValues(actual); - expected = objectValues(expected); - QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name deepEqual - * @function - */ - deepEqual: function( actual, expected, message ) { - QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name notDeepEqual - * @function - */ - notDeepEqual: function( actual, expected, message ) { - QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name strictEqual - * @function - */ - strictEqual: function( actual, expected, message ) { - QUnit.push( expected === actual, actual, expected, message ); - }, - - /** - * @name notStrictEqual - * @function - */ - notStrictEqual: function( actual, expected, message ) { - QUnit.push( expected !== actual, actual, expected, message ); - }, - - "throws": function( block, expected, message ) { - var actual, - expectedOutput = expected, - ok = false; - - // 'expected' is optional - if ( typeof expected === "string" ) { - message = expected; - expected = null; - } - - config.current.ignoreGlobalErrors = true; - try { - block.call( config.current.testEnvironment ); - } catch (e) { - actual = e; - } - config.current.ignoreGlobalErrors = false; - - if ( actual ) { - // we don't want to validate thrown error - if ( !expected ) { - ok = true; - expectedOutput = null; - // expected is a regexp - } else if ( QUnit.objectType( expected ) === "regexp" ) { - ok = expected.test( errorString( actual ) ); - // expected is a constructor - } else if ( actual instanceof expected ) { - ok = true; - // expected is a validation function which returns true is validation passed - } else if ( expected.call( {}, actual ) === true ) { - expectedOutput = null; - ok = true; - } - - QUnit.push( ok, actual, expectedOutput, message ); - } else { - QUnit.pushFailure( message, null, "No exception was thrown." ); - } - } -}; - -/** - * @deprecated since 1.8.0 - * Kept assertion helpers in root for backwards compatibility. - */ -extend( QUnit, assert ); - -/** - * @deprecated since 1.9.0 - * Kept root "raises()" for backwards compatibility. - * (Note that we don't introduce assert.raises). - */ -QUnit.raises = assert[ "throws" ]; - -/** - * @deprecated since 1.0.0, replaced with error pushes since 1.3.0 - * Kept to avoid TypeErrors for undefined methods. - */ -QUnit.equals = function() { - QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" ); -}; -QUnit.same = function() { - QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" ); -}; - -// We want access to the constructor's prototype -(function() { - function F() {} - F.prototype = QUnit; - QUnit = new F(); - // Make F QUnit's constructor so that we can add to the prototype later - QUnit.constructor = F; -}()); - -/** - * Config object: Maintain internal state - * Later exposed as QUnit.config - * `config` initialized at top of scope - */ -config = { - // The queue of tests to run - queue: [], - - // block until document ready - blocking: true, - - // when enabled, show only failing tests - // gets persisted through sessionStorage and can be changed in UI via checkbox - hidepassed: false, - - // by default, run previously failed tests first - // very useful in combination with "Hide passed tests" checked - reorder: true, - - // by default, modify document.title when suite is done - altertitle: true, - - // when enabled, all tests must call expect() - requireExpects: false, - - // add checkboxes that are persisted in the query-string - // when enabled, the id is set to `true` as a `QUnit.config` property - urlConfig: [ - { - id: "noglobals", - label: "Check for Globals", - tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings." - }, - { - id: "notrycatch", - label: "No try-catch", - tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings." - } - ], - - // Set of all modules. - modules: {}, - - // logging callback queues - begin: [], - done: [], - log: [], - testStart: [], - testDone: [], - moduleStart: [], - moduleDone: [] -}; - -// Export global variables, unless an 'exports' object exists, -// in that case we assume we're in CommonJS (dealt with on the bottom of the script) -if ( typeof exports === "undefined" ) { - extend( window, QUnit.constructor.prototype ); - - // Expose QUnit object - window.QUnit = QUnit; -} - -// Initialize more QUnit.config and QUnit.urlParams -(function() { - var i, - location = window.location || { search: "", protocol: "file:" }, - params = location.search.slice( 1 ).split( "&" ), - length = params.length, - urlParams = {}, - current; - - if ( params[ 0 ] ) { - for ( i = 0; i < length; i++ ) { - current = params[ i ].split( "=" ); - current[ 0 ] = decodeURIComponent( current[ 0 ] ); - // allow just a key to turn on a flag, e.g., test.html?noglobals - current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; - urlParams[ current[ 0 ] ] = current[ 1 ]; - } - } - - QUnit.urlParams = urlParams; - - // String search anywhere in moduleName+testName - config.filter = urlParams.filter; - - // Exact match of the module name - config.module = urlParams.module; - - config.testNumber = parseInt( urlParams.testNumber, 10 ) || null; - - // Figure out if we're running the tests from a server or not - QUnit.isLocal = location.protocol === "file:"; -}()); - -// Extend QUnit object, -// these after set here because they should not be exposed as global functions -extend( QUnit, { - assert: assert, - - config: config, - - // Initialize the configuration options - init: function() { - extend( config, { - stats: { all: 0, bad: 0 }, - moduleStats: { all: 0, bad: 0 }, - started: +new Date(), - updateRate: 1000, - blocking: false, - autostart: true, - autorun: false, - filter: "", - queue: [], - semaphore: 1 - }); - - var tests, banner, result, - qunit = id( "qunit" ); - - if ( qunit ) { - qunit.innerHTML = - "

" + escapeText( document.title ) + "

" + - "

" + - "
" + - "

" + - "
    "; - } - - tests = id( "qunit-tests" ); - banner = id( "qunit-banner" ); - result = id( "qunit-testresult" ); - - if ( tests ) { - tests.innerHTML = ""; - } - - if ( banner ) { - banner.className = ""; - } - - if ( result ) { - result.parentNode.removeChild( result ); - } - - if ( tests ) { - result = document.createElement( "p" ); - result.id = "qunit-testresult"; - result.className = "result"; - tests.parentNode.insertBefore( result, tests ); - result.innerHTML = "Running...
     "; - } - }, - - // Resets the test setup. Useful for tests that modify the DOM. - /* - DEPRECATED: Use multiple tests instead of resetting inside a test. - Use testStart or testDone for custom cleanup. - This method will throw an error in 2.0, and will be removed in 2.1 - */ - reset: function() { - var fixture = id( "qunit-fixture" ); - if ( fixture ) { - fixture.innerHTML = config.fixture; - } - }, - - // Trigger an event on an element. - // @example triggerEvent( document.body, "click" ); - triggerEvent: function( elem, type, event ) { - if ( document.createEvent ) { - event = document.createEvent( "MouseEvents" ); - event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, - 0, 0, 0, 0, 0, false, false, false, false, 0, null); - - elem.dispatchEvent( event ); - } else if ( elem.fireEvent ) { - elem.fireEvent( "on" + type ); - } - }, - - // Safe object type checking - is: function( type, obj ) { - return QUnit.objectType( obj ) === type; - }, - - objectType: function( obj ) { - if ( typeof obj === "undefined" ) { - return "undefined"; - // consider: typeof null === object - } - if ( obj === null ) { - return "null"; - } - - var match = toString.call( obj ).match(/^\[object\s(.*)\]$/), - type = match && match[1] || ""; - - switch ( type ) { - case "Number": - if ( isNaN(obj) ) { - return "nan"; - } - return "number"; - case "String": - case "Boolean": - case "Array": - case "Date": - case "RegExp": - case "Function": - return type.toLowerCase(); - } - if ( typeof obj === "object" ) { - return "object"; - } - return undefined; - }, - - push: function( result, actual, expected, message ) { - if ( !config.current ) { - throw new Error( "assertion outside test context, was " + sourceFromStacktrace() ); - } - - var output, source, - details = { - module: config.current.module, - name: config.current.testName, - result: result, - message: message, - actual: actual, - expected: expected - }; - - message = escapeText( message ) || ( result ? "okay" : "failed" ); - message = "" + message + ""; - output = message; - - if ( !result ) { - expected = escapeText( QUnit.jsDump.parse(expected) ); - actual = escapeText( QUnit.jsDump.parse(actual) ); - output += ""; - - if ( actual !== expected ) { - output += ""; - output += ""; - } - - source = sourceFromStacktrace(); - - if ( source ) { - details.source = source; - output += ""; - } - - output += "
    Expected:
    " + expected + "
    Result:
    " + actual + "
    Diff:
    " + QUnit.diff( expected, actual ) + "
    Source:
    " + escapeText( source ) + "
    "; - } - - runLoggingCallbacks( "log", QUnit, details ); - - config.current.assertions.push({ - result: !!result, - message: output - }); - }, - - pushFailure: function( message, source, actual ) { - if ( !config.current ) { - throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) ); - } - - var output, - details = { - module: config.current.module, - name: config.current.testName, - result: false, - message: message - }; - - message = escapeText( message ) || "error"; - message = "" + message + ""; - output = message; - - output += ""; - - if ( actual ) { - output += ""; - } - - if ( source ) { - details.source = source; - output += ""; - } - - output += "
    Result:
    " + escapeText( actual ) + "
    Source:
    " + escapeText( source ) + "
    "; - - runLoggingCallbacks( "log", QUnit, details ); - - config.current.assertions.push({ - result: false, - message: output - }); - }, - - url: function( params ) { - params = extend( extend( {}, QUnit.urlParams ), params ); - var key, - querystring = "?"; - - for ( key in params ) { - if ( hasOwn.call( params, key ) ) { - querystring += encodeURIComponent( key ) + "=" + - encodeURIComponent( params[ key ] ) + "&"; - } - } - return window.location.protocol + "//" + window.location.host + - window.location.pathname + querystring.slice( 0, -1 ); - }, - - extend: extend, - id: id, - addEvent: addEvent, - addClass: addClass, - hasClass: hasClass, - removeClass: removeClass - // load, equiv, jsDump, diff: Attached later -}); - -/** - * @deprecated: Created for backwards compatibility with test runner that set the hook function - * into QUnit.{hook}, instead of invoking it and passing the hook function. - * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here. - * Doing this allows us to tell if the following methods have been overwritten on the actual - * QUnit object. - */ -extend( QUnit.constructor.prototype, { - - // Logging callbacks; all receive a single argument with the listed properties - // run test/logs.html for any related changes - begin: registerLoggingCallback( "begin" ), - - // done: { failed, passed, total, runtime } - done: registerLoggingCallback( "done" ), - - // log: { result, actual, expected, message } - log: registerLoggingCallback( "log" ), - - // testStart: { name } - testStart: registerLoggingCallback( "testStart" ), - - // testDone: { name, failed, passed, total, duration } - testDone: registerLoggingCallback( "testDone" ), - - // moduleStart: { name } - moduleStart: registerLoggingCallback( "moduleStart" ), - - // moduleDone: { name, failed, passed, total } - moduleDone: registerLoggingCallback( "moduleDone" ) -}); - -if ( typeof document === "undefined" || document.readyState === "complete" ) { - config.autorun = true; -} - -QUnit.load = function() { - runLoggingCallbacks( "begin", QUnit, {} ); - - // Initialize the config, saving the execution queue - var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, - urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter, - numModules = 0, - moduleNames = [], - moduleFilterHtml = "", - urlConfigHtml = "", - oldconfig = extend( {}, config ); - - QUnit.init(); - extend(config, oldconfig); - - config.blocking = false; - - len = config.urlConfig.length; - - for ( i = 0; i < len; i++ ) { - val = config.urlConfig[i]; - if ( typeof val === "string" ) { - val = { - id: val, - label: val, - tooltip: "[no tooltip available]" - }; - } - config[ val.id ] = QUnit.urlParams[ val.id ]; - urlConfigHtml += ""; - } - for ( i in config.modules ) { - if ( config.modules.hasOwnProperty( i ) ) { - moduleNames.push(i); - } - } - numModules = moduleNames.length; - moduleNames.sort( function( a, b ) { - return a.localeCompare( b ); - }); - moduleFilterHtml += ""; - - // `userAgent` initialized at top of scope - userAgent = id( "qunit-userAgent" ); - if ( userAgent ) { - userAgent.innerHTML = navigator.userAgent; - } - - // `banner` initialized at top of scope - banner = id( "qunit-header" ); - if ( banner ) { - banner.innerHTML = "" + banner.innerHTML + " "; - } - - // `toolbar` initialized at top of scope - toolbar = id( "qunit-testrunner-toolbar" ); - if ( toolbar ) { - // `filter` initialized at top of scope - filter = document.createElement( "input" ); - filter.type = "checkbox"; - filter.id = "qunit-filter-pass"; - - addEvent( filter, "click", function() { - var tmp, - ol = document.getElementById( "qunit-tests" ); - - if ( filter.checked ) { - ol.className = ol.className + " hidepass"; - } else { - tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " "; - ol.className = tmp.replace( / hidepass /, " " ); - } - if ( defined.sessionStorage ) { - if (filter.checked) { - sessionStorage.setItem( "qunit-filter-passed-tests", "true" ); - } else { - sessionStorage.removeItem( "qunit-filter-passed-tests" ); - } - } - }); - - if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) { - filter.checked = true; - // `ol` initialized at top of scope - ol = document.getElementById( "qunit-tests" ); - ol.className = ol.className + " hidepass"; - } - toolbar.appendChild( filter ); - - // `label` initialized at top of scope - label = document.createElement( "label" ); - label.setAttribute( "for", "qunit-filter-pass" ); - label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." ); - label.innerHTML = "Hide passed tests"; - toolbar.appendChild( label ); - - urlConfigCheckboxesContainer = document.createElement("span"); - urlConfigCheckboxesContainer.innerHTML = urlConfigHtml; - urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input"); - // For oldIE support: - // * Add handlers to the individual elements instead of the container - // * Use "click" instead of "change" - // * Fallback from event.target to event.srcElement - addEvents( urlConfigCheckboxes, "click", function( event ) { - var params = {}, - target = event.target || event.srcElement; - params[ target.name ] = target.checked ? true : undefined; - window.location = QUnit.url( params ); - }); - toolbar.appendChild( urlConfigCheckboxesContainer ); - - if (numModules > 1) { - moduleFilter = document.createElement( "span" ); - moduleFilter.setAttribute( "id", "qunit-modulefilter-container" ); - moduleFilter.innerHTML = moduleFilterHtml; - addEvent( moduleFilter.lastChild, "change", function() { - var selectBox = moduleFilter.getElementsByTagName("select")[0], - selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value); - - window.location = QUnit.url({ - module: ( selectedModule === "" ) ? undefined : selectedModule, - // Remove any existing filters - filter: undefined, - testNumber: undefined - }); - }); - toolbar.appendChild(moduleFilter); - } - } - - // `main` initialized at top of scope - main = id( "qunit-fixture" ); - if ( main ) { - config.fixture = main.innerHTML; - } - - if ( config.autostart ) { - QUnit.start(); - } -}; - -addEvent( window, "load", QUnit.load ); - -// `onErrorFnPrev` initialized at top of scope -// Preserve other handlers -onErrorFnPrev = window.onerror; - -// Cover uncaught exceptions -// Returning true will suppress the default browser handler, -// returning false will let it run. -window.onerror = function ( error, filePath, linerNr ) { - var ret = false; - if ( onErrorFnPrev ) { - ret = onErrorFnPrev( error, filePath, linerNr ); - } - - // Treat return value as window.onerror itself does, - // Only do our handling if not suppressed. - if ( ret !== true ) { - if ( QUnit.config.current ) { - if ( QUnit.config.current.ignoreGlobalErrors ) { - return true; - } - QUnit.pushFailure( error, filePath + ":" + linerNr ); - } else { - QUnit.test( "global failure", extend( function() { - QUnit.pushFailure( error, filePath + ":" + linerNr ); - }, { validTest: validTest } ) ); - } - return false; - } - - return ret; -}; - -function done() { - config.autorun = true; - - // Log the last module results - if ( config.currentModule ) { - runLoggingCallbacks( "moduleDone", QUnit, { - name: config.currentModule, - failed: config.moduleStats.bad, - passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all - }); - } - delete config.previousModule; - - var i, key, - banner = id( "qunit-banner" ), - tests = id( "qunit-tests" ), - runtime = +new Date() - config.started, - passed = config.stats.all - config.stats.bad, - html = [ - "Tests completed in ", - runtime, - " milliseconds.
    ", - "", - passed, - " assertions of ", - config.stats.all, - " passed, ", - config.stats.bad, - " failed." - ].join( "" ); - - if ( banner ) { - banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" ); - } - - if ( tests ) { - id( "qunit-testresult" ).innerHTML = html; - } - - if ( config.altertitle && typeof document !== "undefined" && document.title ) { - // show ✖ for good, ✔ for bad suite result in title - // use escape sequences in case file gets loaded with non-utf-8-charset - document.title = [ - ( config.stats.bad ? "\u2716" : "\u2714" ), - document.title.replace( /^[\u2714\u2716] /i, "" ) - ].join( " " ); - } - - // clear own sessionStorage items if all tests passed - if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) { - // `key` & `i` initialized at top of scope - for ( i = 0; i < sessionStorage.length; i++ ) { - key = sessionStorage.key( i++ ); - if ( key.indexOf( "qunit-test-" ) === 0 ) { - sessionStorage.removeItem( key ); - } - } - } - - // scroll back to top to show results - if ( window.scrollTo ) { - window.scrollTo(0, 0); - } - - runLoggingCallbacks( "done", QUnit, { - failed: config.stats.bad, - passed: passed, - total: config.stats.all, - runtime: runtime - }); -} - -/** @return Boolean: true if this test should be ran */ -function validTest( test ) { - var include, - filter = config.filter && config.filter.toLowerCase(), - module = config.module && config.module.toLowerCase(), - fullName = (test.module + ": " + test.testName).toLowerCase(); - - // Internally-generated tests are always valid - if ( test.callback && test.callback.validTest === validTest ) { - delete test.callback.validTest; - return true; - } - - if ( config.testNumber ) { - return test.testNumber === config.testNumber; - } - - if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) { - return false; - } - - if ( !filter ) { - return true; - } - - include = filter.charAt( 0 ) !== "!"; - if ( !include ) { - filter = filter.slice( 1 ); - } - - // If the filter matches, we need to honour include - if ( fullName.indexOf( filter ) !== -1 ) { - return include; - } - - // Otherwise, do the opposite - return !include; -} - -// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions) -// Later Safari and IE10 are supposed to support error.stack as well -// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack -function extractStacktrace( e, offset ) { - offset = offset === undefined ? 3 : offset; - - var stack, include, i; - - if ( e.stacktrace ) { - // Opera - return e.stacktrace.split( "\n" )[ offset + 3 ]; - } else if ( e.stack ) { - // Firefox, Chrome - stack = e.stack.split( "\n" ); - if (/^error$/i.test( stack[0] ) ) { - stack.shift(); - } - if ( fileName ) { - include = []; - for ( i = offset; i < stack.length; i++ ) { - if ( stack[ i ].indexOf( fileName ) !== -1 ) { - break; - } - include.push( stack[ i ] ); - } - if ( include.length ) { - return include.join( "\n" ); - } - } - return stack[ offset ]; - } else if ( e.sourceURL ) { - // Safari, PhantomJS - // hopefully one day Safari provides actual stacktraces - // exclude useless self-reference for generated Error objects - if ( /qunit.js$/.test( e.sourceURL ) ) { - return; - } - // for actual exceptions, this is useful - return e.sourceURL + ":" + e.line; - } -} -function sourceFromStacktrace( offset ) { - try { - throw new Error(); - } catch ( e ) { - return extractStacktrace( e, offset ); - } -} - -/** - * Escape text for attribute or text content. - */ -function escapeText( s ) { - if ( !s ) { - return ""; - } - s = s + ""; - // Both single quotes and double quotes (for attributes) - return s.replace( /['"<>&]/g, function( s ) { - switch( s ) { - case "'": - return "'"; - case "\"": - return """; - case "<": - return "<"; - case ">": - return ">"; - case "&": - return "&"; - } - }); -} - -function synchronize( callback, last ) { - config.queue.push( callback ); - - if ( config.autorun && !config.blocking ) { - process( last ); - } -} - -function process( last ) { - function next() { - process( last ); - } - var start = new Date().getTime(); - config.depth = config.depth ? config.depth + 1 : 1; - - while ( config.queue.length && !config.blocking ) { - if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) { - config.queue.shift()(); - } else { - setTimeout( next, 13 ); - break; - } - } - config.depth--; - if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) { - done(); - } -} - -function saveGlobal() { - config.pollution = []; - - if ( config.noglobals ) { - for ( var key in window ) { - if ( hasOwn.call( window, key ) ) { - // in Opera sometimes DOM element ids show up here, ignore them - if ( /^qunit-test-output/.test( key ) ) { - continue; - } - config.pollution.push( key ); - } - } - } -} - -function checkPollution() { - var newGlobals, - deletedGlobals, - old = config.pollution; - - saveGlobal(); - - newGlobals = diff( config.pollution, old ); - if ( newGlobals.length > 0 ) { - QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") ); - } - - deletedGlobals = diff( old, config.pollution ); - if ( deletedGlobals.length > 0 ) { - QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") ); - } -} - -// returns a new Array with the elements that are in a but not in b -function diff( a, b ) { - var i, j, - result = a.slice(); - - for ( i = 0; i < result.length; i++ ) { - for ( j = 0; j < b.length; j++ ) { - if ( result[i] === b[j] ) { - result.splice( i, 1 ); - i--; - break; - } - } - } - return result; -} - -function extend( a, b ) { - for ( var prop in b ) { - if ( hasOwn.call( b, prop ) ) { - // Avoid "Member not found" error in IE8 caused by messing with window.constructor - if ( !( prop === "constructor" && a === window ) ) { - if ( b[ prop ] === undefined ) { - delete a[ prop ]; - } else { - a[ prop ] = b[ prop ]; - } - } - } - } - - return a; -} - -/** - * @param {HTMLElement} elem - * @param {string} type - * @param {Function} fn - */ -function addEvent( elem, type, fn ) { - // Standards-based browsers - if ( elem.addEventListener ) { - elem.addEventListener( type, fn, false ); - // IE - } else { - elem.attachEvent( "on" + type, fn ); - } -} - -/** - * @param {Array|NodeList} elems - * @param {string} type - * @param {Function} fn - */ -function addEvents( elems, type, fn ) { - var i = elems.length; - while ( i-- ) { - addEvent( elems[i], type, fn ); - } -} - -function hasClass( elem, name ) { - return (" " + elem.className + " ").indexOf(" " + name + " ") > -1; -} - -function addClass( elem, name ) { - if ( !hasClass( elem, name ) ) { - elem.className += (elem.className ? " " : "") + name; - } -} - -function removeClass( elem, name ) { - var set = " " + elem.className + " "; - // Class name may appear multiple times - while ( set.indexOf(" " + name + " ") > -1 ) { - set = set.replace(" " + name + " " , " "); - } - // If possible, trim it for prettiness, but not necessarily - elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, ""); -} - -function id( name ) { - return !!( typeof document !== "undefined" && document && document.getElementById ) && - document.getElementById( name ); -} - -function registerLoggingCallback( key ) { - return function( callback ) { - config[key].push( callback ); - }; -} - -// Supports deprecated method of completely overwriting logging callbacks -function runLoggingCallbacks( key, scope, args ) { - var i, callbacks; - if ( QUnit.hasOwnProperty( key ) ) { - QUnit[ key ].call(scope, args ); - } else { - callbacks = config[ key ]; - for ( i = 0; i < callbacks.length; i++ ) { - callbacks[ i ].call( scope, args ); - } - } -} - -// Test for equality any JavaScript type. -// Author: Philippe Rathé -QUnit.equiv = (function() { - - // Call the o related callback with the given arguments. - function bindCallbacks( o, callbacks, args ) { - var prop = QUnit.objectType( o ); - if ( prop ) { - if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) { - return callbacks[ prop ].apply( callbacks, args ); - } else { - return callbacks[ prop ]; // or undefined - } - } - } - - // the real equiv function - var innerEquiv, - // stack to decide between skip/abort functions - callers = [], - // stack to avoiding loops from circular referencing - parents = [], - parentsB = [], - - getProto = Object.getPrototypeOf || function ( obj ) { - /*jshint camelcase:false */ - return obj.__proto__; - }, - callbacks = (function () { - - // for string, boolean, number and null - function useStrictEquality( b, a ) { - /*jshint eqeqeq:false */ - if ( b instanceof a.constructor || a instanceof b.constructor ) { - // to catch short annotation VS 'new' annotation of a - // declaration - // e.g. var i = 1; - // var j = new Number(1); - return a == b; - } else { - return a === b; - } - } - - return { - "string": useStrictEquality, - "boolean": useStrictEquality, - "number": useStrictEquality, - "null": useStrictEquality, - "undefined": useStrictEquality, - - "nan": function( b ) { - return isNaN( b ); - }, - - "date": function( b, a ) { - return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf(); - }, - - "regexp": function( b, a ) { - return QUnit.objectType( b ) === "regexp" && - // the regex itself - a.source === b.source && - // and its modifiers - a.global === b.global && - // (gmi) ... - a.ignoreCase === b.ignoreCase && - a.multiline === b.multiline && - a.sticky === b.sticky; - }, - - // - skip when the property is a method of an instance (OOP) - // - abort otherwise, - // initial === would have catch identical references anyway - "function": function() { - var caller = callers[callers.length - 1]; - return caller !== Object && typeof caller !== "undefined"; - }, - - "array": function( b, a ) { - var i, j, len, loop, aCircular, bCircular; - - // b could be an object literal here - if ( QUnit.objectType( b ) !== "array" ) { - return false; - } - - len = a.length; - if ( len !== b.length ) { - // safe and faster - return false; - } - - // track reference to avoid circular references - parents.push( a ); - parentsB.push( b ); - for ( i = 0; i < len; i++ ) { - loop = false; - for ( j = 0; j < parents.length; j++ ) { - aCircular = parents[j] === a[i]; - bCircular = parentsB[j] === b[i]; - if ( aCircular || bCircular ) { - if ( a[i] === b[i] || aCircular && bCircular ) { - loop = true; - } else { - parents.pop(); - parentsB.pop(); - return false; - } - } - } - if ( !loop && !innerEquiv(a[i], b[i]) ) { - parents.pop(); - parentsB.pop(); - return false; - } - } - parents.pop(); - parentsB.pop(); - return true; - }, - - "object": function( b, a ) { - /*jshint forin:false */ - var i, j, loop, aCircular, bCircular, - // Default to true - eq = true, - aProperties = [], - bProperties = []; - - // comparing constructors is more strict than using - // instanceof - if ( a.constructor !== b.constructor ) { - // Allow objects with no prototype to be equivalent to - // objects with Object as their constructor. - if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) || - ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) { - return false; - } - } - - // stack constructor before traversing properties - callers.push( a.constructor ); - - // track reference to avoid circular references - parents.push( a ); - parentsB.push( b ); - - // be strict: don't ensure hasOwnProperty and go deep - for ( i in a ) { - loop = false; - for ( j = 0; j < parents.length; j++ ) { - aCircular = parents[j] === a[i]; - bCircular = parentsB[j] === b[i]; - if ( aCircular || bCircular ) { - if ( a[i] === b[i] || aCircular && bCircular ) { - loop = true; - } else { - eq = false; - break; - } - } - } - aProperties.push(i); - if ( !loop && !innerEquiv(a[i], b[i]) ) { - eq = false; - break; - } - } - - parents.pop(); - parentsB.pop(); - callers.pop(); // unstack, we are done - - for ( i in b ) { - bProperties.push( i ); // collect b's properties - } - - // Ensures identical properties name - return eq && innerEquiv( aProperties.sort(), bProperties.sort() ); - } - }; - }()); - - innerEquiv = function() { // can take multiple arguments - var args = [].slice.apply( arguments ); - if ( args.length < 2 ) { - return true; // end transition - } - - return (function( a, b ) { - if ( a === b ) { - return true; // catch the most you can - } else if ( a === null || b === null || typeof a === "undefined" || - typeof b === "undefined" || - QUnit.objectType(a) !== QUnit.objectType(b) ) { - return false; // don't lose time with error prone cases - } else { - return bindCallbacks(a, callbacks, [ b, a ]); - } - - // apply transition with (1..n) arguments - }( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) ); - }; - - return innerEquiv; -}()); - -/** - * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | - * http://flesler.blogspot.com Licensed under BSD - * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008 - * - * @projectDescription Advanced and extensible data dumping for Javascript. - * @version 1.0.0 - * @author Ariel Flesler - * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} - */ -QUnit.jsDump = (function() { - function quote( str ) { - return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\""; - } - function literal( o ) { - return o + ""; - } - function join( pre, arr, post ) { - var s = jsDump.separator(), - base = jsDump.indent(), - inner = jsDump.indent(1); - if ( arr.join ) { - arr = arr.join( "," + s + inner ); - } - if ( !arr ) { - return pre + post; - } - return [ pre, inner + arr, base + post ].join(s); - } - function array( arr, stack ) { - var i = arr.length, ret = new Array(i); - this.up(); - while ( i-- ) { - ret[i] = this.parse( arr[i] , undefined , stack); - } - this.down(); - return join( "[", ret, "]" ); - } - - var reName = /^function (\w+)/, - jsDump = { - // type is used mostly internally, you can fix a (custom)type in advance - parse: function( obj, type, stack ) { - stack = stack || [ ]; - var inStack, res, - parser = this.parsers[ type || this.typeOf(obj) ]; - - type = typeof parser; - inStack = inArray( obj, stack ); - - if ( inStack !== -1 ) { - return "recursion(" + (inStack - stack.length) + ")"; - } - if ( type === "function" ) { - stack.push( obj ); - res = parser.call( this, obj, stack ); - stack.pop(); - return res; - } - return ( type === "string" ) ? parser : this.parsers.error; - }, - typeOf: function( obj ) { - var type; - if ( obj === null ) { - type = "null"; - } else if ( typeof obj === "undefined" ) { - type = "undefined"; - } else if ( QUnit.is( "regexp", obj) ) { - type = "regexp"; - } else if ( QUnit.is( "date", obj) ) { - type = "date"; - } else if ( QUnit.is( "function", obj) ) { - type = "function"; - } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) { - type = "window"; - } else if ( obj.nodeType === 9 ) { - type = "document"; - } else if ( obj.nodeType ) { - type = "node"; - } else if ( - // native arrays - toString.call( obj ) === "[object Array]" || - // NodeList objects - ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) ) - ) { - type = "array"; - } else if ( obj.constructor === Error.prototype.constructor ) { - type = "error"; - } else { - type = typeof obj; - } - return type; - }, - separator: function() { - return this.multiline ? this.HTML ? "
    " : "\n" : this.HTML ? " " : " "; - }, - // extra can be a number, shortcut for increasing-calling-decreasing - indent: function( extra ) { - if ( !this.multiline ) { - return ""; - } - var chr = this.indentChar; - if ( this.HTML ) { - chr = chr.replace( /\t/g, " " ).replace( / /g, " " ); - } - return new Array( this.depth + ( extra || 0 ) ).join(chr); - }, - up: function( a ) { - this.depth += a || 1; - }, - down: function( a ) { - this.depth -= a || 1; - }, - setParser: function( name, parser ) { - this.parsers[name] = parser; - }, - // The next 3 are exposed so you can use them - quote: quote, - literal: literal, - join: join, - // - depth: 1, - // This is the list of parsers, to modify them, use jsDump.setParser - parsers: { - window: "[Window]", - document: "[Document]", - error: function(error) { - return "Error(\"" + error.message + "\")"; - }, - unknown: "[Unknown]", - "null": "null", - "undefined": "undefined", - "function": function( fn ) { - var ret = "function", - // functions never have name in IE - name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1]; - - if ( name ) { - ret += " " + name; - } - ret += "( "; - - ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" ); - return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" ); - }, - array: array, - nodelist: array, - "arguments": array, - object: function( map, stack ) { - /*jshint forin:false */ - var ret = [ ], keys, key, val, i; - QUnit.jsDump.up(); - keys = []; - for ( key in map ) { - keys.push( key ); - } - keys.sort(); - for ( i = 0; i < keys.length; i++ ) { - key = keys[ i ]; - val = map[ key ]; - ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) ); - } - QUnit.jsDump.down(); - return join( "{", ret, "}" ); - }, - node: function( node ) { - var len, i, val, - open = QUnit.jsDump.HTML ? "<" : "<", - close = QUnit.jsDump.HTML ? ">" : ">", - tag = node.nodeName.toLowerCase(), - ret = open + tag, - attrs = node.attributes; - - if ( attrs ) { - for ( i = 0, len = attrs.length; i < len; i++ ) { - val = attrs[i].nodeValue; - // IE6 includes all attributes in .attributes, even ones not explicitly set. - // Those have values like undefined, null, 0, false, "" or "inherit". - if ( val && val !== "inherit" ) { - ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" ); - } - } - } - ret += close; - - // Show content of TextNode or CDATASection - if ( node.nodeType === 3 || node.nodeType === 4 ) { - ret += node.nodeValue; - } - - return ret + open + "/" + tag + close; - }, - // function calls it internally, it's the arguments part of the function - functionArgs: function( fn ) { - var args, - l = fn.length; - - if ( !l ) { - return ""; - } - - args = new Array(l); - while ( l-- ) { - // 97 is 'a' - args[l] = String.fromCharCode(97+l); - } - return " " + args.join( ", " ) + " "; - }, - // object calls it internally, the key part of an item in a map - key: quote, - // function calls it internally, it's the content of the function - functionCode: "[code]", - // node calls it internally, it's an html attribute value - attribute: quote, - string: quote, - date: quote, - regexp: literal, - number: literal, - "boolean": literal - }, - // if true, entities are escaped ( <, >, \t, space and \n ) - HTML: false, - // indentation unit - indentChar: " ", - // if true, items in a collection, are separated by a \n, else just a space. - multiline: true - }; - - return jsDump; -}()); - -// from jquery.js -function inArray( elem, array ) { - if ( array.indexOf ) { - return array.indexOf( elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; -} - -/* - * Javascript Diff Algorithm - * By John Resig (http://ejohn.org/) - * Modified by Chu Alan "sprite" - * - * Released under the MIT license. - * - * More Info: - * http://ejohn.org/projects/javascript-diff-algorithm/ - * - * Usage: QUnit.diff(expected, actual) - * - * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick brown fox jumped jumps over" - */ -QUnit.diff = (function() { - /*jshint eqeqeq:false, eqnull:true */ - function diff( o, n ) { - var i, - ns = {}, - os = {}; - - for ( i = 0; i < n.length; i++ ) { - if ( !hasOwn.call( ns, n[i] ) ) { - ns[ n[i] ] = { - rows: [], - o: null - }; - } - ns[ n[i] ].rows.push( i ); - } - - for ( i = 0; i < o.length; i++ ) { - if ( !hasOwn.call( os, o[i] ) ) { - os[ o[i] ] = { - rows: [], - n: null - }; - } - os[ o[i] ].rows.push( i ); - } - - for ( i in ns ) { - if ( hasOwn.call( ns, i ) ) { - if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) { - n[ ns[i].rows[0] ] = { - text: n[ ns[i].rows[0] ], - row: os[i].rows[0] - }; - o[ os[i].rows[0] ] = { - text: o[ os[i].rows[0] ], - row: ns[i].rows[0] - }; - } - } - } - - for ( i = 0; i < n.length - 1; i++ ) { - if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null && - n[ i + 1 ] == o[ n[i].row + 1 ] ) { - - n[ i + 1 ] = { - text: n[ i + 1 ], - row: n[i].row + 1 - }; - o[ n[i].row + 1 ] = { - text: o[ n[i].row + 1 ], - row: i + 1 - }; - } - } - - for ( i = n.length - 1; i > 0; i-- ) { - if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null && - n[ i - 1 ] == o[ n[i].row - 1 ]) { - - n[ i - 1 ] = { - text: n[ i - 1 ], - row: n[i].row - 1 - }; - o[ n[i].row - 1 ] = { - text: o[ n[i].row - 1 ], - row: i - 1 - }; - } - } - - return { - o: o, - n: n - }; - } - - return function( o, n ) { - o = o.replace( /\s+$/, "" ); - n = n.replace( /\s+$/, "" ); - - var i, pre, - str = "", - out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ), - oSpace = o.match(/\s+/g), - nSpace = n.match(/\s+/g); - - if ( oSpace == null ) { - oSpace = [ " " ]; - } - else { - oSpace.push( " " ); - } - - if ( nSpace == null ) { - nSpace = [ " " ]; - } - else { - nSpace.push( " " ); - } - - if ( out.n.length === 0 ) { - for ( i = 0; i < out.o.length; i++ ) { - str += "" + out.o[i] + oSpace[i] + ""; - } - } - else { - if ( out.n[0].text == null ) { - for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) { - str += "" + out.o[n] + oSpace[n] + ""; - } - } - - for ( i = 0; i < out.n.length; i++ ) { - if (out.n[i].text == null) { - str += "" + out.n[i] + nSpace[i] + ""; - } - else { - // `pre` initialized at top of scope - pre = ""; - - for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) { - pre += "" + out.o[n] + oSpace[n] + ""; - } - str += " " + out.n[i].text + nSpace[i] + pre; - } - } - } - - return str; - }; -}()); - -// for CommonJS environments, export everything -if ( typeof exports !== "undefined" ) { - extend( exports, QUnit.constructor.prototype ); -} - -// get at whatever the global object is, like window in browsers -}( (function() {return this;}.call()) )); \ No newline at end of file diff --git a/docs/com/test/test-markdown-element-attributes.html b/docs/com/test/test-markdown-element-attributes.html deleted file mode 100755 index 6edf95eff..000000000 --- a/docs/com/test/test-markdown-element-attributes.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - reveal.js - Test Markdown Element Attributes - - - - - - - -
    -
    - - - - - - - - - - - - - diff --git a/docs/com/test/test-markdown-element-attributes.js b/docs/com/test/test-markdown-element-attributes.js deleted file mode 100755 index 10a250375..000000000 --- a/docs/com/test/test-markdown-element-attributes.js +++ /dev/null @@ -1,46 +0,0 @@ - - -Reveal.addEventListener( 'ready', function() { - - QUnit.module( 'Markdown' ); - - test( 'Vertical separator', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 4, 'found four slides' ); - }); - - - test( 'Attributes on element header in vertical slides', function() { - strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.fade-out' ).length, 1, 'found one vertical slide with class fragment.fade-out on header' ); - strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.shrink' ).length, 1, 'found one vertical slide with class fragment.shrink on header' ); - }); - - test( 'Attributes on element paragraphs in vertical slides', function() { - strictEqual( document.querySelectorAll( '.reveal .slides section>section p.fragment.grow' ).length, 2, 'found a vertical slide with two paragraphs with class fragment.grow' ); - }); - - test( 'Attributes on element list items in vertical slides', function() { - strictEqual( document.querySelectorAll( '.reveal .slides section>section li.fragment.grow' ).length, 3, 'found a vertical slide with three list items with class fragment.grow' ); - }); - - test( 'Attributes on element paragraphs in horizontal slides', function() { - strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-red' ).length, 4, 'found a horizontal slide with four paragraphs with class fragment.grow' ); - }); - test( 'Attributes on element list items in horizontal slides', function() { - strictEqual( document.querySelectorAll( '.reveal .slides section li.fragment.highlight-green' ).length, 5, 'found a horizontal slide with five list items with class fragment.roll-in' ); - }); - test( 'Attributes on element list items in horizontal slides', function() { - strictEqual( document.querySelectorAll( '.reveal .slides section img.reveal.stretch' ).length, 1, 'found a horizontal slide with stretched image, class img.reveal.stretch' ); - }); - - test( 'Attributes on elements in vertical slides with default element attribute separator', function() { - strictEqual( document.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' ); - }); - - test( 'Attributes on elements in single slides with default element attribute separator', function() { - strictEqual( document.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' ); - }); - -} ); - -Reveal.initialize(); - diff --git a/docs/com/test/test-markdown-slide-attributes.html b/docs/com/test/test-markdown-slide-attributes.html deleted file mode 100755 index ab6ece4ed..000000000 --- a/docs/com/test/test-markdown-slide-attributes.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - reveal.js - Test Markdown Attributes - - - - - - - -
    -
    - - - - - - - - - - - - - diff --git a/docs/com/test/test-markdown-slide-attributes.js b/docs/com/test/test-markdown-slide-attributes.js deleted file mode 100755 index 3817fd37c..000000000 --- a/docs/com/test/test-markdown-slide-attributes.js +++ /dev/null @@ -1,47 +0,0 @@ - - -Reveal.addEventListener( 'ready', function() { - - QUnit.module( 'Markdown' ); - - test( 'Vertical separator', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 6, 'found six vertical slides' ); - }); - - test( 'Id on slide', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section>section#slide2' ).length, 1, 'found one slide with id slide2' ); - strictEqual( document.querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, 'found one slide with a link to slide2' ); - }); - - test( 'data-background attributes', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' ); - strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' ); - strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' ); - }); - - test( 'data-transition attributes', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' ); - strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' ); - strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' ); - }); - - test( 'data-background attributes with default separator', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' ); - strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' ); - strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' ); - }); - - test( 'data-transition attributes with default separator', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' ); - strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' ); - strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' ); - }); - - test( 'data-transition attributes with inline content', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' ); - }); - -} ); - -Reveal.initialize(); - diff --git a/docs/com/test/test-markdown.html b/docs/com/test/test-markdown.html deleted file mode 100755 index 7ff0efe8a..000000000 --- a/docs/com/test/test-markdown.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - reveal.js - Test Markdown - - - - - - - -
    -
    - - - - - - - - - - - - - diff --git a/docs/com/test/test-markdown.js b/docs/com/test/test-markdown.js deleted file mode 100755 index d2bbba867..000000000 --- a/docs/com/test/test-markdown.js +++ /dev/null @@ -1,15 +0,0 @@ - - -Reveal.addEventListener( 'ready', function() { - - QUnit.module( 'Markdown' ); - - test( 'Vertical separator', function() { - strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' ); - }); - - -} ); - -Reveal.initialize(); - diff --git a/docs/com/test/test-pdf.html b/docs/com/test/test-pdf.html deleted file mode 100755 index 751ed26ea..000000000 --- a/docs/com/test/test-pdf.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - reveal.js - Test PDF exports - - - - - - - - -
    -
    - - - - - - - - - - - diff --git a/docs/com/test/test-pdf.js b/docs/com/test/test-pdf.js deleted file mode 100755 index 8ec34fd46..000000000 --- a/docs/com/test/test-pdf.js +++ /dev/null @@ -1,15 +0,0 @@ - -Reveal.addEventListener( 'ready', function() { - - // Only one test for now, we're mainly ensuring that there - // are no execution errors when running PDF mode - - test( 'Reveal.isReady', function() { - strictEqual( Reveal.isReady(), true, 'returns true' ); - }); - - -} ); - -Reveal.initialize({ pdf: true }); - diff --git a/docs/com/test/test.html b/docs/com/test/test.html deleted file mode 100755 index d08e4f000..000000000 --- a/docs/com/test/test.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - reveal.js - Tests - - - - - - - -
    -
    - - - - - - - - - - - diff --git a/docs/com/test/test.js b/docs/com/test/test.js deleted file mode 100755 index a96b70b3d..000000000 --- a/docs/com/test/test.js +++ /dev/null @@ -1,597 +0,0 @@ - -// 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.addEventListener( 'ready', function() { - - // --------------------------------------------------------------- - // DOM TESTS - - QUnit.module( 'DOM' ); - - test( 'Initial slides classes', function() { - var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' ) - - strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' ); - strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' ); - strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' ); - - strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' ); - - ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' ); - }); - - // --------------------------------------------------------------- - // API TESTS - - QUnit.module( 'API' ); - - test( 'Reveal.isReady', function() { - strictEqual( Reveal.isReady(), true, 'returns true' ); - }); - - test( 'Reveal.isOverview', function() { - strictEqual( Reveal.isOverview(), false, 'false by default' ); - - Reveal.toggleOverview(); - strictEqual( Reveal.isOverview(), true, 'true after toggling on' ); - - Reveal.toggleOverview(); - strictEqual( Reveal.isOverview(), false, 'false after toggling off' ); - }); - - test( 'Reveal.isPaused', function() { - strictEqual( Reveal.isPaused(), false, 'false by default' ); - - Reveal.togglePause(); - strictEqual( Reveal.isPaused(), true, 'true after pausing' ); - - Reveal.togglePause(); - strictEqual( Reveal.isPaused(), false, 'false after resuming' ); - }); - - test( 'Reveal.isFirstSlide', function() { - Reveal.slide( 0, 0 ); - strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); - - Reveal.slide( 1, 0 ); - strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' ); - - Reveal.slide( 0, 0 ); - strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); - }); - - test( 'Reveal.isFirstSlide after vertical slide', function() { - Reveal.slide( 1, 1 ); - Reveal.slide( 0, 0 ); - strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( 0, 0 )' ); - }); - - test( 'Reveal.isLastSlide', function() { - Reveal.slide( 0, 0 ); - strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); - - var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; - - Reveal.slide( lastSlideIndex, 0 ); - strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( '+ lastSlideIndex +', 0 )' ); - - Reveal.slide( 0, 0 ); - strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); - }); - - test( 'Reveal.isLastSlide after vertical slide', function() { - var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; - - Reveal.slide( 1, 1 ); - Reveal.slide( lastSlideIndex ); - strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( '+ lastSlideIndex +', 0 )' ); - }); - - test( 'Reveal.getTotalSlides', function() { - strictEqual( Reveal.getTotalSlides(), 8, 'eight slides in total' ); - }); - - test( 'Reveal.getIndices', function() { - var indices = Reveal.getIndices(); - - ok( indices.hasOwnProperty( 'h' ), 'h exists' ); - ok( indices.hasOwnProperty( 'v' ), 'v exists' ); - ok( indices.hasOwnProperty( 'f' ), 'f exists' ); - - Reveal.slide( 1, 0 ); - strictEqual( Reveal.getIndices().h, 1, 'h 1' ); - strictEqual( Reveal.getIndices().v, 0, 'v 0' ); - - Reveal.slide( 1, 2 ); - strictEqual( Reveal.getIndices().h, 1, 'h 1' ); - strictEqual( Reveal.getIndices().v, 2, 'v 2' ); - - Reveal.slide( 0, 0 ); - strictEqual( Reveal.getIndices().h, 0, 'h 0' ); - strictEqual( Reveal.getIndices().v, 0, 'v 0' ); - }); - - test( 'Reveal.getSlide', function() { - equal( Reveal.getSlide( 0 ), document.querySelector( '.reveal .slides>section:first-child' ), 'gets correct first slide' ); - equal( Reveal.getSlide( 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)' ), 'no v index returns stack' ); - equal( Reveal.getSlide( 1, 0 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(1)' ), 'v index 0 returns first vertical child' ); - equal( Reveal.getSlide( 1, 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(2)' ), 'v index 1 returns second vertical child' ); - - strictEqual( Reveal.getSlide( 100 ), undefined, 'undefined when out of horizontal bounds' ); - strictEqual( Reveal.getSlide( 1, 100 ), undefined, 'undefined when out of vertical bounds' ); - }); - - test( 'Reveal.getSlideBackground', function() { - equal( Reveal.getSlideBackground( 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:first-child' ), 'gets correct first background' ); - equal( Reveal.getSlideBackground( 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2)' ), 'no v index returns stack' ); - equal( Reveal.getSlideBackground( 1, 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(1)' ), 'v index 0 returns first vertical child' ); - equal( Reveal.getSlideBackground( 1, 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(2)' ), 'v index 1 returns second vertical child' ); - - strictEqual( Reveal.getSlideBackground( 100 ), undefined, 'undefined when out of horizontal bounds' ); - strictEqual( Reveal.getSlideBackground( 1, 100 ), undefined, 'undefined when out of vertical bounds' ); - }); - - test( 'Reveal.getSlideNotes', function() { - Reveal.slide( 0, 0 ); - ok( Reveal.getSlideNotes() === 'speaker notes 1', 'works with