9

Rails サイトでRedcarpet Markdownを使用しています。段落、表、またはその他の要素にクラス (またはその他の属性) を追加したいことがよくありますが、それは許可されません。マークダウン要素を HTML に置き換えると、内側のマークダウンも HTML に置き換える必要があり、これは面倒です。

たとえば、クラス「テーブル」をマークダウン テーブル要素に追加したい (そのため、ブートストラップのテーブル スタイルを取得します) が、マークダウン テーブルを HTML に置き換える必要があります。

これに対する最も簡単な解決策は何ですか?クラスを処理できるようにマークダウンを変更する簡単な方法はありますか? あるいは、HTML 要素内で Markdown を許可する方法はありますか?

例の更新

クラスを div、テーブル、または段落に追加したいのですが、要素内にマークダウンを保持したままにします。たとえば、次の HTML を生成したいとします。

<p class="cool">
  <b>Hello world</b> <a href="http://google.com">Google</a>
</p>

考えられる解決策は 2 つありますが、Redcarpet Markdown でそれらを行う方法がわかりません。

  1. クラスの特別なマークダウン構文を取得します。例:

    {class: cool}
    **Hello world** [Google](http://google.com)

  2. Markdown が HTML 要素内で機能することを許可します。

    <p class="cool">
    **Hello world** [Google](http://google.com)
    </p>

現在、私はそのような要素をマークダウンなしで純粋な HTML で行っています。しかし、どうすれば#1または#2を機能させることができますか?

4

1 に答える 1

3

独自のレンダラーを ( に基づいてRedcarpet::Render::HTML) 構築できます。これにより、カスタマイズしたいメソッドがオーバーライドされます。

カスタム レンダラーは、既存のレンダラーを継承して作成されます。組み込みのレンダラーでHTMLあり、次のXHTMLように拡張できます。

# create a custom renderer that allows highlighting of code blocks
class HTMLwithPygments < Redcarpet::Render::HTML
  def block_code(code, language)
    Pygments.highlight(code, :lexer => language)
  end
end

markdown = Redcarpet::Markdown.new(HTMLwithPygments, :fenced_code_blocks => true)

ただし、新しいレンダラーを最初から作成することもできます ( lib/redcarpet/render_man.rbManpage レンダラーの実装例については、を参照してください)。

<<snip>>

次のインスタンス メソッドは、レンダラーによって実装される場合があります。

<<snip>>

  • テーブル(ヘッダー、ボディ)

<<snip>>

  • raw_html(raw_html)

たとえば、生の HTML 内でマークダウンを有効にするには、<markdown>抽出してレンダリングできる要素を宣言することをお勧めします (警告 - テストされていないコード先):

def raw_html(html)
  html.gsub(/<markdown>(.*)<\/markdown>/) { render $1 }
end

これらのメソッドをオーバーライドして、必要なクラスをテーブルに追加するかrender、生の HTML の要素から再帰的に呼び出します。

于 2014-02-18T20:38:40.953 に答える