我在Rails4.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>
在红地毯的Markdown解析器中有什么方法可以做到这一点吗?我想我必须编写某种自定义解析器?如果有办法的话,合适的方法是什么?有没有一种标准的Markdown方式可以做到这一点?
最简单的解决方案如下。我在Markdown中使用http://youtube/VMD-z2Xni8U
来嵌入YouTube视频。然后我允许红地毯中的自动链接来自动链接这个。
# /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
方法,用于显示降价内容时的任何视图或控制器:
# /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