Redcarpet / Bluecloth不允许标题?

时间:2011-09-24 07:53:40

标签: ruby-on-rails markdown bluecloth redcarpet

有没有办法使用Redcarpet或Bluecloth,当它插入markdown时它不会产生任何标题?

例如:

#header 1

的产率:

  

标题1

     

标题1(首选)

##header 2

的产率:

  

标题2

     

标题2(首选)

4 个答案:

答案 0 :(得分:5)

好吧,你可以在Markdown中转义字符:

# header 1
\# header 1

## header 2
\## header 2

...给出:

  

标题1

     

#header 1

     

标题2

     

## header 2

如果您不想这样做,或者您正在解析其他人的Markdown并且没有选择,我建议您预先处理传入的Markdown为您执行以上操作:

def pound_filter text
  text.gsub /^#/, '\#'
end

使用Redcarpet,您可以验证它是否有效:

text = <<-END
  # Hello
  ## World
END

Markdown.new(text.to_html)
# =>  <h1>Hello</h1>
#
#     <h2>World</h2>

Markdown.new(pound_filter text).to_html
# =>  <p># Hello
#     ## World</p>

当然,由于HTML中的换行符实际上不会这样呈现 - 它将显示为一行:

  

#Hello ## World“

......你可能想要补充一点:

def pound_filter text
  text.gsub( /((\A^)|([^\A]^))#/ ) {|match| "\n" == match[0] ? "\n\n\\#" : '\#' }
end

pound_filter text
# =>  \# Hello
#
#     \## World

Markdown.new(pound_filter text).to_html
# =>  <p>\# Hello</p>
#
#     <p>\## World</p>

这最后会显示为:

  

#Hello

     

## World

不幸的是,你最终会进入这样一个奇怪的领域,其中一个标题在引号内:

> ## Heading

...但我把这作为练习留给读者。

答案 1 :(得分:1)

1。您应该能够使用反斜杠转义降价源文本:

\# not a header

2。你也可以修补它:

module RedCloth::Formatters::HTML

  [:h1, :h2, :h3, :h4, :h5, :h6].each do |m|
    define_method(m) do |opts|
      "#{opts[:text]}\n"
    end
  end

end

答案 2 :(得分:1)

看到类似的解决方案here

class RenderWithoutWrap < Redcarpet::Render::HTML
  def postprocess(full_document)
    Regexp.new(/\A<p>(.*)<\/p>\Z/m).match(full_document)[1] rescue full_document
  end
end

删除所有<p>&amp; </p>个标签。我就这样使用它并且它起作用了。我将该类放在一个名为/config/initializers/render_without_wrap.rb的新文件中。您可以对所有<h1> - <h6>代码

执行类似操作
class RenderWithoutHeaders < Redcarpet::Render::HTML
  def postprocess(full_document)
    Regexp.new(/\A<h1>(.*)<\/h1>\Z/m).match(full_document)[1] rescue full_document
    Regexp.new(/\A<h2>(.*)<\/h2>\Z/m).match(full_document)[1] rescue full_document
    Regexp.new(/\A<h3>(.*)<\/h3>\Z/m).match(full_document)[1] rescue full_document
    ...(you get the idea)
  end
end

然后你可以像这样使用它

def custom_markdown_parse(text)
  markdown = Redcarpet::Markdown.new(RenderWithoutHeaders.new(
    filter_html: true,
    hard_wrap: true,
    other_options: its_your_call
  ))
  markdown.render(text).html_safe
end

我没有测试过,但这是个主意。

答案 3 :(得分:0)

鉴于对Markdown预解析很困难,并且Markdown允许插入HTML,那么如何从生成的HTML中删除标题元素呢?