在Ruby中用markdown(Github Markdown-style)解释换行符

Tom*_*man 16 ruby formatting markdown ruby-on-rails

我正在使用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
Run Code Online (Sandbox Code Playgroud)

这个逻辑要求该行以a开头的行开头\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不会添加一个

奇怪的是,这在GFMjavascript版本中正常工作.

有没有人<br>在Ruby中有一个"新行到s" 的工作实现?

编辑:它变得更加混乱!

如果你查看Github的官方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
Run Code Online (Sandbox Code Playgroud)

我不知道这个正则表达式意味着什么,但它在上述测试用例中没有做得更好.

此外,它看起来不像是"不要乱用列表",因为要求以字符开头的行开头是有效的.即,无论是否添加2个尾随空格,标准降价列表语义都不会改变.这里:

  • 第1项
  • 第2项
  • 第3项

在这个问题的来源中,在"第1项"之后有2个尾随空格,但如果你看一下HTML,就没有多余的了. <br>

这让我认为将换行符转换为<br>s 的最佳正则表达式就是:

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

思考?

Dav*_*low 2

我不确定这是否有帮助,但我只是使用 ActionView::Helpers::TextHelper 中的 simple_format()

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>"
Run Code Online (Sandbox Code Playgroud)

即使它不符合您的规格,请查看 simple_format() 源代码 .gsub!方法可能会帮助您编写自己的所需 Markdown 版本。