在RDiscount输出中生成nofollow链接

时间:2011-01-16 09:38:21

标签: ruby-on-rails ruby markdown rdiscount

我的rails应用程序使用RDiscount从用户提供的降价文本生成HTML,我注意到锚标签没有rel =“nofollow”。这对我来说是一个大问题,因为我的应用程序向公众开放。有没有办法启用nofollow链接,还是有更好的解决方案?

谢谢!

4 个答案:

答案 0 :(得分:3)

我认为只有Kramdown这是可能的,这是一个带有扩展语法的ruby Markdown解析器。然后你会这样做,如链接所示:

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

答案 1 :(得分:2)

与此同时,我正在使用这个hack,通过重新解析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

虽然我认为这应该由降价解析器处理。

答案 2 :(得分:1)

我需要做类似的事情,将target="_new"添加到所有链接。使用Kramdown和自定义Kramdown::Converter::Html类解决了问题。

定义Kramdown::Converter::Html子类(某些自动加载路径中的kramdown / converter / my_html.rb)

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

我在app / helpers / application_helper.rb

中也有一个视图助手
def markdown(str)
  Kramdown::Converter::MyHtml.convert(Kramdown::Document.new(str).root)[0].html_safe
end

理想情况下应该可以使用Kramdown::Document.new(str).to_my_html.html_safe但是我无法让它在rails开发模式下工作,因为Kramdown使用const_defined?来查看转换器是否可用且不会触发自动加载磁带机。如果您知道如何解决此问题,请发表评论。

答案 3 :(得分:0)

RDiscount上有一个开放的feature request,支持以这种方式修改链接。

计划在即将推出的RDiscount 2.1.5.x版本中使用。