Интерпретировать новые строки как <br>s в уценке (стиль Github Markdown) в Ruby - PullRequest
16 голосов
/ 20 ноября 2010

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

Как я могу сделать это в 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

Мысли?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Слишком поздно, но, возможно, полезно для других людей.Я заставил его работать (но не полностью протестирован), предварительно обработав текст с помощью регулярных выражений, вот так.Это отвратительно из-за отсутствия взгляда нулевой ширины, ну да ладно.

# Append two spaces to a simple line, if it ends in newline, to render the
# markdown properly. Note: do not do this for lists, instead insert two newlines. Also, leave double newlines
# alone.
text.gsub! /^ ([\*\+\-]\s+|\d+\s+)? (.+?) (\ \ )? \r?\n (\r?\n|[\*\+\-]\s+|\d+\s+)? /xi do
  full, pre, line, spaces, post = $~.to_a
  if post != "\n" && pre.blank? && post.blank? && spaces.blank?
    "#{pre}#{line}  \n#{post}"
  elsif pre.present? || post.present?
    "#{pre}#{line}\n\n#{post}"
  else
    full
  end
end
2 голосов
/ 07 декабря 2010

Я не уверен, поможет ли это, но я просто использую simple_format () из ActionView :: Helpers :: TextHelper

ActionView simple_format

my_text = "Here is some basic text...\n...with a line break."

simple_format(my_text)

output => "<p>Here is some basic text...\n<br />...with a line break.</p>"

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

...