如何使用redcarpet gem去掉额外的空间(Ruby on Rails)

时间:2016-03-20 13:26:28

标签: ruby-on-rails haml markdown redcarpet

我正在尝试使用markdown写博客,并决定安装redcarpet gem。一切看起来都很好,pygments.rb在语法高亮方面做得很好,问题是,每当我尝试使用```放置代码块时,我得到所有行(第一个除外) )缩进6个额外的空格。如何摆脱它?

application_helper.rb

module ApplicationHelper
  class HTMLwithPygments < Redcarpet::Render::HTML
    def block_code(code, language)
      Pygments.highlight(code, lexer: language)
    end
  end

  def markdown(content)
    renderer = HTMLwithPygments.new(hard_wrap: true, filter_html: true)
    options = {
      autolink: true,
      no_intra_emphasis: true,
      disable_indented_code_blocks: true,
      fenced_code_blocks: true,
      lax_html_blocks: true,
      strikethrough: true,
      superscript: true
    }
    Redcarpet::Markdown.new(renderer, options).render(content).html_safe
  end
end

发布视图 - show.html.haml

.container
  .show.title
    = @post.title
  .show.header
    = @post.header
  .show.created_at
    = @post.created_at
  .show.content
    = markdown @post.content

这是sublime中代码的样子:

code in sublime

这就是渲染帖子的样子,复制粘贴相同的代码来发布内容:

code after copy-paste to a post content

我正在使用带有2个空格缩进的SublimeText3,视图采用html.haml格式。

这是帖子内容的确切输入:

```ruby
module ApplicationHelper
  class HTMLwithPygments < Redcarpet::Render::HTML
    def block_code(code, language)
      Pygments.highlight(code, lexer: language)
    end
  end

  def markdown(content)
    renderer = HTMLwithPygments.new(hard_wrap: true, filter_html: true)
    options = {
      autolink: true,
      no_intra_emphasis: true,
      disable_indented_code_blocks: true,
      fenced_code_blocks: true,
      lax_html_blocks: true,
      strikethrough: true,
      superscript: true
    }
    Redcarpet::Markdown.new(renderer, options).render(content).html_safe
  end
end

1 个答案:

答案 0 :(得分:1)

这是由Haml缩进块引起的,因此输出HTML格式整齐,这通常是人们想要的,但可能导致像这样的空格敏感代码出现问题。

有几种方法可以解决它。首先,如果您将:ugly option设置为true(生产中应该是这种情况),那么额外的空格将不会添加到任何地方,您将获得所需的结果。

或者,您可以使用whitespace preservation operator ~代替=。这会将块中的所有换行转换为实体(&#x000A),因此不会添加额外的空格(因为没有要添加的新行)。这将更改HTML生成,但在浏览器中查看时将按您的要求显示。