Commit fa3d214cd4cc77e7aa6f5b5cc0a0361f55bdc1ba

Authored by David RENÉ
1 parent c2a99964

Remove files was mistaken added (.bak, .rej, etc)

obj/unit_test.aproj.FileListAbsolute.txt deleted
1 -D:\Documents and Settings\david\Mes documents\Calexium\icalldroid\xlib\bin\Debug\xml_rpc.unit_test.adm  
2 -D:\Documents and Settings\david\Mes documents\Calexium\icalldroid\xlib\obj\Debug\xml_rpc.unit_test.adm  
web/form.anubis.bak deleted
1 -/*  
2 - * Created by PyramIDE.  
3 - * User: フランスのトトロ  
4 - * Date: 07/12/2014  
5 - * Time: 16:49  
6 - * © David RENÉ  
7 - */  
8 -  
9 -// *************************************************************************************  
10 -// *** Generic form  
11 -// *************************************************************************************  
12 -read tools/basis.anubis  
13 -read system/string.anubis  
14 -read xlib/web/common.anubis  
15 -read xlib/web/web_arg_utils.anubis  
16 -read xlib/web/making_a_web_site.anubis  
17 -read xlib/web/html_tooltip.anubis  
18 -read xlib/web/widgets.anubis  
19 -read xlib/web/widgets/specialized_elements.anubis  
20 -  
21 -public type Mandatory: // used to mark fields as mandatory.  
22 - mandatory,  
23 - non_mandatory.  
24 -  
25 -public type Width:  
26 - small, //10 char  
27 - narrow_small, //20 char  
28 - narrow, //50 char  
29 - wide, //70 char  
30 - custom(Int).  
31 -  
32 -public type FormFieldWidth:  
33 - auto,  
34 - custom(Int).  
35 -  
36 -public type CXM_Form_Field:  
37 - no_field, // empty field  
38 -  
39 - //--- title field ---------------------------------------------------------------------  
40 - title(  
41 - String text  
42 - ),  
43 -  
44 - //--- message field -------------------------------------------------------------------  
45 - message(  
46 - String text  
47 - ),  
48 -  
49 - //--- text input field ----------------------------------------------------------------  
50 - input(  
51 - List(CoreAttrs) options,  
52 - HTML_Label label,  
53 - HTML_Id id,  
54 - WebArgName web_arg_name,  
55 - InitialValue init_value,  
56 - Width width,  
57 - Mandatory mandatory  
58 - ),  
59 -  
60 - input_readonly(  
61 - List(CoreAttrs) options,  
62 - HTML_Label label,  
63 - HTML_Id id,  
64 - WebArgName web_arg_name,  
65 - InitialValue init_value,  
66 - Width width  
67 - ),  
68 -  
69 - //--- text area field -----------------------------------------------------------------  
70 - text_area(  
71 - List(TextAreaOption) options,  
72 - HTML_Label label,  
73 - HTML_Id id,  
74 - WebArgName web_arg_name,  
75 - InitialValue init_value,  
76 - Width width,  
77 - Int height,  
78 - Mandatory mandatory  
79 - ),  
80 -  
81 - //--- password input field ------------------------------------------------------------  
82 - password_input(  
83 - List(CoreAttrs) options,  
84 - HTML_Label label,  
85 - HTML_Id id,  
86 - WebArgName web_arg_name,  
87 - InitialValue init_value,  
88 - Width width,  
89 - Mandatory mandatory),  
90 -  
91 - //--- phone field ------------------------------------------------------------  
92 - phone_input(  
93 - Maybe(List(CoreAttrs)) sms_icon_options, //if there is sms available it's success with the options (generally the js call to edit sms)  
94 - List(CoreAttrs) phone_icon_options,  
95 - List(CoreAttrs) text_options,  
96 - HTML_Label label,  
97 - HTML_Id id,  
98 - WebArgName web_arg_name,  
99 - InitialValue init_value,  
100 - Phone_Type phone_type,  
101 - Width width,  
102 - Mandatory mandatory),  
103 -  
104 - //--- email field ------------------------------------------------------------  
105 - email_input(  
106 - List(CoreAttrs) icon_options,  
107 - List(CoreAttrs) options,  
108 - HTML_Label label,  
109 - HTML_Id id,  
110 - WebArgName web_arg_name,  
111 - InitialValue init_value,  
112 - Width width,  
113 - Mandatory mandatory),  
114 -  
115 - //--- url field ------------------------------------------------------------  
116 - url_input(  
117 - List(CoreAttrs) icon_options,  
118 - List(CoreAttrs) options,  
119 - HTML_Label label,  
120 - HTML_Id id,  
121 - WebArgName web_arg_name,  
122 - InitialValue init_value,  
123 - Width width,  
124 - Mandatory mandatory),  
125 -  
126 - //--- hidden field ------------------------------------------------------------  
127 - hidden(  
128 - HTML_Id id,  
129 - WebArgName web_arg_name,  
130 - WebArgValue init_value  
131 - ),  
132 - //--- explanation field ---------------------------------------------------------------  
133 - explain(  
134 - String text  
135 - ),  
136 -  
137 - //--- selector field ------------------------------------------------------------------  
138 - selector(  
139 - List(CoreAttrs) options,  
140 - HTML_Label label,  
141 - HTML_Id id,  
142 - WebArgName web_arg_name,  
143 - Int size,  
144 - List(String) items,  
145 - Maybe(InitialValue) selected,  
146 - Mandatory mandatory  
147 - ),  
148 -  
149 - selector_c(  
150 - List(CoreAttrs) options,  
151 - HTML_Label label,  
152 - HTML_Id id,  
153 - WebArgName web_arg_name,  
154 - Int size,  
155 - List((List(CoreAttrs), WebArgValue, String)) items,  
156 - Maybe(InitialValue) selected,  
157 - Mandatory mandatory  
158 - ),  
159 -  
160 - selector_hide_show (List(CoreAttrs) options,  
161 - HTML_Label label,  
162 - HTML_Id id,  
163 - WebArgName web_arg_name,  
164 - Int size,  
165 - List((List(CoreAttrs), WebArgValue, String, HTML_Partial_Content)) items,  
166 - Maybe(InitialValue) selected,  
167 - Mandatory mandatory),  
168 -  
169 - //--- checkbox field ------------------------------------------------------------------  
170 - checkbox (List(CoreAttrs) options,  
171 - HTML_Label label,  
172 - HTML_Id id,  
173 - WebArgName web_arg_name,  
174 - Bool checked,  
175 - Mandatory mandatory),  
176 -  
177 - // the same one, but with the tag on the right of the checkbox  
178 - checkboxr(  
179 - List(CoreAttrs) options,  
180 - HTML_Label label,  
181 - HTML_Id id,  
182 - WebArgName web_arg_name,  
183 - Bool checked,  
184 - Mandatory mandatory  
185 - ),  
186 -  
187 - //checkbox_hide_show  
188 - checkbox_hide_show(  
189 - List(CoreAttrs) options,  
190 - HTML_Label label,  
191 - WebArgName web_arg_name,  
192 - Bool checked,  
193 - List(CXM_Form_Field) fields  
194 - ),  
195 -  
196 - //--- radio-button field --------------------------------------------------------------  
197 - radio_button(  
198 - List(CoreAttrs) options,  
199 - HTML_Label label,  
200 - HTML_Id id,  
201 - WebArgName web_arg_name,  
202 - WebArgValue web_arg_value,  
203 - Bool checked,  
204 - Mandatory mandatory  
205 - ),  
206 - //radio_button_hide_show  
207 - radio_button_hide_show(  
208 - List(CoreAttrs) options,  
209 - HTML_Label label,  
210 - WebArgName web_arg_name,  
211 - WebArgValue web_arg_value,  
212 - Bool checked,  
213 - List(CXM_Form_Field) fields  
214 - ),  
215 - // the same one, but with the tag on the right of the radio_button  
216 - radio_buttonr (List(CoreAttrs) options,  
217 - HTML_Label label,  
218 - HTML_Id id,  
219 - WebArgName web_arg_name,  
220 - WebArgValue web_arg_value,  
221 - Bool checked,  
222 - Mandatory mandatory),  
223 -  
224 - radio_button_list(  
225 - List(CoreAttrs) options,  
226 - HTML_Label label,  
227 - HTML_Id id,  
228 - WebArgName web_arg_name,  
229 - List((WebArgValue, String)) web_arg_value,  
230 - Maybe(InitialValue) selected,  
231 - Mandatory mandatory,  
232 - Bool is_wide),  
233 -  
234 -// //--- fields table --------------------------------------------------------------------  
235 -// fields_table (String tag,  
236 -// List(FormField) fields),  
237 -//  
238 -// //--- fields line ---------------------------------------------------------------------  
239 -// fields_line (String tag,  
240 -// List(FormField) fields),  
241 - one_line_fields (List(CXM_Form_Field) fields),  
242 -  
243 -//  
244 -// //--- preview field -------------------------------------------------------------------  
245 -// preview (String html_text),  
246 -  
247 - //--- upload field -------------------------------------------------------------------  
248 - upload (List(CoreAttrs) options,  
249 - HTML_Label label,  
250 - HTML_Id id,  
251 - WebArgName name,  
252 - Width width,  
253 - Mandatory mandatory),  
254 -  
255 - raw_in_form (HTML_Off_Form html),  
256 - label_for ( String label,  
257 - HTML_Id id,  
258 - HTML_Off_Form input),  
259 - div (List(CoreAttrs), List(HTML_Off_Form) contents),  
260 - div (List(CoreAttrs), List(CXM_Form_Field) fields),  
261 - partial (HTML_Partial_Content p_content),  
262 - br,  
263 - hr (List(CoreAttrs) options),  
264 -// input_with_help (CXM_Form_Field field,  
265 -// Maybe(String) help_title,  
266 -// String help_text,  
267 -// Int width),  
268 -  
269 - fieldset (List(CoreAttrs) options,  
270 - String legend,  
271 - List(CXM_Form_Field) fields),  
272 -  
273 - blank_space,  
274 - blank_space (HtmlClass class),  
275 -  
276 - //--- submit button -------------------------------------------------------------------  
277 - submit (List(CoreAttrs) options,  
278 - HtmlClass class,  
279 - WEB_Action_Name action_name,  
280 - Maybe(String) label,  
281 - String button_text,  
282 - List((String,String)) extra_operands),  
283 - empty.  
284 -  
285 -// //////////////////////////////////////////////  
286 -// Alternate constructors:  
287 -  
288 -public define CXM_Form_Field  
289 - fieldset  
290 - (  
291 - HTML_Id fieldSetId,  
292 - List(CXM_Form_Field) fields  
293 - ) =  
294 - fieldset([id(fieldSetId.id)], "", fields).  
295 -  
296 -public define CXM_Form_Field  
297 - fieldset  
298 - (  
299 - List(CXM_Form_Field) fields  
300 - ) =  
301 - fieldset([], "", fields).  
302 -  
303 -public define CXM_Form_Field  
304 - fieldset  
305 - (  
306 - String legend,  
307 - List(CXM_Form_Field) fields  
308 - ) =  
309 - fieldset([], legend, fields).  
310 -  
311 -public define CXM_Form_Field  
312 - input(WebArgName n, InitialValue init_value, Width width)  
313 - = input([], no_label, html_Id(n.name), n, init_value, width, non_mandatory).  
314 -  
315 -public define CXM_Form_Field  
316 - input(HTML_Label label, WebArgName n, InitialValue init_value, Width width)  
317 - = input([], label, html_Id(n.name), n, init_value, width, non_mandatory).  
318 -  
319 -public define CXM_Form_Field  
320 - input(HTML_Label label, WebArgName n, InitialValue init_value, Width width, Mandatory mand)  
321 - = input([], label, html_Id(n.name), n, init_value, width, mand).  
322 -  
323 -public define CXM_Form_Field  
324 - input(HTML_Label label, HTML_Id id, WebArgName n, InitialValue init_value, Width width, Mandatory mand)  
325 - = input([], label, id, n, init_value, width, mand).  
326 -  
327 -public define CXM_Form_Field  
328 - input(List(CoreAttrs) options, HTML_Label label, WebArgName n, InitialValue init_value, Width width, Mandatory mand)  
329 - = input(options, label, html_Id(n.name), n, init_value, width, mand).  
330 -  
331 -public define CXM_Form_Field  
332 - input_readonly(HTML_Label label, WebArgName n, InitialValue init_value, Width width)  
333 - = input_readonly([], label, html_Id(n.name), n, init_value, width).  
334 -  
335 -public define CXM_Form_Field  
336 - password_input(HTML_Label label, WebArgName n, InitialValue init_value, Width width, Mandatory mand)  
337 - = password_input([], label, html_Id(n.name), n, init_value, width, mand).  
338 -  
339 -public define CXM_Form_Field  
340 - checkbox(HTML_Label label, WebArgName n, Bool checked, Mandatory mand)  
341 - = checkbox([], label, html_Id(n.name), n, checked, mand).  
342 -  
343 -public define CXM_Form_Field  
344 - checkboxr(HTML_Label label, WebArgName n, Bool checked, Mandatory mand)  
345 - = checkboxr([], label, html_Id(n.name), n, checked, mand).  
346 -  
347 -public define CXM_Form_Field  
348 - radio_button(HTML_Label label, WebArgName n, WebArgValue value, Bool checked, Mandatory mand)  
349 - = radio_button([], label, html_Id(n.name), n, value, checked, mand).  
350 -  
351 -public define CXM_Form_Field  
352 - radio_buttonr(HTML_Label label, WebArgName n, WebArgValue value, Bool checked, Mandatory mand)  
353 - = radio_buttonr([], label, html_Id(n.name), n, value, checked, mand).  
354 -  
355 -public define CXM_Form_Field  
356 - submit(WEB_Action_Name action_name, HtmlClass class, Maybe(String) label, String button_text, List((String,String)) extra_operands)  
357 - = submit([], class, action_name, label, button_text, extra_operands).  
358 -  
359 -public define CXM_Form_Field  
360 - submit(WEB_Action_Name action_name, Maybe(String) label, String button_text, List((String,String)) extra_operands)  
361 - = submit([], htmlClass(""), action_name, label, button_text, extra_operands).  
362 -  
363 -public define CXM_Form_Field  
364 - submit(WEB_Action_Name action_name, Maybe(String) label, String button_text)  
365 - = submit([], htmlClass(""), action_name, label, button_text, []).  
366 -  
367 -public define CXM_Form_Field //Helper for older project wich use only String as Action name  
368 - submit(String _action_name, Maybe(String) label, String button_text, List((String,String)) extra_operands)  
369 - = submit([], htmlClass(""), action_name(_action_name), label, button_text, extra_operands).  
370 -  
371 -  
372 -public define CXM_Form_Field  
373 - upload(HTML_Label label, HTML_Id id, WebArgName name, Width width)  
374 - = upload([], label, id, name, width, non_mandatory).  
375 -  
376 -public define CXM_Form_Field  
377 - upload(HTML_Label label, HTML_Id id, WebArgName name, Width width, Mandatory mand)  
378 - = upload([], label, id, name, width, mand).  
379 -  
380 -public define CXM_Form_Field  
381 - ip_input  
382 - (  
383 - String label,  
384 - HTML_Id id,  
385 - WebArgName wan_prefix,  
386 - String ip  
387 - )=  
388 - label_for(  
389 - label,  
390 - id,  
391 - ip_input(id, wan_prefix, ip)  
392 - ).  
393 -  
394 -  
395 -public define CXM_Form_Field  
396 - partial_ip_input  
397 - (  
398 - String label,  
399 - HTML_Id id,  
400 - WebArgName wan_prefix,  
401 - List(String) ip_fixed_part,  
402 - String ip  
403 - )=  
404 - label_for(  
405 - label,  
406 - id,  
407 - partial_ip_input(id, wan_prefix, ip_fixed_part, ip)  
408 - ).  
409 -  
410 -public define CXM_Form_Field  
411 - hidden  
412 - (  
413 - WebArgName web_arg_name,  
414 - WebArgValue value  
415 - )=  
416 - hidden(html_Id(""), web_arg_name, value).  
417 -  
418 -public define CXM_Form_Field  
419 - hr  
420 - =  
421 - hr([])  
422 -.  
423 -  
424 -public define CXM_Form_Field  
425 - div  
426 - (  
427 - List(CoreAttrs) attrs,  
428 - HTML_Off_Form content  
429 - )=  
430 - div(attrs, [content])  
431 -.  
432 -  
433 -public define CXM_Form_Field  
434 - div  
435 - (  
436 - HTML_Off_Form content  
437 - )=  
438 - div([], [content])  
439 -.  
440 - //--- explanation field ---------------------  
441 -  
442 -// //////////////////////////////////////////////////////////  
443 -  
444 -define (List((List(CoreAttrs), WebArgValue, String)), List(HTML_Partial_Content))  
445 - construct_selector_hide_show  
446 - (  
447 - String div_id,  
448 - List((List(CoreAttrs), WebArgValue, String, HTML_Partial_Content)) items,  
449 - List((List(CoreAttrs), WebArgValue, String)) so_far_1,  
450 - List(HTML_Partial_Content) so_far_2,  
451 - Int n  
452 - ) =  
453 - if items is  
454 - {  
455 - [] then (so_far_1, so_far_2),  
456 - [h . t] then  
457 - since h is (cores, wav, label, content),  
458 - with linked_element = div_id + n,  
459 - construct_selector_hide_show(div_id, t, [([data("linked_element", linked_element) . cores], wav, label) . so_far_1], [ partial_content([], div([id(linked_element), style("display: none")], content)) . so_far_2 ], n + 1)  
460 - }.  
461 -  
462 -define (List((List(CoreAttrs), WebArgValue, String)), List(HTML_Partial_Content))  
463 - construct_selector_hide_show  
464 - (  
465 - String div_id,  
466 - List((List(CoreAttrs), WebArgValue, String, HTML_Partial_Content)) items  
467 - ) = construct_selector_hide_show(div_id, items, [], [], 0).  
468 -  
469 -public define HTML_Off_Form  
470 - format_div_CXM_Form_Field  
471 - (  
472 - List(CXM_Form_Field) field,  
473 - List(Web_arg) lwa,  
474 - String _class,  
475 - Bool b_with_label  
476 - ).  
477 -  
478 -  
479 -public define HTML_Off_Form  
480 - format_CXM_Form_Field  
481 - (  
482 - CXM_Form_Field ff, //CXM_Form_Field to format  
483 - List(Web_arg) lwa, //web arguments of the session, can be useful for the current drawing  
484 - String _class,  
485 - Bool b_with_label //if false, no need to show/generate label  
486 - ) =  
487 - with star = (HTML_Label l, Mandatory m)  
488 - |->  
489 - (HTML_Label)  
490 - if b_with_label then  
491 - if m is  
492 - {  
493 - mandatory then  
494 - if l is  
495 - {  
496 - no_label then l,  
497 - label(str, help) then label(str + "<span>*</span>", help),  
498 - }  
499 - non_mandatory then l  
500 - }  
501 - else  
502 - no_label  
503 - ,  
504 - pixels = (Width width)  
505 - |->  
506 - if width is  
507 - {  
508 - small then 10,  
509 - narrow_small then 20,  
510 - narrow then 50,  
511 - wide then 70,  
512 - custom(n) then n  
513 - },  
514 -  
515 -  
516 - if ff is  
517 - {  
518 - no_field then empty,  
519 -  
520 - title(t) then h3(t),  
521 -  
522 - message(t) then literal(t),  
523 -  
524 - input(options, _label, id, wan, default, w, mand) then  
525 - text_input([class("in") . options], star(_label, mand), id, wan, init(get_String(lwa, wan.name, default.value)), pixels(w)),  
526 -  
527 - input_readonly(options, _label, id, name, init, w) then  
528 - text_input_ro([class("in") . options], _label, id, name, init, pixels(w)),  
529 -  
530 - text_area(options, _label, id, wan, default, w, height, mand) then  
531 - text_area([input_attrs([class("in")]) . options], star(_label, mand), id, wan, init(get_String(lwa, wan.name, default.value)), pixels(w), height),  
532 -  
533 - password_input(options, _label, id, name, init, w, mand) then  
534 - password_input([class("in") . options], star(_label, mand), id, name, init, pixels(w)),  
535 -  
536 - phone_input(mb_sms_options, icon_options, options, _label, _id, wan, default, phone_type, w, mand) then  
537 - sequence([  
538 - if mb_sms_options is  
539 - {  
540 - failure then empty,  
541 - success(sms_options) then img([event(onmouseover, "/icons/16x16/send_sms.png")]+sms_options, "/icons/16x16/sms.png")  
542 - },  
543 - img(icon_options, "/icons/16x16/"+to_Icon(phone_type)),  
544 - input([class("in"), id(_id.id), name(wan.name), init(get_String(lwa, wan.name, default.value)), size(pixels(w)). options]),  
545 - ]),  
546 -  
547 - email_input(icon_options, options, _label, id, wan, default, w, mand) then  
548 - sequence([  
549 - img(icon_options, "/icons/16x16/email_edit.png"),  
550 - text_input([class("in") . options], star(_label, mand), id, wan, init(get_String(lwa, wan.name, default.value)), pixels(w)),  
551 - ]),  
552 -  
553 - url_input(icon_options, options, _label, id, wan, default, w, mand) then  
554 - sequence([  
555 - img(icon_options, "/icons/16x16/url.png"),  
556 - text_input([class("in") . options], star(_label, mand), id, wan, init(get_String(lwa, wan.name, default.value)), pixels(w)),  
557 - ]),  
558 -  
559 - hidden(h_id, name, init) then hidden(name, init),  
560 -  
561 - explain(t) then  
562 - div([class("sub")], literal(t)),  
563 -  
564 - selector(options, _label, id, wan, size, items, selected, mand) then  
565 - if selected is  
566 - {  
567 - failure then selector([class("in") . options], star(_label, mand), id, wan, size, items),  
568 - success(default) then selector([class("in") . options], star(_label, mand), id, wan, size, items, init(get_String(lwa, wan.name, default.value))),  
569 - },  
570 -  
571 - selector_c(options, _label, id, wan, size, items, selected, mand) then  
572 - if selected is  
573 - {  
574 - failure then selector_c([class("in") . options], star(_label, mand), id, wan, size, items),  
575 - success(default) then selector_c([class("in") . options], star(_label, mand), id, wan, size, items, init(get_String(lwa, wan.name, default.value))),  
576 - },  
577 -  
578 - selector_hide_show(options, _label, id, wan, size, items_with_partial, selected, mand) then  
579 - with div_id = generate_random_string(15),  
580 - since construct_selector_hide_show(div_id, items_with_partial) is (items, partial_content_list),  
581 - sequence([  
582 - selector_c([class("in"), class("cxm_selector_hide_show"), event(onchange, "select_hide_show('" + div_id + "', this);")], star(_label, mand), id, wan, size, reverse(items), if selected is { failure then init(""), success(default) then init(get_String(lwa, wan.name, default.value)) } ),  
583 - partial(partial_content(partial_content_list))  
584 - ]),  
585 -  
586 - checkbox(options, _label, id, wan, checked, mand) then  
587 - check_box([class("in") . options], star(_label, mand), id, wan, get_Bool(lwa, wan.name, checked)),  
588 -  
589 - checkboxr(options, _label, id, wan, checked, mand) then  
590 - check_box_r([class("in") . options], star(_label, mand), id, wan, get_Bool(lwa, wan.name, checked)),  
591 -  
592 - checkbox_hide_show(options, _label, wan, checked, fields) then  
593 - with div_id = generate_random_string(15),  
594 - sequence([  
595 - check_box([data("show_id", div_id), class("in cxm_checkbox_hide_show"), event(onclick, "checked_hide_show_element('"+div_id+"', this);")], _label, html_Id("checkbox_"+div_id), wan, get_Bool(lwa, wan.name, checked)),  
596 - div([id(div_id), style("display:"+if checked then "block" else "none")], format_div_CXM_Form_Field(fields, lwa, _class, b_with_label))  
597 - ]),  
598 -  
599 - radio_button(options, _label, id, wan, val, checked, mand) then  
600 - radio_button([class("in"), event(onclick, "radio_hide_show_group('"+wan.name+"', this);") . options], star(_label, mand), id, wan, val, get_Bool(lwa, wan.name, checked)),  
601 -  
602 - radio_button_hide_show(options, _label, wan, val, checked, fields) then  
603 - with div_id = generate_random_string(15),  
604 - sequence([  
605 - radio_button([data("show_id", div_id), class("in"), class("cxm_radio_hide_show"), event(onclick, "radio_hide_show_group('"+wan.name+"', this);")], _label, html_Id("radio_button_hide_show_"+div_id), wan, val, get_Bool(lwa, wan.name, checked)),  
606 - div([id(div_id), style("display:"+if checked then "block" else "none")], format_div_CXM_Form_Field(fields, lwa, _class, b_with_label))  
607 - ]),  
608 -  
609 - radio_buttonr(options, _label, id, wan, val, checked, mand) then  
610 - radio_button_r([class("in") . options], star(_label, mand), id, wan, val, get_Bool(lwa, wan.name, checked)),  
611 -  
612 - radio_button_list (options, _label, id, wan, items, selected, mand, wide) then  
613 - with new_selected =  
614 - if get_String(lwa, wan.name) is  
615 - {  
616 - failure then selected,  
617 - success(value) then success(init(value))  
618 - },  
619 -  
620 - sequence([  
621 - //literal("<label for=\"" + wan.name + "\">" + label + star(_label, mand) + "</label>"),  
622 - div( [class("radiolist")], sequence(  
623 - with i = var((Int)-1),  
624 - itemclass = if wide then "radiolistitem_wide" else "radiolistitem",  
625 - map( ((WebArgValue, String) item) |->  
626 - i <- *i + 1;  
627 - if item is (wav, item_label) then  
628 - with _id = if id is html_Id(the_id) then html_Id(the_id + "_radio_" + *i),  
629 - div([class(itemclass)], radio_button_r(options, label(item_label), _id, wan, wav,  
630 - if new_selected is success(v) then wav.value = v.value else false)),  
631 - items))  
632 - ),  
633 - ]),  
634 - one_line_fields(fields) then  
635 - table([nude, class("form_one_line")],[row([],  
636 - map((CXM_Form_Field ff2) |-> cell([],format_CXM_Form_Field(ff2, lwa, _class, b_with_label)),fields))])  
637 - ,  
638 -  
639 - upload(options, _label, id, name, w, mand) then  
640 - file_upload([class("in") . options], star(_label, mand), id, name, pixels(w)),  
641 -  
642 - raw_in_form(html) then html,  
643 -// div([class("in")], html),  
644 - label_for(label, id, input) then  
645 - sequence([  
646 - if id is html_Id(_id) then  
647 - literal("<label for=\"" + _id + "\">" + label + "</label>"),  
648 - input  
649 - ]),  
650 -  
651 - div(options, e) then div(options, e),  
652 - div(options, fields)then div(options, format_div_CXM_Form_Field(fields, lwa, _class, b_with_label)),  
653 - partial(p_content) then partial(p_content),  
654 - br then br,  
655 - hr(opts) then hr(opts),  
656 -// input_with_help(input, help_title, help_text, width) then  
657 -// sequence([  
658 -// format_CXM_Form_Field(input, lwa, html_tooltip(force_String(help_title), help_text, width)),  
659 -// ]),  
660 -  
661 - fieldset(options, legend, fields) then  
662 - sequence([  
663 - literal("<fieldset" + format_attrs(options) + ">"),  
664 - literal(if length(legend) > 0 then "<legend>" + legend + "</legend>" else ""),  
665 - format_div_CXM_Form_Field(fields, lwa, _class, b_with_label),  
666 - literal("</fieldset>")  
667 - ]),  
668 -  
669 - blank_space then  
670 - div([class("blank_space")], literal("&nbsp")),  
671 -  
672 - blank_space(htmlClass) then  
673 - div([class(htmlClass.class)], literal("&nbsp")),  
674 -  
675 - submit(attrs, htmlClass, action_name, Maybe(String) mb_label, button_text, extra_operands) then  
676 - actioner( same, // TODO change this to allow external URL  
677 - if mb_label is  
678 - {  
679 - failure then same,  
680 - success(n) then same(n)  
681 - },  
682 - submit(attrs + [class(htmlClass.class + " cxm_submit")], button_text),  
683 - action_name,  
684 - extra_operands  
685 - ),  
686 - empty then literal("")  
687 - }.  
688 -  
689 -  
690 -public define HTML_Off_Form  
691 - format_div_CXM_Form_Field  
692 - (  
693 - List(CXM_Form_Field) fields,  
694 - List(Web_arg) lwa,  
695 - String _class,  
696 - Bool b_with_label  
697 - )=  
698 - //println("format_div_CXM_Form_Field");  
699 - sequence( map((CXM_Form_Field field)  
700 - |->  
701 - //with css_line = if line = 0 then " odd_line" else " even_line",  
702 - //println("class "+css_line+" line "+line);  
703 - if field is empty then  
704 - empty  
705 - else if field is no_field then  
706 - empty  
707 - else if field is hidden(_id, name, init) then  
708 - format_CXM_Form_Field(field, lwa, _class, b_with_label)  
709 - else if field is br then  
710 - format_CXM_Form_Field(field, lwa, _class, b_with_label)  
711 - else if field is text_area(options, _label, id, wan, default, w, height, mand) then  
712 - div([class(_class)], format_CXM_Form_Field(field, lwa, _class, b_with_label))  
713 - else  
714 - div([class(_class)], format_CXM_Form_Field(field, lwa, _class, b_with_label))  
715 - , fields))  
716 -.  
717 -  
718 -public define HTML_Off_Form  
719 - to_HTML_Off_Form  
720 - (  
721 - List(CXM_Form_Field) fields,  
722 - List(Web_arg) lwa,  
723 - String _class,  
724 - Bool b_with_label  
725 - )=  
726 - format_div_CXM_Form_Field(fields, lwa, _class, b_with_label)  
727 -.  
728 -  
729 -public define HTML_Off_Form  
730 - to_HTML_Off_Form  
731 - (  
732 - List(CXM_Form_Field) fields,  
733 - String _class,  
734 - Bool b_with_label  
735 - )=  
736 - to_HTML_Off_Form(fields, [], _class, b_with_label).  
737 -  
738 -public define HTML_Off_Form  
739 - to_HTML_Off_Form  
740 - (  
741 - List(CXM_Form_Field) fields,  
742 - List(Web_arg) lwa  
743 - )=  
744 - to_HTML_Off_Form(fields, lwa, "form_field aligned", true)  
745 -.  
746 -  
747 -public define HTML_Off_Form  
748 - to_HTML_Off_Form  
749 - (  
750 - CXM_Form_Field field,  
751 - List(Web_arg) lwa  
752 - )=  
753 - to_HTML_Off_Form([field], lwa, "form_field aligned", true)  
754 -.  
755 -  
756 -public define HTML_Off_Form  
757 - to_HTML_Off_Form  
758 - (  
759 - List(CXM_Form_Field) fields  
760 - )=  
761 - to_HTML_Off_Form(fields, [], "form_field aligned", true)  
762 -.  
763 -  
764 -public define HTML_Off_Form  
765 - cxm_form  
766 - (  
767 - HTML_Id form_Id,  
768 - List(CoreAttrs) options,  
769 - WEB_Action_Name action,  
770 - List((String,String)) extra_ops,  
771 - List(Web_arg) lwa,  
772 - List(CXM_Form_Field) fields,  
773 - String _class,  
774 - Bool b_with_label  
775 - ) =  
776 - form(  
777 - //form_Id,  
778 - [class("cxm_form"), id(form_Id.id) . options],  
779 - action,  
780 - extra_ops,  
781 - format_div_CXM_Form_Field(fields, lwa, _class, b_with_label)  
782 - ).  
783 -  
784 -public define HTML_Off_Form  
785 -/* older manner to call CXM_form with action as String.  
786 - * this function only exists for compatibility with older projects. Please consider  
787 - * to use the above function with WEB_Action_Name instead of String  
788 -*/  
789 - cxm_form  
790 - (  
791 - HTML_Id form_Id,  
792 - List(CoreAttrs) options,  
793 - String action, //older manner to call action with String  
794 - List((String,String)) extra_ops,  
795 - List(Web_arg) lwa,  
796 - List(CXM_Form_Field) fields,  
797 - String _class,  
798 - Bool b_with_label  
799 - ) =  
800 -  
801 - form(  
802 - //form_Id,  
803 - [class("cxm_form"), id(form_Id.id) . options],  
804 - action_name(action),  
805 - extra_ops,  
806 - format_div_CXM_Form_Field(fields, lwa, _class, b_with_label)  
807 - ).  
808 -  
809 -public define HTML_Off_Form  
810 - cxm_form  
811 - (  
812 - String form_name,  
813 - List(CoreAttrs) options,  
814 - WEB_Action_Name action,  
815 - List((String,String)) extra_ops,  
816 - List(Web_arg) lwa,  
817 - List(CXM_Form_Field) form_fields,  
818 - String _class,  
819 - Bool b_with_label  
820 - )=  
821 - cxm_form(html_Id(form_name), options, action, extra_ops, lwa, form_fields, _class, b_with_label).  
822 -  
823 -public define HTML_Off_Form  
824 - cxm_form  
825 - (  
826 - String form_name,  
827 - List(CoreAttrs) options,  
828 - WEB_Action_Name action,  
829 - List((String,String)) extra_ops,  
830 - List(Web_arg) lwa,  
831 - List(CXM_Form_Field) form_fields  
832 - )=  
833 - cxm_form(form_name, options, action, extra_ops, lwa, form_fields, "form_field aligned", true)  
834 -.  
835 -  
836 -public define HTML_Off_Form  
837 - cxm_form  
838 - (  
839 - String form_name,  
840 - List(CoreAttrs) options,  
841 - String action,  
842 - List((String,String)) extra_ops,  
843 - List(Web_arg) lwa,  
844 - List(CXM_Form_Field) form_fields,  
845 -  
846 - Bool b_with_label  
847 - )=  
848 - cxm_form(html_Id(form_name), options, action_name(action), extra_ops, lwa, form_fields, "form_field aligned", b_with_label)  
849 -.  
850 -  
851 -public define HTML_Off_Form  
852 - cxm_form  
853 - (  
854 - String form_name,  
855 - List(CoreAttrs) options,  
856 - String action,  
857 - List((String,String)) extra_ops,  
858 - List(Web_arg) lwa,  
859 - List(CXM_Form_Field) form_fields  
860 - )=  
861 - cxm_form(html_Id(form_name), options, action_name(action), extra_ops, lwa, form_fields, "form_field aligned", true)  
862 -.  
863 -  
864 -public define HTML_Off_Form  
865 - cxm_form  
866 - (  
867 - String form_id,  
868 - List(CoreAttrs) options,  
869 - List(HTML_Off_Form) fields,  
870 - String _class  
871 - ) =  
872 - cxm_form(html_Id(form_id), options, action_name(""), [], [], map((HTML_Off_Form field) |-> raw_in_form(field), fields), _class, true )  
873 -.  
874 -  
875 -public define HTML_Off_Form  
876 - cxm_form  
877 - (  
878 - String form_id,  
879 - List(CoreAttrs) options,  
880 - List(HTML_Off_Form) fields  
881 - ) =  
882 - cxm_form(options, action_name(""), [], [], map((HTML_Off_Form field) |-> raw_in_form(field), fields), "form_field aligned", true )  
883 -.  
884 -  
885 -public define HTML_Off_Form  
886 - cxm_form  
887 - (  
888 - String form_id,  
889 - List(CoreAttrs) options,  
890 - List(Web_arg) lwa,  
891 - List(CXM_Form_Field) fields,  
892 - String _class,  
893 - Bool b_with_label  
894 - ) =  
895 - cxm_form(html_Id(form_id), options, action_name(""), [], lwa, fields, _class, b_with_label).  
896 -  
897 -public define HTML_Off_Form  
898 - cxm_form  
899 - (  
900 - String form_id,  
901 - List(HTML_Off_Form) fields,  
902 - String _class  
903 - ) =  
904 - cxm_form(html_Id(form_id), [], action_name(""), [], [], map((HTML_Off_Form field) |-> raw_in_form(field), fields), _class, true ).  
905 -  
906 -public define HTML_Off_Form  
907 - cxm_form  
908 - (  
909 - String form_id,  
910 - List(Web_arg) lwa,  
911 - List(CXM_Form_Field) fields,  
912 - String _class  
913 - ) =  
914 - cxm_form(form_id, [], lwa, fields, _class, true).  
915 -  
916 -public define HTML_Off_Form  
917 - cxm_form  
918 - (  
919 - String form_id,  
920 - List(Web_arg) lwa,  
921 - List(CXM_Form_Field) fields,  
922 - ) =  
923 - cxm_form(form_id, [], lwa, fields, "form_field aligned", true).  
924 -  
925 -public define HTML_Off_Form  
926 - cxm_form  
927 - (  
928 - String form_id,  
929 - List(CoreAttrs) options,  
930 - List(CXM_Form_Field) fields,  
931 - ) =  
932 - cxm_form(form_id, options, [], fields, "form_field aligned", true).  
933 -  
934 -public define HTML_Off_Form  
935 - cxm_form  
936 - (  
937 - String form_id,  
938 - List(CXM_Form_Field) fields,  
939 - String _class  
940 - ) =  
941 - cxm_form(html_Id(form_id), [], action_name(""), [], [], fields, _class, true).  
942 -  
943 -public define HTML_Off_Form  
944 - cxm_form  
945 - (  
946 - String form_id,  
947 - List(CXM_Form_Field) fields  
948 - ) =  
949 - cxm_form(html_Id(form_id), [], action_name(""), [], [], fields, "form_field aligned", true).  
web/form.anubis.rej deleted
1 -diff a/web/form.anubis b/web/form.anubis (rejected hunks)  
2 -@@ -521,7 +521,6 @@  
3 -  
4 - message(t) then literal(t),  
5 -  
6 -- input(options, _label, id, wan, default, w, mand) then  
7 - input(options, _label, _id, _name, default, w, mand) then  
8 - sequence([  
9 - input([class("in"), options], name(_name.name), value(get_String(lwa, wan.name, default.value)), size(pixels(w)) . options], star(_label, mand)),  
web/making_a_web_site.anubis.bak deleted
1 -  
2 -  
3 - *Project* Anubis  
4 -  
5 - *Title* Making interactive Web sites.  
6 -  
7 - *Copyright* Copyright (c) Alain Prouté 2004-2005.  
8 - Copyright (c) Calexium 2007-2017.  
9 - Copyright (c) David René 2007-2021.  
10 -  
11 -  
12 - *Authors* Alain Prouté  
13 - David René  
14 - Jérémy Larrieu  
15 - Julien Verneuil  
16 -  
17 -  
18 - *Revised* May 2015  
19 -  
20 -  
21 - *Overview*  
22 -  
23 - In this file we propose simple tools for making well structured interactive and secured  
24 - web sites.  
25 -  
26 -  
27 - ----------------------------------- Table of Contents ---------------------------------  
28 -  
29 - * (1) Structure of a web site.  
30 - ** (1.1) Three sorts of data.  
31 - ** (1.2) How requests are handled.  
32 - ** (1.3) What web pages are made of.  
33 - ** (1.4) Actions.  
34 - ** (1.5) States.  
35 -  
36 - * (2) Carrying on.  
37 - ** (2.1) Describing your web sites.  
38 - ** (2.2) Directories on the server's disk.  
39 - ** (2.3) Starting your web sites.  
40 -  
41 - * (3) The HTML interface.  
42 - ** (3.1) Types used by the HTML interface.  
43 - ** (3.2) ``in form'' versus ``off form''.  
44 - ** (3.3) Defining your own style.  
45 - ** (3.4) Actioners and forms.  
46 - ** (3.5) Local popup.  
47 -  
48 - ---------------------------------------------------------------------------------------  
49 -  
50 -  
51 -transmit tools/basis.anubis  
52 -read tools/printable_tree.anubis  
53 -read tools/base64.anubis  
54 -read tools/random.anubis  
55 -read tools/avlt_dictionaries.anubis  
56 -read system/lists.anubis  
57 -read system/string.anubis  
58 -read system/logger.anubis  
59 -transmit xlib/web/common.anubis  
60 -transmit xlib/web/multihost_http_server.anubis  
61 -read web/mime.anubis  
62 -  
63 -read xlib/web/cookies.anubis  
64 -read xlib/web/json.anubis  
65 -transmit xlib/web/web_dump.anubis  
66 -transmit xlib/web/web_arg_utils.anubis  
67 -transmit xlib/web/web_session.anubis  
68 -transmit xlib/web/web_action.anubis  
69 -  
70 -transmit xlib/web/types/web_action_name.anubis  
71 -transmit xlib/web/types/making_a_web_site.anubis  
72 -  
73 -//TODO move anywhere  
74 -  
75 -  
76 -define List(Word8)  
77 -/** Test for HTML entity which must be encoded  
78 - * and return the encoded entity if needed  
79 - */  
80 - get_entity  
81 - (  
82 - Word8 _char,  
83 - List(Word8) tail  
84 - )=  
85 - //test for the ampersand  
86 - if _char = '&' then  
87 - //test if it's already an encoded string like &amp; &lt; etc. In that case we do nothing  
88 - if insensitive_equal(['&','a','m','p',';'], tail, 0) then [_char]  
89 - else if insensitive_equal(['&','l','t',';'], tail, 0) then [_char]  
90 - else if insensitive_equal(['&','g','t',';'], tail, 0) then [_char]  
91 - else if insensitive_equal(['&','q','u','o','t',';'], tail, 0) then [_char]  
92 - else  
93 - [';','p','m','a','&']  
94 - //test for '<' etc.  
95 - else if _char = '<' then [';','t','l','&']  
96 - else if _char = '>' then [';','t','g','&']  
97 - else if _char = '\"' then [';','t','o','u','q','&']  
98 - else [_char]  
99 -.  
100 -  
101 -define String  
102 - _HTML_encode_entities  
103 - (  
104 - List(Word8) source,  
105 - List(Word8) current  
106 - )=  
107 - if source is  
108 - {  
109 - [] then implode(reverse(current)),  
110 - [c . t] then  
111 - _HTML_encode_entities(t, get_entity(c, t) + current)  
112 - }  
113 -.  
114 -  
115 -public define String  
116 - encode_HTML_entities  
117 - (  
118 - String source  
119 - )=  
120 - _HTML_encode_entities(explode(source), [])  
121 -.  
122 -  
123 -define List(Word8)  
124 -/** Test for HTML entity which must be encoded  
125 - * and return the encoded entity if needed  
126 - */  
127 - get_entity_quote  
128 - (  
129 - Word8 _char,  
130 - List(Word8) tail  
131 - )=  
132 - //test for the ampersand  
133 - if _char = '&' then  
134 - //test if it's already an encoded string like &amp; &lt; etc. In that case we do nothing  
135 - if insensitive_equal(['&','a','m','p',';'], tail, 0) then [_char]  
136 - else if insensitive_equal(['&','l','t',';'], tail, 0) then [_char]  
137 - else if insensitive_equal(['&','g','t',';'], tail, 0) then [_char]  
138 - else if insensitive_equal(['&','q','u','o','t',';'], tail, 0) then [_char]  
139 - else  
140 - [';','p','m','a','&']  
141 - //test for '"' only.  
142 - else if _char = '\"' then [';','t','o','u','q','&']  
143 - else [_char]  
144 -.  
145 -  
146 -define String  
147 - _HTML_encode_quote  
148 - (  
149 - List(Word8) source,  
150 - List(Word8) current  
151 - )=  
152 - if source is  
153 - {  
154 - [] then implode(reverse(current)),  
155 - [c . t] then  
156 - _HTML_encode_quote(t, get_entity_quote(c, t) + current)  
157 - }  
158 -.  
159 -  
160 -public define String  
161 - encode_HTML_quote  
162 - (  
163 - String source  
164 - )=  
165 - _HTML_encode_quote(explode(source), [])  
166 -.  
167 -  
168 - * (1) Structure of a web site.  
169 -  
170 - First of all we need to explain what a web site should be made of. Ideally, the  
171 - visitor (also called the 'client') should see the web site working as any other  
172 - interactive computer software. So, it should be clear that a 'session' (i.e. a visit  
173 - to the web site, including the consultation of several pages) is some kind of  
174 - conversation between the visitor and the web site, and that the web site should  
175 - maintain a 'current state' of this conversation. At each new request (click) from the  
176 - visitor, this state must be updated. This whole conversation is called a 'session' and  
177 - should not be confused with a single request.  
178 -  
179 -  
180 -  
181 - ** (1.1) Three sorts of data.  
182 -  
183 - All the data needed for putting a web site at work may be dispatched into three  
184 - categories:  
185 -  
186 - 1. Constant data (data that never change). These data may be hard coded into the  
187 - Anubis source files of the web site.  
188 -  
189 - 2. Permanent data (data which always exist independantly of the users connected to  
190 - the web site). These data are normally recorded into data bases.  
191 -  
192 - 3. Session data (data which depend on a particular visitor and which exist only  
193 - during the time he visits the web site). These data are stored into so-called  
194 - 'states'.  
195 -  
196 -  
197 - It is important to determine which data belongs to which category. This is part of your  
198 - design decisions.  
199 -  
200 -  
201 -  
202 - ** (1.2) How requests are handled.  
203 -  
204 - We want to separate the following two functionalities (which are used at each request  
205 - (click) during a single session):  
206 -  
207 - - computing the new state from the previous state and from the client request, and  
208 - updating the data base,  
209 -  
210 - - computing the page to be sent to the client from the new current state and from  
211 - the informations in the data base.  
212 -  
213 -  
214 - The next picture shows the structure we have in mind:  
215 -  
216 -  
217 - request +---------+ HTML page (with state name in cookie)  
218 - .-------------------| client |<--------------.  
219 - | .-----------------| | |  
220 - | | session +---------+ |  
221 - | | in cookie |  
222 - | | | client side  
223 - ............................................................................  
224 - | | | server side  
225 - | | |  
226 - | | .-------------------. |  
227 - | | | previous session | |  
228 - V V V | |  
229 - +---------------+ +---------------+ +--------------+  
230 - | compute state | | server's disk | | compute page |  
231 - +---------------+ +---------------+ +--------------+  
232 - ^ | | ^ ^ ^ ^ ^  
233 - | | | | | | | |  
234 - | | `--------------------+--------------------' | |  
235 - | | new state | | |  
236 - read | `------------------------+--------------------' |  
237 - write | new state name |  
238 - update V |  
239 - +-----------+ |  
240 - | data base |--------------------------------------------'  
241 - +-----------+ read only  
242 -  
243 -  
244 - When the client begins a session, there is no previous state. In this case, a default  
245 - 'initial state' is used instead.  
246 -  
247 - The data base may be updated by 'compute state' box, but should not be update by the  
248 - 'compute page' box. The 'compute page' box should be allowed only to read the data  
249 - base.  
250 -  
251 - In this file, all the above stuff is defined, except the 'compute state' and 'compute  
252 - page' boxes. You just have to provide the function for computing a new state (compute  
253 - state) and the function for computing the page (compute page) from the new state. You  
254 - don't have to worry about state names, saving and retrieving states and the like.  
255 -  
256 -  
257 -  
258 -  
259 -  
260 - ** (1.3) What web pages are made of.  
261 -  
262 - What the client can see in his browser's window may be called a 'page'. Within a page,  
263 - we have several sorts of components:  
264 -  
265 - - 'local' components, i.e. all components which do not open a connection, like  
266 - texts, images, etc... possibly using JavaScript programmation,  
267 -  
268 - - 'actioners', which, when clicked upon, open a connection with our web site; they  
269 - may appear as links or buttons, etc...  
270 -  
271 - - 'foreign links', which when clicked upon, open a connection with another web site  
272 - (or ours eventually).  
273 -  
274 - Of course, what an actioner does is just ask our web site to perform an action. To that  
275 - end, the actioner essentially sends the name of the action to be performed. However, it  
276 - may be necessary to provide additional informations which may be seen as 'operands' of  
277 - the action. In order to attach operands to an action, HTML provides the notion of  
278 - 'form'. Indeed, a form contains essentially a set of input fields into which the client  
279 - may put values for the required operands of the action, and a submit button, which is  
280 - the actioner itself. Notice that a single form may contain several submit buttons,  
281 - which simply means that there are several distincts actions taking the same set of  
282 - operands.  
283 -  
284 - Restrictions must be put on the use of all theses gadgets. Indeed, for example,  
285 - putting a form within another form is officially meaningless in HTML, and the client's  
286 - browser may be seriously disturbed by this. In this file, we propose an interface to  
287 - the HTML language, which forbids such meaningless things, simply by imposing a strict  
288 - typing of HTML concepts.  
289 -  
290 - Each web site may be accessible through two communication channels:  
291 -  
292 - - a non secured channel (HTTP),  
293 - - a secured channel (HTTPS).  
294 -  
295 - Nevertheless, the whole thing should be considered as a single web site. For example,  
296 - you may have a secured page, obtained through HTTPS, containing public images obtained  
297 - through HTTP. An actioner in a non secured page may open a secured connection, and  
298 - conversely.  
299 -  
300 - Summarizing, a web page is made of local elements, foreign links and actioners.  
301 - Actioners receive operands from forms, and they also choose to communicate through the  
302 - non secured or through the secured channel.  
303 -  
304 -  
305 -  
306 - +-------------------+  
307 - | page |  
308 - | | +---------------+  
309 - | +--------------+ | | next page |  
310 - | | form | | | (non secured) |  
311 - | | +----------+ | | HTTP | |  
312 - | | | actioner |---------------------------->| |  
313 - | | +----------+ | | +---------------+  
314 - | | | |  
315 - | | +----------+ | | +---------------+  
316 - | | | actioner |---------------------------->| next page |  
317 - | | +----------+ | | HTTPS | (secured) |  
318 - | | | | | |  
319 - | +--------------+ | | |  
320 - | | +---------------+  
321 - | |  
322 - +-------------------+  
323 -  
324 -  
325 - Notice that actioners need no be necessarily put into forms. In that case, they work as  
326 - ordinary links, but they still may receive operands as we shall see.  
327 -  
328 -  
329 -  
330 -  
331 - ** (1.4) Actions.  
332 -  
333 - The client opens a new connection with our web site whenever he clicks on an  
334 - actioner. The result is that a request is sent, essentially made of a list of 'web  
335 - arguments'. Each web argument is a pair (name,value). One of these web arguments, the  
336 - 'action' web argument (whose name is "a"), determines the action to be performed. The  
337 - other web arguments (not including "s", used to identify the state) are the operands  
338 - for this action.  
339 -  
340 - Hence, the 'compute state' box in the picture above, splits naturally into as many  
341 - sub-boxes as there are actions. For this reason, we define the following type for  
342 - representing actions (where '$State' is the type representing session informations):  
343 -  
344 -  
345 -  
346 - 'http_action's are executed only under HTTP, and 'https_action's are executed only  
347 - under HTTPS. 'http_https_action's may be executed under both types of connections.  
348 -  
349 - Each action has a name, which is used to identify the action. Each action also has a  
350 - function 'allow' whose job is to verify that the action is allowed in the current  
351 - state, and a function 'do_it' for performing the action. The function 'do_it' receives  
352 - a lot of informations:  
353 -  
354 - - 'HTTP informations':  
355 - - the IP address of the client,  
356 - - the URI requested by the client (after redirection),  
357 - - the list of HTTP headers generated by the client's browser,  
358 - - the list of web arguments sent by the client (except "s" and "a"),  
359 - - the previous state (or the 'initial' or 'ticket expired' state if no previous  
360 - state can be found).  
361 -  
362 - In most cases, HTTP informations are not used. This is the reason why they are gathered  
363 - for simplicity into a unique datum of type 'HTTP_Info'.  
364 -  
365 -  
366 -  
367 -  
368 - When you define your web site, you must provide the list of all the actions of the  
369 - site. When a new state has been computed, a graphical representation of this state  
370 - must be sent to the client. To that end, you must provide a function (named below  
371 - 'compute_page') of type:  
372 -  
373 - $State -> HTTP_Answer  
374 -  
375 - where the type 'HTTP_Answer' (defined below in this file) abstractly represents HTML  
376 - pages.  
377 -  
378 -//public type HTTP_Answer:...  
379 -  
380 - It should be clear that states and pages are deeply linked together. Indeed, we really  
381 - understand the page shown to the client as a representation of the current state of the  
382 - conversation between the client and the web site, but also containing informations  
383 - taken from the data bases.  
384 -  
385 -  
386 -//public type HTML_Partial_Content:...  
387 -  
388 -  
389 -  
390 -  
391 -  
392 -  
393 -  
394 -  
395 -  
396 -public define List(HTTP_header)  
397 - make_session_cookie_headers  
398 - (  
399 - String website_name,  
400 - String session_name  
401 - )  
402 - =  
403 - //println("Set-Cookie state_"+website_name+"="+state_name);  
404 - [  
405 - http_header("Set-Cookie", "session_"+website_name+"="+session_name+"; SameSite=Strict")  
406 - ]  
407 - .  
408 -  
409 -  
410 -  
411 - When a request arrives, we need to retrieve the previous state from the server's  
412 - disk. We receive the name of that state. If the state is out of date, the state file is  
413 - kept 3 days, and then deleted.  
414 -  
415 -  
416 -  
417 -  
418 -define One  
419 - delete_out_of_date_sessions // for all web sites  
420 - (  
421 - List((String, List(String) -> One)) directories_and_functions  
422 - )=  
423 - if directories_and_functions is  
424 - {  
425 - [ ] then unique,  
426 - [h . t] then  
427 - since h is (state_directory, function),  
428 - function(directory_list(state_directory,"*"));  
429 - delete_out_of_date_sessions(t)  
430 - }  
431 -.  
432 -  
433 - ** (1.5) States.  
434 -  
435 - Now, we explain how you can define the type (say 'State') to be used as an instance of  
436 - the type parameter '$State'. The following is just a suggestion.  
437 -  
438 - Each state determines a page (since 'compute_page' computes a page from a  
439 - state). However, some components of the state may be independant of the page. It may be  
440 - the case for example for the indication of the natural language used by the  
441 - client. Hence, a state should be made of (at least) two parts:  
442 -  
443 - - informations which are the same for all pages,  
444 - - informations which are particular to each page.  
445 -  
446 - For example, you could define:  
447 -  
448 - type Page: // one alternative per page, with particular informations  
449 - login(...), // in the components  
450 - main_page(...),  
451 - ...etc...  
452 -  
453 - Now, the type 'State' could be defined as follows:  
454 -  
455 - type State:  
456 - state(Language, // informations valid for all pages  
457 - ...,  
458 - Page). // informations particular to a page  
459 -  
460 - However, if you are making a secured web site within which clients should be identified  
461 - (by id and password), it may be a good idea to have two sorts of states, one for non  
462 - identified clients and one for identified clients. In this case, define the type  
463 - 'State' as follows (this is just a suggestion):  
464 -  
465 - type State:  
466 - non_identified(Language),  
467 - identified(String id,  
468 - Language,  
469 - Page).  
470 -  
471 - When a request arrives, check if the previous state is 'identified(...)' or  
472 - 'non_identified(...)', and don't provide access to certain pages to non identified  
473 - clients. This is required for security.  
474 -  
475 - Some more words on security. If your site needs to identify clients, define the  
476 - initial state as 'non_identified(...)'. Construct a 'login' page, and check the id and  
477 - password of the client. If the id and password are correct, then change the state of  
478 - the client to 'identified(...)'. No other action should be able to do that. Now, be  
479 - confident that clients cannot forge states. The only information they have is the name  
480 - of a state, not the state itself which is never sent over the network, but only stored  
481 - on the server's disk. The name of the state is constructed using strong cryptographical  
482 - methods (sha1). If everything (since the 'login' page) is performed under HTTPS, even  
483 - state names cannot be seen by a third party. So, if the system retrieves a previous  
484 - state of the form 'identified(...)', you can be confident that your client is well  
485 - identified, and you can send him confidential informations.  
486 -  
487 - States have a limited life time. It may happen that a client clicks on a button at a  
488 - time its state is out of date. In this case, this system considers that the new state  
489 - is a special state named 'ticket expired'. You must provide a function producing this  
490 - state when you describe your web site. The page corresponding to this state must just  
491 - inform the client that he/she waited a too long time before clicking on a button, and  
492 - has to restart (a new conversation) from the begining.  
493 -  
494 -  
495 -  
496 - * (2) Carrying on.  
497 -  
498 - ** (2.1) Describing your web sites.  
499 -  
500 - Before you may start your web site, you must describe it, i.e. produce a datum of the  
501 - opaque type 'Web_Site'.  
502 -  
503 -public type Web_Site:...  
504 -  
505 - Producing such a datum may be performed by:  
506 -  
507 - public define Web_Site  
508 - make_web_site_description  
509 - (  
510 - List(String) common_names, // for example: ["www.our-business.com",  
511 - // "192.168.0.1"]  
512 - // the second one is just for testing  
513 - String site_directory, // where 'public' and other directories are  
514 - // located (should NOT end with '/')  
515 - String state_directory,  
516 - One -> One init,  
517 - (HTTP_Info,  
518 - List(Web_arg),  
519 - Bool is_https) -> $State initial_state,  
520 - ($State expired,  
521 - Maybe(String),  
522 - HTTP_Info,  
523 - List(Web_arg),  
524 - Bool is_https) -> $State ticket_expired_state,  
525 - (Maybe(String),  
526 - HTTP_Info,  
527 - List(Web_arg),  
528 - Bool is_https) -> $State ticket_lost_state,  
529 - List(Web_Action($State)) actions,  
530 - $State -> HTTP_Answer compute_page,  
531 - $State -> List(HTTP_header) additional_headers,  
532 - List(HTTP_header) constant_additional_headers,  
533 - Int timeout, // seconds (todo: minutes)  
534 - Redirections redirections,  
535 - String charset,  
536 - List(String) journal_extensions,  
537 - List(String) journal_headers,  
538 - String authorization_secret,  
539 - List(MIME) known_mime_types,  
540 - (String action_name,  
541 - List(Web_arg) args)-> One before_send_file  
542 - ).  
543 -  
544 -  
545 - Explanations:  
546 -  
547 - 'common_names' is the list of names of the site (the name the browser must send as the  
548 - value of the 'Host' HTTP header in order to access the site must be in that list). Such  
549 - a name generally looks like this:  
550 -  
551 - www.somewhere.com  
552 -  
553 - If you are using HTTPS, you also have an 'X.509 SSL server certificate'. The name of  
554 - the site must be exactly the same as the name on the certificate (which is precisely  
555 - called the 'common name' in the X.509 jargon). If the two names do not match, the site  
556 - will still work, but the transaction will not be transparent to the client. His browser  
557 - will complain that the name of the certificate does not match the name of the site, and  
558 - he will have to accept the certificate manually.  
559 -  
560 - 'site_directory' is the absolute path to the directory where the files needed by the  
561 - site are located. Usually this directory looks like:  
562 -  
563 - my_anubis/web_sites/www.somewhere.com  
564 -  
565 - However, this information is not computed from 'common_name', so that you can change  
566 - the common name (for example temporarily, for networking reasons) without loosing  
567 - access to the files.  
568 -  
569 - 'ticket_expired_state(expired_state,http_info,lwa,is_https)' must produce the state  
570 - whose graphical representation is a page explaining to the user that its 'ticket' (or  
571 - 'session information') has expired, and that he/she must close all popup windows and  
572 - start a new session. The arguments of the function contain the previous (expired)  
573 - state and all current informations concerning the user. This arguments may be useful  
574 - for example for producing the expiration message in the language chosen by the user.  
575 - You can also (and this may be much smarter) send a 'ticket prolongation page'  
576 - (including a new login for example), and resume the same conversation, since you have  
577 - all the pertinent informations at hand. In the case the ticket is definitely lost, the  
578 - second fonction 'ticket_lost_state' is used.  
579 -  
580 - Notice that despite the fact that the parameter $State is involved in the arguments of  
581 - the above function, the type 'Web_Site' does not depend on this parameter. This allows  
582 - to produce lists of web site descriptions, where each description may be constructed  
583 - with a different instance of $State. This is required because distinct sites must have  
584 - distinct types of session informations. This is made possible by the fact that the  
585 - type is obscure, and the constructor replaced by a function which assembles  
586 - 'ticket_expired_state', ticket_lost_state', 'actions' and 'compute_page' into a single  
587 - entity not depending on $State. You should have a look to the private part of this file  
588 - if you want more precisions about this programming technique.  
589 -  
590 - 'charset' is a string which will determine the character encoding to be used by the  
591 - browser. Typically, this string is one of: "UTF-8", "ISO-8859-1", "Windows-1252",  
592 - etc...  
593 -  
594 - 'before_send_file' is a function which is executed just before the HTTP server sends a  
595 - file. It gets an action name and the web arguments received with the request for that  
596 - file. Notice that this action name and these web arguments may be put into a  
597 - 'private_download' element, and will come back to the server at the time of the  
598 - download.  
599 -  
600 -  
601 -  
602 - ** (2.2) Directories on the server's disk.  
603 -  
604 - The description of your site contains the name of the directory within which the  
605 - required files are located. This may be for example:  
606 -  
607 - my_anubis/web_sites/www.our-business.com/  
608 -  
609 - This is called the 'site directory' (for the given site). Within the site directory,  
610 - the following directories are created by this program:  
611 -  
612 - states  
613 - public  
614 - journal  
615 - private_download  
616 - upload_temporary  
617 -  
618 - The directory 'states' is used for storing states (session informations). Out of date  
619 - states are automatically removed after some time.  
620 -  
621 - The tree rooted at 'public' contains files that the server is allowed to send to the  
622 - clients. For security reasons, the server never sends a file which is not within the  
623 - tree whose root is this 'public' directory (except for the 'private download' mecanism;  
624 - see 'web/multihost_http_server.anubis'). Also, the MIME type (see 'web/mime.anubis')  
625 - must have been recognized before the file may be sent.  
626 -  
627 - The directory 'journal' contains the jounal files. The roles of the remaining  
628 - directories 'private_download' and 'upload_temporary' is explained in  
629 - 'multihost_http_server.anubis', where you will also find further informations on  
630 - 'public' and 'journal'.  
631 -  
632 -  
633 - ** (2.3) Web servers parameters.  
634 -  
635 - The web servers have several parameters useful for administration. They are described  
636 - as follows:  
637 -  
638 - public type WebServersParameters:  
639 - wsparms(Var(Bool) shutdown_required,  
640 -  
641 - ** (2.4) Starting your web sites.  
642 -  
643 - When you have described all your web sites (you may want to have several web sites, and  
644 - they are distinguished by their 'common name'), you may start them all together using  
645 - 'start_web_sites' below. This function returns a result of the following type:  
646 -  
647 -public type Start_Web_Sites_Result:  
648 - cannot_bind_to_port(Word32),  
649 - cannot_bind_to_port(Word32,Word32),  
650 - ok(Server http_server,  
651 - Server https_server).  
652 -  
653 - Indeed, it may happen that the system cannot bind (begin to listen) to one of the two  
654 - ports (or to both). The main reason is that another server is already listening on that  
655 - port. Another reason may be that 'anbexec' has not been correctly installed, i.e. that  
656 - the 's' bit has not been set for 'user' and 'group' (there is not such problem under  
657 - Windows). Also notice that the Linux kernel may need a rather long time (up to several  
658 - minutes) before liberating a listening port. Now, if the system can bind to the two  
659 - ports, the pair of the two servers is returned. Two tools are useful for manipulating  
660 - servers:  
661 -  
662 - shutdown of type Server -> One  
663 - is_down of type Server -> Bool  
664 -  
665 - They are defined in 'predefined.anubis' (together with the type 'Server').  
666 -  
667 -  
668 -public define Start_Web_Sites_Result  
669 - start_web_sites  
670 - (  
671 - Word32 ip_address, // the IP address shared by the web sites  
672 - Word32 http_port, // usually: 80  
673 - Word32 https_port, // usually: 443  
674 - String ssl_certificate_common_name,  
675 - List(Web_Site) web_sites, // web sites to be started  
676 - (One) -> Bool shutdown_required  
677 - ).  
678 -  
679 - 'ip_address' is the IP address on which the two servers listen. If you put 0, the  
680 - servers listen on all the IP addresses of the machine. This may be useful if the  
681 - machine has several network interfaces.  
682 -  
683 - 'ssl_certificate_common_name' is the common name of the SSL certificate that 'anbexec'  
684 - loads when it starts. One instance of 'anbexec' cannot handle more than one SSL server  
685 - certificate. This is due to a problem of conception of SSL itself. See the book 'SSL  
686 - and TLS' by Eric Rescorla (at Addison Wesley) for more explanations.  
687 -  
688 - Notice that the number of servers is always 2, regardless of the number of web sites  
689 - you are starting.  
690 -  
691 - The dynamic variable 'shutdown_required' may be used to control the shutdown of the two  
692 - servers from within the web site (typically the administration part). The servers will  
693 - shutdown as soon as this variable contains 'true'. So you must provide a variable  
694 - containing 'false' otherwise your servers will not run. You may also use the primitive  
695 - 'must_restart' (see 'predefined.anubis') to control the restarting of your servers.  
696 -  
697 - * (3) The HTML interface.  
698 -  
699 - We propose an interface to dynamic HTML. Dynamic HTML includes HTML, and a combination  
700 - of CSS (Cascading Style Sheet) and JavaScript techniques for making HTML elements more  
701 - reactive and attractive on the client side.  
702 -  
703 -  
704 - ** (3.1) Types used by the HTML interface.  
705 -  
706 - For easy reference, we gather below the definitions of all the types used by the HTML  
707 - interface, and we comment them immediately.  
708 -  
709 - //public type HTML_Off_Form:...  
710 -  
711 -  
712 -public define Printable_tree [HTML_Id x . Printable_tree y] = str_pt(x.id, y).  
713 -public define Printable_tree [HtmlClass x . Printable_tree y] = str_pt(x.class, y).  
714 -public define Printable_tree [WebArgName x . Printable_tree y] = str_pt(x.name, y).  
715 -public define Printable_tree [WebArgValue x . Printable_tree y] = str_pt(x.value, y).  
716 -public define Printable_tree [InitialValue x . Printable_tree y] = str_pt(x.value, y).  
717 -  
718 -public define CoreAttrs attr(String name, Bool value) = attr(name, if value then "true" else "false").  
719 -public define CoreAttrs attr(String name, Int value) = attr(name, to_String(value)).  
720 -  
721 -  
722 -public define InputAttrs attr(String name, Bool value) = attr(name, if value then "true" else "false").  
723 -  
724 -  
725 -  
726 -public define Text_Option  
727 - tooltip(String s) = title(s).  
728 -  
729 - A list of 'Text_Option' must be given with each text you want to put in your page.  
730 -  
731 -public define CoreAttrs  
732 - tooltip(String s) = title(s).  
733 -public define InputAttrs  
734 - tooltip(String s) = title(s).  
735 -  
736 -  
737 -public type I18n:  
738 - lang (String),  
739 - dir (Reading_Way).  
740 -  
741 -  
742 - A list of 'DIV_Option' must be given with each DIV you want to put in your page.  
743 -  
744 -public define String  
745 - event_name  
746 - (  
747 - HtmlEvents e  
748 - ) =  
749 - if e is  
750 - {  
751 - onafterprint then "onafterprint", //HTML5 Script to be run after the document is printed  
752 - onbeforeprint then "onbeforeprint", //HTML5 Script to be run before the document is printed  
753 - onbeforeunload then "onbeforeunload", //HTML5 Script to be run when the document is about to be unloaded  
754 - onerror then "onerror", //HTML5 Script to be run when an error occurs  
755 - onhashchange then "onhashchange", //HTML5 Script to be run when there has been changes to the anchor part of the a URL  
756 - onload then "onload", // Fires after the page is finished loading  
757 - onmessage then "onmessage", //HTML5 Script to be run when the message is triggered  
758 - onoffline then "onoffline", //HTML5 Script to be run when the browser starts to work offline  
759 - ononline then "ononline", //HTML5 Script to be run when the browser starts to work online  
760 - onpagehide then "onpagehide", //HTML5 Script to be run when a user navigates away from a page  
761 - onpageshow then "onpageshow", //HTML5 Script to be run when a user navigates to a page  
762 - onpopstate then "onpopstate", //HTML5 Script to be run when the window's history changes  
763 - onresize then "onresize", //HTML5 Fires when the browser window is resized  
764 - onstorage then "onstorage", //HTML5 Script to be run when a Web Storage area is updated  
765 - onunload then "onunload", // Fires once a page has unloaded (or the browser window has been closed)  
766 - // Form element events  
767 - onblur then "onblur", // Fires the moment that the element loses focus  
768 - onchange then "onchange", // Fires the moment when the value of the element is changed  
769 - oncontextmenu then "oncontextmenu", //HTML5 Script to be run when a context menu is triggered  
770 - onfocus then "onfocus", // Fires the moment when the element gets focus  
771 - oninput then "oninput", //HTML5 Script to be run when an element gets user input  
772 - oninvalid then "oninvalid", //HTML5 Script to be run when an element is invalid  
773 - onreset then "onreset", // Fires when the Reset button in a form is clicked  
774 - onsearch then "onsearch", // Fires when the user writes something in a search field (for <input="search">)  
775 - onselect then "onselect", // Fires after some text has been selected in an element  
776 - onsubmit then "onsubmit", // Fires when a form is submitted  
777 - // Keyboard events (Not valid in base, bdo, br, frame, frameset, head, html, iframe, meta, param, script, style, and title elements.)  
778 - onkeydown then "onkeydown", // Fires when a user is pressing a key  
779 - onkeypress then "onkeypress", // Fires when a user presses a key  
780 - onkeyup then "onkeyup", // Fires when a user releases a key  
781 - // Mouse events (Not valid in base, bdo, br, frame, frameset, head, html, iframe, meta, param, script, style, and title elements.)  
782 - onclick then "onclick", // Fires on a mouse click on the element  
783 - ondblclick then "ondblclick", // Fires on a mouse double-click on the element  
784 - onmousedown then "onmousedown", // Fires when a mouse button is pressed down on an element  
785 - onmousemove then "onmousemove", // Fires when the mouse pointer is moving while it is over an element  
786 - onmouseout then "onmouseout", // Fires when the mouse pointer moves out of an element  
787 - onmouseover then "onmouseover", // Fires when the mouse pointer moves over an element  
788 - onmouseup then "onmouseup", // Fires when a mouse button is released over an element  
789 - onwheel then "onwheel", //HTML5 Fires when the mouse wheel rolls up or down over an element  
790 - //Drag Events  
791 - ondrag then "ondrag", //HMTL5 Script to be run when an element is dragged  
792 - ondragend then "ondragend", //HTML5 Script to be run at the end of a drag operation  
793 - ondragenter then "ondragenter", //HTML5 Script to be run when an element has been dragged to a valid drop target  
794 - ondragleave then "ondragleave", //HTML5 Script to be run when an element leaves a valid drop target  
795 - ondragover then "ondragover", //HTML5 Script to be run when an element is being dragged over a valid drop target  
796 - ondragstart then "ondragstart", //HTML5 Script to be run at the start of a drag operation  
797 - ondrop then "ondrop", //HTML5 Script to be run when dragged element is being dropped  
798 - onscroll then "onscroll", //HTML5 Script to be run when an element's scrollbar is being scrolled  
799 - //Clipboard Events  
800 - oncopy then "oncopy", //HTML5 Fires when the user copies the content of an element  
801 - oncut then "oncut", //HTML5 Fires when the user cuts the content of an element  
802 - onpaste then "onpaste", //HTML5 Fires when the user pastes some content in an element  
803 - //Media Events  
804 - onabort then "onabort", //HTML5 Script to be run on abort  
805 - oncanplay then "oncanplay", //HTML5 Script to be run when a file is ready to start playing (when it has buffered enough to begin)  
806 - oncanplaythrough then "oncanplaythrough", //HTML5 Script to be run when a file can be played all the way to the end without pausing for buffering  
807 - oncuechange then "oncuechange", //HTML5 Script to be run when the cue changes in a <track> element  
808 - ondurationchange then "ondurationchange", //HTML5 Script to be run when the length of the media changes  
809 - onemptied then "onemptied", //HTML5 Script to be run when something bad happens and the file is suddenly unavailable (like unexpectedly disconnects)  
810 - onended then "onended", //HTML5 Script to be run when the media has reach the end (a useful event for messages like "thanks for listening")  
811 - onerror then "onerror", //HTML5 Script to be run when an error occurs when the file is being loaded  
812 - onloadeddata then "onloadeddata", //HTML5 Script to be run when media data is loaded  
813 - onloadedmetadata then "onloadedmetadata", //HTML5 Script to be run when meta data (like dimensions and duration) are loaded  
814 - onloadstart then "onloadstart", //HTML5 Script to be run just as the file begins to load before anything is actually loaded  
815 - onpause then "onpause", //HTML5 Script to be run when the media is paused either by the user or programmatically  
816 - onplay then "onplay", //HTML5 Script to be run when the media is ready to start playing  
817 - onplaying then "onplaying", //HTML5 Script to be run when the media actually has started playing  
818 - onprogress then "onprogress", //HTML5 Script to be run when the browser is in the process of getting the media data  
819 - onratechange then "onratechange", //HTML5 Script to be run each time the playback rate changes (like when a user switches to a slow motion or fast forward mode)  
820 - onseeked then "onseeked", //HTML5 Script to be run when the seeking attribute is set to false indicating that seeking has ended  
821 - onseeking then "onseeking", //HTML5 Script to be run when the seeking attribute is set to true indicating that seeking is active  
822 - onstalled then "onstalled", //HTML5 Script to be run when the browser is unable to fetch the media data for whatever reason  
823 - onsuspend then "onsuspend", //HTML5 Script to be run when fetching the media data is stopped before it is completely loaded for whatever reason  
824 - ontimeupdate then "ontimeupdate", //HTML5 Script to be run when the playing position has changed (like when the user fast forwards to a different point in the media)  
825 - onvolumechange then "onvolumechange", //HTML5 Script to be run each time the volume is changed which (includes setting the volume to "mute")  
826 - onwaiting then "onwaiting", //HTML5 Script to be run when the media has paused but is expected to resume (like when the media pauses to buffer more data)  
827 - //Misc Events  
828 - onshow then "onshow", //HTML5 Fires when a <menu> element is shown as a context menu  
829 - ontoggle then "ontoggle"  
830 - }.  
831 -  
832 -  
833 -public define Table_Option nude = border(0,0,0,rgb(0,0,0)).  
834 -  
835 -  
836 - A list of 'Table_Option' must be given with each table.  
837 -  
838 -  
839 -  
840 -  
841 -  
842 -  
843 - A list of 'Cell_Option' must be given with each cell and each row in a table. Options  
844 - given with a row apply to all the cells in the row, but are superseded by options given  
845 - with cells, which apply only to the cell they are given with.  
846 -  
847 -  
848 -  
849 -  
850 -  
851 - The parameter $T is later instantiated either to 'HTML_In_Form' or to 'HTML_Off_Form',  
852 - depending on where you put your table (within a form or not within a form). For your  
853 - convenience, we define the following particular case:  
854 -  
855 -public define HTML_Cell($T)  
856 - cell  
857 - (  
858 - $T content  
859 - )=  
860 - cell([],content)  
861 -.  
862 -  
863 -public define HTML_Cell($T)  
864 - cell  
865 - (  
866 - Cell_Option option,  
867 - $T content  
868 - ) =  
869 - cell([option],content)  
870 -.  
871 -  
872 -public define HTML_Header_Cell($T)  
873 - header_cell  
874 - (  
875 - $T content  
876 - ) =  
877 - header_cell([],content).  
878 -  
879 -  
880 -  
881 -  
882 - Same remark as for 'HTML_Cell($T)'. We define several convenience functions:  
883 -  
884 -public define HTML_Row($T)  
885 - row  
886 - (  
887 - List(HTML_Cell($T)) cells  
888 - )=  
889 - row([],cells).  
890 -  
891 -public define HTML_Row($T)  
892 - row  
893 - (  
894 - HTML_Cell($T) cell  
895 - )=  
896 - row([],[cell]).  
897 -  
898 -public define HTML_Row($T)  
899 - row  
900 - (  
901 - List(Cell_Option) options,  
902 - HTML_Cell($T) cell  
903 - )=  
904 - row(options,[cell]).  
905 -  
906 -public define HTML_Row($T)  
907 - row  
908 - (  
909 - Cell_Option option,  
910 - HTML_Cell($T) cell  
911 - )=  
912 - row([option],[cell]).  
913 -  
914 -public define HTML_Header_Row($T)  
915 - header_row  
916 - (  
917 - List(HTML_Header_Cell($T)) cells  
918 - ) =  
919 - header_row([],cells).  
920 -  
921 -public define HTML_Header_Row($T)  
922 - header_row  
923 - (  
924 - HTML_Header_Cell($T) cell  
925 - ) =  
926 - header_row([],[cell]).  
927 -  
928 -  
929 -  
930 -public define Actioner_Aspect  
931 - immediate_selector  
932 - (  
933 - List(CoreAttrs) core_attrs,  
934 - WebArgName name,  
935 - Int size,  
936 - List((List(CoreAttrs),WebArgValue,String)) choices  
937 - )=  
938 - immediate_selector(core_attrs, name, size, choices, failure, "")  
939 - .  
940 -  
941 -public define Actioner_Aspect  
942 - immediate_selector  
943 - (  
944 - List(CoreAttrs) core_attrs,  
945 - WebArgName name,  
946 - Int size,  
947 - List((List(CoreAttrs),WebArgValue,String)) choices,  
948 - Maybe(InitialValue) selected  
949 - )=  
950 - immediate_selector(core_attrs, name, size, choices, selected, "")  
951 - .  
952 -  
953 -  
954 -public define Actioner_Aspect  
955 - link  
956 - (  
957 - List(Text_Option) options,  
958 - String text  
959 - )=  
960 - link(options, text, failure).  
961 -  
962 -public define Actioner_Aspect  
963 - link  
964 - (  
965 - String text  
966 - ) =  
967 - link([], text, failure).  
968 -  
969 -  
970 -public define Actioner_Aspect  
971 - link  
972 - (  
973 - List(Text_Option) options,  
974 - Int i  
975 - ) =  
976 - link(options, to_decimal(i), failure).  
977 -  
978 -public define Actioner_Aspect  
979 - link  
980 - (  
981 - Int i  
982 - ) =  
983 - link([], i).  
984 -  
985 -public define Actioner_Aspect  
986 - button  
987 - (  
988 - String url_img  
989 - ) =  
990 - button(url_img,url_img).  
991 -  
992 - Actioners are explained in details below.  
993 -  
994 -  
995 -  
996 -  
997 -  
998 -public define String  
999 - to_String  
1000 - (  
1001 - CSS_File_Media css_file_media  
1002 - )=  
1003 - if css_file_media is  
1004 - {  
1005 - screen then "screen",  
1006 - tty then "tty",  
1007 - tv then "tv",  
1008 - projection then "projection",  
1009 - handheld then "handheld",  
1010 - print then "print",  
1011 - braille then "braille",  
1012 - aural then "aural",  
1013 - all then "all"  
1014 - }.  
1015 -  
1016 -  
1017 -//public type HTML_Meta:...  
1018 -  
1019 -  
1020 -  
1021 -public define HTML_Head_Tag  
1022 - js_script  
1023 - (  
1024 - String script_content  
1025 - )=  
1026 - js_inline(script("text/javascript", script_content))  
1027 -.  
1028 - /* Label with help */  
1029 -  
1030 -  
1031 -public define HTML_tooltip  
1032 - html_tooltip  
1033 - (  
1034 - String keyword,  
1035 - Int width  
1036 - )=  
1037 - html_tooltip("", keyword, width).  
1038 -  
1039 -public define HTML_tooltip  
1040 - html_tooltip  
1041 - (  
1042 - String title,  
1043 - String keyword  
1044 - )=  
1045 - html_tooltip(title, keyword, 0).  
1046 -  
1047 -  
1048 -  
1049 -public define HTML_Help  
1050 - tooltip  
1051 - (  
1052 - HTML_tooltip h_tooltip  
1053 - )=  
1054 - tooltip(h_tooltip, left)  
1055 -.  
1056 -  
1057 -  
1058 -  
1059 - /* It contains  
1060 - * - a List of HTML_Head_Tag representing necessaries head tags for the content. ex: jquery js files, js script, css specific styles, ...  
1061 - * - a HTML_Off_Form representing the HTML code for the part of the page we want to display  
1062 - */  
1063 -//public type HTML_In_Form:...  
1064 -  
1065 -  
1066 -  
1067 -public define List(HTML_Head_Tag)  
1068 - to_HTML_Head_Tag  
1069 - (  
1070 - List(CSS_File) css_file_list  
1071 - )=  
1072 - map((CSS_File css_f) |-> css(css_f), css_file_list).  
1073 -  
1074 -public define List(HTML_Head_Tag)  
1075 - to_HTML_Head_Tag  
1076 - (  
1077 - List(JS_File) js_file_list  
1078 - )=  
1079 - map((JS_File js_f) |-> js(js_f), js_file_list).  
1080 -  
1081 -  
1082 -  
1083 - 'HTML_In_Form' defines all the elements you may put within a form. We define a  
1084 - convenience function:  
1085 -  
1086 -  
1087 -public define HTML_Off_Form text_input(HTML_Label label, HTML_Id id, WebArgName name, InitialValue init, Int width) = text_input([], label, id, name, init, width).  
1088 -  
1089 -public define HTML_Off_Form literal(Printable_tree t) = literal_pt(t).  
1090 -  
1091 -public define HTML_Off_Form image(String url) = image([], url, url).  
1092 -  
1093 -public define HTML_Off_Form image(String url, Int width, Int height) = image([], url, url, width, height).  
1094 -  
1095 -public define HTML_In_Form  
1096 - foreign_link  
1097 - (  
1098 - Int tsize,  
1099 - String url,  
1100 - String name  
1101 - ) =  
1102 - foreign_link([size(tsize)],url,name).  
1103 -  
1104 -public define HTML_In_Form  
1105 -/* Older call with String as action instead of WEB_Action_Name.  
1106 - * This function exists only for compatibility with older project.  
1107 - * Please condiser to use above function instead  
1108 - */  
1109 - actioner  
1110 - (  
1111 - Actioner_Connection conn,  
1112 - Actioner_Target targ,  
1113 - Actioner_Aspect asp,  
1114 - String action,  
1115 - List((String,String)) extra_ops,  
1116 - List(Actioner_Local_Action) local_actions  
1117 - )=  
1118 - actioner(conn,targ,asp,action_name(action),extra_ops,local_actions)  
1119 -.  
1120 -  
1121 -public define HTML_In_Form  
1122 - actioner  
1123 - (  
1124 - Actioner_Connection conn,  
1125 - Actioner_Target targ,  
1126 - Actioner_Aspect asp,  
1127 - WEB_Action_Name action,  
1128 - List((String,String)) extra_ops  
1129 - )=  
1130 - actioner(conn,targ,asp,action,extra_ops,[])  
1131 -.  
1132 -  
1133 -public define HTML_In_Form  
1134 -/* Older call with String as action instead of WEB_Action_Name.  
1135 - * This function exists only for compatibility with older project.  
1136 - * Please condiser to use above function instead  
1137 - */  
1138 - actioner  
1139 - (  
1140 - Actioner_Connection conn,  
1141 - Actioner_Target targ,  
1142 - Actioner_Aspect asp,  
1143 - String action,  
1144 - List((String,String)) extra_ops  
1145 - )=  
1146 - actioner(conn,targ,asp,action_name(action),extra_ops,[])  
1147 -.  
1148 -  
1149 -public define HTML_In_Form  
1150 - actioner  
1151 - (  
1152 - Actioner_Connection conn,  
1153 - Actioner_Target targ,  
1154 - Actioner_Aspect asp,  
1155 - )=  
1156 - actioner(conn, targ, asp, action_name(""), [], []).  
1157 -  
1158 -  
1159 -public define HTML_In_Form  
1160 - text_area  
1161 - (  
1162 - WebArgName name,  
1163 - InitialValue init,  
1164 - Int width,  
1165 - Int height  
1166 - ) =  
1167 - text_area([], no_label, html_Id(""), name,init,width,height).  
1168 -  
1169 -public define HTML_In_Form  
1170 - text_area  
1171 - (  
1172 - List(TextAreaOption) options,  
1173 - WebArgName name,  
1174 - InitialValue init,  
1175 - Int width,  
1176 - Int height  
1177 - ) =  
1178 - text_area(options, no_label, html_Id(""), name,init,width,height).  
1179 -  
1180 -public define HTML_In_Form  
1181 - table  
1182 - (  
1183 - List(HTML_Row(HTML_In_Form)) rows  
1184 - ) =  
1185 - table([],empty,rows,empty).  
1186 -  
1187 -public define HTML_In_Form  
1188 - table  
1189 - (  
1190 - List(Table_Option) options,  
1191 - List(HTML_Row(HTML_In_Form)) rows  
1192 - ) =  
1193 - table(options,empty,rows,empty).  
1194 -  
1195 -public define HTML_In_Form  
1196 - table  
1197 - (  
1198 - HTML_Header_Row(HTML_In_Form) h_row,  
1199 - List(HTML_Row(HTML_In_Form)) rows  
1200 - ) =  
1201 - table([],h_row,rows,empty).  
1202 -  
1203 -public define HTML_In_Form  
1204 - table  
1205 - (  
1206 - List(Table_Option) options,  
1207 - HTML_Header_Row(HTML_In_Form) h_row,  
1208 - List(HTML_Row(HTML_In_Form)) rows  
1209 - ) =  
1210 - table(options,h_row,rows,empty).  
1211 -  
1212 -public define HTML_In_Form  
1213 - private_download  
1214 - (  
1215 - String abs_path,  
1216 - String name,  
1217 - String extra_ext  
1218 - ) =  
1219 - private_download(abs_path,name,extra_ext,failure).  
1220 -  
1221 -public define HTML_In_Form  
1222 - private_download  
1223 - (  
1224 - String abs_path,  
1225 - String name,  
1226 - String extra_ext,  
1227 - String action_name,  
1228 - List((String,String)) args  
1229 - ) =  
1230 - private_download(abs_path,name,extra_ext,success((action_name,args))).  
1231 -  
1232 -  
1233 -  
1234 -public define HTML_In_Form  
1235 - text  
1236 - (  
1237 - List(CoreAttrs) l,  
1238 - Int i  
1239 - ) =  
1240 - text(l, to_decimal(i)).  
1241 -  
1242 -public define HTML_In_Form  
1243 - text  
1244 - (  
1245 - String s  
1246 - )=  
1247 - text([],s)  
1248 -.  
1249 -  
1250 -public define HTML_In_Form  
1251 - text  
1252 - (  
1253 - Int i  
1254 - ) =  
1255 - text([], i)  
1256 -.  
1257 -  
1258 -public define HTML_In_Form  
1259 - div  
1260 - (  
1261 - HTML_In_Form element  
1262 - )=  
1263 - div([], [element])  
1264 -.  
1265 -  
1266 -public define HTML_In_Form  
1267 - div  
1268 - (  
1269 - List(CoreAttrs) attrs,  
1270 - HTML_In_Form element  
1271 - )=  
1272 - div(attrs, [element])  
1273 -.  
1274 -  
1275 -public define HTML_In_Form  
1276 - span  
1277 - (  
1278 - String s  
1279 - )=  
1280 - span([],s)  
1281 -.  
1282 -  
1283 -public define HTML_In_Form  
1284 - span  
1285 - (  
1286 - Int i  
1287 - ) =  
1288 - span([], to_decimal(i))  
1289 -.  
1290 -  
1291 -public define HTML_In_Form  
1292 - radio_button (List(CoreAttrs) options, HTML_Label label, WebArgName n, WebArgValue value, Bool checked)  
1293 - = radio_button (options, label, html_Id(n.name), n, value, checked).  
1294 -  
1295 -public define HTML_In_Form  
1296 - radio_button_r (List(CoreAttrs) options, HTML_Label label, WebArgName n, WebArgValue value, Bool checked)  
1297 - = radio_button_r (options, label, html_Id(n.name), n, value, checked).  
1298 -  
1299 -public define HTML_In_Form  
1300 - check_box (List(CoreAttrs) options, HTML_Label label, WebArgName n, Bool checked)  
1301 - = check_box (options, label, html_Id(n.name), n, checked).  
1302 -  
1303 -public define HTML_In_Form  
1304 - check_box_r (List(CoreAttrs) options, HTML_Label label, WebArgName n, Bool checked)  
1305 - = check_box_r (options, label, html_Id(n.name), n, checked).  
1306 -  
1307 -public define HTML_In_Form  
1308 - file_upload (WebArgName n, Int width)  
1309 - = file_upload([], no_label, html_Id(n.name), n, width).  
1310 -  
1311 -public define HTML_In_Form  
1312 - hidden (WebArgName name, WebArgValue value)  
1313 - =  
1314 - hidden(html_Id(""), name, value).  
1315 -  
1316 -public type Input_Type:  
1317 -button,  
1318 -checkbox,  
1319 -color,  
1320 -date,  
1321 -datetime_local,  
1322 -email,  
1323 -file,  
1324 -hidden,  
1325 -image,  
1326 -month,  
1327 -number,  
1328 -password,  
1329 -radio,  
1330 -range,  
1331 -reset,  
1332 -search,  
1333 -submit,  
1334 -tel,  
1335 -text,  
1336 -time,  
1337 -url,  
1338 -week  
1339 -.  
1340 -  
1341 -public define String  
1342 - to_String  
1343 - (  
1344 - Input_Type type  
1345 - )=  
1346 - if type is  
1347 - {  
1348 - button then "button",  
1349 - checkbox then "checkbox",  
1350 - color then "color",  
1351 - date then "date",  
1352 - datetime_local then "datetime_local",  
1353 - email then "email",  
1354 - file then "file",  
1355 - hidden then "hidden",  
1356 - image then "image",  
1357 - month then "month",  
1358 - number then "number",  
1359 - password then "password",  
1360 - radio then "radio",  
1361 - range then "range",  
1362 - reset then "reset",  
1363 - search then "search",  
1364 - submit then "submit",  
1365 - tel then "tel",  
1366 - text then "text",  
1367 - time then "time",  
1368 - url then "url",  
1369 - week then "week"  
1370 - }  
1371 -.  
1372 -  
1373 -define Printable_tree  
1374 - add_js_files_attributes  
1375 - (  
1376 - List(JS_Attribute) l  
1377 - ) =  
1378 - if l is  
1379 - {  
1380 - [ ] then [ ],  
1381 - [h . t] then  
1382 - [ " " + to_String(h)  
1383 - . add_js_files_attributes(t)]  
1384 - }  
1385 -.  
1386 -  
1387 -  
1388 -define Printable_tree  
1389 - add_js_files  
1390 - (  
1391 - List(JS_File) l  
1392 - ) =  
1393 - if l is  
1394 - {  
1395 - [ ] then [ ],  
1396 - [h . t] then  
1397 - [ ["<script src=\""+ file_name(h) +"\" type=\"text/javascript\""  
1398 - . add_js_files_attributes(attributes(h)) ]  
1399 - . ["></script>\n"  
1400 - . add_js_files(t)] ]  
1401 - }  
1402 -.  
1403 -  
1404 -define Printable_tree  
1405 - add_script  
1406 - (  
1407 - List(Script) l  
1408 - ) =  
1409 - if l is  
1410 - {  
1411 - [ ] then [ ],  
1412 - [h . t] then [ "<script type=\""+ script_type(h) +"\">\n"+ content(h) + "\n</script>\n" . add_script(t) ]  
1413 - }.  
1414 -  
1415 -public type FormMethod:  
1416 - get,  
1417 - post  
1418 -.  
1419 -  
1420 -//public type HTML_Body:...  
1421 -  
1422 -public define CoreAttrs formaction(WEB_Action_Name action, List((String,String)) extra_ops) = attr("formaction", format_web_action_name(action, extra_ops)).  
1423 -public define CoreAttrs formaction(WEB_Action_Name action, (String,String) extra_op) = attr("formaction", format_web_action_name(action, extra_op)).  
1424 -public define CoreAttrs formaction(WEB_Action_Name action) = attr("formaction", format_web_action_name(action)).  
1425 -public define CoreAttrs formmethod(FormMethod method) = attr("formmethod", if method is { get then "get", post then "post"}).  
1426 -  
1427 -  
1428 - 'HTML_Off_Form' defines all the elements you may put outside any form.  
1429 -  
1430 -  
1431 -public define CoreAttrs method(String value) = attr("method", value).  
1432 -public define CoreAttrs action(WEB_Action_Name action)= attr("action", "/"+format_web_action_name(action)).  
1433 -public define CoreAttrs action(WEB_Action_Name action, List((String,String)) extra_ops)= attr("action", "/"+format_web_action_name(action, extra_ops)).  
1434 -public define CoreAttrs formmethod(String value) = attr("formmethod", value).  
1435 -public define CoreAttrs form(String value) = attr("form", value).  
1436 -public define CoreAttrs for(String value) = attr("for", value).  
1437 -  
1438 -  
1439 -public define HTML_Off_Form text(List(CoreAttrs) attrs, Int i) = text(attrs, to_decimal(i)).  
1440 -public define HTML_Off_Form text(CoreAttrs attr, Int i) = text([attr], i).  
1441 -public define HTML_Off_Form text(Int i) = text([], i).  
1442 -public define HTML_Off_Form text(String s) = text([], s).  
1443 -public define HTML_Off_Form text(CoreAttrs attr, String s) = text([attr], s).  
1444 -  
1445 -public define HTML_Off_Form a(A_href _href) = a([], _href, _self, []).  
1446 -public define HTML_Off_Form a(List(CoreAttrs) attrs, A_href _href) = a(attrs, _href, _self, []).  
1447 -public define HTML_Off_Form a(List(CoreAttrs) attrs, A_href _href, HTML_Off_Form content) = a(attrs, _href, _self, [content]).  
1448 -public define HTML_Off_Form a(List(CoreAttrs) attrs, A_href _href, List(HTML_Off_Form) content) = a(attrs, _href, _self, content).  
1449 -public define HTML_Off_Form a(A_href _href, HTML_Off_Form content) = a([], _href, _self, [content]).  
1450 -public define HTML_Off_Form a(A_href _href, String _text) = a([], _href, _self, [text(_text)]).  
1451 -public define HTML_Off_Form a(A_href _href, List(HTML_Off_Form) content) = a([], _href, _self, content).  
1452 -public define HTML_Off_Form a(List(CoreAttrs) attrs, A_href _href, A_target _target, HTML_Off_Form content) = a(attrs, _href, _target, [content]).  
1453 -public define HTML_Off_Form a(CoreAttrs attr, A_href _href, A_target _target, HTML_Off_Form content) = a([attr], _href, _target, [content]).  
1454 -public define HTML_Off_Form a(A_href _href, A_target _target, HTML_Off_Form content) = a([], _href, _target, [content]).  
1455 -public define HTML_Off_Form a(A_href _href, A_target _target, List(HTML_Off_Form) content) = a([], _href, _target, content).  
1456 -public define HTML_Off_Form a(CoreAttrs attr, A_href _href, A_target _target, List(HTML_Off_Form) content) = a([attr], _href, _target, content).  
1457 -public define HTML_Off_Form a(CoreAttrs attr, A_href _href, List(HTML_Off_Form) content) = a([attr], _href, _self, content).  
1458 -public define HTML_Off_Form a(CoreAttrs attr, A_href _href, HTML_Off_Form content) = a([attr], _href, _self, [content]).  
1459 -  
1460 - // <article>  
1461 -public define HTML_Off_Form article(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("article", attrs, content).  
1462 -public define HTML_Off_Form article(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("article", attrs, [content]).  
1463 -public define HTML_Off_Form article(List(HTML_Off_Form) content) = html_tag("article", [], content).  
1464 -public define HTML_Off_Form article(HTML_Off_Form content) = html_tag("article", [], [content]).  
1465 -  
1466 - // <aside>  
1467 -public define HTML_Off_Form aside(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("aside", attrs, content).  
1468 -public define HTML_Off_Form aside(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("aside", attrs, [content]).  
1469 -public define HTML_Off_Form aside(List(HTML_Off_Form) content) = html_tag("aside", [], content).  
1470 -public define HTML_Off_Form aside(HTML_Off_Form content) = html_tag("aside", [], [content]).  
1471 -  
1472 - // <b> text in bold face  
1473 -public define HTML_Off_Form b(String string) = html_tag("b", [], [text(string)]).  
1474 -public define HTML_Off_Form b(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("b", attrs, [content]).  
1475 -public define HTML_Off_Form b(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("b", [attr], content).  
1476 -public define HTML_Off_Form b(CoreAttrs attr, HTML_Off_Form content) = html_tag("b", [attr], [content]).  
1477 -public define HTML_Off_Form b(List(CoreAttrs) attrs, String string) = html_tag("b", attrs, [text(string)]).  
1478 -public define HTML_Off_Form b(CoreAttrs attr, String string) = html_tag("b", [attr], [text(string)]).  
1479 -  
1480 - // <br>  
1481 -public define HTML_Off_Form br = html_void_tag("br", []).  
1482 -public define HTML_Off_Form br(List(CoreAttrs) attrs) = html_void_tag("br", attrs).  
1483 -  
1484 - // <button>  
1485 -public define HTML_Off_Form button(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("button", attrs, content).  
1486 -public define HTML_Off_Form button(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("button", attrs, [content]).  
1487 -public define HTML_Off_Form button(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("button", [attr], content).  
1488 -public define HTML_Off_Form button(CoreAttrs attr, HTML_Off_Form content) = html_tag("button", [attr], [content]).  
1489 -public define HTML_Off_Form button(List(CoreAttrs) attrs) = html_tag("button", attrs, []).  
1490 -public define HTML_Off_Form button(List(CoreAttrs) attrs, String string) = html_tag("button", attrs, [text(string)]).  
1491 -public define HTML_Off_Form button(List(HTML_Off_Form) content) = html_tag("button", [], content).  
1492 -public define HTML_Off_Form button(HTML_Off_Form content) = html_tag("button", [], [content]).  
1493 -  
1494 - // <canvas>  
1495 -public define HTML_Off_Form canvas(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("canvas", attrs, content).  
1496 -public define HTML_Off_Form canvas(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("canvas", attrs, [content]).  
1497 -public define HTML_Off_Form canvas(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("canvas", [attr], content).  
1498 -public define HTML_Off_Form canvas(CoreAttrs attr, HTML_Off_Form content) = html_tag("canvas", [attr], [content]).  
1499 -public define HTML_Off_Form canvas(List(CoreAttrs) attrs) = html_tag("canvas", attrs, []).  
1500 -public define HTML_Off_Form canvas(List(HTML_Off_Form) content) = html_tag("canvas", [], content).  
1501 -public define HTML_Off_Form canvas(HTML_Off_Form content) = html_tag("canvas", [], [content]).  
1502 -public define HTML_Off_Form canvas(CoreAttrs cattr, Int width, Int height) = html_tag("canvas", [cattr,  
1503 - attr("width", to_String(width)),  
1504 - attr("height", to_String(height))  
1505 - ], []).  
1506 -public define HTML_Off_Form canvas(List(CoreAttrs) attrs, Int width, Int height) = html_tag("canvas", [  
1507 - attr("width", to_String(width)),  
1508 - attr("height", to_String(height)).  
1509 - attrs  
1510 - ], []).  
1511 - // <datalist>  
1512 -public define HTML_Off_Form datalist(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("datalist", attrs, content).  
1513 -public define HTML_Off_Form datalist(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("datalist", attrs, [content]).  
1514 -public define HTML_Off_Form datalist(List(HTML_Off_Form) content) = html_tag("datalist", [], content).  
1515 -public define HTML_Off_Form datalist(HTML_Off_Form content) = html_tag("datalist", [], [content]).  
1516 -  
1517 - // <div>  
1518 -public define HTML_Off_Form div(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("div", attrs, content).  
1519 -public define HTML_Off_Form div(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("div", attrs, [content]).  
1520 -public define HTML_Off_Form div(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("div", [attr], content).  
1521 -public define HTML_Off_Form div(CoreAttrs attr, HTML_Off_Form content) = html_tag("div", [attr], [content]).  
1522 -public define HTML_Off_Form div(List(HTML_Off_Form) content) = html_tag("div", [], content).  
1523 -public define HTML_Off_Form div(HTML_Off_Form content) = html_tag("div", [], [content]).  
1524 -public define HTML_Off_Form div(List(CoreAttrs) attrs) = html_tag("div", attrs, []).  
1525 -public define HTML_Off_Form div(CoreAttrs attr) = html_tag("div", [attr], []).  
1526 -  
1527 -public define HTML_Off_Form div(String string) = html_tag("div", [], [text(string)]).  
1528 -public define HTML_Off_Form div(CoreAttrs attr, String string) = html_tag("div", [attr], [text(string)]).  
1529 -public define HTML_Off_Form div(List(CoreAttrs) attrs, String string) = html_tag("div", attrs, [text(string)]).  
1530 -  
1531 -public define HTML_Off_Form div(List(CoreAttrs) attrs, HTML_Partial_Content content) = div(attrs, [content]).  
1532 -public define HTML_Off_Form div(List(HTML_Partial_Content) content) = div([], content).  
1533 -public define HTML_Off_Form div(CoreAttrs attr, HTML_Partial_Content content) = div([attr], [content]).  
1534 -public define HTML_Off_Form div(HTML_Partial_Content content) = div([], [content]).  
1535 -  
1536 -//public define HTML_Partial_Content div(List(CoreAttrs) attrs, HTML_Partial_Content content) = partial_content([], div(attrs, [content])).  
1537 -//public define HTML_Partial_Content div(CoreAttrs attr, HTML_Partial_Content content) = partial_content([], div([attr], [content])).  
1538 -//public define HTML_Partial_Content div(List(HTML_Partial_Content) content) = partial_content([], div([], content)).  
1539 -//public define HTML_Partial_Content div(HTML_Partial_Content content) = partial_content([], div([], [content])).  
1540 -  
1541 - // <dd>  
1542 -public define HTML_Off_Form dd(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("dd", attrs, content).  
1543 -public define HTML_Off_Form dd(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("dd", attrs, [content]).  
1544 -public define HTML_Off_Form dd(List(HTML_Off_Form) content) = html_tag("dd", [], content).  
1545 -public define HTML_Off_Form dd(HTML_Off_Form content) = html_tag("dd", [], [content]).  
1546 -  
1547 - // <dl>  
1548 -public define HTML_Off_Form dl(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("dl", attrs, content).  
1549 -public define HTML_Off_Form dl(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("dl", attrs, [content]).  
1550 -public define HTML_Off_Form dl(List(HTML_Off_Form) content) = html_tag("dl", [], content).  
1551 -public define HTML_Off_Form dl(HTML_Off_Form content) = html_tag("dl", [], [content]).  
1552 -  
1553 - // <dt>  
1554 -public define HTML_Off_Form dt(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("dt", attrs, content).  
1555 -public define HTML_Off_Form dt(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("dt", attrs, [content]).  
1556 -public define HTML_Off_Form dt(List(HTML_Off_Form) content) = html_tag("dt", [], content).  
1557 -public define HTML_Off_Form dt(HTML_Off_Form content) = html_tag("dt", [], [content]).  
1558 -  
1559 - // <em>  
1560 -public define HTML_Off_Form em(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("em", attrs, content).  
1561 -public define HTML_Off_Form em(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("em", attrs, [content]).  
1562 -public define HTML_Off_Form em(List(HTML_Off_Form) content) = html_tag("em", [], content).  
1563 -public define HTML_Off_Form em(HTML_Off_Form content) = html_tag("em", [], [content]).  
1564 -  
1565 - // <fieldset>  
1566 -public define HTML_Off_Form fieldset(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("fieldset", attrs, content).  
1567 -public define HTML_Off_Form fieldset(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("fieldset", attrs, [content]).  
1568 -public define HTML_Off_Form fieldset(List(HTML_Off_Form) content) = html_tag("fieldset", [], content).  
1569 -public define HTML_Off_Form fieldset(HTML_Off_Form content) = html_tag("fieldset", [], [content]).  
1570 -  
1571 - // <footer>  
1572 -public define HTML_Off_Form footer(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("footer", attrs, content).  
1573 -public define HTML_Off_Form footer(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("footer", attrs, [content]).  
1574 -public define HTML_Off_Form footer(List(HTML_Off_Form) content) = html_tag("footer", [], content).  
1575 -public define HTML_Off_Form footer(HTML_Off_Form content) = html_tag("footer", [], [content]).  
1576 -  
1577 - // <form>  
1578 -public define HTML_Off_Form form(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("form", attrs, content).  
1579 -public define HTML_Off_Form form(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("form", attrs, [content]).  
1580 -public define HTML_Off_Form form(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("form", [attr], content).  
1581 -public define HTML_Off_Form form(CoreAttrs attr, HTML_Off_Form content) = html_tag("form", [attr], [content]).  
1582 -public define HTML_Off_Form form(List(CoreAttrs) attrs) = html_tag("form", attrs, []).  
1583 -public define HTML_Off_Form form(CoreAttrs attr) = html_tag("form", [attr], []).  
1584 -  
1585 -public define HTML_Off_Form form(List(HTML_Off_Form) content) = html_tag("form", [], content).  
1586 -public define HTML_Off_Form form(HTML_Off_Form content) = html_tag("form", [], [content]).  
1587 -  
1588 -  
1589 - // <header>  
1590 -public define HTML_Off_Form header(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("header", attrs, content).  
1591 -public define HTML_Off_Form header(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("header", attrs, [content]).  
1592 -public define HTML_Off_Form header(List(HTML_Off_Form) content) = html_tag("header", [], content).  
1593 -public define HTML_Off_Form header(HTML_Off_Form content) = html_tag("header", [], [content]).  
1594 -  
1595 - // <h1>  
1596 -public define HTML_Off_Form h1(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("h1", attrs, content).  
1597 -public define HTML_Off_Form h1(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("h1", [attr], content).  
1598 -public define HTML_Off_Form h1(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("h1", attrs, [content]).  
1599 -public define HTML_Off_Form h1(CoreAttrs attr, HTML_Off_Form content) = html_tag("h1", [attr], [content]).  
1600 -public define HTML_Off_Form h1(List(HTML_Off_Form) content) = html_tag("h1", [], content).  
1601 -public define HTML_Off_Form h1(HTML_Off_Form content) = html_tag("h1", [], [content]).  
1602 - // <h2>  
1603 -public define HTML_Off_Form h2(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("h2", attrs, content).  
1604 -public define HTML_Off_Form h2(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("h2", attrs, [content]).  
1605 -public define HTML_Off_Form h2(List(HTML_Off_Form) content) = html_tag("h2", [], content).  
1606 -public define HTML_Off_Form h2(HTML_Off_Form content) = html_tag("h2", [], [content]).  
1607 - // <h3>  
1608 -public define HTML_Off_Form h3(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("h3", attrs, content).  
1609 -public define HTML_Off_Form h3(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("h3", attrs, [content]).  
1610 -public define HTML_Off_Form h3(List(HTML_Off_Form) content) = html_tag("h3", [], content).  
1611 -public define HTML_Off_Form h3(HTML_Off_Form content) = html_tag("h3", [], [content]).  
1612 -public define HTML_Off_Form h3(String content) = html_tag("h3", [], [text(content)]).  
1613 -  
1614 - // <h4>  
1615 -public define HTML_Off_Form h4(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("h4", attrs, content).  
1616 -public define HTML_Off_Form h4(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("h4", attrs, [content]).  
1617 -public define HTML_Off_Form h4(List(HTML_Off_Form) content) = html_tag("h4", [], content).  
1618 -public define HTML_Off_Form h4(HTML_Off_Form content) = html_tag("h4", [], [content]).  
1619 - // <h5>  
1620 -public define HTML_Off_Form h5(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("h5", attrs, content).  
1621 -public define HTML_Off_Form h5(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("h5", attrs, [content]).  
1622 -public define HTML_Off_Form h5(List(HTML_Off_Form) content) = html_tag("h5", [], content).  
1623 -public define HTML_Off_Form h5(HTML_Off_Form content) = html_tag("h5", [], [content]).  
1624 -  
1625 - // <h6>  
1626 -public define HTML_Off_Form h6(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("h6", attrs, content).  
1627 -public define HTML_Off_Form h6(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("h6", attrs, [content]).  
1628 -public define HTML_Off_Form h6(List(HTML_Off_Form) content) = html_tag("h6", [], content).  
1629 -public define HTML_Off_Form h6(HTML_Off_Form content) = html_tag("h6", [], [content]).  
1630 -  
1631 - // <hr>  
1632 -public define HTML_Off_Form hr = html_void_tag("hr", []).  
1633 -public define HTML_Off_Form hr(List(CoreAttrs) attrs) = html_void_tag("hr", attrs).  
1634 -public define HTML_Off_Form hr(CoreAttrs attr) = html_void_tag("hr", [attr]).  
1635 -  
1636 - // <i>  
1637 -public define HTML_Off_Form i(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("i", attrs, content).  
1638 -public define HTML_Off_Form i(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("i", attrs, [content]).  
1639 -public define HTML_Off_Form i(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("i", [attr], content).  
1640 -public define HTML_Off_Form i(CoreAttrs attr, HTML_Off_Form content) = html_tag("i", [attr], [content]).  
1641 -public define HTML_Off_Form i(List(HTML_Off_Form) content) = html_tag("i", [], content).  
1642 -public define HTML_Off_Form i(HTML_Off_Form content) = html_tag("i", [], [content]).  
1643 -public define HTML_Off_Form i(String string) = html_tag("i", [], [text(string)]).  
1644 -public define HTML_Off_Form i(CoreAttrs attr, String string) = html_tag("i", [attr], [text(string)]).  
1645 -public define HTML_Off_Form i(List(CoreAttrs) attrs, String string) = html_tag("i", attrs, [text(string)]).  
1646 -  
1647 - // <iframe>  
1648 -public define HTML_Off_Form iframe(CoreAttrs _attr, String src, Int width, Int height) =  
1649 - html_tag("iframe", [_attr, attr("src",src), width_px(width), height_px(height)], []).  
1650 -public define HTML_Off_Form iframe(String src, Int width, Int height) =  
1651 - html_tag("iframe", [attr("src",src), width_px(width), height_px(height)], []).  
1652 -public define HTML_Off_Form iframe(String src) = html_tag("iframe", [attr("src",src)], []).  
1653 -  
1654 - // <input>  
1655 -public define HTML_Off_Form input(List(CoreAttrs) attrs) = html_void_tag("input", attrs).  
1656 -public define HTML_Off_Form input(CoreAttrs attr) = html_void_tag("input", [attr]).  
1657 -  
1658 -public define CoreAttrs type(Input_Type value)= attr("type", to_String(value)).  
1659 -public define CoreAttrs type(String value)= attr("type", value).  
1660 -public define CoreAttrs name(String value)= attr("name", value).  
1661 -public define CoreAttrs value(String value)= attr("value", value).  
1662 -public define CoreAttrs placeholder(String value) = attr("placeholder", value).  
1663 -public define CoreAttrs init(String value)= attr("value", encode_HTML_entities(value)).  
1664 - //-- BEGIN of <input> preset type  
1665 -  
1666 -public define HTML_Off_Form text_input(List(CoreAttrs) options, HTML_Label label_text, WebArgName _name, InitialValue _init, Int w) =  
1667 - sequence([  
1668 - format_label(label_text),  
1669 - input([class("in"), id(_id), name(_name), value(_int), size(w), options])  
1670 - ]).  
1671 -  
1672 - /// Checkbox  
1673 -public define HTML_Off_Form checkbox(List(CoreAttrs) attrs, String _name, String _form, Bool checked) = input([type(checkbox), name(_name), form(_form), bool_attr(checked, "checked") . attrs]).  
1674 -public define HTML_Off_Form checkbox(List(CoreAttrs) attrs, String _name, Bool checked) = input([type(checkbox), name(_name), bool_attr(checked, "checked") . attrs]).  
1675 -public define HTML_Off_Form checkbox(String name, String form, Bool checked) = checkbox([], name, form, checked).  
1676 -public define HTML_Off_Form checkbox(String name, Bool checked) = checkbox([], name, checked).  
1677 -  
1678 - /// Radio button  
1679 -public define HTML_Off_Form radio(List(CoreAttrs) attrs, String _name, String _value, String _form, Bool checked) = input([type(radio), name(_name), value(_value), form(_form), bool_attr(checked, "checked") . attrs]).  
1680 -public define HTML_Off_Form radio(List(CoreAttrs) attrs, String name, String value, String form) = radio(attrs, name, value, form, false).  
1681 -public define HTML_Off_Form radio(String name, String value, String form, Bool checked) = radio([], name, value, form, checked).  
1682 -public define HTML_Off_Form radio(String name, String value, String form) = radio([], name, value, form, false).  
1683 -  
1684 - /// hidden value  
1685 -public define HTML_Off_Form hidden(List(CoreAttrs) attrs, String name, String value, String form) = input([type("hidden"), attr("name",name), attr("value",value), attr("form", form) . attrs]).  
1686 -public define HTML_Off_Form hidden(CoreAttrs attr, String name, String value, String form) = hidden([attr], name, value, form).  
1687 -public define HTML_Off_Form hidden(String name, String value, String form) = hidden([], name, value, form).  
1688 -public define HTML_Off_Form hidden(String _name, String _value) = input([type("hidden"), name(_name), value(_value)]).  
1689 -  
1690 - //-- END of <input> preset type  
1691 -  
1692 - // <img>  
1693 -public define HTML_Off_Form img(List(CoreAttrs) attrs, String src, String alt) = html_void_tag("img", attrs + [attr("src",src), attr("alt",alt)] ).  
1694 -public define HTML_Off_Form img(CoreAttrs _attr, String src, String alt) = html_void_tag("img", [_attr, attr("src",src), attr("alt",alt)] ).  
1695 -public define HTML_Off_Form img(String src) = img([], src, "").  
1696 -public define HTML_Off_Form img(String src, String alt) = img([], src, alt).  
1697 -public define HTML_Off_Form img(List(CoreAttrs) attrs, String src) = img(attrs, src, "").  
1698 -public define HTML_Off_Form img(CoreAttrs attr, String src) = img([attr], src, "").  
1699 -public define HTML_Off_Form img(String src, Int width, Int height) = img([attr("width",to_String(width)+"px"), attr("height",to_String(height)+"px")], src, src).  
1700 -public define HTML_Off_Form img(String src, String alt, Int width, Int height) =  
1701 - html_void_tag("img", [attr("src",src), attr("alt",alt), attr("width",to_String(width)+"px"), attr("height",to_String(height)+"px")]).  
1702 -  
1703 -public define HTML_Off_Form img(List(CoreAttrs) attrs, String src, String alt, Int width, Int height) =  
1704 - html_void_tag("img", attrs + [attr("src",src), attr("alt",alt), attr("width",to_String(width)+"px"), attr("height",to_String(height)+"px")]).  
1705 -  
1706 -public define HTML_Off_Form img(CoreAttrs _attr, String src, String alt, Int width, Int height) =  
1707 - html_void_tag("img", [_attr, attr("src",src), attr("alt",alt), width_px(width), height_px(height)]).  
1708 -  
1709 - // <label>  
1710 -public define HTML_Off_Form label(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("label", attrs, content).  
1711 -public define HTML_Off_Form label(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("label", [attr], content).  
1712 -public define HTML_Off_Form label(List(HTML_Off_Form) content) = html_tag("label", [], content).  
1713 -public define HTML_Off_Form label(HTML_Off_Form content) = html_tag("label", [], [content]).  
1714 -public define HTML_Off_Form label(String string) = html_tag("label", [], [text(string)]).  
1715 -public define HTML_Off_Form label(CoreAttrs attr, String string) = html_tag("label", [attr], [text(string)]).  
1716 -public define HTML_Off_Form label(List(CoreAttrs) attrs, String string) = html_tag("label", attrs, [text(string)]).  
1717 -  
1718 - // <legend>  
1719 -public define HTML_Off_Form legend(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("legend", attrs, content).  
1720 -public define HTML_Off_Form legend(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("legend", attrs, [content]).  
1721 -public define HTML_Off_Form legend(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("legend", [attr], content).  
1722 -public define HTML_Off_Form legend(CoreAttrs attr, HTML_Off_Form content) = html_tag("legend", [attr], [content]).  
1723 -public define HTML_Off_Form legend(List(HTML_Off_Form) content) = html_tag("legend", [], content).  
1724 -public define HTML_Off_Form legend(HTML_Off_Form content) = html_tag("legend", [], [content]).  
1725 -  
1726 - // <li>  
1727 -public define HTML_Off_Form li(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("li", attrs, content).  
1728 -public define HTML_Off_Form li(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("li", attrs, [content]).  
1729 -public define HTML_Off_Form li(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("li", [attr], content).  
1730 -public define HTML_Off_Form li(CoreAttrs attr, HTML_Off_Form content) = html_tag("li", [attr], [content]).  
1731 -public define HTML_Off_Form li(List(HTML_Off_Form) content) = html_tag("li", [], content).  
1732 -public define HTML_Off_Form li(HTML_Off_Form content) = html_tag("li", [], [content]).  
1733 -public define HTML_Off_Form li(String string) = html_tag("li", [], [text(string)]).  
1734 -public define HTML_Off_Form li(CoreAttrs attr, String string) = html_tag("li", [attr], [text(string)]).  
1735 -public define HTML_Off_Form li(List(CoreAttrs) attrs, String string) = html_tag("li", attrs, [text(string)]).  
1736 -  
1737 - // <main>  
1738 -public define HTML_Off_Form main(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("main", attrs, content).  
1739 -public define HTML_Off_Form main(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("main", attrs, [content]).  
1740 -public define HTML_Off_Form main(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("main", [attr], content).  
1741 -public define HTML_Off_Form main(CoreAttrs attr, HTML_Off_Form content) = html_tag("main", [attr], [content]).  
1742 -public define HTML_Off_Form main(List(HTML_Off_Form) content) = html_tag("main", [], content).  
1743 -public define HTML_Off_Form main(HTML_Off_Form content) = html_tag("main", [], [content]).  
1744 -  
1745 - // <nav>  
1746 -public define HTML_Off_Form nav(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("nav", attrs, content).  
1747 -public define HTML_Off_Form nav(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("nav", attrs, [content]).  
1748 -public define HTML_Off_Form nav(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("nav", [attr], content).  
1749 -public define HTML_Off_Form nav(CoreAttrs attr, HTML_Off_Form content) = html_tag("nav", [attr], [content]).  
1750 -public define HTML_Off_Form nav(List(HTML_Off_Form) content) = html_tag("nav", [], content).  
1751 -public define HTML_Off_Form nav(HTML_Off_Form content) = html_tag("nav", [], [content]).  
1752 -  
1753 - // <ol>  
1754 -public define HTML_Off_Form ol(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("ol", attrs, content).  
1755 -public define HTML_Off_Form ol(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("ol", attrs, [content]).  
1756 -public define HTML_Off_Form ol(List(HTML_Off_Form) content) = html_tag("ol", [], content).  
1757 -public define HTML_Off_Form ol(HTML_Off_Form content) = html_tag("ol", [], [content]).  
1758 -  
1759 - // <option>  
1760 -public define HTML_Off_Form option(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("option", attrs, content).  
1761 -public define HTML_Off_Form option(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("option", attrs, [content]).  
1762 -public define HTML_Off_Form option(List(HTML_Off_Form) content) = html_tag("option", [], content).  
1763 -public define HTML_Off_Form option(CoreAttrs attr, HTML_Off_Form content) = html_tag("option", [attr], [content]).  
1764 -public define HTML_Off_Form option(HTML_Off_Form content) = html_tag("option", [], [content]).  
1765 -public define HTML_Off_Form option(String _value, String _text) = html_tag("option", [value(_value)], [text(_text)]).  
1766 - // <p>  
1767 -public define HTML_Off_Form p(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("p", attrs, content).  
1768 -public define HTML_Off_Form p(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("p", attrs, [content]).  
1769 -public define HTML_Off_Form p(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("p", [attr], content).  
1770 -public define HTML_Off_Form p(CoreAttrs attr, HTML_Off_Form content) = html_tag("p", [attr], [content]).  
1771 -public define HTML_Off_Form p(CoreAttrs attr, String _text) = html_tag("p", [attr], [text(_text)]).  
1772 -public define HTML_Off_Form p(List(HTML_Off_Form) content) = html_tag("p", [], content).  
1773 -public define HTML_Off_Form p(HTML_Off_Form content) = html_tag("p", [], [content]).  
1774 -  
1775 - // <pre> preformatted  
1776 -public define HTML_Off_Form pre(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("pre", attrs, content).  
1777 -public define HTML_Off_Form pre(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("pre", attrs, [content]).  
1778 -public define HTML_Off_Form pre(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("pre", [attr], content).  
1779 -public define HTML_Off_Form pre(CoreAttrs attr, HTML_Off_Form content) = html_tag("pre", [attr], [content]).  
1780 -public define HTML_Off_Form pre(List(HTML_Off_Form) content) = html_tag("pre", [], content).  
1781 -public define HTML_Off_Form pre(HTML_Off_Form content) = html_tag("pre", [], [content]).  
1782 -public define HTML_Off_Form pre(String string) = html_tag("pre", [], [text(string)]).  
1783 -public define HTML_Off_Form pre(CoreAttrs attr, String string) = html_tag("pre", [attr], [text(string)]).  
1784 -public define HTML_Off_Form pre(List(CoreAttrs) attrs, String string) = html_tag("pre", attrs, [text(string)]).  
1785 -  
1786 - // <progress>  
1787 -public define HTML_Off_Form progress(List(CoreAttrs) attrs, Int value, Int max, List(HTML_Off_Form) content) = html_tag("progress", [attr("value", value), attr("max", max) . attrs], content).  
1788 -public define HTML_Off_Form progress(List(CoreAttrs) attrs, Int value, Int max, HTML_Off_Form content) = html_tag("progress", [attr("value", value), attr("max", max) . attrs], [content]).  
1789 -public define HTML_Off_Form progress(CoreAttrs _attr, Int value, Int max, HTML_Off_Form content) = html_tag("progress", [attr("value", value), attr("max", max) , _attr], [content]).  
1790 -public define HTML_Off_Form progress(Int value, Int max, HTML_Off_Form content) = html_tag("progress", [attr("value", value), attr("max", max)], [content]).  
1791 -public define HTML_Off_Form progress(List(CoreAttrs) attrs, Int value, Int max, String content) = html_tag("progress", [attr("value", value), attr("max", max) . attrs], [text(content)]).  
1792 -public define HTML_Off_Form progress(CoreAttrs _attr, Int value, Int max, String content) = html_tag("progress", [attr("value", value), attr("max", max), _attr], [text(content)]).  
1793 -public define HTML_Off_Form progress(List(CoreAttrs) attrs, Int value, Int max) = html_tag("progress", [attr("value", value), attr("max", max) . attrs], []).  
1794 -public define HTML_Off_Form progress(CoreAttrs _attr, Int value, Int max) = html_tag("progress", [attr("value", value), attr("max", max), _attr], []).  
1795 -public define HTML_Off_Form progress(Int value, Int max, String content) = html_tag("progress", [attr("value", value), attr("max", max)], [text(content)]).  
1796 -public define HTML_Off_Form progress(Int value, Int max) = html_tag("progress", [attr("value", value), attr("max", max)], []).  
1797 -  
1798 - // <script>  
1799 -public define HTML_Off_Form script(String file_name, List(JS_Attribute) attrs) = literal_pt(add_js_files([js_file(file_name, attrs)])).  
1800 -public define HTML_Off_Form script(String content) = literal_pt(add_script([script("text/javascript", content)])).  
1801 -  
1802 - // <section>  
1803 -public define HTML_Off_Form section(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("section", attrs, content).  
1804 -public define HTML_Off_Form section(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("section", attrs, [content]).  
1805 -public define HTML_Off_Form section(List(HTML_Off_Form) content) = html_tag("section", [], content).  
1806 -public define HTML_Off_Form section(HTML_Off_Form content) = html_tag("section", [], [content]).  
1807 -  
1808 - // <select>  
1809 -public define HTML_Off_Form select(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("select", attrs, content).  
1810 -public define HTML_Off_Form select(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("select", attrs, [content]).  
1811 -public define HTML_Off_Form select(List(CoreAttrs) attrs) = html_tag("select", attrs, []).  
1812 -public define HTML_Off_Form select(List(HTML_Off_Form) content) = html_tag("select", [], content).  
1813 -public define HTML_Off_Form select(HTML_Off_Form content) = html_tag("select", [], [content]).  
1814 -  
1815 -  
1816 - // <span>  
1817 -public define HTML_Off_Form span(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("span", attrs, content).  
1818 -public define HTML_Off_Form span(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("span", attrs, [content]).  
1819 -public define HTML_Off_Form span(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("span", [attr], content).  
1820 -public define HTML_Off_Form span(CoreAttrs attr, HTML_Off_Form content) = html_tag("span", [attr], [content]).  
1821 -public define HTML_Off_Form span(List(HTML_Off_Form) content) = html_tag("span", [], content).  
1822 -public define HTML_Off_Form span(HTML_Off_Form content) = html_tag("span", [], [content]).  
1823 -public define HTML_Off_Form span(Int i) = html_tag("span", [], [text(to_decimal(i))]).  
1824 -public define HTML_Off_Form span(List(CoreAttrs) attrs, String s) = html_tag("span", attrs, [text(s)]).  
1825 -public define HTML_Off_Form span(CoreAttrs attr, String s) = html_tag("span", [attr],[text(s)]).  
1826 -public define HTML_Off_Form span(String s) = html_tag("span", [], [text(s)]).  
1827 -public define HTML_Off_Form span(List(CoreAttrs) attrs) = html_tag("span", attrs, []).  
1828 -public define HTML_Off_Form span(CoreAttrs attr) = html_tag("span", [attr],[]).  
1829 -  
1830 - // <strong>  
1831 -public define HTML_Off_Form strong(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("strong", attrs, content).  
1832 -public define HTML_Off_Form strong(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("strong", attrs, [content]).  
1833 -public define HTML_Off_Form strong(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("strong", [attr], content).  
1834 -public define HTML_Off_Form strong(CoreAttrs attr, HTML_Off_Form content) = html_tag("strong", [attr], [content]).  
1835 -public define HTML_Off_Form strong(List(HTML_Off_Form) content) = html_tag("strong", [], content).  
1836 -public define HTML_Off_Form strong(HTML_Off_Form content) = html_tag("strong", [], [content]).  
1837 -  
1838 - // <svg>  
1839 -public define HTML_Off_Form svg(List(CoreAttrs) attrs) = html_tag("svg", attrs, []).  
1840 -  
1841 -  
1842 - // <table>  
1843 -public define HTML_Off_Form table(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("table", attrs, content).  
1844 -public define HTML_Off_Form table(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("table", attrs, [content]).  
1845 -public define HTML_Off_Form table(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("table", [attr], content).  
1846 -public define HTML_Off_Form table(CoreAttrs attr, HTML_Off_Form content) = html_tag("table", [attr], [content]).  
1847 -public define HTML_Off_Form table(List(HTML_Off_Form) content) = html_tag("table", [], content).  
1848 -public define HTML_Off_Form table(HTML_Off_Form content) = html_tag("table", [], [content]).  
1849 -  
1850 - // <textarea>  
1851 - // CoreAttrs for textarea  
1852 -public define CoreAttrs wrap_lines = attr("wrap", "hard").  
1853 -public define CoreAttrs read_only = bool_attr(true, "readonly").  
1854 -public define CoreAttrs cols(Int value) = attr("cols",to_String(value)).  
1855 -public define CoreAttrs rows(Int value) = attr("rows",to_String(value)).  
1856 -  
1857 -public define HTML_Off_Form textarea(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("textarea", attrs, content).  
1858 -public define HTML_Off_Form textarea(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("textarea", attrs, [content]).  
1859 -  
1860 -public define HTML_Off_Form textarea(List(CoreAttrs) attrs, Int _cols, Int _rows, List(HTML_Off_Form) content)  
1861 - = html_tag("textarea", [cols(_cols), rows(_rows) . attrs], content).  
1862 -  
1863 -public define HTML_Off_Form textarea(List(CoreAttrs) attrs, Int _cols, Int _rows, HTML_Off_Form content)  
1864 - = html_tag("textarea", [cols(_cols), rows(_rows) . attrs], [content]).  
1865 -  
1866 -public define HTML_Off_Form textarea(Int _cols, Int _rows, HTML_Off_Form content) = html_tag("textarea", [cols(_cols), rows(_rows)], [content]).  
1867 -public define HTML_Off_Form textarea(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("textarea", [attr], content).  
1868 -public define HTML_Off_Form textarea(CoreAttrs attr, HTML_Off_Form content) = html_tag("textarea", [attr], [content]).  
1869 -  
1870 - // <thead>  
1871 -public define HTML_Off_Form thead(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("thead", attrs, content).  
1872 -public define HTML_Off_Form thead(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("thead", attrs, [content]).  
1873 -public define HTML_Off_Form thead(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("thead", [attr], content).  
1874 -public define HTML_Off_Form thead(CoreAttrs attr, HTML_Off_Form content) = html_tag("thead", [attr], [content]).  
1875 -public define HTML_Off_Form thead(List(HTML_Off_Form) content) = html_tag("thead", [], content).  
1876 -public define HTML_Off_Form thead(HTML_Off_Form content) = html_tag("thead", [], [content]).  
1877 -  
1878 - // <tbody>  
1879 -public define HTML_Off_Form tbody(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("tbody", attrs, content).  
1880 -public define HTML_Off_Form tbody(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("tbody", attrs, [content]).  
1881 -public define HTML_Off_Form tbody(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("tbody", [attr], content).  
1882 -public define HTML_Off_Form tbody(CoreAttrs attr, HTML_Off_Form content) = html_tag("tbody", [attr], [content]).  
1883 -public define HTML_Off_Form tbody(List(HTML_Off_Form) content) = html_tag("tbody", [], content).  
1884 -public define HTML_Off_Form tbody(HTML_Off_Form content) = html_tag("tbody", [], [content]).  
1885 -  
1886 - // <tfoot>  
1887 -public define HTML_Off_Form tfoot(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("tfoot", attrs, content).  
1888 -public define HTML_Off_Form tfoot(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("tfoot", attrs, [content]).  
1889 -public define HTML_Off_Form tfoot(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("tfoot", [attr], content).  
1890 -public define HTML_Off_Form tfoot(CoreAttrs attr, HTML_Off_Form content) = html_tag("tfoot", [attr], [content]).  
1891 -public define HTML_Off_Form tfoot(List(HTML_Off_Form) content) = html_tag("tfoot", [], content).  
1892 -public define HTML_Off_Form tfoot(HTML_Off_Form content) = html_tag("tfoot", [], [content]).  
1893 -  
1894 - // <th>  
1895 -public define HTML_Off_Form th(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("th", attrs, content).  
1896 -public define HTML_Off_Form th(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("th", attrs, [content]).  
1897 -public define HTML_Off_Form th(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("th", [attr], content).  
1898 -public define HTML_Off_Form th(CoreAttrs attr, HTML_Off_Form content) = html_tag("th", [attr], [content]).  
1899 -public define HTML_Off_Form th(CoreAttrs attr) = html_tag("th", [attr], []).  
1900 -public define HTML_Off_Form th(List(HTML_Off_Form) content) = html_tag("th", [], content).  
1901 -public define HTML_Off_Form th(HTML_Off_Form content) = html_tag("th", [], [content]).  
1902 -public define HTML_Off_Form th(String string) = html_tag("th", [], [text(string)]).  
1903 -public define HTML_Off_Form th(CoreAttrs attr, String string) = html_tag("th", [attr], [text(string)]).  
1904 -public define HTML_Off_Form th(List(CoreAttrs) attrs, String string) = html_tag("th", attrs, [text(string)]).  
1905 -public define HTML_Off_Form th = html_tag("th", [], []).  
1906 -  
1907 - // <td>  
1908 - // CoreAttrs for <td>  
1909 -//public define CoreAttrs colspan(Int value) = attr("colspan", to_String(value)).  
1910 -//public define CoreAttrs rowspan(Int value) = attr("rowspan", to_String(value)).  
1911 -//public define CoreAttrs headers(String header_id) = attr("headers", header_id).  
1912 -  
1913 -public define HTML_Off_Form td(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("td", attrs, content).  
1914 -public define HTML_Off_Form td(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("td", attrs, [content]).  
1915 -public define HTML_Off_Form td(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("td", [attr], content).  
1916 -public define HTML_Off_Form td(CoreAttrs attr, HTML_Off_Form content) = html_tag("td", [attr], [content]).  
1917 -public define HTML_Off_Form td(List(HTML_Off_Form) content) = html_tag("td", [], content).  
1918 -public define HTML_Off_Form td(HTML_Off_Form content) = html_tag("td", [], [content]).  
1919 -public define HTML_Off_Form td(List(CoreAttrs) attrs, String string) = html_tag("td", attrs, [text(string)]).  
1920 -public define HTML_Off_Form td(CoreAttrs attr, String string) = html_tag("td", [attr], [text(string)]).  
1921 -public define HTML_Off_Form td(String string) = html_tag("td", [], [text(string)]).  
1922 -public define HTML_Off_Form td(List(CoreAttrs) attrs, Int i) = html_tag("td", attrs, [text(to_decimal(i))]).  
1923 -public define HTML_Off_Form td(CoreAttrs attr, Int i) = html_tag("td", [attr], [text(to_decimal(i))]).  
1924 -public define HTML_Off_Form td(Int i) = html_tag("td", [], [text(to_decimal(i))]).  
1925 -  
1926 - // <tr>  
1927 -public define HTML_Off_Form tr(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("tr", attrs, content).  
1928 -public define HTML_Off_Form tr(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("tr", attrs, [content]).  
1929 -public define HTML_Off_Form tr(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("tr", [attr], content).  
1930 -public define HTML_Off_Form tr(CoreAttrs attr, HTML_Off_Form content) = html_tag("tr", [attr], [content]).  
1931 -public define HTML_Off_Form tr(List(HTML_Off_Form) content) = html_tag("tr", [], content).  
1932 -public define HTML_Off_Form tr(HTML_Off_Form content) = html_tag("tr", [], [content]).  
1933 -  
1934 - // <ul>  
1935 -public define HTML_Off_Form ul(List(CoreAttrs) attrs, List(HTML_Off_Form) content) = html_tag("ul", attrs, content).  
1936 -public define HTML_Off_Form ul(List(CoreAttrs) attrs, HTML_Off_Form content) = html_tag("ul", attrs, [content]).  
1937 -public define HTML_Off_Form ul(CoreAttrs attr, List(HTML_Off_Form) content) = html_tag("ul", [attr], content).  
1938 -public define HTML_Off_Form ul(CoreAttrs attr, HTML_Off_Form content) = html_tag("ul", [attr], [content]).  
1939 -public define HTML_Off_Form ul(List(HTML_Off_Form) content) = html_tag("ul", [], content).  
1940 -public define HTML_Off_Form ul(HTML_Off_Form content) = html_tag("ul", [], [content]).  
1941 -  
1942 -//public define HTML_Off_Form empty = html_tag(  
1943 -  
1944 -//public define HTML_Off_Form  
1945 -// form  
1946 -// (  
1947 -// String form_name,  
1948 -// List(CoreAttrs) options,  
1949 -// HTML_Off_Form content  
1950 -// ) =  
1951 -// form([id(form_name). options], [content]).  
1952 -  
1953 -//public define HTML_Off_Form  
1954 -// form  
1955 -// (  
1956 -// String form_name,  
1957 -// List(CoreAttrs) options,  
1958 -// List(HTML_Off_Form) contents  
1959 -// ) =  
1960 -// form([id(form_name) . options], contents).  
1961 -  
1962 -public define HTML_Off_Form  
1963 - form  
1964 - (  
1965 - List(CoreAttrs) options,  
1966 - WEB_Action_Name _action,  
1967 - List((String,String)) extra_ops,  
1968 - HTML_Off_Form content  
1969 - ) =  
1970 - form([action(_action, extra_ops). options], [content]).  
1971 -  
1972 -//public define HTML_Off_Form  
1973 -// form  
1974 -// (  
1975 -// List(CoreAttrs) options,  
1976 -// WEB_Action_Name action,  
1977 -// List((String,String)) extra_ops,  
1978 -// HTML_Off_Form content  
1979 -// ) =  
1980 -// form(options, action, extra_ops, [content]).  
1981 -  
1982 -public define HTML_Off_Form  
1983 - form  
1984 - (  
1985 - List(CoreAttrs) options,  
1986 - WEB_Action_Name action,  
1987 - List((String,String)) extra_ops,  
1988 - List(HTML_Off_Form) contents  
1989 - ) =  
1990 - form(options, action, extra_ops, contents).  
1991 -  
1992 -public define HTML_Off_Form  
1993 - form  
1994 - (  
1995 - List(CoreAttrs) options,  
1996 - String action,  
1997 - List((String,String)) extra_ops,  
1998 - HTML_Off_Form content  
1999 - ) =  
2000 - form(options, action_name(action), extra_ops, [content]).  
2001 -  
2002 -public define HTML_Off_Form  
2003 - form  
2004 - (  
2005 - String form_name,  
2006 - List(CoreAttrs) options,  
2007 - String action,  
2008 - List((String,String)) extra_ops,  
2009 - List(HTML_Off_Form) contents  
2010 - ) =  
2011 - form(options, action_name(action), extra_ops, contents).  
2012 -  
2013 -public define HTML_Off_Form literal(Printable_tree t) = literal_pt(t).  
2014 -//public define HTML_Off_Form fixed_size(HTML_Size width, HTML_Size height, String name_of_HTML_file)  
2015 -// = fixed_size_2(width,height,name_of_HTML_file).  
2016 -  
2017 -  
2018 -public define HTML_Off_Form  
2019 - foreign_link  
2020 - (  
2021 - Int tsize,  
2022 - String url,  
2023 - String name  
2024 - ) =  
2025 - foreign_link([size(tsize)],url,name).  
2026 -  
2027 -  
2028 -public define HTML_Off_Form  
2029 - actioner  
2030 - (  
2031 - Actioner_Connection conn,  
2032 - Actioner_Target targ,  
2033 - Actioner_Aspect asp,  
2034 - WEB_Action_Name action,  
2035 - List((String,String)) extra_ops  
2036 - ) =  
2037 - actioner(conn,targ,asp,action,extra_ops,[]).  
2038 -  
2039 -public define HTML_Off_Form  
2040 - actioner  
2041 - (  
2042 - Actioner_Connection conn,  
2043 - Actioner_Target targ,  
2044 - Actioner_Aspect asp,  
2045 - WEB_Action_Name action,  
2046 - List((String,String)) extra_ops,  
2047 - String form_name  
2048 - ) =  
2049 - actioner(conn,targ,asp,action,extra_ops,[], form_name).  
2050 -  
2051 -public define HTML_Off_Form  
2052 - actioner  
2053 - (  
2054 - Actioner_Aspect asp,  
2055 - WEB_Action_Name action,  
2056 - List((String,String)) extra_ops  
2057 - ) =  
2058 - actioner(same, same, asp, action, extra_ops, []).  
2059 -  
2060 -public define HTML_Off_Form  
2061 - actioner  
2062 - (  
2063 - Actioner_Aspect asp,  
2064 - WEB_Action_Name action,  
2065 - List((String,String)) extra_ops,  
2066 - String form_name  
2067 - ) =  
2068 - actioner(same, same, asp, action, extra_ops, [], form_name).  
2069 -  
2070 -public define HTML_Off_Form  
2071 -/* Older call with String as action instead of WEB_Action_Name.  
2072 - * This function exists only for compatibility with older project.  
2073 - * Please condiser to use above function instead  
2074 - */  
2075 - actioner  
2076 - (  
2077 - Actioner_Connection conn,  
2078 - Actioner_Target targ,  
2079 - Actioner_Aspect asp,  
2080 - String action,  
2081 - List((String,String)) extra_ops,  
2082 - List(Actioner_Local_Action) local_actions  
2083 - )=  
2084 - actioner(conn,targ,asp,action_name(action),extra_ops,local_actions)  
2085 -.  
2086 -  
2087 -public define HTML_Off_Form  
2088 -/* Older call with String as action instead of WEB_Action_Name.  
2089 - * This function exists only for compatibility with older project.  
2090 - * Please condiser to use above function instead  
2091 - */  
2092 - actioner  
2093 - (  
2094 - Actioner_Connection conn,  
2095 - Actioner_Target targ,  
2096 - Actioner_Aspect asp,  
2097 - String action,  
2098 - List((String,String)) extra_ops,  
2099 - List(Actioner_Local_Action) local_actions,  
2100 - String form_name  
2101 - )=  
2102 - actioner(conn, targ, asp, action_name(action), extra_ops, local_actions, form_name)  
2103 -.  
2104 -  
2105 -public define HTML_Off_Form  
2106 -/* Older call with String as action instead of WEB_Action_Name.  
2107 - * This function exists only for compatibility with older project.  
2108 - * Please condiser to use above function instead  
2109 - */  
2110 - actioner  
2111 - (  
2112 - Actioner_Connection conn,  
2113 - Actioner_Target targ,  
2114 - Actioner_Aspect asp,  
2115 - String action,  
2116 - List((String,String)) extra_ops  
2117 - )=  
2118 - actioner(conn,targ,asp,action_name(action),extra_ops,[])  
2119 -.  
2120 -  
2121 -public define HTML_Off_Form  
2122 -/* Older call with String as action instead of WEB_Action_Name.  
2123 - * This function exists only for compatibility with older project.  
2124 - * Please condiser to use above function instead  
2125 - */  
2126 - actioner  
2127 - (  
2128 - Actioner_Connection conn,  
2129 - Actioner_Target targ,  
2130 - Actioner_Aspect asp,  
2131 - String action,  
2132 - List((String,String)) extra_ops,  
2133 - String form_name  
2134 - )=  
2135 - actioner(conn, targ, asp, action_name(action), extra_ops, [], form_name)  
2136 -.  
2137 -  
2138 -//public define HTML_Off_Form  
2139 -// table  
2140 -// (  
2141 -// List(HTML_Row(HTML_Off_Form)) rows  
2142 -// )=  
2143 -// table([], empty, rows,empty)  
2144 -//.  
2145 -  
2146 -//public define HTML_Off_Form  
2147 -// table  
2148 -// (  
2149 -// List(Table_Option) options,  
2150 -// List(HTML_Row(HTML_Off_Form)) rows  
2151 -// ) =  
2152 -// table(options,empty,rows,empty)  
2153 -//.  
2154 -  
2155 -//public define HTML_Off_Form  
2156 -// table  
2157 -// (  
2158 -// Table_Option option,  
2159 -// HTML_Row(HTML_Off_Form) row  
2160 -// ) =  
2161 -// table([option], empty, [row], empty)  
2162 -//.  
2163 -//  
2164 -//public define HTML_Off_Form  
2165 -// table  
2166 -// (  
2167 -// HTML_Header_Row(HTML_Off_Form) h_row,  
2168 -// List(HTML_Row(HTML_Off_Form)) rows  
2169 -// ) =  
2170 -// table([],h_row,rows,empty)  
2171 -//.  
2172 -  
2173 -//public define HTML_Off_Form  
2174 -// table  
2175 -// (  
2176 -// List(Table_Option) options,  
2177 -// HTML_Header_Row(HTML_Off_Form) h_row,  
2178 -// List(HTML_Row(HTML_Off_Form)) rows  
2179 -// ) =  
2180 -// table(options,h_row,rows,empty)  
2181 -//.  
2182 -  
2183 -//public define HTML_Off_Form  
2184 -// table  
2185 -// (  
2186 -// Table_Option option,  
2187 -// HTML_Header_Row(HTML_Off_Form) h_row,  
2188 -// List(HTML_Row(HTML_Off_Form)) rows  
2189 -// ) =  
2190 -// table([option], h_row, rows,empty)  
2191 -//.  
2192 -  
2193 - We add two convenience functions for 'row'. The reason why we add two functions, one  
2194 - for 'HTML_In_Form' and one for 'HTML_Off_Form', is that adding a schema with an  
2195 - arbitrary '$T' creates too many ambiguities. This is due to the fact that, if we do so,  
2196 - the arguments of the function do not refer to any of the types defined here.  
2197 -  
2198 -public define HTML_Row(HTML_In_Form)  
2199 - row  
2200 - (  
2201 - HTML_In_Form content  
2202 - ) =  
2203 - row([],[cell([],content)]).  
2204 -  
2205 -public define HTML_Row(HTML_Off_Form)  
2206 - row  
2207 - (  
2208 - HTML_Off_Form content  
2209 - ) =  
2210 - row([],[cell([],content)]).  
2211 -  
2212 -//public define HTML_Cell(HTML_Off_Form)  
2213 -// cells_to_column_in_cell  
2214 -// (  
2215 -// List(HTML_Cell(HTML_Off_Form)) cells  
2216 -// )=  
2217 -// cell(  
2218 -// table(  
2219 -// map( (HTML_Cell(HTML_Off_Form) current_cell) |-> row(current_cell), cells)  
2220 -// )).  
2221 -  
2222 -//public define HTML_Off_Form  
2223 -// cells_to_line  
2224 -// (  
2225 -// List(HTML_Off_Form) cells  
2226 -// )=  
2227 -// table([row(  
2228 -// map (((HTML_Off_Form) current_cell) |-> cell(current_cell), cells))])  
2229 -// .  
2230 -  
2231 -public define HTML_Off_Form  
2232 - private_download  
2233 - (  
2234 - String abs_path,  
2235 - String name,  
2236 - String extra_ext  
2237 - ) =  
2238 - private_download(abs_path,name,extra_ext,failure).  
2239 -  
2240 -  
2241 -public define HTML_Off_Form  
2242 - private_download  
2243 - (  
2244 - String abs_path,  
2245 - String name,  
2246 - String extra_ext,  
2247 - String action_name,  
2248 - List((String,String)) args  
2249 - ) =  
2250 - private_download(abs_path,name,extra_ext,success((action_name,args))).  
2251 -  
2252 -.  
2253 -  
2254 -  
2255 -  
2256 -public define HTML_In_Form  
2257 - hr  
2258 - =  
2259 - hr([])  
2260 -.  
2261 -  
2262 -public define HTML_In_Form  
2263 - button  
2264 - (  
2265 - List(HTML_In_Form) elements  
2266 - )=  
2267 - button([], elements)  
2268 -.  
2269 -  
2270 -public define HTML_In_Form  
2271 - button  
2272 - (  
2273 - List(CoreAttrs) attrs,  
2274 - HTML_In_Form element  
2275 - )=  
2276 - button(attrs, [element])  
2277 -.  
2278 -  
2279 -public define HTML_In_Form  
2280 - button  
2281 - (  
2282 - HTML_In_Form element  
2283 - )=  
2284 - button([], [element])  
2285 -.  
2286 - - Cell a gap between two other cells :  
2287 -  
2288 -public define HTML_Cell(HTML_Off_Form)  
2289 - width_gap  
2290 - (  
2291 - Int w  
2292 - )=  
2293 - cell([width(w)], empty).  
2294 -  
2295 -public define HTML_Cell(HTML_In_Form)  
2296 - width_gap  
2297 - (  
2298 - Int w  
2299 - )=  
2300 - cell([width(w)],empty)  
2301 -.  
2302 - - Row a gap between two other rows :  
2303 -  
2304 -public define HTML_Row(HTML_Off_Form)  
2305 - height_gap  
2306 - (  
2307 - Int h  
2308 - )=  
2309 - row([],[cell([height(h)],empty)]).  
2310 -  
2311 -public define HTML_Row(HTML_In_Form)  
2312 - height_gap  
2313 - (  
2314 - Int h  
2315 - )=  
2316 - row([],[cell([height(h)],empty)])  
2317 -.  
2318 -  
2319 -  
2320 - Notice that the two types have alternatives in common (same name, same arguments types,  
2321 - up to the value of the parameter $T), which correspond to elements which may be put  
2322 - anywhere in the page.  
2323 -  
2324 -public define HTML_Partial_Content  
2325 - partial_content  
2326 - (  
2327 - List(HTML_Head_Tag) tags,  
2328 - List(HTML_Off_Form) content  
2329 - )=  
2330 - partial_content(tags, sequence(content)).  
2331 -  
2332 -public define HTML_Partial_Content  
2333 - partial_content  
2334 - (  
2335 - HTML_Off_Form content  
2336 - )=  
2337 - partial_content([], content).  
2338 -  
2339 -public define HTML_Partial_Content  
2340 - partial_content  
2341 - (  
2342 - List(HTML_Off_Form) content  
2343 - )=  
2344 - partial_content([], sequence(content)).  
2345 -  
2346 -public define HTML_Partial_Content  
2347 - partial_content  
2348 - (  
2349 - List(HTML_Head_Tag) tags,  
2350 - HTML_Partial_Content p_content  
2351 - )=  
2352 - if p_content is partial_content(ptags, html) then  
2353 - partial_content(tags + ptags, html).  
2354 -  
2355 -define HTML_Partial_Content  
2356 - list_to_pcontent  
2357 - (  
2358 - List(HTML_Partial_Content) l_p_content,  
2359 - List(HTML_Head_Tag) so_far_tags,  
2360 - List(HTML_Off_Form) so_far_html  
2361 - )=  
2362 - if l_p_content is  
2363 - {  
2364 - [] then partial_content(so_far_tags, sequence(reverse(so_far_html))),  
2365 - [h . t] then  
2366 - //extract resurgent type and symbols of h  
2367 - if h is partial_content(tags, html) then  
2368 - list_to_pcontent(t, so_far_tags + tags, [html . so_far_html])  
2369 - }.  
2370 -  
2371 -public define HTML_Partial_Content  
2372 - partial_content  
2373 - (  
2374 - List(HTML_Partial_Content) l_p_content  
2375 - )=  
2376 - list_to_pcontent(l_p_content, [], []).  
2377 -  
2378 -public define HTML_Partial_Content  
2379 - partial_empty  
2380 - =  
2381 - partial_content(empty)  
2382 -.  
2383 -  
2384 -define String  
2385 - format  
2386 - (  
2387 - List(Text_Option) l  
2388 - ).  
2389 -  
2390 -  
2391 -  
2392 -  
2393 -define Printable_tree  
2394 - format_css_styles  
2395 - (  
2396 - List(CSS_Style) l  
2397 - ) =  
2398 - if l is  
2399 - {  
2400 - [ ] then [ ],  
2401 - [h . t] then  
2402 - [ if h is  
2403 - {  
2404 - text_options(tos) then  
2405 - [" body, span, p { ", format(tos), " }\n" ]  
2406 - }  
2407 - . format_css_styles(t)]  
2408 - }.  
2409 -  
2410 -  
2411 -  
2412 -  
2413 -  
2414 - Meta tags are put in the 'head' of the HTML page.  
2415 -  
2416 -public define HTML_Meta  
2417 - refresh  
2418 - (  
2419 - Actioner_Connection connection,  
2420 - Actioner_Target target,  
2421 - String action,  
2422 - Int delay  
2423 - )=  
2424 - refresh(connection, target, action_name(action), delay)  
2425 -.  
2426 -  
2427 -  
2428 -  
2429 -  
2430 -  
2431 -  
2432 -  
2433 -  
2434 -public define HTTP_Answer  
2435 - html_page  
2436 - (  
2437 - String title,  
2438 - List(HTML_Head_Tag) head_tags,  
2439 - HTML_Body body  
2440 - )=  
2441 - html_page(http_ok, title, head_tags,[],[],[],[],body).  
2442 -  
2443 -public define HTTP_Answer  
2444 - html_page  
2445 - (  
2446 - String title,  
2447 - List(HTML_Head_Tag) head_tags,  
2448 - List(CSS_Style) styles,  
2449 - HTML_Body body  
2450 - )=  
2451 - html_page(http_ok, title, head_tags, styles, [], [], [], body).  
2452 -  
2453 -public define HTTP_Answer  
2454 - web_controller_error_page  
2455 - (  
2456 - String name  
2457 - )  
2458 - =  
2459 - html_page  
2460 - (  
2461 - name+" Controller error", // title of web site  
2462 - [], // list of 'META' tags (empty for this site)  
2463 - body // body of page  
2464 - (  
2465 - // list of body options  
2466 - [  
2467 - //background_color(rgb(255,200,200))  
2468 - // add more body options here  
2469 - ],  
2470 -  
2471 - // content of page  
2472 - text(name+" Controller error")  
2473 - )  
2474 - )  
2475 -.  
2476 -  
2477 -  
2478 - 'HTTP_Answer' represents the final product of the construction of a web page.  
2479 -  
2480 -  
2481 -  
2482 -  
2483 - *** (3.2) ``in form'' versus ``off form''.  
2484 -  
2485 - There is a variety of HTML elements: texts, buttons, links, forms, inputs, etc... Some  
2486 - of them may have a content, which is yet another HTML element (or several). Hence, it  
2487 - is meaningful to say that an element is 'within' another one. Now, putting any element  
2488 - within any other one may be meaningless. For example, an input element must be put  
2489 - within a form (otherwise, it is useless), and a from within another form has no precise  
2490 - meaning (and is forbidden by the HTML specification).  
2491 -  
2492 - Actually, the main criterium is ``within a form or not within a form''. So, HTML  
2493 - elements in a given page are separated into two categories: those who are within a  
2494 - form, and the others. Nevertheless, there are elements which may belong to both  
2495 - categories, like images and texts. We want to make use of the strong typing mecanism of  
2496 - Anubis in order to forbid non meaningful placement of elements.  
2497 -  
2498 - The type 'HTML_In_Form' defines elements to be put within forms. Similarly,  
2499 - 'HTML_Off_Form' defines elements not to be put within forms. Both types are recursive,  
2500 - and 'HTML_Off_Form' refers to 'HTML_In_Form' (via the 'form' alternative, of course),  
2501 - but the two types are not cross recursive. This is the reason why it is impossible to  
2502 - put a form within a form. In order to construct a web page, you essentially have to  
2503 - produce a datum of type 'HTML_Off_Form' (maybe containing data of type 'HTML_In_Form').  
2504 -  
2505 - In practice, you don't have to worry so much about these two types, because elements  
2506 - which may be put anywhere are constructed for both types by functions with the same  
2507 - name and the same arguments. Hence, for both types, you just write the same thing. You  
2508 - are warned by the compiler only when you try to put an element at a place it is not  
2509 - allowed.  
2510 -  
2511 -  
2512 -  
2513 - *** (3.3) Defining your own style.  
2514 -  
2515 - We provide generic tools for constructing HTML elements. However, your web site needs  
2516 - to have a ``style''.  
2517 -  
2518 - To that end, you need to write down a set of ``styling functions'', using the tools  
2519 - defined here. These styling functions allow the introduction of your colors and other  
2520 - visual characteristics into the constructed elements once and for all. For example, you  
2521 - may want all your texts to be rendered in the ``Helvetica'' font, in size 14 and using  
2522 - some 'text_color'. You may write something like this:  
2523 -  
2524 - define RGB text_color = rgb(10,40,40).  
2525 -  
2526 - define HTML_Off_Form  
2527 - text  
2528 - (  
2529 - String the_text  
2530 - ) =  
2531 - text([font("helvetica"),size(14),color(text_color)],  
2532 - the_text).  
2533 -  
2534 - (and the same one for type 'HTML_In_Form') so that in order to put a piece of text in a  
2535 - page, you just write:  
2536 -  
2537 - text("... some text ...")  
2538 -  
2539 - and you don't have to provide the font, size and color for each text. If you want to  
2540 - have several styles of text presentation, you just write several sets of such  
2541 - convenience functions. This also suggests a trick. You may want for example different  
2542 - colors for 'in form' texts and 'off form' texts. This may be achieved automatically by  
2543 - defining two functions as above, with the same name and same argument type, but  
2544 - returning either a 'HTML_In_Form' or a 'HTML_Off_Form'.  
2545 -  
2546 - If this preliminary work is well done, you will not waste your time later when you  
2547 - concentrate on the actual informational content of your pages.  
2548 -  
2549 - This general principle should be applied to all sorts of elements. This is the best  
2550 - thing to do in order to separate the functions defining the visual style from the  
2551 - functions defining the informational content itself, so that changing the style without  
2552 - changing the content becomes easy. This is also the best way for having a clean and  
2553 - easily readable source for your web site.  
2554 -  
2555 -  
2556 -  
2557 -  
2558 -  
2559 - *** (3.4) Actioners and forms.  
2560 -  
2561 - We have gathered several notions from HTML into that of an 'actioner'. An actioner is  
2562 - an HTML element which opens a connection to our server when clicked upon. Actioners may  
2563 - have different visual aspects. They may look like hypertext links or like buttons  
2564 - (rollovers), or even like selectors (with immediate action). In any case, their  
2565 - behavior is the same: they open a connection to our server, and send a set of 'web  
2566 - arguments', i.e. pairs 'name=value'. Among these web arguments, one of them denotes  
2567 - the action to be performed, and the others should be considered as operands for this  
2568 - action. Actually, the precise behavior of the actioner has several variants.  
2569 -  
2570 - The connection with the server may be secured (HTTPS) or non secured (HTTP). See the  
2571 - type 'Actioner_Connection' above.  
2572 -  
2573 - You must also choose where the answer must be rendered. This may be in the same window  
2574 - or in another window (or frame). If it is in another window, the name of that window  
2575 - must be given. If the window does not exist, the browser will create it. Optionally,  
2576 - you may give the dimensions of the new window and other characteristics. See the type  
2577 - 'Actioner_Target' above.  
2578 -  
2579 - The actioner also has a visual aspect. See the type 'Actioner_Aspect' above. In the  
2580 - case of a rollover button, you provide the URLs of two images (of the same size)  
2581 - representing the button:  
2582 -  
2583 - url_off: to be used when the mouse is not over the button,  
2584 - url_on: to be used when the mouse is over the button.  
2585 -  
2586 - You can also create rollover buttons without creating images. Just use the second  
2587 - alternative named 'button'. The server creates the images automatically.  
2588 -  
2589 - The purpose of forms is just to give operands to actioners. If the actioner is placed  
2590 - within a form, all the input elements which are within this form provide operands to  
2591 - the actioner (except sometimes when they are not set by the client). If it is not put  
2592 - within a form, the actioner gets no operand, except if the name of a form is explicitly  
2593 - given, in which case the actioner gets all the inputs from that form as  
2594 - operands. Furthermore, you may want to give extra operands to the actioner. This may be  
2595 - useful for separating families of actioners with the same action name. Extra operands  
2596 - 'name=value' must be given in the form of pairs '(name,value)'.  
2597 -  
2598 - Notice that the name of a form may be used by an actioner which is off the form, so as  
2599 - to get the operands provided by this form. Also notice that several actioners may refer  
2600 - to the same form, being either in the form, or referring to the form from the  
2601 - outside. These actioners simply get the same set of operands, even if they correspond  
2602 - to distinct actions.  
2603 -  
2604 - Input elements may be put only within a form.  
2605 -  
2606 -  
2607 -  
2608 - *** (3.5) Local popup.  
2609 -  
2610 - This element looks like a link or a rollover button. When this button is clicked upon,  
2611 - a 'popup window' appears. Actually, this popup window is just a layer in the same HTML  
2612 - page, which becomes suddenly visible. It is realized with a '<div>' HTML tag. In  
2613 - particular, clicking on the button does not open any connection. This is why it is  
2614 - called 'local'. The arguments have the following roles:  
2615 -  
2616 - Actioner_Aspect aspect of the button (same semantics as for actioners)  
2617 - content content of the popup window  
2618 - x, y, position of the popup window on the HTML page (not relative  
2619 - to the button but to the page itself)  
2620 - title title of the popup window  
2621 - color color of the title bar and close button in the popup window.  
2622 - A lightened version of this color is used for the background  
2623 - of the popup window.  
2624 - width width of the title bar  
2625 -  
2626 -  
2627 -  
2628 -  
2629 -  
2630 - --- That's all for the public part ! --------------------------------------------------  
2631 -  
2632 -  
2633 -  
2634 -  
2635 -  
2636 - ----------------------------------- Table of Contents ---------------------------------  
2637 -  
2638 - *** [1] States.  
2639 - *** [1.1] Saving and retrieving states.  
2640 - *** [1.2] Deleting out of date states.  
2641 -  
2642 - *** [2] Sessions.  
2643 - *** [2.1] Saving and retrieving sessions.  
2644 - *** [2.2] Deleting out of date sessions.  
2645 -  
2646 - *** [3] Tools.  
2647 - *** [3.1] Directories.  
2648 - *** [3.2] Secondary documents.  
2649 -  
2650 - *** [4] Managing web arguments.  
2651 - *** [3.1] Prefixing web arguments names.  
2652 - *** [3.2] Separating web arguments.  
2653 - *** [3.3] Applying an action.  
2654 -  
2655 - *** [5] Web site descriptions and the 'awp handlers'.  
2656 - *** [4.1] The type 'Web_Site'.  
2657 - *** [4.2] Making a web site description.  
2658 - *** [4.3] Starting the servers.  
2659 -  
2660 - *** [6] HTML Formating.  
2661 - *** [5.1] The type 'HTML_Any($T)'.  
2662 - *** [5.2] Formating a color.  
2663 - *** [5.3] Creating buttons.  
2664 - *** [5.4] Formating an actioner.  
2665 - *** [5.5] Formating a private download link.  
2666 - *** [5.6] Formating rows and cells in a table.  
2667 - *** [5.7] Formating elements which may be put anywhere.  
2668 - *** [5.8] Formating 'in form' elements.  
2669 - *** [5.9] Formating 'off form' elements.  
2670 - *** [5.10] Formating meta-tags.  
2671 -  
2672 - ---------------------------------------------------------------------------------------  
2673 -public type CommonInfo:...  
2674 -  
2675 -define Printable_tree  
2676 - format  
2677 - (  
2678 - CommonInfo cinfo,  
2679 - Var(Int) ic_v, // 'idnum' counter variable  
2680 - HTML_Off_Form element,  
2681 - Bool is_https,  
2682 - Var(Int) action_count,  
2683 - Var(List(HTML_Head_Tag)) head_tags  
2684 - ).  
2685 -  
2686 -public define String  
2687 - doctype_w3c_header  
2688 - =  
2689 - "<!DOCTYPE html>\n". //html 5  
2690 -  
2691 -  
2692 - *** [1] States.  
2693 -  
2694 - We have to define functions for saving a state, retrieving a state, deleting out of  
2695 - date states. We need one such function per web site. The types of the first two  
2696 - functions depend on the parameter $State. This is not the case of the third one. The  
2697 - fact that the instance of $State is variable from one web sites to the other implies  
2698 - rather subtle manipulations using full functionality.  
2699 -  
2700 -  
2701 - *** [1.1] Saving and retrieving states.  
2702 -  
2703 - Each state is saved into a file on the server's disk (in the directory represented by  
2704 - the symbol 'state_directory', which is 'my_anubis/web_sites/common_name/states'). The  
2705 - state is saved together with a time stamp whose value is obtained by adding the current  
2706 - time to the given timeout for states. The state receives a name obtained by hashing  
2707 - (using sha1) the content of the file itself, and then encoding the hash with  
2708 - 'web_arg_encode'. The name of the file into which the state is saved is the  
2709 - concatenation of "s" and the name of the state.  
2710 -  
2711 -read web_arg_encode.anubis  
2712 -  
2713 - The tool below constructs the function which is able to save a state on the server's  
2714 - disk.  
2715 -  
2716 -  
2717 -define ($State s) -> String // the function constructed returns the name of the state  
2718 - make_save_state_function  
2719 - (  
2720 - Int timeout,  
2721 - String state_directory,  
2722 - (LogLevel, String) -> One logger  
2723 - )=  
2724 - ($State s) |->  
2725 - with time_stamp = now+timeout,  
2726 - to_be_saved = (time_stamp,s),  
2727 - state_name = to_ascii(sha1(s)),  
2728 - //println("make_save_state_function " + state_directory+"/s"+state_name);  
2729 - if save(to_be_saved,state_directory+"/s"+state_name) is ok then  
2730 - state_name  
2731 - else  
2732 - logger(logError, "Cannot create state file in '"+state_directory+"'.\n");  
2733 - ""  
2734 -.  
2735 -  
2736 -  
2737 - When a request arrives, we need to retrieve the previous state from the server's  
2738 - disk. We receive the name of that state. If the state is out of date, the state file is  
2739 - kept 3 days, and then deleted.  
2740 -  
2741 -type PreviousState($State):  
2742 - not_found, // cannot retrieve the previous state  
2743 - out_of_date($State), // the previous state is out of date  
2744 - still_valid($State). // the previous state is still valid  
2745 -  
2746 -define (String state_name) -> PreviousState($State)  
2747 - make_retrieve_state_function  
2748 - (  
2749 - String state_directory  
2750 - ) =  
2751 - (String state_name) |->  
2752 - with file_path = state_directory+"/s"+state_name,  
2753 - if (RetrieveResult((Int,$State)))retrieve(file_path) is ok(d)  
2754 - then (  
2755 - if d is (time_stamp,s) then  
2756 - if time_stamp < now  
2757 - then (  
2758 - forget(remove(file_path));  
2759 - out_of_date(s)  
2760 - )  
2761 - else still_valid(s) // state has been successfully retrieved  
2762 - )  
2763 - else  
2764 - forget(remove(file_path));  
2765 - not_found.  
2766 -  
2767 -  
2768 -  
2769 - *** [1.2] Deleting out of date states.  
2770 -  
2771 - We also need to delete states which are out of date and which will never be deleted by  
2772 - the above method. This may be performed by a machine doing this periodically (say once  
2773 - per states life time period).  
2774 -  
2775 -define (List(String) file_names) -> One  
2776 - make_delete_out_of_date_states_function  
2777 - (  
2778 - Maybe($State) dummy,  
2779 - String state_directory  
2780 - )=  
2781 - (List(String) file_names) |-df->  
2782 - if file_names is  
2783 - {  
2784 - [ ] then unique,  
2785 - [h . t] then  
2786 - //we can't delete the "." and ".." file. So go to next file in the list  
2787 - if h = "." | h = ".." then  
2788 - df(t)  
2789 - else  
2790 - with file_path = state_directory+"/"+h,  
2791 - if (RetrieveResult((Int,$State)))retrieve(file_path) is ok(d)  
2792 - then (  
2793 - if d is (time_stamp,data) then  
2794 - if time_stamp < now  
2795 - then (forget(remove(file_path)); df(t))  
2796 - else df(t)  
2797 - )  
2798 - else (forget(remove(file_path)); df(t))  
2799 - }  
2800 -.  
2801 -  
2802 -  
2803 - The 'labelled arrow' |-df-> is documented in 'documentation/en/anubis_doc.txt'.  
2804 -  
2805 - Note: The argument 'dummy' (of type Maybe($State)) is not used in the body of the  
2806 - function (hence its name). Nevertheless, it is required. Indeed, the Anubis compiler  
2807 - does not accept a parameter in the body of a function (here the parameter is required  
2808 - by the use of 'retrieve') if this parameter does not appear in the type of the  
2809 - function. This is because this would create ambiguities that no explicit typing may  
2810 - ever resolve. If you put a double slash in front of the declaration of 'dummy' above,  
2811 - and if you compile this file, you will get a message like this one:  
2812 -  
2813 - Error in 'making_a_web_site.anubis', line 1300, column 7:  
2814 - A definition may not contain parameters which are not present  
2815 - in the declaration part (hidden parameters):  
2816 - $State  
2817 -  
2818 - The type of the function constructed by 'make_delete_out_of_date_states_function' is  
2819 - independant of the parameter $State. This is important because this allows to create  
2820 - the list of such functions for all web sites. From this list, it is possible to call  
2821 - the functions one after the other, so deleting out of date states for all web  
2822 - sites. Actually, the next function receives a list of pairs (state_directory,function),  
2823 - one for each web site.  
2824 -  
2825 -define One  
2826 - delete_out_of_date_states // for all web sites  
2827 - (  
2828 - List((String, List(String) -> One)) directories_and_functions  
2829 - ) =  
2830 - if directories_and_functions is  
2831 - {  
2832 - [ ] then unique,  
2833 - [h . t] then if h is (state_directory,function) then  
2834 - function(directory_list(state_directory,"*"));  
2835 - delete_out_of_date_states(t)  
2836 - }.  
2837 -  
2838 -  
2839 - The above function must be called periodically in a separate virtual machine. The  
2840 - period we have choosen is (rather logically) the life time of states itself. This may  
2841 - be achieved by an 'infinite' loop, using a 'sleep(timeout)'. However, the loop must not  
2842 - be really infinite, because the servers may be shutdown. Hence, our loop must test  
2843 - (rather frequently; say every second) if the servers are down. If they are, the loop  
2844 - must be exited.  
2845 -  
2846 -define One  
2847 - delete_states_loop  
2848 - (  
2849 - List((String,List(String) -> One)) directories_and_functions,  
2850 - Int timeout,  
2851 - Int next_time,  
2852 - Server http_server,  
2853 - Server https_server,  
2854 - (One) -> Bool shutdown_required  
2855 - ) =  
2856 - if shutdown_required(unique)  
2857 - then (shutdown(http_server); shutdown(https_server))  
2858 - else unique;  
2859 - if (is_down(http_server) & is_down(https_server))  
2860 - then unique  
2861 - else if now > next_time  
2862 - then  
2863 - (  
2864 - delete_out_of_date_states(directories_and_functions);  
2865 - delete_states_loop(directories_and_functions,  
2866 - timeout,  
2867 - now+timeout,  
2868 - http_server,  
2869 - https_server,  
2870 - shutdown_required)  
2871 - )  
2872 - else  
2873 - (  
2874 - sleep(1000); // sleep just one second and try again  
2875 - delete_states_loop(directories_and_functions,  
2876 - timeout,  
2877 - next_time,  
2878 - http_server,  
2879 - https_server,  
2880 - shutdown_required)  
2881 - ).  
2882 -  
2883 - The above loop must be run in a separate virtual machine. This will be done just after  
2884 - the two servers are started.  
2885 -  
2886 -  
2887 -  
2888 -  
2889 -  
2890 - *** [2] Tools.  
2891 -  
2892 - *** [2.1] Directories.  
2893 - *** [2.2] Secondary documents.  
2894 -  
2895 - Some HTML elements (like '<object>', '<frame>') cannot receive their content directly  
2896 - from the current document, but only through an URL. For this reason, we implement a  
2897 - mecanism for creating secondary documents on the fly. To that end we use the 'private  
2898 - download' mecanism.  
2899 -  
2900 - A secondary document is formated by the same functions as the main document itself. The  
2901 - next function takes an 'off form' element, creates the file containing the secondary  
2902 - document in HTML format, and returns the URL at which the document will be available.  
2903 -  
2904 -define String  
2905 - create_secondary_document  
2906 - (  
2907 - String sd, // site directory  
2908 - String as, // authorization_secret  
2909 - $T -> Printable_tree format_element,  
2910 - $T content,  
2911 - HTML_Size width  
2912 - ) =  
2913 - with private_download_directory = sd+"/private_download",  
2914 - hash = web_arg_encode(sha1(content)),  
2915 - file_content = (Printable_tree)  
2916 - [doctype_w3c_header,  
2917 - "<html><body><table ",  
2918 - if width is  
2919 - {  
2920 - absolute(w) then ["width=\"",w-25],  
2921 - percentage(w) then ["width=\"95%\""]  
2922 - },"\"><tbody><tr><td align=right>",  
2923 - format_element(content),  
2924 - "</td></tr></tbody></table></body></html>"  
2925 - ],  
2926 - file_name = "sd"+hash+".html",  
2927 - file_path = private_download_directory+"/"+file_name,  
2928 - if write_to_file(file_path,file_content) is  
2929 - {  
2930 - cannot_open_file then print("Cannot open file '"+file_path+"'.\n"); "",  
2931 - write_error(n) then print("Error writing file '"+file_path+"'.\n"); "",  
2932 - ok then file_name+"?zauth="+  
2933 - make_authorization(sd,as,private_download_directory+"/"+file_name)  
2934 - }.  
2935 -  
2936 -  
2937 -  
2938 -  
2939 - *** [2.3] Generating unique ids.  
2940 -  
2941 - In order to uniquely name object for JavaScript we generate unique ids from a counter.  
2942 -  
2943 -define Int  
2944 - new_idnum  
2945 - (  
2946 - Var(Int) ic_v // 'idnum' counter variable  
2947 - ) =  
2948 - protect  
2949 - with result = *ic_v+1,  
2950 - ic_v <- result;  
2951 - result.  
2952 -  
2953 -  
2954 -  
2955 -  
2956 -  
2957 -  
2958 - *** [3] Managing web arguments.  
2959 -  
2960 - Web arguments are those pairs 'name=value' which are transmitted through the HTTP  
2961 - protocol. We need precise naming conventions for these web arguments.  
2962 -  
2963 -  
2964 -  
2965 - *** [3.2] Separating web arguments.  
2966 -  
2967 - When a new request arrives, we need to separate the web arguments, that is to say:  
2968 -  
2969 - - find the value of "s", and recover the corresponding state,  
2970 - - find the value of "a", which is the name of the action to be performed,  
2971 - - get the list of all the remaining web arguments (operands of the action).  
2972 -  
2973 - We must also determine if the previous state may be recovered. If it is not the case  
2974 - (either because the previous state name is invalid, or the previous state is out of  
2975 - date), we must check if there is an action name. Indeed, the presence of an action name  
2976 - indicates that the user has clicked on one of our buttons or links. If on the contrary  
2977 - there is no action name the user has just entered our address in his browser. In this  
2978 - last case, we must send the first page of our site (maybe a 'login' page), but if there  
2979 - is an action, we must send a page just saying that the session ticket has expired. If  
2980 - the previous state is recovered and there is no action, the new state is the same as  
2981 - the previous state.  
2982 -  
2983 - The result of the separation of the web arguments is of type:  
2984 -  
2985 -type Separated_Web_Args($State):  
2986 - swa(PreviousState($State) previous_state,  
2987 - Maybe(String) action_name,  
2988 - List(Web_arg) operands).  
2989 -  
2990 -  
2991 -  
2992 - The next function constructs the function which separates the web arguments.  
2993 -  
2994 -define (List(Web_arg) lwa, HTTP_Info info) -> Separated_Web_Args($State)  
2995 - make_separate_web_args_function  
2996 - (  
2997 - String state_directory,  
2998 - String -> PreviousState($State) retrieve_state,  
2999 - String website_name  
3000 - ) =  
3001 - (List(Web_arg) lwa, HTTP_Info info) |-swaf->  
3002 - if lwa is  
3003 - {  
3004 - [ ] then  
3005 - //  
3006 - // no web arg found => no previous state and no action  
3007 - //  
3008 - //println("find_cookie(\"state_"+website_name+"\", ...");  
3009 - if find_cookie("state_"+website_name, server_get_cookies(http_headers(info))) is  
3010 - {  
3011 - failure then  
3012 - //println("find_cookie(\"state_"+website_name+"\" failure");  
3013 - swa(not_found,failure,[]),  
3014 -  
3015 - success(cookie) then  
3016 - //println("find_cookie(\"state_"+website_name+"\" success");  
3017 - swa(retrieve_state(value(cookie)),failure,[])  
3018 - },  
3019 -  
3020 - //swa(failure,failure,[]),  
3021 -  
3022 - [wa_1 . wa_others] then  
3023 - //  
3024 - // at least one web arg =>  
3025 - // separate other web args, and insert the first one as needed  
3026 - //  
3027 - if (Separated_Web_Args($State))swaf(wa_others, info) is  
3028 - {  
3029 - swa(ps1, // possible previous state  
3030 - an1, // maybe an action name  
3031 - op1) // operands so far  
3032 - then  
3033 - if wa_1 is  
3034 - {  
3035 - web_arg(n, value) then  
3036 - with name = if substr(n,0,4) = "amp;" then substr(n, 4, length(n) - 4) else n,  
3037 - if name = "a" then  
3038 - swa(ps1,success(value),op1)  
3039 - else if name = "aws_action" | name = "aws_a" then  
3040 - swa(ps1,success(value),op1)  
3041 - //else if name = "t" then  
3042 - // swa(ps1,an1,[web_arg("target",value) . op1])  
3043 - else  
3044 - swa(ps1,an1,[web_arg(name,value) . op1]),  
3045 -  
3046 - upload(n,v,t) then  
3047 - swa(ps1,an1,[wa_1 . op1])  
3048 - }  
3049 - }  
3050 - }.  
3051 -  
3052 - *** [3.3] Applying an action.  
3053 -  
3054 - When the web arguments are separated (and their names cleaned up from prefixes), we may  
3055 - apply the action to the operands and the current state. We search for the action to be  
3056 - applied in the list of actions. If no action is found, the new state is the same as  
3057 - the previous state. Also, we deny the application of an HTTP action if the request  
3058 - arrives through the HTTPS channel and conversely.  
3059 -  
3060 -define ($State previous,  
3061 - String action_name,  
3062 - HTTP_Info http_info,  
3063 - List(Web_arg) lwa,  
3064 - Bool is_https) -> $State  
3065 - make_apply_action_function  
3066 - (  
3067 - List(Web_Action($State)) actions_list,  
3068 - (LogLevel, String) -> One logger //logger  
3069 - )=  
3070 - with f =  
3071 - ($State previous,  
3072 - String action_name,  
3073 - HTTP_Info http_info,  
3074 - List(Web_arg) lwa,  
3075 - Bool is_https,  
3076 - List(Web_Action($State)) actions) |-f->  
3077 - //println("Looking for action ["+action_name+"]");  
3078 - if actions is  
3079 - {  
3080 - [ ] then  
3081 - logger(logError, "action '"+action_name+"' not found.\n"); previous,  
3082 - [ac1 . others] then if ac1 is  
3083 - {  
3084 - //check for http action  
3085 - http_action(an, allow, do_it) then  
3086 -  
3087 - //Action name found  
3088 - if an = action_name then  
3089 - if is_https then  
3090 - (logger(logError, "HTTP action '"+an+"' called through HTTPS (denied).\n"); previous)  
3091 - else  
3092 - if allow(previous) then  
3093 - do_it(http_info,lwa,previous)  
3094 - else  
3095 - previous  
3096 - else  
3097 - f(previous,action_name,http_info,lwa,is_https,others),  
3098 - //check https action  
3099 - https_action(an,allow,do_it) then  
3100 - if an = action_name  
3101 - then if is_https  
3102 - then if allow(previous)  
3103 - then do_it(http_info,lwa,previous)  
3104 - else previous  
3105 - else (logger(logError, "HTTPS action '"+an+"' called through HTTP (denied).\n");  
3106 - previous)  
3107 - else f(previous,action_name,http_info,lwa,is_https,others),  
3108 -  
3109 - http_https_action(an,allow,do_it) then  
3110 - if an = action_name then  
3111 - println("Action ["+action_name+"] found");  
3112 - if allow(previous)  
3113 - then do_it(http_info,lwa,previous)  
3114 - else  
3115 - println("user not allowed to execute that Action ["+action_name+"]");  
3116 - previous  
3117 - else f(previous,action_name,http_info,lwa,is_https,others),  
3118 -  
3119 - }  
3120 - },  
3121 - ($State previous,  
3122 - String action_name,  
3123 - HTTP_Info http_info,  
3124 - List(Web_arg) lwa,  
3125 - Bool is_https) |->  
3126 - f(previous, action_name, http_info, lwa, is_https, actions_list).  
3127 -  
3128 - *** [4] Web site descriptions and the 'awp handlers'.  
3129 -  
3130 - *** [4.1] The type 'Web_Site'.  
3131 -  
3132 - The type 'Web_Site_Description' is defined in 'web/multihost_http_server.anubis'. We  
3133 - need another one, because, we have some extra informations to record for each site.  
3134 -  
3135 -public type Web_Site:  
3136 - web_site((Word32,Word32) -> Web_Site_Description description,  
3137 - List(String) -> One delete_out_of_date).  
3138 -  
3139 -  
3140 -  
3141 -  
3142 - *** [4.2] Making a web site description.  
3143 -  
3144 - Below is the function which creates a web site description. It first creates (if  
3145 - needed) the directories for the site, then constructs the tool functions for the site,  
3146 - and the site handler. Finally, it constructs the web site description.  
3147 -  
3148 - We gather common (constant) informations in the following type:  
3149 -  
3150 -public type CommonInfo:  
3151 - info(String common_name,  
3152 - Word32 http_port,  
3153 - Word32 https_port,  
3154 - String site_directory,  
3155 - String authorization_secret  
3156 - ).  
3157 -  
3158 - We need a forward declaration.  
3159 -  
3160 -public define AWP_Handler_Answer  
3161 - format  
3162 - (  
3163 - CommonInfo cinfo,  
3164 - List(HTTP_header) headers,  
3165 - HTTP_Answer page,  
3166 - Bool is_https,  
3167 - String charset  
3168 - ).  
3169 -  
3170 -  
3171 -define Printable_tree  
3172 - format  
3173 - (  
3174 - HTML_Size s  
3175 - ) =  
3176 - if s is  
3177 - {  
3178 - absolute(x) then ["\"",x,"\""],  
3179 - percentage(x) then ["\"",x,"%\""]  
3180 - }.  
3181 -  
3182 -define List(HTTP_header)  
3183 - make_state_cookie_headers  
3184 - (  
3185 - String website_name,  
3186 - String state_name  
3187 - )  
3188 - =  
3189 - //println("Set-Cookie state_"+website_name+"="+state_name);  
3190 - [  
3191 - http_header("Set-Cookie", "state_"+website_name+"="+state_name)  
3192 - ]  
3193 - .  
3194 -  
3195 -  
3196 -public define Web_Site  
3197 - make_web_site_description  
3198 - (  
3199 - String website_name, // site_UID  
3200 - List(String) common_names, // for example: ["www.our-business.com"]  
3201 - String site_directory,  
3202 - String state_directory,  
3203 - One -> One init,  
3204 - (HTTP_Info,  
3205 - List(Web_arg),  
3206 - Bool is_https) -> $State initial_state,  
3207 - ($State expired,  
3208 - Maybe(String),  
3209 - HTTP_Info,  
3210 - List(Web_arg),  
3211 - Bool is_https) -> $State ticket_expired_state,  
3212 - (Maybe(String),  
3213 - HTTP_Info,  
3214 - List(Web_arg),  
3215 - Bool is_https) -> $State ticket_lost_state,  
3216 - List(Web_Action($State)) actions,  
3217 - $State -> HTTP_Answer compute_page,  
3218 - $State -> List(HTTP_header) additional_headers,  
3219 - List(HTTP_header) constant_additional_headers,  
3220 - Int timeout,  
3221 - Redirections redirections,  
3222 - String charset,  
3223 - List(String) journal_extensions,  
3224 - List(String) journal_headers,  
3225 - (LogLevel, String) -> One logger, //logger  
3226 - String secret,  
3227 - List(MIME) known_mime_types,  
3228 - (String action_name,  
3229 - List(Web_arg) args) -> One before_send_file  
3230 - )=  
3231 - init(unique);  
3232 -  
3233 -  
3234 - //  
3235 - // make required directories (if needed)  
3236 - //  
3237 - with //web_sites_directory = (String) make_directory(my_anubis_directory+"/web_sites"),  
3238 - base_directory = (String) make_directory(site_directory),  
3239 - // state_directory = make_directory(site_directory+"/states"),  
3240 - forget((String)make_directory(site_directory+"/public"));  
3241 - //  
3242 - // construct tool functions  
3243 - // TODO 'make_separate_web_args_function' must retrieve state_cookies before parsing web_args if using_state_cookies is true  
3244 - with save_state = make_save_state_function(timeout, state_directory, logger),  
3245 - retrieve_state = make_retrieve_state_function(state_directory),  
3246 - separate_web_args = make_separate_web_args_function(state_directory, retrieve_state, website_name),  
3247 - apply_action = make_apply_action_function(actions, logger),  
3248 - //  
3249 - // construct the site handler  
3250 - //  
3251 - site_handler = (Word32 http_port, Word32 https_port) |->  
3252 - ((String host_name,  
3253 - HTTP_Info http_info,  
3254 - List(Web_arg) lwa,  
3255 - Bool is_https) |->  
3256 - //println(dump_web_arg_values(lwa));  
3257 - since separate_web_args(lwa, http_info) is swa(mb_previous_state, mb_action_name, operands),  
3258 - with new_state = if mb_previous_state is  
3259 - {  
3260 - not_found then  
3261 - //println("previous state not found");  
3262 - if mb_action_name is  
3263 - {  
3264 - failure then initial_state(http_info, operands, is_https),  
3265 - success(_) then  
3266 - ticket_lost_state(mb_action_name, http_info,operands,is_https)  
3267 - },  
3268 -  
3269 - out_of_date(state) then  
3270 - //println("previous out_of_date");  
3271 - ticket_expired_state(state, mb_action_name, http_info,operands,is_https),  
3272 -  
3273 - still_valid(state) then  
3274 - //println("previous still_valid");  
3275 - if mb_action_name is  
3276 - {  
3277 - failure then state,  
3278 - success(action_name) then  
3279 - apply_action(state,action_name,http_info,operands,is_https)  
3280 - }  
3281 - },  
3282 - //if state_and_headers is (session_ticket, mb_new_state, headers) then  
3283 - with state_name = save_state(new_state),  
3284 - //println("Cookie new STATE NAME "+state_name);  
3285 - with cookie_headers = if mb_action_name is  
3286 - {  
3287 - failure then  
3288 - make_state_cookie_headers(website_name, state_name),  
3289 - success(action_name) then  
3290 - if action_name = "none" then  
3291 - []  
3292 - else if substr(action_name, 0, 5)="ajax_" then  
3293 - []  
3294 - else  
3295 - make_state_cookie_headers(website_name, state_name)  
3296 - },  
3297 -  
3298 - format(info(host_name, http_port, https_port, site_directory, secret),  
3299 - additional_headers(new_state) + cookie_headers,  
3300 - compute_page(new_state),  
3301 - is_https,  
3302 - charset)  
3303 - ),  
3304 - //  
3305 - // make the delete_out_of_date function  
3306 - //  
3307 - delete_out_of_date =  
3308 - make_delete_out_of_date_states_function((Maybe($State))failure,  
3309 - site_directory+"/states"),  
3310 - //  
3311 - // construct the web site description  
3312 - //  
3313 - web_site((Word32 http_port, Word32 https_port) |->  
3314 - web_site_description(common_names,  
3315 - site_directory,  
3316 - redirections,  
3317 - charset,  
3318 - journal_extensions,  
3319 - journal_headers,  
3320 - logger,  
3321 - secret,  
3322 - known_mime_types,  
3323 - site_handler(http_port, https_port),  
3324 - constant_additional_headers,  
3325 - (HTTP_Info http_info, List(Web_arg) lwa) |-> if separate_web_args(lwa, http_info ) is  
3326 - swa(mb_previous_state,mb_action_name,operands) then  
3327 - if mb_action_name is  
3328 - {  
3329 - failure then unique  
3330 - success(an) then before_send_file(an,operands)  
3331 - }  
3332 - //using_state_cookies  
3333 - ),  
3334 - delete_out_of_date).  
3335 -  
3336 - public type WEB_Controller:  
3337 - web_controller(  
3338 - String name, //controller name  
3339 - (HTTP_Info http_info,  
3340 - List(Web_arg) lwa,  
3341 - Bool is_https  
3342 - ) -> HTTP_Answer view //view renderer  
3343 - )  
3344 -  
3345 -  
3346 -  
3347 -  
3348 -public define JsonValue to_html_ajax_content(Printable_tree content_HTML, String additional_script).  
3349 -public define JsonValue to_html_ajax_content(HTML_Partial_Content content_HTML, CommonInfo cinfo, String additional_script).  
3350 -  
3351 -  
3352 -  
3353 -define String  
3354 - get_site_uid  
3355 - (  
3356 - String site_path,  
3357 - (LogLevel, String) -> One logger //logger  
3358 - )=  
3359 - with file_name = site_path+"/site_UID",  
3360 - if read_from_file(file_name) is  
3361 - {  
3362 - cannot_find_file then  
3363 - logger(logInfo,"site UID doesn't exists. Generating one now");  
3364 - with uid = generate_random_string(9),  
3365 - if write_to_file(file_name, to_byte_array(uid)) is  
3366 - {  
3367 - cannot_open_file then logger(logError, "Can't create site UID here "+file_name);"",  
3368 - write_error(_) then logger(logError, "Can't write site UID here "+file_name);"",  
3369 - ok then uid  
3370 - }  
3371 - read_error(_) then  
3372 - logger(logError, "cannot read site UID from "+file_name);""  
3373 - ok(ba) then to_string(ba)  
3374 - }  
3375 - .  
3376 -  
3377 -// Compatibility function for older websites  
3378 - public define Web_Site  
3379 - make_web_site_description  
3380 - (  
3381 - List(String) common_names, // for example: ["www.our-business.com"]  
3382 - String site_directory,  
3383 - String state_directory,  
3384 - One -> One init,  
3385 - (HTTP_Info,  
3386 - List(Web_arg),  
3387 - Bool is_https) -> $State initial_state,  
3388 - ($State expired,  
3389 - Maybe(String),  
3390 - HTTP_Info,  
3391 - List(Web_arg),  
3392 - Bool is_https) -> $State ticket_expired_state,  
3393 - (Maybe(String),  
3394 - HTTP_Info,  
3395 - List(Web_arg),  
3396 - Bool is_https) -> $State ticket_lost_state,  
3397 - List(Web_Action($State)) actions,  
3398 - $State -> HTTP_Answer compute_page,  
3399 - $State -> List(HTTP_header) additional_headers,  
3400 - List(HTTP_header) constant_additional_headers,  
3401 - Int timeout,  
3402 - Redirections redirections,  
3403 - String charset,  
3404 - List(String) journal_extensions,  
3405 - List(String) journal_headers,  
3406 - (LogLevel, String) -> One logger, //logger  
3407 - String secret,  
3408 - List(MIME) known_mime_types,  
3409 - (String action_name,  
3410 - List(Web_arg) args) -> One before_send_file  
3411 - //Bool using_state_cookies  
3412 - )  
3413 - =  
3414 - //generate an unique ID if doesn't exist in root of site_directory  
3415 - with site_UID = get_site_uid(site_directory, logger),  
3416 - make_web_site_description(site_UID, common_names, site_directory, state_directory, init, initial_state, ticket_expired_state, ticket_lost_state, actions, compute_page, additional_headers, constant_additional_headers, timeout, redirections, charset, journal_extensions, journal_headers, logger, secret, known_mime_types, before_send_file)  
3417 -.  
3418 -  
3419 -  
3420 -  
3421 - *** [4.3] Starting the servers.  
3422 -  
3423 -public define Start_Web_Sites_Result  
3424 - start_web_sites  
3425 - (  
3426 - Word32 ip_address, // the IP address shared by the web sites  
3427 - Word32 http_port, // usually: 80  
3428 - Word32 https_port, // usually: 443  
3429 - String ssl_certificate_common_name,  
3430 - List(Web_Site) web_sites, // web sites to be started  
3431 - (One) -> Bool shutdown_required  
3432 - ) =  
3433 - with get_description = (Web_Site ws) |-> description(ws)(http_port,https_port),  
3434 - with http_server_r =  
3435 - start_http_server(ip_address,http_port,  
3436 - map(get_description,web_sites),  
3437 - //load_denial_of_service_info,  
3438 - shutdown_required),  
3439 - with https_server_r =  
3440 - start_https_server(ip_address,https_port,  
3441 - ssl_certificate_common_name,  
3442 - map(get_description,web_sites),  
3443 - shutdown_required),  
3444 - if http_server_r is ok(http_server)  
3445 - then  
3446 - (  
3447 - if https_server_r is ok(https_server)  
3448 - then  
3449 - (  
3450 - start_http_servers_tasks(map(get_description,web_sites),  
3451 - [http_server,https_server],  
3452 - 600); // period of 10 minutes  
3453 - delegate  
3454 - delete_states_loop(  
3455 - map((Web_Site ws) |->  
3456 - (site_directory(description(ws)(http_port,https_port))+  
3457 - "/states",delete_out_of_date(ws)),  
3458 - web_sites),  
3459 - 3600*24*3, // keep out of date states 3 days  
3460 - now,  
3461 - http_server,  
3462 - https_server,  
3463 - shutdown_required),  
3464 - ok(http_server,https_server)  
3465 - )  
3466 - else cannot_bind_to_port(https_port)  
3467 - )  
3468 - else  
3469 - (  
3470 - if https_server_r is ok(https_server)  
3471 - then cannot_bind_to_port(http_port)  
3472 - else cannot_bind_to_port(http_port,https_port)  
3473 - ).  
3474 -  
3475 -  
3476 -public define One  
3477 - start_web_sites  
3478 - (  
3479 - Word32 ip_address, // the IP address shared by the web sites  
3480 - Word32 http_port, // usually: 80  
3481 - Word32 https_port, // usually: 443  
3482 - String ssl_certificate_common_name,  
3483 - List(Web_Site) web_sites, // web sites to be started  
3484 - (One) -> Bool shutdown_required,  
3485 - (LogLevel, String) -> One logger //logger where to report the error  
3486 - )=  
3487 - if (Start_Web_Sites_Result)start_web_sites(ip_address,  
3488 - http_port,  
3489 - https_port,  
3490 - ssl_certificate_common_name,  
3491 - web_sites,  
3492 - shutdown_required) is  
3493 - {  
3494 - cannot_bind_to_port(n) then logger(logError, "Cannot bind to port: "+n),  
3495 - cannot_bind_to_port(n,m) then logger(logError, "Cannot bind to ports: "+n+", "+m),  
3496 - ok(s1,s2) then logger(logInfo, "Servers started on ports "+http_port+" (HTTP) and "+https_port+" (HTTPS).")  
3497 - }.  
3498 -  
3499 -  
3500 -  
3501 -  
3502 -  
3503 - *** [5] HTML Formating.  
3504 -  
3505 - We need to translate HTML elements as defined above into actual HTML text.  
3506 -  
3507 - Actioners require special informations, which must be transmitted when needed by the  
3508 - 'format' functions:  
3509 -  
3510 - - the 'common name', which is used for URLs,  
3511 - - the HTTP/HTTPS port number,  
3512 - - the 'state name', which must be transmitted when the actioner is clicked upon,  
3513 - - the 'form name' (if any) to which the actioner refers.  
3514 -  
3515 - If the actioner is off form, and if it refers to a form, the name of that form is  
3516 - already known by the actioner. On the contrary, if the actioner is 'in form', it refers  
3517 - implicitly to the form containing it. The name of that form is transmitted to the  
3518 - 'format' functions called from within the formating of that form.  
3519 -  
3520 -  
3521 -  
3522 -  
3523 - *** [5.1] The type 'HTML_Any($T)'.  
3524 -  
3525 - The type 'HTML_Any($T)' gathers elements which may be put anywhere in the page. The  
3526 - parameter $T becomes either 'HTML_Off_Form' or 'HTML_In_Form'.  
3527 -  
3528 -type HTML_Any($T):  
3529 - any_text (List(CoreAttrs), String the_text),  
3530 - any_preformated (List(Text_Option), String),  
3531 - any_paragraph (List(Text_Option), List($T) content),  
3532 - any_image (List(CoreAttrs), String url, String alternate),  
3533 - any_image (List(CoreAttrs), String url, String alternate, Int width, Int height),  
3534 - any_table (List(Table_Option), HTML_Header_Row($T), List(HTML_Row($T)), HTML_Footer_Row($T)),  
3535 - any_center ($T),  
3536 - any_mail_to (String email, $T element),  
3537 - any_scroller (Int width, Int height,  
3538 - Int content_width, Int content_height,  
3539 - $T content),  
3540 - any_fixed_size (HTML_Size width, HTML_Size height, $T content),  
3541 - any_fixed_size_2 (HTML_Size width, HTML_Size height, String name_of_HTML_file),  
3542 - any_actioner (Actioner_Connection,  
3543 - Actioner_Target,  
3544 - Actioner_Aspect,  
3545 - WEB_Action_Name action,  
3546 - List((String,String)) extra_ops,  
3547 - List(Actioner_Local_Action),  
3548 - Maybe(String) form_name),  
3549 - any_foreign_link_new (Actioner_Target, Actioner_Aspect, String url),  
3550 - any_foreign_link (List(Text_Option), String url),  
3551 - any_foreign_link (List(Text_Option), String url, String name),  
3552 - any_private_download (String abs_path, String name, String extra_ext,  
3553 - Maybe((String,List((String,String))))),  
3554 - any_div (List(CoreAttrs), List($T) element),  
3555 - any_div_empty (List(CoreAttrs)),  
3556 - any_coreattrs (List(CoreAttrs)),  
3557 - any_ol (List(CoreAttrs), List($T) content),  
3558 - any_ul (List(CoreAttrs), List($T) content),  
3559 - any_li (List(CoreAttrs), List($T) content),  
3560 - any_button (List(CoreAttrs), List($T) element),  
3561 - any_i (List(CoreAttrs), String text),  
3562 - any_span (List(CoreAttrs), String text),  
3563 - any_hr (List(CoreAttrs))  
3564 -.  
3565 -  
3566 -  
3567 -  
3568 - *** [5.2] Formating a color.  
3569 -  
3570 - RGB colors are formatted as '#rrggbb' where rr, gg and bb are two characters  
3571 - hexadecimal values.  
3572 -  
3573 -define String  
3574 - html_format  
3575 - (  
3576 - RGB color  
3577 - ) =  
3578 - if color is rgb(r,g,b) then  
3579 - "#" + to_hexa(r)  
3580 - + to_hexa(g)  
3581 - + to_hexa(b).  
3582 -  
3583 -  
3584 - The following is a very arbitrary definition of the opposite color. The thing which is  
3585 - important is that it is far from the original, so that characters in 'opposite' color  
3586 - are clearly visible over the original.  
3587 -  
3588 -define RGB  
3589 - opposite  
3590 - (  
3591 - RGB color  
3592 - ) =  
3593 - if color is rgb(r,g,b) then  
3594 - rgb(255-r,  
3595 - 255-g,  
3596 - 255-b).  
3597 -  
3598 - Converting RGB to RGBA.  
3599 -  
3600 -define RGBA  
3601 - to_rgba  
3602 - (  
3603 - RGB color  
3604 - ) =  
3605 - if color is rgb(r,g,b) then rgba(r,g,b,255).  
3606 -  
3607 -  
3608 - *** [5.4] Formating an actioner.  
3609 -  
3610 - An actioner works as follows. Assume first that it refers to a form. When it is clicked  
3611 - upon, the actioner puts (via 'onMouseDown') the URL into the 'action' attribute of the  
3612 - form, and submits the form, using the JavaScript command 'form_name.submit()'. If the  
3613 - actioner does not refer to a form, it fires the URL directly via 'href', because in  
3614 - that case, the actioner is always an <a> tag.  
3615 -  
3616 - The URL itself is composed using the connection sort (same, http or https), the common  
3617 - name and port number (if needed), the state name, the action name, and the extra  
3618 - operands, which are put into a query string. It may look like this:  
3619 -  
3620 - http://common_name:port/?s=state_name&a=action_name&oname=value...  
3621 -  
3622 - Each extra operand is a pair of strings: (name,value). It is formated as:  
3623 -  
3624 - &oname=value  
3625 -  
3626 -public define String  
3627 - format_attrs  
3628 - (  
3629 - List(CoreAttrs) attributs  
3630 - ).  
3631 -  
3632 -//public define String  
3633 -// format_extra_operands  
3634 -// (  
3635 -// List((String,String)) l  
3636 -// ) =  
3637 -// if l is  
3638 -// {  
3639 -// [ ] then "",  
3640 -// [h . t] then if h is (n,v) then  
3641 -// "&amp;"+n+"="+v+format_extra_operands(t)  
3642 -// }  
3643 -//.  
3644 -  
3645 -  
3646 - It seams that the standard requires "&amp;" instead of "&" !  
3647 -  
3648 - In case the target is another window, we need to format the options for this window.  
3649 -  
3650 -define String  
3651 - format  
3652 - (  
3653 - List(Other_Window_Option) l  
3654 - ) =  
3655 - if l is  
3656 - {  
3657 - [ ] then "",  
3658 - [h . t] then if h is  
3659 - {  
3660 - resizable then "resizable",  
3661 - scrollbars then "scrollbars",  
3662 - width(w) then "width="+w,  
3663 - height(h2) then "height="+h2  
3664 - } + if t is [ ] then "" else (","+format(t))  
3665 - }  
3666 -.  
3667 -  
3668 -  
3669 -  
3670 - Formating choices for a <select> tag.  
3671 -  
3672 -public define Printable_tree  
3673 - format_choices  
3674 - (  
3675 - List(String) l  
3676 - ) =  
3677 - if l is  
3678 - {  
3679 - [ ] then [ ],  
3680 - [h . t] then ["<option>", h, "</option>\n" . format_choices(t)]  
3681 - }.  
3682 -  
3683 -  
3684 -public define Printable_tree  
3685 - format_choices  
3686 - (  
3687 - List(String) l,  
3688 - InitialValue selected  
3689 - ) =  
3690 - if l is  
3691 - {  
3692 - [ ] then [ ],  
3693 - [h . t] then if h = selected.value  
3694 - then ["<option selected=\"selected\">", h, "</option>\n" . format_choices(t)]  
3695 - else ["<option>", h, "</option>\n" . format_choices(t,selected)]  
3696 - }.  
3697 -  
3698 -  
3699 -public define Printable_tree  
3700 - format_choices  
3701 - (  
3702 - List((List(CoreAttrs),WebArgValue,String)) l  
3703 - ) =  
3704 - if l is  
3705 - {  
3706 - [ ] then [ ],  
3707 - [h . t] then  
3708 - if h is (attrs,val,item)  
3709 - then ["<option value=\""+encode_HTML_entities(val.value)+"\" "+format_attrs(attrs)+">", item, "</option>\n" . format_choices(t)]  
3710 - }.  
3711 -  
3712 -public define Printable_tree  
3713 - format_choices  
3714 - (  
3715 - List((List(CoreAttrs),WebArgValue,String)) l,  
3716 - InitialValue selected  
3717 - ) =  
3718 - if l is  
3719 - {  
3720 - [ ] then [ ],  
3721 - [h . t] then  
3722 - if h is (attrs,val,item) then  
3723 - if val.value = selected.value  
3724 - then ["<option value=\""+encode_HTML_entities(val.value)+"\" "+format_attrs(attrs)+" selected=\"selected\">", item, "</option>\n" . format_choices(t)]  
3725 - else ["<option value=\""+encode_HTML_entities(val.value)+"\" "+format_attrs(attrs)+" >", item, "</option>\n" . format_choices(t,selected)]  
3726 - }.  
3727 -  
3728 -  
3729 -  
3730 - Note: this counter is private to the virtual machine, hence there is one counter by  
3731 - client and by page : it seems that a new VM (simply a delegate) is started for each request.  
3732 -  
3733 -define Int  
3734 - new_count  
3735 - (  
3736 - Var(Int) count  
3737 - )  
3738 - =  
3739 - count <- *count+1;  
3740 - *count.  
3741 -  
3742 -  
3743 - The next function composes the URL. It is a JavaScript URL when the target is another  
3744 - window.  
3745 -  
3746 -//public define String  
3747 -// format_web_action_name  
3748 -// (  
3749 -// WEB_Action_Name action  
3750 -// )=  
3751 -// if action is  
3752 -// {  
3753 -// no_action then "",  
3754 -// controller_action(controller, action_name) then "?aws_controller="+controller+"&amp;aws_action="+action_name,  
3755 -// action_name(action_name) then "?aws_action="+action_name,  
3756 -// url(url) then url  
3757 -// }  
3758 -//.  
3759 -//  
3760 -//public define String  
3761 -// format_web_action_name  
3762 -// (  
3763 -// WEB_Action_Name action,  
3764 -// List((String,String)) extra_ops,  
3765 -// )=  
3766 -// format_web_action_name(action)  
3767 -// +  
3768 -// format_extra_operands(extra_ops)  
3769 -//.  
3770 -  
3771 -define String  
3772 - make_actioner_url  
3773 - (  
3774 - CommonInfo cinfo,  
3775 - Actioner_Connection connection,  
3776 - Actioner_Target target,  
3777 - WEB_Action_Name action,  
3778 - List((String,String)) extra_ops,  
3779 - Bool is_https  
3780 - ) =  
3781 - if cinfo is info(common_name,http_port,https_port,site_directory,secret) then  
3782 - with strict_url =  
3783 - if connection is  
3784 - {  
3785 - same then "/",  
3786 - http then  
3787 - if http_port = 80 then  
3788 - "http://"+common_name+"/"  
3789 - else  
3790 - "http://"+common_name+":"+http_port+"/",  
3791 - https then  
3792 - if https_port = 443 then  
3793 - "https://"+common_name+"/"  
3794 - else  
3795 - "https://"+common_name+":"+https_port+"/",  
3796 - } +  
3797 - //with action_string =  
3798 - format_web_action_name(action, extra_ops),  
3799 - if target is  
3800 - {  
3801 - same then strict_url,  
3802 - same(label) then strict_url+"#"+label,  
3803 - other(wn,ops) then  
3804 -  
3805 - "javascript:void window.open('"+strict_url+"&amp;t="+wn+"','"+  
3806 - "w"+to_ascii(sha1(wn))+"','"+format(ops)+"')"  
3807 - }.  
3808 -  
3809 -define String  
3810 - make_foreign_link_url  
3811 - (  
3812 - Actioner_Target target,  
3813 - String url  
3814 - ) =  
3815 - if target is  
3816 - {  
3817 - same then "/",  
3818 - same(label) then "/#"+label,  
3819 - other(wn,ops) then  
3820 -  
3821 - "javascript:void window.open('"+url+"','"+  
3822 - "w"+to_ascii(sha1(wn))+"','"+format(ops)+"')"  
3823 - }.  
3824 -  
3825 -  
3826 - Depending on the fact that the actioner refers to a form or not, the URL is used in two  
3827 - different ways. If the actioner does not refer to a form, it is realized by a '<a>'  
3828 - tag, with a 'href' attribute. If it refers to a form, it is still realized by a '<a>'  
3829 - tag, but with no href attribute. In this case, we use the 'onMouseDown' or 'onChange'  
3830 - event handler. The handler calls a JavaScript function which puts the URL as the value  
3831 - of the 'action' attribute of the form, and submits the form.  
3832 -  
3833 -type URL_or_JavaScript:  
3834 - url (String),  
3835 - javascript (Printable_tree script, Printable_tree handler).  
3836 -  
3837 -  
3838 - It was as shown below, in order to allow submission of a form from outside the form,  
3839 - but this makes problems:  
3840 -  
3841 -define URL_or_JavaScript  
3842 - format_action  
3843 - (  
3844 - String the_url,  
3845 - Actioner_Aspect aspect,  
3846 - Maybe(String) mb_id,  
3847 - Maybe(String) mb_form_name,  
3848 - Var(Int) action_count  
3849 - ) =  
3850 - if mb_form_name is  
3851 - {  
3852 - failure then  
3853 - url(the_url),  
3854 - success(form_name) then  
3855 - with n = new_count(action_count),  
3856 - fn_name = "pfu_" + if mb_id is  
3857 - {  
3858 - failure then form_name + "_" + n,  
3859 - success(id) then id,  
3860 - },  
3861 - javascript(  
3862 - [  
3863 - "<script type=\"text/javascript\" language =\"JavaScript\">\n",  
3864 - "function ", fn_name, "() {\n",  
3865 - " var fa = document.forms.",form_name,";\n",  
3866 - " var u = \"",the_url,"\";\n",  
3867 - " fa.action = u;",  
3868 - if aspect is submit(_, _) then " }\n"  
3869 - else "\n fa.submit(); }\n",  
3870 - "</script>\n"  
3871 - ],  
3872 - [fn_name,"();"]  
3873 - )  
3874 - }.  
3875 -  
3876 - Now, we format the actioner according to its aspect.  
3877 -  
3878 -define List(Text_Option)  
3879 - get_text_options  
3880 - (  
3881 - List(Text_Option) l  
3882 - )  
3883 - =  
3884 - if l is  
3885 - {  
3886 - [] then [],  
3887 - [h . t ] then  
3888 - if h is class(_) then  
3889 - get_text_options(t)  
3890 - else if h is id(_) then  
3891 - get_text_options(t)  
3892 - else if h is style(_) then  
3893 - get_text_options(t)  
3894 - else if h is title(_) then  
3895 - get_text_options(t)  
3896 - else if h is core_attrs(_) then  
3897 - get_text_options(t)  
3898 - else  
3899 - [ h . get_text_options(t) ]  
3900 -  
3901 - }.  
3902 -  
3903 - /**  
3904 - * Extract the CSS class list from the list of Text_Option  
3905 - */  
3906 -define List(CoreAttrs)  
3907 - get_css_class  
3908 - (  
3909 - List(Text_Option) l  
3910 - )  
3911 - =  
3912 - if l is  
3913 - {  
3914 - [] then [],  
3915 - [h . t ] then  
3916 -  
3917 -  
3918 - if h is class(name) then  
3919 - [ class(name) . get_css_class(t) ]  
3920 - else if h is id(name) then  
3921 - [ id(name) . get_css_class(t) ]  
3922 - else if h is style(the_style) then  
3923 - [ style(the_style) . get_css_class(t) ]  
3924 - else if h is title(name) then  
3925 - [ tooltip(name) . get_css_class(t) ]  
3926 - else if h is attr(name, value) then  
3927 - [ attr(name, value) . get_css_class(t) ]  
3928 - else  
3929 - get_css_class(t)  
3930 - }  
3931 - .  
3932 -  
3933 -  
3934 -define List(CoreAttrs)  
3935 - get_core_attrs  
3936 - (  
3937 - List(Text_Option) l  
3938 - )  
3939 - =  
3940 - if l is  
3941 - {  
3942 - [] then [],  
3943 - [h . t ] then  
3944 - if h is core_attrs(attrs) then  
3945 - attrs + get_core_attrs(t)  
3946 - else  
3947 - get_core_attrs(t)  
3948 - }  
3949 - .  
3950 -  
3951 -define Printable_tree  
3952 - format  
3953 - (  
3954 - List(Actioner_Local_Action) l  
3955 - ) =  
3956 - if l is  
3957 - {  
3958 - [ ] then [ ],  
3959 - [h . t] then [if h is  
3960 - {  
3961 - close_window then [" window.close(); "]  
3962 - }  
3963 - . format(t)]  
3964 - }.  
3965 -  
3966 -  
3967 -define String  
3968 - format_attrs  
3969 - (  
3970 - List(InputAttrs) attributs,  
3971 - List(String) classes,  
3972 - List(String) styles  
3973 - )=  
3974 - if attributs is  
3975 - {  
3976 - [] then  
3977 - if length(classes) = 0 then "" else " class=\""+join(" ",classes)+"\""+  
3978 - if length(styles) = 0 then "" else " style=\""+join(";",styles)+"\"",  
3979 - [h . t] then  
3980 - with new_classes = if h is class(class_name) then [class_name. classes] else classes,  
3981 - new_styles = if h is style(style_string) then [style_string . styles] else styles,  
3982 - current = if h is  
3983 - {  
3984 - id(id_name) then  
3985 - " id=\"" + id_name + "\"",  
3986 - class(class_name) then "",  
3987 - style(style_string) then "",  
3988 - title(title_string) then  
3989 - " title=\"" + title_string + "\"",  
3990 -  
3991 - lang(lang) then  
3992 - " xml:lang=" + lang,  
3993 - dir(reading_Way) then  
3994 - if reading_Way is  
3995 - {  
3996 - ltr then " dir=ltr",  
3997 - rtl then " dir=rtl"  
3998 - },  
3999 -  
4000 - accesskey(key) then  
4001 - " accesskey=\"" + key + "\"",  
4002 - tabindex(index) then  
4003 - " tabindex=\"" + index + "\"",  
4004 -  
4005 - attr(name, value) then  
4006 - " " + name + "=\"" + value + "\"",  
4007 -  
4008 - event(e, value) then  
4009 - " " + event_name(e) + "=\"" + value + "\"",  
4010 - data(name, value) then  
4011 - " data-" + to_lower(name) + "=\"" + value + "\"",  
4012 - },  
4013 - current + format_attrs(t, classes, styles)  
4014 - }.  
4015 -  
4016 -public define List(CoreAttrs) extract_attributes(HTML_tooltip htt).  
4017 -  
4018 -define String  
4019 - format_attrs  
4020 - (  
4021 - List(CoreAttrs) attributs,  
4022 - List(String) classes, //class accumulator  
4023 - List(String) styles //styles accumulator  
4024 - )=  
4025 - if attributs is  
4026 - {  
4027 - [] then  
4028 - //concat all accumulated classes and styles  
4029 - (if length(classes) = 0 then "" else " class=\""+join(" ",classes)+"\"")+  
4030 - if length(styles) = 0 then "" else " style=\""+join(";",styles)+"\"",  
4031 - [h . t] then  
4032 - with new_classes = if h is class(class_name) then [class_name. classes] else classes,  
4033 - new_styles = if h is style(style_string) then [style_string . styles] else styles,  
4034 - new_attrs = if h is tooltip(tt) then extract_attributes(tt) else [],  
4035 -  
4036 - current = if h is  
4037 - {  
4038 - empty then "",  
4039 - id(id_name) then  
4040 - " id=\"" + id_name + "\"",  
4041 - class(class_name) then "", //do nothing here, because we accumulate the class until we have some other attributes  
4042 - style(style_string) then "", //do nothing here, because we accumulate the style until we have some other attributes  
4043 - title(title_string) then  
4044 - " title=\"" + title_string + "\"",  
4045 -  
4046 - lang(lang) then  
4047 - " xml:lang=" + lang,  
4048 - dir(reading_Way) then  
4049 - if reading_Way is  
4050 - {  
4051 - ltr then " dir=ltr",  
4052 - rtl then " dir=rtl"  
4053 - },  
4054 -  
4055 - accesskey(key) then  
4056 - " accesskey=\"" + key + "\"",  
4057 - tabindex(index) then  
4058 - " tabindex=\"" + index + "\"",  
4059 - attr(name, value) then  
4060 - " " + name + "=\"" + value + "\"",  
4061 - bool_attr(bool, value)then  
4062 - if bool then " "+value+" " else "",  
4063 - event(e, value) then  
4064 - " " + event_name(e) + "=\"" + value + "\"",  
4065 - tooltip(_) then "", //do nothing here, because we extract attributes at first in new_attrs  
4066 - data(name, value) then  
4067 - " data-" + to_lower(name) + "=\"" + value + "\"",  
4068 -  
4069 - contenteditable(value)then //boolean value  
4070 - " contenteditable=\""+ to_String(value)+ "\""  
4071 -  
4072 - contextmenu(id_name) then //ID value  
4073 - " contextmenu=\"" + id_name + "\"",  
4074 -  
4075 - draggable(value) then //boolean value  
4076 - " draggable=\""+ to_String(value)+ "\"",  
4077 -  
4078 - enterkeyhint(value) then  
4079 - " enterkeyhint=\""+ value + "\"",  
4080 -  
4081 - hidden(value) then //boolean value  
4082 - " hidden=\""+ (if value then "hidden" else "") + "\"",  
4083 -  
4084 - inert then  
4085 - " inert",  
4086 -  
4087 - inputmode(value) then  
4088 - " inputmode =\"" + value + "\"",  
4089 -  
4090 - popover then  
4091 - " popover",  
4092 -  
4093 - spellcheck(value) then //boolean value  
4094 - " spellcheck=\""+ to_String(value)+ "\""  
4095 -  
4096 - translate(value) then  
4097 - " translate=\"" + if value then "yes\"" else "no\""  
4098 - },  
4099 - current + format_attrs(t + new_attrs, new_classes, new_styles)  
4100 - }.  
4101 -  
4102 -define String  
4103 - format_attrs  
4104 - (  
4105 - List(InputAttrs) attributs  
4106 - )=  
4107 - format_attrs(attributs, [], []).  
4108 -  
4109 -public define String  
4110 - format_attrs  
4111 - (  
4112 - List(CoreAttrs) attributs  
4113 - )=  
4114 - format_attrs(attributs, [], []).  
4115 -  
4116 -define String  
4117 - format_text_options  
4118 - (  
4119 - List(Text_Option) l  
4120 - )  
4121 - =  
4122 - with text_options = get_text_options(l),  
4123 - core_attrs = get_css_class(l) + get_core_attrs(l),  
4124 - (if length(text_options)= 0 then "" else " style=\"" + format(text_options) + "\" ")  
4125 - +  
4126 - (if length(core_attrs) = 0 then "" else format_attrs(core_attrs))  
4127 - .  
4128 -  
4129 -define Printable_tree  
4130 - format_div_option  
4131 - (  
4132 - List(CoreAttrs) options  
4133 - )=  
4134 - ["<div" + format_attrs(options) + ">"]  
4135 -.  
4136 -  
4137 -define Maybe(String)  
4138 - extract_id  
4139 - (  
4140 - List(CoreAttrs) attrbs  
4141 - ) =  
4142 - if attrbs is  
4143 - {  
4144 - [] then failure,  
4145 - [h . t] then  
4146 - if h is id(value) then success(value)  
4147 - else extract_id(t)  
4148 - }  
4149 -.  
4150 -  
4151 -define Maybe(String)  
4152 - extract_id  
4153 - (  
4154 - Actioner_Aspect aspect  
4155 - ) =  
4156 - if aspect is  
4157 - {  
4158 - link(_,_,_) then failure,  
4159 - img_link(_,_,_) then failure,  
4160 - push_button(opts,_) then extract_id(opts),  
4161 - button(_,_) then failure,  
4162 - button(_,_,_,_) then failure,  
4163 - submit(opts,_) then extract_id(opts),  
4164 - //immediate_selector(_,_,_,_) then failure,  
4165 - immediate_selector(_,_,_,_,_,_) then failure,  
4166 - html(_, _) then failure,  
4167 - }.  
4168 -  
4169 -to do Complete format_foreign_link  
4170 -//TODO Complete format_foreign_link  
4171 -  
4172 - CommonInfo cinfo,  
4173 - String state_name,  
4174 - Var(Int) action_count,  
4175 - Var(Int) ic_v // 'idnum' counter variable  
4176 -  
4177 -define Printable_tree  
4178 - format_foreign_link  
4179 - (  
4180 -// CommonInfo cinfo,  
4181 - Actioner_Target target,  
4182 - Actioner_Aspect aspect,  
4183 - String url,  
4184 - Bool is_https,  
4185 - CommonInfo cinfo,  
4186 -// String state_name,  
4187 - Var(Int) action_count,  
4188 - Var(Int) ic_v, // 'idnum' counter variable  
4189 - Var(List(HTML_Head_Tag)) head_tags  
4190 - ) =  
4191 - //if cinfo is info(common_name,http_port,https_port,site_dir,secret) then  
4192 - with full_url = make_foreign_link_url(target,url),  
4193 -// with action = format_action(full_url, aspect, extract_id(aspect), mb_form_name),  
4194 - if aspect is  
4195 - {  
4196 -  
4197 - link(opt, text, mb_name) then  
4198 - with name_tag = if mb_name is success(n) then " name=\"" + n + "\"" else "",  
4199 - [  
4200 - "<a href=\"", full_url, "\"", format_text_options(opt), name_tag, ">",  
4201 - text,  
4202 - "</a>"  
4203 - ],  
4204 - img_link(opt, img, alt_text) then  
4205 - [  
4206 - "<a href=\"", full_url ,"\"", format_attrs(opt),"><img src=\"", img,  
4207 - "\" alt=\"" + alt_text + "\" border=\"0\"></a>"  
4208 - ],  
4209 - push_button(options, text) then  
4210 - ["<a href=\"",full_url,"\"", format_attrs(options), ">",  
4211 - text, "</a>"  
4212 - ],  
4213 - button(url_off,url_on) then  
4214 - [ ],  
4215 -  
4216 - button(url_off,url_on,w,h) then  
4217 - [ ],  
4218 -  
4219 - submit(options, text) then  
4220 - [ ],  
4221 -  
4222 - //immediate_selector(opt,name,size,choices) then  
4223 - // [ ],  
4224 - immediate_selector(opt,name,size,choices,selected,function) then  
4225 - [ ],  
4226 - html(options, html_off_form) then  
4227 - [  
4228 - "<a href=\"", full_url,"\"", format_attrs(options), ">",  
4229 - format(cinfo, ic_v, html_off_form, is_https, action_count, head_tags),  
4230 - "</a>"  
4231 - ]  
4232 - }.  
4233 -  
4234 -define Printable_tree  
4235 - format_actioner  
4236 - (  
4237 - CommonInfo cinfo,  
4238 - Actioner_Connection connection,  
4239 - Actioner_Target target,  
4240 - Actioner_Aspect aspect,  
4241 - WEB_Action_Name action,  
4242 - List((String,String)) extra_ops,  
4243 - List(Actioner_Local_Action) local_actions,  
4244 - Maybe(String) mb_form_name,  
4245 - Bool is_https,  
4246 - Var(Int) action_count,  
4247 - Var(Int) ic_v, // 'idnum' counter variable  
4248 - Var(List(HTML_Head_Tag)) head_tags  
4249 -  
4250 - ) =  
4251 -  
4252 - if cinfo is info(common_name,http_port,https_port,site_dir,secret) then  
4253 - with url = make_actioner_url(cinfo,connection,target,  
4254 - action,extra_ops,is_https),  
4255 - with formatted_action = format_action(url, aspect, extract_id(aspect), mb_form_name, action_count),  
4256 - if aspect is  
4257 - {  
4258 -  
4259 - link(opt, text, mb_name) then  
4260 - with name_tag = if mb_name is success(n) then " name=\"" + n + "\"" else "",  
4261 - with action_name = if action is {  
4262 - no_action then ""  
4263 - controller_action(_, an) then an,  
4264 - action_name(an) then an,  
4265 - url(_) then ""  
4266 - },  
4267 - if action_name = "" then  
4268 - ["<a ", format_text_options(opt), name_tag, ">", text, "</a>" ]  
4269 - else  
4270 - ["<a href=\"",url,"\"",  
4271 - format_text_options(opt), name_tag, ">",  
4272 - text,  
4273 - "</a>"  
4274 - ],  
4275 - img_link(options, img, alt_text) then  
4276 - //if action name is empty, format options on image because maybe there onclick action  
4277 - with action_name = if action is {  
4278 - no_action then ""  
4279 - controller_action(_, an) then an,  
4280 - action_name(an) then an,  
4281 - url(_) then ""  
4282 - },  
4283 - if action_name ="" then  
4284 - [  
4285 - "<img src=\"", img,"\"",  
4286 - format_attrs(options)," alt=\"" + alt_text + "\" border=\"0\">"  
4287 - ]  
4288 - else  
4289 - [  
4290 - "<a href=\"", url,"\"", format_attrs(options),"><img src=\"", img,  
4291 - "\" alt=\"" + alt_text + "\" border=\"0\"></a>"  
4292 - ],  
4293 - push_button(options, text) then  
4294 - [  
4295 - if formatted_action is  
4296 - {  
4297 - url(u) then ["<a href=\"",u,"\"", format_attrs(options), ">",  
4298 - text, "</a>"  
4299 - ],  
4300 - javascript(s,h) then  
4301 - with action_name =  
4302 - if action is  
4303 - {  
4304 - no_action then "",  
4305 - controller_action(_, an) then an,  
4306 - action_name(an) then an,  
4307 - url(_) then ""  
4308 - },  
4309 - if action_name = "" then  
4310 - ["<input type=\"button\" value=\"",encode_HTML_entities(text),"\"", format_attrs(options), " />"]  
4311 - else  
4312 - [s,"<input type=\"button\" value=\"",encode_HTML_entities(text),"\"", format_attrs(options), " onclick=\"",h,"\" />"]  
4313 - }  
4314 - ],  
4315 - button(url_off,url_on) then  
4316 - [ if formatted_action is  
4317 - {  
4318 - url(u) then ["<a href=\"",u],  
4319 - javascript(s,h) then [s,"<a onMouseDown=\"",h]  
4320 - },  
4321 - "\" style=\"text-decoration:none\">",  
4322 - "<img alt=\"",url_off,"\" src=\"",url_off,"\" border=0",  
4323 - " onMouseOver=\"this.src='",url_on,"'\" ",  
4324 - " onMouseOut=\"this.src='",url_off,"'\">",  
4325 - "</a>"  
4326 - ],  
4327 -  
4328 - button(url_off,url_on,w,h) then  
4329 - [ if formatted_action is  
4330 - {  
4331 - url(u) then ["<a href=\"",u],  
4332 - javascript(s,h2) then [s,"<a onMouseDown=\"",h2]  
4333 - },  
4334 - "\" style=\"text-decoration:none\">",  
4335 - "<img width=",w," height=",h," alt=\"",url_off,"\" src=\"",url_off,"\" border=0",  
4336 - " onMouseOver=\"this.src='",url_on,"'\" ",  
4337 - " onMouseOut=\"this.src='",url_off,"'\">",  
4338 - "</a>"  
4339 - ],  
4340 -  
4341 - submit(options, text) then  
4342 - [  
4343 - if formatted_action is  
4344 - {  
4345 - url(u) then ["<a href=\"",u,"\"", format_attrs(options), ">",  
4346 - text, "</a>"  
4347 - ],  
4348 - javascript(s,h) then  
4349 - with action_name = if action is {  
4350 - no_action then "",  
4351 - controller_action(_, an) then an,  
4352 - action_name(an) then an,  
4353 - url(_) then ""  
4354 - },  
4355 - if action_name = "" then // special case where URL (so the action_name) is provided by the form itself  
4356 - // so javascript isn't needed. This is the standard HMTL way.  
4357 - ["<input type=\"submit\" value=\"",text,"\"", format_attrs(options), " />"]  
4358 - else  
4359 - [s,"<input type=\"submit\" value=\"",text,"\"", format_attrs(options), " onclick=\"",h,"\" />"]  
4360 - }  
4361 - ],  
4362 -  
4363 -// immediate_selector(options,name,size,choices) then  
4364 -// [ if action is  
4365 -// {  
4366 -// url(u) then ["<select href=\"",u]  
4367 -// javascript(s,h) then [s,"<select onchange=\"",h]  
4368 -// },  
4369 -// "\" name=\"",name,"\" size=\"",size,"\"", format_attrs(options), ">",  
4370 -// format_choices(choices),"</select>"  
4371 -// ],  
4372 - immediate_selector(options, name, size, choices, mb_selected, custom_function_name) then  
4373 - [  
4374 - //if custom function name is provided, that name is used instead of autogenerated js function  
4375 - if custom_function_name = "" then  
4376 - if formatted_action is  
4377 - {  
4378 - url(u) then ["<select href=\"",u]  
4379 - javascript(s,h) then [s,"<select onchange=\"",h]  
4380 - }  
4381 - else  
4382 - ["<select onchange=\"",custom_function_name],  
4383 -  
4384 - "\" name=\"",name,"\" size=\"",size,"\"", format_attrs(options), ">",  
4385 - if mb_selected is success(selected) then format_choices(choices, selected) else format_choices(choices),"</select>"  
4386 - ],  
4387 - html(options, html_off_form) then  
4388 - [  
4389 - "<a href=\"", url,"\"", format_attrs(options), ">",  
4390 - format(cinfo, ic_v, html_off_form, is_https, action_count, head_tags),  
4391 - "</a>"  
4392 - ]  
4393 - }.  
4394 -  
4395 -  
4396 -  
4397 -  
4398 -  
4399 -  
4400 - *** [5.5] Formating a private download link.  
4401 -  
4402 - We get the absolute path of the file to be downloaded, and the name under which it  
4403 - should appear to the client. The function 'format_private_download' creates an  
4404 - hypertext link for downloading the file. The secured mecanism of private download is  
4405 - used. This function is called by the function which formats HTML_Any($T) elements.  
4406 -  
4407 -  
4408 -define Printable_tree  
4409 - format_private_download  
4410 - (  
4411 - CommonInfo cinfo,  
4412 - String abs_path, // absolute file path on server  
4413 - String name, // name of file as it appears in the browser  
4414 - String extra, // extra extension  
4415 - Maybe((String,List((String,String)))) action  
4416 - ) =  
4417 - if cinfo is info(common_name,http_port,https_port,site_directory,secret) then  
4418 - with private_download_directory = site_directory+"/private_download",  
4419 - with auth = make_authorization(site_directory,secret,abs_path),  
4420 - [  
4421 - "<a href=\"",name,extra,"?zauth=",auth,  
4422 - if action is  
4423 - {  
4424 - failure then [ ]  
4425 - success(a) then if a is (an,args) then  
4426 - ["&a=",an,format_extra_operands(args)]  
4427 - },  
4428 - "\">",  
4429 - name,  
4430 - "</a>"  
4431 - ].  
4432 -  
4433 - *** [5.6] Formating rows and cells in a table.  
4434 -  
4435 -define Int  
4436 - percent  
4437 - (  
4438 - Int p  
4439 - ) =  
4440 - if p < 0 then 0 else if p > 100 then 100 else p.  
4441 -  
4442 -  
4443 -  
4444 -  
4445 - Formating cell options.  
4446 -  
4447 -  
4448 -  
4449 -define String  
4450 - format  
4451 - (  
4452 - BackgroundOption o  
4453 - ) =  
4454 - if o is  
4455 - {  
4456 - repeat then "",  
4457 - repeat_horizontal then "; background-repeat: repeat-x",  
4458 - repeat_vertical then "; background-repeat: repeat-y",  
4459 - no_repeat then "; background-repeat: no-repeat",  
4460 - center then "; background-position: center top"  
4461 - }.  
4462 -  
4463 -define String  
4464 - format  
4465 - (  
4466 - List(BackgroundOption) l  
4467 - ) =  
4468 - if l is  
4469 - {  
4470 - [ ] then "",  
4471 - [h . t] then format(h)+format(t)  
4472 - }.  
4473 -  
4474 -  
4475 -define String  
4476 - format  
4477 - (  
4478 - List(Cell_Option) options  
4479 - ) =  
4480 - if options is  
4481 - {  
4482 - [ ] then "",  
4483 - [h . t] then  
4484 - if h is  
4485 - {  
4486 - core_attrs(core_attr_list) then format_attrs(core_attr_list),  
4487 - left then " align=\"left\"",  
4488 - h_center then " align=\"center\"",  
4489 - right then " align=\"right\"",  
4490 - top then " valign=\"top\"",  
4491 - v_center then " valign=\"middle\"",  
4492 - bottom then " valign=\"bottom\"",  
4493 - base_line then " valign=\"baseline\"",  
4494 - background_color(c) then " bgcolor=\""+html_format(c)+"\"",  
4495 - background_image(n,o) then " style=\"background: url("+n+")"+format(o)+"\"",  
4496 - width(w) then " width=\""+w+"\"",  
4497 - percentage_width(n) then " width=\""+percent(n)+"%\"",  
4498 - height(h2) then " height=\""+h2+"\"",  
4499 - columns(n) then " colspan=\""+n+"\"",  
4500 - rows(n) then " rowspan=\""+n+"\"",  
4501 - nowrap then " nowrap",  
4502 - style(style_string) then " style=\"" + style_string + "\"",  
4503 - class(class_name) then " class=\""+class_name+"\""  
4504 - }  
4505 - + format(t)  
4506 - }.  
4507 -  
4508 -  
4509 - Normalizing a list of cell options (horizontal position must be specified; the default  
4510 - is 'left').  
4511 -  
4512 - Formating cells in a row.  
4513 -  
4514 -define Printable_tree  
4515 - format  
4516 - (  
4517 - List(HTML_Cell($T)) cells,  
4518 - $T -> Printable_tree format_element  
4519 - ) =  
4520 - if cells is  
4521 - {  
4522 - [ ] then [ ],  
4523 - [h . t] then if h is cell(options,element) then  
4524 - ["<td",format(reverse(options)),">",  
4525 - format_element(element),  
4526 - "</td>"  
4527 - . format(t,format_element)]  
4528 - }.  
4529 -  
4530 -define Printable_tree  
4531 - format  
4532 - (  
4533 - List(HTML_Header_Cell($T)) cells,  
4534 - $T -> Printable_tree format_element  
4535 - ) =  
4536 - if cells is  
4537 - {  
4538 - [ ] then [ ],  
4539 - [h . t] then if h is header_cell(options,element) then  
4540 - ["<th ",format(reverse(options)),">",  
4541 - format_element(element),  
4542 - "</th>"  
4543 - . format(t,format_element)]  
4544 - }.  
4545 -  
4546 - Formating the rows in a table.  
4547 -  
4548 -define Printable_tree  
4549 - format  
4550 - (  
4551 - List(HTML_Row($T)) rows,  
4552 - $T -> Printable_tree format_element,  
4553 - )=  
4554 - if rows is  
4555 - {  
4556 - [ ] then [ ],  
4557 - [h . t] then  
4558 - if h is  
4559 - {  
4560 - empty then format(t, format_element),  
4561 - row(options, cells) then  
4562 - ["<tr",format(reverse(options)),">", format(cells, format_element), "</tr>\n"  
4563 - . format(t, format_element)]  
4564 - }  
4565 - }  
4566 -.  
4567 -  
4568 -define Printable_tree  
4569 - format  
4570 - (  
4571 - HTML_Header_Row($T) row,  
4572 - $T -> Printable_tree format_element  
4573 - ) =  
4574 - if row is  
4575 - {  
4576 - empty then [ ],  
4577 - header_row(options,cells) then  
4578 - ["<thead> <tr",format(reverse(options)),">",  
4579 - format(cells,format_element),  
4580 - "</tr> </thead>\n"  
4581 - ]  
4582 - }.  
4583 -  
4584 -define Printable_tree  
4585 - format  
4586 - (  
4587 - HTML_Footer_Row($T) row,  
4588 - $T -> Printable_tree format_element  
4589 - ) =  
4590 - if row is  
4591 - {  
4592 - empty then [ ],  
4593 - footer_row(options,cells) then  
4594 - ["<tfoot> <tr",format(reverse(options)),">",  
4595 - format(cells,format_element),  
4596 - "</tr> </tfoot>\n"  
4597 - ]  
4598 - }.  
4599 -  
4600 -define Printable_tree  
4601 - format1  
4602 - (  
4603 - List(TextAreaOption) l  
4604 - ) =  
4605 - if l is  
4606 - {  
4607 - [] then [],  
4608 - [h . t] then if h is  
4609 - {  
4610 - input_attrs(input_attr_list) then [format_attrs(input_attr_list) . format1(t)],  
4611 - disabled then [" disabled=\"disabled\" " . format1(t)]  
4612 - read_only then [" readonly=\"readonly\" " . format1(t)]  
4613 - wrap_lines then [" wrap=\"wrap\" " . format1(t)]  
4614 - }  
4615 - }.  
4616 -  
4617 -define Printable_tree  
4618 - format  
4619 - (  
4620 - List(TextAreaOption) l  
4621 - )=  
4622 - if member(l, wrap_lines) then  
4623 - format1(l)  
4624 - else  
4625 - [" wrap=\"off\" " . format1(l)]  
4626 -.  
4627 -  
4628 -  
4629 - *** [5.7] Formating elements which may be put anywhere.  
4630 -  
4631 - The function below involves the parameter $T which is later instantiated as  
4632 - 'HTML_In_Form' or as 'HTML_Off_Form'. Now, since there are dictinct 'format' functions  
4633 - for these two types, and because formating of tables requires recursive calls of such  
4634 - functions, it is necessary to provide the 'format' function to be called recursively as  
4635 - an argument. Putting naively a call to 'format' will not work, because the compiler  
4636 - will look for a function able to format data of type $T (which is at that time distinct  
4637 - from any other type, including our two types). Such a function does not exist. Hence  
4638 - the function to be called for formating elements must be passed as a functional  
4639 - argument (called 'format_element' below). Actually, what we pass is a function taking  
4640 - a unique argument of type $T. Other informations (like the name of the state) are  
4641 - already in the function by way of full functionality.  
4642 -  
4643 -  
4644 - Formating text options. They are formated in CSS syntax, to be used within a  
4645 - 'style=...'.  
4646 -  
4647 -define String  
4648 - format  
4649 - (  
4650 - List(Text_Option) l  
4651 - ) =  
4652 - if l is  
4653 - {  
4654 - [ ] then "",  
4655 - [h . t] then if h is  
4656 - {  
4657 - core_attrs(core_attr_list) then format_attrs(core_attr_list),  
4658 - size(n) then "font-size:"+n+"pt",  
4659 - font(fn) then "font-family:"+fn,  
4660 - color(c) then if c is rgb(r,g,b) then  
4661 - "color:rgb("+to_decimal(r)+","+to_decimal(g)+","+to_decimal(b)+")",  
4662 - italic then "font-style:italic",  
4663 - oblique then "font-style:oblique",  
4664 - small_capitals then "font-variant:small-caps",  
4665 - bold then "font-weight:bold",  
4666 - underlined then "text-decoration:underline",  
4667 - left_justified then "text-align:left",  
4668 - right_justified then "text-align:right",  
4669 - justified then "text-align:justify",  
4670 - line_through then "text-decoration:line-through",  
4671 - nowrap then "white-space:nowrap",  
4672 - class(class_name)then " class=\"" + class_name +"\"",  
4673 - id(id_name) then " id=\"" + id_name +"\"",  
4674 - style(style_string) then " style=\"" + style_string + "\"",  
4675 - title(s) then " title=\"" + s +"\""  
4676 - attr(n,v) then " " + n + "=\"" + v +"\""  
4677 - } + if t is [ ] then "" else ("; "+format(t))  
4678 - }.  
4679 -  
4680 -  
4681 -  
4682 - Formating table options.  
4683 -  
4684 -define String  
4685 - format  
4686 - (  
4687 - List(Table_Option) l,  
4688 - Bool border_seen  
4689 - ) =  
4690 - if l is  
4691 - {  
4692 - [ ] then if border_seen then "" else " border=\"0\" cellspacing=\"0\" cellpadding=\"0\"",  
4693 - [h . t] then if h is  
4694 - {  
4695 - core_attrs(core_attr_list) then format_attrs(core_attr_list),  
4696 - background_color(c) then " bgcolor=\""+html_format(c)+"\""+format(t,border_seen),  
4697 - background_image(url) then " background="+url+format(t,border_seen),  
4698 - border(o,top,i,c) then " border=\""+o+"\" cellspacing=\""+top+"\" cellpadding=\""+i+"\""+  
4699 - //" bordercolor="+format(c)+  
4700 - format(t,true),  
4701 - width(w) then " width=\""+w+"\""+format(t,border_seen),  
4702 - percentage_width(p) then " width=\""+percent(p)+"%\""+format(t,border_seen),  
4703 - attr(name, value) then " " + name + "=\"" + value + "\"" +format(t,border_seen),  
4704 - class(name) then " class=\""+name+"\""  
4705 - }  
4706 - }.  
4707 -  
4708 -  
4709 -  
4710 -  
4711 -  
4712 -define Printable_tree  
4713 - format_scroller  
4714 - (  
4715 - Int width,  
4716 - Int height,  
4717 - Int content_width,  
4718 - Int content_height,  
4719 - Int idnum, // identifying the scroller  
4720 - $T content,  
4721 - $T -> Printable_tree format_element  
4722 - ) =  
4723 - [  
4724 - "<script type = \"text/javascript\" language=\"JavaScript\">",  
4725 - "function doscroll_",idnum,"(dx,dy) {\n",  
4726 - " if (document.layers) { var c_",idnum," = eval(document.cs_",idnum,"); } else\n",  
4727 - " if (document.getElementById) {var c_",idnum," = eval(\"document.getElementById('cs_",  
4728 - idnum,"').style\"); } else\n",  
4729 - " if (document.all) { var c_",idnum," = eval(document.all.cs_",idnum,".style); };\n",  
4730 - " var x_",idnum," = parseInt(c_",idnum,".left);\n",  
4731 - " var y_",idnum," = parseInt(c_",idnum,".top);\n",  
4732 - " if ((x_",idnum,"+dx <= 0) && (x_",idnum,"+dx > ",width-content_width,"))\n",  
4733 - " { x_",idnum," += dx; }\n",  
4734 - " if ((y_",idnum,"+dy <= 0) && (y_",idnum,"+dy > ",height-content_height,"))\n",  
4735 - " { y_",idnum," += dy; }\n",  
4736 - " c_",idnum,".left = x_",idnum,";\n",  
4737 - " c_",idnum,".top = y_",idnum,";\n",  
4738 - " }\n",  
4739 - "</script>\n",  
4740 - "<table>",  
4741 - "<tbody>",  
4742 - "<tr>",  
4743 - "<td align=left valign=top",  
4744 - " width=",width,  
4745 - " height=",height,  
4746 - ">",  
4747 - "<div id=\"ws_",idnum,"\" style=\"position:absolute; width:",width,"px; height:",height,"px;",  
4748 - " clip:rect(0px ",width,"px ",height,"px 0px)\">",  
4749 - "<div id=\"cs_",idnum,"\" style=\"position:absolute; left:0px; top:0px\">",  
4750 - format_element(content),  
4751 - "</div>",  
4752 - "</div>",  
4753 - "</td>",  
4754 - "<td valign=bottom>",  
4755 - "<table>",  
4756 - "<tbody>",  
4757 - "<tr><td><img alt=\"sroll up\" src=\"scrollup.gif\" onmousedown=\"doscroll_", idnum,"(0,20);\"></td></tr>",  
4758 - "<tr><td><img alt=\"scroll down\" src=\"scrolldown.gif\" onmousedown=\"doscroll_", idnum,"(0,-20);\"></td></tr>",  
4759 - "</tbody>",  
4760 - "</table>",  
4761 - "</td>",  
4762 - "</tr>",  
4763 - (if content_width > width then  
4764 - [  
4765 - "<tr>",  
4766 - "<td align=right>",  
4767 - "<table>",  
4768 - "<tbody>",  
4769 - "<tr>",  
4770 - "<td><img alt=\"scroll left\" src=\"scrollleft.gif\" onmousedown=\"doscroll_", idnum,"(20,0);\"></td>",  
4771 - "<td><img alt=\"scroll right\" src=\"scrollright.gif\" onmousedown=\"doscroll_", idnum,"(-20,0);\"></td>",  
4772 - "</tr>",  
4773 - "</tbody>",  
4774 - "</table>",  
4775 - "</td>",  
4776 - "</tr>",  
4777 - ] else [ ]),  
4778 - "</tbody>",  
4779 - "</table>"  
4780 - ].  
4781 -  
4782 -  
4783 -  
4784 -  
4785 -define Printable_tree  
4786 - add_css_files  
4787 - (  
4788 - List(CSS_File) l  
4789 - ) =  
4790 - if l is  
4791 - {  
4792 - [ ] then [ ],  
4793 - [h . t] then  
4794 - since h is css_file(file_name, media),  
4795 - [ ["<link rel=\"stylesheet\" type=\"text/css\" href=\"" + file_name + "\" media=\""+to_String(media)+"\"/>\n" ]  
4796 - . add_css_files(t)]  
4797 - }.  
4798 -  
4799 -  
4800 -define Printable_tree  
4801 - add_css_styles  
4802 - (  
4803 - List(CSS_Style) css_styles  
4804 - ) =  
4805 -  
4806 - if css_styles is  
4807 - {  
4808 - [] then [],  
4809 - [_ . _] then [ "<style type=\"text/css\"><!--\n",  
4810 - format_css_styles(css_styles),  
4811 - " --></style>\n"  
4812 - ]  
4813 - }.  
4814 -  
4815 -  
4816 - // The function below formats a datum of type 'HTML_Any($T)'.  
4817 -  
4818 -define Printable_tree  
4819 - format  
4820 - (  
4821 - CommonInfo cinfo,  
4822 - Var(Int) ic_v,  
4823 - HTML_Any($T) element,  
4824 - $T -> Printable_tree format_element, // able to format a datum of type $T  
4825 - Bool is_https,  
4826 - Var(Int) action_count,  
4827 - Var(List(HTML_Head_Tag)) head_tags  
4828 - ) =  
4829 - if cinfo is info(common_name,http_port,https_port,site_directory,secret) then  
4830 - if element is  
4831 - {  
4832 - any_text(opts , t) then  
4833 - if opts is  
4834 - {  
4835 - [] then [t],  
4836 - [_ . _] then ["<span", format_attrs(opts), ">",t,"</span>"]  
4837 - },  
4838 - any_preformated(opts,s) then  
4839 - ["<span", format_text_options(opts), "><pre>",s,"</pre></span>"],  
4840 - //["<pre>",s,"</pre>"],  
4841 - any_paragraph(opts,l) then  
4842 - ["<p", format_text_options(opts), ">", flat(map(($T e) |-> format_element(e), l)),"</p>\n"],  
4843 - any_image(opts, url, _alt) then  
4844 - with alt = if _alt = "" then "" else "alt=\""+_alt+"\"",  
4845 - ["<img ",alt," src=\"",url,"\" ", format_attrs(opts)," />"],  
4846 - any_image(opts, url, alt, w, h) then  
4847 - ["<img alt=\"",alt,"\" src=\"",url,"\" width=\"",w,"\" height=\"",h,"\" ", format_attrs(opts)," />"],  
4848 - any_table(opts,h_row, rows, f_row) then  
4849 - ["<table",format(reverse(opts),false),">",  
4850 - format(h_row, format_element),  
4851 - "<tbody>",format(rows,format_element),"</tbody>",  
4852 - format(f_row, format_element),  
4853 - "</table>\n"],  
4854 - any_center(e) then  
4855 - ["<center>",format_element(e),"</center>"],  
4856 - any_mail_to(email,elem) then  
4857 - ["<a href=\"mailto:",email,"\">",format_element(elem),"</a>"],  
4858 - any_scroller(w,h,cw,ch,c) then  
4859 - format_scroller(w,h,cw,ch,new_idnum(ic_v),c,format_element),  
4860 - any_fixed_size(w,h,c) then  
4861 - with url = create_secondary_document(site_directory,secret,format_element,c,w),  
4862 - ["<object data=\"",url,"\" type=\"text/html\" width=\"",format(w),"\" height=\"",format(h),"\" >",  
4863 - "secondary document",  
4864 - "</object>"],  
4865 - any_fixed_size_2(w,h,fn) then  
4866 - with url = fn+"?zauth="+make_authorization(site_directory,secret,  
4867 - fn),  
4868 - ["<object data=\"",url,"\" type=\"text/html\" width=\"",format(w),"\" height=\"",format(h),"\" >",  
4869 - "secondary document",  
4870 - "</object>"],  
4871 - any_actioner(c,t,a,an,eo,ja,fn) then  
4872 - format_actioner(cinfo,c,t,a,an,eo,ja,fn,is_https, action_count, ic_v, head_tags),  
4873 -  
4874 - any_foreign_link_new(target, aspect, url) then  
4875 - format_foreign_link(target, aspect, url, is_https, cinfo, action_count, ic_v, head_tags),  
4876 -  
4877 - any_foreign_link(options,url) then  
4878 - ["<a href=\"",url,"\" ", format_text_options(options), "></a>"], // IE7 doesn't support the form <a href="..." />  
4879 - any_foreign_link(options,url,name) then  
4880 - ["<a href=\"",url,"\"><span ", format_text_options(options), ">",name,"</span></a>"],  
4881 - any_private_download(url,name,extra_ext,action) then  
4882 - format_private_download(cinfo,url,name,extra_ext,action),  
4883 - any_div(options, l) then  
4884 - [format_div_option(options), flat(map(($T e) |-> format_element(e), l)),"</div>\n"],  
4885 - any_div_empty(options) then  
4886 - [format_div_option(options), "</div>\n"],  
4887 - any_coreattrs(attributs) then  
4888 - [format_attrs(attributs)],  
4889 - any_ol(opts, l) then  
4890 - ["<ol", format_attrs(opts), ">", flat(map(($T e) |-> format_element(e), l)),"</ol>\n"],  
4891 - any_ul(opts, l) then  
4892 - ["<ul", format_attrs(opts), ">", flat(map(($T e) |-> format_element(e), l)),"</ul>\n"],  
4893 - any_li(opts, l) then  
4894 - ["<li", format_attrs(opts), ">", flat(map(($T e) |-> format_element(e), l)),"</li>\n"],  
4895 - any_button(options, l) then  
4896 - [["<button" + format_attrs(options) + ">"], flat(map(($T e) |-> format_element(e), l)),"</button>\n"],  
4897 - any_i(opts,t) then  
4898 - if t = "" then  
4899 - ["<i", format_attrs(opts), "></i>\n"]  
4900 - else  
4901 - ["<i", format_attrs(opts), ">",t,"</i>\n"],  
4902 - any_span(opts , t) then  
4903 - ["<span", format_attrs(opts), ">",t,"</span>"]  
4904 - any_hr(opts) then  
4905 - ["<hr", format_attrs(opts),">"]  
4906 - }  
4907 -.  
4908 -  
4909 -  
4910 -  
4911 - // *** [5.8] Formating 'in form' elements.  
4912 -  
4913 -  
4914 -//public define Printable_tree  
4915 -// format  
4916 -// (  
4917 -// HTML_tooltip tooltip  
4918 -// )=  
4919 -// if tooltip is  
4920 -// {  
4921 -// html_tooltip(title, keyword, width) then  
4922 -// ["<a id=\"help_",keyword,"\" class=\"jTipu jTip_help\" name=\"",title,"\" href=\"/?a=ajax_show_tooltip&amp;tooltip_id=",keyword,(if width > 0 then ["&width=",width,"\""] else ["\""]), "></a>"],  
4923 -//  
4924 -// html_tooltip_ext(title, extend_type, class_suffix, ext_args) then  
4925 -// with extra_args = format_extra_operands(ext_args),  
4926 -// ["<a id=\"jTip\" class=\"jTipu jTip_",class_suffix,"\" name=\"",title,"\" href=\"/?a=ajax_show_tooltip&amp;tooltip_ext=",extend_type+extra_args,"\"></a>"]  
4927 -// }.  
4928 -  
4929 -public define List(CoreAttrs)  
4930 - extract_attributes  
4931 - (  
4932 - HTML_tooltip tooltip  
4933 - )=  
4934 - if tooltip is  
4935 - {  
4936 - html_tooltip(title, keyword, width) then //TODO  
4937 - []  
4938 - //["<a id=\"help_",keyword,"\" class=\"jTipu \" name=\"",title,"\" href=\"/?a=ajax_show_tooltip&tooltip_id=",keyword,(if width > 0 then ["&width=",width,"\""] else ["\""]), "><i class=\"fa fa-info\" aria-hidden=\"true\" style=\"color:#2e6da4\"></i></a>"],  
4939 -  
4940 - html_tooltip_ext(title, extend_type, class_suffix, ext_args) then //TODO  
4941 - //[]  
4942 - with extra_args = format_extra_operands(ext_args),  
4943 - [id("jTip"), class("jTipu jTip_"+class_suffix), data("name",title), data("href", "/?a=ajax_show_tooltip&tooltip_ext="+extend_type+extra_args)]  
4944 -  
4945 - html_tooltip_ext(title, extend_type, ext_args) then //TODO  
4946 - with extra_args = format_extra_operands(ext_args),  
4947 - [id("jTip"), class("jTipu"), data("name",title), data("href", "/?a=ajax_show_tooltip&tooltip_ext="+extend_type+extra_args)]  
4948 -// []  
4949 - //with extra_args = format_extra_operands(ext_args),  
4950 - //["<a id=\"jTip\" class=\"jTipu \" name=\"",title,"\" href=\"/?a=ajax_show_tooltip&tooltip_ext=",extend_type+extra_args,"\"><i class=\"fa fa-info\" aria-hidden=\"true\" style=\"color:#2e6da4\"></i></a>"],  
4951 -  
4952 - html_tooltip(title, web_action, extra_args) then  
4953 - [ id("jTip"), class("jTipu"), data("name", title), data("href", "/"+format_web_action_name(web_action, extra_args))  
4954 - ]  
4955 -  
4956 - //["<a id=\"jTip\" class=\"jTipu \" name=\"",title,"\" href=\"/", format_web_action_name(web_action, extra_args) ,"\"><i class=\"fa fa-info\" aria-hidden=\"true\" style=\"color:#2e6da4\"></i></a>"],  
4957 -  
4958 - }  
4959 -.  
4960 -  
4961 - literal_pt(["<span id=\"jTip\" class=\"jTipu\" data-name=\"",title,"\" data-href=\"/", format_web_action_name(web_action, extra_args) ,"\">"]),  
4962 -  
4963 -  
4964 -public define Printable_tree  
4965 - format  
4966 - (  
4967 - HTML_tooltip tooltip  
4968 - )=  
4969 - if tooltip is  
4970 - {  
4971 - html_tooltip(title, keyword, width) then  
4972 - ["<a id=\"help_",keyword,"\" class=\"jTipu \" data-name=\"",title,"\" data-href=\"/?a=ajax_show_tooltip&tooltip_id=",keyword,(if width > 0 then ["&width=",width,"\""] else ["\""]), "><i class=\"fa fa-info\" aria-hidden=\"true\" style=\"color:#2e6da4\"></i></a>"],  
4973 -  
4974 - html_tooltip_ext(title, extend_type, class_suffix, ext_args) then  
4975 - with extra_args = format_extra_operands(ext_args),  
4976 - ["<a id=\"jTip\" class=\"jTipu jTip_",class_suffix,"\" data-name=\"",title,"\" data-href=\"/?a=ajax_show_tooltip&tooltip_ext=",extend_type+extra_args,"\"></a>"]  
4977 -  
4978 - html_tooltip_ext(title, extend_type, ext_args) then  
4979 - with extra_args = format_extra_operands(ext_args),  
4980 - ["<a id=\"jTip\" class=\"jTipu \" data-name=\"",title,"\" data-href=\"/?a=ajax_show_tooltip&tooltip_ext=",extend_type+extra_args,"\"><i class=\"fa fa-info\" aria-hidden=\"true\" style=\"color:#2e6da4\"></i></a>"],  
4981 - html_tooltip(title, web_action, extra_args) then  
4982 - ["<a id=\"jTip\" class=\"jTipu \" data-name=\"",title,"\" data-href=\"/", format_web_action_name(web_action, extra_args) ,"\"><i class=\"fa fa-info\" aria-hidden=\"true\" style=\"color:#2e6da4\"></i></a>"],  
4983 -  
4984 - }  
4985 -.  
4986 -  
4987 -public define HTML_Off_Form  
4988 - html_tooltip  
4989 - (  
4990 - String title,  
4991 - WEB_Action_Name web_action,  
4992 - List((String,String)) extra_args,  
4993 - HTML_Off_Form html_element,  
4994 - )=  
4995 - span([id("jTip"), class("jTipu"), data("name", title), data("href", "/"+format_web_action_name(web_action, extra_args))], html_element)  
4996 -.  
4997 -  
4998 -public define HTML_Off_Form  
4999 - html_tooltip  
5000 - (  
5001 - String title,  
5002 - String keyword,  
5003 - ) =  
5004 - literal_pt(format(html_tooltip(title, keyword, 0))).  
5005 -  
5006 -public define HTML_In_Form  
5007 - html_tooltip  
5008 - (  
5009 - String title,  
5010 - String keyword,  
5011 - ) =  
5012 - literal_pt(format(html_tooltip(title, keyword, 0))).  
5013 -  
5014 -public define HTML_Off_Form  
5015 - html_tooltip  
5016 - (  
5017 - String keyword,  
5018 - Int size,  
5019 - ) =  
5020 - literal_pt(format(html_tooltip("", keyword, size))).  
5021 -  
5022 -public define HTML_In_Form  
5023 - html_tooltip  
5024 - (  
5025 - String keyword,  
5026 - Int size,  
5027 - ) =  
5028 - literal_pt(format(html_tooltip("", keyword, size))).  
5029 -  
5030 -public define Printable_tree  
5031 - format_help  
5032 - (  
5033 - Printable_tree label,  
5034 - HTML_Help _help  
5035 - ) =  
5036 - if _help is  
5037 - {  
5038 - no_help then label,  
5039 - tooltip(html_tooltip, position) then  
5040 - if position is  
5041 - {  
5042 - left then pt_pt(format(html_tooltip),label),  
5043 - right then pt_pt(label, format(html_tooltip))  
5044 - }  
5045 - }.  
5046 -  
5047 -  
5048 -  
5049 -public define HTML_Label  
5050 - label  
5051 - (  
5052 - String text  
5053 - )=  
5054 - label(text, no_help).  
5055 -  
5056 -  
5057 -  
5058 -  
5059 -define Printable_tree  
5060 - format  
5061 - (  
5062 - CommonInfo cinfo,  
5063 - String fn, // form_name  
5064 - Var(Int) ic_v, // idnum counter variable  
5065 - HTML_In_Form element,  
5066 - Bool is_https,  
5067 - Var(Int) action_count,  
5068 - Var(List(HTML_Head_Tag)) head_tags  
5069 - ) =  
5070 - if cinfo is info(common_name,http_port,https_port,site_directory,secret) then  
5071 - with format_element = (HTML_In_Form e) |-> format(cinfo, fn, ic_v, e, is_https, action_count, head_tags),  
5072 - if element is  
5073 - {  
5074 - empty then [],  
5075 - literal_pt(t) then t,  
5076 - literal(t) then [t],  
5077 - sequence(l) then flat(map(format_element,l))  
5078 - text(opts,t) then  
5079 - format(cinfo,ic_v,any_text(opts,t),format_element,is_https, action_count, head_tags),  
5080 - preformated(o,s) then  
5081 - format(cinfo,ic_v,any_preformated(o,s),format_element,is_https, action_count, head_tags),  
5082 - paragraph(opts,t) then  
5083 - format(cinfo,ic_v,any_paragraph(opts,t),format_element,is_https, action_count, head_tags),  
5084 - image(opts, url, alt) then  
5085 - format(cinfo,ic_v,any_image(opts, url, alt),format_element,is_https, action_count, head_tags),  
5086 - image(opts, url, alt, w, h) then  
5087 - format(cinfo,ic_v,any_image(opts, url, alt, w, h),format_element,is_https, action_count, head_tags),  
5088 - table(opts,header_row,rows,footer_row) then  
5089 - format(cinfo,ic_v,any_table(opts, header_row, rows, footer_row),format_element,is_https, action_count, head_tags),  
5090 - center(e) then  
5091 - format(cinfo,ic_v,any_center(e),format_element,is_https, action_count, head_tags),  
5092 - mail_to(a,e) then  
5093 - format(cinfo,ic_v,any_mail_to(a,e),format_element,is_https, action_count, head_tags),  
5094 - scroller(w,h,cw,ch,c) then  
5095 - format(cinfo,ic_v,any_scroller(w,h,cw,ch,c),format_element,is_https, action_count, head_tags),  
5096 - actioner(c,t,a,an,eo,ja) then  
5097 - format(cinfo,ic_v,any_actioner(c,t,a,an,eo,ja,success(fn)),format_element,is_https, action_count, head_tags),  
5098 -  
5099 - foreign_link_new(target, aspect, url) then  
5100 - format(cinfo,ic_v,any_foreign_link_new(target,aspect,url),format_element,is_https, action_count, head_tags),  
5101 -  
5102 - foreign_link(options,url) then  
5103 - format(cinfo,ic_v,any_foreign_link(options,url),format_element,is_https, action_count, head_tags),  
5104 - foreign_link(options,url,name) then  
5105 - format(cinfo,ic_v,any_foreign_link(options,url,name),format_element,is_https, action_count, head_tags),  
5106 - private_download(url,name,extra,action) then  
5107 - format(cinfo,ic_v,any_private_download(url,name,extra,action),format_element,is_https, action_count, head_tags),  
5108 - text_input(options, label_text, id, name, init, w) then  
5109 - [ format_label(label_text, id),  
5110 - "<input type=\"text\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",encode_HTML_entities(init.value),"\"",format_attrs([class("in") . options])," />"],  
5111 - text_input_ro(options, label_text, id, name, init, w) then  
5112 - [ format_label(label_text, id),  
5113 - "<input readonly=\"readonly\" type=\"text\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",encode_HTML_entities(init.value),"\"",format_attrs([class("in") . options])," />"],  
5114 - password_input(options, label_text, id, name, init, w) then  
5115 - [ format_label(label_text, id),  
5116 - "<input type=\"password\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",encode_HTML_entities(init.value),"\"",format_attrs([class("in") . options])," />"],  
5117 - text_area(options,label_text, id, n, init, w, h) then  
5118 - [ format_label(label_text, id), "<textarea ",format(options)," id=\"",id,"\" name=\"",n,"\" cols=\"",w,"\" rows=\"",h,"\">",encode_HTML_entities(init.value),"</textarea>"],  
5119 - file_upload(options, label, id, n, w) then  
5120 - [ format_label(label, id),  
5121 - "<input type=\"file\" id=\"",id,"\" size=\"",w,"\" name=\"",n,"\"",format_attrs([class("in") . options])," />"],  
5122 - selector(options, label, id, n,s,cs) then  
5123 - [ format_label(label, id),  
5124 - "<select id=\"",id,"\" name=\"",n,"\" size=\"",s,"\" ",format_attrs([class("in") . options]),">",format_choices(cs),"</select>"],  
5125 - selector(options, label, id, n,s,cs,sd) then  
5126 - [ format_label(label, id),  
5127 - "<select id=\"",id,"\" name=\"",n,"\" size=\"",s,"\" ",format_attrs([class("in") . options]),">",format_choices(cs,sd),"</select>"],  
5128 - selector_c(options, label, id, n,s,cs) then  
5129 - [ format_label(label, id),  
5130 - "<select id=\"",id,"\" name=\"",n,"\" size=\"",s,"\" ",format_attrs([class("in") . options]),">",format_choices(cs),"</select>"],  
5131 - selector_c(options, label, id, n,s,cs,sd) then  
5132 - [ format_label(label, id),  
5133 - "<select id=\"",id,"\" name=\"",n,"\" size=\"",s,"\" ",format_attrs([class("in") . options]),">",format_choices(cs,sd),"</select>"],  
5134 -  
5135 - radio_button(options, label, id, n, value, c) then  
5136 - [ format_label(label, id),  
5137 - "<input type=\"radio\" name=\"",n,"\" id=\"",id,"\" value=\"",value,"\"",(if c then " checked=\"checked\"" else ""),format_attrs([class("in") . options])," />"],  
5138 - radio_button_r(options, label, id, n, value, c) then  
5139 - [ "<input type=\"radio\" name=\"",n,"\" id=\"",id,"\" value=\"",value,"\"",(if c then " checked=\"checked\"" else ""),format_attrs([class("in") . options])," />",  
5140 - format_label(label, id)],  
5141 - check_box(options, label, id, n, c) then  
5142 - [ format_label(label, id),  
5143 - "<input type=\"hidden\" name=\"~",n,"\" value=\"~true\" /><input type=\"checkbox\" name=\"",n,"\" id=\"",id,"\" value=\"true\"",(if c then " checked=\"checked\" " else ""),format_attrs([class("in") . options])," />"]  
5144 - check_box_r(options, label, id, n, c) then  
5145 - [ "<input type=\"hidden\" name=\"~",n,"\" value=\"~true\" /><input type=\"checkbox\" name=\"",n,"\" id=\"",id,"\" value=\"true\"",(if c then " checked=\"checked\" " else ""),format_attrs([class("in") . options])," />",  
5146 - format_label(label, id)]  
5147 - div(options, e) then  
5148 - format(cinfo,ic_v,any_div(options, e),format_element,is_https, action_count, head_tags),  
5149 - div_empty(options) then  
5150 - format(cinfo,ic_v,any_div_empty(options),format_element,is_https, action_count, head_tags),  
5151 - hidden(_id, name, init) then  
5152 - since _id is html_Id(id),  
5153 - ["<input type=\"hidden\"",(if id = "" then "" else " id=\""+id+"\"")," name=\"",name,"\" value=\"",encode_HTML_entities(init.value),"\" />"],  
5154 - partial(p_content) then  
5155 - if p_content is partial_content(tags, html_elements) then  
5156 - head_tags <- *head_tags + tags;  
5157 -  
5158 - format(cinfo, ic_v, html_elements, is_https, action_count, head_tags),  
5159 - br then ["<br>"],  
5160 - progress(options, value, max) then ["<progress max=\"",value,"\" value=\"",max,"\"",format_attrs(options),"></progress>"],  
5161 - ol(opts, t) then  
5162 - format(cinfo,ic_v,any_ol(opts,t),format_element,is_https, action_count, head_tags),  
5163 - ul(opts, t) then  
5164 - format(cinfo,ic_v,any_ul(opts,t),format_element,is_https, action_count, head_tags),  
5165 - li(opts, t) then  
5166 - format(cinfo,ic_v,any_li(opts,t),format_element,is_https, action_count, head_tags),  
5167 - button(options, e) then  
5168 - format(cinfo,ic_v,any_button(options, e),format_element,is_https, action_count, head_tags),  
5169 - i(opts, t) then  
5170 - format(cinfo,ic_v,any_i(opts,t),format_element,is_https, action_count, head_tags),  
5171 - span(opts,t) then  
5172 - format(cinfo,ic_v,any_span(opts,t),format_element,is_https, action_count, head_tags)  
5173 - hr(opts) then  
5174 - format(cinfo,ic_v,any_hr(opts),format_element,is_https, action_count, head_tags)  
5175 - }.  
5176 -  
5177 -  
5178 -  
5179 -  
5180 -  
5181 -  
5182 - *** [5.9] Formating 'off form' elements.  
5183 -  
5184 - The encryption type 'multipart/form-data' is required for a form containing an upload.  
5185 -  
5186 -  
5187 -define Bool  
5188 - contains_an_upload  
5189 - (  
5190 - HTML_In_Form form_content  
5191 - ).  
5192 -  
5193 -define Bool  
5194 - contains_an_upload  
5195 - (  
5196 - HTML_Row(HTML_In_Form) row  
5197 - ) =  
5198 - if row is  
5199 - {  
5200 - empty then false,  
5201 - row(_, cells) then  
5202 - mapor(contains_an_upload,  
5203 - map(content, cells))  
5204 - }  
5205 -.  
5206 -  
5207 -define Bool  
5208 - contains_an_upload  
5209 - (  
5210 - HTML_Footer_Row(HTML_In_Form) row  
5211 - )=  
5212 - if row is  
5213 - {  
5214 - empty then false,  
5215 - footer_row(_, cells) then  
5216 - mapor(contains_an_upload,  
5217 - map(content,cells))  
5218 - }.  
5219 -  
5220 -define Bool  
5221 - contains_an_upload  
5222 - (  
5223 - HTML_In_Form form_content  
5224 - ) =  
5225 - if form_content is  
5226 - {  
5227 - empty then false,  
5228 - literal_pt(t) then false,  
5229 - literal(t) then false,  
5230 - sequence(l) then mapor(contains_an_upload,l),  
5231 - text(o,t) then false,  
5232 - preformated(o,s) then false,  
5233 - paragraph(o,l) then mapor(contains_an_upload,l),  
5234 - image(o,u,a) then false,  
5235 - image(o,u,a,w,h) then false,  
5236 - table(o,_,rows,f_row) then if mapor(contains_an_upload,rows) then true  
5237 - else contains_an_upload(f_row),  
5238 - center(e) then contains_an_upload(e),  
5239 - mail_to(m,e) then false, // 'e' may but should not contain an upload  
5240 - scroller(w,h,cw,ch,e) then contains_an_upload(e),  
5241 - actioner(c,t,a,an,eo,ja) then false,  
5242 - foreign_link_new(_,_,_) then false,  
5243 - foreign_link(o,u) then false,  
5244 - foreign_link(o,u,n) then false,  
5245 - private_download(p,n,e,a) then false,  
5246 - text_input(o,lt,l,n,i,w) then false,  
5247 - text_input_ro(o,lt,l,n,i,w) then false,  
5248 - password_input(o,lt,l,n,i,w) then false,  
5249 - text_area(o,lt,id,n,i,w,h) then false,  
5250 - file_upload(o,l,i,n,w) then true,  
5251 - selector(o,l,i,n,s,c) then false,  
5252 - selector(o,l,i,n,s,c,p) then false,  
5253 - selector_c(o,l,i,n,s,c) then false,  
5254 - selector_c(o,l,i,n,s,c,p) then false,  
5255 - radio_button(o,_,_,n,v,c) then false,  
5256 - radio_button_r(o,_,_,n,v,c) then false,  
5257 - check_box(o,_,_,n,c) then false,  
5258 - check_box_r(o,_,_,n,c) then false,  
5259 - div(o,l) then mapor(contains_an_upload,l), //contains_an_upload(c),  
5260 - div_empty(o) then false,  
5261 - hidden(_,_,_) then false,  
5262 - partial(_) then false,  
5263 - br then false,  
5264 - progress(_,_,_) then false,  
5265 - ol(_,l) then mapor(contains_an_upload,l),  
5266 - ul(_,l) then mapor(contains_an_upload,l),  
5267 - li(_,l) then mapor(contains_an_upload,l),  
5268 - button(_,_) then false,  
5269 - i(_,_) then false,  
5270 - span(_,_) then false,  
5271 - hr(_) then false  
5272 - }  
5273 -.  
5274 -  
5275 -define String  
5276 - enctype  
5277 - (  
5278 - List(HTML_In_Form) form_contents  
5279 - )=  
5280 - if mapor(contains_an_upload, form_contents) then  
5281 - " enctype=\"multipart/form-data\""  
5282 - else  
5283 - ""  
5284 -.  
5285 -  
5286 -define Printable_tree  
5287 - format_href  
5288 - (  
5289 - A_href _href  
5290 - )=  
5291 - if _href is  
5292 - {  
5293 - href(str) then if str = "" then [] else [" href=\"", str, "\""],  
5294 - href(action, extra) then [" href=\"",format_web_action_name(action, extra), "\""]  
5295 - }  
5296 -.  
5297 -  
5298 -define Printable_tree  
5299 - format_target  
5300 - (  
5301 - A_target _target  
5302 - )=  
5303 - [" target=\"",  
5304 - if _target is  
5305 - {  
5306 - _blank then "_blank",  
5307 - _self then "_self",  
5308 - _parent then "_parent",  
5309 - _top then "_top",  
5310 - framename(name) then name  
5311 - },  
5312 - "\""]  
5313 -.  
5314 -  
5315 -define Printable_tree  
5316 - format  
5317 - (  
5318 - CommonInfo cinfo,  
5319 - Var(Int) ic_v, // 'idnum' counter variable  
5320 - List(HTML_Off_Form) elements,  
5321 - Bool is_https,  
5322 - Var(Int) action_count,  
5323 - Var(List(HTML_Head_Tag)) head_tags  
5324 - ).  
5325 -  
5326 -define Printable_tree  
5327 - format  
5328 - (  
5329 - CommonInfo cinfo,  
5330 - Var(Int) ic_v, // 'idnum' counter variable  
5331 - HTML_Off_Form element,  
5332 - Bool is_https,  
5333 - Var(Int) action_count,  
5334 - Var(List(HTML_Head_Tag)) head_tags  
5335 - ) =  
5336 - if cinfo is info(common_name,http_port,https_port,site_directory,secret) then  
5337 - with format_element = (HTML_Off_Form e) |-> format(cinfo, ic_v, e, is_https, action_count, head_tags),  
5338 - if element is  
5339 - {  
5340 - a(opts, _href, _target, l) then ["<a ", format_attrs(opts), format_href(_href), format_target(_target), ">",flat(map(format_element,l)),"</a>\n"],  
5341 - empty then [],  
5342 - literal_pt(t) then t,  
5343 - literal(t) then [t],  
5344 - sequence(l) then flat(map(format_element,l)),  
5345 - text(opts,t) then  
5346 - format(cinfo,ic_v,any_text(opts,t),format_element,is_https, action_count, head_tags),  
5347 -// table(opts,header_row, rows, footer_row) then  
5348 -// format(cinfo,ic_v,any_table(opts,header_row, rows, footer_row),format_element,is_https, action_count, head_tags),  
5349 - actioner(c,t,a,an,eo,ja) then  
5350 - format(cinfo,ic_v,any_actioner(c,t,a,an,eo,ja,failure),format_element,is_https, action_count, head_tags),  
5351 - actioner(c,t,a,an,eo,ja,fn) then  
5352 - format(cinfo,ic_v,any_actioner(c,t,a,an,eo,ja,success(fn)),format_element,is_https, action_count, head_tags),  
5353 - foreign_link_new(target, aspect, url) then  
5354 - format(cinfo,ic_v,any_foreign_link_new(target,aspect,url),format_element,is_https, action_count, head_tags),  
5355 -// foreign_link(options,url) then  
5356 -// format(cinfo,ic_v,any_foreign_link(options,url),format_element,is_https, action_count, head_tags),  
5357 - foreign_link(options,url,name) then  
5358 - format(cinfo,ic_v,any_foreign_link(options,url,name),format_element,is_https, action_count, head_tags),  
5359 - private_download(url,name,extra,action) then  
5360 - format(cinfo,ic_v,any_private_download(url,name,extra,action),format_element,is_https, action_count, head_tags),  
5361 -// form(fn, attributs, l) then  
5362 -// [  
5363 -// "<form id=\"",fn,"\"",  
5364 -// format(cinfo,ic_v,any_coreattrs(attributs),format_element,is_https, action_count, head_tags),  
5365 -// " method=\"post\"",  
5366 -// enctype(l),  
5367 -// " action=\"http",(  
5368 -// if is_https then "s" else "",  
5369 -// "://",common_name,":",to_decimal(http_port),"/\">",  
5370 -// // action is set dynamically by  
5371 -// // the actioner using JavaScript  
5372 -// if fn is html_Id(id) then  
5373 -// flat(map((HTML_In_Form e) |-> format(cinfo,id,ic_v,e,is_https, action_count, head_tags), l)),  
5374 -// "</form>"  
5375 -// ]  
5376 -// form(fn,attributs, action, extra_ops, l) then  
5377 -// with url = make_actioner_url(cinfo, same, same,  
5378 -// action, extra_ops, is_https),  
5379 -// [  
5380 -// "<form id=\"",fn,"\"",  
5381 -// format(cinfo,ic_v, any_coreattrs(attributs),format_element,is_https, action_count, head_tags),  
5382 -// " method=\"post\"",  
5383 -// enctype(l),  
5384 -// " action=\"" + url + "\">",  
5385 -//// " action=\"http",  
5386 -//// if is_https then "s" else "",  
5387 -//// "://",common_name,":",http_port,"/\">",  
5388 -// // action is set dynamically by  
5389 -// // the actioner using JavaScript  
5390 -// if fn is html_Id(id) then  
5391 -// flat(map((HTML_In_Form e) |-> format(cinfo,id,ic_v,e,is_https, action_count, head_tags),l)),  
5392 -// "</form>"  
5393 -// ],  
5394 -// in_form(fn, content) then  
5395 -// if fn is html_Id(id) then  
5396 -// format(cinfo,id,ic_v, content,is_https, action_count, head_tags),  
5397 - div(options, p_content) then  
5398 - with html_elements = map((HTML_Partial_Content pc) |-> since pc is partial_content(tags, html_elem), head_tags <- *head_tags +tags; html_elem, p_content),  
5399 -  
5400 - format(cinfo, ic_v, any_div(options, html_elements), format_element, is_https, action_count, head_tags),  
5401 - iframe(options, css_styles, css_files, js_files, body) then  
5402 - println("formating iframe");  
5403 - if body is body(body_options,elem) then  
5404 - [ "<iframe", format_attrs(options), " srcdoc=\"\n",  
5405 -  
5406 - encode_HTML_quote(to_String([  
5407 - "<html style=\"margin: 0pt; padding: 0pt;\">\n",  
5408 - "<head>\n",  
5409 - add_css_styles(css_styles),  
5410 - add_css_files(css_files),  
5411 - add_js_files(js_files),  
5412 - "</head>\n",  
5413 - "<body ", format_attrs(body_options), ">\n", // format body options  
5414 - format(cinfo,ic_v, elem ,is_https, action_count, head_tags),  
5415 - "</body>\n",  
5416 - "</html>\n",])),  
5417 -  
5418 - "\"></iframe>\n",  
5419 - ],  
5420 - partial(p_content) then  
5421 - if p_content is partial_content(tags, html_elements) then  
5422 - head_tags <- *head_tags + tags;  
5423 - format(cinfo, ic_v, html_elements, is_https, action_count, head_tags),  
5424 -// i(opts, t) then  
5425 -// format(cinfo,ic_v,any_i(opts,t),format_element,is_https, action_count, head_tags),  
5426 - html_tag(tag_name, opts, l) then ["<",tag_name, format_attrs(opts), ">", flat(map(format_element,l)), "</",tag_name,">\n"],  
5427 - html_void_tag(tag_name, opts) then ["<",tag_name, format_attrs(opts), ">"],  
5428 - }.  
5429 -  
5430 -define Printable_tree  
5431 - format  
5432 - (  
5433 - CommonInfo cinfo,  
5434 - Var(Int) ic_v, // 'idnum' counter variable  
5435 - List(HTML_Off_Form) elements,  
5436 - Bool is_https,  
5437 - Var(Int) action_count,  
5438 - Var(List(HTML_Head_Tag)) head_tags  
5439 - ) =  
5440 - if cinfo is info(common_name,http_port,https_port,site_directory,secret) then  
5441 - flat(map((HTML_Off_Form element) |->  
5442 - format(cinfo, ic_v, element, is_https, action_count, head_tags),  
5443 - elements))  
5444 -.  
5445 -  
5446 - *** [5.10] Formating meta-tags.  
5447 -  
5448 -define Printable_tree  
5449 - format_keywords  
5450 - (  
5451 - List(String) l  
5452 - ) =  
5453 - if l is  
5454 - {  
5455 - [] then [ ],  
5456 - [h . t] then if t is []  
5457 - then [h]  
5458 - else [h , ", " . format_keywords(t)]  
5459 - }.  
5460 -  
5461 -  
5462 -define Printable_tree  
5463 - format  
5464 - (  
5465 - CommonInfo cinfo,  
5466 - HTML_Meta m,  
5467 - Bool is_https  
5468 - ) =  
5469 - if m is  
5470 - {  
5471 - keywords(l) then ["<meta name=\"keywords\" content=\"",format_keywords(l),"\" />\n"],  
5472 - refresh(co,ta,an,delay) then  
5473 - ["<meta http-equiv=\"Refresh\" content=\"",delay,"; URL=",  
5474 - make_actioner_url(cinfo,co,ta,an,[],is_https),"\" />\n"],  
5475 - refresh(url,delay) then  
5476 - ["<meta http-equiv=\"Refresh\" content=\"",delay,"; URL=",url,"\" />\n"],  
5477 - meta(n,c) then ["<meta name=\"",n,"\" content=\"",c,"\" />\n"],  
5478 - http_equiv(n,c) then ["<meta http-equiv=\"",n,"\" content=\"",c,"\" />\n"],  
5479 - generic_meta(l) then ["<meta ",  
5480 - flat(map(((String,String) p) |-> if p is (n,v) then [n,"=\"",v,"\" "],  
5481 - l)),  
5482 - " />\n"],  
5483 - literal(s) then [s]  
5484 - }  
5485 -.  
5486 -  
5487 -define Printable_tree // c'est le nôtre et c'est meilleur  
5488 - format  
5489 - (  
5490 - HTML_Meta m,  
5491 - ) =  
5492 - if m is  
5493 - {  
5494 - keywords(l) then ["<meta name=\"keywords\" content=\"",format_keywords(l),"\" />\n"],  
5495 - refresh(co,ta,an,delay) then  
5496 - ["<!-- TODO refresh(co,ta,an,delay) --> "], // TODO  
5497 - refresh(url,delay) then  
5498 - ["<meta http-equiv=\"Refresh\" content=\"",delay,"; URL=",url,"\" />\n"],  
5499 - meta(n,c) then ["<meta name=\"",n,"\" content=\"",c,"\" />\n"],  
5500 - http_equiv(n,c) then ["<meta http-equiv=\"",n,"\" content=\"",c,"\" />\n"],  
5501 - generic_meta(l) then ["<meta ",  
5502 - flat(map(((String,String) p) |-> if p is (n,v) then [n,"=\"",v,"\" "],  
5503 - l)),  
5504 - " />\n"],  
5505 - literal(s) then [s]  
5506 - }.  
5507 -  
5508 -  
5509 -define Printable_tree  
5510 - format  
5511 - (  
5512 - CommonInfo cinfo,  
5513 - List(HTML_Meta) metas,  
5514 - Bool is_https,  
5515 - String charset  
5516 - ) =  
5517 - if metas is  
5518 - {  
5519 - [] then [format(cinfo,http_equiv("content-type",  
5520 - "text/html; charset="+charset),is_https)],  
5521 - [h . t] then [format(cinfo,h,is_https)  
5522 - . format(cinfo,t,is_https,charset)]  
5523 - }.  
5524 -  
5525 - define List(HTML_Head_Tag)  
5526 - rebuild_html_head_tags  
5527 - (  
5528 - List(HTML_Head_Tag) lwf,  
5529 - List(HTML_Head_Tag) so_far  
5530 - ) =  
5531 - if lwf is  
5532 - {  
5533 - [] then so_far,  
5534 - [h . t] then  
5535 - rebuild_html_head_tags(t, append_once(so_far, h))  
5536 - }.  
5537 -  
5538 -define Printable_tree  
5539 - _format_html_head  
5540 - (  
5541 - List(HTML_Head_Tag) lwf,  
5542 - Printable_tree so_far,  
5543 - Dictionary(String, Word32) js_dict  
5544 - )  
5545 - =  
5546 - //with lwf_ = rebuild_html_head_tags(lwf, []),  
5547 - if lwf is  
5548 - {  
5549 - [] then reverse(so_far),  
5550 - [ h . t] then  
5551 - if h is  
5552 - {  
5553 - meta(meta) then  
5554 - [format(meta) . _format_html_head(t, so_far, js_dict)],  
5555 - title(title) then  
5556 - ["<title>"+title+"</title>\n" . _format_html_head(t, so_far, js_dict)],  
5557 - js(jsf) then  
5558 - since jsf is js_file(filename, _),  
5559 - if js_dict.get(filename) is  
5560 - {  
5561 - failure then  
5562 - forget(js_dict.insert(filename, 0));  
5563 - [add_js_files([jsf]) . _format_html_head(t, so_far, js_dict)],  
5564 -  
5565 - success(_) then  
5566 - _format_html_head(t, so_far, js_dict),  
5567 - }  
5568 - js_inline(jsi) then  
5569 - if jsi is  
5570 - {  
5571 - script(type, _) then  
5572 - ["<script type=\"" + type + "\">"+content(jsi)+"</script>\n" . _format_html_head(t, so_far, js_dict)],  
5573 - }  
5574 - css(cssf) then  
5575 - since cssf is css_file(file_name, media),  
5576 - ["<link rel=\"stylesheet\" type=\"text/css\" href=\""+file_name+"\" media=\""+to_String(media)+"\" />\n" . _format_html_head(t, so_far, js_dict)],  
5577 -  
5578 - css_inline(cssi) then  
5579 - ["<style>"+cssi+"</style>\n" . _format_html_head(t, so_far, js_dict)]  
5580 -  
5581 - link(link_attrs) then  
5582 - ["<link " + to_String(link_attrs) + " />\n" . _format_html_head(t, so_far, js_dict)]  
5583 - }  
5584 - }  
5585 -.  
5586 -  
5587 -public define Printable_tree  
5588 - format_html_head  
5589 - (  
5590 - List(HTML_Head_Tag) lwf,  
5591 - String charset  
5592 - )  
5593 - =  
5594 - _format_html_head((List(HTML_Head_Tag))[ meta(http_equiv("content-type", "text/html; charset="+charset)) . lwf], [], make_dictionary((Word32)0, dictionaryComparerString)).  
5595 -  
5596 -public define Printable_tree  
5597 - format_html_head  
5598 - (  
5599 - List(HTML_Head_Tag) lwf  
5600 - )  
5601 - =  
5602 - _format_html_head(lwf, [], make_dictionary((Word32)0, dictionaryComparerString)).  
5603 -  
5604 -  
5605 -public type HTML_ajax_content:  
5606 - html_ajax_content( String html_body, String script, List(String) js_file, List(String) css_file).  
5607 -  
5608 -public define HTML_ajax_content  
5609 - sort_head_tag  
5610 - (  
5611 - List(HTML_Head_Tag) lwf,  
5612 - String script,  
5613 - List(String) js_file,  
5614 - List(String) css_file  
5615 - )=  
5616 - if lwf is  
5617 - {  
5618 - [] then html_ajax_content("", script, reverse(js_file), reverse(css_file)),  
5619 - [ h . t ] then  
5620 - if h is  
5621 - {  
5622 - meta(meta) then sort_head_tag(t, script, js_file, css_file),  
5623 - title(title) then sort_head_tag(t, script, js_file, css_file),  
5624 - js(jsf) then /*println("sort_head_tag jsf["+jsf.file_name+"]");*/sort_head_tag(t, script, [file_name(jsf) . js_file], css_file),  
5625 - js_inline(jsi) then /*println("sort_head_tag jsi["+jsi.content+"]");*/sort_head_tag(t, script + content(jsi), js_file, css_file),  
5626 - css(cssf) then sort_head_tag(t, script, js_file, [file_name(cssf) . css_file]),  
5627 - css_inline(cssi) then sort_head_tag(t, script, js_file, css_file),  
5628 - link(_) then sort_head_tag(t, script, js_file, css_file),  
5629 - }  
5630 - }.  
5631 -  
5632 -public define HTML_ajax_content  
5633 - to_html_ajax_content  
5634 - (  
5635 - HTML_Off_Form content_HTML,  
5636 - CommonInfo cinfo  
5637 - )=  
5638 - //println("to_html_ajax_content(content_HTML, cinfo)");  
5639 - with p_content_head_tags = var((List(HTML_Head_Tag))[]),  
5640 - with content = format(cinfo, var((Int)0), content_HTML, false, var(0), p_content_head_tags),  
5641 - if sort_head_tag(*p_content_head_tags, "", [], []) is html_ajax_content(_, script, js_file, css_file) then  
5642 - html_ajax_content(to_String(content), script, js_file, css_file).  
5643 -  
5644 -public define String  
5645 - to_String  
5646 - (  
5647 - HTML_Off_Form content_HTML,  
5648 - CommonInfo cinfo  
5649 - )=  
5650 - //println("to_html_ajax_content(content_HTML, cinfo)");  
5651 - with p_content_head_tags = var((List(HTML_Head_Tag))[]),  
5652 - with content = format(cinfo, var((Int)0), content_HTML, false, var(0), p_content_head_tags),  
5653 - to_String(content)  
5654 -.  
5655 -  
5656 -  
5657 -public define JsonValue  
5658 - to_html_ajax_content  
5659 - (  
5660 - HTML_Partial_Content content_HTML,  
5661 - CommonInfo cinfo,  
5662 - String additional_script  
5663 - )=  
5664 - //println("to_html_ajax_content(content_HTML, cinfo, additional_script)");  
5665 - //println("additional_script"+additional_script);  
5666 - since to_html_ajax_content(partial(content_HTML), cinfo) is html_ajax_content(html, script, js_files, css_files),  
5667 - json_object([  
5668 - json_member("html", json_string(html)),  
5669 - json_member("js_files", to_json_array(js_files)),  
5670 - json_member("css_files", to_json_array(css_files)),  
5671 - json_member("script", json_string(additional_script+script)),  
5672 - ])  
5673 -.  
5674 -  
5675 -public define JsonValue  
5676 - to_html_ajax_content  
5677 - (  
5678 - HTML_Partial_Content content_HTML,  
5679 - CommonInfo cinfo  
5680 - )= to_html_ajax_content(content_HTML, cinfo, "").  
5681 -  
5682 -public define JsonValue  
5683 - to_html_ajax_content  
5684 - (  
5685 - Printable_tree content_HTML,  
5686 - String additional_script  
5687 - )=  
5688 - //since to_html_ajax_content(partial(content_HTML), cinfo) is html_ajax_content(html, script, js_files, css_files),  
5689 - json_object([  
5690 - json_member("html", json_string(to_String(content_HTML))),  
5691 - json_member("js_files", to_json_array([])),  
5692 - json_member("css_files", to_json_array([])),  
5693 - json_member("script", json_string(additional_script)),  
5694 - ])  
5695 -.  
5696 -  
5697 -public define AWP_Handler_Answer //Printable_tree  
5698 - format  
5699 - (  
5700 - CommonInfo cinfo,  
5701 - List(HTTP_header) additional_headers,  
5702 - HTTP_Answer page,  
5703 - Bool is_https,  
5704 - String charset  
5705 - )=  
5706 - if cinfo is info(common_name,http_port,https_port,site_directory,secret) then  
5707 - with ic_v = var((Int)0),  
5708 - p_content_head_tags = var((List(HTML_Head_Tag))[]), //list of heat_tags extracted from partial_content during format of body content  
5709 - if page is  
5710 - {  
5711 - html_page(status, head_tags, body) then  
5712 - if body is body(options,element) then  
5713 - if format(status) is (status_string, status_headers) then  
5714 - with  
5715 - answer_body_body = (Printable_tree)  
5716 - [ "<body ", format_attrs(options), ">", // format body options  
5717 - format(cinfo,ic_v,element,is_https, var(0), p_content_head_tags),  
5718 - "</body>\n",  
5719 -  
5720 - "</html>"],  
5721 - answer_body_header =  
5722 - [doctype_w3c_header,  
5723 - // html_header,  
5724 -  
5725 - "<head>\n", format_html_head(head_tags + *p_content_head_tags, charset),"</head>\n",  
5726 - ],  
5727 - printable_tree([  
5728 - "HTTP/1.1 " + status_string, crlf,  
5729 - format_headers(standard_headers),  
5730 - format_headers(standard_headers_for("text/html", length(answer_body_header) + length(answer_body_body), success(charset))),  
5731 - format_headers(status_headers),  
5732 - format_headers(additional_headers),  
5733 - crlf,  
5734 - answer_body_header .  
5735 - answer_body_body  
5736 - ]),  
5737 -  
5738 - html_page(status, title, head_tags, css_styles, css_files, js_files, script, body) then  
5739 - if body is body(options,element) then  
5740 - if format(status) is (status_string, status_headers) then  
5741 - with  
5742 - answer_body_body = (Printable_tree)  
5743 - [ "<body ", format_attrs(options), ">", // format body options  
5744 - format(cinfo,ic_v,element,is_https, var(0), p_content_head_tags),  
5745 - "</body>\n",  
5746 - "</html>"  
5747 - ],  
5748 - answer_body_header =  
5749 - [ doctype_w3c_header,  
5750 - //html_header,  
5751 - "<head>\n",  
5752 - add_css_styles(css_styles),  
5753 - add_css_files(css_files),  
5754 - add_js_files(js_files),  
5755 - add_script(script),  
5756 - "<link rel=\"shortcut icon\" href=\"favicon.ico\" />\n",  
5757 - "<script type = \"text/javascript\" language=\"JavaScript\">",  
5758 - " function show_local_popup(divname,stvname) {",  
5759 - " if (document.layers) { var d = eval(document.divname); } else\n",  
5760 - " if (document.getElementById) { var d = eval(\"document.getElementById(divname)\"); } else\n",  
5761 - " if (document.all) { var d = eval(document.all.divname.style)};\n",  
5762 - // " alert(typeof(eval(stvname))); ",  
5763 - " var s = eval(stvname); ",  
5764 - " if (s[0]==0) ",  
5765 - " { s[0]=1; d.style.visibility = 'visible'; d.zIndex = 100; } else\n",  
5766 - " { s[0]=0; d.style.visibility = 'hidden'; }; }",  
5767 - "</script>\n",  
5768 - "<title>",title,"</title>\n", // put title  
5769 - //format(cinfo,metas,is_https,charset), // format the metas  
5770 - format_html_head(head_tags + *p_content_head_tags, charset),  
5771 - "</head>\n"  
5772 - ],  
5773 - printable_tree([  
5774 - "HTTP/1.1 " + status_string, crlf,  
5775 - format_headers(standard_headers),  
5776 - format_headers(standard_headers_for("text/html", length(answer_body_header) + length(answer_body_body), success(charset))),  
5777 - format_headers(status_headers),  
5778 - format_headers(additional_headers),  
5779 - crlf,  
5780 - answer_body_header .  
5781 - answer_body_body  
5782 - ]),  
5783 -  
5784 - plain_text (HTTP_Status status, String text) then  
5785 - if format(status) is (status_string, status_headers) then  
5786 - printable_tree([  
5787 - "HTTP/1.1 " + status_string, crlf,  
5788 - format_headers(standard_headers),  
5789 - format_headers(standard_headers_for("text/plain", length(text), success(charset))),  
5790 - format_headers(status_headers),  
5791 - format_headers(additional_headers),  
5792 - crlf,  
5793 - text . (Printable_tree)[]  
5794 - ]),  
5795 -  
5796 - custom_text(HTTP_Status status, mime_type, String content) then  
5797 - if format(status) is (status_string, status_headers) then  
5798 - printable_tree([  
5799 - "HTTP/1.1 " + status_string, crlf,  
5800 - format_headers(standard_headers),  
5801 - format_headers(standard_headers_for(to_String(mime_type), length(content), success(charset))),  
5802 - format_headers(status_headers),  
5803 - format_headers(additional_headers),  
5804 - crlf,  
5805 - content . (Printable_tree)[]  
5806 - ]),  
5807 -  
5808 - custom_binary(HTTP_Status status, mime_type, ByteArray content, List(HTTP_header) other_headers) then  
5809 - if format(status) is (status_string, status_headers) then  
5810 - printable_tree([  
5811 - "HTTP/1.1 " + status_string, crlf,  
5812 - format_headers(status_headers),  
5813 - format_headers(standard_headers_for(to_String(mime_type), length(content), failure)),  
5814 - format_headers(status_headers),  
5815 - format_headers(other_headers),  
5816 - format_headers(additional_headers),  
5817 - crlf,  
5818 - content . (Printable_tree)[]  
5819 - ]),  
5820 -  
5821 - custom_tree(HTTP_Status status, mime_type, Printable_tree content) then  
5822 - if format(status) is (status_string, status_headers) then  
5823 - printable_tree([  
5824 - "HTTP/1.1 " + status_string, crlf,  
5825 - format_headers(standard_headers),  
5826 - format_headers(standard_headers_for(to_String(mime_type), length(content), success(charset))),  
5827 - format_headers(status_headers),  
5828 - format_headers(additional_headers),  
5829 - crlf .  
5830 - content  
5831 - ]),  
5832 -  
5833 - json(HTTP_Status status, JsonValue json_content) then  
5834 - //with start = unow,  
5835 - with content = (Printable_tree)format_json(json_content),  
5836 - //println(show_duration_string("HTTP json format json object ", start));  
5837 - if format(status) is (status_string, status_headers) then  
5838 - printable_tree([  
5839 - "HTTP/1.1 " + status_string, crlf,  
5840 - format_headers(standard_headers),  
5841 - format_headers(standard_headers_for(to_String(mime_application_json), length(content), success(charset))),  
5842 - format_headers(status_headers),  
5843 - format_headers(additional_headers),  
5844 - crlf .  
5845 - content  
5846 - ])  
5847 - ,  
5848 - send_file(file_path, c_disposition) then  
5849 - send_file(file_path, c_disposition),  
5850 -  
5851 - http_raw(Printable_tree content) then  
5852 - printable_tree(content),  
5853 -  
5854 - html_content(HTTP_Status status, HTML_Off_Form content_HTML) then  
5855 - if format(status) is (status_string, status_headers) then  
5856 - with content = format(cinfo, ic_v, content_HTML, is_https, var(0), p_content_head_tags),  
5857 - printable_tree([  
5858 - "HTTP/1.1 " + status_string, crlf,  
5859 - format_headers(standard_headers),  
5860 - format_headers(standard_headers_for("text/html", length(content), success(charset))),  
5861 - format_headers(status_headers),  
5862 - format_headers(additional_headers),  
5863 - crlf .  
5864 - content  
5865 - ]),  
5866 - //HMTL content with some header  
5867 - html_partial_content(HTTP_Status status, HTML_Partial_Content p_content) then  
5868 -  
5869 - since p_content is partial_content(head_tags, html_content),  
5870 - since format(status) is (status_string, status_headers),  
5871 - with  
5872 - answer_body = (Printable_tree)  
5873 - [  
5874 - format(cinfo, ic_v, html_content, is_https, var(0), p_content_head_tags),  
5875 - ],  
5876 - answer_header = (Printable_tree)  
5877 - [  
5878 - // html_header,  
5879 - format_html_head(head_tags + *p_content_head_tags),  
5880 - ],  
5881 - printable_tree([  
5882 - "HTTP/1.1 " + status_string, crlf,  
5883 - format_headers(standard_headers),  
5884 - format_headers(standard_headers_for("text/html", length(answer_header) + length(answer_body), success(charset))),  
5885 - format_headers(status_headers),  
5886 - format_headers(additional_headers),  
5887 - crlf,  
5888 - answer_header .  
5889 - answer_body  
5890 - ]),  
5891 - }.  
5892 -  
web/types/making_a_web_site.anubis.bak deleted
1 -/*  
2 - * Created by PyramIDE.  
3 - * User: フランスのトトロ aka (David RENÉ)  
4 - * Date: 29/05/2019  
5 - * Time: 18:41  
6 - * © David RENÉ  
7 - */  
8 -transmit xlib/web/types/web_action_name.anubis  
9 -transmit xlib/web/common.anubis  
10 -  
11 -transmit xlib/web/multihost_http_server.anubis  
12 -transmit xlib/web/json.anubis  
13 -transmit xlib/web/widgets/left_menu.anubis  
14 -read web/mime.anubis  
15 -read tools/printable_tree.anubis  
16 -  
17 -public type WEB_Action_Allowed_Protocol:  
18 - http,  
19 - https,  
20 - http_https  
21 -.  
22 -  
23 -public type Web_Action($State):  
24 - http_action (String name, // name of action  
25 - ($State) -> Bool allow, // true if action allowed  
26 - (HTTP_Info http_info,  
27 - List(Web_arg) web_args, // actually only 'operands' web arguments  
28 - $State state) -> $State do_it),  
29 - https_action (String name, // name of action  
30 - ($State) -> Bool allow, // true if action allowed  
31 - (HTTP_Info http_info,  
32 - List(Web_arg) web_args, // actually only 'operands' web arguments  
33 - $State state) -> $State do_it),  
34 - http_https_action (String name,  
35 - ($State) -> Bool allow,  
36 - (HTTP_Info http_info,  
37 - List(Web_arg) web_args,  
38 - $State state) -> $State do_it)  
39 -.  
40 -  
41 - This indicate the way of reading text.  
42 -public type Reading_Way:  
43 - ltr, //the text is readable from "Left To Right" like english  
44 - rtl //the text is readable from "Right To Left" like arabic  
45 -.  
46 -  
47 -public type CSS_File_Media:  
48 - screen, //Intended for non-paged computer screens.  
49 - tty, //Intended for media using a fixed-pitch character grid, such as teletypes, terminals, or portable devices with limited display capabilities.  
50 - tv, //Intended for television-type devices (low resolution, color, limited scrollability).  
51 - projection, //Intended for projectors.  
52 - handheld, //Intended for handheld devices (small screen, monochrome, bitmapped graphics, limited bandwidth).  
53 - print, //Intended for paged, opaque material and for documents viewed on screen in print preview mode.  
54 - braille, //Intended for braille tactile feedback devices.  
55 - aural, //Intended for speech synthesizers.  
56 - all. //Suitable for all devices.  
57 -  
58 -public type HtmlEvents:  
59 - // Window Event Attributes  
60 - onafterprint, //HTML5 Script to be run after the document is printed  
61 - onbeforeprint, //HTML5 Script to be run before the document is printed  
62 - onbeforeunload, //HTML5 Script to be run when the document is about to be unloaded  
63 - onerror, //HTML5 Script to be run when an error occurs  
64 - onhashchange, //HTML5 Script to be run when there has been changes to the anchor part of the a URL  
65 - onload, // Fires after the page is finished loading  
66 - onmessage, //HTML5 Script to be run when the message is triggered  
67 - onoffline, //HTML5 Script to be run when the browser starts to work offline  
68 - ononline, //HTML5 Script to be run when the browser starts to work online  
69 - onpagehide, //HTML5 Script to be run when a user navigates away from a page  
70 - onpageshow, //HTML5 Script to be run when a user navigates to a page  
71 - onpopstate, //HTML5 Script to be run when the window's history changes  
72 - onresize, //HTML5 Fires when the browser window is resized  
73 - onstorage, //HTML5 Script to be run when a Web Storage area is updated  
74 - onunload, // Fires once a page has unloaded (or the browser window has been closed)  
75 - // Form element events  
76 - onblur, // Fires the moment that the element loses focus  
77 - onchange, // Fires the moment when the value of the element is changed  
78 - oncontextmenu, //HTML5 Script to be run when a context menu is triggered  
79 - onfocus, // Fires the moment when the element gets focus  
80 - oninput, //HTML5 Script to be run when an element gets user input  
81 - oninvalid, //HTML5 Script to be run when an element is invalid  
82 - onreset, // Fires when the Reset button in a form is clicked  
83 - onsearch, // Fires when the user writes something in a search field (for <input="search">)  
84 - onselect, // Fires after some text has been selected in an element  
85 - onsubmit, // Fires when a form is submitted  
86 - // Keyboard events (Not valid in base, bdo, br, frame, frameset, head, html, iframe, meta, param, script, style, and title elements.)  
87 - onkeydown, // Fires when a user is pressing a key  
88 - onkeypress, // Fires when a user presses a key  
89 - onkeyup, // Fires when a user releases a key  
90 - // Mouse events (Not valid in base, bdo, br, frame, frameset, head, html, iframe, meta, param, script, style, and title elements.)  
91 - onclick, // Fires on a mouse click on the element  
92 - ondblclick, // Fires on a mouse double-click on the element  
93 - onmousedown, // Fires when a mouse button is pressed down on an element  
94 - onmousemove, // Fires when the mouse pointer is moving while it is over an element  
95 - onmouseout, // Fires when the mouse pointer moves out of an element  
96 - onmouseover, // Fires when the mouse pointer moves over an element  
97 - onmouseup, // Fires when a mouse button is released over an element  
98 - onwheel, //HTML5 Fires when the mouse wheel rolls up or down over an element  
99 - //Drag Events  
100 - ondrag, //HMTL5 Script to be run when an element is dragged  
101 - ondragend, //HTML5 Script to be run at the end of a drag operation  
102 - ondragenter, //HTML5 Script to be run when an element has been dragged to a valid drop target  
103 - ondragleave, //HTML5 Script to be run when an element leaves a valid drop target  
104 - ondragover, //HTML5 Script to be run when an element is being dragged over a valid drop target  
105 - ondragstart, //HTML5 Script to be run at the start of a drag operation  
106 - ondrop, //HTML5 Script to be run when dragged element is being dropped  
107 - onscroll, //HTML5 Script to be run when an element's scrollbar is being scrolled  
108 - //Clipboard Events  
109 - oncopy, //HTML5 Fires when the user copies the content of an element  
110 - oncut, //HTML5 Fires when the user cuts the content of an element  
111 - onpaste, //HTML5 Fires when the user pastes some content in an element  
112 - //Media Events  
113 - onabort, //HTML5 Script to be run on abort  
114 - oncanplay, //HTML5 Script to be run when a file is ready to start playing (when it has buffered enough to begin)  
115 - oncanplaythrough, //HTML5 Script to be run when a file can be played all the way to the end without pausing for buffering  
116 - oncuechange, //HTML5 Script to be run when the cue changes in a <track> element  
117 - ondurationchange, //HTML5 Script to be run when the length of the media changes  
118 - onemptied, //HTML5 Script to be run when something bad happens and the file is suddenly unavailable (like unexpectedly disconnects)  
119 - onended, //HTML5 Script to be run when the media has reach the end (a useful event for messages like "thanks for listening")  
120 - onerror, //HTML5 Script to be run when an error occurs when the file is being loaded  
121 - onloadeddata, //HTML5 Script to be run when media data is loaded  
122 - onloadedmetadata, //HTML5 Script to be run when meta data (like dimensions and duration) are loaded  
123 - onloadstart, //HTML5 Script to be run just as the file begins to load before anything is actually loaded  
124 - onpause, //HTML5 Script to be run when the media is paused either by the user or programmatically  
125 - onplay, //HTML5 Script to be run when the media is ready to start playing  
126 - onplaying, //HTML5 Script to be run when the media actually has started playing  
127 - onprogress, //HTML5 Script to be run when the browser is in the process of getting the media data  
128 - onratechange, //HTML5 Script to be run each time the playback rate changes (like when a user switches to a slow motion or fast forward mode)  
129 - onseeked, //HTML5 Script to be run when the seeking attribute is set to false indicating that seeking has ended  
130 - onseeking, //HTML5 Script to be run when the seeking attribute is set to true indicating that seeking is active  
131 - onstalled, //HTML5 Script to be run when the browser is unable to fetch the media data for whatever reason  
132 - onsuspend, //HTML5 Script to be run when fetching the media data is stopped before it is completely loaded for whatever reason  
133 - ontimeupdate, //HTML5 Script to be run when the playing position has changed (like when the user fast forwards to a different point in the media)  
134 - onvolumechange, //HTML5 Script to be run each time the volume is changed which (includes setting the volume to "mute")  
135 - onwaiting, //HTML5 Script to be run when the media has paused but is expected to resume (like when the media pauses to buffer more data)  
136 - //Misc Events  
137 - onshow, //HTML5 Fires when a <menu> element is shown as a context menu  
138 - ontoggle. //HTML5 Fires when the user opens or closes the <details> element  
139 -  
140 -public define String  
141 - to_String  
142 - (  
143 - HtmlEvents e  
144 - ) =  
145 - if e is  
146 - {  
147 - onafterprint then "onafterprint", //HTML5 Script to be run after the document is printed  
148 - onbeforeprint then "onbeforeprint", //HTML5 Script to be run before the document is printed  
149 - onbeforeunload then "onbeforeunload", //HTML5 Script to be run when the document is about to be unloaded  
150 - onerror then "onerror", //HTML5 Script to be run when an error occurs  
151 - onhashchange then "onhashchange", //HTML5 Script to be run when there has been changes to the anchor part of the a URL  
152 - onload then "onload", // Fires after the page is finished loading  
153 - onmessage then "onmessage", //HTML5 Script to be run when the message is triggered  
154 - onoffline then "onoffline", //HTML5 Script to be run when the browser starts to work offline  
155 - ononline then "ononline", //HTML5 Script to be run when the browser starts to work online  
156 - onpagehide then "onpagehide", //HTML5 Script to be run when a user navigates away from a page  
157 - onpageshow then "onpageshow", //HTML5 Script to be run when a user navigates to a page  
158 - onpopstate then "onpopstate", //HTML5 Script to be run when the window's history changes  
159 - onresize then "onresize", //HTML5 Fires when the browser window is resized  
160 - onstorage then "onstorage", //HTML5 Script to be run when a Web Storage area is updated  
161 - onunload then "onunload", // Fires once a page has unloaded (or the browser window has been closed)  
162 - // Form element events  
163 - onblur then "onblur", // Fires the moment that the element loses focus  
164 - onchange then "onchange", // Fires the moment when the value of the element is changed  
165 - oncontextmenu then "oncontextmenu", //HTML5 Script to be run when a context menu is triggered  
166 - onfocus then "onfocus", // Fires the moment when the element gets focus  
167 - oninput then "oninput", //HTML5 Script to be run when an element gets user input  
168 - oninvalid then "oninvalid", //HTML5 Script to be run when an element is invalid  
169 - onreset then "onreset", // Fires when the Reset button in a form is clicked  
170 - onsearch then "onsearch", // Fires when the user writes something in a search field (for <input="search">)  
171 - onselect then "onselect", // Fires after some text has been selected in an element  
172 - onsubmit then "onsubmit", // Fires when a form is submitted  
173 - // Keyboard events (Not valid in base, bdo, br, frame, frameset, head, html, iframe, meta, param, script, style, and title elements.)  
174 - onkeydown then "onkeydown", // Fires when a user is pressing a key  
175 - onkeypress then "onkeypress", // Fires when a user presses a key  
176 - onkeyup then "onkeyup", // Fires when a user releases a key  
177 - // Mouse events (Not valid in base, bdo, br, frame, frameset, head, html, iframe, meta, param, script, style, and title elements.)  
178 - onclick then "onclick", // Fires on a mouse click on the element  
179 - ondblclick then "ondblclick", // Fires on a mouse double-click on the element  
180 - onmousedown then "onmousedown", // Fires when a mouse button is pressed down on an element  
181 - onmousemove then "onmousemove", // Fires when the mouse pointer is moving while it is over an element  
182 - onmouseout then "onmouseout", // Fires when the mouse pointer moves out of an element  
183 - onmouseover then "onmouseover", // Fires when the mouse pointer moves over an element  
184 - onmouseup then "onmouseup", // Fires when a mouse button is released over an element  
185 - onwheel then "onwheel", //HTML5 Fires when the mouse wheel rolls up or down over an element  
186 - //Drag Events  
187 - ondrag then "ondrag", //HMTL5 Script to be run when an element is dragged  
188 - ondragend then "ondragend", //HTML5 Script to be run at the end of a drag operation  
189 - ondragenter then "ondragenter", //HTML5 Script to be run when an element has been dragged to a valid drop target  
190 - ondragleave then "ondragleave", //HTML5 Script to be run when an element leaves a valid drop target  
191 - ondragover then "ondragover", //HTML5 Script to be run when an element is being dragged over a valid drop target  
192 - ondragstart then "ondragstart", //HTML5 Script to be run at the start of a drag operation  
193 - ondrop then "ondrop", //HTML5 Script to be run when dragged element is being dropped  
194 - onscroll then "onscroll", //HTML5 Script to be run when an element's scrollbar is being scrolled  
195 - //Clipboard Events  
196 - oncopy then "oncopy", //HTML5 Fires when the user copies the content of an element  
197 - oncut then "oncut", //HTML5 Fires when the user cuts the content of an element  
198 - onpaste then "onpaste", //HTML5 Fires when the user pastes some content in an element  
199 - //Media Events  
200 - onabort then "onabort", //HTML5 Script to be run on abort  
201 - oncanplay then "oncanplay", //HTML5 Script to be run when a file is ready to start playing (when it has buffered enough to begin)  
202 - oncanplaythrough then "oncanplaythrough", //HTML5 Script to be run when a file can be played all the way to the end without pausing for buffering  
203 - oncuechange then "oncuechange", //HTML5 Script to be run when the cue changes in a <track> element  
204 - ondurationchange then "ondurationchange", //HTML5 Script to be run when the length of the media changes  
205 - onemptied then "onemptied", //HTML5 Script to be run when something bad happens and the file is suddenly unavailable (like unexpectedly disconnects)  
206 - onended then "onended", //HTML5 Script to be run when the media has reach the end (a useful event for messages like "thanks for listening")  
207 - onerror then "onerror", //HTML5 Script to be run when an error occurs when the file is being loaded  
208 - onloadeddata then "onloadeddata", //HTML5 Script to be run when media data is loaded  
209 - onloadedmetadata then "onloadedmetadata", //HTML5 Script to be run when meta data (like dimensions and duration) are loaded  
210 - onloadstart then "onloadstart", //HTML5 Script to be run just as the file begins to load before anything is actually loaded  
211 - onpause then "onpause", //HTML5 Script to be run when the media is paused either by the user or programmatically  
212 - onplay then "onplay", //HTML5 Script to be run when the media is ready to start playing  
213 - onplaying then "onplaying", //HTML5 Script to be run when the media actually has started playing  
214 - onprogress then "onprogress", //HTML5 Script to be run when the browser is in the process of getting the media data  
215 - onratechange then "onratechange", //HTML5 Script to be run each time the playback rate changes (like when a user switches to a slow motion or fast forward mode)  
216 - onseeked then "onseeked", //HTML5 Script to be run when the seeking attribute is set to false indicating that seeking has ended  
217 - onseeking then "onseeking", //HTML5 Script to be run when the seeking attribute is set to true indicating that seeking is active  
218 - onstalled then "onstalled", //HTML5 Script to be run when the browser is unable to fetch the media data for whatever reason  
219 - onsuspend then "onsuspend", //HTML5 Script to be run when fetching the media data is stopped before it is completely loaded for whatever reason  
220 - ontimeupdate then "ontimeupdate", //HTML5 Script to be run when the playing position has changed (like when the user fast forwards to a different point in the media)  
221 - onvolumechange then "onvolumechange", //HTML5 Script to be run each time the volume is changed which (includes setting the volume to "mute")  
222 - onwaiting then "onwaiting", //HTML5 Script to be run when the media has paused but is expected to resume (like when the media pauses to buffer more data)  
223 - //Misc Events  
224 - onshow then "onshow", //HTML5 Fires when a <menu> element is shown as a context menu  
225 - ontoggle then "ontoggle"  
226 - }.  
227 -  
228 -public type Cross_origin:  
229 - anonymous,  
230 - use_credentials  
231 -.  
232 -  
233 -public define String  
234 - to_String  
235 - (  
236 - Cross_origin c_origin  
237 - )=  
238 - if c_origin is  
239 - {  
240 - anonymous then "anonymous",  
241 - use_credentials then "use-credentials"  
242 - }  
243 -.  
244 -  
245 -public type Referrer_policy:  
246 - no_referrer,  
247 - no_referrer_when_downgrade,  
248 - origin,  
249 - origin_when_cross_origin,  
250 - unsafe_url  
251 -.  
252 -  
253 -public define String  
254 - to_String  
255 - (  
256 - Referrer_policy r_policy  
257 - )=  
258 - if r_policy is  
259 - {  
260 - no_referrer then "no-referrer",  
261 - no_referrer_when_downgrade then "no-referrer-when-downgrade",  
262 - origin then "origin",  
263 - origin_when_cross_origin then "origin-when-cross-origin",  
264 - unsafe_url then "unsafe-url"  
265 - }  
266 -.  
267 -  
268 -public type CSS_File:  
269 - css_file(String file_name, CSS_File_Media).  
270 -  
271 -public type JS_Attribute:  
272 - async,  
273 - crossorigin(Cross_origin), //Specifies how the element handles cross-origin requests  
274 - defer, //Specifies the location of the linked document  
275 - integrity(String),  
276 - nomodule(Bool),  
277 - referrerpolicy(Referrer_policy), //Specifies which referrer to use when fetching the resource  
278 -// src(String), //Specifies on what device the linked document will be displayed  
279 - type(String),  
280 - attr(String, String).  
281 -  
282 -public define String  
283 - to_String  
284 - (  
285 - JS_Attribute attr  
286 - )=  
287 - if attr is  
288 - {  
289 - async then "async",  
290 - crossorigin(c_org) then "crossorigin=\""+to_String(c_org)+"\"", //Specifies how the element handles cross-origin requests  
291 - defer then "defer", //Specifies the location of the linked document  
292 - integrity(filehash) then "integrity=\""+filehash+"\"",  
293 - nomodule(value) then "nomodule=\""+if value then "True\"" else "False\"",  
294 - referrerpolicy(r_pol) then "referrerpolicy=\""+ to_String(r_pol)+ "\"", //Specifies which referrer to use when fetching the resource  
295 - //src(url) then "src=\""+url+"\"", //Specifies on what device the linked document will be displayed  
296 - type(_type) then "type=\""+_type+"\"",  
297 - attr(key, value) then key+"=\""+value+"\""  
298 - }  
299 -.  
300 -  
301 -public type JS_File:  
302 - js_file(String file_name,  
303 - List(JS_Attribute) attributes).  
304 -  
305 -public type Script:  
306 - script( String script_type,  
307 - String content).  
308 -  
309 -public define JS_File js_file(String file_name) = js_file(file_name, []).  
310 -public define CSS_File css_file(String file_name)= css_file(file_name, all).  
311 -  
312 -public type CoreAttrs:...  
313 -public type HTML_Partial_Content:...  
314 -public type HTML_Body:...  
315 -public type HTML_Off_Form:...  
316 -public type HTML_tooltip:...  
317 -public type HTTP_Answer:...  
318 -  
319 -  
320 -public type Text_Option:  
321 - core_attrs(List(CoreAttrs)),  
322 - size(Int), // size of character font to use  
323 - font(String), // name of character font to use (such as "helvetica",...)  
324 - color(RGB), // color to be used for characters  
325 - italic,  
326 - oblique,  
327 - small_capitals,  
328 - bold,  
329 - underlined,  
330 - left_justified,  
331 - right_justified,  
332 - justified, // justified on both sides  
333 - line_through,  
334 - nowrap,  
335 - class(String), //CSS class  
336 - id(String),  
337 - style(String),  
338 - title(String),  
339 - attr(String, String).  
340 -  
341 -public type CSS_Style:  
342 - text_options(List(Text_Option)).  
343 -  
344 -// Following types are define to prohib any arguments order error  
345 -  
346 -/**  
347 - * String value for 'id' attribut  
348 - */  
349 -public type HTML_Id:  
350 - html_Id(String id).  
351 -  
352 -/**  
353 - * String value for 'class' attribut  
354 - */  
355 -public type HtmlClass:  
356 - htmlClass(String class).  
357 -  
358 -/**  
359 - * Name used in arguments list when form is submitted.  
360 - */  
361 -public type WebArgName:  
362 - wan(String name).  
363 -  
364 -/**  
365 - * Value passed to arguments list when form is submitted (for RadioButton and CheckBox).  
366 - */  
367 -public type WebArgValue:  
368 - wav(String value).  
369 -  
370 -/**  
371 - * Initial value of an input field.  
372 - */  
373 -public type InitialValue:  
374 - init(String value).  
375 -  
376 -public type HTML_Help_Position:  
377 - left,  
378 - right  
379 -.  
380 -  
381 -public type HTML_Help:  
382 - no_help, //no help text available  
383 - tooltip(HTML_tooltip,  
384 - HTML_Help_Position)  
385 -.  
386 -  
387 -public type HTML_Label:  
388 - no_label,  
389 - label(  
390 - String text, //label to show  
391 - HTML_Help help //HTML help (tooltip with ajax call or not)  
392 - )  
393 -.  
394 -  
395 -public type InputAttrs:  
396 - id (String),  
397 - class (String),  
398 - style (String),  
399 - title (String),  
400 - lang (String),  
401 - dir (Reading_Way),  
402 - accesskey (Word8),  
403 - tabindex (Int),  
404 - attr (String, String),  
405 - event (HtmlEvents, String),  
406 - //HTML5  
407 - data (String name, String value).  
408 -  
409 -public type TextAreaOption:  
410 - input_attrs(List(InputAttrs)),  
411 - disabled,  
412 - read_only,  
413 - wrap_lines  
414 -.  
415 -  
416 -public type Actioner_Local_Action:  
417 - close_window.  
418 -  
419 -public type Actioner_Connection:  
420 - same, // use same type of connection as current page  
421 - http, // use non secured connection  
422 - https. // use secured connection  
423 -  
424 -public type Other_Window_Option:  
425 - resizable, // the new window may be resized by the client  
426 - scrollbars, // the new window has scrollbars  
427 - width(Int), // the new window has the specified width  
428 - height(Int). // the new window has the specified height  
429 -  
430 -public type Actioner_Target:  
431 - same,  
432 - same (String label),  
433 - other(String window_name, List(Other_Window_Option)).  
434 -  
435 -public type Actioner_Aspect:  
436 - link (List(Text_Option), String text, Maybe(String) name),// hypertext link  
437 - img_link (List(CoreAttrs),String img_url, String alt_text),  
438 - push_button (List(CoreAttrs),String text),  
439 - button (String url_off, String url_on), // rollover button  
440 - button (String url_off, String url_on, Int w, Int h), // idem with size  
441 - submit (List(CoreAttrs),String text),  
442 - immediate_selector (List(CoreAttrs), String name, Int size, List((List(CoreAttrs),WebArgValue,String)) choices, Maybe(InitialValue) selected, String onchange_fn),  
443 - html (List(CoreAttrs), HTML_Off_Form).  
444 -  
445 -public define Actioner_Aspect html(HTML_Off_Form content) = html([], content).  
446 -  
447 -public type BackgroundOption:  
448 - repeat, // repeat the background in both directions  
449 - repeat_horizontal, // repeat the background only horizontally  
450 - repeat_vertical, // repeat the background only verticall  
451 - no_repeat, // don't repeat the background  
452 - center.  
453 -  
454 -public type Cell_Option:  
455 - core_attrs(List(CoreAttrs)),  
456 - left, // put the content of the cell on the left  
457 - h_center, // center the content of the cell horizontally  
458 - right, // put the content of the cell on the right  
459 - top, // put the content of the cell upwards  
460 - v_center, // center the content of tye cell vertically,  
461 - bottom, // put the content of the cell downwards  
462 - base_line, // align the content vertically according to base lines  
463 - background_color(RGB),  
464 - background_image(String url, BackgroundOption),  
465 - width(Int), // sets a minimal width for the cell  
466 - percentage_width(Int),  
467 - height(Int), // sets a minimal height for the cell  
468 - columns(Int), // lets the cell span over several columns  
469 - rows(Int), // lets the cell span over several rows  
470 - nowrap, // do not allow text wrapping within the cell  
471 - style(String), // in case nothing above is suitable  
472 - class(String class_name).  
473 -  
474 -public type HTML_Cell($T):  
475 - cell(List(Cell_Option) options, $T content).  
476 -  
477 -public type HTML_Footer_Row($T):  
478 - empty,  
479 - footer_row(List(Cell_Option) options, List(HTML_Cell($T)) cells).  
480 -  
481 -public type HTML_Row($T):  
482 - empty,  
483 - row(List(Cell_Option) options, List(HTML_Cell($T)) cells).  
484 -  
485 -public type HTML_Header_Cell($T):  
486 - header_cell(List(Cell_Option) options, $T content).  
487 -  
488 -public type HTML_Header_Row($T):  
489 - empty,  
490 - header_row(List(Cell_Option) options, List(HTML_Header_Cell($T)) cells).  
491 -  
492 -  
493 -public type Table_Option:  
494 - core_attrs(List(CoreAttrs)),  
495 - background_color(RGB), // applied to all cells in the table  
496 - background_image(String url),  
497 - border(Int width_of_outer_edge, // if not present, all values are 0  
498 - Int width_of_top_of_relief,  
499 - Int width_of_inner_edge,  
500 - RGB border_color),  
501 - width(Int), // sets a minimal width for the table  
502 - percentage_width(Int),  
503 - attr(String name, String value),  
504 - class(String class_name).  
505 -  
506 -  
507 -public type HTML_In_Form:  
508 - empty,  
509 - literal_pt (Printable_tree),  
510 - literal (String),  
511 - sequence (List(HTML_In_Form) items),  
512 - text (List(CoreAttrs), String the_text),  
513 - preformated (List(Text_Option), String),  
514 - paragraph (List(Text_Option), List(HTML_In_Form) content),  
515 - image (List(CoreAttrs), String url, String alternate),  
516 - image (List(CoreAttrs), String url, String alternate, Int width, Int height),  
517 - table (List(Table_Option), HTML_Header_Row(HTML_In_Form), List(HTML_Row(HTML_In_Form)), HTML_Footer_Row(HTML_In_Form)),  
518 - center (HTML_In_Form),  
519 - mail_to (String email, HTML_In_Form element),  
520 - scroller (Int width, Int height,  
521 - Int content_width, Int content_height,  
522 - HTML_In_Form content),  
523 - actioner (Actioner_Connection, Actioner_Target, Actioner_Aspect,  
524 - WEB_Action_Name action_name, List((String,String)) extra_ops,  
525 - List(Actioner_Local_Action)),  
526 - foreign_link_new (Actioner_Target, Actioner_Aspect, String url),  
527 - foreign_link (List(Text_Option), String url),  
528 - foreign_link (List(Text_Option), String url, String name),  
529 - private_download (String abs_path, String name, String extra_ext,  
530 - Maybe((String,List((String,String)))) action),  
531 - text_input (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, InitialValue init, Int width),  
532 - text_input_ro (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, InitialValue init, Int width),  
533 - password_input (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, InitialValue init, Int width),  
534 - text_area (List(TextAreaOption), HTML_Label label, HTML_Id id, WebArgName name, InitialValue init, Int width, Int height),  
535 - file_upload (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, Int width),  
536 - selector (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, Int size, List(String) choices),  
537 - selector (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, Int size, List(String) choices, InitialValue selected),  
538 - // List((String,String)) = List((code,name)) where :  
539 - // code is the web-arg value  
540 - // name appears in selector  
541 - selector_c (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, Int size, List((List(CoreAttrs),WebArgValue,String)) choices),  
542 - selector_c (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, Int size, List((List(CoreAttrs),WebArgValue,String)) choices, InitialValue selected),  
543 - radio_button (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, WebArgValue value, Bool checked),  
544 - radio_button_r (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, WebArgValue value, Bool checked),  
545 - check_box (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, Bool checked),  
546 - check_box_r (List(CoreAttrs), HTML_Label label, HTML_Id id, WebArgName name, Bool checked),  
547 - div (List(CoreAttrs), List(HTML_In_Form) content),  
548 - div_empty (List(CoreAttrs)),  
549 - hidden (HTML_Id id, WebArgName name, WebArgValue value),  
550 - partial (HTML_Partial_Content),  
551 - br,  
552 - progress (List(CoreAttrs), Int value, Int max),  
553 - ol (List(CoreAttrs), List(HTML_In_Form) content),  
554 - ul (List(CoreAttrs), List(HTML_In_Form) content),  
555 - li (List(CoreAttrs), List(HTML_In_Form) content),  
556 - button (List(CoreAttrs), List(HTML_In_Form) content),  
557 - i (List(CoreAttrs), String text),  
558 - span (List(CoreAttrs), String text),  
559 - hr (List(CoreAttrs))  
560 -.  
561 -  
562 -public type HTML_Size:  
563 - absolute(Int), // in pixels  
564 - percentage(Int).  
565 -  
566 -public type A_href:  
567 - href(String href),  
568 - href(WEB_Action_Name action, List((String,String)) extra_ops)  
569 -.  
570 -  
571 -public define A_href  
572 - href  
573 - (  
574 - WEB_Action_Name action,  
575 - (String,String) extra_ops  
576 - )=  
577 - href(action, [extra_ops])  
578 -.  
579 -  
580 -public type A_target:  
581 - _blank,  
582 - _self,  
583 - _parent,  
584 - _top,  
585 - framename(String name)  
586 -.  
587 -  
588 -  
589 -public type HTML_Off_Form:  
590 - a (List(CoreAttrs), A_href, A_target, List(HTML_Off_Form) content),  
591 - empty,  
592 - literal_pt (Printable_tree),  
593 - literal (String),  
594 - sequence (List(HTML_Off_Form) items),  
595 - text (List(CoreAttrs), String the_text),  
596 -  
597 - //table (List(Table_Option), HTML_Header_Row(HTML_Off_Form), List(HTML_Row(HTML_Off_Form)), HTML_Footer_Row(HTML_Off_Form)),  
598 -  
599 - actioner (Actioner_Connection, Actioner_Target, Actioner_Aspect,  
600 - WEB_Action_Name action_name, List((String,String)) extra_ops,  
601 - List(Actioner_Local_Action)),  
602 - actioner (Actioner_Connection, Actioner_Target, Actioner_Aspect,  
603 - WEB_Action_Name action_name, List((String,String)) extra_ops,  
604 - List(Actioner_Local_Action), String form_name),  
605 - foreign_link_new (Actioner_Target, Actioner_Aspect, String url),  
606 - //foreign_link (List(Text_Option), String url),  
607 - foreign_link (List(Text_Option), String url, String name),  
608 - private_download (String abs_path, String name, String extra_ext,  
609 - Maybe((String,List((String,String)))) action),  
610 - //label (String name),  
611 - //form (HTML_Id form_id, List(CoreAttrs), List(HTML_In_Form) content),  
612 -// form (HTML_Id form_id, List(CoreAttrs),  
613 -// WEB_Action_Name action, List((String,String)) extra_ops,  
614 -// List(HTML_In_Form) content),  
615 - //in_form (HTML_Id form_id, HTML_In_Form content),  
616 - div (List(CoreAttrs), List(HTML_Partial_Content) p_content),  
617 - iframe (List(CoreAttrs),  
618 - List(CSS_Style) /*styles*/,  
619 - List(CSS_File) /*css_files*/,  
620 - List(JS_File) /*js_files*/,  
621 - HTML_Body /*body*/),  
622 - partial (HTML_Partial_Content),  
623 - //progress (List(CoreAttrs), Int value, Int max),  
624 - //i (List(CoreAttrs), String text),  
625 - html_tag (String tag_name, List(CoreAttrs), List(HTML_Off_Form) content),  
626 - html_void_tag (String tag_name, List(CoreAttrs))  
627 -.  
628 -  
629 -  
630 -public type Rel_attr:  
631 - alternate,  
632 - author,  
633 - dns_prefetch,  
634 - help,  
635 - icon,  
636 - license,  
637 - next,  
638 - pingback,  
639 - preconnect,  
640 - prefetch,  
641 - preload,  
642 - prerender,  
643 - prev,  
644 - search,  
645 - stylesheet  
646 -.  
647 -  
648 -public define String  
649 - to_String  
650 - (  
651 - Rel_attr r_attr  
652 - )=  
653 - if r_attr is  
654 - {  
655 - alternate then "alternate",  
656 - author then "author",  
657 - dns_prefetch then "dns_prefetch",  
658 - help then "help",  
659 - icon then "icon",  
660 - license then "license",  
661 - next then "next",  
662 - pingback then "pingback",  
663 - preconnect then "preconnect",  
664 - prefetch then "prefetch",  
665 - preload then "preload",  
666 - prerender then "prerender",  
667 - prev then "prev",  
668 - search then "search",  
669 - stylesheet then "stylesheet"  
670 - }  
671 -.  
672 -  
673 -public type Link_attr:  
674 - crossorigin(Cross_origin), //Specifies how the element handles cross-origin requests  
675 - href(String), //Specifies the location of the linked document  
676 - media(String), //Specifies on what device the linked document will be displayed  
677 - referrerpolicy(Referrer_policy), //Specifies which referrer to use when fetching the resource  
678 - rel(Rel_attr),  
679 - sizes(String),  
680 - type(String),  
681 - as(String),  
682 - integrity(String),  
683 - event(HtmlEvents, String)  
684 -.  
685 -  
686 -public define String  
687 - to_String  
688 - (  
689 - Link_attr attr  
690 - )=  
691 - if attr is  
692 - {  
693 - crossorigin(c_origin) then "crossorigin=\""+to_String(c_origin)+"\"",  
694 - href(url) then "href=\""+url+"\"",  
695 - media(media) then "media=\""+media+"\"",  
696 - referrerpolicy(r_policy) then "referrerpolicy=\""+to_String(r_policy)+"\"",  
697 - rel(rel_attr) then "rel=\""+to_String(rel_attr)+"\"",  
698 - sizes(_sizes) then "sizes=\""+_sizes+"\"",  
699 - type(_type) then "type=\""+_type+"\"",  
700 - as(_as) then "as=\""+_as+"\"",  
701 - integrity(_integrity) then "integrity=\""+_integrity+"\"",  
702 - event(_event, code) then to_String(_event)+"=\""+code+"\"",  
703 - }  
704 -.  
705 -  
706 -public define String  
707 - to_String  
708 - (  
709 - List(Link_attr) attrs  
710 - )=  
711 - join(" ", map((Link_attr attr) |->  
712 - to_String(attr),  
713 - attrs))  
714 -.  
715 -  
716 -  
717 -  
718 -public type HTML_Meta:  
719 - keywords (List(String)),  
720 - refresh (Actioner_Connection connection,  
721 - Actioner_Target target,  
722 - WEB_Action_Name action,  
723 - Int delay), // in seconds  
724 - refresh (String url, Int delay), // in seconds  
725 - meta (String name, String content),  
726 - http_equiv (String name, String content),  
727 - generic_meta (List((String,String))),  
728 - literal (String).  
729 -  
730 -public type HTML_Head_Tag:  
731 - meta(HTML_Meta),  
732 - title(String),  
733 - js(JS_File),  
734 - js_inline(Script),  
735 - css(CSS_File),  
736 - css_inline(String css_styles), /* Note: <style> and </style> tags are not necessaries */  
737 - link(List(Link_attr) link_attrs)  
738 -.  
739 -  
740 -public type HTML_Partial_Content:  
741 - partial_content  
742 - (  
743 - List(HTML_Head_Tag),  
744 - HTML_Off_Form  
745 - )  
746 -.  
747 -  
748 -public type HTML_Body:  
749 - body(List(CoreAttrs) attrs, List(HTML_Off_Form) content).  
750 -  
751 -public define HTML_Body  
752 - body  
753 - (  
754 - List(CoreAttrs) attrs,  
755 - HTML_Off_Form content  
756 - )=  
757 - body(attrs, [content])  
758 -.  
759 -  
760 -public define HTML_Body  
761 - body  
762 - (  
763 - CoreAttrs attr,  
764 - HTML_Off_Form content  
765 - )=  
766 - body([attr], [content])  
767 -.  
768 -  
769 -public define HTML_Body  
770 - body  
771 - (  
772 - CoreAttrs attr,  
773 - List(HTML_Off_Form) content  
774 - )=  
775 - body([attr], content)  
776 -.  
777 -  
778 -public define HTML_Body  
779 - body  
780 - (  
781 - HTML_Off_Form content  
782 - )=  
783 - body([], [content])  
784 -.  
785 -  
786 -  
787 -public type HTML_tooltip:  
788 - html_tooltip  
789 - (  
790 - String title,  
791 - String keyword,  
792 - Int width,  
793 - ),  
794 - html_tooltip_ext  
795 - (  
796 - String title,  
797 - String extend_type,  
798 - String class_suffix,  
799 - List((String, String)) ext_args  
800 - ),  
801 - html_tooltip_ext //same without class suffix. This means we use awesome font  
802 - (  
803 - String title,  
804 - String extend_type,  
805 - List((String, String)) ext_args  
806 - ),  
807 - html_tooltip  
808 - (  
809 - String title,  
810 - WEB_Action_Name wan,  
811 - List((String, String)) ext_args  
812 - ).  
813 -  
814 -  
815 -  
816 -public type CoreAttrs:  
817 - empty,  
818 - id (String), //A unique identifier for the element.  
819 - //There must not be multiple elements in a document that have the same id value.  
820 - class (String), //A name of a classification, or list of names of classifications, to which the element belongs  
821 - style (String), //Specifies zero or more CSS declarations that apply to the element [CSS].  
822 - title (String), //Advisory information associated with the element.  
823 - lang (String), //Specifies the primary language for the contents of the element and for any of the element’s attributes that contain text.  
824 - dir (Reading_Way), //Specifies the element’s text directionality.  
825 - accesskey (Word8), //A key label or list of key labels with which to associate the element; each key label represents  
826 - //a keyboard shortcut which UAs can use to activate the element or give focus to the element.  
827 - tabindex (Int), //Specifies whether the element represents an element that is is focusable (that is, an element which is part of the  
828 - //sequence of focusable elements in the document), and the relative order of the element in the sequence of focusable  
829 - //elements in the document.  
830 - //Anubis specific  
831 - attr (String, String), //intended to provide unknown attritute  
832 - bool_attr (Bool, String), //like checked in checkbox the attribute 'checked' is here if true else nothing  
833 - event (HtmlEvents, String),  
834 - tooltip (HTML_tooltip),  
835 -  
836 - //HTML5  
837 - data (String name, String value),  
838 - contenteditable(Bool), //Specifies whether the contents of the element are editable  
839 - contextmenu(String), //Identifies a menu with which to associate the element as a context menu.  
840 - draggable(Bool), //Specifies whether the element is draggable.  
841 - enterkeyhint(String), //Specifies the text of the enter-key on a virtual keyboard  
842 - hidden(Bool), //Specifies that the element represents an element that is not yet, or is no longer, relevant.  
843 - inert, //Specifies that the browser should ignore this section  
844 - inputmode(String), //Specifies the mode of a virtual keyboard  
845 - popover, //Specifies a popover element  
846 - spellcheck(Bool), //Specifies whether the element represents an element whose contents are subject to spell checking and grammar checking.  
847 - translate(Bool) //Specifies whether the content of an element should be translated or not  
848 -.  
849 -  
850 -public define CoreAttrs colspan(Int value) = attr("colspan", to_String(value)).  
851 -public define CoreAttrs rowspan(Int value) = attr("rowspan", to_String(value)).  
852 -public define CoreAttrs headers(String header_id) = attr("headers", header_id).  
853 -public define CoreAttrs width(Int value) = attr("width", to_String(value)).  
854 -public define CoreAttrs height(Int value) = attr("height", to_String(value)).  
855 -public define CoreAttrs width_px(Int value) = attr("width", to_String(value)+"px").  
856 -public define CoreAttrs height_px(Int value) = attr("height", to_String(value)+"px").  
857 -public define CoreAttrs alt(String value) = attr("alt", value).  
858 -public define CoreAttrs size(Int value) = attr("size", to_String(value)).  
859 -  
860 -public define CoreAttrs boolean(String name) = attr(name, name).  
861 -  
862 -public type HTTP_Answer:  
863 - html_page (HTTP_Status /*http_status*/,  
864 - List(HTML_Head_Tag) /*html <head> tags*/,  
865 - HTML_Body /*body*/),  
866 - html_page (HTTP_Status /*http_status*/,  
867 - String /*title*/,  
868 - List(HTML_Head_Tag) /*meta_tags*/,  
869 - List(CSS_Style) /*styles*/,  
870 - List(CSS_File) /*css_files*/,  
871 - List(JS_File) /*js_files*/,  
872 - List(Script) /*script*/,  
873 - HTML_Body /*body*/),  
874 - plain_text (HTTP_Status /*http_status*/,  
875 - String /*text*/),  
876 - custom_text (HTTP_Status /*http_status*/,  
877 - MIME /*mime_type*/,  
878 - String /*content*/),  
879 - custom_binary(HTTP_Status /*http_status*/,  
880 - MIME /*mime_type*/,  
881 - ByteArray /*content*/,  
882 - List(HTTP_header)/*other headers*/),  
883 - custom_tree (HTTP_Status /*http_status*/,  
884 - MIME /*mime_type*/,  
885 - Printable_tree /*content*/),  
886 - json (HTTP_Status, /*http_status*/  
887 - JsonValue), /*json value*/  
888 - send_file ( String file_path, //file to send to client. //TODO add call back for before, during, after send  
889 - Content_Disposition c_disposition),  
890 - http_raw (Printable_tree),  
891 - html_content (HTTP_Status /*http_status*/,  
892 - HTML_Off_Form),  
893 - html_partial_content (HTTP_Status /*http_status*/,  
894 - HTML_Partial_Content)  
895 -.  
896 -  
897 -public define HTTP_Answer  
898 - no_content  
899 - =  
900 - plain_text(http_no_content, "")  
901 -.  
902 -  
903 -