# tag to read and insert a file relative to the current working directory
# (like include, but in the dir where it is invoked)

# there is also readj which reads a file and applies jekyll processing to it
# handy if we want to include a toc.json file which itself calls {% readj child/toc.json %}
# (note however variables do not seem to be exported when use readj (TODO),
# although they are exported if you have _includes/file.md and use the standard include file)

# the argument can be a variable or a filename literal (not quoted)
# TODO: figure out how to accept a quoted string as an argument

module JekyllRead
  class ReadTag < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
      @text = text
    end
    def render(context)
	jekyllSite = context.registers[:site]
	dir = jekyllSite.source+'/'+File.dirname(context['page']['path'])
	filename = @text.strip
        filename = context[filename] || filename
	if !filename.match(/^\/.*/) 
		filename = dir + '/' + filename
	else
		filename = jekyllSite.source+'/'+filename
	end
	filename = filename.gsub(/\/\/+/,'/')
	file = File.open(filename, "rb")
	return file.read
    end
  end

  class ReadjTag < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
      @text = text
    end
    def render(context)
	jekyllSite = context.registers[:site]
	filename = @text.strip
	filename = context[filename] || filename
# support vars (above) and relative paths in filename (below - need the right path if there is a subsequent link)
        dir = filename
	if !filename.match(/^\/.*/) 
		dir = File.dirname(context['page']['path']) + '/' + filename
	end
	dir = dir.gsub(/\/\/+/,'/')
	filename = dir.sub(/^.*\//, '')
	dir = dir.gsub(/\/[^\/]*$/, '/')
	targetPage = Jekyll::Page.new(jekyllSite, jekyllSite.source, dir, filename)
	targetPage.render(jekyllSite.layouts, jekyllSite.site_payload)
	targetPage.output
    end
  end
end

Liquid::Template.register_tag('read', JekyllRead::ReadTag)
Liquid::Template.register_tag('readj', JekyllRead::ReadjTag)

