Author: vmassol
Date: 2007-08-30 16:18:52 +0200 (Thu, 30 Aug 2007)
New Revision: 4666

Modified:
   
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/XWikiMacrosMappingRenderer.java
   
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeFilter.java
   
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeRemoveFilter.java
   
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeRestoreFilter.java
   
xwiki-platform/core/branches/xwiki-core-1.1/src/test/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngineTest.java
Log:
XWIKI-1679: Code macros doesn't work if there are several code macros on the 
same page

Merged from trunk (rev 4665)

Modified: 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/XWikiMacrosMappingRenderer.java
===================================================================
--- 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/XWikiMacrosMappingRenderer.java
      2007-08-30 14:12:33 UTC (rev 4665)
+++ 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/XWikiMacrosMappingRenderer.java
      2007-08-30 14:18:52 UTC (rev 4666)
@@ -50,7 +50,7 @@
      * "." should match any characters, including new lines.
      */
     private static final Pattern MULTI_LINE_MACRO_PATTERN =
-        Pattern.compile("\\{(\\w+)(:(.+))?\\}(.+?)\\{\\1\\}", Pattern.DOTALL);
+        Pattern.compile("\\{(\\w+)(:(.+?))?\\}(.+?)\\{\\1\\}", Pattern.DOTALL);
 
     protected HashMap macros_libraries = null;
     protected HashMap macros_mappings = null;

Modified: 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeFilter.java
===================================================================
--- 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeFilter.java
       2007-08-30 14:12:33 UTC (rev 4665)
+++ 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeFilter.java
       2007-08-30 14:18:52 UTC (rev 4666)
@@ -42,7 +42,7 @@
     
     public CodeFilter()
     {
-        super("\\{(code)(?::([^\\}]*))?\\}(.*)\\{code}", MULTILINE);
+        super("\\{(code)(?::([^\\}]*))?\\}(.*?)\\{code}", MULTILINE);
     }
 
     public void setInitialContext(InitialRenderContext context)

Modified: 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeRemoveFilter.java
===================================================================
--- 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeRemoveFilter.java
 2007-08-30 14:12:33 UTC (rev 4665)
+++ 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeRemoveFilter.java
 2007-08-30 14:18:52 UTC (rev 4666)
@@ -24,6 +24,8 @@
 import org.radeox.filter.regex.RegexTokenFilter;
 import org.radeox.regex.MatchResult;
 
+import java.util.LinkedList;
+
 /**
  * Escape everything inside the {code} macro so that its content isn't 
rendered. This filter needs to 
  * configured to run first in the Radeox 
com.xpn.xwiki.render.filter.XWikiFilter configuration file.
@@ -34,14 +36,24 @@
        
     public CodeRemoveFilter()
     {
-        super("(\\{(code)(?::([^\\}]*))?\\})(.*)\\{code}", MULTILINE);
+        super("(\\{(code)(?::([^\\}]*))?\\})(.*?)\\{code}", MULTILINE);
     }
 
     public void handleMatch(StringBuffer buffer, MatchResult result, 
FilterContext context)
     {
        // Remove the content inside the code macro. It'll be put back in 
CodeRestoreFilter
        // We save the content in the Filter context so that it can restored 
later on.
-       context.getRenderContext().set(CODE_MACRO_CONTENT, result.group(4));
+
+        // Important: This filter is called for all code macros on the page 
before the restore
+        // filter is called. Thus we need to save the removed content for ALL 
code macros and this
+        // is why we're using a LinkedList inside the CODE_MACRO_CONTENT 
context key.
+        LinkedList contentList = (LinkedList) 
context.getRenderContext().get(CODE_MACRO_CONTENT);
+        if (contentList == null) {
+            contentList = new LinkedList();
+            context.getRenderContext().set(CODE_MACRO_CONTENT, contentList);
+        }
+
+        contentList.add(result.group(4));
        buffer.append(result.group(1));
        buffer.append("{code}");
     }

Modified: 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeRestoreFilter.java
===================================================================
--- 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeRestoreFilter.java
        2007-08-30 14:12:33 UTC (rev 4665)
+++ 
xwiki-platform/core/branches/xwiki-core-1.1/src/main/java/com/xpn/xwiki/render/filter/CodeRestoreFilter.java
        2007-08-30 14:18:52 UTC (rev 4666)
@@ -24,6 +24,11 @@
 import org.radeox.filter.regex.RegexTokenFilter;
 import org.radeox.regex.MatchResult;
 
+import java.util.LinkedList;
+
+/**
+ * @see CodeRemoveFilter
+ */
 public class CodeRestoreFilter extends RegexTokenFilter
 {
     public CodeRestoreFilter()
@@ -31,11 +36,16 @@
         super("(\\{(code)(?::([^\\}]*))?\\})\\{code}", SINGLELINE);
     }
 
