2013-05-30 2 views
1

Привет, я использую HAML для рендеринга моих статей в блогах, и я решил перейти на новую версию Ruby, новую версию Rails и новую версию HAML. Проблема в том, что, похоже, что-то изменилось, и я не могу определить, что не так с моим кодом.Как перенести хелпер HAML на HAML 4?

Может ли кто-нибудь объяснить мне, что нужно изменить, чтобы работать с новой версией?

UPDATE: Реализовано это может быть связано с Redcarpet и не HAML, но не уверен: 3

Как вы увидите, я использую этот пользовательский визуализатор для автоматического отображения твитов или 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 

Спасибо за помощь;)!

+0

Если вы получили сообщение об ошибке, отправьте его вместе со своим вопросом. – toro2k

+0

Нет ошибки, она просто не работает (единственная часть, которая работает, - это метод постпроцесса). (ссылка, autolink и block_code не работают). – Fantattitude

+1

В вашем коде вы добавляете непосредственно к модулю 'Haml :: Filters'. Это опечатка - есть ли у вас модуль «Markdown»? – matt

ответ

2

Кажется, что HAML 4 теперь использует Tilt как свой фильтр для Markdown.

Я не упоминал об этом, но я использовал lazy_require, прежде чем пытаться перенести свой код на Ruby 2 & HAML 4, но в HAML 4 lazy_require больше не существует.

Вместо этого вы должны использовать метод remove_filter, чтобы отключить модуль Markdown по умолчанию, прежде чем переопределить свой собственный модуль 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) и с трудом понимая, что:/...