Permalink
Browse files

allow select and order of sidebar components to be configurable in je…

…kyll's _config.yml
  • Loading branch information...
1 parent b37ce3a commit d8b17814e0d388c208dd5cabcad878093dbd4ec8 @woodwardjd woodwardjd committed Jul 28, 2011
Showing with 62 additions and 4 deletions.
  1. +1 −4 .themes/classic/source/_includes/sidebar.html
  2. +3 −0 _config.yml
  3. +58 −0 plugins/include_array.rb
View
5 .themes/classic/source/_includes/sidebar.html
@@ -1,4 +1 @@
-{% include asides/recent_posts.html %}
-{% include asides/twitter.html %}
-{% include asides/delicious.html %}
-{% include asides/pinboard.html %}
+{% include_array asides %}
View
3 _config.yml
@@ -33,6 +33,9 @@ pygments: false
paginate: 10 # Posts per page on the blog index
recent_posts: 5 # Posts in the sidebar Recent Posts section
+# list each of the sidebar modules you want to include, in the order you want, here, adding your own in asides/custom/... if you'd like
+asides: [asides/recent_posts.html, asides/twitter.html, asides/delicious.html, asides/pinboard.html]
+
# ----------------------- #
# 3rd Party Settings #
# ----------------------- #
View
58 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)

0 comments on commit d8b1781

Please sign in to comment.