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.