class IndentedWriter inherits TextWriter """ Provides for indented writing which can be useful for: * debugging output such as a manually implemented trace of your code * HTML source code to indent the contents of containing tags such as and """ test iw = IndentedWriter(StringWriter()) assert iw.toString == '' nl = iw.newLine tab = '\t' iw.writeLine('one') assert iw.toString == 'one[nl]' iw.indent iw.writeLine('two') assert iw.toString == 'one[nl][tab]two[nl]' iw.outdent iw.writeLine('three') assert iw.toString == 'one[nl][tab]two[nl]three[nl]' var _innerWriter as TextWriter var _lastChar = '' # use a string because _innerWriter.NewLine is a string var _indentString = '\t' var _indentLevel = 0 var _totalIndentString = '' var _isWritingIndent = false cue init(tw as TextWriter) base.init _innerWriter = tw def indent _indentLevel += 1 _setTotalIndentString() def outdent _indentLevel -= 1 _setTotalIndentString() pro indentString from var """ Returns the string used for one level of indentation. Default value is "\t". """ get newLine2 as String return '\n' # because NewLine is "\r\n" but we don't require the \r # *** Being a TextWriter *** def write(value as char) is override if _isWritingIndent _innerWriter.write(value) return if _lastChar == _innerWriter.newLine or _lastChar == .newLine2 _isWritingIndent = true try .write(_totalIndentString) finally _isWritingIndent = false _innerWriter.write(value) _lastChar = value.toString def write(value as String?) is override if _isWritingIndent _innerWriter.write(value) else base.write(value) get encoding as Encoding? is override return _innerWriter.encoding def toString as String is override return _innerWriter.toString def flush is override _innerWriter.flush # *** Private Util *** def _setTotalIndentString is protected sb = StringBuilder() for i in _indentLevel, sb.append(_indentString) _totalIndentString = sb.toString