Commit 595bd840f4ebd4ff849223a0f0865870da63d5cf

Authored by totoro
1 parent 160d0690

add encode_HTML_entities function which get an HTML text and encode it into esca…

…ped HTML. This allows to transmit HTML to HTML element i.e. input text area with text in HTML format must be encoded to avoid error.
Showing 1 changed file with 76 additions and 20 deletions   Show diff stats
web/CXM_making_a_web_site.anubis
@@ -67,6 +67,63 @@ transmit CXM_web_action.anubis @@ -67,6 +67,63 @@ transmit CXM_web_action.anubis
67 67
68 transmit calexium_lib/web/types/web_action_name.anubis 68 transmit calexium_lib/web/types/web_action_name.anubis
69 69
  70 +//TODO move anywhere
  71 +
  72 +
  73 +define List(Word8)
  74 +/** Test for HTML entity which must be encoded
  75 + * and return the encoded entity if needed
  76 + */
  77 + get_entity
  78 + (
  79 + Word8 _char,
  80 + List(Word8) tail
  81 + )=
  82 + //test for the ampersand
  83 + if _char = '&' then
  84 + //test if it's already an encoded string like & < etc. In that case we do nothing
  85 + if insensitive_equal(['&','a','m','p',';'], tail, 0) then [_char]
  86 + else if insensitive_equal(['&','l','t',';'], tail, 0) then [_char]
  87 + else if insensitive_equal(['&','g','t',';'], tail, 0) then [_char]
  88 + else if insensitive_equal(['&','q','u','o','t',';'], tail, 0) then [_char]
  89 + else
  90 + [';','p','m','a','&']
  91 + //test for '<' etc.
  92 + else if _char = '<' then [';','t','l','&']
  93 + else if _char = '>' then [';','t','g','&']
  94 + else if _char = '\"' then [';','t','o','u','q','&']
  95 + else [_char]
  96 +.
  97 +
  98 +define String
  99 + _HTML_encode_entities
  100 + (
  101 + List(Word8) source,
  102 + List(Word8) current
  103 + )=
  104 + if source is
  105 + {
  106 + [] then implode(reverse(current)),
  107 + [c . t] then
  108 + _HTML_encode_entities(t, get_entity(c, t) + current)
  109 + }
  110 +.
  111 +
  112 +public define String
  113 + encode_HTML_entities
  114 + (
  115 + String source
  116 + )=
  117 + _HTML_encode_entities(explode(source), [])
  118 +.
  119 +
  120 +//public define String
  121 +// encode_HTML_entities
  122 +// (
  123 +// String source
  124 +// )=
  125 +//.
  126 +
70 //read CXM_html_tooltip.anubis 127 //read CXM_html_tooltip.anubis
71 128
72 * (1) Structure of a web site. 129 * (1) Structure of a web site.
@@ -4293,7 +4350,7 @@ public define Printable_tree @@ -4293,7 +4350,7 @@ public define Printable_tree
4293 [ ] then [ ], 4350 [ ] then [ ],
4294 [h . t] then 4351 [h . t] then
4295 if h is (attrs,val,item) 4352 if h is (attrs,val,item)
4296 - then ["<option value=\""+val.value+"\" "+format_attrs(attrs)+">", item, "</option>\n" . format_choices(t)] 4353 + then ["<option value=\""+encode_HTML_entities(val.value)+"\" "+format_attrs(attrs)+">", item, "</option>\n" . format_choices(t)]
4297 }. 4354 }.
4298 4355
4299 public define Printable_tree 4356 public define Printable_tree
@@ -4308,8 +4365,8 @@ public define Printable_tree @@ -4308,8 +4365,8 @@ public define Printable_tree
4308 [h . t] then 4365 [h . t] then
4309 if h is (attrs,val,item) then 4366 if h is (attrs,val,item) then
4310 if val.value = selected.value 4367 if val.value = selected.value
4311 - then ["<option value=\""+val.value+"\" "+format_attrs(attrs)+" selected=\"selected\">", item, "</option>\n" . format_choices(t)]  
4312 - else ["<option value=\""+val.value+"\" "+format_attrs(attrs)+" >", item, "</option>\n" . format_choices(t,selected)] 4368 + then ["<option value=\""+encode_HTML_entities(val.value)+"\" "+format_attrs(attrs)+" selected=\"selected\">", item, "</option>\n" . format_choices(t)]
  4369 + else ["<option value=\""+encode_HTML_entities(val.value)+"\" "+format_attrs(attrs)+" >", item, "</option>\n" . format_choices(t,selected)]
