Синтаксический анализатор разметки поддерживает кодовый барьер с тремя обратными галочками, но он падает из-за пустой строки.

1

Анализатор стеков Биржа 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; }

Изображение 174551

  • 0
    Я попытался создать скрипту регулярных выражений для текущего регулярного выражения, и кажется, что он не соответствует второму блоку, и это происходит из-за последнего просмотра. Удалите последний (?!`) И второй блок будет сопоставлен.
  • 0
    Я попытался удалить последний (?! ) `, Забор все равно будет разбит при вставке пустой строки в блок кода.
Показать ещё 8 комментариев
Теги:
frontend
markdown
pagedown

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню