マークダウンを補間するときにヘッダーが作成されないように、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 の改行は実際にはそのようにはレンダリングされないため、1 行として表示されます。
# こんにちは世界"
...それを拡張したい場合があります:
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から見出し要素を取り除くのはどうですか?