diff options
author | Jason Woodward <jason@jwoodward.com> | 2011-07-28 12:02:08 -0400 |
---|---|---|
committer | Jason Woodward <jason@jwoodward.com> | 2011-07-28 12:02:08 -0400 |
commit | d8b17814e0d388c208dd5cabcad878093dbd4ec8 (patch) | |
tree | 5d60d23c52d6da220ff251bafe81a9d253b82e1b /plugins | |
parent | b37ce3a8ae9c1f53f27fc936656176cf2c755362 (diff) | |
download | my_new_personal_website-d8b17814e0d388c208dd5cabcad878093dbd4ec8.tar.xz my_new_personal_website-d8b17814e0d388c208dd5cabcad878093dbd4ec8.zip |
allow select and order of sidebar components to be configurable in jekyll's _config.yml
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/include_array.rb | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/plugins/include_array.rb b/plugins/include_array.rb new file mode 100644 index 00000000..000040fb --- /dev/null +++ b/plugins/include_array.rb @@ -0,0 +1,58 @@ +# Title: Include Array Tag for Jekyll +# Author: Jason Woodward http://www.woodwardjd.com +# Description: Import files on your filesystem as specified in a configuration variable in _config.yml. Mostly cribbed from Jekyll's include tag. +# Syntax: {% include_array variable_name_from_config.yml %} +# +# Example 1: +# {% include_array asides %} +# +# _config.yml snippet: +# asides: [asides/twitter.html, asides/custom/my_picture.html] +# +module Jekyll + + class IncludeArrayTag < Liquid::Tag + Syntax = /(#{Liquid::QuotedFragment}+)/ + def initialize(tag_name, markup, tokens) + if markup =~ Syntax + @array_name = $1 + else + raise SyntaxError.new("Error in tag 'include_array' - Valid syntax: include_array [array from _config.yml]") + end + + super + end + + def render(context) + includes_dir = File.join(context.registers[:site].source, '_includes') + + if File.symlink?(includes_dir) + return "Includes directory '#{includes_dir}' cannot be a symlink" + end + + rtn = '' + (context.environments.first['site'][@array_name] || []).each do |file| + if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./ + rtn = rtn + "Include file '#{file}' contains invalid characters or sequences" + end + + Dir.chdir(includes_dir) do + choices = Dir['**/*'].reject { |x| File.symlink?(x) } + if choices.include?(file) + source = File.read(file) + partial = Liquid::Template.parse(source) + context.stack do + rtn = rtn + partial.render(context) + end + else + rtn = rtn + "Included file '#{file}' not found in _includes directory" + end + end + end + rtn + end + end + +end + +Liquid::Template.register_tag('include_array', Jekyll::IncludeArrayTag) |