com.nwalsh.saxon
Class NumberLinesEmitter

java.lang.Object
  extended bycom.icl.saxon.output.Emitter
      extended bycom.nwalsh.saxon.CopyEmitter
          extended bycom.nwalsh.saxon.NumberLinesEmitter
All Implemented Interfaces:
javax.xml.transform.Result

public class NumberLinesEmitter
extends CopyEmitter

Saxon extension to decorate a result tree fragment with line numbers.

$Id: NumberLinesEmitter.java,v 1.3 2003/08/27 14:24:59 nwalsh Exp $

Copyright (C) 2000 Norman Walsh.

This class provides the guts of a Saxon 6.* implementation of line numbering for verbatim environments. (It is used by the Verbatim class.)

The general design is this: the stylesheets construct a result tree fragment for some verbatim environment. The Verbatim class initializes a NumberLinesEmitter with information about what lines should be numbered and how. Then the result tree fragment is "replayed" through the NumberLinesEmitter; the NumberLinesEmitter builds a new result tree fragment from this event stream, decorated with line numbers, and that is returned.

Change Log:

1.0

Initial release.

Version:
$Id: NumberLinesEmitter.java,v 1.3 2003/08/27 14:24:59 nwalsh Exp $
Author:
Norman Walsh ndw@nwalsh.com
See Also:
Verbatim

Field Summary
protected  java.util.Stack elementStack
          A stack for the preserving information about open elements.
protected  boolean firstElement
          Is the next element absolutely the first element in the fragment?
protected  boolean foStylesheet
          Is the stylesheet currently running an FO stylesheet?
protected static java.lang.String foURI
          The FO namespace name.
protected  int lineNumber
          The current line number.
protected  int modulus
          Every modulus line will be numbered.
protected  java.lang.String separator
          Line numbers are separated from the listing by separator.
protected  int startinglinenumber
          The first line number will be startinglinenumber.
protected  int width
          Line numbers are width characters wide.
protected static java.lang.String xhURI
          The XHTML namespace name.
 
Fields inherited from class com.nwalsh.saxon.CopyEmitter
namePool, rtf, rtfEmitter
 
Fields inherited from class com.icl.saxon.output.Emitter
locator, outputProperties, outputStream, systemId, writer
 
Fields inherited from interface javax.xml.transform.Result
PI_DISABLE_OUTPUT_ESCAPING, PI_ENABLE_OUTPUT_ESCAPING
 
Constructor Summary
NumberLinesEmitter(Controller controller, NamePool namePool, int startingLineNumber, int modulus, int width, java.lang.String separator, boolean foStylesheet)
          Constructor for the NumberLinesEmitter.
 
Method Summary
 void characters(char[] chars, int start, int len)
          Process characters.
 void endElement(int nameCode)
          Process end element events.
protected  void formatLineNumber(int lineNumber)
          Add a formatted line number to the result tree fragment.
protected  boolean skipThisElement(int nameCode)
          Protect the outer-most block wrapper.
 void startElement(int nameCode, org.xml.sax.Attributes attributes, int[] namespaces, int nscount)
          Process start element events.
 
Methods inherited from class com.nwalsh.saxon.CopyEmitter
comment, endDocument, getResultTreeFragment, processingInstruction, setDocumentLocator, setEscaping, setNamePool, setUnparsedEntity, setWriter, startDocument
 
Methods inherited from class com.icl.saxon.output.Emitter
getNamePool, getOutputProperties, getOutputStream, getSystemId, getWriter, makeEmitter, setOutputProperties, setOutputStream, setSystemId, usesWriter
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

elementStack

protected java.util.Stack elementStack
A stack for the preserving information about open elements.


lineNumber

protected int lineNumber
The current line number.


firstElement

protected boolean firstElement
Is the next element absolutely the first element in the fragment?


foURI

protected static java.lang.String foURI
The FO namespace name.


xhURI

protected static java.lang.String xhURI
The XHTML namespace name.


startinglinenumber

protected int startinglinenumber
The first line number will be startinglinenumber.


modulus

protected int modulus
Every modulus line will be numbered.


width

protected int width
Line numbers are width characters wide.


separator

protected java.lang.String separator
Line numbers are separated from the listing by separator.


foStylesheet

protected boolean foStylesheet
Is the stylesheet currently running an FO stylesheet?

Constructor Detail

NumberLinesEmitter

public NumberLinesEmitter(Controller controller,
                          NamePool namePool,
                          int startingLineNumber,
                          int modulus,
                          int width,
                          java.lang.String separator,
                          boolean foStylesheet)

Constructor for the NumberLinesEmitter.

Parameters:
namePool - The name pool to use for constructing elements and attributes.
modulus - The modulus to use for this listing.
width - The width to use for line numbers in this listing.
separator - The separator to use for this listing.
foStylesheet - Is this an FO stylesheet?
Method Detail

characters

public void characters(char[] chars,
                       int start,
                       int len)
                throws javax.xml.transform.TransformerException
Process characters.

Overrides:
characters in class CopyEmitter
Throws:
javax.xml.transform.TransformerException

formatLineNumber

protected void formatLineNumber(int lineNumber)
                         throws javax.xml.transform.TransformerException

Add a formatted line number to the result tree fragment.

Parameters:
lineNumber - The number of the current line.
Throws:
javax.xml.transform.TransformerException

endElement

public void endElement(int nameCode)
                throws javax.xml.transform.TransformerException
Process end element events.

Overrides:
endElement in class CopyEmitter
Throws:
javax.xml.transform.TransformerException

startElement

public void startElement(int nameCode,
                         org.xml.sax.Attributes attributes,
                         int[] namespaces,
                         int nscount)
                  throws javax.xml.transform.TransformerException
Process start element events.

Overrides:
startElement in class CopyEmitter
Throws:
javax.xml.transform.TransformerException

skipThisElement

protected boolean skipThisElement(int nameCode)

Protect the outer-most block wrapper.

Open elements in the result tree fragment are closed and reopened around callouts (so that callouts don't appear inside links or other environments). But if the result tree fragment is a single block (a div or pre in HTML, an fo:block in FO), that outer-most block is treated specially.

This method returns true if the element in question is that outermost block.

Parameters:
nameCode - The name code for the element
Returns:
True if the element is the outer-most block, false otherwise.