1 ! Copyright (C) 2008, 2010 Slava Pestov, Daniel Ehrenberg
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays combinators farkup html html.forms
4 html.streams inspector io kernel lcs.diff2html namespaces
5 present sequences splitting strings urls xml.data xml.syntax
6 xml.writer xmode.code2html ;
9 GENERIC: render* ( value name renderer -- xml )
11 : render>xml ( name renderer -- xml )
14 dup validation-error-state?
15 [ [ message>> render-error ] [ value>> ] bi ]
22 : render ( name renderer -- )
23 render>xml write-xml ;
27 GENERIC: write-nested ( obj -- )
29 M: string write-nested write ;
31 M: sequence write-nested [ write-nested ] each ;
35 : render-string ( name renderer -- )
36 render>xml write-nested ;
46 drop [XML <input value=<-> name=<-> type="hidden"/> XML] ;
48 : render-field ( value name size type -- xml )
49 [XML <input value=<-> name=<-> size=<-> type=<->/> XML] ;
53 : <field> ( -- field )
57 size>> "text" render-field ;
59 TUPLE: password size ;
61 : <password> ( -- password )
65 ! Don't send passwords back to the user
66 [ drop "" ] 2dip size>> "password" render-field ;
69 TUPLE: textarea rows cols ;
71 : <textarea> ( -- renderer )
74 M:: textarea render* ( value name area -- xml )
81 cols=<-cols->><-value-></textarea>
85 TUPLE: choice size multiple choices ;
87 : <choice> ( -- choice )
90 : render-option ( text selected? -- xml )
92 [XML <option selected=<->><-></option> XML] ;
94 : render-options ( value choice -- xml )
95 [ choices>> value ] [ multiple>> ] bi
96 [ swap ] [ swap 1array ] if
97 '[ dup _ member? render-option ] map ;
99 M:: choice render* ( value name choice -- xml )
100 choice size>> :> size
101 choice multiple>> "true" and :> multiple
102 value choice render-options :> contents
106 multiple=<-multiple->><-contents-></select> XML] ;
109 TUPLE: checkbox label ;
111 : <checkbox> ( -- checkbox )
115 [ "true" and ] [ ] [ label>> ] tri*
118 checked=<-> name=<->><-></input> XML] ;
121 GENERIC: link-title ( obj -- string )
122 GENERIC: link-href ( obj -- url )
124 M: string link-title ;
125 M: string link-href ;
130 TUPLE: simple-link title href ;
132 C: <simple-link> simple-link
134 M: simple-link link-title title>> ;
135 M: simple-link link-href href>> ;
141 [ target>> ] [ [ link-href ] [ link-title ] bi ] bi*
142 [XML <a target=<-> href=<->><-></a> XML] ;
144 ! XMode code component
150 : ?split-lines ( str/f -- seq )
151 [ { } ] [ split-lines ] if-empty ;
154 [ ?split-lines ] [ drop ] [ mode>> value ] tri* htmlize-lines ;
157 TUPLE: farkup no-follow disable-images parsed ;
159 : <farkup> ( -- farkup )
162 : string>boolean ( string -- boolean )
172 [ no-follow>> [ string>boolean link-no-follow? set ] when* ]
173 [ disable-images>> [ string>boolean disable-images? set ] when* ]
174 [ parsed>> string>boolean [ (write-farkup) ] [ farkup>xml ] if ]
178 ! Inspector component
182 2drop [ describe ] with-html-writer ;
185 SINGLETON: comparison
187 M: comparison render*
193 M: html render* 2drop dup string? [ <unescaped> ] when ;
198 M: xml render* 2drop ;