1package com.nwalsh.saxon;
2
3import org.xml.sax.*;
4import javax.xml.transform.TransformerException;
5import com.icl.saxon.output.*;
6import com.icl.saxon.om.*;
7import com.icl.saxon.expr.FragmentValue;
8
9/**
10 * <p>Saxon extension to count the lines in a result tree fragment.</p>
11 *
12 * <p>$Id: LineCountEmitter.java,v 1.2 2006/04/27 08:26:47 xmldoc Exp $</p>
13 *
14 * <p>Copyright (C) 2000 Norman Walsh.</p>
15 *
16 * <p>This class provides a
17 * <a href="http://saxon.sourceforge.net/">Saxon 6.*</a>
18 * implementation to count the number of lines in a result tree
19 * fragment.</p>
20 *
21 * <p>The general design is this: the stylesheets construct a result tree
22 * fragment for some verbatim environment. That result tree fragment
23 * is "replayed" through the LineCountEmitter; the LineCountEmitter watches
24 * characters go by and counts the number of line feeds that it sees.
25 * That number is then returned.</p>
26 *
27 * <p><b>Change Log:</b></p>
28 * <dl>
29 * <dt>1.0</dt>
30 * <dd><p>Initial release.</p></dd>
31 * </dl>
32 *
33 * @see Verbatim
34 *
35 * @author Norman Walsh
36 * <a href="mailto:ndw@nwalsh.com">ndw@nwalsh.com</a>
37 *
38 * @version $Id: LineCountEmitter.java,v 1.2 2006/04/27 08:26:47 xmldoc Exp $
39 *
40 */
41public class LineCountEmitter extends com.icl.saxon.output.Emitter {
42  /** The number of lines seen. */
43  protected int numLines = 0;
44
45  /** Construct a new LineCountEmitter. */
46  public LineCountEmitter() {
47    numLines = 0;
48  }
49
50  /** Reset the number of lines. */
51  public void reset() {
52    numLines = 0;
53  }
54
55  /** Return the number of lines. */
56  public int lineCount() {
57    return numLines;
58  }
59
60  /** Process characters. */
61  public void characters(char[] chars, int start, int len)
62    throws javax.xml.transform.TransformerException {
63
64    if (numLines == 0) {
65      // If there are any characters at all, there's at least one line
66      numLines++;
67    }
68
69    for (int count = start; count < start+len; count++) {
70      if (chars[count] == '\n') {
71	numLines++;
72      }
73    }
74  }
75
76  /** Discarded. */
77  public void comment(char[] chars, int start, int length)
78    throws javax.xml.transform.TransformerException {
79    // nop
80  }
81
82  /** Discarded. */
83  public void endDocument()
84    throws javax.xml.transform.TransformerException {
85    // nop
86  }
87
88  /** Discarded. */
89  public void endElement(int nameCode)
90    throws javax.xml.transform.TransformerException {
91    // nop
92  }
93
94  /** Discarded. */
95  public void processingInstruction(java.lang.String name,
96				    java.lang.String data)
97    throws javax.xml.transform.TransformerException {
98    // nop
99  }
100
101  /** Discarded. */
102  public void setDocumentLocator(org.xml.sax.Locator locator) {
103    // nop
104  }
105
106  /** Discarded. */
107  public void setEscaping(boolean escaping)
108    throws javax.xml.transform.TransformerException {
109    // nop
110  }
111
112  /** Discarded. */
113  public void setNamePool(NamePool namePool) {
114    // nop
115  }
116
117  /** Discarded. */
118  public void setUnparsedEntity(java.lang.String name, java.lang.String uri)
119    throws javax.xml.transform.TransformerException {
120    // nop
121  }
122
123  /** Discarded. */
124  public void setWriter(java.io.Writer writer) {
125    // nop
126  }
127
128  /** Discarded. */
129  public void startDocument()
130    throws javax.xml.transform.TransformerException {
131    // nop
132  }
133
134  /** Discarded. */
135  public void startElement(int nameCode,
136		    org.xml.sax.Attributes attributes,
137		    int[] namespaces, int nscount)
138    throws javax.xml.transform.TransformerException {
139    // nop
140  }
141}
142