obsolete.ChilliProject/lib/chili_project/liquid/tags/include.rb

84 lines
2.7 KiB
Ruby

#-- encoding: UTF-8
#-- copyright
# ChiliProject is a project management system.
#
# Copyright (C) 2010-2011 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# See doc/COPYRIGHT.rdoc for more details.
#++
module ChiliProject::Liquid::Tags
class Include < ::Liquid::Include
# This method follows the basic flow of the default include in liquid
# We just add some additional flexibility. This method can be removed once
# https://github.com/Shopify/liquid/pull/78 got accepted
def render(context)
context.stack do
template = _read_template_from_file_system(context)
partial = Liquid::Template.parse _template_source(template)
variable = context[@variable_name || @template_name[1..-2]]
@attributes.each do |key, value|
context[key] = context[value]
end
if variable.is_a?(Array)
variable.collect do |variable|
context[@template_name[1..-2]] = variable
_render_partial(partial, template, context)
end
else
context[@template_name[1..-2]] = variable
_render_partial(partial, template, context)
end
end
end
private
def break_circle(context)
context.registers[:included_pages] ||= []
project = context['project'].identifier if context['project'].present?
template_name = context[@template_name]
cross_project_page = template_name.include?(':')
page_title = cross_project_page ? template_name : "#{project}:#{template_name}"
raise ::Liquid::FileSystemError.new("Circular inclusion detected") if context.registers[:included_pages].include?(page_title)
context.registers[:included_pages] << page_title
yield
ensure
context.registers[:included_pages].pop
end
def _template_source(wiki_content)
wiki_content.text
end
def _render_partial(partial, template, context)
break_circle(context) do
textile = partial.render(context)
# Call textilizable on the view so all of the helpers are loaded
# based on the view and not this tag
context.registers[:view].textilizable(textile, :attachments => template.page.attachments, :headings => false, :object => template)
end
end
def _read_template_from_file_system(context)
wiki_content = super
# Set the new project to that additional includes use the correct
# base project
context['project'] = wiki_content.page.wiki.project
wiki_content
end
end
end