public class AutoIndentWriter extends Object implements 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<String> |
indents
Stack of indents.
|
int |
lineWidth |
String |
newline
\n or \r\n ? |
Writer |
out |
Constructor and Description |
---|
AutoIndentWriter(Writer out) |
AutoIndentWriter(Writer out,
String newline) |
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 indent) |
void |
setLineWidth(int lineWidth) |
int |
write(String str)
Write out a string literal or attribute expression or expression element.
|
int |
write(String str,
String wrap)
Write out a string literal or attribute expression or expression element.
|
int |
writeSeparator(String str)
Write a separator.
|
int |
writeWrap(String wrap)
Because we evaluate ST instance by invoking
Interpreter.exec(STWriter, InstanceScope) again, we can't pass options in. |
public int[] anchors
Integer
creation overhead.public int anchors_sp
public String newline
\n
or \r\n
?public Writer out
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(Writer out)
public void setLineWidth(int lineWidth)
setLineWidth
in interface STWriter
public void pushIndentation(String indent)
pushIndentation
in interface STWriter
public String popIndentation()
popIndentation
in interface STWriter
public void pushAnchorPoint()
pushAnchorPoint
in interface STWriter
public void popAnchorPoint()
popAnchorPoint
in interface STWriter
public int index()
STWriter
public int write(String str) throws IOException
write
in interface STWriter
IOException
public int writeSeparator(String str) 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(String str, 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(String wrap) 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
Copyright © 2024. All rights reserved.