aboutsummaryrefslogtreecommitdiff
path: root/plugins/include_code.rb
diff options
context:
space:
mode:
authorBrandon Mathis <brandon@imathis.com>2011-07-19 09:06:54 -0400
committerBrandon Mathis <brandon@imathis.com>2011-07-19 09:06:54 -0400
commit17c59fb1d1bf3e0c05137af4b4bd09ae271a2d31 (patch)
treea4b3b5d43173f9b02ec4b6401cb6e14f6e716a35 /plugins/include_code.rb
parent873a604e144c53cfc5465a790e43db5b7ebb429e (diff)
downloadmy_new_personal_website-17c59fb1d1bf3e0c05137af4b4bd09ae271a2d31.tar.xz
my_new_personal_website-17c59fb1d1bf3e0c05137af4b4bd09ae271a2d31.zip
Moved plugins to root directory. I'm ditching the idea of shipping plugins with themes until it's more obviously necessary. This way it's easier to merge and update plugins.
Diffstat (limited to 'plugins/include_code.rb')
-rw-r--r--plugins/include_code.rb55
1 files changed, 55 insertions, 0 deletions
diff --git a/plugins/include_code.rb b/plugins/include_code.rb
new file mode 100644
index 00000000..b063f14f
--- /dev/null
+++ b/plugins/include_code.rb
@@ -0,0 +1,55 @@
+# Title: Include Code Tag for Jekyll
+# Author: Brandon Mathis http://brandonmathis.com
+# Description: Import files on your filesystem into any blog post as embedded code snippets with syntax highlighting and a download link.
+# Configuration: You can set default import path in _config.yml (defaults to code_dir: downloads/code)
+#
+# Syntax {% include_code path/to/file %}
+#
+# Example:
+# {% include_code javascripts/test.js %}
+#
+# This will import test.js from source/downloads/code/javascripts/test.js
+# and output the contents in a syntax highlighted code block inside a figure,
+# with a figcaption listing the file name and download link
+#
+
+require 'pathname'
+
+module Jekyll
+
+ class IncludeCodeTag < Liquid::Tag
+ def initialize(tag_name, file, tokens)
+ super
+ @file = file.strip
+ end
+
+ def render(context)
+ code_dir = (context.registers[:site].config['code_dir'] || 'downloads/code')
+ code_path = (Pathname.new(context.registers[:site].source) + code_dir).expand_path
+ file = code_path + @file
+
+ if File.symlink?(code_path)
+ return "Code directory '#{code_path}' cannot be a symlink"
+ end
+
+ unless file.file?
+ return "File #{file} could not be found"
+ end
+
+ Dir.chdir(code_path) do
+ code = file.read
+ file_type = file.extname
+ url = "#{context.registers[:site].config['url']}/#{code_dir}/#{@file}"
+ source = "<figure role=code><figcaption><span>#{file.basename}</span> <a href='#{url}'>download</a></figcaption>\n"
+ source += "{% highlight #{file_type} %}\n" + code + "\n{% endhighlight %}</figure>"
+ partial = Liquid::Template.parse(source)
+ context.stack do
+ partial.render(context)
+ end
+ end
+ end
+ end
+
+end
+
+Liquid::Template.register_tag('include_code', Jekyll::IncludeCodeTag)