public class AutoIndentWriter extends Objectimplements STWriter
The indent stack is a stack of strings so we can repeat original indent not just the same number of columns (don't have to worry about tabs vs spaces then). Anchors are char positions (tabs won't work) that indicate where all future wraps should justify to. The wrap position is actually the larger of either the last anchor or the indentation level.
This is a filter on a Writer.
\n is the proper way to say newline for options and templates. Templates can mix \r\n and \n them, but use \n in options like wrap="\n". This writer will render newline characters according to newline. The default value is taken from the line.separator system property, and can be overridden by passing in a String to the appropriate constructor.
| Modifier and Type | Field and Description |
|---|---|
int[] |
anchors
Stack of integer anchors (char positions in line); avoid
Integer creation overhead.
|
int |
anchors_sp
|
boolean |
atStartOfLine
|
int |
charIndex
The absolute char index into the output of the next char to be written.
|
int |
charPosition
Track char position in the line (later we can think about tabs).
|
List |
indents
Stack of indents.
|
int |
lineWidth
|
String |
newline
\n or
\r\n?
|
Writer |
out
|
| Constructor and Description |
|---|
AutoIndentWriter(Writer
|
AutoIndentWriter(Writer
|
| Modifier and Type | Method and Description |
|---|---|
int |
indent()
|
int |
index()
Return the absolute char index into the output of the char we're about to write.
|
void |
popAnchorPoint()
|
String |
popIndentation()
|
void |
pushAnchorPoint()
|
void |
pushIndentation(String
|
void |
setLineWidth(int lineWidth)
|
int |
write(String
Write out a string literal or attribute expression or expression element.
|
int |
write(String
Write out a string literal or attribute expression or expression element.
|
int |
writeSeparator(String
Write a separator.
|
int |
writeWrap(String
Because we evaluate ST instance by invoking
Interpreter again, we can't pass options in.
|
public int[] anchors
Integer creation overhead.
public int anchors_sp
public Stringnewline
\n or
\r\n?
public Writerout
public boolean atStartOfLine
public int charPosition
charPosition <=
lineWidth. This is the position we are
about to write, not the position last written to.
public int charIndex
public int lineWidth
public AutoIndentWriter(Writerout)
public void setLineWidth(int lineWidth)
public void pushIndentation(Stringindent)
public StringpopIndentation()
public void pushAnchorPoint()
public void popAnchorPoint()
public int index()
STWriter
public int write(Stringstr) throws IOException
write in interface
STWriter
IOException
public int writeSeparator(Stringstr) throws IOException
STWriter
STWriter.write(String) except that a
"\n" cannot be inserted before emitting a separator.
writeSeparator in interface
STWriter
IOException
public int write(Stringstr, String wrap) throws IOException
If doing line wrap, then check wrap before emitting str. If at or beyond desired line width then emit a newline and any indentation before spitting out str.
write in interface
STWriter
IOException
public int writeWrap(Stringwrap) throws IOException
STWriter
Interpreter.exec(STWriter, InstanceScope) again, we can't pass options in. So the
Bytecode.INSTR_WRITE instruction of an applied template (such as when we wrap in between template applications like
<data:{v|[<v>]}; wrap>) we need to write the
wrap string before calling
Interpreter.exec(org.stringtemplate.v4.STWriter, org.stringtemplate.v4.InstanceScope) . We expose just like for the separator. See
Interpreter.writeObject(org.stringtemplate.v4.STWriter, org.stringtemplate.v4.InstanceScope, java.lang.Object, java.lang.String[]) where it checks for ST instance. If POJO,
Interpreter.writePOJO(org.stringtemplate.v4.STWriter, org.stringtemplate.v4.InstanceScope, java.lang.Object, java.lang.String[]) passes
wrap to
STWriter.write(String str, String wrap) . Can't pass to
Interpreter.exec(org.stringtemplate.v4.STWriter, org.stringtemplate.v4.InstanceScope) .
writeWrap in interface
STWriter
IOException
public int indent()
throws IOException
IOException