tohtmlstream.java

来自「Mobile 应用程序使用 Java Micro Edition (Java M」· Java 代码 · 共 1,824 行 · 第 1/5 页

JAVA
1,824
字号
            }        }        flushWriter();        if (m_tracer != null)            super.fireEndDoc();    }    /**     *  Receive notification of the beginning of an element.     *     *     *  @param namespaceURI     *  @param localName     *  @param name The element type name.     *  @param atts The attributes attached to the element, if any.     *  @throws org.xml.sax.SAXException Any SAX exception, possibly     *             wrapping another exception.     *  @see #endElement     *  @see org.xml.sax.AttributeList     */    public void startElement(        String namespaceURI,        String localName,        String name,        Attributes atts)        throws org.xml.sax.SAXException    {        ElemContext elemContext = m_elemContext;        // clean up any pending things first        if (elemContext.m_startTagOpen)        {            closeStartTag();            elemContext.m_startTagOpen = false;        }        else if (m_cdataTagOpen)        {            closeCDATA();            m_cdataTagOpen = false;        }        else if (m_needToCallStartDocument)        {            startDocumentInternal();            m_needToCallStartDocument = false;        }        // if this element has a namespace then treat it like XML        if (null != namespaceURI && namespaceURI.length() > 0)        {            super.startElement(namespaceURI, localName, name, atts);            return;        }                try        {            // getElemDesc2(name) is faster than getElemDesc(name)            ElemDesc elemDesc = getElemDesc2(name);            int elemFlags = elemDesc.getFlags();            // deal with indentation issues first            if (m_doIndent)            {                boolean isBlockElement = (elemFlags & ElemDesc.BLOCK) != 0;                if (m_ispreserve)                    m_ispreserve = false;                else if (                    (null != elemContext.m_elementName)                    && (!m_inBlockElem                        || isBlockElement) /* && !isWhiteSpaceSensitive */                    )                {                    m_startNewLine = true;                    indent();                }                m_inBlockElem = !isBlockElement;            }            // save any attributes for later processing            if (atts != null)                addAttributes(atts);                        m_isprevtext = false;            final java.io.Writer writer = m_writer;            writer.write('<');            writer.write(name);            if (m_tracer != null)                firePseudoAttributes();                        if ((elemFlags & ElemDesc.EMPTY) != 0)              {                // an optimization for elements which are expected                // to be empty.                m_elemContext = elemContext.push();                /* XSLTC sometimes calls namespaceAfterStartElement()                 * so we need to remember the name                 */                m_elemContext.m_elementName = name;                m_elemContext.m_elementDesc = elemDesc;                return;                            }             else            {                elemContext = elemContext.push(namespaceURI,localName,name);                m_elemContext = elemContext;                elemContext.m_elementDesc = elemDesc;                elemContext.m_isRaw = (elemFlags & ElemDesc.RAW) != 0;            }                        if ((elemFlags & ElemDesc.HEADELEM) != 0)            {                // This is the <HEAD> element, do some special processing                closeStartTag();                elemContext.m_startTagOpen = false;                if (!m_omitMetaTag)                {                    if (m_doIndent)                        indent();                    writer.write(                        "<META http-equiv=\"Content-Type\" content=\"text/html; charset=");                    String encoding = getEncoding();                    String encode = Encodings.getMimeEncoding(encoding);                    writer.write(encode);                    writer.write("\">");                }            }        }        catch (IOException e)        {            throw new SAXException(e);        }    }    /**     *  Receive notification of the end of an element.     *     *     *  @param namespaceURI     *  @param localName     *  @param name The element type name     *  @throws org.xml.sax.SAXException Any SAX exception, possibly     *             wrapping another exception.     */    public final void endElement(        final String namespaceURI,        final String localName,        final String name)        throws org.xml.sax.SAXException    {        // deal with any pending issues        if (m_cdataTagOpen)            closeCDATA();        // if the element has a namespace, treat it like XML, not HTML        if (null != namespaceURI && namespaceURI.length() > 0)        {            super.endElement(namespaceURI, localName, name);            return;        }        try        {            ElemContext elemContext = m_elemContext;            final ElemDesc elemDesc = elemContext.m_elementDesc;            final int elemFlags = elemDesc.getFlags();            final boolean elemEmpty = (elemFlags & ElemDesc.EMPTY) != 0;            // deal with any indentation issues            if (m_doIndent)            {                final boolean isBlockElement = (elemFlags&ElemDesc.BLOCK) != 0;                boolean shouldIndent = false;                if (m_ispreserve)                {                    m_ispreserve = false;                }                else if (m_doIndent && (!m_inBlockElem || isBlockElement))                {                    m_startNewLine = true;                    shouldIndent = true;                }                if (!elemContext.m_startTagOpen && shouldIndent)                    indent(elemContext.m_currentElemDepth - 1);                m_inBlockElem = !isBlockElement;            }            final java.io.Writer writer = m_writer;            if (!elemContext.m_startTagOpen)            {                writer.write("</");                writer.write(name);                writer.write('>');            }            else            {                // the start-tag open when this method was called,                // so we need to process it now.                                if (m_tracer != null)                    super.fireStartElem(name);                // the starting tag was still open when we received this endElement() call                // so we need to process any gathered attributes NOW, before they go away.                int nAttrs = m_attributes.getLength();                if (nAttrs > 0)                {                    processAttributes(m_writer, nAttrs);                    // clear attributes object for re-use with next element                    m_attributes.clear();                }                if (!elemEmpty)                {                    // As per Dave/Paul recommendation 12/06/2000                    // if (shouldIndent)                    // writer.write('>');                    //  indent(m_currentIndent);                    writer.write("></");                    writer.write(name);                    writer.write('>');                }                else                {                    writer.write('>');                }            }                        // clean up because the element has ended            if ((elemFlags & ElemDesc.WHITESPACESENSITIVE) != 0)                m_ispreserve = true;            m_isprevtext = false;            // fire off the end element event            if (m_tracer != null)                super.fireEndElem(name);                                                   // OPTIMIZE-EMPTY                            if (elemEmpty)            {                // a quick exit if the HTML element had no children.                // This block of code can be removed if the corresponding block of code                // in startElement() also labeled with "OPTIMIZE-EMPTY" is also removed                m_elemContext = elemContext.m_prev;                return;            }            // some more clean because the element has ended.             if (!elemContext.m_startTagOpen)            {                if (m_doIndent && !m_preserves.isEmpty())                    m_preserves.pop();            }            m_elemContext = elemContext.m_prev;//            m_isRawStack.pop();        }        catch (IOException e)        {            throw new SAXException(e);        }    }    /**     * Process an attribute.     * @param   writer The writer to write the processed output to.     * @param   name   The name of the attribute.     * @param   value   The value of the attribute.     * @param   elemDesc The description of the HTML element      *           that has this attribute.     *     * @throws org.xml.sax.SAXException     */    protected void processAttribute(        java.io.Writer writer,        String name,        String value,        ElemDesc elemDesc)        throws IOException    {        writer.write(' ');        if (   ((value.length() == 0) || value.equalsIgnoreCase(name))            && elemDesc != null             && elemDesc.isAttrFlagSet(name, ElemDesc.ATTREMPTY))        {            writer.write(name);        }        else        {            // %REVIEW% %OPT%            // Two calls to single-char write may NOT            // be more efficient than one to string-write...            writer.write(name);            writer.write("=\"");            if (   elemDesc != null                && elemDesc.isAttrFlagSet(name, ElemDesc.ATTRURL))                writeAttrURI(writer, value, m_specialEscapeURLs);            else                writeAttrString(writer, value, this.getEncoding());            writer.write('"');        }    }    /**     * Tell if a character is an ASCII digit.     */    private boolean isASCIIDigit(char c)    {        return (c >= '0' && c <= '9');    }    /**     * Make an integer into an HH hex value.     * Does no checking on the size of the input, since this      * is only meant to be used locally by writeAttrURI.     *      * @param i must be a value less than 255.     *      * @return should be a two character string.     */    private static String makeHHString(int i)    {        String s = Integer.toHexString(i).toUpperCase();        if (s.length() == 1)        {            s = "0" + s;        }        return s;    }    /**    * Dmitri Ilyin: Makes sure if the String is HH encoded sign.    * @param str must be 2 characters long    *    * @return true or false    */    private boolean isHHSign(String str)    {        boolean sign = true;        try        {            char r = (char) Integer.parseInt(str, 16);        }        catch (NumberFormatException e)        {            sign = false;        }        return sign;    }    /**     * Write the specified <var>string</var> after substituting non ASCII characters,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?