Анализатор стеков Биржа Markdown позволяет только четырехуровневые отступы представлять кодовые блоки, но многие другие преобразователи Markdown поддерживают Code Fence с тремя backticks, такими как 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; }
Вам нужно исправить регулярное выражение следующим образом:
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: начало строки (^
) или (|
) любого char, кроме \
([^\\]
)) после чего следуют последовательности 0+ 2 \
chars (он используется, чтобы убедиться, что '
не экранирован")('{3,})
- Группа 2: три или более обратных(\r?\n)(?!')
- Группа 3: разрыв строки (CRLF или LF) не сопровождается обратным шагом([^\r]*?[^'])
- Группа 4: любые 0+ символы, отличные от CR, как можно меньше, а затем символ, отличный от обратного\2(?!')
- То же значение, что и в группе 2, не сопровождаемое обратным шагом.
(?!`)
И второй блок будет сопоставлен.(?!
) `, Забор все равно будет разбит при вставке пустой строки в блок кода.