我在我的网站上使用Markdown来进行评论,并希望用户能够通过按 Enter 键创建换行,而不是像 space space enter 那样(详情请参见此meta问题)。
我该如何在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>
。 这个要求的原因是不希望影响列表:(但请参见下面的编辑;我甚至不确定这是否有意义)
* 我们不想要<br> * 在这两个列表项之间
然而,在以下情况下,该逻辑会出现问题:
[some](http://google.com) [links](http://google.com)
*this line is in italics* another line
> the start of a blockquote! another line
也就是说,在所有这些情况下,第一行末尾都应该有一个<br>
,但GFM没有添加。
奇怪的是,在GFM的javascript版本中,这个问题被解决了。
是否有人在Ruby中有“将换行符转换为<br>
”的实现?
编辑:更让人困惑的是!
如果您查看Github的官方Github Flavored Markdown存储库,您将找到另一个换行符转<br>
的正则表达式!
# 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
我不知道这个正则表达式是什么意思,但它在上面的测试用例中表现并不比其他解决方案更好。
而且,似乎“不要干扰列表”的理由,要求行以单词字符开头并不成立。也就是说,标准的Markdown列表语义不会因为你添加了2个尾随空格而改变。例如,这里:
- item 1
- item 2
- item 3
在这个问题的源代码中,“item 1”后面有2个尾随空格,但是如果你查看HTML,就不会看到多余的<br>
标签。
这让我想到将换行符转换为<br>
标签的最佳正则表达式只需简单地写为:
text.gsub!(/^[^\n]+\n+/) do |x|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
end
有什么想法?
<br>
解释为换行符是一种很流行的梗(在 Meta、Github、Coding Horror 等地方已经被广泛讨论过)。我并不知道所有的细节情况,我更想知道是否有人成功实现了这个想法。 - Tom Lehman<br>
(您需要在标准Markdown中输入SPACE SPACE ENTER才能创建<br>
)。 - Tom Lehman