有没有办法使用 Redcarpet 或 Bluecloth,这样当它插入降价时它不会产生任何标题?
例如:
#header 1
产量:
标题 1
标题 1(首选)
和:
##header 2
产量:
标题 2
标题 2(首选)
有没有办法使用 Redcarpet 或 Bluecloth,这样当它插入降价时它不会产生任何标题?
例如:
#header 1
产量:
标题 1
标题 1(首选)
和:
##header 2
产量:
标题 2
标题 2(首选)
好吧,你可以在 Markdown 中转义字符:
# header 1
\# header 1
## header 2
\## header 2
...给出:
标题 1
# 标题 1
标题 2
##标题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 中的换行符实际上并不会像这样呈现——它将显示为一行:
# 你好世界”
...您可能想增强它:
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>
最后一个将显示为:
# 你好
## 世界
不幸的是,您最终会进入这样的奇怪领域,其中标题位于引号内:
> ## 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
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 中删除标题元素怎么样?