gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:03:21 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com