Javi Moreno Apuntes Fichas de Lectura Archivo Sobre mi
Blog Logo

Javi


5 minutos de lectura

Debo estar pasando por un momento minimalista porque cada vez que me pongo un rato con el blog no es para escribir nada nuevo sino para quitar dependencias. Hace tiempo que pase de Octopress 2.x a Jekyll pero todavía seguía usando algunos Plugins de Octopress 3.0 y otros míos.

Esta semana he eliminado todas las dependencias de Octopress excepto la que facilita el despliegue. Hoy, después de hacer algunos pequeños ajustes en los estilos he decidido también eliminar los Plugins que hice para usar Karmacracy como a cortador de url´s.

El único motivo es que cada día comparto menos enlaces y no estoy muy pendiente de si lo que comparto se mira mucho o poco... Como tampoco quiero que se pierda mi trabajillo, si alguien lo considera útil, aquí tiene mis Plugins

El primero es un fichero llamado karmacracy.rb y que se encarga de acortar los enlaces a los nuevos post que vamos creando:

module Karmacracy
  class Generator < Jekyll::Generator
    def generate(site)

      if File.exists? ".karmaplugin/tweets.info"
        File.open(".karmaplugin/tweets.info", 'rb') {|f| @tweets = Marshal::load(f)}
      else
        @tweets = []
      end
      
      site.posts.each { |post|
        
        url = Jekyll.configuration({})['url']
        permalink = url + post.url 

        tweet_posted = @tweets.detect {|tweet| tweet["post"] == permalink }
        if !(tweet_posted)
          puts "## Creando karmalinks para nuevas entradas: " + post.title
          karmacracy_user = Jekyll.configuration({})['karmacracy_user']
          karmacracy_key = Jekyll.configuration({})['karmacracy_key']
          kcyshorter = "http://kcy.me/api/?u=#{karmacracy_user}&key=#{karmacracy_key}&url=#{CGI.escape(permalink)}"
          result = Net::HTTP.get(URI.parse(kcyshorter))
          tweet = {"post" => permalink, "title" => post.title, "klink" => result, "tweet" => ""}
          @tweets << tweet
        end 
      }
      
      File.open(".karmaplugin/tweets.info", 'wb') {|f| f.write(Marshal.dump(@tweets)) }
      
    end
  end
end

Para que este plugin funcione, en el fichero _config.yml tienen que existir los parámetros karmacracyuser y karmacracykey. En estos parámetros se debe indicar el usuario de karmacracy y la clave para acortar urls.

Este plugin se ejecuta cada vez que se genera el blog, comprueba si cada enlace ya está acortado y si existe algún enlace sin acortar utiliza el API de Karmacracy para acortarlo. Como el objetivo de acortar los enlaces es para publicar en Twitter, se guarda un objeto con el nombre del fichero, el título, el permalink y el enlace acortado. También existe un campo para almacenar el tweet una vez se haya publicado.

Este enlace acortado lo usaba en dos sitios. El primero de ellos es en el botón para compartir en redes sociales que está al final de cada post. Para poder incluir este enlace tuve que hacer otro pequeño plugin. En un alarde de originalidad, a este lo llame kcy.rb:

module KcyFilter
    
    def kcy(permalink)
        if File.exists? ".karmaplugin/tweets.info"
            File.open(".karmaplugin/tweets.info", 'rb') {|f| @tweets = Marshal::load(f)}
            url = Jekyll.configuration({})['url']
            permalink = url + permalink
            tweet_posted = @tweets.detect {|tweet| tweet["post"] == permalink }
            if (tweet_posted)
                "#{tweet_posted["klink"]}"
            else
                "#{permalink}"   
            end
        else
            "#{permalink}"
        end
    end
end

Liquid::Template.register_filter(KcyFilter)

Lo último es la tarea de publicar el tweet en el momento en el que se está desplegando la nueva versión del blog. En mi caso, tengo un rakefile donde están diferentes tareas que ayudan a la publicación. La que se encarga de publicar el tweet es esta:

task :share_with_twitter do
 
  # Twitter config (for tweeting posts)
  client = Twitter::REST::Client.new do |config|
    config.consumer_key        = twitter_consumer_key
    config.consumer_secret     = twitter_consumer_secret
    config.access_token        = twitter_access_token
    config.access_token_secret = twitter_access_token_secret
  end
 
  if File.exists? ".karmaplugin/tweets.info"
    File.open(".karmaplugin/tweets.info", 'rb') {|f| @tweets = Marshal::load(f)}
  else
    @tweets = []
  end
   
  @tweets.each{ |tweet|
    if tweet["tweet"] == ""
      puts "Publicando tweet: " + tweet["title"]
      tweet_response = client.update("#{tweet["title"]} #{tweet["klink"]}")
      tweet["tweet"] = tweet_response
    end
  }
 
  File.open(".karmaplugin/tweets.info", 'wb') {|f| f.write(Marshal.dump(@tweets)) }
 
end

Espero que sea de utilidad.