Mercurial > repos > rhope
annotate framework.rhope @ 75:0083b2f7b3c7
Partially working implementation of List. Modified build scripts to allow use of other compilers. Fixed some bugs involving method implementations on different types returning different numbers of outputs. Added Fold to the 'builtins' in the comipler.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 06 Jul 2010 07:52:59 -0400 |
parents | 6202b866d72c |
children | f3686f60985d |
rev | line source |
---|---|
0 | 1 Import webserver.rhope |
2 | |
3 Framework Handler[con,path,request type,queryvars,headers,handler,title,use session] | |
4 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
5 page <- Page[title, path, use session, queryvars, headers] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
6 out list <- [handler]Do[ [[List[]]Append[page]]Append[path] ] |
0 | 7 handler page <- [out list]Index[0] |
8 If[[request type] = ["POST"]] | |
9 { | |
10 final page <- Process POST[handler page, con, headers] | |
11 }{ | |
12 final page <- Val[handler page] | |
13 } | |
14 string,out headers <- [final page]Render | |
15 | |
16 [HTTP OK[con, Get Content Type[".html"], [string]Length, out headers] | |
17 ]Put String[string] | |
18 } | |
19 | |
20 Handler Fixer[handler:out] | |
21 { | |
22 If[[Type Of[handler]] = ["List"]] | |
23 { | |
24 out <- [[["Framework Handler"]Set Input[5, [handler]Index[0]]]Set Input[6, [handler]Index[1]]]Set Input[7, [handler]Index[2]] | |
25 }{ | |
26 out <- handler | |
27 } | |
28 } | |
29 | |
30 Start Web[handlers] | |
31 { | |
32 Print["Starting Rhope Web Server"] | |
33 Init Sessions[] | |
34 { Listen on Port[80,["Connection Start"]Set Input[1, Map[handlers,"Handler Fixer"]]] } | |
35 Wait Forever[] | |
36 } | |
37 | |
38 Get Class[container:class] | |
39 { | |
40 If[[[[container]Class >>]Length] > [0]] | |
41 { | |
42 class <- [[" class=\""]Append[[container]Class >>]]Append["\""] | |
43 }{ | |
44 class <- "" | |
45 } | |
46 } | |
47 | |
48 Blueprint Web Event | |
49 { | |
50 Event Name | |
51 Origin | |
52 Data | |
53 } | |
54 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
55 Web Event[name,origin,data:out] |
0 | 56 { |
57 out <- [[[Build["Web Event"]]Event Name <<[name]]Origin <<[origin]]Data <<[data] | |
58 } | |
59 | |
60 Blueprint Web Container | |
61 { | |
62 Tag Name | |
63 Class | |
64 Propagate Events | |
65 Children | |
66 Handlers | |
67 Named Children | |
68 Session | |
69 Use Session | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
70 Preformatted |
0 | 71 } |
72 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
73 Web Container[class:out] |
0 | 74 { |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
75 out <- [[[[[[[[Build["Web Container"] |
0 | 76 ]Tag Name <<["div"] |
77 ]Class <<[class] | |
78 ]Propagate Events <<[No] | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
79 ]Children <<[List[]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
80 ]Named Children <<[Dictionary[]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
81 ]Handlers <<[Dictionary[]] |
0 | 82 ]Use Session <<[No] |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
83 ]Preformatted <<[No] |
0 | 84 } |
85 | |
86 Name@Web Container[cont:out,none] | |
87 { | |
88 none <- cont | |
89 } | |
90 | |
91 Render Child[start,container:out] | |
92 { | |
93 out <- [start]Append[[container]Render] | |
94 } | |
95 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
96 _Preformatted[child,val:out] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
97 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
98 If[[Type Of[child]] = ["Web Text"]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
99 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
100 out <- [child]Preformatted <<[val] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
101 }{ |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
102 If[[Type Of[child]] = ["Web Container"]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
103 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
104 out <- [child]Preformatted[val] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
105 }{ |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
106 out <- child |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
107 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
108 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
109 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
110 |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
111 Preformatted@Web Container[cont,preformatted?:out] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
112 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
113 out <- [[cont]Children <<[ Map[[cont]Children >>, ["_Preformatted"]Set Input[1, preformatted?]] ] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
114 ]Preformatted <<[preformatted?] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
115 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
116 |
0 | 117 Set Session@Web Container[container,session:out] |
118 { | |
119 out <- [ | |
120 [ | |
121 [container]Use Session <<[Yes] | |
122 ]Session <<[session] | |
123 ]Children <<[ Map[ [container]Children >>, ["Set Session"]Set Input[1, session] ] ] | |
124 } | |
125 | |
126 Set Handler@Web Container[container,event name,handler:out] | |
127 { | |
128 out <- [container]Handlers <<[ [[container]Handlers >> ]Set[event name, handler] ] | |
129 } | |
130 | |
131 Render@Web Container[container:out,headers] | |
132 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
133 If[[container]Preformatted >>] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
134 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
135 newline <- "" |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
136 tab <- "" |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
137 }{ |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
138 newline <- "\n" |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
139 tab <- "\t" |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
140 } |
0 | 141 out <- [[[[[[["<"]Append[ [container]Tag Name >> ] |
142 ]Append[Get Class[container]] | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
143 ]Append[[[">"]Append[newline]]Append[tab]] |
0 | 144 ]Append[Fold[["Render Child"]<String@Worker, "", [container]Children >>]] |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
145 ]Append[[newline]Append["</"]] |
0 | 146 ]Append[ [container]Tag Name >> ] |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
147 ]Append[[">"]Append[newline]] |
0 | 148 } |
149 | |
150 Container Event Handler[container,events,index:cont,out events] | |
151 { | |
152 event <- [events]Index[index] | |
153 [[container]Handlers >>]Index[ [event]Event Name >>] | |
154 { | |
155 result list <- [~]Do[ | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
156 [[List[]]Append[container]]Append[event] |
0 | 157 ] |
158 new container <- [result list]Index[0] | |
159 [result list]Index[1] | |
160 { | |
161 out events <- [result events]Append[~] | |
162 }{ | |
163 out events <- Val[result events] | |
164 } | |
165 }{ | |
166 new container <- container | |
167 out events <- Val[result events] | |
168 } | |
169 | |
170 [events]Next[index] | |
171 { | |
172 cont, result events <- Container Event Handler[new container, events, ~] | |
173 }{ | |
174 cont <- Val[new container] | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
175 result events <- List[] |
0 | 176 } |
177 } | |
178 | |
179 Container Postback Helper[container,post data,index,events:out,out events] | |
180 { | |
181 ,current events <- [[[container]Children >>]Index[index]]Postback[post data] | |
182 { | |
183 new container <- [container]Children <<[[[container]Children >>]Set[index, ~]] | |
184 } | |
185 combined events <- Concatenate[events, current events] | |
186 [[new container]Children >>]Next[index] | |
187 { | |
188 out, out events <- Container Postback Helper[new container, post data, ~, combined events] | |
189 }{ | |
190 [combined events]First | |
191 { | |
192 out, newevents <- Container Event Handler[new container, combined events, ~] | |
193 out events <- Concatenate[combined events, newevents] | |
194 }{ | |
195 out <- Val[new container] | |
196 out events <- Val[combined events] | |
197 } | |
198 } | |
199 } | |
200 | |
201 Postback@Web Container[container,post data:out,events] | |
202 { | |
203 [[container]Children >>]First | |
204 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
205 out, postback events <- Container Postback Helper[container, post data, ~, List[]] |
0 | 206 If[[container]Propagate Events >>] |
207 { | |
208 events <- Val[postback events] | |
209 }{ | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
210 events <- List[] |
0 | 211 } |
212 }{ | |
213 out <- container | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
214 events <- List[] |
0 | 215 } |
216 } | |
217 | |
218 Add Child[cont,child:out] | |
219 { | |
220 If[[cont]Use Session >>] | |
221 { | |
222 prepped child <- [child]Set Session[[cont]Session >>] | |
223 }{ | |
224 prepped child <- Val[child] | |
225 } | |
226 with child <- [cont]Children <<[ [[cont]Children >>]Append[prepped child] ] | |
227 | |
228 [prepped child]Name | |
229 { | |
230 out <- [with child]Named Children <<[ [[with child]Named Children >>]Set[~, [[[with child]Children >>]Length] - [1]] ] | |
231 }{ | |
232 out <- Val[with child] | |
233 } | |
234 } | |
235 | |
236 Get Child By Name[container,name:out,not found] | |
237 { | |
238 ,not found <- [[container]Named Children >>]Index[name] | |
239 { | |
240 out <- [[container]Children >>]Index[~] | |
241 } | |
242 } | |
243 | |
244 Blueprint Page | |
245 { | |
246 Title | |
247 URL | |
248 CSS | |
249 Children | |
250 Named Children | |
251 Handlers | |
252 Use Session | |
253 Session | |
254 Session ID | |
255 } | |
256 | |
257 Set Handler@Page[container,event name,handler:out] | |
258 { | |
259 out <- [container]Handlers <<[ [[container]Handlers >> ]Set[event name, handler] ] | |
260 } | |
261 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
262 Page[title,url,use session,queryvars,headers:out] |
0 | 263 { |
264 page <- [[[[[[[Build["Page"] | |
265 ]Title <<[title] | |
266 ]URL <<[url] | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
267 ]CSS <<[[List[]]Append["/default.css"]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
268 ]Children <<[List[]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
269 ]Named Children <<[Dictionary[]] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
270 ]Handlers <<[Dictionary[]] |
0 | 271 ]Use Session <<[use session] |
272 If[use session] | |
273 { | |
274 Load@Session[queryvars, headers] | |
275 { | |
276 out <- [[page]Session <<[~]]Session ID <<[ [~]Session ID>>] | |
277 } | |
278 }{ | |
279 out <- Val[page] | |
280 } | |
281 } | |
282 | |
283 Get Action@Page[page:out] | |
284 { | |
285 If[[page]Use Session>>] | |
286 { | |
287 [[page]Session >>]Get Link Params | |
288 { | |
289 out <- [[[page]URL >>]Append["?"]]Append[~] | |
290 }{ | |
291 out <- [page]URL >> | |
292 } | |
293 }{ | |
294 out <- [page]URL >> | |
295 } | |
296 } | |
297 | |
298 Render@Page[page:out,headers] | |
299 { | |
300 out <- [[[[[[["<html>\n\t<head>\n\t\t<title>"]Append[[page]Title >>] | |
301 ]Append["</title>\n\t\t<link rel=\"stylesheet\" href=\""] | |
302 ]Append[[[page]CSS >>]Join["\">\n\t\t<link rel=\"stylesheet\" href=\""]] | |
303 ]Append["\">\n\t</head>\n\t<body>\n\t<form method=\"POST\" action=\""] | |
304 ]Append[[[page]Get Action]Append["\">\n"]] | |
305 ]Append[Fold[["Render Child"]<String@Worker, "", [page]Children >>]] | |
306 ]Append["\t</form>\n\t</body>\n</html>"] | |
307 If[[page]Use Session>>] | |
308 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
309 headers <- [[page]Session >>]Finalize[Dictionary[]] |
0 | 310 }{ |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
311 headers <- Dictionary[] |
0 | 312 } |
313 } | |
314 | |
315 Clear Children[page:out] | |
316 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
317 out <- [[page]Children <<[List[]]]Named Children <<[Dictionary[]] |
0 | 318 } |
319 | |
320 Set@Page[page,key,val:out] | |
321 { | |
322 out <- [page]Session <<[ [[page]Session >>]Set[key, val] ] | |
323 } | |
324 | |
325 Index@Page[page,key:out,not found] | |
326 { | |
327 out,not found <- [[page]Session >>]Index[key] | |
328 } | |
329 | |
330 First@Page[page:first,not found] | |
331 { | |
332 first,not found <- [[page]Session >>]First | |
333 } | |
334 | |
335 Next@Page[page,last:next,not found] | |
336 { | |
337 next,not found <- [[page]Session >>]Next[last] | |
338 } | |
339 | |
340 Add CSS@Page[page,css:out] | |
341 { | |
342 out <- [page]CSS <<[ [[page]CSS >>]Append[css] ] | |
343 } | |
344 | |
345 Clear CSS@Page[page:out] | |
346 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
347 out <- [page]CSS <<[List[]] |
0 | 348 } |
349 | |
350 Decode Helper Decode[list,destlist,index:out] | |
351 { | |
352 code,rest <- [[list]Index[index]]Slice[2] | |
353 newlist <- [destlist]Set[index, [[""]Put Byte[From Hex@Whole Number[code]]]Append[rest]] | |
354 [list]Next[index] | |
355 { | |
1
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
356 out <- Decode Helper Decode[list, newlist, ~] |
0 | 357 }{ |
358 out <- Val[newlist] | |
359 } | |
360 } | |
361 | |
362 Decode Helper Straight[list,destlist,index:out] | |
363 { | |
364 newlist <- [destlist]Set[index, [list]Index[index]] | |
365 [list]Next[index] | |
366 { | |
367 out <- Decode Helper Decode[list, newlist, ~] | |
368 }{ | |
369 out <- Val[newlist] | |
370 } | |
371 } | |
372 | |
373 URL Decode[val:out] | |
374 { | |
375 parts <- [val]Split["%"] | |
376 [parts]First | |
377 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
378 out <- [Decode Helper Straight[parts, List[], ~]]Join[""] |
0 | 379 }{ |
380 out <- val | |
381 } | |
382 } | |
383 | |
384 URL Encode Path[string:out] | |
385 { | |
386 out <- [[[[string]Replace["%","%25"]]Replace[" ","%20"]]Replace["/","%2F"]]Replace["?","%3F"] | |
387 } | |
388 | |
389 Decode Pair[val,key:oval,okey] | |
390 { | |
391 oval <- URL Decode[val] | |
392 okey <- URL Decode[key] | |
393 } | |
394 | |
395 Process POST[page,con,headers:out] | |
396 { | |
397 [con]Get FString[[headers]Index["Content-Length"]] {} | |
398 { | |
399 post string <- [~]Replace["+"," "] | |
400 } | |
401 post data <- Key Value Map[Dict Split[post string, "=", "&"], ["Decode Pair"]<String@Worker] | |
402 out <- [page]Postback[post data] | |
403 } | |
404 | |
405 Postback@Page[page,post data:out,events] | |
406 { | |
407 [[page]Children >>]First | |
408 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
409 out, events <- Container Postback Helper[page, post data, ~, List[]] |
0 | 410 }{ |
411 out <- page | |
412 } | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
413 events <- List[] |
0 | 414 } |
415 | |
416 Blueprint Web Text | |
417 { | |
418 Text | |
419 Enclosing Tag | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
420 Preformatted |
0 | 421 } |
422 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
423 Web Text[text,tag:out] |
0 | 424 { |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
425 out <- [[[Build["Web Text"]]Text <<[text]]Enclosing Tag <<[tag]]Preformatted <<[No] |
0 | 426 } |
427 | |
428 Name@Web Text[text:out,none] | |
429 { | |
430 none <- text | |
431 } | |
432 | |
433 Escape HTML Text[string:out] | |
434 { | |
435 out <- [[[string]Replace["&","&"]]Replace["<", "<"]]Replace[">", ">"] | |
436 } | |
437 | |
438 Render@Web Text[text:out,headers] | |
439 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
440 escaped <- Escape HTML Text[[text]Text >>] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
441 If[[text]Preformatted >>] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
442 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
443 processed text <- Val[escaped] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
444 }{ |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
445 processed text <- [escaped]Replace["\n","<br>\n\t"] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
446 } |
0 | 447 If[[[[text]Enclosing Tag >>]Length] = [0]] |
448 { | |
449 out <- Val[processed text] | |
450 }{ | |
451 out <- [[[["<"]Append[[text]Enclosing Tag >>]]Append[">"]]Append[processed text]]Append[[["</"]Append[[text]Enclosing Tag >>]]Append[">"]] | |
452 } | |
453 } | |
454 | |
455 Postback@Web Text[text,post data:out,events] | |
456 { | |
457 out <- text | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
458 events <- List[] |
0 | 459 } |
460 | |
461 Set Session@Web Text[text,session:out] | |
462 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
463 out <- text |
0 | 464 } |
465 | |
466 Render@String[string:out,headers] | |
467 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
468 out <- [Web Text[string,""]]Render |
0 | 469 } |
470 | |
471 Name@String[string:out,none] | |
472 { | |
473 none <- string | |
474 } | |
475 | |
476 Postback@String[in,post data:out,events] | |
477 { | |
478 out <- in | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
479 events <- List[] |
0 | 480 } |
481 | |
482 Set Session@String[in,session:out] | |
483 { | |
484 out <- in | |
485 } | |
486 | |
487 Blueprint Web Field | |
488 { | |
489 Name | |
490 Value | |
491 Type | |
492 Class | |
493 } | |
494 | |
495 Name@Web Field[field:name,none] | |
496 { | |
497 name <- [field]Name >> | |
498 } | |
499 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
500 Web Field[name,value,type:out] |
0 | 501 { |
502 out <- [[[[Build["Web Field"]]Name <<[name]]Value <<[value]]Type <<[type]]Class <<[""] | |
503 } | |
504 | |
505 Set Session@Web Field[in,session:out] | |
506 { | |
507 out <- in | |
508 } | |
509 | |
510 Render@Web Field[field:out,headers] | |
511 { | |
512 If[[[field]Type >>] = ["multiline"]] | |
513 { | |
514 out <- [[[[[["<textarea name=\""]Append[[field]Name >>]]Append["\""]]Append[Get Class[field]]]Append[">"]]Append[[field]Value >>]]Append["</textarea>"] | |
515 }{ | |
516 out <- [[[[[[[["<input type=\""]Append[[field]Type >>]]Append["\" name=\""]]Append[[field]Name >>]]Append["\""]]Append[Get Class[field]]]Append[" value=\""]]Append[[field]Value >>]]Append["\">"] | |
517 } | |
518 | |
519 } | |
520 | |
521 Postback@Web Field[field,post data:out,event] | |
522 { | |
523 [post data]Index[[field]Name >>] | |
524 { | |
525 out <- [field]Value <<[~] | |
526 | |
527 If[[[field]Value >>] = [~]] | |
528 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
529 event <- List[] |
0 | 530 }{ |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
531 event <- [List[]]Append[ Web Event["change", [field]Name >>, [field]Value >>] ] |
0 | 532 } |
533 }{ | |
534 out <- field | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
535 event <- List[] |
0 | 536 } |
537 } | |
538 | |
539 Blueprint Web Button | |
540 { | |
541 Name | |
542 Label | |
543 Class | |
544 } | |
545 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
546 Web Button[name,label:out] |
0 | 547 { |
548 out <- [[[Build["Web Button"]]Name <<[name]]Label <<[label]]Class <<[""] | |
549 } | |
550 | |
551 Name@Web Button[button:name,none] | |
552 { | |
553 name <- [button]Name >> | |
554 } | |
555 | |
556 Set Session@Web Button[in,session:out] | |
557 { | |
558 out <- in | |
559 } | |
560 | |
561 Postback@Web Button[button,post data:out,events] | |
562 { | |
563 out <- button | |
564 [post data]Index[[button]Name >>] | |
565 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
566 events <- [List[]]Append[ Web Event["click", [button]Name >>, 0] ] |
0 | 567 }{ |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
568 events <- List[] |
0 | 569 } |
570 } | |
571 | |
572 Render@Web Button[button:out,headers] | |
573 { | |
574 out <- [[[[[["<input type=\"submit\" name=\""]Append[[button]Name >>]]Append["\""]]Append[Get Class[button]]]Append[" value=\""]]Append[[button]Label >>]]Append["\">"] | |
575 } | |
576 | |
577 Blueprint Session | |
578 { | |
579 Session ID | |
580 IP Address | |
581 Use Cookies | |
582 Data | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
583 Dirty |
0 | 584 } |
585 | |
586 Get Unique ID[:out] uses Session | |
587 { | |
588 out <- [[[::ID]<Whole Number@String]Append["_"]]Append[Random[]] | |
589 ::ID <- [::ID]+[1] | |
590 } | |
591 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
592 Session[:out] |
0 | 593 { |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
594 out <- [[[[Build["Session"]]Session ID <<[Get Unique ID[]]]Use Cookies <<[No]]Data <<[Dictionary[]]]Dirty <<[No] |
0 | 595 } |
596 | |
597 Load@Session[queryvars,headers:out] uses Session | |
598 { | |
599 ,checkquery <- [headers]Index["Cookie"] | |
600 { | |
601 parts <- Dict Split[~, "=", "; "] | |
602 ,checkquery <- [parts]Index["session_id"] | |
603 { | |
604 ,checkquery <- [::Sessions]Index[~] | |
605 { | |
606 out <- [~]Use Cookies <<[Yes] | |
607 } | |
608 } | |
609 } | |
610 | |
611 | |
612 Val[checkquery] | |
613 { | |
614 ,makenew <- [queryvars]Index["session_id"] | |
615 { | |
616 out, makenew <- [::Sessions]Index[~] | |
617 } | |
618 } | |
619 | |
620 Val[makenew] | |
621 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
622 out <- Session[] |
0 | 623 } |
624 } | |
625 | |
626 Get Link Params@Session[session:out,no params] | |
627 { | |
628 If[[session]Use Cookies >>] | |
629 { | |
630 no params <- No | |
631 }{ | |
632 out <- ["session_id="]Append[[session]Session ID >>] | |
633 } | |
634 } | |
635 | |
636 Set@Session[session,key,val:out] | |
637 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
638 out <- [[session]Data <<[ [[session]Data >>]Set[key, val] ]]Dirty <<[Yes] |
0 | 639 } |
640 | |
641 Index@Session[session,key:out,not found] | |
642 { | |
643 out,not found <- [[session]Data >>]Index[key] | |
644 } | |
645 | |
646 First@Session[session:first,not found] | |
647 { | |
648 first,not found <- [[session]Data >>]First | |
649 } | |
650 | |
651 Next@Session[session,last:next,not found] | |
652 { | |
653 next,not found <- [[session]Data >>]Next[last] | |
654 } | |
655 | |
656 Init Sessions[:out] uses Session | |
657 { | |
658 ::ID <- 1 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
659 ::Sessions <- Dictionary[] |
0 | 660 out <- 0 |
661 } | |
662 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
663 Save@Session[session:out] uses Session |
0 | 664 { |
665 ::Sessions <- [::Sessions]Set[[session]Session ID >>, session] | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
666 } |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
667 |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
668 Finalize@Session[session,headers:out headers] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
669 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
670 If[[session]Dirty >>] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
671 { |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
672 Save[session] |
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
673 } |
0 | 674 out headers <- [headers]Set["Set-Cookie", ["session_id="]Append[[session]Session ID >>]] |
675 } | |
676 | |
677 Blueprint Web Link | |
678 { | |
679 Text | |
680 Target | |
681 Class | |
682 Query Params | |
683 } | |
684 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
685 Web Link[text,target:out] |
0 | 686 { |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
687 out <- [[[[Build["Web Link"]]Text <<[text]]Target <<[target]]Class <<[""]]Query Params <<[Dictionary[]] |
0 | 688 } |
689 | |
690 | |
691 With Session@Web Link[text,target,session:out] | |
692 { | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
693 Web Link[text, target] |
0 | 694 { |
695 out <- [~]Query Params <<[[[~]Query Params >>]Set["session_id", [session]Session ID >>]] | |
696 } | |
697 } | |
698 | |
699 Render@Web Link[link:out,headers] | |
700 { | |
701 [[link]Query Params>>]First | |
702 { | |
703 queryvars <- ["?"]Append[Key Value Join[[link]Query Params>>, "=","&"]] | |
704 }{ | |
705 queryvars <- "" | |
706 } | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
707 out <- [[[[[[["<a href=\""]Append[[link]Target>>]]Append[queryvars]]Append["\""] |
0 | 708 ]Append[Get Class[link]]]Append[">"]]Append[Escape HTML Text[[link]Text>>]]]Append["</a>"] |
709 } | |
710 | |
711 Postback@Web Link[in,post data:out,events] | |
712 { | |
713 out <- in | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
714 events <- List[] |
0 | 715 } |
716 | |
717 Name@Web Link[link:name,none] | |
718 { | |
719 none <- link | |
720 } | |
721 | |
722 Set Session@Web Link[link,session:out] | |
723 { | |
724 If[[[[link]Target >>]Slice[7]] = ["http://"]] | |
725 { | |
726 out <- link | |
727 }{ | |
728 If[[session]Use Cookies >>] | |
729 { | |
730 out <- link | |
731 }{ | |
732 out <- [link]Query Params <<[[[link]Query Params >>]Set["session_id", [session]Session ID>>]] | |
733 } | |
734 } | |
735 } | |
736 | |
737 Blueprint Web Table | |
738 { | |
739 Headers | |
740 Data | |
741 } | |
742 | |
47
6202b866d72c
Cleaned up constructor names and merged some other changes in to support the Rhope website
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
743 Web Table[headers,data:out] |
0 | 744 { |
745 out <- [[Build["Web Table"]]Headers <<[headers]]Data <<[data] | |
746 } | |
747 | |
748 Name@Web Table[link:name,none] | |
749 { | |
750 none <- link | |
751 } | |
752 | |
753 Set Session@Web Table[in,session:out] | |
754 { | |
755 out <- in | |
756 } | |
757 | |
758 Postback@Web Table[table,post data:out,events] | |
759 { | |
760 out <- table | |
761 events <- () | |
762 } | |
763 | |
764 Make Header Row[string,header:out] | |
765 { | |
766 out <- [[[string]Append["\t\t\t<th>"]]Append[header]]Append["</th>\n"] | |
767 } | |
768 | |
769 Get Header Row@Web Table[table:out] | |
770 { | |
771 If[[[[table]Headers >>]Length] > [0]] | |
772 { | |
773 out <- [Fold[["Make Header Row"]<String@Worker, "\t\t<tr>\n", [table]Headers >>]]Append["\t\t</tr>\n"] | |
774 }{ | |
775 out <- "" | |
776 } | |
777 } | |
778 | |
779 Make Table Cell[string,cell:out] | |
780 { | |
781 out <- [[[string]Append["\t\t\t<td>"]]Append[[cell]Render]]Append["</td>\n"] | |
782 } | |
783 | |
784 Make Table Row[string,row:out] | |
785 { | |
786 out <- [Fold[["Make Table Cell"]<String@Worker, [string]Append["\t\t<tr>\n"], row]]Append["\t\t</tr>"] | |
787 } | |
788 | |
789 Render@Web Table[table:out,headers] | |
790 { | |
791 out <- [ | |
792 [ | |
793 ["\t<table>\n"]Append[[table]Get Header Row] | |
794 ]Append[ Fold[["Make Table Row"]<String@Worker, "", [table]Data >>] ] | |
795 ]Append["\t</table>\n"] | |
796 } | |
1
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
797 |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
798 Blueprint Web Image |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
799 { |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
800 Source |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
801 Alt |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
802 } |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
803 |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
804 New@Web Image[source,alt:out] |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
805 { |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
806 out <- [[Build["Web Image"]]Source <<[source]]Alt <<[alt] |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
807 } |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
808 |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
809 Name@Web Image[image:name,none] |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
810 { |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
811 name <- [image]Source >> |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
812 } |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
813 |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
814 Set Session@Web Image[in,session:out] |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
815 { |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
816 out <- in |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
817 } |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
818 |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
819 Postback@Web Image[image,post data:out,events] |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
820 { |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
821 out <- image |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
822 events <- () |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
823 } |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
824 |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
825 Render@Web Image[image:out,headers] |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
826 { |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
827 out <- [[[["<img src=\""]Append[[image]Source >>]]Append["\" alt=\""]]Append[[image]Alt >>]]Append["\">"] |
b3f71490858c
Small fixes and enhancements from main windows box
Mike Pavone <pavone@retrodev.com>
parents:
0
diff
changeset
|
828 } |