Files
blog/_plugins/loopdir.rb
2014-03-17 14:11:34 -06:00

86 lines
2.0 KiB
Ruby

# inspired by
# - https://gist.github.com/jgatjens/8925165
# - http://simon.heimlicher.com/articles/2012/02/01/jekyll-directory-listing
module Jekyll
class Loopdir < Liquid::Block
include Liquid::StandardFilters
Syntax = /(#{Liquid::QuotedFragment}+)?/
def initialize(tag_name, markup, tokens)
@attributes = {}
@attributes['path'] = nil;
@attributes['parse'] = 'true';
@attributes['match'] = '*';
@attributes['sort'] = 'asc';
markup.scan(Liquid::TagAttributes) do | key, value |
@attributes[key] = value
end
if @attributes['path'].nil?
raise SyntaxError.new("The `path` attribute is missing for `loopdir` tag.")
end
if 'true' == @attributes['parse']
@attributes['parse'] = true
else
@attributes['parse'] = false
end
super
end
def render(context)
context.registers[:loopdir] ||= Hash.new(0)
files = Dir.glob(File.join(@attributes['path'], @attributes['match']))
if @attributes['sort'].casecmp('desc') == 0
files.sort! do | x, y |
y <=> x
end
else
files.sort!
end
result = []
context.stack do
files.each do |pathname|
if @attributes['parse']
data = {}
content = File.read(pathname)
if content =~ /^(---\s*\n.*?\n?)^(---\s*$\n?)/m
content = $POSTMATCH
begin
data = YAML.load($1)
rescue => e
puts "YAML Exception reading #{name}: #{e.message}"
end
end
data['name'] = File.basename(pathname, @attributes['match'].sub('*', ''))
data['path'] = pathname
data['content'] = content
context['item'] = data
else
context['item'] = pathname
end
result << render_all(@nodelist, context)
end
result
end
end
end
end
Liquid::Template.register_tag('loopdir', Jekyll::Loopdir)