class Lalala::Markdown::HtmlRenderer < Redcarpet::Render::HTML
URI_PATTERN = %r{\A(lalala|youtube|vimeo|asset)[:][/]{2}.+\Z}
def initialize(options)
@options = options.dup
@link_schemes = (options[:link_schemes] || {}).dup
# default link schemes
unless @link_schemes["asset"]
@link_schemes["asset"] = Lalala::Markdown::Handlers::Asset.new
end
super(options)
end
def autolink(link, link_type)
if link.blank?
return ""
end
if URI_PATTERN === link
return enhanced_autolink($1, link, link_type)
end
if @options[:safe_links_only] and !safe_link(link) and link_type != :email
return ""
end
url = link
url = "mailto:"+url if link_type == :email
helpers.link_to(link, url, @options[:link_attributes])
end
def image(link, title, alt_text)
if link.blank?
return ""
end
if URI_PATTERN === link
return enhanced_image($1, link, title, alt_text)
end
if @options[:safe_links_only] and !safe_link(link)
return ""
end
helpers.image_tag(link, alt: alt_text, title: title)
end
def link(link, title, content)
if link.blank?
link = nil
end
if link and URI_PATTERN === link
return enhanced_link($1, link, title, content)
end
if link and @options[:safe_links_only] and !safe_link(link)
return ""
end
if content =~ /^\<(img|div|span|strong|em)/
content = helpers.raw(content)
end
options = (@options[:link_attributes] || {}).merge(title: title)
helpers.link_to(content.html_safe, link, options)
end
def enhanced_autolink(scheme, link, link_type)
handler = @link_schemes[scheme]
if handler
handler.link(link, nil, nil)
else
""
end
end
def enhanced_image(scheme, link, title, alt_text)
handler = @link_schemes[scheme]
if handler
handler.image(link, alt_text, title)
else
""
end
end
def enhanced_link(scheme, link, title, content)
handler = @link_schemes[scheme]
if handler
handler.link(link, content, title)
else
""
end
end
private
def safe_link(link)
case link
when %r{^/}
return true
when %r{^(http|https|ftp)[:]//}
return true
when %r{^mailto[:]}
return true
else
return false
end
end
def helpers
ApplicationController.helpers
end
end