comparison framework.rhope @ 47:6202b866d72c

Cleaned up constructor names and merged some other changes in to support the Rhope website
author Mike Pavone <pavone@retrodev.com>
date Tue, 22 Dec 2009 01:22:09 -0500
parents b3f71490858c
children f3686f60985d
comparison
equal deleted inserted replaced
46:429b5f441381 47:6202b866d72c
1 Import webserver.rhope 1 Import webserver.rhope
2 2
3 Framework Handler[con,path,request type,queryvars,headers,handler,title,use session] 3 Framework Handler[con,path,request type,queryvars,headers,handler,title,use session]
4 { 4 {
5 page <- New@Page[title, path, use session, queryvars, headers] 5 page <- Page[title, path, use session, queryvars, headers]
6 out list <- [handler]Do[ [[New@List[]]Append[page]]Append[path] ] 6 out list <- [handler]Do[ [[List[]]Append[page]]Append[path] ]
7 handler page <- [out list]Index[0] 7 handler page <- [out list]Index[0]
8 If[[request type] = ["POST"]] 8 If[[request type] = ["POST"]]
9 { 9 {
10 final page <- Process POST[handler page, con, headers] 10 final page <- Process POST[handler page, con, headers]
11 }{ 11 }{
50 Event Name 50 Event Name
51 Origin 51 Origin
52 Data 52 Data
53 } 53 }
54 54
55 New@Web Event[name,origin,data:out] 55 Web Event[name,origin,data:out]
56 { 56 {
57 out <- [[[Build["Web Event"]]Event Name <<[name]]Origin <<[origin]]Data <<[data] 57 out <- [[[Build["Web Event"]]Event Name <<[name]]Origin <<[origin]]Data <<[data]
58 } 58 }
59 59
60 Blueprint Web Container 60 Blueprint Web Container
65 Children 65 Children
66 Handlers 66 Handlers
67 Named Children 67 Named Children
68 Session 68 Session
69 Use Session 69 Use Session
70 } 70 Preformatted
71 71 }
72 New@Web Container[class:out] 72
73 { 73 Web Container[class:out]
74 out <- [[[[[[[Build["Web Container"] 74 {
75 out <- [[[[[[[[Build["Web Container"]
75 ]Tag Name <<["div"] 76 ]Tag Name <<["div"]
76 ]Class <<[class] 77 ]Class <<[class]
77 ]Propagate Events <<[No] 78 ]Propagate Events <<[No]
78 ]Children <<[New@List[]] 79 ]Children <<[List[]]
79 ]Named Children <<[New@Dictionary[]] 80 ]Named Children <<[Dictionary[]]
80 ]Handlers <<[New@Dictionary[]] 81 ]Handlers <<[Dictionary[]]
81 ]Use Session <<[No] 82 ]Use Session <<[No]
83 ]Preformatted <<[No]
82 } 84 }
83 85
84 Name@Web Container[cont:out,none] 86 Name@Web Container[cont:out,none]
85 { 87 {
86 none <- cont 88 none <- cont
87 } 89 }
88 90
89 Render Child[start,container:out] 91 Render Child[start,container:out]
90 { 92 {
91 out <- [start]Append[[container]Render] 93 out <- [start]Append[[container]Render]
94 }
95
96 _Preformatted[child,val:out]
97 {
98 If[[Type Of[child]] = ["Web Text"]]
99 {
100 out <- [child]Preformatted <<[val]
101 }{
102 If[[Type Of[child]] = ["Web Container"]]
103 {
104 out <- [child]Preformatted[val]
105 }{
106 out <- child
107 }
108 }
109 }
110
111 Preformatted@Web Container[cont,preformatted?:out]
112 {
113 out <- [[cont]Children <<[ Map[[cont]Children >>, ["_Preformatted"]Set Input[1, preformatted?]] ]
114 ]Preformatted <<[preformatted?]
92 } 115 }
93 116
94 Set Session@Web Container[container,session:out] 117 Set Session@Web Container[container,session:out]
95 { 118 {
96 out <- [ 119 out <- [
105 out <- [container]Handlers <<[ [[container]Handlers >> ]Set[event name, handler] ] 128 out <- [container]Handlers <<[ [[container]Handlers >> ]Set[event name, handler] ]
106 } 129 }
107 130
108 Render@Web Container[container:out,headers] 131 Render@Web Container[container:out,headers]
109 { 132 {
133 If[[container]Preformatted >>]
134 {
135 newline <- ""
136 tab <- ""
137 }{
138 newline <- "\n"
139 tab <- "\t"
140 }
110 out <- [[[[[[["<"]Append[ [container]Tag Name >> ] 141 out <- [[[[[[["<"]Append[ [container]Tag Name >> ]
111 ]Append[Get Class[container]] 142 ]Append[Get Class[container]]
112 ]Append[">\n\t"] 143 ]Append[[[">"]Append[newline]]Append[tab]]
113 ]Append[Fold[["Render Child"]<String@Worker, "", [container]Children >>]] 144 ]Append[Fold[["Render Child"]<String@Worker, "", [container]Children >>]]
114 ]Append["\n</"] 145 ]Append[[newline]Append["</"]]
115 ]Append[ [container]Tag Name >> ] 146 ]Append[ [container]Tag Name >> ]
116 ]Append[">\n"] 147 ]Append[[">"]Append[newline]]
117 } 148 }
118 149
119 Container Event Handler[container,events,index:cont,out events] 150 Container Event Handler[container,events,index:cont,out events]
120 { 151 {
121 event <- [events]Index[index] 152 event <- [events]Index[index]
122 [[container]Handlers >>]Index[ [event]Event Name >>] 153 [[container]Handlers >>]Index[ [event]Event Name >>]
123 { 154 {
124 result list <- [~]Do[ 155 result list <- [~]Do[
125 [[New@List[]]Append[container]]Append[event] 156 [[List[]]Append[container]]Append[event]
126 ] 157 ]
127 new container <- [result list]Index[0] 158 new container <- [result list]Index[0]
128 [result list]Index[1] 159 [result list]Index[1]
129 { 160 {
130 out events <- [result events]Append[~] 161 out events <- [result events]Append[~]
139 [events]Next[index] 170 [events]Next[index]
140 { 171 {
141 cont, result events <- Container Event Handler[new container, events, ~] 172 cont, result events <- Container Event Handler[new container, events, ~]
142 }{ 173 }{
143 cont <- Val[new container] 174 cont <- Val[new container]
144 result events <- New@List[] 175 result events <- List[]
145 } 176 }
146 } 177 }
147 178
148 Container Postback Helper[container,post data,index,events:out,out events] 179 Container Postback Helper[container,post data,index,events:out,out events]
149 { 180 {
169 200
170 Postback@Web Container[container,post data:out,events] 201 Postback@Web Container[container,post data:out,events]
171 { 202 {
172 [[container]Children >>]First 203 [[container]Children >>]First
173 { 204 {
174 out, postback events <- Container Postback Helper[container, post data, ~, New@List[]] 205 out, postback events <- Container Postback Helper[container, post data, ~, List[]]
175 If[[container]Propagate Events >>] 206 If[[container]Propagate Events >>]
176 { 207 {
177 events <- Val[postback events] 208 events <- Val[postback events]
178 }{ 209 }{
179 events <- New@List[] 210 events <- List[]
180 } 211 }
181 }{ 212 }{
182 out <- container 213 out <- container
183 events <- New@List[] 214 events <- List[]
184 } 215 }
185 } 216 }
186 217
187 Add Child[cont,child:out] 218 Add Child[cont,child:out]
188 { 219 {
226 Set Handler@Page[container,event name,handler:out] 257 Set Handler@Page[container,event name,handler:out]
227 { 258 {
228 out <- [container]Handlers <<[ [[container]Handlers >> ]Set[event name, handler] ] 259 out <- [container]Handlers <<[ [[container]Handlers >> ]Set[event name, handler] ]
229 } 260 }
230 261
231 New@Page[title,url,use session,queryvars,headers:out] 262 Page[title,url,use session,queryvars,headers:out]
232 { 263 {
233 page <- [[[[[[[Build["Page"] 264 page <- [[[[[[[Build["Page"]
234 ]Title <<[title] 265 ]Title <<[title]
235 ]URL <<[url] 266 ]URL <<[url]
236 ]CSS <<[[New@List[]]Append["/default.css"]] 267 ]CSS <<[[List[]]Append["/default.css"]]
237 ]Children <<[New@List[]] 268 ]Children <<[List[]]
238 ]Named Children <<[New@Dictionary[]] 269 ]Named Children <<[Dictionary[]]
239 ]Handlers <<[New@Dictionary[]] 270 ]Handlers <<[Dictionary[]]
240 ]Use Session <<[use session] 271 ]Use Session <<[use session]
241
242 If[use session] 272 If[use session]
243 { 273 {
244 Load@Session[queryvars, headers] 274 Load@Session[queryvars, headers]
245 { 275 {
246 out <- [[page]Session <<[~]]Session ID <<[ [~]Session ID>>] 276 out <- [[page]Session <<[~]]Session ID <<[ [~]Session ID>>]
274 ]Append[[[page]Get Action]Append["\">\n"]] 304 ]Append[[[page]Get Action]Append["\">\n"]]
275 ]Append[Fold[["Render Child"]<String@Worker, "", [page]Children >>]] 305 ]Append[Fold[["Render Child"]<String@Worker, "", [page]Children >>]]
276 ]Append["\t</form>\n\t</body>\n</html>"] 306 ]Append["\t</form>\n\t</body>\n</html>"]
277 If[[page]Use Session>>] 307 If[[page]Use Session>>]
278 { 308 {
279 headers <- [[page]Session >>]Finalize[New@Dictionary[]] 309 headers <- [[page]Session >>]Finalize[Dictionary[]]
280 }{ 310 }{
281 headers <- New@Dictionary[] 311 headers <- Dictionary[]
282 } 312 }
283 } 313 }
284 314
285 Clear Children[page:out] 315 Clear Children[page:out]
286 { 316 {
287 out <- [[page]Children <<[New@List[]]]Named Children <<[New@Dictionary[]] 317 out <- [[page]Children <<[List[]]]Named Children <<[Dictionary[]]
288 } 318 }
289 319
290 Set@Page[page,key,val:out] 320 Set@Page[page,key,val:out]
291 { 321 {
292 out <- [page]Session <<[ [[page]Session >>]Set[key, val] ] 322 out <- [page]Session <<[ [[page]Session >>]Set[key, val] ]
312 out <- [page]CSS <<[ [[page]CSS >>]Append[css] ] 342 out <- [page]CSS <<[ [[page]CSS >>]Append[css] ]
313 } 343 }
314 344
315 Clear CSS@Page[page:out] 345 Clear CSS@Page[page:out]
316 { 346 {
317 out <- [page]CSS <<[New@List[]] 347 out <- [page]CSS <<[List[]]
318 } 348 }
319 349
320 Decode Helper Decode[list,destlist,index:out] 350 Decode Helper Decode[list,destlist,index:out]
321 { 351 {
322 code,rest <- [[list]Index[index]]Slice[2] 352 code,rest <- [[list]Index[index]]Slice[2]
343 URL Decode[val:out] 373 URL Decode[val:out]
344 { 374 {
345 parts <- [val]Split["%"] 375 parts <- [val]Split["%"]
346 [parts]First 376 [parts]First
347 { 377 {
348 out <- [Decode Helper Straight[parts, New@List[], ~]]Join[""] 378 out <- [Decode Helper Straight[parts, List[], ~]]Join[""]
349 }{ 379 }{
350 out <- val 380 out <- val
351 } 381 }
352 } 382 }
353 383
374 404
375 Postback@Page[page,post data:out,events] 405 Postback@Page[page,post data:out,events]
376 { 406 {
377 [[page]Children >>]First 407 [[page]Children >>]First
378 { 408 {
379 out, events <- Container Postback Helper[page, post data, ~, New@List[]] 409 out, events <- Container Postback Helper[page, post data, ~, List[]]
380 }{ 410 }{
381 out <- page 411 out <- page
382 } 412 }
383 events <- New@List[] 413 events <- List[]
384 } 414 }
385 415
386 Blueprint Web Text 416 Blueprint Web Text
387 { 417 {
388 Text 418 Text
389 Enclosing Tag 419 Enclosing Tag
390 } 420 Preformatted
391 421 }
392 New@Web Text[text,tag:out] 422
393 { 423 Web Text[text,tag:out]
394 out <- [[Build["Web Text"]]Text <<[text]]Enclosing Tag <<[tag] 424 {
425 out <- [[[Build["Web Text"]]Text <<[text]]Enclosing Tag <<[tag]]Preformatted <<[No]
395 } 426 }
396 427
397 Name@Web Text[text:out,none] 428 Name@Web Text[text:out,none]
398 { 429 {
399 none <- text 430 none <- text
404 out <- [[[string]Replace["&","&amp;"]]Replace["<", "&lt;"]]Replace[">", "&gt;"] 435 out <- [[[string]Replace["&","&amp;"]]Replace["<", "&lt;"]]Replace[">", "&gt;"]
405 } 436 }
406 437
407 Render@Web Text[text:out,headers] 438 Render@Web Text[text:out,headers]
408 { 439 {
409 processed text <- [Escape HTML Text[[text]Text >>]]Replace["\n","<br>\n\t"] 440 escaped <- Escape HTML Text[[text]Text >>]
441 If[[text]Preformatted >>]
442 {
443 processed text <- Val[escaped]
444 }{
445 processed text <- [escaped]Replace["\n","<br>\n\t"]
446 }
410 If[[[[text]Enclosing Tag >>]Length] = [0]] 447 If[[[[text]Enclosing Tag >>]Length] = [0]]
411 { 448 {
412 out <- Val[processed text] 449 out <- Val[processed text]
413 }{ 450 }{
414 out <- [[[["<"]Append[[text]Enclosing Tag >>]]Append[">"]]Append[processed text]]Append[[["</"]Append[[text]Enclosing Tag >>]]Append[">"]] 451 out <- [[[["<"]Append[[text]Enclosing Tag >>]]Append[">"]]Append[processed text]]Append[[["</"]Append[[text]Enclosing Tag >>]]Append[">"]]
416 } 453 }
417 454
418 Postback@Web Text[text,post data:out,events] 455 Postback@Web Text[text,post data:out,events]
419 { 456 {
420 out <- text 457 out <- text
421 events <- New@List[] 458 events <- List[]
422 } 459 }
423 460
424 Set Session@Web Text[text,session:out] 461 Set Session@Web Text[text,session:out]
425 { 462 {
426 out <- session 463 out <- text
427 } 464 }
428 465
429 Render@String[string:out,headers] 466 Render@String[string:out,headers]
430 { 467 {
431 out <- [New@Web Text[string,""]]Render 468 out <- [Web Text[string,""]]Render
432 } 469 }
433 470
434 Name@String[string:out,none] 471 Name@String[string:out,none]
435 { 472 {
436 none <- string 473 none <- string
437 } 474 }
438 475
439 Postback@String[in,post data:out,events] 476 Postback@String[in,post data:out,events]
440 { 477 {
441 out <- in 478 out <- in
442 events <- New@List[] 479 events <- List[]
443 } 480 }
444 481
445 Set Session@String[in,session:out] 482 Set Session@String[in,session:out]
446 { 483 {
447 out <- in 484 out <- in
458 Name@Web Field[field:name,none] 495 Name@Web Field[field:name,none]
459 { 496 {
460 name <- [field]Name >> 497 name <- [field]Name >>
461 } 498 }
462 499
463 New@Web Field[name,value,type:out] 500 Web Field[name,value,type:out]
464 { 501 {
465 out <- [[[[Build["Web Field"]]Name <<[name]]Value <<[value]]Type <<[type]]Class <<[""] 502 out <- [[[[Build["Web Field"]]Name <<[name]]Value <<[value]]Type <<[type]]Class <<[""]
466 } 503 }
467 504
468 Set Session@Web Field[in,session:out] 505 Set Session@Web Field[in,session:out]
487 { 524 {
488 out <- [field]Value <<[~] 525 out <- [field]Value <<[~]
489 526
490 If[[[field]Value >>] = [~]] 527 If[[[field]Value >>] = [~]]
491 { 528 {
492 event <- New@List[] 529 event <- List[]
493 }{ 530 }{
494 event <- [New@List[]]Append[ New@Web Event["change", [field]Name >>, [field]Value >>] ] 531 event <- [List[]]Append[ Web Event["change", [field]Name >>, [field]Value >>] ]
495 } 532 }
496 }{ 533 }{
497 out <- field 534 out <- field
498 event <- New@List[] 535 event <- List[]
499 } 536 }
500 } 537 }
501 538
502 Blueprint Web Button 539 Blueprint Web Button
503 { 540 {
504 Name 541 Name
505 Label 542 Label
506 Class 543 Class
507 } 544 }
508 545
509 New@Web Button[name,label:out] 546 Web Button[name,label:out]
510 { 547 {
511 out <- [[[Build["Web Button"]]Name <<[name]]Label <<[label]]Class <<[""] 548 out <- [[[Build["Web Button"]]Name <<[name]]Label <<[label]]Class <<[""]
512 } 549 }
513 550
514 Name@Web Button[button:name,none] 551 Name@Web Button[button:name,none]
524 Postback@Web Button[button,post data:out,events] 561 Postback@Web Button[button,post data:out,events]
525 { 562 {
526 out <- button 563 out <- button
527 [post data]Index[[button]Name >>] 564 [post data]Index[[button]Name >>]
528 { 565 {
529 events <- [New@List[]]Append[ New@Web Event["click", [button]Name >>, 0] ] 566 events <- [List[]]Append[ Web Event["click", [button]Name >>, 0] ]
530 }{ 567 }{
531 events <- New@List[] 568 events <- List[]
532 } 569 }
533 } 570 }
534 571
535 Render@Web Button[button:out,headers] 572 Render@Web Button[button:out,headers]
536 { 573 {
541 { 578 {
542 Session ID 579 Session ID
543 IP Address 580 IP Address
544 Use Cookies 581 Use Cookies
545 Data 582 Data
583 Dirty
546 } 584 }
547 585
548 Get Unique ID[:out] uses Session 586 Get Unique ID[:out] uses Session
549 { 587 {
550 out <- [[[::ID]<Whole Number@String]Append["_"]]Append[Random[]] 588 out <- [[[::ID]<Whole Number@String]Append["_"]]Append[Random[]]
551 ::ID <- [::ID]+[1] 589 ::ID <- [::ID]+[1]
552 } 590 }
553 591
554 New@Session[:out] 592 Session[:out]
555 { 593 {
556 out <- [[[Build["Session"]]Session ID <<[Get Unique ID[]]]Use Cookies <<[No]]Data <<[New@Dictionary[]] 594 out <- [[[[Build["Session"]]Session ID <<[Get Unique ID[]]]Use Cookies <<[No]]Data <<[Dictionary[]]]Dirty <<[No]
557 } 595 }
558 596
559 Load@Session[queryvars,headers:out] uses Session 597 Load@Session[queryvars,headers:out] uses Session
560 { 598 {
561 ,checkquery <- [headers]Index["Cookie"] 599 ,checkquery <- [headers]Index["Cookie"]
579 } 617 }
580 } 618 }
581 619
582 Val[makenew] 620 Val[makenew]
583 { 621 {
584 out <- New@Session[] 622 out <- Session[]
585 } 623 }
586 } 624 }
587 625
588 Get Link Params@Session[session:out,no params] 626 Get Link Params@Session[session:out,no params]
589 { 627 {
595 } 633 }
596 } 634 }
597 635
598 Set@Session[session,key,val:out] 636 Set@Session[session,key,val:out]
599 { 637 {
600 out <- [session]Data <<[ [[session]Data >>]Set[key, val] ] 638 out <- [[session]Data <<[ [[session]Data >>]Set[key, val] ]]Dirty <<[Yes]
601 } 639 }
602 640
603 Index@Session[session,key:out,not found] 641 Index@Session[session,key:out,not found]
604 { 642 {
605 out,not found <- [[session]Data >>]Index[key] 643 out,not found <- [[session]Data >>]Index[key]
616 } 654 }
617 655
618 Init Sessions[:out] uses Session 656 Init Sessions[:out] uses Session
619 { 657 {
620 ::ID <- 1 658 ::ID <- 1
621 ::Sessions <- New@Dictionary[] 659 ::Sessions <- Dictionary[]
622 out <- 0 660 out <- 0
623 } 661 }
624 662
625 Finalize@Session[session,headers:out headers] uses Session 663 Save@Session[session:out] uses Session
626 { 664 {
627 ::Sessions <- [::Sessions]Set[[session]Session ID >>, session] 665 ::Sessions <- [::Sessions]Set[[session]Session ID >>, session]
666 }
667
668 Finalize@Session[session,headers:out headers]
669 {
670 If[[session]Dirty >>]
671 {
672 Save[session]
673 }
628 out headers <- [headers]Set["Set-Cookie", ["session_id="]Append[[session]Session ID >>]] 674 out headers <- [headers]Set["Set-Cookie", ["session_id="]Append[[session]Session ID >>]]
629 } 675 }
630 676
631 Blueprint Web Link 677 Blueprint Web Link
632 { 678 {
634 Target 680 Target
635 Class 681 Class
636 Query Params 682 Query Params
637 } 683 }
638 684
639 New@Web Link[text,target:out] 685 Web Link[text,target:out]
640 { 686 {
641 out <- [[[[Build["Web Link"]]Text <<[text]]Target <<[target]]Class <<[""]]Query Params <<[New@Dictionary[]] 687 out <- [[[[Build["Web Link"]]Text <<[text]]Target <<[target]]Class <<[""]]Query Params <<[Dictionary[]]
642 } 688 }
643 689
644 690
645 With Session@Web Link[text,target,session:out] 691 With Session@Web Link[text,target,session:out]
646 { 692 {
647 New@Web Link[text, target] 693 Web Link[text, target]
648 { 694 {
649 out <- [~]Query Params <<[[[~]Query Params >>]Set["session_id", [session]Session ID >>]] 695 out <- [~]Query Params <<[[[~]Query Params >>]Set["session_id", [session]Session ID >>]]
650 } 696 }
651 } 697 }
652 698
656 { 702 {
657 queryvars <- ["?"]Append[Key Value Join[[link]Query Params>>, "=","&"]] 703 queryvars <- ["?"]Append[Key Value Join[[link]Query Params>>, "=","&"]]
658 }{ 704 }{
659 queryvars <- "" 705 queryvars <- ""
660 } 706 }
661 out <- [[[[[[["<a href=\""]Append[[[link]Target>>]Replace["\"", "%22"]]]Append[queryvars]]Append["\""] 707 out <- [[[[[[["<a href=\""]Append[[link]Target>>]]Append[queryvars]]Append["\""]
662 ]Append[Get Class[link]]]Append[">"]]Append[Escape HTML Text[[link]Text>>]]]Append["</a>"] 708 ]Append[Get Class[link]]]Append[">"]]Append[Escape HTML Text[[link]Text>>]]]Append["</a>"]
663 } 709 }
664 710
665 Postback@Web Link[in,post data:out,events] 711 Postback@Web Link[in,post data:out,events]
666 { 712 {
667 out <- in 713 out <- in
668 events <- New@List[] 714 events <- List[]
669 } 715 }
670 716
671 Name@Web Link[link:name,none] 717 Name@Web Link[link:name,none]
672 { 718 {
673 none <- link 719 none <- link
692 { 738 {
693 Headers 739 Headers
694 Data 740 Data
695 } 741 }
696 742
697 New@Web Table[headers,data:out] 743 Web Table[headers,data:out]
698 { 744 {
699 out <- [[Build["Web Table"]]Headers <<[headers]]Data <<[data] 745 out <- [[Build["Web Table"]]Headers <<[headers]]Data <<[data]
700 } 746 }
701 747
702 Name@Web Table[link:name,none] 748 Name@Web Table[link:name,none]