You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by an...@apache.org on 2009/01/23 11:31:55 UTC

svn commit: r736988 - in /cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers: HTMLSerializer.java XHTMLSerializer.java

Author: andreas
Date: Fri Jan 23 02:31:55 2009
New Revision: 736988

URL: http://svn.apache.org/viewvc?rev=736988&view=rev
Log:
XHTMLSerializer: Don't encode characters in <script> and <style> elements to avoid JavaScript parsing errors. This behaviour has been pulled up from the HTMLSerializer. Fixes https://issues.apache.org/jira/browse/COCOON-2249.

Modified:
    cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/HTMLSerializer.java
    cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/XHTMLSerializer.java

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/HTMLSerializer.java
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/HTMLSerializer.java?rev=736988&r1=736987&r2=736988&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/HTMLSerializer.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/HTMLSerializer.java Fri Jan 23 02:31:55 2009
@@ -74,8 +74,6 @@
 
     private static final HTMLEncoder HTML_ENCODER = new HTMLEncoder();
 
-    protected boolean encodeCharacters = true;
-
     /**
      * Create a new instance of this <code>HTMLSerializer</code>
      */
@@ -196,10 +194,6 @@
             length++;
         }
 
-        // script and style are CDATA sections by default, so no encoding
-        if ( "SCRIPT".equals(name) || "STYLE".equals(name) ) {
-            this.encodeCharacters = false;
-        }
         super.startElementImpl(XHTML1_NAMESPACE, name, name, NAMESPACES, at);
     }
 
@@ -231,22 +225,7 @@
         if (name.equals("META")) return;
         if (name.equals("PARAM")) return;
 
-        // script and style are CDATA sections by default, so no encoding
-        if ( "SCRIPT".equals(name) || "STYLE".equals(name) ) {
-            this.encodeCharacters = true;
-        }
         super.endElementImpl(XHTML1_NAMESPACE, name, name);
     }
 
-    /**
-     * Encode and write a specific part of an array of characters.
-     */
-    protected void encode(char data[], int start, int length)
-    throws SAXException {
-        if ( !this.encodeCharacters ) {
-            this.write(data, start, length);
-            return;
-        }
-        super.encode(data, start, length);
-    }
 }

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/XHTMLSerializer.java
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/XHTMLSerializer.java?rev=736988&r1=736987&r2=736988&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/XHTMLSerializer.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/serializers/java/org/apache/cocoon/components/serializers/XHTMLSerializer.java Fri Jan 23 02:31:55 2009
@@ -78,6 +78,8 @@
 
     private static final XHTMLEncoder XHTML_ENCODER = new XHTMLEncoder();
 
+    protected boolean encodeCharacters = true;
+    
     /* ====================================================================== */
 
     /** The <code>DocType</code> instance representing the document. */
@@ -181,6 +183,11 @@
                                  String namespaces[][], String attributes[][])
     throws SAXException {
         if (uri.length() == 0) uri = XHTML1_NAMESPACE;
+        
+        if (isCdataElement(local)) {
+            this.encodeCharacters = false;
+        }
+
         super.startElementImpl(uri, local, qual, namespaces, attributes);
     }
 
@@ -202,7 +209,7 @@
                 this.closeElement(false);
             } else if (local.equalsIgnoreCase("head")) {
                 String loc = "meta";
-                String qua = namespaces.qualify(XHTML1_NAMESPACE, loc, "meta");
+                String qua = this.namespaces.qualify(XHTML1_NAMESPACE, loc, "meta");
                 String nsp[][] = new String[0][0];
                 String att[][] = new String[2][ATTRIBUTE_LENGTH];
 
@@ -217,7 +224,33 @@
                 this.endElementImpl(XHTML1_NAMESPACE, loc, qua);
             }
         }
+        
+        if (isCdataElement(local)) {
+            this.encodeCharacters = true;
+        }
+
         super.endElementImpl(uri, local, qual);
     }
     
+    /**
+     * script and style are CDATA sections by default, so no encoding
+     * @param localName The local name of the element.
+     * @return If the element should be serialized without encoding.
+     */
+    protected boolean isCdataElement(String localName) {
+        String upperCase = localName.toUpperCase();
+        return "SCRIPT".equals(upperCase) || "STYLE".equals(upperCase);
+    }
+    
+    /**
+     * Encode and write a specific part of an array of characters.
+     */
+    protected void encode(char data[], int start, int length)
+    throws SAXException {
+        if (this.encodeCharacters) {
+            super.encode(data, start, length);
+        } else {
+            this.write(data, start, length);
+        }
+    }
 }