是否有一种方法可以使用Redcarpet或blueccloth,这样当它插入markdown时就不会产生任何标题?
例如:#header 1
收益率:
<标题>头1报头1(首选)
标题>
:
##header 2
收益率:
头2
报头2(首选)
你可以在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] ? "nn\#" : '#' }
end
pound_filter text
# => # Hello
#
# ## World
Markdown.new(pound_filter text).to_html
# => <p># Hello</p>
#
# <p>## World</p>
最后一条显示为:
#你好
# #世界
不幸的是,你最终会进入这样一个奇怪的领域,在引号里面有一个标题:
> ## Heading
…
在这里看到一个类似的解决方案:
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>
&</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
我还没有测试过,但这是一个想法。
您应该能够用反斜杠转义降价源文本:
# 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
考虑到Markdown预解析很难,而且Markdown允许插入HTML,那么从生成的HTML中去掉标题元素怎么样?