diff options
author | Hakim El Hattab <hakim.elhattab@gmail.com> | 2019-03-01 21:28:52 +0100 |
---|---|---|
committer | Hakim El Hattab <hakim.elhattab@gmail.com> | 2019-03-01 21:28:52 +0100 |
commit | 4862de26eb75d44b36849ef574db986203d3c879 (patch) | |
tree | d358131f23f3b9005866889ebcb743ce980bfcbe /js | |
parent | 213023760ab2cfaad4db022844da97e692c2ea50 (diff) | |
download | perl-software-in-gnu-guix-4862de26eb75d44b36849ef574db986203d3c879.tar perl-software-in-gnu-guix-4862de26eb75d44b36849ef574db986203d3c879.tar.gz |
async loading of external markdown, add Reveal.registerPlugin()
Diffstat (limited to 'js')
-rw-r--r-- | js/reveal.js | 104 |
1 files changed, 75 insertions, 29 deletions
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,22 +518,67 @@ 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. * * @param {string} url Address of the .js file to load @@ -1513,6 +1549,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 } ); |