vgritsenko 02/01/21 15:14:27
Modified: src/java/org/apache/cocoon/generation HTMLGenerator.java
Added: src/java/org/apache/cocoon/xml XMLUtils.java
Log:
Bug 5916, Patch from [EMAIL PROTECTED]
Revision Changes Path
1.2 +24 -1
xml-cocoon2/src/java/org/apache/cocoon/generation/HTMLGenerator.java
Index: HTMLGenerator.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/generation/HTMLGenerator.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- HTMLGenerator.java 3 Jan 2002 12:31:16 -0000 1.1
+++ HTMLGenerator.java 21 Jan 2002 23:14:26 -0000 1.2
@@ -25,6 +25,7 @@
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.util.HashUtil;
import org.apache.cocoon.xml.dom.DOMStreamer;
+import org.apache.cocoon.xml.XMLUtils;
import org.w3c.dom.NodeList;
import org.w3c.tidy.Tidy;
import org.xml.sax.SAXException;
@@ -35,6 +36,8 @@
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;
import java.io.BufferedInputStream;
+import java.io.StringWriter;
+import java.io.PrintWriter;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
@@ -42,7 +45,8 @@
/**
* @author <a href="mailto:[EMAIL PROTECTED]">Davanum Srinivas</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
- * @version CVS $Revision: 1.1 $ $Date: 2002/01/03 12:31:16 $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a>
+ * @version CVS $Revision: 1.2 $ $Date: 2002/01/21 23:14:26 $
*/
public class HTMLGenerator extends ComposerGenerator implements Cacheable,
Recyclable, Composable, Disposable {
@@ -166,9 +170,28 @@
Tidy tidy = new Tidy();
tidy.setXmlOut(true);
tidy.setXHTML(true);
+ //Set Jtidy warnings on-off
+ tidy.setShowWarnings(getLogger().isWarnEnabled());
+ //Set Jtidy final result summary on-off
+ tidy.setQuiet(!getLogger().isInfoEnabled());
+ //Set Jtidy infos to a String (will be logged) instead of System.out
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter errorWriter = new PrintWriter(stringWriter);
+ tidy.setErrout(errorWriter);
// Extract the document using JTidy and stream it.
org.w3c.dom.Document doc = tidy.parseDOM(new
BufferedInputStream(this.inputSource.getInputStream()), null);
+
+ // FIXME: Jtidy doesn't warn or strip duplicate attributes in same
+ // tag; stripping.
+ XMLUtils.stripDuplicateAttributes(doc, null);
+
+ errorWriter.flush();
+ errorWriter.close();
+ if(getLogger().isWarnEnabled()){
+ getLogger().warn(stringWriter.toString());
+ }
+
if(xpath != null)
{
Transformer serializer =
TransformerFactory.newInstance().newTransformer();
1.1 xml-cocoon2/src/java/org/apache/cocoon/xml/XMLUtils.java
Index: XMLUtils.java
===================================================================
/*****************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of which has been included with this distribution in *
* the LICENSE file. *
*****************************************************************************/
package org.apache.cocoon.xml;
import java.util.ArrayList;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
/**
* XML utility methods
*
* @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a>
* @created 18 January 2002
*/
public class XMLUtils{
//using parent because some dom implementations like jtidy are bugged,
//cannot get parent or delete child
public static void stripDuplicateAttributes(Node node, Node parent) {
// The output depends on the type of the node
switch(node.getNodeType()) {
case Node.DOCUMENT_NODE: {
Document doc = (Document)node;
Node child = doc.getFirstChild();
while(child != null) {
stripDuplicateAttributes(child, node);
child = child.getNextSibling();
}
break;
}
case Node.ELEMENT_NODE: {
Element elt = (Element) node;
NamedNodeMap attrs = elt.getAttributes();
ArrayList nodesToRemove = new ArrayList();
int nodesToRemoveNum = 0;
for(int i = 0; i < attrs.getLength(); i++) {
Node a = attrs.item(i);
for(int j = 0; j < attrs.getLength(); j++) {
Node b = attrs.item(j);
//if there are two attributes with same name
if(i!=j&&(a.getNodeName().equals(b.getNodeName())))
{
nodesToRemove.add(b);
nodesToRemoveNum++;
}
}
}
for(int i=0;i<nodesToRemoveNum;i++)
{
org.w3c.dom.Attr nodeToDelete = (org.w3c.dom.Attr)
nodesToRemove.get(i);
org.w3c.dom.Element nodeToDeleteParent = (org.w3c.dom.Element)node;
//nodeToDelete.getParentNode();
nodeToDeleteParent.removeAttributeNode(nodeToDelete);
}
nodesToRemove.clear();
Node child = elt.getFirstChild();
while(child != null) {
stripDuplicateAttributes(child, node);
child = child.getNextSibling();
}
break;
}
default:
//do nothing
break;
}
}
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]