blob: 6ad390a6c95e5d0d3fd15f7b6e2af363936669a8 [file] [log] [blame]
# 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']['url'])
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']['url']) + '/' + 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)