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