1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs colors delegate delegate.protocols
4 destructors hashtables io io.streams.plain io.streams.string
5 kernel make namespaces present sequences sets splitting strings
6 strings.tables summary ;
9 GENERIC: stream-format ( str style stream -- )
10 GENERIC: make-span-stream ( style stream -- stream' )
11 GENERIC: make-block-stream ( style stream -- stream' )
12 GENERIC: make-cell-stream ( style stream -- stream' )
13 GENERIC: stream-write-table ( table-cells style stream -- )
15 PROTOCOL: formatted-output-stream-protocol
16 stream-format make-span-stream make-block-stream
17 make-cell-stream stream-write-table ;
19 : format ( str style -- ) output-stream get stream-format ;
21 : tabular-output ( style quot -- )
22 swap [ { } make ] dip output-stream get stream-write-table ; inline
24 : with-row ( quot -- )
27 : with-cell ( quot -- )
28 H{ } output-stream get make-cell-stream
29 [ swap with-output-stream ] keep , ; inline
31 : write-cell ( str -- )
32 [ write ] with-cell ; inline
34 : with-style ( style quot -- )
35 swap dup assoc-empty? [
38 output-stream get make-span-stream swap with-output-stream
41 : with-nesting ( style quot -- )
42 [ output-stream get make-block-stream ] dip
43 with-output-stream ; inline
45 TUPLE: filter-writer stream ;
47 CONSULT: output-stream-protocol filter-writer stream>> ;
49 CONSULT: formatted-output-stream-protocol filter-writer stream>> ;
51 M: filter-writer stream-element-type stream>> stream-element-type ;
53 M: filter-writer dispose stream>> dispose ;
55 TUPLE: ignore-close-stream < filter-writer ;
57 M: ignore-close-stream dispose drop ;
59 C: <ignore-close-stream> ignore-close-stream
61 TUPLE: style-stream < filter-writer style ;
62 INSTANCE: style-stream output-stream
66 : nested-style ( style style-stream -- style stream )
67 [ style>> swap assoc-union ] [ stream>> ] bi ; inline
71 C: <style-stream> style-stream
73 M: style-stream stream-format
74 nested-style stream-format ;
76 M: style-stream stream-write
77 [ style>> ] [ stream>> ] bi stream-format ;
79 M: style-stream stream-write1
80 [ 1string ] dip stream-write ;
82 M: style-stream make-span-stream
83 nested-style make-span-stream ;
85 M: style-stream make-block-stream
86 nested-style make-block-stream ;
88 M: style-stream make-cell-stream
89 nested-style make-cell-stream ;
91 M: style-stream stream-write-table
92 nested-style stream-write-table ;
94 M: plain-writer stream-format
97 M: plain-writer make-span-stream
98 swap <style-stream> <ignore-close-stream> ;
100 M: plain-writer make-block-stream
101 nip <ignore-close-stream> ;
103 M: plain-writer stream-write-table
106 [ [ >string ] map ] map format-table
107 [ nl ] [ write ] interleave
108 ] with-output-stream* ;
110 M: plain-writer make-cell-stream 2drop <string-writer> ;
147 CONSTANT: standard-table-style
149 { table-gap { 5 5 } }
150 { table-border T{ rgba f 0.8 0.8 0.8 1.0 } }
154 TUPLE: input string ;
158 M: input present string>> ;
164 [ % ] [ "..." "" ? % ] bi*
167 : write-object ( str obj -- ) presented associate format ;
169 : write-image ( image -- ) [ "" ] dip image-style associate format ;