liquid tag for gist embeds
This commit is contained in:
parent
969fec81b3
commit
45bc494d22
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
_site
|
_site
|
||||||
_drafts
|
_drafts
|
||||||
|
.gist-cache
|
100
_plugins/gist_tag.rb
Normal file
100
_plugins/gist_tag.rb
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
# A Liquid tag for Jekyll sites that allows embedding Gists and showing code for non-JavaScript enabled browsers and readers.
|
||||||
|
# by: Brandon Tilly
|
||||||
|
# Source URL: https://gist.github.com/1027674
|
||||||
|
# Post http://brandontilley.com/2011/01/31/gist-tag-for-jekyll.html
|
||||||
|
#
|
||||||
|
# Example usage: {% gist 1027674 gist_tag.rb %} //embeds a gist for this plugin
|
||||||
|
|
||||||
|
require 'cgi'
|
||||||
|
require 'digest/md5'
|
||||||
|
require 'net/https'
|
||||||
|
require 'uri'
|
||||||
|
|
||||||
|
module Jekyll
|
||||||
|
class GistTag < Liquid::Tag
|
||||||
|
def initialize(tag_name, text, token)
|
||||||
|
super
|
||||||
|
@text = text
|
||||||
|
@cache_disabled = false
|
||||||
|
@cache_folder = File.expand_path "../.gist-cache", File.dirname(__FILE__)
|
||||||
|
FileUtils.mkdir_p @cache_folder
|
||||||
|
end
|
||||||
|
|
||||||
|
def render(context)
|
||||||
|
if parts = @text.match(/([\d]*) (.*)/)
|
||||||
|
gist, file = parts[1].strip, parts[2].strip
|
||||||
|
script_url = script_url_for gist, file
|
||||||
|
code = get_cached_gist(gist, file) || get_gist_from_web(gist, file)
|
||||||
|
html_output_for script_url, code
|
||||||
|
else
|
||||||
|
""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def html_output_for(script_url, code)
|
||||||
|
code = CGI.escapeHTML code
|
||||||
|
<<-HTML
|
||||||
|
<div><script src='#{script_url}'></script>
|
||||||
|
<noscript><pre><code>#{code}</code></pre></noscript></div>
|
||||||
|
HTML
|
||||||
|
end
|
||||||
|
|
||||||
|
def script_url_for(gist_id, filename)
|
||||||
|
"https://gist.github.com/#{gist_id}.js?file=#{filename}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_gist_url_for(gist, file)
|
||||||
|
"https://raw.github.com/gist/#{gist}/#{file}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def cache(gist, file, data)
|
||||||
|
cache_file = get_cache_file_for gist, file
|
||||||
|
File.open(cache_file, "w") do |io|
|
||||||
|
io.write data
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_cached_gist(gist, file)
|
||||||
|
return nil if @cache_disabled
|
||||||
|
cache_file = get_cache_file_for gist, file
|
||||||
|
File.read cache_file if File.exist? cache_file
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_cache_file_for(gist, file)
|
||||||
|
bad_chars = /[^a-zA-Z0-9\-_.]/
|
||||||
|
gist = gist.gsub bad_chars, ''
|
||||||
|
file = file.gsub bad_chars, ''
|
||||||
|
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
|
||||||
|
proxy = ENV['http_proxy']
|
||||||
|
if proxy
|
||||||
|
proxy_uri = URI.parse(proxy)
|
||||||
|
https = Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port).new raw_uri.host, raw_uri.port
|
||||||
|
else
|
||||||
|
https = Net::HTTP.new raw_uri.host, raw_uri.port
|
||||||
|
end
|
||||||
|
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, file, data unless @cache_disabled
|
||||||
|
data
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class GistTagNoCache < GistTag
|
||||||
|
def initialize(tag_name, text, token)
|
||||||
|
super
|
||||||
|
@cache_disabled = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Liquid::Template.register_tag('gist', Jekyll::GistTag)
|
||||||
|
Liquid::Template.register_tag('gistnocache', Jekyll::GistTagNoCache)
|
@ -127,6 +127,10 @@ article pre {
|
|||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
article .gist-file pre {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
article footer time {
|
article footer time {
|
||||||
display: block;
|
display: block;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user