async loading of external markdown, add Reveal.registerPlugin()

This commit is contained in:
Hakim El Hattab
2019-03-01 21:28:52 +01:00
parent 213023760a
commit 4862de26eb
2 changed files with 188 additions and 107 deletions

View File

@ -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 } );