Я использую markdown для комментариев на своем сайте, и хочу, чтобы пользователи могли создавать разрывы строк, нажимая enter вместо space space enter (см. этот мета-вопрос для более подробной информации об этой идее)
Как я могу это сделать в Ruby? Вы могли бы подумать, что Github Flavored Markdown будет именно тем, что мне нужно, но (удивительно), это довольно плохо.
# in very clear cases, let newlines become <br /> tags
text.gsub!(/^[\w\<][^\n]*\n+/) do |x|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
end
Эта логика требует, чтобы строка начиналась с \w
для строки в конце для создания <br>
. Причина этого требования заключается в том, что вы не должны возиться со списками: (Но см. Приведенное ниже изменение, я даже не уверен, что это имеет смысл)
* we don't want a <br> * 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
I.e., во всех этих случаях в конце первой строки должен быть <br>
, и все же GFM не добавляет один
Как ни странно, это корректно работает в javascript версии GFM.
Есть ли у кого-нибудь работающая реализация "новых строк в <br>
s" в Ruby?
Изменить: он становится еще более запутанным!
Если вы проверите Gitub официальный репозиторий Github Flavored Markdown, вы найдете еще одну новую строку в <br>
regex!:
# in very clear cases, let newlines become <br /> tags
text.gsub!(/(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+/m) do |x|
x.gsub(/^(.+)$/, "\\1 ")
end
Я не знаю, что означает это регулярное выражение, но в вышеприведенных тестовых случаях оно не улучшается.
Кроме того,, это не похоже на оправдание "не возиться со списками", требующее, чтобы строки начинались со словных символов, для начала. I.e., стандартная семантика списка разметки не изменяется независимо от того, добавили ли вы 2 конечных пробела. Здесь:
- item 1
- item 2
- item 3
В источнике этого вопроса есть два конечных пробела после "item 1", и все же, если вы посмотрите на HTML, нет лишнего <br>
Это заставляет меня думать, что лучшее регулярное выражение для преобразования строк в строку <br>
справедливо:
text.gsub!(/^[^\n]+\n+/) do |x|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
end
Мысли?