如何使用Redcarpet在Rails中将YouTube视频嵌入Markdown?

4

我正在Rails 4.1中使用Redcarpet的Markdown解析器,以便员工可以互相写带有一些格式的消息。我也想让他们能够嵌入YouTube视频。也许类似于:

Hey, *check out* my video: [VMD-z2Xni8U](youtube)

这将输出:

嘿,看看我的视频:<iframe width="560" height="315" src="//www.youtube.com/embed/VMD-z2Xni8U" frameborder="0" allowfullscreen></iframe>

在Redcarpet的Markdown解析器中有没有办法做到这一点?我想我可能需要编写一种自定义解析器?如果有方法,那么适当的方式是什么?可能有一种标准的Markdown方式来实现这个吗?

1个回答

8
最简单的解决方案似乎是这样的。我在我的Markdown中使用http://youtube/VMD-z2Xni8U来嵌入YouTube视频。然后,我允许Redcarpet自动链接来自动链接到这个视频。
# /lib/helpers/markdown_renderer_with_special_links.rb
class MarkdownRendererWithSpecialLinks < Redcarpet::Render::HTML
  def autolink(link, link_type)
    case link_type
      when :url then url_link(link)
      when :email then email_link(link)
    end
  end
  def url_link(link)
    case link
      when /^http:\/\/youtube/ then youtube_link(link)
      else normal_link(link)
    end
  end
  def youtube_link(link)
    parameters_start = link.index('?')
    video_id = link[15..(parameters_start ? parameters_start-1 : -1)]
    "<iframe width=\"560\" height=\"315\" src=\"//www.youtube.com/embed/#{video_id}?rel=0\" frameborder=\"0\" allowfullscreen></iframe>"
  end
  def normal_link(link)
    "<a href=\"#{link}\">#{link}</a>"
  end
  def email_link(email)
    "<a href=\"mailto:#{email}\">#{email}</a>"
  end
end

接下来我创建了一个markdown方法,用于在任何视图或控制器中显示Markdown内容:

# /app/helpers/application_helper.rb
module ApplicationHelper
  require './lib/helpers/markdown_renderer_with_special_links'
  def markdown(content)
    @markdown ||= Redcarpet::Markdown.new(MarkdownRendererWithSpecialLinks, autolink: true, space_after_headers: true, fenced_code_blocks: true)
    @markdown.render(content).html_safe
  end
end

1
http://youtube/VMD-z2Xni8U不是真正的YouTube链接。YouTube链接应该是https://www.youtube.com/v=VMD-z2Xni8U或https://youtu.be/VMD-z2Xni8U或https://www.youtube.com/watch=VMD-z2Xni8U等。而您的脚本无法运行。 - J.Luca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接