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>
。