78 lines
2.4 KiB
Ruby
78 lines
2.4 KiB
Ruby
module Locomotive
|
|
module Liquid
|
|
module Tags
|
|
class Extends < ::Liquid::Extends
|
|
|
|
attr_accessor :page_id # parent page id
|
|
|
|
def initialize(tag_name, markup, tokens, context)
|
|
if markup =~ Syntax
|
|
@template_name = $1.gsub('\'', '').strip
|
|
else
|
|
raise ::Liquid::SyntaxError.new("Error in tag 'extends' - Valid syntax: extends [template]")
|
|
end
|
|
|
|
# puts "** [Extends] #{context[:page].fullpath}"
|
|
|
|
@context = context
|
|
|
|
retrieve_parent_page
|
|
|
|
# before parsing the embedded tokens, get editable elements from parent page
|
|
@context[:page].merge_editable_elements_from_page(@context[:parent_page])
|
|
|
|
super
|
|
|
|
# puts "** after extends, @context[:templates] = #{@context[:templates].inspect}"
|
|
end
|
|
|
|
private
|
|
|
|
def parse_parent_template
|
|
page = @context[:parent_page]
|
|
|
|
template = page.template
|
|
|
|
# merge blocks ?
|
|
blocks = find_blocks(template.root.nodelist)
|
|
|
|
blocks.each_value do |block|
|
|
# puts "*** [Extends] merging #{block.name} / #{@context.object_id}"
|
|
block.send(:instance_variable_set, :"@context", @context)
|
|
block.send(:register_current_block)
|
|
end
|
|
|
|
@context[:snippets] = page.snippet_dependencies
|
|
@context[:templates] = ([*page.template_dependencies] + [@page_id]).compact
|
|
|
|
# puts "@context[:templates] = #{[*page.template_dependencies].inspect} + #{[@page_id].inspect} = #{@context[:templates].inspect}"
|
|
|
|
template
|
|
end
|
|
|
|
def retrieve_parent_page
|
|
if @template_name == 'parent'
|
|
if @context[:cached_parent]
|
|
@context[:parent_page] = @context[:cached_parent]
|
|
@context[:cached_parent] = nil
|
|
else
|
|
@context[:parent_page] = @context[:page].parent
|
|
end
|
|
else
|
|
@context[:parent_page] = @context[:cached_pages].try(:[], @template_name) ||
|
|
@context[:site].pages.where(:fullpath => @template_name).first
|
|
end
|
|
|
|
raise PageNotFound.new("Page with fullpath '#{@template_name}' was not found") if @context[:parent_page].nil?
|
|
|
|
# puts "** @page_id = #{@context[:parent_page].id}"
|
|
|
|
@page_id = @context[:parent_page].id
|
|
end
|
|
|
|
end
|
|
|
|
::Liquid::Template.register_tag('extends', Extends)
|
|
end
|
|
end
|
|
end |