Author: gvanmatre
Date: Mon Aug 29 20:00:05 2005
New Revision: 264681

URL: http://svn.apache.org/viewcvs?rev=264681&view=rev
Log:
Bug#:  35839  Templates with a DOCTYPE are not useable

Modified:
    
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties
    
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/Bundle.properties
URL: 
http://svn.apache.org/viewcvs/struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties?rev=264681&r1=264680&r2=264681&view=diff
==============================================================================
--- 
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties 
(original)
+++ 
struts/shale/trunk/clay-plugin/src/java/org/apache/shale/clay/Bundle.properties 
Mon Aug 29 20:00:05 2005
@@ -26,7 +26,7 @@
 parser.load.file=Loading file "{0}".
 parser.load.error=Exception parsing file "{0}".
 parser.load.rules=Loading digester rules.
-parser.unmatched.endtoken=Unmatched ending non-option token: {0}
+parser.unmatched.endtoken=Unmatched ending non-optional token: {0}
 parser.unmatched.begintoken=Unmatched begining token: {0}
 
 #org.apache.shale.clay.parser.NodeTokenizer

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=264681&r1=264680&r2=264681&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
 Mon Aug 29 20:00:05 2005
@@ -425,96 +425,130 @@
      * </p>
      */
     protected Node buildNode(Token token) {
-        boolean isBeginTag = false;
-        boolean isEndTag = false;
-        boolean isComment = false;
         
-        String nodeName = null;
-        String qname = null;
+        Node node = new Node(token);
+
+        discoverNodeShape(node);
+        discoverNodeName(node);
+        discoverNodeAttributes(node);
+        discoverNodeOverrides(node);
+                
+        return node;
+    }
+    
+    /**
+     * <p>Determine if the [EMAIL PROTECTED] Node} is a starting, ending, or 
body text
+     * tag.</p>
+     */
+    protected void discoverNodeShape(Node node) {
+        Token token = node.getToken();
         
         if (token.getDocument().charAt(token.getBeginOffset()) == '<'
-                && token.getDocument().charAt(token.getBeginOffset() + 1) == 
'/'
+            && token.getDocument().charAt(token.getBeginOffset() + 1) == '/'
                 && token.getDocument().charAt(token.getEndOffset() - 1) == 
'>') {
             // ending tag found
-            isEndTag = true;
-            isBeginTag = false;
+            node.setEnd(true);
+            node.setStart(false);
         } else if (token.getDocument().charAt(token.getBeginOffset()) == '<'
-                && token.getDocument().charAt(token.getEndOffset() - 2) == '/'
+            && token.getDocument().charAt(token.getEndOffset() - 2) == '/'
                 && token.getDocument().charAt(token.getEndOffset() - 1) == 
'>') {
             // self ending tag found
-            isEndTag = true;
-            isBeginTag = true;
+            node.setEnd(true);
+            node.setStart(true);
         } else if (token.getDocument().charAt(token.getBeginOffset()) == '<'
             && token.getDocument().charAt(token.getBeginOffset() + 1) == '!'
-            && token.getDocument().charAt(token.getEndOffset() - 2) == '-'
-            && token.getDocument().charAt(token.getEndOffset() - 1) == '>') {
+                && token.getDocument().charAt(token.getEndOffset() - 2) == '-'
+                    && token.getDocument().charAt(token.getEndOffset() - 1) == 
'>') {
             // self contained comment tag found
-            isEndTag = true;
-            isBeginTag = true;
-            isComment = true;
+            node.setEnd(true);
+            node.setStart(true);
+            node.setComment(true);
         } else if (token.getDocument().charAt(token.getBeginOffset()) == '<'
             && token.getDocument().charAt(token.getBeginOffset() + 1) == '!'
-            && token.getDocument().charAt(token.getBeginOffset() + 2) == '-') {
+                && token.getDocument().charAt(token.getBeginOffset() + 2) == 
'-') {
             // begin comment tag found
-            isEndTag = false;
-            isBeginTag = true; 
-            isComment = true;
+            node.setEnd(false);
+            node.setStart(true); 
+            node.setComment(true);      
         } else if (token.getDocument().charAt(token.getEndOffset() - 2) == '-'
             && token.getDocument().charAt(token.getEndOffset() - 1) == '>') {
             // ending comment tag found
-            isEndTag = true;
-            isBeginTag = false;
-            isComment = true;
+            node.setEnd(true);
+            node.setStart(false);
+            node.setComment(true);
         } else if (token.getDocument().charAt(token.getBeginOffset()) == '<'
-                && (token.getDocument().charAt(token.getBeginOffset() + 1) != 
'/'
-                && token.getDocument().charAt(token.getBeginOffset() + 1) != 
'?' 
-                && token.getDocument().charAt(token.getBeginOffset() + 1) != 
'%')
+            && token.getDocument().charAt(token.getBeginOffset() + 1) == '!'
                 && token.getDocument().charAt(token.getEndOffset() - 1) == 
'>') {
+            // DOCTYPE is treated like a self contained comment
+            node.setEnd(true);
+            node.setStart(true);
+            node.setComment(true);        
+        } else if (token.getDocument().charAt(token.getBeginOffset()) == '<'
+            && (token.getDocument().charAt(token.getBeginOffset() + 1) != '/'
+                && token.getDocument().charAt(token.getBeginOffset() + 1) != 
'?' 
+                    && token.getDocument().charAt(token.getBeginOffset() + 1) 
!= '%')
+                    && token.getDocument().charAt(token.getEndOffset() - 1) == 
'>') {
             // beginning tag found
-            isEndTag = false;
-            isBeginTag = true;
+            node.setEnd(false);
+            node.setStart(true);
         }
         
-        // find the node name
-        if (isBeginTag || isEndTag) {
+    }
+    
+    /**
+     * <p>Extracts the node name from the [EMAIL PROTECTED] Token} if the 
[EMAIL PROTECTED] Node} 
+     * is a starting or ending tag.</p>
+     */
+    protected void discoverNodeName(Node node) {
+        Token token = node.getToken();
+        
+        if (node.isStart() || node.isEnd()) {
             // comments are treated special because and ending comment may 
will not
             // have a node name <!-- <input > --> 
-            if (isComment) {
+            if (node.isComment()) {
+                
+                node.setName("--");
                 
-                nodeName = "--";
-                                
             } else {
                 // find the node name delimiter
                 int e = token.getDocument().indexOf(" ", 
token.getBeginOffset() + 2);
                 // end of token is the delimiter
                 if (e == -1 || e >= token.getEndOffset())
-                    e = (isBeginTag && isEndTag) ? (token.getEndOffset() - 2)
+                    e = (node.isStart() && node.isEnd()) ? 
(token.getEndOffset() - 2)
                             : (token.getEndOffset() - 1);
                     // find the start of the node attribute body
-                    int s = (!isBeginTag && isEndTag) ? token.getBeginOffset() 
+ 2
+                    int s = (!node.isStart() && node.isEnd()) ? 
token.getBeginOffset() + 2
                             : token.getBeginOffset() + 1;
                     
                     // return the full node name
-                    nodeName = token.getDocument().substring(s, e);
+                    String nodeName = token.getDocument().substring(s, e);
                     // separate the namespace
                     e = nodeName.indexOf(':');
                     if (e > -1)
-                        qname = nodeName.substring(0, e);
-                    nodeName = nodeName.substring(e + 1);
-                    
+                        node.setQname(nodeName.substring(0, e));
+                    node.setName(nodeName.substring(e + 1));     
             }
             
         }
         
+    }
+    
+    /**
+     * <p>If the [EMAIL PROTECTED] Node} is a starting tag and not a comment,
+     * use the [EMAIL PROTECTED] AttributeTokenizer} to realize the node 
attributes.</p>
+     */
+    protected void discoverNodeAttributes(Node node) {
+        Token token = node.getToken();
         Attributes attributes = this.new Attributes();
+        node.setAttributes(attributes);
         
         // look for attribute in a beginning tag only
-        if (isBeginTag && !isComment) {
+        if (node.isStart() && !node.isComment()) {
             
             int s = token.getDocument()
             .indexOf(" ", token.getBeginOffset() + 2);
-            int e = (isBeginTag && isEndTag) ? (token.getEndOffset() - 2)
-            : (token.getEndOffset() - 1);
+            int e = (node.isStart() && node.isEnd()) ? (token.getEndOffset() - 
2)
+                    : (token.getEndOffset() - 1);
             if (s > -1 && s < e) {
                 
                 // find the tokens and load them into the attributes map
@@ -529,27 +563,23 @@
             
         }
         
-        // add some exception here. check for html elements that are assumed
-        // self terminating
-        if (isBeginTag && isSelfTerminating(nodeName)) {
-            isEndTag = true;
-        }
-        
-        // build a new node
-        Node node = new Node(token);
-        node.setEnd(isEndTag);
-        node.setStart(isBeginTag);
-        node.setComment(isComment);
-        node.setAttributes((Map) attributes);
+    }
+    
+    /**
+     * <p>Explicitly sets the <code>isEnd</code> [EMAIL PROTECTED] Node} 
property to <code>true</code> for
+     * self terminating tags.  Sets the [EMAIL PROTECTED]'s 
<code>isWellFormed</code> property
+     * to <code>true</code> if the <code>isStart</code> and <code>isEnd</code> 
+     * [EMAIL PROTECTED] Node} properties are <code>true</code>.</p> 
+     */
+    protected void discoverNodeOverrides(Node node) {
+        //look for self terminating tags
+        if (node.isStart() && isSelfTerminating(node.getName())) 
+            node.setEnd(true);
         
         // begin and end tag found on a self terminating node <xxx/>
-        if (isBeginTag && isEndTag)
+        if (node.isStart() && node.isEnd())
             node.setWellFormed(true);
         
-        node.setQname(qname);
-        node.setName(nodeName);
-        
-        return node;
     }
-    
+ 
 }

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=264681&r1=264680&r2=264681&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
 Mon Aug 29 20:00:05 2005
@@ -327,9 +327,6 @@
      * Aserts that two trees of parsed HTML have the same number children and
      * the same attributes. Verifies that the structure is the same
      * </p>
-     * 
-     * @param tree1
-     * @param tree2
      */
     protected void compareTrees(List tree1, List tree2) {
 
@@ -371,6 +368,30 @@
             }
 
         }
+    }
+    
+    /**
+     * <p>Test parsing a DOCTYPE Tag.</p>
+     */
+    public void testDoctype() {
+        Parser p = new Parser();
+        StringBuffer doc = new StringBuffer();
+        doc.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" ")
+           .append("\"http://www.w3.org/TR/html4/strict.dtd\";>")
+           .append("<HTML>")
+           .append("<HEAD>")
+           .append("<TITLE>My first HTML document</TITLE>")
+           .append("</HEAD>")
+           .append("<BODY>")
+           .append("<P>Hello world!</p>")
+           .append("</BODY>")
+           .append("</HTML>");
+
+
+        List nodes = p.parse(doc);
+        assertTrue("Well-formed DOCTYPE, 2 root nodes",
+                nodes.size() == 2);
+
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to