Markdown解析器支持带有三个反引号的代码栅栏,但它被一个空行

时间:2017-10-23 12:02:23

标签: javascript regex markdown frontend pagedown

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

所以我想将此功能添加到此Markdown.Converter.js,它适用于没有任何空白行的代码块。 但如果代码块中出现空白行,此围栏将崩溃(捕获屏幕如下)。以下是此功能的_DoCodeFence函数:

function _DoCodeFence(text) { text = text.replace(/(^|[^\\`])(`{3,})(\n)(?!`)([^\r]*?[^`])\2(?!`)/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; }

enter image description here

1 个答案:

答案 0 :(得分:1)

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

function _DoCodeFence(text) {
    text = text.replace(/((?:^|[^\\])(?:\\{2})*)(`{3,})(\r?\n)(?!`)([^\r]*?[^`])\2(?!`)/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(?!`) - 与第2组中捕获的值相同,但后面没有反引号。