serializertohtml.java
来自「java jdk 1.4的源码」· Java 代码 · 共 1,368 行 · 第 1/3 页
JAVA
1,368 行
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 1999 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xalan" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, Lotus * Development Corporation., http://www.lotus.com. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package org.apache.xalan.serialize;import java.util.Stack;import java.io.Writer;import java.io.IOException;import java.util.Hashtable;import java.util.Vector;import java.util.Properties;import java.util.BitSet;import org.xml.sax.*;import org.apache.xml.utils.BoolStack;import org.apache.xml.utils.Trie;import org.apache.xml.utils.FastStringBuffer;import org.apache.xalan.res.XSLMessages;import org.apache.xpath.res.XPATHErrorResources;import org.apache.xml.utils.StringToIntTable;import org.apache.xalan.templates.OutputProperties;import javax.xml.transform.OutputKeys;import javax.xml.transform.Result;/** * <meta name="usage" content="general"/> * SerializerToHTML formats SAX-style events into XML. */public class SerializerToHTML extends SerializerToXML{ /** State stack to keep track of if the current element has output * escaping disabled. */ protected BoolStack m_isRawStack = new BoolStack(); /** True if the current element is a block element. (seems like * this needs to be a stack. -sb). */ private boolean m_inBlockElem = false; /** * Map that tells which XML characters should have special treatment, and it * provides character to entity name lookup. */ protected static CharInfo m_htmlcharInfo = new CharInfo(CharInfo.HTML_ENTITIES_RESOURCE); /** A digital search trie for fast, case insensitive lookup of ElemDesc objects. */ static Trie m_elementFlags = new Trie(); static { // HTML 4.0 loose DTD m_elementFlags.put("BASEFONT", new ElemDesc(0 | ElemDesc.EMPTY)); m_elementFlags.put("FRAME", new ElemDesc(0 | ElemDesc.EMPTY | ElemDesc.BLOCK)); m_elementFlags.put("FRAMESET", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("NOFRAMES", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("ISINDEX", new ElemDesc(0 | ElemDesc.EMPTY | ElemDesc.BLOCK)); m_elementFlags.put("APPLET", new ElemDesc(0 | ElemDesc.WHITESPACESENSITIVE)); m_elementFlags.put("CENTER", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("DIR", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("MENU", new ElemDesc(0 | ElemDesc.BLOCK)); // HTML 4.0 strict DTD m_elementFlags.put("TT", new ElemDesc(0 | ElemDesc.FONTSTYLE)); m_elementFlags.put("I", new ElemDesc(0 | ElemDesc.FONTSTYLE)); m_elementFlags.put("B", new ElemDesc(0 | ElemDesc.FONTSTYLE)); m_elementFlags.put("BIG", new ElemDesc(0 | ElemDesc.FONTSTYLE)); m_elementFlags.put("SMALL", new ElemDesc(0 | ElemDesc.FONTSTYLE)); m_elementFlags.put("EM", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("STRONG", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("DFN", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("CODE", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("SAMP", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("KBD", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("VAR", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("CITE", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("ABBR", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("ACRONYM", new ElemDesc(0 | ElemDesc.PHRASE)); m_elementFlags.put("SUP", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL)); m_elementFlags.put("SUB", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL)); m_elementFlags.put("SPAN", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL)); m_elementFlags.put("BDO", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL)); m_elementFlags.put("BR", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL | ElemDesc.EMPTY | ElemDesc.BLOCK)); m_elementFlags.put("BODY", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("ADDRESS", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); m_elementFlags.put("DIV", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); m_elementFlags.put("A", new ElemDesc(0 | ElemDesc.SPECIAL)); m_elementFlags.put("MAP", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL | ElemDesc.BLOCK)); m_elementFlags.put("AREA", new ElemDesc(0 | ElemDesc.EMPTY | ElemDesc.BLOCK)); m_elementFlags.put("LINK", new ElemDesc(0 | ElemDesc.HEADMISC | ElemDesc.EMPTY | ElemDesc.BLOCK)); m_elementFlags.put("IMG", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL | ElemDesc.EMPTY | ElemDesc.WHITESPACESENSITIVE)); m_elementFlags.put("OBJECT", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL | ElemDesc.HEADMISC | ElemDesc.WHITESPACESENSITIVE)); m_elementFlags.put("PARAM", new ElemDesc(0 | ElemDesc.EMPTY)); m_elementFlags.put("HR", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET | ElemDesc.EMPTY)); m_elementFlags.put("P", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); m_elementFlags.put("H1", new ElemDesc(0 | ElemDesc.HEAD | ElemDesc.BLOCK)); m_elementFlags.put("H2", new ElemDesc(0 | ElemDesc.HEAD | ElemDesc.BLOCK)); m_elementFlags.put("H3", new ElemDesc(0 | ElemDesc.HEAD | ElemDesc.BLOCK)); m_elementFlags.put("H4", new ElemDesc(0 | ElemDesc.HEAD | ElemDesc.BLOCK)); m_elementFlags.put("H5", new ElemDesc(0 | ElemDesc.HEAD | ElemDesc.BLOCK)); m_elementFlags.put("H6", new ElemDesc(0 | ElemDesc.HEAD | ElemDesc.BLOCK)); m_elementFlags.put("PRE", new ElemDesc(0 | ElemDesc.PREFORMATTED | ElemDesc.BLOCK)); m_elementFlags.put("Q", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL)); m_elementFlags.put("BLOCKQUOTE", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); m_elementFlags.put("INS", new ElemDesc(0)); m_elementFlags.put("DEL", new ElemDesc(0)); m_elementFlags.put("DL", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); m_elementFlags.put("DT", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("DD", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("OL", new ElemDesc(0 | ElemDesc.LIST | ElemDesc.BLOCK)); m_elementFlags.put("UL", new ElemDesc(0 | ElemDesc.LIST | ElemDesc.BLOCK)); m_elementFlags.put("LI", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("FORM", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("LABEL", new ElemDesc(0 | ElemDesc.FORMCTRL)); m_elementFlags.put("INPUT", new ElemDesc(0 | ElemDesc.FORMCTRL | ElemDesc.INLINELABEL | ElemDesc.EMPTY)); m_elementFlags.put("SELECT", new ElemDesc(0 | ElemDesc.FORMCTRL | ElemDesc.INLINELABEL)); m_elementFlags.put("OPTGROUP", new ElemDesc(0)); m_elementFlags.put("OPTION", new ElemDesc(0)); m_elementFlags.put("TEXTAREA", new ElemDesc(0 | ElemDesc.FORMCTRL | ElemDesc.INLINELABEL)); m_elementFlags.put("FIELDSET", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM)); m_elementFlags.put("LEGEND", new ElemDesc(0)); m_elementFlags.put("BUTTON", new ElemDesc(0 | ElemDesc.FORMCTRL | ElemDesc.INLINELABEL)); m_elementFlags.put("TABLE", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); m_elementFlags.put("CAPTION", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("THEAD", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("TFOOT", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("TBODY", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("COLGROUP", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("COL", new ElemDesc(0 | ElemDesc.EMPTY | ElemDesc.BLOCK)); m_elementFlags.put("TR", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("TH", new ElemDesc(0)); m_elementFlags.put("TD", new ElemDesc(0)); m_elementFlags.put("HEAD", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.HEADELEM)); m_elementFlags.put("TITLE", new ElemDesc(0 | ElemDesc.BLOCK)); m_elementFlags.put("BASE", new ElemDesc(0 | ElemDesc.EMPTY | ElemDesc.BLOCK)); m_elementFlags.put("META", new ElemDesc(0 | ElemDesc.HEADMISC | ElemDesc.EMPTY | ElemDesc.BLOCK)); m_elementFlags.put("STYLE", new ElemDesc(0 | ElemDesc.HEADMISC | ElemDesc.RAW | ElemDesc.BLOCK)); m_elementFlags.put("SCRIPT", new ElemDesc(0 | ElemDesc.SPECIAL | ElemDesc.ASPECIAL | ElemDesc.HEADMISC | ElemDesc.RAW)); m_elementFlags.put("NOSCRIPT", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); m_elementFlags.put("HTML", new ElemDesc(0 | ElemDesc.BLOCK)); // From "John Ky" <hand@syd.speednet.com.au // Transitional Document Type Definition () // file:///C:/Documents%20and%20Settings/sboag.BOAG600E/My%20Documents/html/sgml/loosedtd.html#basefont m_elementFlags.put("FONT", new ElemDesc(0 | ElemDesc.FONTSTYLE)); // file:///C:/Documents%20and%20Settings/sboag.BOAG600E/My%20Documents/html/present/graphics.html#edef-STRIKE m_elementFlags.put("S", new ElemDesc(0 | ElemDesc.FONTSTYLE)); m_elementFlags.put("STRIKE", new ElemDesc(0 | ElemDesc.FONTSTYLE)); // file:///C:/Documents%20and%20Settings/sboag.BOAG600E/My%20Documents/html/present/graphics.html#edef-U m_elementFlags.put("U", new ElemDesc(0 | ElemDesc.FONTSTYLE)); // From "John Ky" <hand@syd.speednet.com.au m_elementFlags.put("NOBR", new ElemDesc(0 | ElemDesc.FONTSTYLE)); // HTML 4.0, section 16.5 m_elementFlags.put("IFRAME", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); // NS4 extensions m_elementFlags.put("LAYER", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); m_elementFlags.put("ILAYER", new ElemDesc(0 | ElemDesc.BLOCK | ElemDesc.BLOCKFORM | ElemDesc.BLOCKFORMFIELDSET)); ElemDesc elemDesc; elemDesc = (ElemDesc) m_elementFlags.get("AREA"); elemDesc.setAttr("HREF", ElemDesc.ATTRURL); elemDesc.setAttr("NOHREF", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("BASE"); elemDesc.setAttr("HREF", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("BLOCKQUOTE"); elemDesc.setAttr("CITE", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("Q"); elemDesc.setAttr("CITE", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("INS"); elemDesc.setAttr("CITE", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("DEL"); elemDesc.setAttr("CITE", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("A"); elemDesc.setAttr("HREF", ElemDesc.ATTRURL); elemDesc.setAttr("NAME", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("LINK"); elemDesc.setAttr("HREF", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("INPUT"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("USEMAP", ElemDesc.ATTRURL); elemDesc.setAttr("CHECKED", ElemDesc.ATTREMPTY); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); elemDesc.setAttr("ISMAP", ElemDesc.ATTREMPTY); elemDesc.setAttr("READONLY", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("SELECT"); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); elemDesc.setAttr("MULTIPLE", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("OPTGROUP"); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("OPTION"); elemDesc.setAttr("SELECTED", ElemDesc.ATTREMPTY); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("TEXTAREA"); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); elemDesc.setAttr("READONLY", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("BUTTON"); elemDesc.setAttr("DISABLED", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("SCRIPT"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("FOR", ElemDesc.ATTRURL); elemDesc.setAttr("DEFER", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("IMG"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("LONGDESC", ElemDesc.ATTRURL); elemDesc.setAttr("USEMAP", ElemDesc.ATTRURL); elemDesc.setAttr("ISMAP", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("OBJECT"); elemDesc.setAttr("CLASSID", ElemDesc.ATTRURL); elemDesc.setAttr("CODEBASE", ElemDesc.ATTRURL); elemDesc.setAttr("DATA", ElemDesc.ATTRURL); elemDesc.setAttr("ARCHIVE", ElemDesc.ATTRURL); elemDesc.setAttr("USEMAP", ElemDesc.ATTRURL); elemDesc.setAttr("DECLARE", ElemDesc.ATTREMPTY); elemDesc = (ElemDesc) m_elementFlags.get("FORM"); elemDesc.setAttr("ACTION", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("HEAD"); elemDesc.setAttr("PROFILE", ElemDesc.ATTRURL); // Attribution to: "Voytenko, Dimitry" <DVoytenko@SECTORBASE.COM> elemDesc = (ElemDesc) m_elementFlags.get("FRAME"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("LONGDESC", ElemDesc.ATTRURL); // HTML 4.0, section 16.5 elemDesc = (ElemDesc) m_elementFlags.get("IFRAME"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc.setAttr("LONGDESC", ElemDesc.ATTRURL); // NS4 extensions elemDesc = (ElemDesc) m_elementFlags.get("LAYER"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("ILAYER"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); elemDesc = (ElemDesc) m_elementFlags.get("DIV"); elemDesc.setAttr("SRC", ElemDesc.ATTRURL); } /** * Dummy element for elements not found. */ static private ElemDesc m_dummy = new ElemDesc(0 | ElemDesc.BLOCK); /** True if URLs should be specially escaped with the %xx form. */ private boolean m_specialEscapeURLs = true; /** True if the META tag should be omitted. */ private boolean m_omitMetaTag = false; /** * Tells if the formatter should use special URL escaping. * * @param bool True if URLs should be specially escaped with the %xx form. */ public void setSpecialEscapeURLs(boolean bool) { m_specialEscapeURLs = bool; } /** * Tells if the formatter should omit the META tag. * * @param bool True if the META tag should be omitted. */ public void setOmitMetaTag(boolean bool) { m_omitMetaTag = bool; } /** * Specifies an output format for this serializer. It the * serializer has already been associated with an output format, * it will switch to the new format. This method should not be * called while the serializer is in the process of serializing
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?