# 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
|