From 4862de26eb75d44b36849ef574db986203d3c879 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Fri, 1 Mar 2019 21:28:52 +0100 Subject: async loading of external markdown, add Reveal.registerPlugin() --- js/reveal.js | 104 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 29 deletions(-) (limited to 'js') diff --git a/js/reveal.js b/js/reveal.js index a17a33a..9b29f78 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -319,6 +319,12 @@ // Cached references to DOM elements dom = {}, + // A list of registered reveal.js plugins + plugins = {}, + + // List of asynchronously loaded reveal.js dependencies + asyncDependencies = [], + // Features supported by the browser, see #checkCapabilities() features = {}, @@ -434,7 +440,7 @@ // Hide the address bar in mobile browsers hideAddressBar(); - // Loads the dependencies and continues to #start() once done + // Loads dependencies and continues to #start() once done load(); } @@ -489,37 +495,22 @@ function load() { var scripts = [], - scriptsAsync = [], - scriptsToPreload = 0; - - // Called once synchronous scripts finish loading - function afterSynchronousScriptsLoaded() { - // Load asynchronous scripts - if( scriptsAsync.length ) { - scriptsAsync.forEach( function( s ) { - loadScript( s.src, s.callback ); - } ); - } - - start(); - } - - for( var i = 0, len = config.dependencies.length; i < len; i++ ) { - var s = config.dependencies[i]; + scriptsToLoad = 0; + config.dependencies.forEach( function( s ) { // Load if there's no condition or the condition is truthy if( !s.condition || s.condition() ) { if( s.async ) { - scriptsAsync.push( s ); + asyncDependencies.push( s ); } else { scripts.push( s ); } } - } + } ); if( scripts.length ) { - scriptsToPreload = scripts.length; + scriptsToLoad = scripts.length; // Load synchronous scripts scripts.forEach( function( s ) { @@ -527,21 +518,66 @@ if( typeof s.callback === 'function' ) s.callback(); - if( --scriptsToPreload === 0 ) { - - afterSynchronousScriptsLoaded(); - + if( --scriptsToLoad === 0 ) { + loadPlugins(); } } ); } ); } else { - afterSynchronousScriptsLoaded(); + loadPlugins(); + } + + } + + /** + * Loads all plugins that require preloading. + */ + function loadPlugins() { + + var pluginsToLoad = Object.keys( plugins ).length; + + for( var i in plugins ) { + + var plugin = plugins[i]; + + // If the plugin has an 'init' method, initialize and + // wait for the callback + if( typeof plugin.init === 'function' ) { + plugin.init( function() { + if( --pluginsToLoad === 0 ) { + loadAsyncDependencies(); + } + } ); + } + else { + pluginsToLoad -= 1; + } + + } + + if( pluginsToLoad === 0 ) { + loadAsyncDependencies(); } } + /** + * Loads all async reveal.js dependencies. + */ + function loadAsyncDependencies() { + + if( asyncDependencies.length ) { + asyncDependencies.forEach( function( s ) { + loadScript( s.src, s.callback ); + } ); + } + + start(); + + } + /** * Loads a JavaScript file from the given URL and executes it. * @@ -1512,6 +1548,15 @@ } + /** + * Registers a new plugin with this reveal.js instance. + */ + function registerPlugin( id, plugin ) { + + plugins[id] = plugin; + + } + /** * Add a custom key binding with optional description to * be added to the help screen. @@ -5845,12 +5890,13 @@ } }, - // Adds a custom key binding + // Adds/remvoes a custom key binding addKeyBinding: addKeyBinding, - - // Removes a custom key binding removeKeyBinding: removeKeyBinding, + // Called by plugins to register/unregister themselves + registerPlugin: registerPlugin, + // Programatically triggers a keyboard event triggerKey: function( keyCode ) { onDocumentKeyDown( { keyCode: keyCode } ); -- cgit v1.2.3