【问题标题】:Interpret newlines as <br>s in markdown (Github Markdown-style) in Ruby在 Ruby 中将换行符解释为 markdown(Github Markdown 样式)中的 <br>
【发布时间】: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 正是我所需要的,但是(令人惊讶的是)它有很多问题。

Here's their implementation:

# 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 开头,以在末尾换行以创建&lt;br&gt;。这个要求的原因是你不要乱用列表:(但请参阅下面的编辑;我什至不确定这是否有意义)

* 我们不想要
* 在这两个列表项之间

但是,在这些情况下,逻辑会中断:

[一些](http://google.com) [链接](http://google.com) *此行是斜体* 另一条线 > 区块引用的开始! 另一条线

也就是说,在所有这些情况下,第一行的末尾都应该有一个&lt;br&gt;,但 GFM 没有添加一个

奇怪的是,这在 javascript version of GFM 中可以正常工作。

有人在 Ruby 中实现了“&lt;br&gt;s 的新行”吗?

编辑:它变得更加混乱!

如果您查看 Github 的 official Github Flavored Markdown repository,您会发现 &lt;br&gt; 正则表达式的另一个换行符!:

# 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,没有多余的&lt;br&gt;

这让我认为将换行符转换为&lt;br&gt;s 的最佳正则表达式就是:

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

想法?

【问题讨论】:

  • “想法?” 我想你忘了包括一个问题,说明你想允许哪些情况以及你想避免哪些情况。
  • 这里的要求真的不清楚吗?将&lt;br&gt;s 解释为markdown 中的换行符是一个巨大的模因(它已在meta、github、Coding Horror 等上广泛讨论)。我不知道所有的极端情况;我更想知道是否有人成功实施了这个想法
  • 为什么不能直接用markdown或者textile?
  • @egarcia 因为 Markdown 不会将换行符解释为 &lt;br&gt;s(您需要执行 SPACE SPACE ENTER 以在标准 Markdown 中创建 &lt;br&gt;)
  • 您检查过演示页面的脚本吗?该 JavaScript 版本使用 Showdown(来自 attacklab.net/showdown),它是 Markdown 的 Perl 版本的一个端口。它与 GitHub 提供的 Ruby 代码大不相同。我注意到 WMD,WYSIWYM Markdown Editor(也来自 Attacklab.net),有你描述的逻辑问题。

标签: ruby-on-rails ruby formatting markdown


【解决方案1】:

我不确定这是否会有所帮助,但我只是使用 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!方法可能会帮助您编写自己的所需降价版本。

【讨论】:

    【解决方案2】:

    有点晚了,但也许对其他人有用。通过使用正则表达式预处理文本,我已经让它工作(但没有经过彻底测试),就像这样。由于缺少零宽度的后视,这很可怕,但是哦。

    # 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
    

    【讨论】:

      猜你喜欢
      • 2013-03-19
      • 2021-12-15
      • 2014-12-24
      • 2010-09-27
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多