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