Я использую разметку для комментариев на моем сайте, и я хочу, чтобы пользователи могли создавать разрывы строк, нажимая введите вместо пробел пробел введите ( см. этот мета-вопрос для получения дополнительной информации подробнее об этой идее )
Как я могу сделать это в Ruby? Вы могли бы подумать, что Github Flavored Markdown будет именно тем, что мне нужно, но (что удивительно) он довольно глючит.
# 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 конечных пробела. Здесь:
В источнике этого вопроса есть 2 конечных пробела после «элемента 1», и все же, если вы посмотрите на HTML, нет лишних
Это заставляет меня думать, что лучшим регулярным выражением для преобразования новой строки в
является просто:
text.gsub!(/^[^\n]+\n+/) do |x|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
end
Мысли?