Wiki

root/cobra/trunk/Source/IndentedWriter.cobra

Revision 2398, 3.2 KB (checked in by Chuck.Esterbrook, 23 months ago)

Deprecate $sharp(...) in favor of sharp'...' and sharp"...".
ticket:207
credit:hopscc

  • Property svn:eol-style set to native
Line 
1# TODO: rename to Writers.cobra
2
3class AutoFlushWriter
4    inherits TextWriter
5    implements IDisposable
6    """
7    Autoflushes on .write(someString) or .write(char) where char == '\n' (or whatever character you set).
8    """
9
10    var _innerWriter as TextWriter
11    var _willAutoFlush = c'\n'
12   
13    cue init(tw as TextWriter)
14        base.init
15        _innerWriter = tw
16
17    pro willAutoFlush from var
18
19    ## Being a TextWriter
20
21    def write(value as char) is override
22        _innerWriter.write(value)
23        if value == c'\n'
24            _innerWriter.flush
25
26    def write(value as String?) is override
27        _innerWriter.write(value)
28        _innerWriter.flush
29
30    get encoding as Encoding? is override
31        return _innerWriter.encoding
32
33    def toString as String is override
34        return '[.getType.name](willAutoFlush=[.willAutoFlush], [_innerWriter])'
35
36    def flush is override
37        _innerWriter.flush
38
39    ## Other
40
41    def dispose is new
42        #sharp'base.Dispose();'
43        #sharp'_innerWriter.Dispose();'
44        _innerWriter.dispose
45   
46class IndentedWriter
47    inherits TextWriter
48    implements IDisposable
49    """
50    Provides for indented writing which can be useful for:
51
52    * debugging output such as a manually implemented trace of your code
53
54    * HTML source code to indent the contents of containing tags such as <body>
55      and <td>
56    """
57
58    test
59        iw = IndentedWriter(StringWriter())
60        assert iw.toString=='', iw.toString
61        nl = iw.newLine
62        tab = '\t'
63        iw.writeLine('one')
64        assert iw.toString=='one[nl]', iw.toString
65        iw.indent
66        iw.writeLine('two')
67        assert iw.toString=='one[nl][tab]two[nl]'
68        iw.dedent
69        iw.writeLine('three')
70        assert iw.toString=='one[nl][tab]two[nl]three[nl]'
71
72    var _innerWriter as TextWriter
73    var _lastChar = ''  # use a string because _innerWriter.NewLine is a string
74    var _indentString = '\t'
75    var _indentLevel = 0
76    var _totalIndentString = ''
77    var _isWritingIndent = false
78
79    cue init(tw as TextWriter)
80        base.init
81        _innerWriter = tw
82
83    def indent
84        _indentLevel += 1
85        _setTotalIndentString()
86
87    def dedent
88        _indentLevel -= 1
89        _setTotalIndentString()
90
91    pro indentString from var
92        """
93        Returns the string used for one level of indentation.
94        Default value is "\t".
95        """
96
97    get newLine2 as String
98        return '\n'  # because NewLine is "\r\n" but we don't require the \r
99
100    def indentAndWrite(s as String)
101        .indent
102        .write(s)
103
104    def writeAndIndent(s as String)
105        .write(s)
106        .indent
107
108    def dedentAndWrite(s as String)
109        .dedent
110        .write(s)
111
112    # *** Being a TextWriter ***
113
114    def write(value as char) is override
115        if _isWritingIndent
116            _innerWriter.write(value)
117            return
118        if _lastChar==_innerWriter.newLine or _lastChar==.newLine2
119            _isWritingIndent = true
120            try
121                .write(_totalIndentString)
122            finally
123                _isWritingIndent = false
124        _innerWriter.write(value)
125        _lastChar = value.toString
126
127    def write(value as String?)
128        if _isWritingIndent
129            _innerWriter.write(value)
130        else
131            base.write(value)
132
133    get encoding as Encoding? is override
134        return _innerWriter.encoding
135
136    def toString as String is override
137        return _innerWriter.toString
138
139    def flush is override
140        _innerWriter.flush
141
142    ## Other
143
144    def dispose is new
145        #sharp'base.Dispose();'
146        #sharp'_innerWriter.Dispose();'
147        _innerWriter.dispose
148       
149    # *** Private Util ***
150
151    def _setTotalIndentString
152        is protected
153        sb = StringBuilder()
154        for i in _indentLevel
155            sb.append(_indentString)
156        _totalIndentString = sb.toString
Note: See TracBrowser for help on using the browser.