| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: accessors kernel namespaces io math.parser assocs classes | 
					
						
							| 
									
										
										
										
											2008-06-15 03:38:12 -04:00
										 |  |  | classes.tuple words arrays sequences splitting mirrors | 
					
						
							|  |  |  | hashtables combinators continuations math strings inspector | 
					
						
							|  |  |  | fry locals calendar calendar.format xml.entities | 
					
						
							|  |  |  | validators urls present | 
					
						
							|  |  |  | xmode.code2html lcs.diff2html farkup | 
					
						
							|  |  |  | html.elements html.streams html.forms ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | IN: html.components | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-24 01:45:49 -04:00
										 |  |  | GENERIC: render* ( value name renderer -- )
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : render ( name renderer -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-15 03:38:12 -04:00
										 |  |  |     prepare-value | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         dup validation-error? | 
					
						
							|  |  |  |         [ [ message>> ] [ value>> ] bi ] | 
					
						
							|  |  |  |         [ f swap ] | 
					
						
							|  |  |  |         if
 | 
					
						
							|  |  |  |     ] 2dip
 | 
					
						
							|  |  |  |     render* | 
					
						
							|  |  |  |     [ render-error ] when* ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : render-input ( value name type -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  |     <input =type =name present =value input/> ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SINGLETON: label | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  | M: label render* 2drop present escape-string write ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | SINGLETON: hidden | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: hidden render* drop "hidden" render-input ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : render-field ( value name size type -- )
 | 
					
						
							|  |  |  |     <input | 
					
						
							|  |  |  |         =type | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  |         [ present =size ] when*
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |         =name | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  |         present =value | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |     input/> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <textarea> ( -- renderer )
 | 
					
						
							|  |  |  |     textarea new ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: textarea render* | 
					
						
							|  |  |  |     <textarea | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  |         [ rows>> [ present =rows ] when* ] | 
					
						
							|  |  |  |         [ cols>> [ present =cols ] when* ] bi
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |         =name | 
					
						
							|  |  |  |     textarea> | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  |         present escape-string write
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |     </textarea> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Choice | 
					
						
							| 
									
										
										
										
											2008-05-23 20:16:21 -04:00
										 |  |  | TUPLE: choice size multiple choices ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <choice> ( -- choice )
 | 
					
						
							|  |  |  |     choice new ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : render-option ( text selected? -- )
 | 
					
						
							| 
									
										
										
										
											2008-09-30 00:13:46 -04:00
										 |  |  |     <option [ "selected" =selected ] when option> | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  |         present escape-string write
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |     </option> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : render-options ( options selected -- )
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:40 -04:00
										 |  |  |     '[ dup _ member? render-option ] each ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: choice render* | 
					
						
							|  |  |  |     <select | 
					
						
							|  |  |  |         swap =name | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  |         dup size>> [ present =size ] when*
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |         dup multiple>> [ "true" =multiple ] when
 | 
					
						
							|  |  |  |     select> | 
					
						
							| 
									
										
										
										
											2008-05-23 20:16:21 -04:00
										 |  |  |         [ choices>> value ] [ multiple>> ] bi
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |         [ swap ] [ swap 1array ] if
 | 
					
						
							|  |  |  |         render-options | 
					
						
							|  |  |  |     </select> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Checkboxes | 
					
						
							|  |  |  | TUPLE: checkbox label ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <checkbox> ( -- checkbox )
 | 
					
						
							|  |  |  |     checkbox new ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: checkbox render* | 
					
						
							|  |  |  |     <input | 
					
						
							|  |  |  |         "checkbox" =type | 
					
						
							|  |  |  |         swap =name | 
					
						
							| 
									
										
										
										
											2008-06-01 18:22:39 -04:00
										 |  |  |         swap [ "true" =checked ] when
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |     input> | 
					
						
							|  |  |  |         label>> escape-string write
 | 
					
						
							|  |  |  |     </input> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Link components | 
					
						
							|  |  |  | GENERIC: link-title ( obj -- string )
 | 
					
						
							|  |  |  | GENERIC: link-href ( obj -- url )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  | 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 ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: link render* | 
					
						
							| 
									
										
										
										
											2008-09-29 05:10:00 -04:00
										 |  |  |     nip
 | 
					
						
							|  |  |  |     <a target>> [ =target ] when* dup link-href =href a> | 
					
						
							| 
									
										
										
										
											2008-06-05 01:18:36 -04:00
										 |  |  |         link-title present escape-string write
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  |     </a> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-23 23:32:39 -04:00
										 |  |  | ! 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-06-14 01:31:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-23 23:01:26 -04:00
										 |  |  | : <farkup> ( -- farkup )
 | 
					
						
							|  |  |  |     farkup new ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-14 01:31:10 -04:00
										 |  |  | : string>boolean ( string -- boolean )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { "true" [ t ] } | 
					
						
							|  |  |  |         { "false" [ f ] } | 
					
						
							| 
									
										
										
										
											2008-09-22 03:46:10 -04:00
										 |  |  |         { f [ f ] } | 
					
						
							| 
									
										
										
										
											2008-06-14 01:31:10 -04:00
										 |  |  |     } case ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 23:32:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: farkup render* | 
					
						
							| 
									
										
										
										
											2008-06-14 01:31:10 -04:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2008-09-22 01:36:07 -04:00
										 |  |  |         nip
 | 
					
						
							| 
									
										
										
										
											2008-06-14 01:31:10 -04:00
										 |  |  |         [ 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) ] [ write-farkup ] if ] | 
					
						
							|  |  |  |         tri
 | 
					
						
							| 
									
										
										
										
											2008-06-14 01:31:10 -04:00
										 |  |  |     ] with-scope ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 23:32:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Inspector component | 
					
						
							|  |  |  | SINGLETON: inspector | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: inspector render* | 
					
						
							| 
									
										
										
										
											2008-09-29 05:10:00 -04:00
										 |  |  |     2drop [ describe ] with-html-writer ;
 | 
					
						
							| 
									
										
										
										
											2008-05-23 23:32:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-27 01:01:27 -04:00
										 |  |  | ! Diff component | 
					
						
							|  |  |  | SINGLETON: comparison | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: comparison render* | 
					
						
							|  |  |  |     2drop htmlize-diff ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-23 18:33:31 -04:00
										 |  |  | ! HTML component | 
					
						
							|  |  |  | SINGLETON: html | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: html render* 2drop write ;
 |