2013-05-30 3 views
1

Bonjour, J'utilise HAML pour rendre mes articles de blog et j'ai décidé de migrer vers la nouvelle version de Ruby, la nouvelle version de Rails et la nouvelle version de HAML. Le problème est qu'il semble quelque chose a changé et je ne peux pas identifier ce qui ne va pas avec mon code.Comment migrer l'assistant HAML vers HAML 4?

Quelqu'un pourrait-il m'expliquer ce qui doit être changé pour fonctionner avec la nouvelle version?

MISE À JOUR: il peut être Réalisés liée à Redcarpet et non HAML, mais pas sûr: 3

Comme vous le verrez-je utiliser ce moteur de rendu personnalisé pour afficher automatiquement Tweets ou des chansons de Spotify de leurs liens. Identique pour les blocs de code colorés par 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 

Merci de nous aider;)!

+0

Si vous obtenez une erreur, vous devriez l'envoyer avec votre question. – toro2k

+0

Il n'y a pas d'erreur, ça ne fonctionne pas (la seule partie qui fonctionne est la méthode post-traitement). (link, autolink et block_code ne fonctionnent pas). – Fantattitude

+1

Dans votre code, vous ajoutez directement au module 'Haml :: Filters'. Est-ce une faute de frappe - avez-vous un module 'Markdown'? – matt

Répondre

2

Il semble que HAML 4 utilise maintenant Tilt comme filtre pour Markdown.

Je ne l'ai pas mentionné mais j'utilisais lazy_require avant d'essayer de migrer mon code vers Ruby 2 & HAML 4 mais dans HAML 4 lazy_require n'existe plus. A la place, vous devez utiliser la méthode remove_filter pour désactiver le module Markdown par défaut avant de redéfinir votre propre module Markdown.

Voici un code de travail de base:

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 

j'ai rencontré un autre problème après avoir résolu parce que j'utilisais RedCarpet au lieu de Redcarpet (NameError) et avait du mal à le réaliser:/...