From d32ab724d3ccdbb2447fdd4ba14c402517cce631 Mon Sep 17 00:00:00 2001 From: rick Date: Thu, 2 Dec 2010 19:28:31 -0800 Subject: [PATCH] Don't modify content inside
 tags during rendering.

---
 HISTORY.md           |  1 +
 lib/gollum/markup.rb | 46 +++++++++++++++++++++++++++++++++++++++++---
 test/test_markup.rb  | 10 ++++++++++
 3 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/HISTORY.md b/HISTORY.md
index 6938de58..fb585a03 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -9,6 +9,7 @@
     rendering for added customization.
 * Bug Fixes
   * Use `@wiki.page_class` in Gollum::Markup where appropriate (#63).
+  * Don't modify content inside 
 tags during rendering.
 
 # 1.1.0 / 2010-10-28
 
diff --git a/lib/gollum/markup.rb b/lib/gollum/markup.rb
index e63e96b1..00fb1d91 100644
--- a/lib/gollum/markup.rb
+++ b/lib/gollum/markup.rb
@@ -17,6 +17,7 @@ module Gollum
       @tagmap  = {}
       @codemap = {}
       @texmap  = {}
+      @premap  = {}
     end
 
     # Render the content with Gollum wiki syntax on top of the file's own
@@ -31,7 +32,8 @@ module Gollum
         @wiki.history_sanitizer : 
         @wiki.sanitizer
 
-      data = extract_tex(@data)
+      data = extract_tex(@data.dup)
+      data = extract_pre(data)
       data = extract_code(data)
       data = extract_tags(data)
       begin
@@ -44,6 +46,7 @@ module Gollum
       end
       data = process_tags(data)
       data = process_code(data)
+      data = process_pre(data)
       if sanitize || block_given?
         doc  = Nokogiri::HTML::DocumentFragment.parse(data)
         doc  = sanitize.clean_node!(doc) if sanitize
@@ -115,7 +118,7 @@ module Gollum
     #
     # Returns the placeholder'd String data.
     def extract_tags(data)
-      data.gsub(/(.?)\[\[(.+?)\]\]([^\[]?)/m) do
+      data.gsub!(/(.?)\[\[(.+?)\]\]([^\[]?)/m) do
         if $1 == "'" && $3 != "'"
           "[[#{$2}]]#{$3}"
         elsif $2.include?('][')
@@ -126,6 +129,7 @@ module Gollum
           "#{$1}#{id}#{$3}"
         end
       end
+      data
     end
 
     # Process all tags from the tagmap and replace the placeholders with the
@@ -357,7 +361,7 @@ module Gollum
     #
     # Returns the placeholder'd String data.
     def extract_code(data)
-      data.gsub(/^``` ?(.+?)\r?\n(.+?)\r?\n```\r?$/m) do
+      data.gsub!(/^``` ?(.+?)\r?\n(.+?)\r?\n```\r?$/m) do
         id     = Digest::SHA1.hexdigest($2)
         cached = check_cache(:code, id)
         @codemap[id] = cached   ? 
@@ -365,6 +369,7 @@ module Gollum
           { :lang => $1, :code => $2 }
         id
       end
+      data
     end
 
     # Process all code from the codemap and replace the placeholders with the
@@ -408,5 +413,40 @@ module Gollum
     # Returns nothing.
     def update_cache(type, id, data)
     end
+
+    #########################################################################
+    #
+    # Code
+    #
+    #########################################################################
+
+    # Extract all code blocks into the codemap and replace with placeholders.
+    #
+    # data - The raw String data.
+    #
+    # Returns the placeholder'd String data.
+    def extract_pre(data)
+      data.gsub! /\r/, '' # \r gets encoded to 
+      doc = Nokogiri::HTML::DocumentFragment.parse(data)
+      doc.search('pre').each do |element|
+        id = Digest::SHA1.hexdigest(element.inner_html)
+        @premap[id] = element.inner_html
+        element.inner_html = id
+      end
+      doc_to_html(doc)
+    end
+
+    # Process all code from the codemap and replace the placeholders with the
+    # final HTML.
+    #
+    # data - The String data (with placeholders).
+    #
+    # Returns the marked up String data.
+    def process_pre(data)
+      @premap.each do |id, content|
+        data.gsub!(id, content)
+      end
+      data
+    end
   end
 end
diff --git a/test/test_markup.rb b/test/test_markup.rb
index 892685af..33739cf7 100644
--- a/test/test_markup.rb
+++ b/test/test_markup.rb
@@ -50,6 +50,16 @@ context "Markup" do
     assert yielded
   end
 
+  test "does not modify content in pre tags" do
+    @wiki.write_page("Pre", :markdown, 
+      "abc [[a]]\n\n
 [[b]] 
\n\n``` ruby\n[[c]]\n```\n[[d]]", + commit_details) + page = @wiki.page("Pre") + html = page.formatted_data + assert html['[[b]]'] + assert html[%([[c)] + end + ######################################################################### # # Links