7

rails3アプリケーションで、redcarpetを使用してユーザーの投稿とユーザーコメントセクションを処理したいと思います。そのため、redcarpetを拡張して、@usernameを自分のサイトのユーザーへのリンクに変換できるようにしたいと思います。redcarpetがCで書かれていることは知っていますが、とにかくそれをルビーで拡張する簡単な方法はありますか?Cで書くのはどれくらい難しいでしょうか?これはredcarpetの外で行う必要がありますか?

また、アプリ内の他のモデルにリンクするための省略形であるredcarpetの他の拡張機能にも興味があります。構文はまだわかりませんが、githubが問題へのリンクを処理する方法と似ていると思います。

4

2 に答える 2

23

Rails3アプリ用にRubyでredcarpetのパーサーを拡張するのは非常に簡単であることがわかりました。まったく怖くありませんでした。

まず、RedcarpetのHTMLレンダラーからクラスを派生させ、ドキュメントで推奨されているように前処理メソッドをオーバーライドすることから始めます。Rails3.2およびRails4では、このファイルはどこにでも移動でき、必要ありません。このようなコードを保持するために「services」フォルダーを使用します。

# app/services/my_flavored_markdown.rb
class MyFlavoredMarkdown < Redcarpet::Render::HTML
  def preprocess(text)
    text
  end
end

次のステップは、必要なテキスト置換を行うメソッドを追加することです。ここでは、正規表現を使用して、「@mention」のようなテキストをcssクラス「mention」を含むHTMLスパンタグでラップしています。

# app/services/my_flavored_markdown.rb
class MyFlavoredMarkdown < Redcarpet::Render::HTML

  def preprocess(text)
    wrap_mentions(text)
  end

  def wrap_mentions(text)
    text.gsub! /(^|\s)(@\w+)/ do
      "#{$1}<span class='mention'>#{$2}</span>"
    end
    text
  end

end

ユーザーのプロファイルページを簡単に検索して、代わりに@mentionをアンカータグでラップすることもできます。私の場合、同じように機能する絵文字とハッシュタグのメソッドを作成し、メソッドをチェーン化しました。

最後のステップは、テキストを受け入れ、Redcarpetから派生したクラスのインスタンスを作成し、処理のためにテキストをそのインスタンスに渡して、htmlの結果を返すヘルパーを追加することです。

# app/helpers/application_helper.rb
def flavored_markdown_to_html(text)
  renderer = MyFlavoredMarkdown.new()
  # These options might be helpful but are not required
  options = {
    safe_links_only: true,
    no_intra_emphasis: true,
    autolink: true
  }
  Redcarpet::Markdown.new(renderer, options).render(text)
}

あなたの見解では、あなたはそれをこのように呼ぶことができます:

<%= flavored_markdown_to_html("This is something worth @mentioning") %>

その場合、出力は次のようになります。

This is something worth <span class='mention'>@mentioning</span>

于 2013-05-10T01:25:13.503 に答える
1

私はかつて延長しようとしredcarpetましたが、それは非常に困難でした。他に依存関係がない場合は、優れたペグマークダウンへのバインディングを提供する(やや時代遅れの)Rubygemredcarpetを試してみることをお勧めします。rpeg-markdown

peg-markdown正式な文法として書かれたマークダウンインタプリタです。これは、独自の構文で拡張するのが非常に簡単であることを意味します。私はpeg-markdown自分のプロジェクトの拡張に成功し(ここで私のフォークを参照)、のカスタムパーサーコードをいじるよりもはるかに簡単であることがわかりました。redcarpet

peg-markdownまた、バグが少ないことがわかりました。

Rubyバインディングは、gitサブモジュールを更新することによって最新にする必要がある場合があります。rpeg-markdown(最新バージョンに更新するためのプルリクエストを送信する予定ですpeg-markdown。)

于 2012-12-05T09:12:59.723 に答える