+    /**
+     * @see CodeRemoveFilter#handleMatch(StringBuffer, MatchResult, 
FilterContext) 
+     */
     public void handleMatch(StringBuffer buffer, MatchResult result, 
FilterContext context)
     {
-       String content = (String) 
context.getRenderContext().get(CodeRemoveFilter.CODE_MACRO_CONTENT);
+        LinkedList contentList =
+            (LinkedList) 
context.getRenderContext().get(CodeRemoveFilter.CODE_MACRO_CONTENT);
+        
        buffer.append(result.group(1));
-       buffer.append(content);
+       buffer.append((String) contentList.removeFirst());
        buffer.append("{code}");
     }
 }

Modified: 
xwiki-platform/core/branches/xwiki-core-1.1/src/test/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngineTest.java
===================================================================
--- 
xwiki-platform/core/branches/xwiki-core-1.1/src/test/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngineTest.java
 2007-08-30 14:12:33 UTC (rev 4665)
+++ 
xwiki-platform/core/branches/xwiki-core-1.1/src/test/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngineTest.java
 2007-08-30 14:18:52 UTC (rev 4666)
@@ -65,29 +65,35 @@
     {
         // We verify that the code macro doesn't render wiki markup, velocity, 
HTML, or other radeox macros. 
                // We also ensure that any Radeox macro coming after the code 
macro is rendered properly.
-               String text = "{code:none}\n"
+        // Last we also ensure that a second code macro works too.
+        String text = "{code:none}\n"
                + "1 Title\n"
             + "#info(\"test\")\n"
             + "<pre>hello</pre>\n"
             + "$xwiki.getVersion()\n"
             + "{style}style{style}\n"
-            + "{code}nested{code}\n"
+            + "&#123;code}nested&#123;code}\n"
             + "{code}\n"
             + "{table}\n"
             + "a | b\n"
             + "c | d\n"
-            + "{table}";
+            + "{table}\n"
+            + "#set ($var = 'dummy')\n"
+            + "{code:none}\n"
+            + "1 Something\n"
+            + "{code}";
         
         String expectedText = "<div class=\"code\"><pre>1 Title\n"
                + "&#35;info(\"test\")\n"
                + "&#60;pre&#62;hello&#60;/pre&#62;\n"
                + "&#36;xwiki.getVersion()\n"
                + "&#123;style&#125;style&#123;style&#125;\n"
-               + "&#123;code&#125;nested&#123;code&#125;</pre></div>\n"
+               + "&&#35;123;code&#125;nested&&#35;123;code&#125;</pre></div>\n"
                + "<table class=\"wiki-table\" cellpadding=\"0\" 
cellspacing=\"0\" border=\"0\"><tr><th>a</th>"
-               + "<th>b</th></tr><tr 
class=\"table-odd\"><td>c</td><td>d</td></tr></table>";
+               + "<th>b</th></tr><tr 
class=\"table-odd\"><td>c</td><td>d</td></tr></table>\n"
+            + "<div class=\"code\"><pre>1 Something</pre></div>";
         
         XWikiDocument document = new XWikiDocument();
-        assertEquals(expectedText, engine.renderText(text, document, 
context)); 
+        assertEquals(expectedText, engine.renderText(text, document, context));
     }
 }

_______________________________________________
notifications mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/notifications

Reply via email to