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"
+ + "{code}nested{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"
+ "#info(\"test\")\n"
+ "<pre>hello</pre>\n"
+ "$xwiki.getVersion()\n"
+ "{style}style{style}\n"
- + "{code}nested{code}</pre></div>\n"
+ + "&#123;code}nested&#123;code}</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