You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2011/03/09 06:35:31 UTC
svn commit: r1079669 - in /wicket/branches/wicket-1.4.x/wicket/src:
main/java/org/apache/wicket/markup/MarkupParser.java
test/java/org/apache/wicket/markup/MarkupParserTest.java
Author: ivaynberg
Date: Wed Mar 9 05:35:31 2011
New Revision: 1079669
URL: http://svn.apache.org/viewvc?rev=1079669&view=rev
Log:
fix for markup parser comments problem
Issue: WICKET-3500
Modified:
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java
Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java?rev=1079669&r1=1079668&r2=1079669&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/MarkupParser.java Wed Mar 9 05:35:31 2011
@@ -65,8 +65,8 @@ public class MarkupParser
/** Log for reporting. */
private static final Logger log = LoggerFactory.getLogger(MarkupParser.class);
- /** Conditional comment section, which is NOT treated as a comment section */
- private static final Pattern CONDITIONAL_COMMENT = Pattern.compile("\\[if .+\\]>((?s).*)<!\\[endif\\]");
+ /** Opening a conditional comment section, which is NOT treated as a comment section */
+ public static final Pattern CONDITIONAL_COMMENT_OPENING = Pattern.compile("(s?)^[^>]*?<!--\\[if.*?\\]>(-->)?(<!.*?-->)?");
/** The XML parser to use */
private final IXmlPullParser xmlParser;
@@ -480,39 +480,27 @@ public class MarkupParser
* @param rawMarkup
* @return raw markup
*/
- private String removeComment(String rawMarkup)
+ private static String removeComment(String rawMarkup)
{
- // For reasons I don't understand, the following regex <code>"<!--(.|\n|\r)*?-->"<code>
- // causes a stack overflow in some circumstances (jdk 1.5)
- // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5050507
- // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337993
int pos1 = rawMarkup.indexOf("<!--");
while (pos1 != -1)
{
- int pos2 = rawMarkup.indexOf("-->", pos1 + 4);
-
final StringBuilder buf = new StringBuilder(rawMarkup.length());
- if (pos2 != -1)
+ final String possibleComment = rawMarkup.substring(pos1);
+ Matcher matcher = CONDITIONAL_COMMENT_OPENING.matcher(possibleComment);
+ if (matcher.find())
{
- final String comment = rawMarkup.substring(pos1 + 4, pos2);
-
- // See wicket-2105 for an example where this rather simple regex throws an exception
- // CONDITIONAL_COMMENT = Pattern.compile("\\[if .+\\]>(.|\n|\r)*<!\\[endif\\]");
- // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5050507
- // See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6337993
- if (CONDITIONAL_COMMENT.matcher(comment).matches() == false)
- {
- buf.append(rawMarkup.substring(0, pos1));
- if (rawMarkup.length() >= pos2 + 3)
- {
- buf.append(rawMarkup.substring(pos2 + 3));
- }
- rawMarkup = buf.toString();
- }
- else
+ pos1 = pos1 + matcher.end();
+ }
+ else
+ {
+ int pos2 = rawMarkup.indexOf("-->", pos1 + 4);
+ buf.append(rawMarkup.substring(0, pos1));
+ if (rawMarkup.length() >= pos2 + 3)
{
- pos1 = pos2;
+ buf.append(rawMarkup.substring(pos2 + 3));
}
+ rawMarkup = buf.toString();
}
pos1 = rawMarkup.indexOf("<!--", pos1);
}
Modified: wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java?rev=1079669&r1=1079668&r2=1079669&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/markup/MarkupParserTest.java Wed Mar 9 05:35:31 2011
@@ -19,6 +19,7 @@ package org.apache.wicket.markup;
import java.io.IOException;
import java.text.ParseException;
import java.util.Locale;
+import java.util.regex.Matcher;
import junit.framework.Assert;
@@ -427,4 +428,52 @@ public final class MarkupParserTest exte
RawMarkup raw = (RawMarkup)markup.get(0);
assertEquals("<span> </span>", raw.toString());
}
+
+ /**
+ *
+ */
+ public void testOpenConditionalCommentPattern()
+ {
+ assertFalse(MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher("<!--x--> <!--[if IE]>")
+ .find());
+
+ String markup = " <!--[if IE]> <![endif]--><!--[if IE]>--><!--<![endif]--><!--[if IE]><!--><!--<![endif]--><!--[if IE]><! --><!--<![endif]-->";
+ Matcher m = MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher(markup);
+ assertTrue(m.find());
+ assertEquals(" <!--[if IE]>", m.group());
+ assertFalse(m.find());
+
+ markup = " <!--[if IE]>--> <![endif]--><!--[if IE]>--><!--<![endif]--><!--[if IE]><!--><!--<![endif]--><!--[if IE]><! --><!--<![endif]-->";
+ m = MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher(markup);
+ assertTrue(m.find());
+ assertEquals(" <!--[if IE]>-->", m.group());
+ assertFalse(m.find());
+
+ markup = " <!--[if IE]><!--> <![endif]--><!--[if IE]>--><!--<![endif]--><!--[if IE]><!--><!--<![endif]--><!--[if IE]><! --><!--<![endif]-->";
+ m = MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher(markup);
+ assertTrue(m.find());
+ assertEquals(" <!--[if IE]><!-->", m.group());
+ assertFalse(m.find());
+
+ markup = " <!--[if IE]><! --> <![endif]--><!--[if IE]>--><!--<![endif]--><!--[if IE]><!--><!--<![endif]--><!--[if IE]><! --><!--<![endif]-->";
+ m = MarkupParser.CONDITIONAL_COMMENT_OPENING.matcher(markup);
+ assertTrue(m.find());
+ assertEquals(" <!--[if IE]><! -->", m.group());
+ assertFalse(m.find());
+
+ }
+
+ /**
+ * @throws IOException
+ * @throws ResourceStreamNotFoundException
+ */
+ public void testRawMakupParsingWithStripCommentsSetTrue() throws IOException,
+ ResourceStreamNotFoundException
+ {
+ tester.getApplication().getMarkupSettings().setStripComments(true);
+ String conditionalComment = "\r\n <!--[if IE 6]>\r\n<![endif]-->";
+ MarkupParser parser = new MarkupParser(conditionalComment);
+ Markup markup = parser.parse();
+ assertEquals(conditionalComment, markup.get(0).toString());
+ }
}