2012-04-24 1 views
15

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

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

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

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

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

ответ

13

некоторых реализациях Markdown – в частности, связанной с переполнением стека в стороне сервера C# версии MarkdownSharp (где это optional behavior) и на стороне клиента JavaScript версии PageDown, но и, например, GitHub's flavor – отклонились от спецификации Markdown по той причине, которую вы описали.

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

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

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

Посмотрите на нашем PageDown version of that function для более строгих регулярных выражений, которые используются здесь на переполнение стека:

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; 
}