你好,我正在使用HAML来渲染我的博客文章,我决定迁移到新的Ruby版本,新的Rails版本和新的HAML版本。问题是,似乎有些东西改变了,我无法确定我的代码出了什么问题。
谁能告诉我为了使用新版本需要改变什么?
更新:意识到它可能与Redcarpet有关,而不是HAML,但不确定:3
正如您将看到的,我使用这个自定义渲染器从其链接自动显示tweet或Spotify歌曲。同样的代码块由CodeRay着色。
module Haml::Filters
require "net/https"
require "uri"
include Haml::Filters::Base
class MarkdownRenderer < Redcarpet::Render::HTML
def block_code(code, language)
CodeRay.highlight(code, language, {:line_number_anchors => false, :css => :class})
end
def autolink(link, link_type)
twitterReg = /https?://twitter.com/[a-zA-Z]+/status(es)?/([0-9]+)/
spotifyReg = /(https?://open.spotify.com/(track|user|artist|album)/[a-zA-Z0-9]+(/playlist/[a-zA-Z0-9]+|)|spotify:(track|user|artist|album):[a-zA-Z0-9]+(:playlist:[a-zA-Z0-9]+|))/
if link_type == :url
if link =~ twitterReg
tweet = twitterReg.match(link)
urlTweet = tweet[0]
idTweet = tweet[2]
begin
uri = URI.parse("https://api.twitter.com/1/statuses/oembed.json?id=#{idTweet}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
jsonTweet = ActiveSupport::JSON.decode(response.body)
jsonTweet["html"]
rescue Exception => e
"<a href='#{link}'><span data-title='#{link}'>#{link}</span></a>"
end
elsif link =~ spotifyReg
spotify = $1
htmlSpotify = "<iframe style="width: 80%; height: 80px;" src="https://embed.spotify.com/?uri=#{spotify}" frameborder="0" allowtransparency="true"></iframe>"
htmlSpotify
else
"<a href='#{link}'><span data-title='#{link}'>#{link}</span></a>"
end
end
end
def link(link, title, content)
"<a href='#{link}'><span data-title='#{content}'>#{content}</span></a>"
end
def postprocess(full_document)
full_document.gsub!(/<p><img/, "<p class='images'><img")
full_document.gsub!(/<p><iframe/, "<p class='iframes'><iframe")
full_document
end
end
def render(text)
Redcarpet::Markdown.new(MarkdownRenderer.new(:hard_wrap => true), :tables => true, :fenced_code_blocks => true, :autolink => true, :strikethrough => true).render(text)
end
end
看起来HAML 4现在使用Tilt作为Markdown的过滤器。
我没有提到它,但是我在尝试将代码迁移到Ruby 2之前使用了lazy_require;在HAML 4中lazy_require已经不存在了
在重新定义你自己的Markdown模块之前,你必须使用remove_filter方法来禁用默认的Markdown模块。
下面是一个基本的工作代码:module Haml::Filters
include Haml::Filters::Base
remove_filter("Markdown") # Removes basic filter (lazy_require is dead)
module Markdown
def render text
markdown.render text
end
private
def markdown
@markdown ||= Redcarpet::Markdown.new Redcarpet::Render::HTML, {
autolink: true,
fenced_code: true,
generate_toc: true,
gh_blockcode: true,
hard_wrap: true,
no_intraemphasis: true,
strikethrough: true,
tables: true,
xhtml: true
}
end
end
end
在解决这个问题后,我遇到了另一个问题,因为我使用RedCarpet而不是RedCarpet (NameError),并且很难实现它:/…