84 lines
2.7 KiB
Ruby
84 lines
2.7 KiB
Ruby
#-- encoding: UTF-8
|
|
#-- copyright
|
|
# ChiliProject is a project management system.
|
|
#
|
|
# Copyright (C) 2010-2012 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
|