4313 }. 4370 }.
4314 4371
4315 4372
@@ -4938,9 +4995,9 @@ define Printable_tree @@ -4938,9 +4995,9 @@ define Printable_tree
4938 url(_) then "" 4995 url(_) then ""
4939 }, 4996 },
4940 if action_name = "" then 4997 if action_name = "" then
4941 - ["<input type=\"button\" value=\"",text,"\"", format_attrs(options), " />"] 4998 + ["<input type=\"button\" value=\"",encode_HTML_entities(text),"\"", format_attrs(options), " />"]
4942 else 4999 else
4943 - [s,"<input type=\"button\" value=\"",text,"\"", format_attrs(options), " onclick=\"",h,"\" />"] 5000 + [s,"<input type=\"button\" value=\"",encode_HTML_entities(text),"\"", format_attrs(options), " onclick=\"",h,"\" />"]
4944 } 5001 }
4945 ], 5002 ],
4946 button(url_off,url_on) then 5003 button(url_off,url_on) then
@@ -5779,18 +5836,17 @@ define Printable_tree @@ -5779,18 +5836,17 @@ define Printable_tree
5779 format(cinfo,ic_v,any_foreign_link(options,url,name),format_element,is_https, action_count, head_tags), 5836 format(cinfo,ic_v,any_foreign_link(options,url,name),format_element,is_https, action_count, head_tags),
5780 private_download(url,name,extra,action) then 5837 private_download(url,name,extra,action) then
5781 format(cinfo,ic_v,any_private_download(url,name,extra,action),format_element,is_https, action_count, head_tags), 5838 format(cinfo,ic_v,any_private_download(url,name,extra,action),format_element,is_https, action_count, head_tags),
5782 - text_input(options, label_text, id, name, i, w) then  
5783 - 5839 + text_input(options, label_text, id, name, init, w) then
5784 [ format_label(label_text, id), 5840 [ format_label(label_text, id),
5785 - "<input type=\"text\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",i,"\"",format_attrs([class("in") . options])," />"],  
5786 - text_input_ro(options, label_text, id, name,i,w) then 5841 + "<input type=\"text\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",encode_HTML_entities(init.value),"\"",format_attrs([class("in") . options])," />"],
  5842 + text_input_ro(options, label_text, id, name, init, w) then
5787 [ format_label(label_text, id), 5843 [ format_label(label_text, id),
5788 - "<input readonly=\"readonly\" type=\"text\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",i,"\"",format_attrs([class("in") . options])," />"],  
5789 - password_input(options, label_text, id, name,i,w) then 5844 + "<input readonly=\"readonly\" type=\"text\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",encode_HTML_entities(init.value),"\"",format_attrs([class("in") . options])," />"],
  5845 + password_input(options, label_text, id, name, init, w) then
5790 [ format_label(label_text, id), 5846 [ format_label(label_text, id),
5791 - "<input type=\"password\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",i,"\"",format_attrs([class("in") . options])," />"],  
5792 - text_area(options,label_text, id, n,i,w,h) then  
5793 - [ format_label(label_text, id), "<textarea ",format(options)," id=\"",id,"\" name=\"",n,"\" cols=\"",w,"\" rows=\"",h,"\">",i,"</textarea>"], 5847 + "<input type=\"password\" name=\"",name,"\" id=\"",id,"\" size=\"",w,"\" value=\"",encode_HTML_entities(init.value),"\"",format_attrs([class("in") . options])," />"],
  5848 + text_area(options,label_text, id, n, init, w, h) then
  5849 + [ format_label(label_text, id), "<textarea ",format(options)," id=\"",id,"\" name=\"",n,"\" cols=\"",w,"\" rows=\"",h,"\">",encode_HTML_entities(init.value),"</textarea>"],
