Octopress

A blogging framework for hackers.

Sharing Code Snippets

« Previous, Blogging Basics

Sharing code is important, and blogging about it should be easy and beautiful. That’s why Octopress is packed with features to make blogging your code a breeze. Though Jekyll comes with support for Pygments syntax highlighting, Octopress makes it way better. Here’s how.

  • A Sass port of Solarized syntax highlighting created specifically for Octopress.
  • Gist code embedding - by Brandon Tilly.
  • Insert code snippets from your filesystem with a download link.
  • Easy inline code blocks with <figure> and <figcaption> and optional download links.
  • Pygments caching - a Jekyll community plugin.
  • Table based line numbers added with javascript.

Solarized Highlighting

Solarized has a beautiful syntax highlighting color scheme, but reproducing it requires a highly sophisticated highlighting engine. Pygments (the highlighter Jekyll uses) processes code snippets into styleable HTML, but it isn’t nearly as powerful as the highlighting engine in Vim for example. In order to port Solarized theme to octopress, I processed its test files with Pygments and styled the output with Sass while comparing them to the Vim rendered versions.

Check out the test page to see the results.

Github Style Code Blocks

With the backtick_codeblock filter you can use Github’s lovely back tick syntax highlighting blocks. Simply start a line with three back ticks followed by a space and the language you’re using. Tab in four spaces for your code snippets, and then finish your code block with three more back ticks.

Note: Back tick code blocks are only supported in HTML and Markdown. With the Textile markup language, use the codeblocks instead.

Syntax

``` language
    code snippet
```

Example

``` ruby
    class Fixnum
      def prime?
        ('1' * self) !~ /^1?$|^(11+?)\1+$/
      end
    end
```
1
2
3
4
5
class Fixnum
def prime?
('1' * self) !~ /^1?$|^(11+?)\1+$/
end
end

This is a nice, lightweight way to add a highlighted code snippet. For features like titles and links you’ll want to look at the codeblock or include_code liquid tags.

Gist Embedding

All you need is the gist’s id and you can easily embed it in your page. This actually downloads a cache of the gist and embeds it in a <noscript> tag for RSS readers and search engines, while still using Github’s javascript gist embed code for browsers.

Syntax

{% gist gist_id [filename] %}

Example

{% gist 996818 %}

If you have a gist with multiple files, you can include files one at a time by adding the name after the gist id.

{% gist 1059334 svg_bullets.rb %}
{% gist 1059334 usage.scss %}

This plugin was developed by Brandon Tilly but I have fixed some bugs and made some improvements to it for Octopress.

Include Code Snippets

Import files on your filesystem into any blog post as embedded code snippets with syntax highlighting and a download link. In the _config.yml you can set your code_dir but the default is source/downloads/code. Simply put a file anywhere under that directory and use the following tag to embed it in a post.

Syntax

{% include_code [title] url %}

Example 1

{% include_code javascripts/test.js %}

Example 2 (with optional title)

{% include_code Testing include_code javascripts/test.js %}

This includes a file from source/downloads/code/javascripts/test.js. By default the <figcaption> will be the filename, but you can add a title before the filepath if you like.

Demo of Example 2

Testing include_code (test.js) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
sample javascript from xui
*/
var undefined,
xui,
window = this,
string = new String('string'),
document = window.document,
simpleExpr = /^#?([\w-]+)$/,
idExpr = /^#/,
tagExpr = /<([\w:]+)/,
slice = function (e) { return [].slice.call(e, 0); };
try { var a = slice(document.documentElement.childNodes)[0].nodeType; }
catch(e){ slice = function (e) { var ret=[]; for (var i=0; e[i]; i++)
ret.push(e[i]); return ret; }; }
window.x$ = window.xui = xui = function(q, context) {
return new xui.fn.find(q, context);
};

Inline Code Blocks

With this plugin you can write blocks of code directly in your posts and optionally add titles and links.

Syntax

{% codeblock [title] [url] [link text] %}

Example 1

{% codeblock %}
Awesome code snippet
{% endcodeblock %}
Awesome code snippet

Example 2

# Including a file extension in the title enables highlighting
{% codeblock Time to be Awesome - awesome.rb %}
puts "Awesome!" unless lame
{% endcodeblock %}
Time to be Awesome - awesome.rb
1
puts "Awesome!" unless lame

Example 3

# Add an optional URL to enable downloading or linking to source
{% codeblock Got pain? painreleif.sh http://example.com/painreleief.sh Download it! %}
$ rm -rf ~/PAIN
{% endcodeblock %}
Javascript Array Syntax (array.js)MDN Documentation
1
2
var arr1 = new Array(arrayLength);
var arr2 = new Array(element0, element1, ..., elementN);

The last argument link_text is optional. You may want to link to a source for download file, or documentation on some other site.

Also, see Blogging with Plugins and The Octopress plugins page