plugins/render_partial.rb
1fd21a6e
 # Title: Render Partial Tag for Jekyll
 # Author: Brandon Mathis http://brandonmathis.com
 # Description: Import files on your filesystem into any blog post and render them inline.
ba0e5ef4
 # Note: Paths are relative to the source directory, if you import a file with yaml front matter, the yaml will be stripped out.
1fd21a6e
 #
 # Syntax {% render_partial path/to/file %}
 #
 # Example 1:
 # {% render_partial about/_bio.markdown %}
 #
 # This will import source/about/_bio.markdown and render it inline.
 # In this example I used an underscore at the beginning of the filename to prevent Jekyll
 # from generating an about/bio.html (Jekyll doesn't convert files beginning with underscores)
 #
 # Example 2:
 # {% render_partial ../README.markdown %}
 #
 # You can use relative pathnames, to include files outside of the source directory.
 # This might be useful if you want to have a page for a project's README without having
 # to duplicated the contents
 #
ba0e5ef4
 #
1fd21a6e
 
 require 'pathname'
3d2d1a8b
 require './plugins/octopress_filters'
1fd21a6e
 
 module Jekyll
 
   class RenderPartialTag < Liquid::Tag
3d2d1a8b
     include OctopressFilters
08dc63a9
     def initialize(tag_name, markup, tokens)
       @file = nil
       @raw = false
       if markup =~ /^(\S+)\s?(\w+)?/
         @file = $1.strip
         @raw = $2 == 'raw'
       end
1fd21a6e
       super
     end
 
     def render(context)
       file_dir = (context.registers[:site].source || 'source')
       file_path = Pathname.new(file_dir).expand_path
       file = file_path + @file
 
       unless file.file?
         return "File #{file} could not be found"
       end
 
       Dir.chdir(file_path) do
ba0e5ef4
         contents = file.read
         if contents =~ /\A-{3}.+[^\A]-{3}\n(.+)/m
           contents = $1.lstrip
         end
3d2d1a8b
         contents = pre_filter(contents)
08dc63a9
         if @raw
           contents
         else
           partial = Liquid::Template.parse(contents)
           context.stack do
             partial.render(context)
           end
1fd21a6e
         end
       end
     end
   end
 end
 
 Liquid::Template.register_tag('render_partial', Jekyll::RenderPartialTag)