in assets/support/faq/docbook-xsl/extensions/saxon643/com/nwalsh/saxon/CalloutEmitter.java [178:254]
public void characters(char[] chars, int start, int len)
throws TransformerException {
// If we hit characters, then there's no first element...
firstElement = false;
if (lineNumber == 0) {
// if there are any text nodes, there's at least one line
lineNumber++;
colNumber = 1;
}
// Walk through the text node looking for callout positions
char[] newChars = new char[len];
int pos = 0;
for (int count = start; count < start+len; count++) {
if (calloutPos < calloutCount
&& callout[calloutPos].getLine() == lineNumber
&& callout[calloutPos].getColumn() == colNumber) {
if (pos > 0) {
rtfEmitter.characters(newChars, 0, pos);
pos = 0;
}
closeOpenElements(rtfEmitter);
while (calloutPos < calloutCount
&& callout[calloutPos].getLine() == lineNumber
&& callout[calloutPos].getColumn() == colNumber) {
fCallout.formatCallout(rtfEmitter, callout[calloutPos]);
calloutPos++;
}
openClosedElements(rtfEmitter);
}
if (chars[count] == '\n') {
// What if we need to pad this line?
if (calloutPos < calloutCount
&& callout[calloutPos].getLine() == lineNumber
&& callout[calloutPos].getColumn() > colNumber) {
if (pos > 0) {
rtfEmitter.characters(newChars, 0, pos);
pos = 0;
}
closeOpenElements(rtfEmitter);
while (calloutPos < calloutCount
&& callout[calloutPos].getLine() == lineNumber
&& callout[calloutPos].getColumn() > colNumber) {
formatPad(callout[calloutPos].getColumn() - colNumber);
colNumber = callout[calloutPos].getColumn();
while (calloutPos < calloutCount
&& callout[calloutPos].getLine() == lineNumber
&& callout[calloutPos].getColumn() == colNumber) {
fCallout.formatCallout(rtfEmitter, callout[calloutPos]);
calloutPos++;
}
}
openClosedElements(rtfEmitter);
}
lineNumber++;
colNumber = 1;
} else {
colNumber++;
}
newChars[pos++] = chars[count];
}
if (pos > 0) {
rtfEmitter.characters(newChars, 0, pos);
}
}