/** * Copyright (C) 2010 Orbeon, Inc. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software Foundation; either version * 2.1 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * The full text of the license is available at http://www.gnu.org/copyleft/lesser.html */ package org.orbeon.oxf.xml; import org.xml.sax.*; import org.xml.sax.helpers.AttributesImpl; /** * This ContentHandler receives an XHTML document or pseudo-XHTML document (XHTML in no namespace), and outputs SAX * events for the content of the body only. */ public class HTMLBodyXMLReceiver extends ForwardingXMLReceiver { private String xhtmlPrefix; private int level = 0; private boolean inBody = false; public HTMLBodyXMLReceiver(XMLReceiver xmlReceiver, String xhtmlPrefix) { super(xmlReceiver); this.xhtmlPrefix = xhtmlPrefix; } public void startDocument() { } public void endDocument() { } public void startPrefixMapping(String s, String s1) { } public void endPrefixMapping(String s) { } public void setDocumentLocator(Locator locator) { } public void startElement(String uri, String localname, String qName, Attributes attributes) throws SAXException { if (!inBody && level == 1 && "body".equals(localname)) { inBody = true; } else if (inBody && level > 1) { final String xhtmlQName = XMLUtils.buildQName(xhtmlPrefix, localname); final Attributes newAttributes; // Filter out attributes in a namespace final int attributesCount = attributes.getLength(); if (attributesCount > 0) { final AttributesImpl newAttributesImpl = new AttributesImpl(); for (int i = 0; i < attributesCount; i++) { final String currentAttributeName = attributes.getLocalName(i); final String currentAttributeValue = attributes.getValue(i); if ("".equals(attributes.getURI(i))) newAttributesImpl.addAttribute("", currentAttributeName, currentAttributeName, XMLReceiverHelper.CDATA, currentAttributeValue); } newAttributes = newAttributesImpl; } else newAttributes = attributes; super.startElement(XMLConstants.XHTML_NAMESPACE_URI, localname, xhtmlQName, newAttributes); } level++; } public void endElement(String uri, String localname, String qName) throws SAXException { level--; if (inBody && level == 1) { inBody = false; } else if (inBody && level > 1) { final String xhtmlQName = XMLUtils.buildQName(xhtmlPrefix, localname); super.endElement(XMLConstants.XHTML_NAMESPACE_URI, localname, xhtmlQName); } } public void characters(char[] chars, int start, int length) throws SAXException { if (inBody) super.characters(chars, start, length); } public void ignorableWhitespace(char[] chars, int start, int length) throws SAXException { if (inBody) super.ignorableWhitespace(chars, start, length); } public void processingInstruction(String s, String s1) throws SAXException { if (inBody) super.processingInstruction(s, s1); } public void skippedEntity(String s) throws SAXException { if (inBody) super.skippedEntity(s); } }