0
|
1 /*
|
|
2 This program implements Paul Graham's "Arc Challenge"
|
|
3 While I think the Arc Challenge is a little silly, it does provide a simple
|
|
4 example of how to use the web framework I whipped up for the Rhope blog
|
|
5 */
|
|
6
|
|
7 //The Import keyword causes another Rhope source file to be included
|
|
8 //Here we import the Rhope web framework
|
|
9 Import framework.rhope
|
|
10
|
|
11 //Here we define an event handler that will get called when the user clicks the button
|
|
12 //Event handlers get passed the current page tree and an event object
|
|
13 Save Text[page,event:out]
|
|
14 {
|
|
15 //First we store the value from the text box in a session variable
|
|
16 out <- [[[page]Set["said",[[page]Get Child By Name["foo"]]Value >>]
|
|
17 //Then we empty the page object
|
|
18 ]Clear Children
|
|
19 //And we add a hyperlink
|
|
20 ]Add Child[New@Web Link["Click Here","/said"]]
|
|
21 }
|
|
22
|
|
23 //This worker defines our page
|
|
24 Said[page,query:out]
|
|
25 {
|
|
26 //Here we try to retrieve the session variable "said"
|
|
27 [page]Index["said"]
|
|
28 {
|
|
29 //If it's present we display it on the page
|
|
30 out <- [page]Add Child[ ["You said: "]Append[~] ]
|
|
31 }{
|
|
32 //Otherwise we provide them with a form to enter a word
|
|
33 out <- [[[page]Add Child[New@Web Field["foo","","text"]]
|
|
34 ]Add Child[
|
|
35 New@Web Button["blah","Click!"]
|
|
36 //The Set Handler call here attaches the worker Save Text to the click event for the page
|
|
37 //Events propagate can propagate themselves up the page hierarchy and handled wherever appropriate
|
|
38 ]]Set Handler["click","Save Text"]
|
|
39 }
|
|
40 }
|
|
41
|
|
42 Main[]
|
|
43 {
|
|
44 //Start Web starts the webserver and initializes the web framework
|
|
45 Start Web[
|
|
46 //It takes a dictionary mapping paths to Workers that define dynamic pages
|
|
47 //Rather than just passing the name of the Worker, we're passing a List of info
|
|
48 //that allows the framework to take care of some of the drudgework for us
|
|
49 //The first element in the list is the worker name, the second the page title
|
|
50 //and the third element indicates whether this page will be using session data or not
|
|
51 [New@Dictionary[]]Set["/said",("Said","That's what she said",Yes)]
|
|
52 ]
|
|
53 }
|