Интерпретировать символы новой строки как
в markdown (стиль Github Markdown) в Ruby

Я использую разметку для комментариев на моем сайте, и я хочу, чтобы пользователи могли создавать разрывы строк, нажимая введите вместо пробел пробел введите ( см. этот мета-вопрос для получения дополнительной информации подробнее об этой идее )

Как я могу сделать это в Ruby? Вы могли бы подумать, что Github Flavored Markdown будет именно тем, что мне нужно, но (что удивительно) он довольно глючит.

Вот ' s их реализация :

# in very clear cases, let newlines become 
tags text.gsub!(/^[\w\<][^\n]*\n+/) do |x| x =~ /\n{2}/ ? x : (x.strip!; x << " \n") end

Эта логика требует, чтобы строка начиналась с \ w для разрыва строки в конце, чтобы создать
. Причина этого требования в том, что вы не должны связываться со списками: (Но см. Правку ниже; я даже не уверен, что это имеет смысл)

* we don't want a 
* between these two list items

Однако в этих случаях логика нарушается:

[some](http://google.com)
[links](http://google.com)
*this line is in italics*
another line
> the start of a blockquote!
another line

То есть, во всех этих случаях в конце первой строки должен быть
, и все же GFM не добавляет его

Как ни странно, это работает правильно в версии javascript GFM .

Есть ли у кого-нибудь работающая реализация «новых строк для
s» в Ruby?

Редактировать: Это становится еще более запутанным!

Если вы проверите из официального репозитория Github Flavored Markdown на Github , вы найдете еще одну новую строку для
регулярное выражение!
:

# in very clear cases, let newlines become 
tags text.gsub!(/(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+/m) do |x| x.gsub(/^(.+)$/, "\\1 ") end

Я понятия не имею, что означает это регулярное выражение, но в приведенном выше тесте он не лучше

Также , не похоже, что оправдание «не связывайтесь со списками» для требования, чтобы строки начинались с символов слова, действительно с самого начала. Т.е. семантика стандартного списка уценки не меняется независимо от того, добавляете ли вы 2 конечных пробела. Здесь:

  • элемент 1
  • элемент 2
  • элемент 3

В источнике этого вопроса есть 2 конечных пробела после «элемента 1», и все же, если вы посмотрите на HTML, нет лишних

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

text.gsub!(/^[^\n]+\n+/) do |x|
  x =~ /\n{2}/ ? x : (x.strip!; x << "  \n")
end

Мысли?

16
задан Community 20 March 2017 в 10:29
поделиться