001 /* 002 * Copyright (c) 2005 Marko Karppinen & Co. LLC 003 * 004 * Permission is hereby granted, free of charge, to any person obtaining a 005 * copy of this software and associated documentation files (the "Software"), 006 * to deal in the Software without restriction, including without limitation 007 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 008 * and/or sell copies of the Software, and to permit persons to whom the 009 * Software is furnished to do so, subject to the following conditions: 010 * 011 * The above copyright notice and this permission notice shall be included in 012 * all copies or substantial portions of the Software. 013 * 014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 017 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 019 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 020 * DEALINGS IN THE SOFTWARE. 021 */ 022 023 package fi.karppinen.xml; 024 025 import gnu.xml.pipeline.EventConsumer; 026 import gnu.xml.pipeline.EventFilter; 027 028 import org.xml.sax.Attributes; 029 import org.xml.sax.SAXException; 030 031 /** 032 * This filter supresses all <code>ContentHandler</code> events except those that happen between 033 * XHTML 1.x <code>body</code> start and end. The filter assumes that there is exactly one 034 * <code>body</code> element. In particular, nested <code>body</code> elements are not supported. 035 * 036 * @version $Id: BodyContentPassFilter.java,v 1.1 2006/10/30 19:57:09 hsivonen Exp $ 037 * @author hsivonen 038 */ 039 public class BodyContentPassFilter extends EventFilter { 040 041 private boolean pass = false; 042 043 /** 044 * 045 */ 046 public BodyContentPassFilter() { 047 super(); 048 setContentHandler(this); 049 } 050 051 /** 052 * @param consumer 053 */ 054 public BodyContentPassFilter(EventConsumer consumer) { 055 super(consumer); 056 setContentHandler(this); 057 } 058 059 /** 060 * @see org.xml.sax.ContentHandler#characters(char[], int, int) 061 */ 062 public void characters(char[] ch, int start, int length) 063 throws SAXException { 064 if (pass) 065 super.characters(ch, start, length); 066 } 067 068 /** 069 * @see org.xml.sax.ContentHandler#endDocument() 070 */ 071 public void endDocument() throws SAXException { 072 pass = false; 073 } 074 075 /** 076 * @see org.xml.sax.ContentHandler#endElement(java.lang.String, 077 * java.lang.String, java.lang.String) 078 */ 079 public void endElement(String uri, String localName, String qName) 080 throws SAXException { 081 if ("body".equals(localName) 082 && "http://www.w3.org/1999/xhtml".equals(uri)) { 083 pass = false; 084 } else if (pass) { 085 super.endElement(uri, localName, qName); 086 } 087 } 088 089 /** 090 * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int) 091 */ 092 public void ignorableWhitespace(char[] ch, int start, int length) 093 throws SAXException { 094 if (pass) 095 super.ignorableWhitespace(ch, start, length); 096 } 097 098 /** 099 * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, 100 * java.lang.String) 101 */ 102 public void processingInstruction(String target, String data) 103 throws SAXException { 104 if (pass) 105 super.processingInstruction(target, data); 106 } 107 108 /** 109 * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String) 110 */ 111 public void skippedEntity(String name) throws SAXException { 112 if (pass) 113 super.skippedEntity(name); 114 } 115 116 /** 117 * @see org.xml.sax.ContentHandler#startDocument() 118 */ 119 public void startDocument() throws SAXException { 120 pass = false; 121 } 122 123 /** 124 * @see org.xml.sax.ContentHandler#startElement(java.lang.String, 125 * java.lang.String, java.lang.String, org.xml.sax.Attributes) 126 */ 127 public void startElement(String uri, String localName, String qName, 128 Attributes atts) throws SAXException { 129 if ("body".equals(localName) 130 && "http://www.w3.org/1999/xhtml".equals(uri)) { 131 pass = true; 132 } else if (pass) { 133 super.startElement(uri, localName, qName, atts); 134 } 135 } 136 }