Class AutoIndentWriter
- All Implemented Interfaces:
STWriter
- Direct Known Subclasses:
NoIndentWriter
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.
-
Field Summary
FieldsModifier and TypeFieldDescriptionint[]
Stack of integer anchors (char positions in line); avoidInteger
creation overhead.int
boolean
int
The absolute char index into the output of the next char to be written.int
Track char position in the line (later we can think about tabs).Stack of indents.int
\n
or\r\n
? -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionint
indent()
int
index()
Return the absolute char index into the output of the char we're about to write.void
void
void
pushIndentation
(String indent) void
setLineWidth
(int lineWidth) int
Write out a string literal or attribute expression or expression element.int
Write out a string literal or attribute expression or expression element.int
writeSeparator
(String str) Write a separator.int
Because we evaluate ST instance by invokingInterpreter.exec(STWriter, InstanceScope)
again, we can't pass options in.
-
Field Details
-
indents
-
anchors
public int[] anchorsStack of integer anchors (char positions in line); avoidInteger
creation overhead. -
anchors_sp
public int anchors_sp -
newline
\n
or\r\n
? -
out
-
atStartOfLine
public boolean atStartOfLine -
charPosition
public int charPositionTrack char position in the line (later we can think about tabs). Indexed from 0. We want to keepcharPosition <=
lineWidth
. This is the position we are about to write, not the position last written to. -
charIndex
public int charIndexThe absolute char index into the output of the next char to be written. -
lineWidth
public int lineWidth
-
-
Constructor Details
-
AutoIndentWriter
-
AutoIndentWriter
-
-
Method Details
-
setLineWidth
public void setLineWidth(int lineWidth) - Specified by:
setLineWidth
in interfaceSTWriter
-
pushIndentation
- Specified by:
pushIndentation
in interfaceSTWriter
-
popIndentation
- Specified by:
popIndentation
in interfaceSTWriter
-
pushAnchorPoint
public void pushAnchorPoint()- Specified by:
pushAnchorPoint
in interfaceSTWriter
-
popAnchorPoint
public void popAnchorPoint()- Specified by:
popAnchorPoint
in interfaceSTWriter
-
index
public int index()Description copied from interface:STWriter
Return the absolute char index into the output of the char we're about to write. Returns 0 if no char written yet. -
write
Write out a string literal or attribute expression or expression element.- Specified by:
write
in interfaceSTWriter
- Throws:
IOException
-
writeSeparator
Description copied from interface:STWriter
Write a separator. Same asSTWriter.write(String)
except that a"\n"
cannot be inserted before emitting a separator.- Specified by:
writeSeparator
in interfaceSTWriter
- Throws:
IOException
-
write
Write out a string literal or attribute expression or expression element.If doing line wrap, then check
wrap
before emittingstr
. If at or beyond desired line width then emit anewline
and any indentation before spitting outstr
.- Specified by:
write
in interfaceSTWriter
- Throws:
IOException
-
writeWrap
Description copied from interface:STWriter
Because we evaluate ST instance by invokingInterpreter.exec(STWriter, InstanceScope)
again, we can't pass options in. So theBytecode.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 thewrap
string before callingInterpreter.exec(org.stringtemplate.v4.STWriter, org.stringtemplate.v4.InstanceScope)
. We expose just like for the separator. SeeInterpreter.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[])
passeswrap
toSTWriter.write(String str, String wrap)
. Can't pass toInterpreter.exec(org.stringtemplate.v4.STWriter, org.stringtemplate.v4.InstanceScope)
.- Specified by:
writeWrap
in interfaceSTWriter
- Throws:
IOException
-
indent
- Throws:
IOException
-