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