Уценка - могу ли я подчеркнуть, не избегая их, и не иметь курсива уценки?

Я хочу иметь текст с подчеркиваниями в нем.

Это не код и поэтому я не хочу использовать формат кода.

Я хочу остановить уценку, рассматривая ее как инструкцию для ее выделения курсивом.

Я могу избежать _each_underscore (см.!) с \, но у меня есть в общей сложности 20, и это выглядит уродливо в источнике, трудно поддерживать и не очень DRY.

Любые другие варианты?

Ответы

Ответ 1

Некоторые реализации Markdown – в частности, версия С# на стороне сервера стека Overflow MarkdownSharp (где необязательный поведение) и клиентской версии JavaScript PageDown, но также, например, вкус GitHub – отклонились от спецификации Markdown по той самой причине, которую вы описали.

Для некоторой истории об этом, поскольку Qaru идет, см. два сообщения в блоге Three Markdown Gotchas и Markdown, Через год.

Поскольку это общепринятая критика Markdown, вероятно, есть больше реализаций, которые либо делают это поведение настраиваемым пользователем, либо просто переходят с более строгой версией. Это зависит от того, какую реализацию вы используете.

Если вы используете порт, основанный на оригинальной реализации Perl от John Gruber (т.е. версии "тонн замены регулярных выражений" ), это должно быть довольно легко сделать самим образом. Соответствующая функция, скорее всего, называется _DoItalicsAndBold (оригинальная версия Perl, Showdown/PageDown), DoItalicsAndBold (MarkdownSharp), _do_italics_and_bold (python-markdown2) или аналогичная.

Посмотрите на нашу PageDown версию этой функции для более строгих регулярных выражений, которые используются здесь в Stack Overflow:

function _DoItalicsAndBold(text) {

    // <strong> must go first:
    text = text.replace(/([\W_]|^)(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\2([\W_]|$)/g,
    "$1<strong>$3</strong>$4");

    text = text.replace(/([\W_]|^)(\*|_)(?=\S)([^\r\*_]*?\S)\2([\W_]|$)/g,
    "$1<em>$3</em>$4");

    return text;
}