瀏覽代碼

convert plugins to ES modules, transpile es5 versions backwards compatibility

Hakim El Hattab 5 年之前
父節點
當前提交
a55cd813be

+ 11 - 10
demo.html

@@ -410,11 +410,17 @@ Reveal.on( 'customevent', function() {
 
 		</div>
 
-		<script type="module" src="js/index.js"></script>
 		<script type="module">
 
+			import Reveal from '/js/reveal.js';
+			import Zoom from '/plugin/zoom/zoom.js';
+			import Notes from '/plugin/notes/notes.js';
+			import Search from '/plugin/search/search.js';
+			import Markdown from '/plugin/markdown/markdown.js';
+			import Highlight from '/plugin/highlight/highlight.js';
+
 			// More info https://github.com/hakimel/reveal.js#configuration
-			Reveal.initialize({
+			let deck = new Reveal( document.querySelector( '.reveal' ), {
 				controls: true,
 				progress: true,
 				center: true,
@@ -423,16 +429,11 @@ Reveal.on( 'customevent', function() {
 				transition: 'slide', // none/fade/slide/convex/concave/zoom
 
 				// More info https://github.com/hakimel/reveal.js#dependencies
-				dependencies: [
-					{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-					{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-					{ src: 'plugin/highlight/highlight.js' },
-					{ src: 'plugin/search/search.js', async: true },
-					{ src: 'plugin/zoom-js/zoom.js', async: true },
-					{ src: 'plugin/notes/notes.js', async: true }
-				]
+				dependencies: [ Zoom, Notes, Search, Markdown, Highlight ]
 			});
 
+			deck.initialize();
+
 		</script>
 
 	</body>

文件差異過大導致無法顯示
+ 0 - 0
dist/plugin/highlight.js


文件差異過大導致無法顯示
+ 0 - 0
dist/plugin/markdown.js


+ 1 - 0
dist/plugin/math.js

@@ -0,0 +1 @@
+!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}({7:function(e,t,n){"use strict";n.r(t);var r=function(){var e=Reveal.getConfig().math||{},t=(e.mathjax||"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js")+"?config="+(e.config||"TeX-AMS_HTML-full"),n={messageStyle:"none",tex2jax:{inlineMath:[["$","$"],["\\(","\\)"]],skipTags:["script","noscript","style","textarea","pre"]},skipStartupTypeset:!0};function r(e,t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}return{id:"math",init:function(a){r(e,n),r(e.tex2jax,n.tex2jax),e.mathjax=e.config=null,function(e,t){var n=document.querySelector("head"),r=document.createElement("script");r.type="text/javascript",r.src=e;var a=function(){"function"==typeof t&&(t.call(),t=null)};r.onload=a,r.onreadystatechange=function(){"loaded"===this.readyState&&a()},n.appendChild(r)}(t,(function(){MathJax.Hub.Config(e),MathJax.Hub.Queue(["Typeset",MathJax.Hub]),MathJax.Hub.Queue(a.layout),a.on("slidechanged",(function(e){MathJax.Hub.Queue(["Typeset",MathJax.Hub,e.currentSlide])}))}))}}}();Reveal.registerPlugin(r)}});

文件差異過大導致無法顯示
+ 0 - 0
dist/plugin/notes.js


文件差異過大導致無法顯示
+ 0 - 0
dist/plugin/search.js


文件差異過大導致無法顯示
+ 3 - 0
dist/plugin/zoom.js


文件差異過大導致無法顯示
+ 1 - 1
dist/reveal.min.js


+ 18 - 0
gulpfile.js

@@ -42,6 +42,24 @@ gulp.task('js', () => gulp.src(['./js/index.js'])
         .pipe(rename('reveal.min.js'))
         .pipe(gulp.dest('./dist')))
 
+gulp.task('plugins', () => gulp.src(['./js/index.js'])
+        .pipe(webpack({
+            ...require('./webpack.config.js'),
+            entry: {
+                'highlight': './plugin/highlight/highlight.es5',
+                'markdown': './plugin/markdown/markdown.es5',
+                'search': './plugin/search/search.es5',
+                'notes': './plugin/notes/notes.es5',
+                'zoom': './plugin/zoom/zoom.es5',
+                'math': './plugin/math/math.es5'
+            },
+            output: {
+                filename: '[name].js'
+            }
+        }))
+        .on('error', swallowError)
+        .pipe(gulp.dest('./dist/plugin')))
+
 gulp.task('css-themes', () => gulp.src(['./css/theme/source/*.{sass,scss}'])
         .pipe(sass())
         .pipe(gulp.dest('./dist/theme')))

+ 3 - 5
index.html

@@ -22,7 +22,6 @@
 		</div>
 
 		<script src="dist/reveal.min.js"></script>
-
 		<script>
 			// More info about config & dependencies:
 			// - https://github.com/hakimel/reveal.js#configuration
@@ -30,10 +29,9 @@
 			Reveal.initialize({
 				hash: true,
 				dependencies: [
-					{ src: 'plugin/markdown/marked.js' },
-					{ src: 'plugin/markdown/markdown.js' },
-					{ src: 'plugin/highlight/highlight.js' },
-					{ src: 'plugin/notes/notes.js', async: true }
+					{ src: 'dist/plugin/markdown.js' },
+					{ src: 'dist/plugin/highlight.js' },
+					{ src: 'dist/plugin/notes.js' }
 				]
 			});
 		</script>

+ 2 - 2
js/controllers/plugins.js

@@ -60,8 +60,8 @@ export default class Plugins {
 
 				// Load synchronous scripts
 				scripts.forEach( s => {
-					if( s.plugin ) {
-						this.registerPlugin( s.plugin );
+					if( typeof s.id === 'string' ) {
+						this.registerPlugin( s );
 						scriptLoadedCallback( s );
 					}
 					else {

+ 0 - 1
js/reveal.js

@@ -28,7 +28,6 @@ import {
 	deserialize,
 	transformElement,
 	createSingletonNode,
-	closestParent,
 	getQueryHash,
 	getRemainingHeight
 } from './utils/util.js'

+ 5 - 0
package-lock.json

@@ -5205,6 +5205,11 @@
         "minimalistic-assert": "^1.0.1"
       }
     },
+    "highlight.js": {
+      "version": "9.18.1",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz",
+      "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg=="
+    },
     "hmac-drbg": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",

+ 3 - 0
package.json

@@ -87,5 +87,8 @@
       "no-eq-null": 2,
       "no-unused-expressions": 0
     }
+  },
+  "dependencies": {
+    "highlight.js": "^9.18.1"
   }
 }

文件差異過大導致無法顯示
+ 1 - 0
plugin/highlight/highlight-core.js


+ 3 - 0
plugin/highlight/highlight-line-numbers.js

@@ -0,0 +1,3 @@
+/* highlightjs-line-numbers.js 2.6.0 | (C) 2018 Yauheni Pakala | MIT License | github.com/wcoder/highlightjs-line-numbers.js */
+/* Edited by Hakim for reveal.js; removed async timeout */
+!function(n,e){"use strict";function t(){var n=e.createElement("style");n.type="text/css",n.innerHTML=g(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[v,L,b]),e.getElementsByTagName("head")[0].appendChild(n)}function r(t){"interactive"===e.readyState||"complete"===e.readyState?i(t):n.addEventListener("DOMContentLoaded",function(){i(t)})}function i(t){try{var r=e.querySelectorAll("code.hljs,code.nohighlight");for(var i in r)r.hasOwnProperty(i)&&l(r[i],t)}catch(o){n.console.error("LineNumbers error: ",o)}}function l(n,e){"object"==typeof n&&f(function(){n.innerHTML=s(n,e)})}function o(n,e){if("string"==typeof n){var t=document.createElement("code");return t.innerHTML=n,s(t,e)}}function s(n,e){e=e||{singleLine:!1};var t=e.singleLine?0:1;return c(n),a(n.innerHTML,t)}function a(n,e){var t=u(n);if(""===t[t.length-1].trim()&&t.pop(),t.length>e){for(var r="",i=0,l=t.length;i<l;i++)r+=g('<tr><td class="{0}"><div class="{1} {2}" {3}="{5}"></div></td><td class="{4}"><div class="{1}">{6}</div></td></tr>',[j,m,L,b,p,i+1,t[i].length>0?t[i]:" "]);return g('<table class="{0}">{1}</table>',[v,r])}return n}function c(n){var e=n.childNodes;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];h(r.textContent)>0&&(r.childNodes.length>0?c(r):d(r.parentNode))}}function d(n){var e=n.className;if(/hljs-/.test(e)){for(var t=u(n.innerHTML),r=0,i="";r<t.length;r++){var l=t[r].length>0?t[r]:" ";i+=g('<span class="{0}">{1}</span>\n',[e,l])}n.innerHTML=i.trim()}}function u(n){return 0===n.length?[]:n.split(y)}function h(n){return(n.trim().match(y)||[]).length}function f(e){e()}function g(n,e){return n.replace(/\{(\d+)\}/g,function(n,t){return e[t]?e[t]:n})}var v="hljs-ln",m="hljs-ln-line",p="hljs-ln-code",j="hljs-ln-numbers",L="hljs-ln-n",b="data-line-number",y=/\r\n|\r|\n/g;n.hljs?(n.hljs.initLineNumbersOnLoad=r,n.hljs.lineNumbersBlock=l,n.hljs.lineNumbersValue=o,t()):n.console.error("highlight.js not detected!")}(window,document);

+ 7 - 0
plugin/highlight/highlight.es5

@@ -0,0 +1,7 @@
+/**
+ * This is used to compile a self-registering
+ * es5 compatible version of the plugin.
+ */
+
+import plugin from './highlight.js'
+Reveal.registerPlugin( plugin );

文件差異過大導致無法顯示
+ 0 - 1
plugin/highlight/highlight.js


+ 7 - 0
plugin/markdown/markdown.es5

@@ -0,0 +1,7 @@
+/**
+ * This is used to compile a self-registering
+ * es5 compatible version of the plugin.
+ */
+
+import plugin from './markdown.js'
+Reveal.registerPlugin( plugin );

+ 318 - 337
plugin/markdown/markdown.js

@@ -1,449 +1,430 @@
-/**
+/*!
  * The reveal.js markdown plugin. Handles parsing of
  * markdown inside of presentations as well as loading
  * of external markdown documents.
  */
-(function( root, factory ) {
-	if (typeof define === 'function' && define.amd) {
-		root.marked = require( './marked' );
-		root.RevealMarkdown = factory( root.marked );
-	} else if( typeof exports === 'object' ) {
-		module.exports = factory( require( './marked' ) );
-	} else {
-		// Browser globals (root is window)
-		root.RevealMarkdown = factory( root.marked );
-	}
-}( this, function( marked ) {
 
-	var DEFAULT_SLIDE_SEPARATOR = '^\r?\n---\r?\n$',
-		DEFAULT_NOTES_SEPARATOR = 'notes?:',
-		DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
-		DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
+import marked from './marked.js'
 
-	var SCRIPT_END_PLACEHOLDER = '__SCRIPT_END__';
+export default {
 
+	id: 'markdown',
 
 	/**
-	 * Retrieves the markdown contents of a slide section
-	 * element. Normalizes leading tabs/whitespace.
+	 * Starts processing and converting Markdown within the
+	 * current reveal.js deck.
 	 */
-	function getMarkdownFromSlide( section ) {
+	init: function( deck ) {
 
-		// look for a <script> or <textarea data-template> wrapper
-		var template = section.querySelector( '[data-template]' ) || section.querySelector( 'script' );
+		if( typeof hljs !== 'undefined' ) {
+			marked.setOptions({
+				highlight: function( code, lang ) {
+					return hljs.highlightAuto( code, [lang] ).value;
+				}
+			});
+		}
 
-		// strip leading whitespace so it isn't evaluated as code
-		var text = ( template || section ).textContent;
+		// marked can be configured via reveal.js config options
+		var options = deck.getConfig().markdown;
+		if( options ) {
+			marked.setOptions( options );
+		}
 
-		// restore script end tags
-		text = text.replace( new RegExp( SCRIPT_END_PLACEHOLDER, 'g' ), '</script>' );
+		return processSlides( deck.getRevealElement() ).then( convertSlides );
 
-		var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
-			leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
+	},
 
-		if( leadingTabs > 0 ) {
-			text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
-		}
-		else if( leadingWs > 1 ) {
-			text = text.replace( new RegExp('\\n? {' + leadingWs + '}', 'g'), '\n' );
-		}
+	// TODO: Do these belong in the API?
+	processSlides: processSlides,
+	convertSlides: convertSlides,
+	slidify: slidify,
+	marked: marked
 
-		return text;
+};
 
-	}
+var DEFAULT_SLIDE_SEPARATOR = '^\r?\n---\r?\n$',
+	DEFAULT_NOTES_SEPARATOR = 'notes?:',
+	DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
+	DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
 
-	/**
-	 * Given a markdown slide section element, this will
-	 * return all arguments that aren't related to markdown
-	 * parsing. Used to forward any other user-defined arguments
-	 * to the output markdown slide.
-	 */
-	function getForwardedAttributes( section ) {
+var SCRIPT_END_PLACEHOLDER = '__SCRIPT_END__';
 
-		var attributes = section.attributes;
-		var result = [];
 
-		for( var i = 0, len = attributes.length; i < len; i++ ) {
-			var name = attributes[i].name,
-				value = attributes[i].value;
+/**
+ * Retrieves the markdown contents of a slide section
+ * element. Normalizes leading tabs/whitespace.
+ */
+function getMarkdownFromSlide( section ) {
 
-			// disregard attributes that are used for markdown loading/parsing
-			if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
+	// look for a <script> or <textarea data-template> wrapper
+	var template = section.querySelector( '[data-template]' ) || section.querySelector( 'script' );
 
-			if( value ) {
-				result.push( name + '="' + value + '"' );
-			}
-			else {
-				result.push( name );
-			}
-		}
+	// strip leading whitespace so it isn't evaluated as code
+	var text = ( template || section ).textContent;
+
+	// restore script end tags
+	text = text.replace( new RegExp( SCRIPT_END_PLACEHOLDER, 'g' ), '</script>' );
 
-		return result.join( ' ' );
+	var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
+		leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
 
+	if( leadingTabs > 0 ) {
+		text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
+	}
+	else if( leadingWs > 1 ) {
+		text = text.replace( new RegExp('\\n? {' + leadingWs + '}', 'g'), '\n' );
 	}
 
-	/**
-	 * Inspects the given options and fills out default
-	 * values for what's not defined.
-	 */
-	function getSlidifyOptions( options ) {
+	return text;
+
+}
 
-		options = options || {};
-		options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
-		options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
-		options.attributes = options.attributes || '';
+/**
+ * Given a markdown slide section element, this will
+ * return all arguments that aren't related to markdown
+ * parsing. Used to forward any other user-defined arguments
+ * to the output markdown slide.
+ */
+function getForwardedAttributes( section ) {
 
-		return options;
+	var attributes = section.attributes;
+	var result = [];
 
+	for( var i = 0, len = attributes.length; i < len; i++ ) {
+		var name = attributes[i].name,
+			value = attributes[i].value;
+
+		// disregard attributes that are used for markdown loading/parsing
+		if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
+
+		if( value ) {
+			result.push( name + '="' + value + '"' );
+		}
+		else {
+			result.push( name );
+		}
 	}
 
-	/**
-	 * Helper function for constructing a markdown slide.
-	 */
-	function createMarkdownSlide( content, options ) {
+	return result.join( ' ' );
 
-		options = getSlidifyOptions( options );
+}
 
-		var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
+/**
+ * Inspects the given options and fills out default
+ * values for what's not defined.
+ */
+function getSlidifyOptions( options ) {
 
-		if( notesMatch.length === 2 ) {
-			content = notesMatch[0] + '<aside class="notes">' + marked(notesMatch[1].trim()) + '</aside>';
-		}
+	options = options || {};
+	options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
+	options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
+	options.attributes = options.attributes || '';
+
+	return options;
+
+}
 
-		// prevent script end tags in the content from interfering
-		// with parsing
-		content = content.replace( /<\/script>/g, SCRIPT_END_PLACEHOLDER );
+/**
+ * Helper function for constructing a markdown slide.
+ */
+function createMarkdownSlide( content, options ) {
 
-		return '<script type="text/template">' + content + '</script>';
+	options = getSlidifyOptions( options );
 
+	var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
+
+	if( notesMatch.length === 2 ) {
+		content = notesMatch[0] + '<aside class="notes">' + marked(notesMatch[1].trim()) + '</aside>';
 	}
 
-	/**
-	 * Parses a data string into multiple slides based
-	 * on the passed in separator arguments.
-	 */
-	function slidify( markdown, options ) {
+	// prevent script end tags in the content from interfering
+	// with parsing
+	content = content.replace( /<\/script>/g, SCRIPT_END_PLACEHOLDER );
 
-		options = getSlidifyOptions( options );
+	return '<script type="text/template">' + content + '</script>';
 
-		var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
-			horizontalSeparatorRegex = new RegExp( options.separator );
+}
 
-		var matches,
-			lastIndex = 0,
-			isHorizontal,
-			wasHorizontal = true,
-			content,
-			sectionStack = [];
+/**
+ * Parses a data string into multiple slides based
+ * on the passed in separator arguments.
+ */
+function slidify( markdown, options ) {
 
-		// iterate until all blocks between separators are stacked up
-		while( matches = separatorRegex.exec( markdown ) ) {
-			notes = null;
+	options = getSlidifyOptions( options );
 
-			// determine direction (horizontal by default)
-			isHorizontal = horizontalSeparatorRegex.test( matches[0] );
+	var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
+		horizontalSeparatorRegex = new RegExp( options.separator );
 
-			if( !isHorizontal && wasHorizontal ) {
-				// create vertical stack
-				sectionStack.push( [] );
-			}
+	var matches,
+		lastIndex = 0,
+		isHorizontal,
+		wasHorizontal = true,
+		content,
+		sectionStack = [];
 
-			// pluck slide content from markdown input
-			content = markdown.substring( lastIndex, matches.index );
+	// iterate until all blocks between separators are stacked up
+	while( matches = separatorRegex.exec( markdown ) ) {
+		var notes = null;
 
-			if( isHorizontal && wasHorizontal ) {
-				// add to horizontal stack
-				sectionStack.push( content );
-			}
-			else {
-				// add to vertical stack
-				sectionStack[sectionStack.length-1].push( content );
-			}
+		// determine direction (horizontal by default)
+		isHorizontal = horizontalSeparatorRegex.test( matches[0] );
 
-			lastIndex = separatorRegex.lastIndex;
-			wasHorizontal = isHorizontal;
+		if( !isHorizontal && wasHorizontal ) {
+			// create vertical stack
+			sectionStack.push( [] );
 		}
 
-		// add the remaining slide
-		( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
+		// pluck slide content from markdown input
+		content = markdown.substring( lastIndex, matches.index );
 
-		var markdownSections = '';
+		if( isHorizontal && wasHorizontal ) {
+			// add to horizontal stack
+			sectionStack.push( content );
+		}
+		else {
+			// add to vertical stack
+			sectionStack[sectionStack.length-1].push( content );
+		}
 
-		// flatten the hierarchical stack, and insert <section data-markdown> tags
-		for( var i = 0, len = sectionStack.length; i < len; i++ ) {
-			// vertical
-			if( sectionStack[i] instanceof Array ) {
-				markdownSections += '<section '+ options.attributes +'>';
+		lastIndex = separatorRegex.lastIndex;
+		wasHorizontal = isHorizontal;
+	}
 
-				sectionStack[i].forEach( function( child ) {
-					markdownSections += '<section data-markdown>' + createMarkdownSlide( child, options ) + '</section>';
-				} );
+	// add the remaining slide
+	( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
 
-				markdownSections += '</section>';
-			}
-			else {
-				markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
-			}
-		}
+	var markdownSections = '';
+
+	// flatten the hierarchical stack, and insert <section data-markdown> tags
+	for( var i = 0, len = sectionStack.length; i < len; i++ ) {
+		// vertical
+		if( sectionStack[i] instanceof Array ) {
+			markdownSections += '<section '+ options.attributes +'>';
 
-		return markdownSections;
+			sectionStack[i].forEach( function( child ) {
+				markdownSections += '<section data-markdown>' + createMarkdownSlide( child, options ) + '</section>';
+			} );
 
+			markdownSections += '</section>';
+		}
+		else {
+			markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
+		}
 	}
 
-	/**
-	 * Parses any current data-markdown slides, splits
-	 * multi-slide markdown into separate sections and
-	 * handles loading of external markdown.
-	 */
-	function processSlides() {
+	return markdownSections;
 
-		return new Promise( function( resolve ) {
+}
 
-			var externalPromises = [];
+/**
+ * Parses any current data-markdown slides, splits
+ * multi-slide markdown into separate sections and
+ * handles loading of external markdown.
+ */
+function processSlides( scope ) {
 
-			[].slice.call( document.querySelectorAll( '[data-markdown]') ).forEach( function( section, i ) {
+	return new Promise( function( resolve ) {
 
-				if( section.getAttribute( 'data-markdown' ).length ) {
+		var externalPromises = [];
 
-					externalPromises.push( loadExternalMarkdown( section ).then(
+		[].slice.call( scope.querySelectorAll( '[data-markdown]:not([data-markdown-parsed])') ).forEach( function( section, i ) {
 
-						// Finished loading external file
-						function( xhr, url ) {
-							section.outerHTML = slidify( xhr.responseText, {
-								separator: section.getAttribute( 'data-separator' ),
-								verticalSeparator: section.getAttribute( 'data-separator-vertical' ),
-								notesSeparator: section.getAttribute( 'data-separator-notes' ),
-								attributes: getForwardedAttributes( section )
-							});
-						},
+			if( section.getAttribute( 'data-markdown' ).length ) {
 
-						// Failed to load markdown
-						function( xhr, url ) {
-							section.outerHTML = '<section data-state="alert">' +
-								'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
-								'Check your browser\'s JavaScript console for more details.' +
-								'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
-								'</section>';
-						}
+				externalPromises.push( loadExternalMarkdown( section ).then(
 
-					) );
+					// Finished loading external file
+					function( xhr, url ) {
+						section.outerHTML = slidify( xhr.responseText, {
+							separator: section.getAttribute( 'data-separator' ),
+							verticalSeparator: section.getAttribute( 'data-separator-vertical' ),
+							notesSeparator: section.getAttribute( 'data-separator-notes' ),
+							attributes: getForwardedAttributes( section )
+						});
+					},
 
-				}
-				else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-separator-vertical' ) || section.getAttribute( 'data-separator-notes' ) ) {
+					// Failed to load markdown
+					function( xhr, url ) {
+						section.outerHTML = '<section data-state="alert">' +
+							'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
+							'Check your browser\'s JavaScript console for more details.' +
+							'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
+							'</section>';
+					}
 
-					section.outerHTML = slidify( getMarkdownFromSlide( section ), {
-						separator: section.getAttribute( 'data-separator' ),
-						verticalSeparator: section.getAttribute( 'data-separator-vertical' ),
-						notesSeparator: section.getAttribute( 'data-separator-notes' ),
-						attributes: getForwardedAttributes( section )
-					});
+				) );
 
-				}
-				else {
-					section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
-				}
+			}
+			else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-separator-vertical' ) || section.getAttribute( 'data-separator-notes' ) ) {
 
-			});
+				section.outerHTML = slidify( getMarkdownFromSlide( section ), {
+					separator: section.getAttribute( 'data-separator' ),
+					verticalSeparator: section.getAttribute( 'data-separator-vertical' ),
+					notesSeparator: section.getAttribute( 'data-separator-notes' ),
+					attributes: getForwardedAttributes( section )
+				});
 
-			Promise.all( externalPromises ).then( resolve );
+			}
+			else {
+				section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
+			}
 
-		} );
+		});
 
-	}
+		Promise.all( externalPromises ).then( resolve );
 
-	function loadExternalMarkdown( section ) {
+	} );
 
-		return new Promise( function( resolve, reject ) {
+}
 
-			var xhr = new XMLHttpRequest(),
-				url = section.getAttribute( 'data-markdown' );
+function loadExternalMarkdown( section ) {
 
-			datacharset = section.getAttribute( 'data-charset' );
+	return new Promise( function( resolve, reject ) {
 
-			// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
-			if( datacharset != null && datacharset != '' ) {
-				xhr.overrideMimeType( 'text/html; charset=' + datacharset );
-			}
+		var xhr = new XMLHttpRequest(),
+			url = section.getAttribute( 'data-markdown' );
 
-			xhr.onreadystatechange = function( section, xhr ) {
-				if( xhr.readyState === 4 ) {
-					// file protocol yields status code 0 (useful for local debug, mobile applications etc.)
-					if ( ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status === 0 ) {
+		var datacharset = section.getAttribute( 'data-charset' );
 
-						resolve( xhr, url );
+		// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
+		if( datacharset != null && datacharset != '' ) {
+			xhr.overrideMimeType( 'text/html; charset=' + datacharset );
+		}
 
-					}
-					else {
+		xhr.onreadystatechange = function( section, xhr ) {
+			if( xhr.readyState === 4 ) {
+				// file protocol yields status code 0 (useful for local debug, mobile applications etc.)
+				if ( ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status === 0 ) {
 
-						reject( xhr, url );
+					resolve( xhr, url );
 
-					}
 				}
-			}.bind( this, section, xhr );
+				else {
 
-			xhr.open( 'GET', url, true );
+					reject( xhr, url );
 
-			try {
-				xhr.send();
-			}
-			catch ( e ) {
-				alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
-				resolve( xhr, url );
+				}
 			}
+		}.bind( this, section, xhr );
 
-		} );
+		xhr.open( 'GET', url, true );
 
-	}
+		try {
+			xhr.send();
+		}
+		catch ( e ) {
+			console.warn( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
+			resolve( xhr, url );
+		}
 
-	/**
-	 * Check if a node value has the attributes pattern.
-	 * If yes, extract it and add that value as one or several attributes
-	 * to the target element.
-	 *
-	 * You need Cache Killer on Chrome to see the effect on any FOM transformation
-	 * directly on refresh (F5)
-	 * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
-	 */
-	function addAttributeInElement( node, elementTarget, separator ) {
-
-		var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
-		var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"]+?)\"|(data-[^\"= ]+?)(?=[\" ])", 'mg' );
-		var nodeValue = node.nodeValue;
-		if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
-
-			var classes = matches[1];
-			nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
-			node.nodeValue = nodeValue;
-			while( matchesClass = mardownClassRegex.exec( classes ) ) {
-				if( matchesClass[2] ) {
-					elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
-				} else {
-					elementTarget.setAttribute( matchesClass[3], "" );
-				}
+	} );
+
+}
+
+/**
+ * Check if a node value has the attributes pattern.
+ * If yes, extract it and add that value as one or several attributes
+ * to the target element.
+ *
+ * You need Cache Killer on Chrome to see the effect on any FOM transformation
+ * directly on refresh (F5)
+ * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
+ */
+function addAttributeInElement( node, elementTarget, separator ) {
+
+	var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
+	var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"]+?)\"|(data-[^\"= ]+?)(?=[\" ])", 'mg' );
+	var nodeValue = node.nodeValue;
+	var matches,
+		matchesClass;
+	if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
+
+		var classes = matches[1];
+		nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
+		node.nodeValue = nodeValue;
+		while( matchesClass = mardownClassRegex.exec( classes ) ) {
+			if( matchesClass[2] ) {
+				elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
+			} else {
+				elementTarget.setAttribute( matchesClass[3], "" );
 			}
-			return true;
 		}
-		return false;
+		return true;
 	}
+	return false;
+}
 
-	/**
-	 * Add attributes to the parent element of a text node,
-	 * or the element of an attribute node.
-	 */
-	function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
-
-		if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
-			previousParentElement = element;
-			for( var i = 0; i < element.childNodes.length; i++ ) {
-				childElement = element.childNodes[i];
-				if ( i > 0 ) {
-					j = i - 1;
-					while ( j >= 0 ) {
-						aPreviousChildElement = element.childNodes[j];
-						if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
-							previousParentElement = aPreviousChildElement;
-							break;
-						}
-						j = j - 1;
+/**
+ * Add attributes to the parent element of a text node,
+ * or the element of an attribute node.
+ */
+function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
+
+	if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
+		var previousParentElement = element;
+		for( var i = 0; i < element.childNodes.length; i++ ) {
+			var childElement = element.childNodes[i];
+			if ( i > 0 ) {
+				var j = i - 1;
+				while ( j >= 0 ) {
+					var aPreviousChildElement = element.childNodes[j];
+					if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
+						previousParentElement = aPreviousChildElement;
+						break;
 					}
-				}
-				parentSection = section;
-				if( childElement.nodeName ==  "section" ) {
-					parentSection = childElement ;
-					previousParentElement = childElement ;
-				}
-				if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
-					addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
+					j = j - 1;
 				}
 			}
-		}
-
-		if ( element.nodeType == Node.COMMENT_NODE ) {
-			if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
-				addAttributeInElement( element, section, separatorSectionAttributes );
+			var parentSection = section;
+			if( childElement.nodeName ==  "section" ) {
+				parentSection = childElement ;
+				previousParentElement = childElement ;
+			}
+			if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
+				addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
 			}
 		}
 	}
 
-	/**
-	 * Converts any current data-markdown slides in the
-	 * DOM to HTML.
-	 */
-	function convertSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]:not([data-markdown-parsed])');
-
-		[].slice.call( sections ).forEach( function( section ) {
-
-			section.setAttribute( 'data-markdown-parsed', true )
-
-			var notes = section.querySelector( 'aside.notes' );
-			var markdown = getMarkdownFromSlide( section );
-
-			section.innerHTML = marked( markdown );
-			addAttributes( 	section, section, null, section.getAttribute( 'data-element-attributes' ) ||
-							section.parentNode.getAttribute( 'data-element-attributes' ) ||
-							DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
-							section.getAttribute( 'data-attributes' ) ||
-							section.parentNode.getAttribute( 'data-attributes' ) ||
-							DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
-
-			// If there were notes, we need to re-add them after
-			// having overwritten the section's HTML
-			if( notes ) {
-				section.appendChild( notes );
-			}
-
-		} );
-
-		return Promise.resolve();
-
+	if ( element.nodeType == Node.COMMENT_NODE ) {
+		if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
+			addAttributeInElement( element, section, separatorSectionAttributes );
+		}
 	}
+}
 
-	// API
-	var RevealMarkdown = {
-
-		id: 'markdown',
-
-		/**
-		 * Starts processing and converting Markdown within the
-		 * current reveal.js deck.
-		 */
-		init: function( deck ) {
-
-			if( typeof marked === 'undefined' ) {
-				throw 'The reveal.js Markdown plugin requires marked to be loaded';
-			}
+/**
+ * Converts any current data-markdown slides in the
+ * DOM to HTML.
+ */
+function convertSlides() {
 
-			if( typeof hljs !== 'undefined' ) {
-				marked.setOptions({
-					highlight: function( code, lang ) {
-						return hljs.highlightAuto( code, [lang] ).value;
-					}
-				});
-			}
+	var sections = document.querySelectorAll( '[data-markdown]:not([data-markdown-parsed])');
 
-			// marked can be configured via reveal.js config options
-			var options = deck.getConfig().markdown;
-			if( options ) {
-				marked.setOptions( options );
-			}
+	[].slice.call( sections ).forEach( function( section ) {
 
-			return processSlides().then( convertSlides );
+		section.setAttribute( 'data-markdown-parsed', true )
 
-		},
+		var notes = section.querySelector( 'aside.notes' );
+		var markdown = getMarkdownFromSlide( section );
 
-		// TODO: Do these belong in the API?
-		processSlides: processSlides,
-		convertSlides: convertSlides,
-		slidify: slidify
+		section.innerHTML = marked( markdown );
+		addAttributes( 	section, section, null, section.getAttribute( 'data-element-attributes' ) ||
+						section.parentNode.getAttribute( 'data-element-attributes' ) ||
+						DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
+						section.getAttribute( 'data-attributes' ) ||
+						section.parentNode.getAttribute( 'data-attributes' ) ||
+						DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
 
-	};
+		// If there were notes, we need to re-add them after
+		// having overwritten the section's HTML
+		if( notes ) {
+			section.appendChild( notes );
+		}
 
-	// Register our plugin so that reveal.js will call our
-	// plugin 'init' method as part of the initialization
-	Reveal.registerPlugin( RevealMarkdown );
+	} );
 
-	return RevealMarkdown;
+	return Promise.resolve();
 
-}));
+}

文件差異過大導致無法顯示
+ 1 - 1
plugin/markdown/marked.js


+ 7 - 0
plugin/math/math.es5

@@ -0,0 +1,7 @@
+/**
+ * This is used to compile a self-registering
+ * es5 compatible version of the plugin.
+ */
+
+import plugin from './math.js'
+Reveal.registerPlugin( plugin );

+ 2 - 2
plugin/math/math.js

@@ -4,7 +4,7 @@
  *
  * @author Hakim El Hattab
  */
-var RevealMath = window.RevealMath || (function(){
+var RevealMath = (function(){
 
 	var options = Reveal.getConfig().math || {};
 	var mathjax = options.mathjax || 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js';
@@ -91,4 +91,4 @@ var RevealMath = window.RevealMath || (function(){
 
 })();
 
-Reveal.registerPlugin( RevealMath );
+export default RevealMath;

+ 7 - 0
plugin/notes/notes.es5

@@ -0,0 +1,7 @@
+/**
+ * This is used to compile a self-registering
+ * es5 compatible version of the plugin.
+ */
+
+import plugin from './notes.js'
+Reveal.registerPlugin( plugin );

+ 7 - 6
plugin/notes/notes.js

@@ -23,9 +23,10 @@ var RevealNotes = (function() {
         }
 
 		if( !notesFilePath ) {
-			var jsFileLocation = document.querySelector('script[src$="notes.js"]').src;  // this js file path
-			jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, '');   // the js folder path
-			notesFilePath = jsFileLocation + 'notes.html';
+			// var jsFileLocation = document.querySelector('script[src$="notes.js"]').src;  // this js file path
+			// jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, '');   // the js folder path
+			// notesFilePath = jsFileLocation + 'notes.html';
+			notesFilePath = 'plugin/notes/notes.html'
 		}
 
 		notesPopup = window.open( notesFilePath, 'reveal.js - Notes', 'width=1100,height=700' );
@@ -156,9 +157,9 @@ var RevealNotes = (function() {
 	return {
 		id: 'notes',
 
-		init: function( revealInstance ) {
+		init: function( reveal ) {
 
-			deck = revealInstance;
+			deck = reveal;
 
 			if( !/receiver/i.test( window.location.search ) ) {
 
@@ -181,4 +182,4 @@ var RevealNotes = (function() {
 
 })();
 
-Reveal.registerPlugin( RevealNotes );
+export default RevealNotes;

+ 7 - 0
plugin/search/search.es5

@@ -0,0 +1,7 @@
+/**
+ * This is used to compile a self-registering
+ * es5 compatible version of the plugin.
+ */
+
+import plugin from './search.js'
+Reveal.registerPlugin( plugin );

+ 17 - 2
plugin/search/search.js

@@ -200,7 +200,22 @@ function Hilitor(id, tag)
 			toggleSearch();
 		}
 	}, false );
-	if( window.Reveal ) Reveal.registerKeyboardShortcut( 'CTRL + Shift + F', 'Search' );
+
 	closeSearch();
-	return { open: openSearch };
+
+	return {
+
+		id: 'search',
+
+		init: reveal => {
+
+			reveal.registerKeyboardShortcut( 'CTRL + Shift + F', 'Search' );
+
+		},
+
+		open: openSearch
+
+	}
 })();
+
+export default RevealSearch;

+ 7 - 0
plugin/zoom/zoom.es5

@@ -0,0 +1,7 @@
+/**
+ * This is used to compile a self-registering
+ * es5 compatible version of the plugin.
+ */
+
+import plugin from './zoom.js'
+Reveal.registerPlugin( plugin );

+ 21 - 23
plugin/zoom-js/zoom.js → plugin/zoom/zoom.js

@@ -1,35 +1,33 @@
-// Custom reveal.js integration
-var RevealZoom = (function(){
+/*!
+ * reveal.js Zoom plugin
+ */
+export default {
 
-	return {
-		id: 'zoom',
+	id: 'zoom',
 
-		init: function( reveal ) {
+	init: function( reveal ) {
 
-			reveal.getRevealElement().addEventListener( 'mousedown', function( event ) {
-				var defaultModifier = /Linux/.test( window.navigator.platform ) ? 'ctrl' : 'alt';
+		reveal.getRevealElement().addEventListener( 'mousedown', function( event ) {
+			var defaultModifier = /Linux/.test( window.navigator.platform ) ? 'ctrl' : 'alt';
 
-				var modifier = ( reveal.getConfig().zoomKey ? reveal.getConfig().zoomKey : defaultModifier ) + 'Key';
-				var zoomLevel = ( reveal.getConfig().zoomLevel ? reveal.getConfig().zoomLevel : 2 );
+			var modifier = ( reveal.getConfig().zoomKey ? reveal.getConfig().zoomKey : defaultModifier ) + 'Key';
+			var zoomLevel = ( reveal.getConfig().zoomLevel ? reveal.getConfig().zoomLevel : 2 );
 
-				if( event[ modifier ] && !reveal.isOverview() ) {
-					event.preventDefault();
+			if( event[ modifier ] && !reveal.isOverview() ) {
+				event.preventDefault();
 
-					zoom.to({
-						x: event.clientX,
-						y: event.clientY,
-						scale: zoomLevel,
-						pan: false
-					});
-				}
-			} );
+				zoom.to({
+					x: event.clientX,
+					y: event.clientY,
+					scale: zoomLevel,
+					pan: false
+				});
+			}
+		} );
 
-		}
 	}
 
-})();
-
-Reveal.registerPlugin( RevealZoom );
+};
 
 /*!
  * zoom.js 0.3 (modified for use with reveal.js)

+ 1 - 1
test/examples/math.html

@@ -195,7 +195,7 @@
 				},
 
 				dependencies: [
-					{ src: '../../plugin/math/math.js', async: true }
+					{ src: '../../dist/plugin/math.js', async: true }
 				]
 			});
 

+ 21 - 8
test/examples/multiple-instances.html

@@ -17,7 +17,11 @@
 		<div style="display: flex; flex-direction: row;">
 			<div class="reveal deck1" style="width: 100%; height: 50vh; margin: 10px;">
 				<div class="slides">
-					<section>1.1</section>
+					<section data-markdown>
+	                    <script type="text/template">
+	                        ## Slide attributes
+	                    </script>
+	                </section>
 					<section>1.2</section>
 					<section>1.3</section>
 				</div>
@@ -25,7 +29,11 @@
 
 			<div class="reveal deck2" style="width: 100%; height: 50vh; margin: 10px;">
 				<div class="slides">
-					<section>2.1</section>
+					<section data-markdown>
+	                    <script type="text/template">
+	                        ## Slide attributes
+	                    </script>
+	                </section>
 					<section>2.2</section>
 					<section>2.3</section>
 				</div>
@@ -34,19 +42,24 @@
 
 		<script src="../../dist/reveal.min.js"></script>
 
-		<script>
+		<script type="module">
+
+			import Markdown from '../../plugin/markdown/markdown.js';
 
 			let r1 = new Reveal( document.querySelector( '.deck1' ), {
 				embedded: true,
 				keyboard: false
 			} );
-			r1.initialize();
+			r1.initialize().then( () => {
+
+				let r2 = new Reveal( document.querySelector( '.deck2' ), {
+					embedded: true,
+					keyboard: false,
+					dependencies: [{plugin: Markdown}]
+				} );
+				r2.initialize();
 
-			let r2 = new Reveal( document.querySelector( '.deck2' ), {
-				embedded: true,
-				keyboard: false
 			} );
-			r2.initialize();
 
 		</script>
 

+ 5 - 6
test/test-markdown-element-attributes.html

@@ -122,13 +122,12 @@
 
 		</div>
 
-		<script src="../dist/reveal.min.js"></script>
-		<script>
+		<script type="module">
+			import '../js/index.js'
+			import Markdown from '../plugin/markdown/markdown.js'
+
 			Reveal.initialize({
-				dependencies: [
-					{ src: '../plugin/markdown/marked.js' },
-					{ src: '../plugin/markdown/markdown.js' },
-				]
+				dependencies: [ Markdown ]
 			}).then( function() {
 
 				QUnit.module( 'Markdown' );

+ 4 - 6
test/test-markdown-external.html

@@ -24,14 +24,12 @@
 		</div>
 
 		<script src="qunit-2.5.0.js"></script>
-		<script src="../dist/reveal.min.js"></script>
 
-		<script>
+		<script type="module">
+			import '../js/index.js'
+			import Markdown from '../plugin/markdown/markdown.js'
 			Reveal.initialize({
-				dependencies: [
-					{ src: '../plugin/markdown/marked.js' },
-					{ src: '../plugin/markdown/markdown.js' },
-				]
+				dependencies: [ Markdown ]
 			}).then( function() {
 
 				QUnit.module( 'Markdown' );

+ 6 - 8
test/test-markdown-options.html

@@ -32,15 +32,13 @@
 		</div>
 
 		<script src="qunit-2.5.0.js"></script>
-		<script src="../dist/reveal.min.js"></script>
 
-		<script>
+		<script type="module">
+			import '../js/index.js'
+			import Markdown from '../plugin/markdown/markdown.js'
+
 			Reveal.initialize({
-				dependencies: [
-					{ src: '../plugin/markdown/marked.js' },
-					// Test loading JS files with query strings
-					{ src: '../plugin/markdown/markdown.js?query=string' },
-				],
+				dependencies: [ Markdown ],
 				markdown: {
 					smartypants: true
 				}
@@ -49,7 +47,7 @@
 				QUnit.module( 'Markdown' );
 
 				QUnit.test( 'Options are set', function( assert ) {
-					assert.strictEqual( marked.defaults.smartypants, true );
+					assert.strictEqual( Reveal.getPlugin( 'markdown' ).marked.defaults.smartypants, true );
 				});
 
 				QUnit.test( 'Smart quotes are activated', function( assert ) {

+ 5 - 6
test/test-markdown-slide-attributes.html

@@ -117,14 +117,13 @@
 		</div>
 
 		<script src="qunit-2.5.0.js"></script>
-		<script src="../dist/reveal.min.js"></script>
 
-		<script>
+		<script type="module">
+			import '../js/index.js'
+			import Markdown from '../plugin/markdown/markdown.js'
+
 			Reveal.initialize({
-				dependencies: [
-					{ src: '../plugin/markdown/marked.js' },
-					{ src: '../plugin/markdown/markdown.js' },
-				]
+				dependencies: [ Markdown ]
 			}).then( function() {
 
 				QUnit.module( 'Markdown' );

+ 5 - 6
test/test-markdown.html

@@ -41,13 +41,12 @@
 
 		</div>
 
-		<script src="../dist/reveal.min.js"></script>
-		<script>
+		<script type="module">
+			import '../js/index.js'
+			import Markdown from '../plugin/markdown/markdown.js'
+
 			Reveal.initialize({
-				dependencies: [
-					{ src: '../plugin/markdown/marked.js' },
-					{ src: '../plugin/markdown/markdown.js' },
-				]
+				dependencies: [ Markdown ]
 			}).then( function() {
 
 				QUnit.module( 'Markdown' );

部分文件因文件數量過多而無法顯示