ToTextStreampublic final class ToTextStream extends ToStream This class is not a public API.
It is only public because it is used in other packages.
This class converts SAX or SAX-like calls to a
serialized document for xsl:output method of "text". |
Constructors Summary |
---|
public ToTextStream()Default constructor.
super();
|
Methods Summary |
---|
public void | addAttribute(java.lang.String uri, java.lang.String localName, java.lang.String rawName, java.lang.String type, java.lang.String value, boolean XSLAttribute)
// do nothing, just forget all about the attribute
| public void | addAttribute(java.lang.String name, java.lang.String value)From XSLTC
// do nothing, forget about the attribute
| public void | addUniqueAttribute(java.lang.String qName, java.lang.String value, int flags)Add a unique attribute
// do nothing, forget about the attribute
| public void | cdata(char[] ch, int start, int length)Receive notification of cdata.
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.
The application must not attempt to read from the array
outside of the specified range.
Note that some parsers will report whitespace using the
ignorableWhitespace() method rather than this one (validating
parsers must do so).
try
{
writeNormalizedChars(ch, start, length, m_lineSepUse);
if (m_tracer != null)
super.fireCDATAEvent(ch, start, length);
}
catch(IOException ioe)
{
throw new SAXException(ioe);
}
| public void | characters(java.lang.String characters)From XSLTC
final int length = characters.length();
if (length > m_charsBuff.length)
{
m_charsBuff = new char[length*2 + 1];
}
characters.getChars(0, length, m_charsBuff, 0);
characters(m_charsBuff, 0, length);
| public void | characters(char[] ch, int start, int length)Receive notification of character data.
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.
The application must not attempt to read from the array
outside of the specified range.
Note that some parsers will report whitespace using the
ignorableWhitespace() method rather than this one (validating
parsers must do so).
flushPending();
try
{
if (inTemporaryOutputState()) {
/* leave characters un-processed as we are
* creating temporary output, the output generated by
* this serializer will be input to a final serializer
* later on and it will do the processing in final
* output state (not temporary output state).
*
* A "temporary" ToTextStream serializer is used to
* evaluate attribute value templates (for example),
* and the result of evaluating such a thing
* is fed into a final serializer later on.
*/
m_writer.write(ch, start, length);
}
else {
// In final output state we do process the characters!
writeNormalizedChars(ch, start, length, m_lineSepUse);
}
if (m_tracer != null)
super.fireCharEvent(ch, start, length);
}
catch(IOException ioe)
{
throw new SAXException(ioe);
}
| public void | charactersRaw(char[] ch, int start, int length)If available, when the disable-output-escaping attribute is used,
output raw text without escaping.
try
{
writeNormalizedChars(ch, start, length, m_lineSepUse);
}
catch(IOException ioe)
{
throw new SAXException(ioe);
}
| public void | comment(java.lang.String data)Called when a Comment is to be constructed.
Note that Xalan will normally invoke the other version of this method.
%REVIEW% In fact, is this one ever needed, or was it a mistake?
final int length = data.length();
if (length > m_charsBuff.length)
{
m_charsBuff = new char[length*2 + 1];
}
data.getChars(0, length, m_charsBuff, 0);
comment(m_charsBuff, 0, length);
| public void | comment(char[] ch, int start, int length)Report an XML comment anywhere in the document.
This callback will be used for comments inside or outside the
document element, including comments in the external DTD
subset (if read).
flushPending();
if (m_tracer != null)
super.fireCommentEvent(ch, start, length);
| public void | endCDATA()
// do nothing
| public void | endDocument()Receive notification of the end of a document.
The SAX parser will invoke this method only once, and it will
be the last method invoked during the parse. The parser shall
not invoke this method until it has either abandoned parsing
(because of an unrecoverable error) or reached the end of
input.
flushPending();
flushWriter();
if (m_tracer != null)
super.fireEndDoc();
| public void | endElement(java.lang.String elemName)
if (m_tracer != null)
super.fireEndElem(elemName);
| public void | endElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String name)Receive notification of the end of an element.
The SAX parser will invoke this method at the end of every
element in the XML document; there will be a corresponding
startElement() event for every endElement() event (even when the
element is empty).
If the element name has a namespace prefix, the prefix will
still be attached to the name.
if (m_tracer != null)
super.fireEndElem(name);
| public void | entityReference(java.lang.String name)Receive notivication of a entityReference.
if (m_tracer != null)
super.fireEntityReference(name);
| public void | flushPending()
if (m_needToCallStartDocument)
{
startDocumentInternal();
m_needToCallStartDocument = false;
}
| public void | ignorableWhitespace(char[] ch, int start, int length)Receive notification of ignorable whitespace in element content.
Validating Parsers must use this method to report each chunk
of ignorable whitespace (see the W3C XML 1.0 recommendation,
section 2.10): non-validating parsers may also use this method
if they are capable of parsing and using content models.
SAX parsers may return all contiguous whitespace 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.
The application must not attempt to read from the array
outside of the specified range.
try
{
writeNormalizedChars(ch, start, length, m_lineSepUse);
}
catch(IOException ioe)
{
throw new SAXException(ioe);
}
| public void | namespaceAfterStartElement(java.lang.String prefix, java.lang.String uri)
// no namespace support for HTML
| public void | processingInstruction(java.lang.String target, java.lang.String data)Receive notification of a processing instruction.
The Parser will invoke this method once for each processing
instruction found: note that processing instructions may occur
before or after the main document element.
A SAX parser should never report an XML declaration (XML 1.0,
section 2.8) or a text declaration (XML 1.0, section 4.3.1)
using this method.
// flush anything pending first
flushPending();
if (m_tracer != null)
super.fireEscapingEvent(target, data);
| protected void | startDocumentInternal()Receive notification of the beginning of a document.
The SAX parser will invoke this method only once, before any
other methods in this interface or in DTDHandler (except for
setDocumentLocator).
super.startDocumentInternal();
m_needToCallStartDocument = false;
// No action for the moment.
| public void | startElement(java.lang.String elementNamespaceURI, java.lang.String elementLocalName, java.lang.String elementName)From XSLTC
if (m_needToCallStartDocument)
startDocumentInternal();
// time to fire off startlement event.
if (m_tracer != null) {
super.fireStartElem(elementName);
this.firePseudoAttributes();
}
return;
| public void | startElement(java.lang.String namespaceURI, java.lang.String localName, java.lang.String name, org.xml.sax.Attributes atts)Receive notification of the beginning of an element.
The Parser will invoke this method at the beginning of every
element in the XML document; there will be a corresponding
endElement() event for every startElement() event (even when the
element is empty). All of the element's content will be
reported, in order, before the corresponding endElement()
event.
If the element name has a namespace prefix, the prefix will
still be attached. Note that the attribute list provided will
contain only attributes with explicit values (specified or
defaulted): #IMPLIED attributes will be omitted.
// time to fire off startElement event
if (m_tracer != null) {
super.fireStartElem(name);
this.firePseudoAttributes();
}
return;
| public boolean | startPrefixMapping(java.lang.String prefix, java.lang.String uri, boolean shouldFlush)
// no namespace support for HTML
return false;
| public void | startPrefixMapping(java.lang.String prefix, java.lang.String uri)
// no namespace support for HTML
| void | writeNormalizedChars(char[] ch, int start, int length, boolean useLineSep)Normalize the characters, but don't escape. Different from
SerializerToXML#writeNormalizedChars because it does not attempt to do
XML escaping at all.
final String encoding = getEncoding();
final java.io.Writer writer = m_writer;
final int end = start + length;
/* copy a few "constants" before the loop for performance */
final char S_LINEFEED = CharInfo.S_LINEFEED;
// This for() loop always increments i by one at the end
// of the loop. Additional increments of i adjust for when
// two input characters (a high/low UTF16 surrogate pair)
// are processed.
for (int i = start; i < end; i++) {
final char c = ch[i];
if (S_LINEFEED == c && useLineSep) {
writer.write(m_lineSep, 0, m_lineSepLen);
// one input char processed
} else if (m_encodingInfo.isInEncoding(c)) {
writer.write(c);
// one input char processed
} else if (Encodings.isHighUTF16Surrogate(c)) {
final int codePoint = writeUTF16Surrogate(c, ch, i, end);
if (codePoint != 0) {
// I think we can just emit the message,
// not crash and burn.
final String integralValue = Integer.toString(codePoint);
final String msg = Utils.messages.createMessage(
MsgKey.ER_ILLEGAL_CHARACTER,
new Object[] { integralValue, encoding });
//Older behavior was to throw the message,
//but newer gentler behavior is to write a message to System.err
//throw new SAXException(msg);
System.err.println(msg);
}
i++; // two input chars processed
} else {
// Don't know what to do with this char, it is
// not in the encoding and not a high char in
// a surrogate pair, so write out as an entity ref
if (encoding != null) {
/* The output encoding is known,
* so somthing is wrong.
*/
// not in the encoding, so write out a character reference
writer.write('&");
writer.write('#");
writer.write(Integer.toString(c));
writer.write(';");
// I think we can just emit the message,
// not crash and burn.
final String integralValue = Integer.toString(c);
final String msg = Utils.messages.createMessage(
MsgKey.ER_ILLEGAL_CHARACTER,
new Object[] { integralValue, encoding });
//Older behavior was to throw the message,
//but newer gentler behavior is to write a message to System.err
//throw new SAXException(msg);
System.err.println(msg);
} else {
/* The output encoding is not known,
* so just write it out as-is.
*/
writer.write(c);
}
// one input char was processed
}
}
|
|