![Brandon Mathis](/assets/img/avatar_default.png)
I think it's probably better to ship plugins with themes to make it easier to update them. 2. Improved 'install' rake task and made nicer output
84 lines
2.4 KiB
Ruby
84 lines
2.4 KiB
Ruby
# Nicked from Brandon Tilly
|
|
# Gist https://gist.github.com/803483
|
|
# Post http://brandontilley.com/2011/01/31/gist-tag-for-jekyll.html
|
|
#
|
|
# Example usage: {% gist 803483 gist_tag.rb %} //embeds a gist for this plugin
|
|
|
|
require 'digest/md5'
|
|
require 'net/https'
|
|
require 'uri'
|
|
|
|
module Jekyll
|
|
class GistTag < Liquid::Tag
|
|
def initialize(tag_name, text, token)
|
|
super
|
|
system('mkdir -p .gist_cache')
|
|
@text = text
|
|
@cache = true
|
|
@cache_folder = File.expand_path "../.gist_cache", File.dirname(__FILE__)
|
|
end
|
|
|
|
def render(context)
|
|
return "" unless @text =~ /([\d]*) (.*)/
|
|
|
|
gist, file = $1.strip, $2.strip
|
|
script_url = "https://gist.github.com/#{gist}.js?file=#{file}"
|
|
|
|
code = get_cached_gist(gist, file) || get_gist_from_web(gist, file)
|
|
code = code.gsub "<", "<"
|
|
string = "<script src='#{script_url}'></script>"
|
|
string += "<noscript><pre><code>#{code}</code></pre></noscript>"
|
|
return string
|
|
end
|
|
|
|
def get_gist_url_for(gist, file)
|
|
"https://gist.github.com/raw/#{gist}/#{file}"
|
|
end
|
|
|
|
def cache_gist(gist, file, data)
|
|
file = get_cache_file_for gist, file
|
|
File.open(file, "w+") do |f|
|
|
f.write(data)
|
|
end
|
|
end
|
|
|
|
def get_cached_gist(gist, file)
|
|
return nil if @cache == false
|
|
file = get_cache_file_for gist, file
|
|
return nil unless File.exist?(file)
|
|
return File.new(file).readlines.join
|
|
end
|
|
|
|
def get_cache_file_for(gist, file)
|
|
gist.gsub! /[^a-zA-Z0-9\-_\.]/, ''
|
|
file.gsub! /[^a-zA-Z0-9\-_\.]/, ''
|
|
md5 = Digest::MD5.hexdigest "#{gist}-#{file}"
|
|
File.join @cache_folder, "#{gist}-#{file}-#{md5}.cache"
|
|
end
|
|
|
|
def get_gist_from_web(gist, file)
|
|
gist_url = get_gist_url_for(gist, file)
|
|
raw_uri = URI.parse(gist_url)
|
|
https = Net::HTTP.new(raw_uri.host, raw_uri.port)
|
|
https.use_ssl = true
|
|
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
request = Net::HTTP::Get.new(raw_uri.request_uri)
|
|
data = https.request(request)
|
|
data = data.body
|
|
cache_gist(gist, file, data) unless @cache == false
|
|
data
|
|
end
|
|
end
|
|
|
|
class GistTagNoCache < GistTag
|
|
def initialize(tag_name, text, token)
|
|
super
|
|
@cache = false
|
|
end
|
|
end
|
|
end
|
|
|
|
Liquid::Template.register_tag('gist', Jekyll::GistTag)
|
|
Liquid::Template.register_tag('gistnocache', Jekyll::GistTagNoCache)
|
|
|