if (typeof markdown === 'undefined') var markdown = { parse: function (s) { var r = s, ii, pre1 = [], pre2 = []; // detect newline format var newline = r.indexOf('\r\n') != -1 ? '\r\n' : r.indexOf('\n') != -1 ? '\n' : '' // store {{{ unformatted blocks }}} and
 pre-formatted blocks 
r = r.replace(/{{{([\s\S]*?)}}}/g, function (x) { pre1.push(x.substring(3, x.length - 3)); return '{{{}}}'; }); r = r.replace(new RegExp('
([\\s\\S]*?)
', 'gi'), function (x) { pre2.push(x.substring(5, x.length - 6)); return '
'; });
        
        // h1 - h4 and hr
        r = r.replace(/^==== (.*)=*/gm, '

$1

'); r = r.replace(/^=== (.*)=*/gm, '

$1

'); r = r.replace(/^== (.*)=*/gm, '

$1

'); r = r.replace(/^= (.*)=*/gm, '

$1

'); r = r.replace(/^[-*][-*][-*]+/gm, '
'); // bold, italics, and code formatting r = r.replace(/\*\*(.*?)\*\*/g, '$1'); r = r.replace(new RegExp('//(((?!https?://).)*?)//', 'g'), '$1'); r = r.replace(/``(.*?)``/g, '$1'); // unordered lists r = r.replace(/^\*\*\*\* (.*)/gm, ''); r = r.replace(/^\*\*\* (.*)/gm, ''); r = r.replace(/^\*\* (.*)/gm, ''); r = r.replace(/^\* (.*)/gm, ''); for (ii = 0; ii < 3; ii++) r = r.replace(new RegExp('' + newline + '