Author: gvanmatre Date: Sun Sep 4 09:05:48 2005 New Revision: 278606 URL: http://svn.apache.org/viewcvs?rev=278606&view=rev Log: Bug#: 35839 [shale] Clay processes components inside HTML comments
Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java?rev=278606&r1=278605&r2=278606&view=diff ============================================================================== --- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java (original) +++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/AttributeTokenizer.java Sun Sep 4 09:05:48 2005 @@ -264,10 +264,11 @@ } // looks for the key value delimiter - TokenOffset key = nextToken(currOffset, "=", " "); + TokenOffset key = nextToken(currOffset, " ", "=", true); if (key == null) break; + boolean skipValue = false; currOffset++; String delim = " "; // old school html color=red String otherDelim = "\""; @@ -276,9 +277,15 @@ delim = "\""; otherDelim = " "; currOffset++; + } else if (currOffset < buffer.length() && currOffset > 0 && + buffer.charAt(currOffset - 1) == ' ') { //attribute without value + currOffset--; //back up <option selected value= + skipValue = true; } - TokenOffset value = nextToken(currOffset, delim, otherDelim); + TokenOffset value = null; + if (!skipValue) // no value part <option selected value=xxx> + value = nextToken(currOffset, delim, otherDelim, false); tokenIndex.add(new AttributeEntry(key, value)); @@ -300,18 +307,35 @@ * <code>endDelim</code>. * </p> */ - protected TokenOffset nextToken(int startOffset, String endDelim, String otherDelim) { - // look for the value delimiter or the end of the parse fragment, - // whichever comes first - currOffset = Math.min(buffer.indexOf(endDelim, startOffset), endOffset); - // try another delimiter - if (currOffset == -1) - currOffset = Math.min(buffer.indexOf(otherDelim, startOffset), endOffset); + protected TokenOffset nextToken(int startOffset, String endDelim, String otherDelim, boolean isKey) { + //If isKey is true, we are looking for an attribute name with a endDelim or otherDelim. + //Pick the one that comes first. + + //If isKey is false we are looking for an attribute value. The endDelim is the best guess + //and the otherDelim is the next best guess. + if (isKey) { + int offsetEnd = Math.min(buffer.indexOf(endDelim, startOffset), endOffset); + int offsetOther = Math.min(buffer.indexOf(otherDelim, startOffset), endOffset); + if (offsetEnd == -1) + currOffset = offsetOther; + else if (offsetOther == -1) + currOffset = offsetOther; + else + currOffset = Math.min(offsetEnd, offsetOther); + } else { + currOffset = Math.min(buffer.indexOf(endDelim, startOffset), endOffset); + // try another delimiter + if (currOffset == -1) + currOffset = Math.min(buffer.indexOf(otherDelim, startOffset), endOffset); + } + if (currOffset == -1) { currOffset = endOffset; } - + + // look for the value delimiter or the end of the parse fragment, + // whichever comes first if (currOffset > -1 && currOffset <= endOffset && startOffset < currOffset) { int e = currOffset; Modified: struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java?rev=278606&r1=278605&r2=278606&view=diff ============================================================================== --- struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java (original) +++ struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/parser/Parser.java Sun Sep 4 09:05:48 2005 @@ -269,6 +269,9 @@ node.setWellFormed(true); break trash; } else { + //force all nodes to be comment within a comment + node.setComment(true); + node.setWellFormed(true); node.addChild(bodyNode); } } // end while @@ -434,6 +437,7 @@ return node; } + /** * <p>Declare an array of [EMAIL PROTECTED] Rule}s that validate an ending [EMAIL PROTECTED] Token}.</p> @@ -491,6 +495,16 @@ new Rule('%', true, 1, false), new Rule('>', false, -1, true)}; + + /** + * <p>Declare an array of [EMAIL PROTECTED] Rule}s that validate JSP block [EMAIL PROTECTED] Token}.</p> + */ + private static Rule[] JSP_RULES = {new Rule('<', true, 0, true), + new Rule('%', true, 1, true), + new Rule('>', false, -1, true), + new Rule('%', false, -2, true)}; + + /** * <p>Declare an array of [EMAIL PROTECTED] Shape}s further defined by [EMAIL PROTECTED] Rule}s that * are used to determine the type of [EMAIL PROTECTED] Node} the [EMAIL PROTECTED] Token} defines.</p> @@ -502,7 +516,8 @@ new Shape(true, false, true, BEGIN_COMMENT_TAG_RULES), new Shape(false, true, true, END_COMMENT_TAG_RULES), new Shape(true, true, true, DOCTYPE_TAG_RULES), - new Shape(true, false, false, BEGIN_TAG_RULES)}; + new Shape(true, false, false, BEGIN_TAG_RULES), + new Shape(true, true, true, JSP_RULES)}; /** Modified: struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java?rev=278606&r1=278605&r2=278606&view=diff ============================================================================== --- struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java (original) +++ struts/shale/trunk/clay-plugin/src/test/org/apache/shale/clay/parser/ParserTestCase.java Sun Sep 4 09:05:48 2005 @@ -153,6 +153,17 @@ node = (Node) nodes1.get(0); assertTrue("node is a valid comment", node.isComment()); + + // truncate the buffer + doc1.setLength(0); + doc1.append("<!--- </ -->"); + + nodes1 = p.parse(doc1); + assertTrue("one root node", nodes1.size() == 1); + + node = (Node) nodes1.get(0); + assertTrue("node is a valid comment", node.isComment()); + } /** @@ -447,13 +458,13 @@ Node node = (Node) nodes.get(0); String value = (String) node.getAttributes().get("type"); - assertTrue("Attribute test type=text", value.equals("text")); + assertEquals("Attribute type", value, "text"); value = (String) node.getAttributes().get("size"); - assertTrue("Attribute test size=10", value.equals("10")); + assertEquals("Attribute size", value, "10"); value = (String) node.getAttributes().get("name"); - assertTrue("Attribute test name=date", value.equals("date")); + assertEquals("Attribute name", value, "date"); //test bogus attribute with missing delimiter doc.setLength(0); @@ -465,13 +476,13 @@ node = (Node) nodes.get(0); value = (String) node.getAttributes().get("type"); - assertTrue("Attribute test type=text", value.equals("text")); + assertEquals("Attribute type", value, "text"); value = (String) node.getAttributes().get("size"); - assertTrue("Attribute test size=10", value.equals("10")); + assertEquals("Attribute size", value, "10"); value = (String) node.getAttributes().get("name"); - assertTrue("Attribute test name=date", value.equals("date")); + assertEquals("Attribute name", value, "date"); //test bogus attribute with missing delimiter @@ -484,32 +495,43 @@ node = (Node) nodes.get(0); value = (String) node.getAttributes().get("type"); - assertTrue("Attribute test type=radio", value.equals("radio")); + assertEquals("Attribute type", value, "radio"); value = (String) node.getAttributes().get("name"); - assertTrue("Attribute test name=date", value.equals("date")); + assertEquals("Attribute name", value, "date"); + assertTrue("Attribute checked exists", node.getAttributes().containsKey("checked")); value = (String) node.getAttributes().get("checked"); - assertTrue("Attribute checked=null", value == null); + assertNull("Attribute checked", value); doc.setLength(0); - doc.append("<option value=\"\"/>"); + doc.append("<option selected value=\"\"/>"); nodes = p.parse(doc); assertTrue("1 root node", nodes.size() == 1); node = (Node) nodes.get(0); + assertTrue("Attribute selected exists", node.getAttributes().containsKey("selected")); + value = (String) node.getAttributes().get("selected"); + assertNull("Attribute selected", value); + + assertTrue("Attribute selected exists", node.getAttributes().containsKey("value")); value = (String) node.getAttributes().get("value"); - assertTrue("Attribute value=null", value == null); + assertNull("Attribute value", value); } public void testJSPTag() { Parser p = new Parser(); StringBuffer doc = new StringBuffer(); - doc.append("<table>") + + doc.append("<%@ taglib uri=\"/tags/struts-html\" prefix=\"html\" %>") + .append("<%@ taglib uri=\"/tags/struts-bean\" prefix=\"bean\" %>") + .append("<%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\" session=\"true\" %>") + .append("<%@ page errorPage=\"../error.jsp\" %>") + .append("<table>") .append("<tr><td>") .append("<bean:message key=\"msg.username\"/><td><html:text property=\"userName\" size=\"10\" maxlength=\"10\"/>") .append("<tr><td>") @@ -517,9 +539,9 @@ .append("</table>"); List nodes = p.parse(doc); - assertTrue("Well-formed JSP, 1 root node", nodes.size() == 1); + assertTrue("Well-formed JSP, 5 root node", nodes.size() == 5); - Node root = (Node) nodes.get(0); + Node root = (Node) nodes.get(4); assertNotNull("table node not null", root); Node tr = (Node) root.getChildren().get(0); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]