factor/basis/html/components/components.factor

179 lines
3.9 KiB
Factor
Raw Normal View History

2009-01-30 12:29:30 -05:00
! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel namespaces io math.parser assocs classes
classes.tuple words arrays sequences splitting mirrors
hashtables combinators continuations math strings inspector
fry locals calendar calendar.format xml.entities xml.data
2009-02-05 22:17:03 -05:00
validators urls present xml.writer xml.syntax xml
xmode.code2html lcs.diff2html farkup io.streams.string
2009-01-30 20:28:16 -05:00
html html.streams html.forms ;
IN: html.components
GENERIC: render* ( value name renderer -- xml )
: render>xml ( name renderer -- xml )
prepare-value
[
dup validation-error?
2009-01-31 22:56:39 -05:00
[ [ message>> render-error ] [ value>> ] bi ]
[ f swap ]
if
] 2dip
2009-01-31 22:56:39 -05:00
render*
swap 2array ;
: render ( name renderer -- )
render>xml write-xml ;
SINGLETON: label
M: label render*
2drop present ;
SINGLETON: hidden
M: hidden render*
drop [XML <input value=<-> name=<-> type="hidden"/> XML] ;
: render-field ( value name size type -- xml )
[XML <input value=<-> name=<-> size=<-> type=<->/> XML] ;
TUPLE: field size ;
: <field> ( -- field )
field new ;
M: field render*
size>> "text" render-field ;
TUPLE: password size ;
: <password> ( -- password )
password new ;
M: password render*
#! Don't send passwords back to the user
[ drop "" ] 2dip size>> "password" render-field ;
! Text areas
2008-05-23 20:16:21 -04:00
TUPLE: textarea rows cols ;
: <textarea> ( -- renderer )
textarea new ;
M:: textarea render* ( value name area -- xml )
area rows>> :> rows
area cols>> :> cols
[XML
<textarea
name=<-name->
rows=<-rows->
cols=<-cols->><-value-></textarea>
XML] ;
! Choice
2008-05-23 20:16:21 -04:00
TUPLE: choice size multiple choices ;
: <choice> ( -- choice )
choice new ;
: render-option ( text selected? -- xml )
"selected" and swap
[XML <option selected=<->><-></option> XML] ;
: render-options ( value choice -- xml )
[ choices>> value ] [ multiple>> ] bi
[ swap ] [ swap 1array ] if
'[ dup _ member? render-option ] map ;
M:: choice render* ( value name choice -- xml )
choice size>> :> size
choice multiple>> "true" and :> multiple
value choice render-options :> contents
[XML <select
name=<-name->
size=<-size->
multiple=<-multiple->><-contents-></select> XML] ;
! Checkboxes
TUPLE: checkbox label ;
: <checkbox> ( -- checkbox )
checkbox new ;
M: checkbox render*
[ "true" and ] [ ] [ label>> ] tri*
[XML <input
type="checkbox"
checked=<-> name=<->><-></input> XML] ;
! Link components
GENERIC: link-title ( obj -- string )
GENERIC: link-href ( obj -- url )
M: string link-title ;
M: string link-href ;
M: url link-title ;
M: url link-href ;
2008-09-29 05:10:00 -04:00
TUPLE: link target ;
M: link render*
nip swap
[ target>> ] [ [ link-href ] [ link-title ] bi ] bi*
[XML <a target=<-> href=<->><-></a> XML] ;
! XMode code component
TUPLE: code mode ;
: <code> ( -- code )
code new ;
M: code render*
[ string-lines ] [ drop ] [ mode>> value ] tri* htmlize-lines ;
! Farkup component
2008-09-22 01:36:07 -04:00
TUPLE: farkup no-follow disable-images parsed ;
2008-09-23 23:01:26 -04:00
: <farkup> ( -- farkup )
farkup new ;
: string>boolean ( string -- boolean )
{
{ "true" [ t ] }
{ "false" [ f ] }
2008-09-22 03:46:10 -04:00
{ f [ f ] }
} case ;
M: farkup render*
[
2008-09-22 01:36:07 -04:00
nip
[ no-follow>> [ string>boolean link-no-follow? set ] when* ]
2008-09-22 01:36:07 -04:00
[ disable-images>> [ string>boolean disable-images? set ] when* ]
[ parsed>> string>boolean [ (write-farkup) ] [ farkup>xml ] if ]
2008-09-22 01:36:07 -04:00
tri
] with-scope ;
! Inspector component
SINGLETON: inspector
M: inspector render*
2drop [ describe ] with-html-writer ;
2008-05-27 01:01:27 -04:00
! Diff component
SINGLETON: comparison
M: comparison render*
2drop htmlize-diff ;
! HTML component
SINGLETON: html
2009-01-29 14:33:04 -05:00
M: html render* 2drop <unescaped> ;
2009-02-12 02:31:54 -05:00
! XML component
SINGLETON: xml
M: xml render* 2drop ;