Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 39 additions & 22 deletions lib/jekyll-haml/tags/haml_partial.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require 'haml'
require 'pp'

module Jekyll

Expand All @@ -9,40 +10,56 @@ def initialize(tag_name, file, tokens)
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
includes_dirs = context.registers[:site].includes_load_paths.map{ |f| File.join(f) }

if @file !~ /^[a-zA-Z0-9_\/\.-]+$/ || @file =~ /\.\// || @file =~ /\/\./
return "Include file '#{@file}' contains invalid characters or sequences"
end

return "File must have \".haml\" extension" if @file !~ /\.haml$/

Dir.chdir(includes_dir) do
choices = Dir['**/*'].reject { |x| File.symlink?(x) }
if choices.include?(@file)
source = File.read(@file)
conversion = ::Haml::Engine.new(source).render
partial = Liquid::Template.parse(conversion)
begin
return partial.render!(context)
rescue => e
puts "Liquid Exception: #{e.message} in #{self.data["layout"]}"
e.backtrace.each do |backtrace|
puts backtrace
haml_file = nil
includes_dirs.each do |dir|

if File.symlink?(dir)
return "Includes directory '#{dir}' cannot be a symlink"
end

if Dir.exists?(dir)
Dir.chdir(dir) do
choices = Dir['**/*'].reject { |x| File.symlink?(x) }
if choices.include?(@file)
# Set haml_file to first match,
# includes_load_paths returns project's _includes first, then gem's _includes,
# so user can override the gem's file.
haml_file = File.read(@file)
end
abort("Build Failed")
end
end

context.stack do
return partial.render(context)
break if haml_file

end

if haml_file
conversion = ::Haml::Engine.new(haml_file).render
partial = Liquid::Template.parse(conversion)

begin
return partial.render!(context)
rescue => e
puts "Liquid Exception: #{e.message} in #{self.data["layout"]}"
e.backtrace.each do |backtrace|
puts backtrace
end
else
"Included file '#{@file}' not found in _includes directory"
abort("Build Failed")
end

context.stack do
return partial.render(context)
end
else
"Included file '#{@file}' not found in _includes directories"
end
end
end
Expand Down