A pastebin for markdown pages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
2.6 KiB

// jscs:disable maximumLineLength
/**
* Highlight Module
*
*
* High Level API:
*
* // Load basic dependencies and language support for present code tags
*
* highlight.init()
*
*
* // Re-highlights all code tags on demand
* // Useful when markdown has been parsed again
* // and new language occurred in the output for example
*
* highlight.update();
*
*
* Hooks To:
*
* 'document:loaded' ~> highlight.init();
* 'content:rendered' ~> highlight.update();
*
*/
(function (global) {
// Simplified debounce version (no args support)
function debounce(callback, milliseconds) {
var timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(function () {
callback();
}, milliseconds);
};
}
// Highlight callback
function highlight() {
if (!('Prism' in global)) {
throw new Error(
'[Highlight] Prism not detected. Please run `highlight.init` to load all dependencies'
);
}
global.Prism.highlightAll();
}
// Debounced highlight callback
var debouncedHighlight =
debounce(highlight, 300);
// Load minimal requirements
function loadInitialScriptsAndStyles() {
var link =
document.createElement('link');
var mainScript =
document.createElement('script');
var autoloaderScript =
document.createElement('script');
link.rel =
'stylesheet';
link.href =
'https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism-tomorrow.min.css';
mainScript.src =
'https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/prism.min.js';
autoloaderScript.src =
'https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/plugins/autoloader/prism-autoloader.min.js';
mainScript.addEventListener('load', function () {
// Load autoloader after Prism loads
document.body.appendChild(autoloaderScript);
});
autoloaderScript.addEventListener('load', function () {
global.Prism.plugins.autoloader.languages_path =
'https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/components/';
global.highlight.update();
});
document.head.appendChild(link);
document.body.appendChild(mainScript);
}
// High Level API
global.highlight = global.highlight || {
init: function () {
loadInitialScriptsAndStyles();
},
update: function () {
debouncedHighlight();
},
};
// Hooks
if ('events' in global) {
events.subscribe('document:loaded', global.highlight.init);
events.subscribe('content:rendered', global.highlight.update);
}
}(window));