2011-01-16 5 views
4

私のレールアプリはRDiscountを使用してユーザー提供のマークダウンテキストからHTMLを生成しており、アンカータグにrel = "nofollow"がないことに気付きました。私のアプリは一般に公開されているので、これは大きな問題です。 nofollowリンクを有効にする方法はありますか、それともより良い解決策がありますか?RDiscount出力にnofollowリンクを生成する

ありがとうございます!

答えて

3

これは、Kramdown(これは拡張構文のルビーMarkdownパーサー)でのみ可能だと思います。あなたは、リンクに示すように、ということだろう。

[link](test.html){:rel='nofollow'} 
+0

実際にはコンテンツはユーザーによって提供されるため、SEOスパムを阻止する手段として、すべてのリンクに自動的にrel = "nofollow"を追加する方法が必要です。私はstackoverflowそれを行うと思います。 – widgetycrank

+0

入力していただきありがとうございます。 – widgetycrank

2

平均時間では、私はRDiscount出力を再解析し、各アンカーにREL =「nofollowを」を追加することによって、このハックを使用しています:

def markdown(input) 
    html = RDiscount.new(input).to_html 
    doc = Nokogiri::HTML::DocumentFragment.parse(html) 
    doc.css("a").each do |link| 
    link['rel'] = 'nofollow' 
    end 
    doc.to_html 
end 

これは実際にマークダウンパーサーによって処理されるべきだと思いますが、

1

私は同様のことをする必要がありました。すべてのリンクにtarget="_new"を追加してください。 KramdownとカスタムKramdown::Converter::Htmlクラスを使用して解決しました。

私もアプリ/ヘルパー/ application_helper.rb

理想的
def markdown(str) 
    Kramdown::Converter::MyHtml.convert(Kramdown::Document.new(str).root)[0].html_safe 
end 

でビューヘルパーを持っているKramdown::Converter::Htmlサブクラス(一部の自動ロードパスでkramdown/Aコンバータ/ my_html.rb)

class Kramdown::Converter::MyHtml < Kramdown::Converter::Html 
    def convert_a(el, indent) 
    el.attr['target'] = '_new' 
    super 
    end 
end 

を定義しますKramdown::Document.new(str).to_my_html.html_safeを使用するだけでいいですが、Kramdownがconst_defined?を使用してコンバータが使用可能で、オートローダーを起動していないかどうかを確認するために、レール開発モードで動作させることはできません。これを修正する方法がわかっている場合はコメントしてください。

0

このようにしてリンクの変更をサポートするRDiscountにはfeature requestが公開されています。

これは、今後のRDiscount 2.1.5.xリリースの1つに予定されています。

関連する問題