1 ! Copyright (C) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel namespaces io math.parser assocs classes
4 classes.tuple words arrays sequences sequences.lib splitting
5 mirrors hashtables combinators continuations math strings
6 fry locals calendar calendar.format xml.entities validators
7 html.elements html.streams xmode.code2html farkup inspector
8 lcs.diff2html urls present ;
13 : value ( name -- value ) values get at ;
15 : set-value ( value name -- ) values get set-at ;
17 : blank-values ( -- ) H{ } clone values set ;
19 : prepare-value ( name object -- value name object )
20 [ [ value ] keep ] dip ; inline
22 : from-object ( object -- )
23 dup assoc? [ <mirror> ] unless
24 values get swap update ;
26 : deposit-values ( destination names -- )
27 [ dup value ] H{ } map>assoc update ;
29 : deposit-slots ( destination names -- )
30 [ <mirror> ] dip deposit-values ;
32 : with-each-value ( name quot -- )
35 values [ clone ] change
42 : with-each-object ( name quot -- )
54 : with-values ( name quot -- )
57 [ nested-values [ swap prefix ] change ]
58 [ value blank-values from-object ]
63 : nest-values ( name quot -- )
66 H{ } clone [ values set call ] keep
68 ] dip set-value ; inline
70 GENERIC: render* ( value name render -- )
72 : render ( name renderer -- )
73 over named-validation-messages get at [
74 [ value>> ] [ message>> ] bi
83 : render-input ( value name type -- )
84 <input =type =name present =value input/> ;
90 M: label render* 2drop present escape-string write ;
94 M: hidden render* drop "hidden" render-input ;
96 : render-field ( value name size type -- )
99 [ present =size ] when*
106 : <field> ( -- field )
109 M: field render* size>> "text" render-field ;
111 TUPLE: password size ;
113 : <password> ( -- password )
117 #! Don't send passwords back to the user
118 [ drop "" ] 2dip size>> "password" render-field ;
121 TUPLE: textarea rows cols ;
123 : <textarea> ( -- renderer )
128 [ rows>> [ present =rows ] when* ]
129 [ cols>> [ present =cols ] when* ] bi
132 present escape-string write
136 TUPLE: choice size multiple choices ;
138 : <choice> ( -- choice )
141 : render-option ( text selected? -- )
142 <option [ "true" =selected ] when option>
143 present escape-string write
146 : render-options ( options selected -- )
147 '[ dup , member? render-option ] each ;
152 dup size>> [ present =size ] when*
153 dup multiple>> [ "true" =multiple ] when
155 [ choices>> value ] [ multiple>> ] bi
156 [ swap ] [ swap 1array ] if
161 TUPLE: checkbox label ;
163 : <checkbox> ( -- checkbox )
170 swap [ "true" =checked ] when
172 label>> escape-string write
176 GENERIC: link-title ( obj -- string )
177 GENERIC: link-href ( obj -- url )
179 M: string link-title ;
180 M: string link-href ;
189 <a dup link-href =href a>
190 link-title present escape-string write
193 ! XMode code component
200 [ string-lines ] [ drop ] [ mode>> value ] tri* htmlize-lines ;
206 2drop string-lines "\n" join convert-farkup write ;
208 ! Inspector component
212 2drop [ describe ] with-html-stream ;
215 SINGLETON: comparison
217 M: comparison render*
223 M: html render* 2drop write ;