require 'chunks/wiki' # Includes the contents of another page for rendering. # The include command looks like this: "[[!include PageName]]". # It is a WikiReference since it refers to another page (PageName) # and the wiki content using this command must be notified # of changes to that page. # If the included page could not be found, a warning is displayed. class Include < WikiChunk::WikiReference INCLUDE_PATTERN = /\[\[!include\s+([^\]\s][^\]]+?)\s*\]\]/i @@included_by = [] def self.pattern() INCLUDE_PATTERN end def initialize(match_data, content) super @page_name = match_data[1].strip rendering_mode = content.options[:mode] || :show @@included_by.push(@content.page_name) @unmask_text = get_unmask_text_avoiding_recursion_loops(rendering_mode) end private def get_unmask_text_avoiding_recursion_loops(rendering_mode) if refpage if @@included_by.include?(refpage.page.name) @content.delete_chunk(self) @@included_by = [] return "Recursive include detected: #{@content.page_name} → #{@content.page_name}\n" end # TODO This way of instantiating a renderer is ugly. renderer = PageRenderer.new(refpage.current_revision) included_content = case rendering_mode when :show then renderer.display_content when :publish then renderer.display_published when :export then renderer.display_content_for_export else raise "Unsupported rendering mode #{@mode.inspect}" end @content.merge_chunks(included_content) @@included_by = [] return included_content.pre_rendered else @@included_by = [] return "Could not include #{@page_name}\n" end end end