Created
December 10, 2012 23:26
-
-
Save indirect/4254297 to your computer and use it in GitHub Desktop.
Local and remote Pygments in Octopress
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
begin | |
# First try to use pygmentize.rb | |
require 'pygments' | |
rescue LoadError | |
# If not, use heroku's hosted pygments service | |
require 'net/http' | |
require 'uri' | |
PYGMENTIZE_URL = URI.parse('http://pygmentize.herokuapp.com/') | |
end | |
require 'fileutils' | |
require 'digest/md5' | |
PYGMENTS_CACHE_DIR = File.expand_path('../../.pygments-cache', __FILE__) | |
FileUtils.mkdir_p(PYGMENTS_CACHE_DIR) | |
module HighlightCode | |
def highlight(str, lang) | |
lang = 'ruby' if lang == 'ru' | |
lang = 'objc' if lang == 'm' | |
lang = 'perl' if lang == 'pl' | |
lang = 'yaml' if lang == 'yml' | |
str = pygments(str, lang).match(/<pre>(.+)<\/pre>/m)[1].to_s.gsub(/ *$/, '') #strip out divs <div class="highlight"> | |
tableize_code(str, lang) | |
end | |
def pygments(code, lang) | |
if defined?(PYGMENTS_CACHE_DIR) | |
path = File.join(PYGMENTS_CACHE_DIR, "#{lang}-#{Digest::MD5.hexdigest(code)}.html") | |
if File.exist?(path) | |
highlighted_code = File.read(path) | |
else | |
highlighted_code = pygment_service(code, lang) | |
File.open(path, 'w') {|f| f.print(highlighted_code) } | |
end | |
else | |
highlighted_code = pygment_service(code, lang) | |
end | |
highlighted_code | |
end | |
def pygment_service(code, lang) | |
if defined?(PYGMENTIZE_URL) | |
res = Net::HTTP.post_form(PYGMENTIZE_URL, {'lang'=>lang, 'code'=>code}) | |
res.body.force_encoding("UTF-8") if res['content-type'] =~ /utf-8/i | |
res.body | |
else | |
Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8'}) | |
end | |
end | |
def tableize_code (str, lang = '') | |
table = '<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers">' | |
code = '' | |
str.lines.each_with_index do |line,index| | |
table += "<span class='line-number'>#{index+1}</span>\n" | |
code += "<span class='line'>#{line}</span>" | |
end | |
table += "</pre></td><td class='code'><pre><code class='#{lang}'>#{code}</code></pre></td></tr></table></div>" | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment