# TODO: rename to Writers.cobra class AutoFlushWriter inherits TextWriter implements IDisposable """ Autoflushes on .write(someString) or .write(char) where char == '\n' (or whatever character you set). """ var _innerWriter as TextWriter var _willAutoFlush = c'\n' cue init(tw as TextWriter) base.init _innerWriter = tw pro willAutoFlush from var ## Being a TextWriter def write(value as char) is override _innerWriter.write(value) if value == c'\n' _innerWriter.flush def write(value as String?) is override _innerWriter.write(value) _innerWriter.flush get encoding as Encoding? is override return _innerWriter.encoding def toString as String is override return '[.getType.name](willAutoFlush=[.willAutoFlush], [_innerWriter])' def flush is override _innerWriter.flush ## Other def dispose is new #sharp'base.Dispose();' #sharp'_innerWriter.Dispose();' _innerWriter.dispose class IndentedWriter inherits TextWriter implements IDisposable """ 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=='', iw.toString nl = iw.newLine tab = '\t' iw.writeLine('one') assert iw.toString=='one[nl]', iw.toString iw.indent iw.writeLine('two') assert iw.toString=='one[nl][tab]two[nl]' iw.dedent 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 dedent _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 def indentAndWrite(s as String) .indent .write(s) def writeAndIndent(s as String) .write(s) .indent def dedentAndWrite(s as String) .dedent .write(s) # *** 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?) 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 ## Other def dispose is new #sharp'base.Dispose();' #sharp'_innerWriter.Dispose();' _innerWriter.dispose # *** Private Util *** def _setTotalIndentString is protected sb = StringBuilder() for i in _indentLevel sb.append(_indentString) _totalIndentString = sb.toString