CreateOutput:
PROC [to: TiogaFileOps.Ref, breakAtNewline:
BOOL ¬
FALSE, levelPrefix, defaultFormat:
ROPE ¬
NIL, flexilevel:
BOOL ¬
FALSE, spacesPerTab, normalNestIndent, minFmtIndent:
INT ¬ 0, maxFmtIndent:
INT ¬ -1, commentHandling: CommentHandling ¬ [
FALSE[]] ]
RETURNS [out:
IO.
STREAM];
Creates children of to.
IF breakAtNewline, THEN s.PutChar['\n] gets translated to s.EndNode[reset, FALSE].
IF (NOT flexilevel) AND levelPrefix # NIL, THEN every node that begins with N repetitions of levelPrefix will be indented N levels deeper than it otherwise would be.
IF flexilevel, THEN the depth of each node is 1 more than the depth of the most recent node with less leading whitespace. Spaces are white; tabs are white iff spacesPerTab>0; nothing else is white.
Each child node will have format=defaultFormat, unless explicitly overridden by SetFormat.
IF flexilevel AND normalNestIndent>0 AND maxFmtIndent<minFmtIndent, THEN each node whose amout of leading white space exceeds its parent's by an amout different than normalNestIndent gets a Postfix property adjusting its appearance to match the amount of leading white space.
IF flexilevel AND maxFmtIndent >= minFmtIndent, THEN each node whose amount of leading white space exceeds it parent's by N is created with format defaultFormat-N if N IN [minFmtIndent..maxFmtIndent], otherwise with format defaultFormat-M and a postfix property (M IN {minFmtIndent, maxFmtIndent}); normalNestIndent is indentation of children relative to parent.
When commentHandling.see, nodes with the given prefix and suffix become comment nodes without the prefix or suffix.
EndNode:
PROC [s:
IO.
STREAM, depthOp: DepthOp ¬ reset, idempotently:
BOOLEAN ¬
FALSE];
depthOp says whether new node should have same depth as previous, or revert to initial (direct child of CreateOutput's to). May be further modified by ChangeDepth or receiving levelPrefixes.
ChangeDepth:
PROC [s:
IO.
STREAM, deltaDepth:
INTEGER ¬ 0, autoEndNode:
BOOL ¬
TRUE, idempotently:
BOOL ¬
FALSE];
IF autoEndNode, THEN first EndNode[same, idempotently].
Must be called "between" nodes (autoEndNode trivializes that).
Changes depth of following node from what it would otherwise be.
Can't be called on flexilevel streams.
BadDepth:
ERROR [s:
IO.
STREAM, depth:
INT];
Raised when depth (relative to CreateOutput's to) goes negative --- usually from IO operations (like PutChar) that put the first character on a node.
When depth jumps deeper than Tioga will (i.e., more than one level per jump), the difference is made up by prefixing with copies of levelPrefix.