]> gitweb.factorcode.org Git - factor.git/blob - extra/pdf/streams/streams.factor
9c9d5869cacf60853c94ab908613a5d85fee95ee
[factor.git] / extra / pdf / streams / streams.factor
1 ! Copyright (C) 2011-2012 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
3
4 USING: accessors arrays assocs destructors fry io io.styles
5 kernel pdf.layout sequences splitting strings ;
6
7 IN: pdf.streams
8
9 <PRIVATE
10
11 ! FIXME: what about "proper" tab support?
12
13 : string>texts ( string style -- seq )
14     [ string-lines ] dip '[ _ <text> 1array ] map
15     <br> 1array join ;
16
17 PRIVATE>
18
19
20 TUPLE: pdf-writer data ;
21
22 : new-pdf-writer ( class -- pdf-writer )
23     new V{ } clone >>data ;
24
25 : <pdf-writer> ( -- pdf-writer )
26     pdf-writer new-pdf-writer ;
27
28 : with-pdf-writer ( quot -- pdf )
29     <pdf-writer> [ swap with-output-stream* ] keep data>> ; inline
30
31 TUPLE: pdf-sub-stream < pdf-writer parent ;
32
33 : new-pdf-sub-stream ( style stream class -- stream )
34     new-pdf-writer
35         swap >>parent
36     swap <style-stream> ;
37
38 TUPLE: pdf-block-stream < pdf-sub-stream ;
39
40 M: pdf-block-stream dispose
41     [ data>> ] [ parent>> ] bi
42     [ data>> push-all ] [ stream-nl ] bi ;
43
44
45 ! Stream protocol
46
47 M: pdf-writer stream-flush drop ;
48
49 M: pdf-writer stream-write1
50     [ 1string f <text> ] [ data>> ] bi* push ;
51
52 M: pdf-writer stream-write
53     [ f string>texts ] [ data>> ] bi* push-all ;
54
55 M: pdf-writer stream-format
56     [ string>texts ] [ data>> ] bi* push-all ;
57
58 M: pdf-writer stream-nl
59     <br> swap data>> push ; ! FIXME: <br> needs style?
60
61 M: pdf-writer make-span-stream
62     swap <style-stream> <ignore-close-stream> ;
63
64 M: pdf-writer make-block-stream
65     pdf-block-stream new-pdf-sub-stream ;
66
67 M: pdf-writer make-cell-stream
68     pdf-sub-stream new-pdf-sub-stream ;
69
70 ! FIXME: real table cells
71 M: pdf-writer stream-write-table ! FIXME: needs style?
72     nip swap [
73         [ stream>> data>> <table-cell> ] map <table-row>
74     ] map <table> swap data>> push ;
75
76 M: pdf-writer dispose drop ;