Markdown 解析器支持三个反引号的代码围栏,但它被一个空行崩溃了

Markdown parser supports code fence with three backticks, but it's crashed by a blankline

Stack Exchange 的 Markdown 解析器只允许四个 space 缩进来表示代码块,但许多其他 Markdown 转换器支持带有 3 个反引号的 Code Fence,例如 CommonMark、Github 风格的 Markdown。

所以我想将此功能添加到此 Markdown.Converter.js,它适用于没有任何空行的代码块。 但是如果代码块中有一个空行,这个Fence就会崩溃(截图如下)。这是此功能的 _DoCodeFence 函数:

function _DoCodeFence(text) { text = text.replace(/(^|[^\`])(`{3,})(\n)(?!`)([^\r]*?[^`])(?!`)/gm, function (wholeMatch, m1, m2, m3, m4, m5) { var c = m4; c = c.replace(/^([ \t]*)/g, ""); c = c.replace(/[ \t]*$/g, ""); c = _EncodeCode(c); c = c.replace(/:\/\//g, "~P"); return m1 + "<pre><code>" + c + "</code></pre>"; } ); return text; }

您需要按以下方式修复正则表达式:

function _DoCodeFence(text) {
    text = text.replace(/((?:^|[^\])(?:\{2})*)(`{3,})(\r?\n)(?!`)([^\r]*?[^`])(?!`)/gm,
        function (wholeMatch, m1, m2, m3, m4, m5) {
            var c = m4;
            c = c.replace(/^[^\S\r\n]+|[^\S\r\n]+$/g, "");
            //c = _EncodeCode(c);
            c = c.replace(/:\/\//g, "~P");
            return m1 + "<pre><code>" + c + "</code></pre>";
        }
    );
    return text;
}
console.log(_DoCodeFence("\\```\n code\n   here\n```\n\n```\nCODE\n\n   HERE\n```"));

正则表达式详细信息

  • ((?:^|[^\])(?:\{2})*) - 第 1 组:行首 (^) 或 (|) 除 \ ([^\]) 以外的任何字符具有 0+ 个 2 \ 个字符的序列(用于确保 ` 未转义)
  • (`{3,}) - 第 2 组:三个或更多反引号
  • (\r?\n)(?!`) - 第 3 组:换行符(CRLF 或 LF)后没有反引号
  • ([^\r]*?[^`]) - 第 4 组:除 CR 之外的任何 0+ 个字符尽可能少,然后是反引号以外的字符
  • (?!`) - 与第 2 组中捕获的值相同,但后面没有反引号。