diff --git a/src/showdown.js b/src/showdown.js index 43920d9..e86b603 100644 --- a/src/showdown.js +++ b/src/showdown.js @@ -355,6 +355,7 @@ var _RunBlockGamut = function(text) { text = text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key); text = _DoLists(text); + text = _DoGithubCodeBlocks(text); text = _DoCodeBlocks(text); text = _DoBlockQuotes(text); @@ -889,12 +890,48 @@ var _DoCodeBlocks = function(text) { return text; } +var _DoGithubCodeBlocks = function(text) { +// +// Process Github-style code blocks +// Example: +// ```ruby +// def hello_world(x) +// puts "Hello, #{x}" +// end +// ``` +// + + + // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug + text += "~0"; + + text = text.replace(/\n```(.*)\n([^`]+)\n```/g, + function(wholeMatch,m1,m2) { + var language = m1; + var codeblock = m2; + + codeblock = _EncodeCode(codeblock); + codeblock = _Detab(codeblock); + codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines + codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace + + codeblock = "
" + codeblock + "\n
";
+
+ return hashBlock(codeblock);
+ }
+ );
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/,"");
+
+ return text;
+}
+
var hashBlock = function(text) {
text = text.replace(/(^\n+|\n+$)/g,"");
return "\n\n~K" + (g_html_blocks.push(text)-1) + "K\n\n";
}
-
var _DoCodeSpans = function(text) {
//
// * Backtick quotes are used for
spans.
@@ -946,7 +983,6 @@ var _DoCodeSpans = function(text) {
return text;
}
-
var _EncodeCode = function(text) {
//
// Encode/escape certain characters inside Markdown code runs.
@@ -1299,4 +1335,4 @@ var escapeCharacters_callback = function(wholeMatch,m1) {
} // end of Showdown.converter
// export
-if (typeof exports != 'undefined') exports.Showdown = Showdown;
\ No newline at end of file
+if (typeof exports != 'undefined') exports.Showdown = Showdown;