【发布时间】:2010-11-20 00:07:02
【问题描述】:
我在我的网站上为 cmets 使用 markdown,我希望用户能够通过按 enter 而不是 space space 来创建换行符kbd> 输入 (see this meta question for more details on this idea)
如何在 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>。这个要求的原因是你不要乱用列表:(但请参阅下面的编辑;我什至不确定这是否有意义)
* 在这两个列表项之间
但是,在这些情况下,逻辑会中断:
[一些](http://google.com) [链接](http://google.com) *此行是斜体* 另一条线 > 区块引用的开始! 另一条线也就是说,在所有这些情况下,第一行的末尾都应该有一个<br>,但 GFM 没有添加一个
奇怪的是,这在 javascript version of GFM 中可以正常工作。
有人在 Ruby 中实现了“<br>s 的新行”吗?
编辑:它变得更加混乱!
如果您查看 Github 的 official Github Flavored Markdown repository,您会发现 <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
我不知道这个正则表达式是什么意思,但它在上述测试用例上并没有做得更好。
另外,要求行以单词字符开头的“不要乱用列表”的理由似乎并不有效。即,无论您是否添加 2 个尾随空格,标准降价列表语义都不会改变。这里:
- 项目 1
- 项目 2
- 项目 3
在这个问题的源代码中,“item 1”后面有2个空格,但是如果你看一下HTML,没有多余的<br>
这让我认为将换行符转换为<br>s 的最佳正则表达式就是:
text.gsub!(/^[^\n]+\n+/) do |x|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
end
想法?
【问题讨论】:
-
“想法?” 我想你忘了包括一个问题,说明你想允许哪些情况以及你想避免哪些情况。
-
这里的要求真的不清楚吗?将
<br>s 解释为markdown 中的换行符是一个巨大的模因(它已在meta、github、Coding Horror 等上广泛讨论)。我不知道所有的极端情况;我更想知道是否有人成功实施了这个想法 -
为什么不能直接用markdown或者textile?
-
@egarcia 因为 Markdown 不会将换行符解释为
<br>s(您需要执行 SPACE SPACE ENTER 以在标准 Markdown 中创建<br>) -
您检查过演示页面的脚本吗?该 JavaScript 版本使用 Showdown(来自 attacklab.net/showdown),它是 Markdown 的 Perl 版本的一个端口。它与 GitHub 提供的 Ruby 代码大不相同。我注意到 WMD,WYSIWYM Markdown Editor(也来自 Attacklab.net),有你描述的逻辑问题。
标签: ruby-on-rails ruby formatting markdown