package net.bible.service.format.osistohtml;
import net.bible.service.common.Logger;
import net.bible.service.format.osistohtml.osishandlers.OsisToHtmlSaxHandler.VerseInfo;
/**
* Write characters out to a StringBuilder - used while creating html for display
*
* @see gnu.lgpl.License for license details.<br>
* The copyright to this program is held by it's authors.
* @author Martin Denham [mjdenham at gmail dot com]
*/
public class HtmlTextWriter {
private StringBuilder writer;
private int dontWriteRequestCount = 0;
private int writeTempStoreRequestCount = 0;
private StringBuilder tempStore = new StringBuilder();
// Prevent multiple conflicting preverse attempts
private int insertionRequestCount = 0;
// allow insert at a certain position
private String overwrittenString = "";
@SuppressWarnings("unused")
private static final Logger log = new Logger("HtmlTextWriter");
public HtmlTextWriter() {
writer = new StringBuilder();
}
public void write(String htmlText) {
if (dontWriteRequestCount>0) {
// ignore all text
} else if (writeTempStoreRequestCount==0) {
writer.append(htmlText);
} else {
tempStore.append(htmlText);
}
}
/** allow line breaks and titles to be moved before verse number
*/
public void writeOptionallyBeforeVerse(String s, VerseInfo verseInfo) {
boolean writeBeforeVerse = !verseInfo.isTextSinceVerse;
if (writeBeforeVerse) {
beginInsertAt(verseInfo.positionToInsertBeforeVerse);
}
write(s);
if (writeBeforeVerse) {
finishInserting();
}
}
/** allow pre-verse headings
*/
public void beginInsertAt(int insertOffset) {
insertionRequestCount++;
if (insertionRequestCount==1) {
overwrittenString = writer.substring(insertOffset);
writer.delete(insertOffset, writer.length());
}
}
/** finish inserting and restore overwritten tail of string
*/
public void finishInserting() {
if (insertionRequestCount==1) {
writer.append(overwrittenString);
overwrittenString = "";
}
insertionRequestCount--;
}
public void abortAnyUnterminatedInsertion() {
if (insertionRequestCount > 0) {
// force insertion to finish in the case a closing pre-verse tag was missing
insertionRequestCount = 1;
finishInserting();
}
}
public int getPosition() {
return writer.length();
}
public void removeAfter(int position) {
writer.delete(position, writer.length());
}
public void reset() {
writer.setLength(0);
}
public void writeToTempStore() {
writeTempStoreRequestCount++;
}
public void finishWritingToTempStore() {
writeTempStoreRequestCount--;
}
public void clearTempStore() {
tempStore.delete(0, tempStore.length());
}
public String getTempStoreString() {
return tempStore.toString();
}
public String getHtml() {
return writer.toString();
}
public void setDontWrite(boolean dontWrite) {
if (dontWrite) {
dontWriteRequestCount++;
} else {
dontWriteRequestCount--;
}
}
}