5794 file_upload(options, label, id, n, w) then 5850 file_upload(options, label, id, n, w) then
5795 [ format_label(label, id), 5851 [ format_label(label, id),
5796 "<input type=\"file\" id=\"",id,"\" size=\"",w,"\" name=\"",n,"\"",format_attrs([class("in") . options])," />"], 5852 "<input type=\"file\" id=\"",id,"\" size=\"",w,"\" name=\"",n,"\"",format_attrs([class("in") . options])," />"],
@@ -5807,11 +5863,11 @@ define Printable_tree @@ -5807,11 +5863,11 @@ define Printable_tree
5807 [ format_label(label, id), 5863 [ format_label(label, id),
5808 "<select id=\"",id,"\" name=\"",n,"\" size=\"",s,"\" ",format_attrs([class("in") . options]),">",format_choices(cs,sd),"</select>"], 5864 "<select id=\"",id,"\" name=\"",n,"\" size=\"",s,"\" ",format_attrs([class("in") . options]),">",format_choices(cs,sd),"</select>"],
5809 5865
5810 - radio_button(options, label, id, n, v, c) then 5866 + radio_button(options, label, id, n, value, c) then
5811 [ format_label(label, id), 5867 [ format_label(label, id),
5812 - "<input type=\"radio\" name=\"",n,"\" id=\"",id,"\" value=\"",v,"\"",(if c then " checked=\"checked\"" else ""),format_attrs([class("in") . options])," />"],  
5813 - radio_button_r(options, label, id, n, v, c) then  
5814 - [ "<input type=\"radio\" name=\"",n,"\" id=\"",id,"\" value=\"",v,"\"",(if c then " checked=\"checked\"" else ""),format_attrs([class("in") . options])," />", 5868 + "<input type=\"radio\" name=\"",n,"\" id=\"",id,"\" value=\"",value,"\"",(if c then " checked=\"checked\"" else ""),format_attrs([class("in") . options])," />"],
  5869 + radio_button_r(options, label, id, n, value, c) then
  5870 + [ "<input type=\"radio\" name=\"",n,"\" id=\"",id,"\" value=\"",value,"\"",(if c then " checked=\"checked\"" else ""),format_attrs([class("in") . options])," />",
5815 format_label(label, id)], 5871 format_label(label, id)],
5816 check_box(options, label, id, n, c) then 5872 check_box(options, label, id, n, c) then
5817 [ format_label(label, id), 5873 [ format_label(label, id),
@@ -5823,9 +5879,9 @@ define Printable_tree @@ -5823,9 +5879,9 @@ define Printable_tree
5823 format(cinfo,ic_v,any_div(options, e),format_element,is_https, action_count, head_tags), 5879 format(cinfo,ic_v,any_div(options, e),format_element,is_https, action_count, head_tags),
5824 div_empty(options) then 5880 div_empty(options) then
5825 format(cinfo,ic_v,any_div_empty(options),format_element,is_https, action_count, head_tags), 5881 format(cinfo,ic_v,any_div_empty(options),format_element,is_https, action_count, head_tags),
5826 - hidden(_id, name, value) then 5882 + hidden(_id, name, init) then
5827 since _id is html_Id(id), 5883 since _id is html_Id(id),
5828 - ["<input type=\"hidden\"",(if id = "" then "" else " id=\""+id+"\"")," name=\"",name,"\" value=\"",value,"\" />"], 5884 + ["<input type=\"hidden\"",(if id = "" then "" else " id=\""+id+"\"")," name=\"",name,"\" value=\"",encode_HTML_entities(init.value),"\" />"],
5829 partial(p_content) then 5885 partial(p_content) then
5830 if p_content is partial_content(tags, html_elements) then 5886 if p_content is partial_content(tags, html_elements) then
5831 head_tags <- *head_tags + tags; 5887 head_tags <- *head_tags + tags;