tohtmlstream.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,886 行 · 第 1/5 页

JAVA
1,886
字号
                        writer.write(makeHHString(byte1));                        writer.write('%');                        writer.write(makeHHString(byte2));                        writer.write('%');                        writer.write(makeHHString(byte3));                        writer.write('%');                        writer.write(makeHHString(byte4));                    }                    else                    {                        int high = (ch >> 12) | 0xE0; // top 4 bits                        int middle = ((ch & 0x0FC0) >> 6) | 0x80;                        // middle 6 bits                        int low = (ch & 0x3F) | 0x80;                        // First 6 bits, + high bit                        writer.write('%');                        writer.write(makeHHString(high));                        writer.write('%');                        writer.write(makeHHString(middle));                        writer.write('%');                        writer.write(makeHHString(low));                    }                }                else if (escapingNotNeeded(ch))                {                    writer.write(ch);                }                else                {                    writer.write("&#");                    writer.write(Integer.toString(ch));                    writer.write(';');                }                // In this character range we have first written out any previously accumulated                 // "clean" characters, then processed the current more complicated character,                // which may have incremented "i".                // We now we reset the next possible clean character.                cleanStart = i + 1;            }            // Since http://www.ietf.org/rfc/rfc2396.txt refers to the URI grammar as            // not allowing quotes in the URI proper syntax, nor in the fragment             // identifier, we believe that it's OK to double escape quotes.            else if (ch == '"')            {                // If the character is a '%' number number, try to avoid double-escaping.                // There is a question if this is legal behavior.                // Dmitri Ilyin: to check if '%' number number is invalid. It must be checked if %xx is a sign, that would be encoded                // The encoded signes are in Hex form. So %xx my be in form %3C that is "<" sign. I will try to change here a little.                //        if( ((i+2) < len) && isASCIIDigit(stringArray[i+1]) && isASCIIDigit(stringArray[i+2]) )                // We are no longer escaping '%'                if (cleanLength > 0)                {                    writer.write(chars, cleanStart, cleanLength);                    cleanLength = 0;                }                                                   // Mike Kay encodes this as &#34;, so he may know something I don't?                if (doURLEscaping)                    writer.write("%22");                else                    writer.write("&quot;"); // we have to escape this, I guess.                // We have written out any clean characters, then the escaped '%' and now we                // We now we reset the next possible clean character.                cleanStart = i + 1;                }            else            {                // no processing for this character, just count how                // many characters in a row that we have that need no processing                cleanLength++;            }        }                // are there any clean characters at the end of the array        // that we haven't processed yet?        if (cleanLength > 1)        {            // if the whole string can be written out as-is do so            // otherwise write out the clean chars at the end of the            // array            if (cleanStart == 0)                writer.write(string);            else                writer.write(chars, cleanStart, cleanLength);        }        else if (cleanLength == 1)        {            // a little optimization for 1 clean character            // (we could have let the previous if(...) handle them all)            writer.write(ch);        }    }    /**     * Writes the specified <var>string</var> after substituting <VAR>specials</VAR>,     * and UTF-16 surrogates for character references <CODE>&amp;#xnn</CODE>.     *     * @param   string      String to convert to XML format.     * @param   encoding    CURRENTLY NOT IMPLEMENTED.     *     * @throws org.xml.sax.SAXException     */    public void writeAttrString(        final java.io.Writer writer, String string, String encoding)        throws IOException    {        final int end = string.length();        if (end > m_attrBuff.length)        {            m_attrBuff = new char[end * 2 + 1];        }        string.getChars(0, end, m_attrBuff, 0);        final char[] chars = m_attrBuff;                int cleanStart = 0;        int cleanLength = 0;        char ch = 0;        for (int i = 0; i < end; i++)        {            ch = chars[i];            // System.out.println("SPECIALSSIZE: "+SPECIALSSIZE);            // System.out.println("ch: "+(int)ch);            // System.out.println("m_maxCharacter: "+(int)m_maxCharacter);            // System.out.println("m_attrCharsMap[ch]: "+(int)m_attrCharsMap[ch]);            if (escapingNotNeeded(ch) && (!m_charInfo.isSpecialAttrChar(ch)))            {                cleanLength++;            }            else if ('<' == ch || '>' == ch)            {                cleanLength++; // no escaping in this case, as specified in 15.2            }            else if (                ('&' == ch) && ((i + 1) < end) && ('{' == chars[i + 1]))            {                cleanLength++; // no escaping in this case, as specified in 15.2            }            else            {                if (cleanLength > 0)                {                    writer.write(chars,cleanStart,cleanLength);                    cleanLength = 0;                }                int pos = accumDefaultEntity(writer, ch, i, chars, end, false, false);                if (i != pos)                {                    i = pos - 1;                }                else                {                    if (isUTF16Surrogate(ch))                    {                             writeUTF16Surrogate(ch, chars, i, end);                            i++; // two input characters processed                                 // this increments by one and the for()                                 // loop itself increments by another one.                    }                    // The next is kind of a hack to keep from escaping in the case                     // of Shift_JIS and the like.                    /*                    else if ((ch < m_maxCharacter) && (m_maxCharacter == 0xFFFF)                    && (ch != 160))                    {                    writer.write(ch);  // no escaping in this case                    }                    else                    */                    String entityName = m_charInfo.getEntityNameForChar(ch);                    if (null != entityName)                    {                        writer.write('&');                        writer.write(entityName);                        writer.write(';');                    }                    else if (escapingNotNeeded(ch))                    {                        writer.write(ch); // no escaping in this case                    }                    else                    {                        writer.write("&#");                        writer.write(Integer.toString(ch));                        writer.write(';');                    }                }                cleanStart = i + 1;            }        } // end of for()                // are there any clean characters at the end of the array        // that we haven't processed yet?        if (cleanLength > 1)        {            // if the whole string can be written out as-is do so            // otherwise write out the clean chars at the end of the            // array            if (cleanStart == 0)                writer.write(string);            else                writer.write(chars, cleanStart, cleanLength);        }        else if (cleanLength == 1)        {            // a little optimization for 1 clean character            // (we could have let the previous if(...) handle them all)            writer.write(ch);        }    }    /**     * Receive notification of character data.     *     * <p>The Parser will call this method to report each chunk of     * character data.  SAX parsers may return all contiguous character     * data in a single chunk, or they may split it into several     * chunks; however, all of the characters in any single event     * must come from the same external entity, so that the Locator     * provides useful information.</p>     *     * <p>The application must not attempt to read from the array     * outside of the specified range.</p>     *     * <p>Note that some parsers will report whitespace using the     * ignorableWhitespace() method rather than this one (validating     * parsers must do so).</p>     *     * @param chars The characters from the XML document.     * @param start The start position in the array.     * @param length The number of characters to read from the array.     * @throws org.xml.sax.SAXException Any SAX exception, possibly     *            wrapping another exception.     * @see #ignorableWhitespace     * @see org.xml.sax.Locator     *     * @throws org.xml.sax.SAXException     */    public final void characters(char chars[], int start, int length)        throws org.xml.sax.SAXException    {        if (m_elemContext.m_isRaw)        {            try            {                if (m_elemContext.m_startTagOpen)                {                    closeStartTag();                    m_elemContext.m_startTagOpen = false;                }                m_ispreserve = true;                //              With m_ispreserve just set true it looks like shouldIndent()//              will always return false, so drop any possible indentation.//              if (shouldIndent())//                  indent();                // writer.write("<![CDATA[");                // writer.write(chars, start, length);                writeNormalizedChars(chars, start, length, false, m_lineSepUse);                // writer.write("]]>");                                // time to generate characters event                if (m_tracer != null)                    super.fireCharEvent(chars, start, length);                                return;            }            catch (IOException ioe)            {                throw new org.xml.sax.SAXException(                    XMLMessages.createXMLMessage(                        XMLErrorResources.ER_OIERROR,                        null),                    ioe);                //"IO error", ioe);            }        }        else        {            super.characters(chars, start, length);        }    }    /**     *  Receive notification of cdata.     *     *  <p>The Parser will call this method to report each chunk of     *  character data.  SAX parsers may return all contiguous character     *  data in a single chunk, or they may split it into several     *  chunks; however, all of the characters in any single event     *  must come from the same external entity, so that the Locator     *  provides useful information.</p>     *     *  <p>The application must not attempt to read from the array     *  outside of the specified range.</p>     *     *  <p>Note that some parsers will report whitespace using the     *  ignorableWhitespace() method rather than this one (validating     *  parsers must do so).</p>     *     *  @param ch The characters from the XML document.     *  @param start The start position in the array.     *  @param length The number of characters to read from the array.     *  @throws org.xml.sax.SAXException Any SAX exception, possibly     *             wrapping another exception.     *  @see #ignorableWhitespace     *  @see org.xml.sax.Locator     *     * @throws org.xml.sax.SAXException     */    public final void cdata(char ch[], int start, int length)        throws org.xml.sax.SAXException    {        if ((null != m_elemContext.m_elementName)            && (m_elemContext.m_elementName.equalsIgnoreCase("SCRIPT")                || m_elemContext.m_elementName.equalsIgnoreCase("STYLE")))        {            try            {                if (m_elemContext.m_startTagOpen)                {                    closeStartTag();                    m_elemContext.m_startTagOpen = false;                }                m_ispreserve = true;                if (shouldIndent())                    indent();                // writer.write(ch, start, length);                writeNormalizedChars(ch, start, length, true, m_lineSepUse);            }            catch (IOException ioe)            {                throw new org.xml.sax.SAXException(                    XMLMessages.createXMLMessage(                        XMLErrorResources.ER_OIERROR,                        null),                    ioe);                //"IO error", ioe);            }        }        else        {            super.cdata(ch, start, length);        }    }    /**     *  Receive notification of a processing instruction.     *     *  @param target The processing instruction target.     *  @param data The processing instruction data, or null if     *         none was supplied.     *  @throws org.xml.sax.SAXException Any SAX exception, possibly     *             wrapping another exception.     *

⌨️ 快捷键说明

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