mirror of
https://github.com/showdownjs/showdown.git
synced 2024-03-22 13:30:55 +08:00
A first pass at syntax extensions
This commit is contained in:
parent
5e477063df
commit
644fb7b983
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user