# Title: Simple Code Blocks for Jekyll # Author: Brandon Mathis http://brandonmathis.com # Description: Write codeblocks with semantic HTML5
and
elements and optional syntax highlighting — all with a simple, intuitive interface. # # Syntax: # {% codeblock [title] [url] [link text] %} # code snippet # {% endcodeblock %} # # For syntax highlighting, put a file extension somewhere in the title. examples: # {% codeblock file.sh %} # code snippet # {% endcodeblock %} # # {% codeblock Time to be Awesome! (awesome.rb) %} # code snippet # {% endcodeblock %} # # Example: # # {% codeblock Got pain? painreleif.sh http://site.com/painreleief.sh Download it! %} # $ rm -rf ~/PAIN # {% endcodeblock %} # # Output: # #
#
Got pain? painrelief.sh Download it! #

# -- nicely escaped highlighted code --
# 
#
# # Example 2 (no syntax highlighting): # # {% codeblock %} # Ooooh, sarcasm... How original! # {% endcodeblock %} # #
#
<sarcasm> Ooooh, sarcasm... How original!</sarcasm>
#
# module Jekyll class CodeBlock < Liquid::Block CaptionUrlTitle = /(\S[\S\s]*)\s+(https?:\/\/)(\S+)\s+(.+)/i CaptionUrl = /(\S[\S\s]*)\s+(https?:\/\/)(\S+)/i Caption = /(\S[\S\s]*)/ def initialize(tag_name, markup, tokens) @title = nil @caption = nil @highlight = true if markup =~ CaptionUrlTitle @file = $1 @caption = "
#{$1}#{$4}
" elsif markup =~ CaptionUrl @file = $1 @caption = "
#{$1}link
" elsif markup =~ Caption @file = $1 @caption = "
#{$1}
\n" end if @file =~ /\S[\S\s]*\.(\w+)/ @filetype = $1 end super end def render(context) output = super code = super.join source = "
" source += @caption if @caption if @filetype @filetype = 'objc' if @filetype == 'm' @filetype = 'perl' if @filetype == 'pl' source += "{% highlight #{@filetype} %}\n" + code + "\n{% endhighlight %}
" else source += "
" + code.lstrip.rstrip.gsub(/
" end partial = Liquid::Template.parse(source) context.stack do partial.render(context) end end end end Liquid::Template.register_tag('codeblock', Jekyll::CodeBlock)