A first pass at syntax extensions

This commit is contained in:
Titus 2012-06-20 15:56:56 -06:00
parent 5e477063df
commit 644fb7b983

View File

@ -72,7 +72,7 @@ var Showdown = {};
// Wraps all "globals" so that the only thing // Wraps all "globals" so that the only thing
// exposed is makeHtml(). // exposed is makeHtml().
// //
Showdown.converter = function() { Showdown.converter = function(converter_options) {
// //
// Globals: // Globals:
@ -87,6 +87,40 @@ var g_html_blocks;
// (see _ProcessListItems() for details): // (see _ProcessListItems() for details):
var g_list_level = 0; var g_list_level = 0;
// Global extensions
var g_lang_extensions = new Showdown.Array();
var g_output_modifiers = new Showdown.Array();
//
// Options:
//
// Parse extensinos options into separate arrays
if (converter_options && converter_options.extensions) {
// Iterate over each plugin
var plugins = new Showown.Array(converter_options.extensions);
plugins.forEach(function(plugin){
// Iterate over each extensino within that plugin
var extensions = new Showdown.Array(plugin(this));
extensions.forEach(function(ext){
// Sort extensions by type
if (x.type) {
if (x.type === 'language' || x.type === 'lang') {
g_lang_extensions.push(x);
} else if (x.type === 'output' || x.type === 'html') {
g_output_modifiers.push(x);
}
} else {
// Assume language extension
g_lang_extensions.push(x);
}
});
});
}
this.makeHtml = function(text) { this.makeHtml = function(text) {
// //
@ -131,6 +165,11 @@ this.makeHtml = function(text) {
// contorted like /[ \t]*\n+/ . // contorted like /[ \t]*\n+/ .
text = text.replace(/^[ \t]+$/mg,""); text = text.replace(/^[ \t]+$/mg,"");
// Run language extensions
g_lang_extensions.forEach(function(x){
text = _ExecuteExtension(x, text);
});
// Handle github codeblocks prior to running HashHTML so that // Handle github codeblocks prior to running HashHTML so that
// HTML contained within the codeblock gets escaped propertly // HTML contained within the codeblock gets escaped propertly
text = _DoGithubCodeBlocks(text); text = _DoGithubCodeBlocks(text);
@ -151,9 +190,22 @@ this.makeHtml = function(text) {
// attacklab: Restore tildes // attacklab: Restore tildes
text = text.replace(/~T/g,"~"); text = text.replace(/~T/g,"~");
// Run output modifiers
g_output_modifiers.forEach(function(x){
text = _ExecuteExtension(x, text);
});
return text; return text;
}; };
var _ExecuteExtension = function(ext, text) {
if (ext.regex) {
var re = new RegExp(ext.regex, 'g');
return text.replace(re, ext.replace);
} else if (ext.filter) {
return ext.filter(text);
}
};
var _StripLinkDefinitions = function(text) { var _StripLinkDefinitions = function(text) {
// //
@ -1337,5 +1389,27 @@ var escapeCharacters_callback = function(wholeMatch,m1) {
} // end of Showdown.converter } // end of Showdown.converter
//
// Showdown.Array
// (some) ES5 methods that don't modify Array.prototype
//
Showdown.Array = function(baseArray) { this.base = baseArray ? baseArray : []; }
Showdown.Array.prototype = [];
(function(array, parent) {
array.forEach = function(callback) {
if (this.base.forEach) { this.base.forEach(callback); }
else {
var i, len = this.base.length;
for (i = 0; i < len; i++) {
callback(this.base[i], i, this.base);
}
}
};
}(Showdown.Array.prototype, Array.prototype));
// export // export
if (typeof module !== 'undefined') module.exports = Showdown; if (typeof module !== 'undefined') module.exports = Showdown;