1 ! Copyright (C) 2011-2012 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
4 USING: accessors arrays assocs destructors fry io io.styles
5 kernel pdf.layout sequences splitting strings ;
11 ! FIXME: what about "proper" tab support?
13 : string>texts ( string style -- seq )
14 [ string-lines ] dip '[ _ <text> 1array ] map
20 TUPLE: pdf-writer style data ;
22 : new-pdf-writer ( class -- pdf-writer )
23 new H{ } >>style V{ } clone >>data ;
25 : <pdf-writer> ( -- pdf-writer )
26 pdf-writer new-pdf-writer ;
28 : with-pdf-writer ( quot -- pdf )
29 <pdf-writer> [ swap with-output-stream* ] keep data>> ; inline
31 TUPLE: pdf-sub-stream < pdf-writer parent ;
33 : new-pdf-sub-stream ( style stream class -- stream )
37 dup parent>> style>> '[ _ swap assoc-union ] change-style ;
39 TUPLE: pdf-block-stream < pdf-sub-stream ;
41 M: pdf-block-stream dispose
42 [ data>> ] [ parent>> ] bi
43 [ data>> push-all ] [ stream-nl ] bi ;
45 TUPLE: pdf-span-stream < pdf-sub-stream ;
47 M: pdf-span-stream dispose
48 [ data>> ] [ parent>> data>> ] bi push-all ;
54 M: pdf-writer stream-flush drop ;
56 M: pdf-writer stream-write1
57 dup style>> '[ 1string _ <text> ] [ data>> ] bi* push ;
59 M: pdf-writer stream-write
60 dup style>> '[ _ string>texts ] [ data>> ] bi* push-all ;
62 M: pdf-writer stream-format
63 swap [ dup style>> ] dip assoc-union
64 '[ _ string>texts ] [ data>> ] bi* push-all ;
66 M: pdf-writer stream-nl
67 <br> swap data>> push ; ! FIXME: <br> needs style?
69 M: pdf-writer make-span-stream
70 pdf-span-stream new-pdf-sub-stream ;
72 M: pdf-writer make-block-stream
73 pdf-block-stream new-pdf-sub-stream ;
75 M: pdf-writer make-cell-stream
76 pdf-sub-stream new-pdf-sub-stream ;
78 ! FIXME: real table cells
79 M: pdf-writer stream-write-table ! FIXME: needs style?
81 [ data>> <table-cell> ] map <table-row>
82 ] map <table> swap data>> push ;
84 M: pdf-writer dispose drop ;