app/models/chunks/include.rb in instiki-0.9.2 vs app/models/chunks/include.rb in instiki-0.10.0
- old
+ new
@@ -1,29 +1,41 @@
-require 'chunks/wiki'
-
-# Includes the contents of another page for rendering.
-# The include command looks like this: "[[!include PageName]]".
-# It is a WikiLink 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::WikiLink
- def self.pattern() /^\[\[!include(.*)\]\]\s*$/i end
-
- attr_reader :page_name
-
- def initialize(match_data)
- super(match_data)
- @page_name = match_data[1].strip
- end
-
- # This replaces the [[!include PageName]] text with
- # the contents of PageName if it exists. Otherwise
- # a warning is displayed.
- def mask(content)
- page = content.web.pages[page_name]
- (page ? page.content : "<em>Could not include #{page_name}</em>")
- end
-
- # Keep this chunk regardless of what happens.
- def unmask(content) self end
-end
+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*/i
+ def self.pattern() INCLUDE_PATTERN end
+
+
+ def initialize(match_data, content)
+ super
+ @page_name = match_data[1].strip
+ @unmask_text = get_unmask_text_avoiding_recursion_loops
+ end
+
+ private
+
+ def get_unmask_text_avoiding_recursion_loops
+ if refpage then
+ if refpage.wiki_includes.include?(@content.page_name)
+ # this will break the recursion
+ @content.delete_chunk(self)
+ refpage.clear_display_cache
+ return "<em>Recursive include detected; #{@page_name} --> #{@content.page_name} " +
+ "--> #{@page_name}</em>\n"
+ else
+ @content.merge_chunks(refpage.display_content)
+ return refpage.display_content.pre_rendered
+ end
+ else
+ return "<em>Could not include #{@page_name}</em>\n"
+ end
+ end
+
+end