1 ! Copyright (C) 2005, 2006 Daniel Ehrenberg
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: hashtables kernel math namespaces sequences strings
\r
4 assocs combinators io io.streams.string accessors
\r
5 xml.data wrap xml.entities unicode.categories fry ;
\r
9 SYMBOL: sensitive-tags
\r
12 " " indenter set-global
\r
14 : sensitive? ( tag -- ? )
\r
15 sensitive-tags get swap '[ _ names-match? ] contains? ;
\r
17 : indent-string ( -- string )
\r
19 [ indentation get indenter get <repetition> concat ]
\r
23 xml-pprint? get [ nl indent-string write ] when ;
\r
26 xml-pprint? get [ 1 indentation +@ ] when ;
\r
29 xml-pprint? get [ -1 indentation +@ ] when ;
\r
31 : trim-whitespace ( string -- no-whitespace )
\r
34 : ?filter-children ( children -- no-whitespace )
\r
36 [ dup string? [ trim-whitespace ] when ] map
\r
37 [ [ empty? ] [ string? ] bi and not ] filter
\r
40 : name>string ( name -- string )
\r
41 [ main>> ] [ space>> ] bi [ ":" rot 3append ] unless-empty ;
\r
43 : print-name ( name -- )
\r
46 : print-attrs ( assoc -- )
\r
51 escape-quoted-string write
\r
55 GENERIC: write-xml-chunk ( object -- )
\r
57 M: string write-xml-chunk
\r
58 escape-string dup empty? not xml-pprint? get and
\r
59 [ nl 80 indent-string indented-break ] when write ;
\r
61 : write-tag ( tag -- )
\r
62 ?indent CHAR: < write1
\r
63 dup print-name attrs>> print-attrs ;
\r
65 : write-start-tag ( tag -- )
\r
66 write-tag ">" write ;
\r
68 M: contained-tag write-xml-chunk
\r
69 write-tag "/>" write ;
\r
71 : write-children ( tag -- )
\r
72 indent children>> ?filter-children
\r
73 [ write-xml-chunk ] each unindent ;
\r
75 : write-end-tag ( tag -- )
\r
76 ?indent "</" write print-name CHAR: > write1 ;
\r
78 M: open-tag write-xml-chunk
\r
81 [ sensitive? not xml-pprint? get and xml-pprint? set ]
\r
86 ] dip xml-pprint? set ;
\r
88 M: comment write-xml-chunk
\r
89 "<!--" write text>> write "-->" write ;
\r
91 M: element-decl write-xml-chunk
\r
93 [ name>> write " " write ]
\r
94 [ content-spec>> write ">" write ]
\r
97 M: attlist-decl write-xml-chunk
\r
99 [ name>> write " " write ]
\r
100 [ att-defs>> write ">" write ]
\r
103 M: entity-decl write-xml-chunk
\r
105 [ name>> write " " write ]
\r
106 [ def>> write-xml-chunk ">" write ]
\r
109 M: system-id write-xml-chunk
\r
110 "SYSTEM '" write system-literal>> write "'" write ;
\r
112 M: public-id write-xml-chunk
\r
114 [ pubid-literal>> write "' '" write ]
\r
115 [ system-literal>> write "'>" write ] bi ;
\r
117 M: doctype-decl write-xml-chunk
\r
119 [ name>> write " " write ]
\r
120 [ external-id>> [ write-xml-chunk " " write ] when* ]
\r
123 [ "[" write [ write-xml-chunk ] each "]" write ] when* ">" write
\r
126 M: directive write-xml-chunk
\r
127 "<!" write text>> write CHAR: > write1 ;
\r
129 M: instruction write-xml-chunk
\r
130 "<?" write text>> write "?>" write ;
\r
132 M: sequence write-xml-chunk
\r
133 [ write-xml-chunk ] each ;
\r
135 : write-prolog ( xml -- )
\r
136 "<?xml version=\"" write dup version>> write
\r
137 "\" encoding=\"" write dup encoding>> write
\r
138 standalone>> [ "\" standalone=\"yes" write ] when
\r
141 : write-xml ( xml -- )
\r
143 [ prolog>> write-prolog ]
\r
144 [ before>> write-xml-chunk ]
\r
145 [ body>> write-xml-chunk ]
\r
146 [ after>> write-xml-chunk ]
\r
149 M: xml write-xml-chunk
\r
150 body>> write-xml-chunk ;
\r
152 : print-xml ( xml -- )
\r
155 : xml>string ( xml -- string )
\r
156 [ write-xml ] with-string-writer ;
\r
158 : with-xml-pprint ( sensitive-tags quot -- )
\r
160 swap [ assure-name ] map sensitive-tags set
\r
164 ] with-scope ; inline
\r
166 : pprint-xml-but ( xml sensitive-tags -- )
\r
167 [ print-xml ] with-xml-pprint ;
\r
169 : pprint-xml ( xml -- )
\r
172 : pprint-xml>string-but ( xml sensitive-tags -- string )
\r
173 [ xml>string ] with-xml-pprint ;
\r
175 : pprint-xml>string ( xml -- string )
\r
176 f pprint-xml>string-but ;
\r