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

标签 javascript regex markdown frontend pagedown

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

所以我想将此功能添加到此 Markdown.Converter.js ,它适用于没有任何空行的代码块。 但是如果代码块中有一个空行,这个Fence就会崩溃(截图如下)。这是此功能的 _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

最佳答案

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

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 组中捕获的值相同,但后面没有反引号。

关于javascript - Markdown 解析器支持三个反引号的代码围栏,但它被一个空行崩溃了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46888877/

相关文章:

javascript - 只要鼠标位于 div 上,每秒递增数字

javascript - 我可以使用 AngularJS 来处理和加载我的对象吗

javascript - 使用 Twitter 登录生成 token

javascript - 将一个旋转对象包含在另一个旋转对象中 FabricJS

regex - 如何在 Matlab 中打印带有千位分隔符的整数?

python - re.sub 将所有内容替换为列表中的最后一项

javascript - 匹配另外两个不同字符串之间的字符串

html - 如何更改自述文件 png 大小

html - 在浏览器刷新时自动将 markdown 转换为 html

markdown - 在 Markdown 中,如何在不创建列表的情况下以数字开始一行?