Skip to content

Instantly share code, notes, and snippets.

@sparkertime
Created March 27, 2011 21:15
Show Gist options
  • Save sparkertime/889626 to your computer and use it in GitHub Desktop.
Save sparkertime/889626 to your computer and use it in GitHub Desktop.
require 'haml'
require 'haml/html'
require 'httparty'
module Jekyll
class SyntaxBlock < Liquid::Block
def initialize(tag_name, language, tokens)
super
@language = language
end
# Typical output of render
# :plain
# <div class="highlight"><pre><span class="k">class</span> <span class="nc">Boop</span>
# <span class="k">def</span> <span class="nf">something</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">)</span>
# <span class="k">end</span>
# <span class="k">end</span>
# </pre></div>
def render(context)
html_syntax = indent(code_to_html(super.join,@language))
":plain\n#{html_syntax}"
end
# Typical output of code_to_html:
# <div class="highlight"><pre><span class="k">class</span> <span class="nc">Boop</span>
# <span class="k">def</span> <span class="nf">something</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">)</span>
# <span class="k">end</span>
# <span class="k">end</span>
# </pre></div>
#
def code_to_html(code, language)
response = HTTParty.post('http://pygments.appspot.com/', :body => {'lang'=>language.strip, 'code'=>code})
puts "An error occured while processing this #{language} code: #{code}" unless response.success?
response.body
end
# Typical output of indent
# <div class="highlight"><pre><span class="k">class</span> <span class="nc">Boop</span>
# <span class="k">def</span> <span class="nf">something</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">)</span>
# <span class="k">end</span>
# <span class="k">end</span>
# </pre></div>
def indent(html)
indented = html.gsub(/\n/, "\n ")
" #{indented}"
end
end
end
Liquid::Template.register_tag('syntax', Jekyll::SyntaxBlock)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment