OCaml HTML5 parser/serialiser based on Python's JustHTML
1open Content_category
2open Content_model
3
4let form =
5 Element_spec.make ~name:"form"
6 ~categories:[Flow; Palpable]
7 ~content_model:(Except (Categories [Flow], []))
8 ~attrs:[
9 Attr_spec.make "accept-charset" ~datatype:"string" ();
10 Attr_spec.make "action" ~datatype:"url" ();
11 Attr_spec.make "autocomplete" ~datatype:"autocomplete" ();
12 Attr_spec.make "enctype" ~datatype:"encoding" ();
13 Attr_spec.make "method" ~datatype:"method" ();
14 Attr_spec.make "name" ~datatype:"string" ();
15 Attr_spec.make "novalidate" ~datatype:"boolean" ();
16 Attr_spec.make "target" ~datatype:"target" ();
17 Attr_spec.make "rel" ~datatype:"relationship" ();
18 ]
19 ~prohibited_ancestors:["form"]
20 ()
21
22let label =
23 Element_spec.make ~name:"label"
24 ~categories:[Flow; Phrasing; Interactive; Palpable]
25 ~content_model:(Categories [Phrasing])
26 ~attrs:[
27 Attr_spec.make "for" ~datatype:"idref" ();
28 ]
29 ()
30
31let input =
32 Element_spec.make ~name:"input"
33 ~void:true
34 ~categories:[Flow; Phrasing; Interactive; Palpable]
35 ~content_model:Nothing
36 ~attrs:[
37 Attr_spec.make "accept" ~datatype:"string" ();
38 Attr_spec.make "alt" ~datatype:"string" ();
39 Attr_spec.make "autocomplete" ~datatype:"autocomplete" ();
40 Attr_spec.make "checked" ~datatype:"boolean" ();
41 Attr_spec.make "dirname" ~datatype:"directionality" ();
42 Attr_spec.make "disabled" ~datatype:"boolean" ();
43 Attr_spec.make "form" ~datatype:"idref" ();
44 Attr_spec.make "formaction" ~datatype:"url" ();
45 Attr_spec.make "formenctype" ~datatype:"encoding" ();
46 Attr_spec.make "formmethod" ~datatype:"method" ();
47 Attr_spec.make "formnovalidate" ~datatype:"boolean" ();
48 Attr_spec.make "formtarget" ~datatype:"target" ();
49 Attr_spec.make "height" ~datatype:"integer" ();
50 Attr_spec.make "list" ~datatype:"idref" ();
51 Attr_spec.make "max" ~datatype:"string" ();
52 Attr_spec.make "maxlength" ~datatype:"integer" ();
53 Attr_spec.make "min" ~datatype:"string" ();
54 Attr_spec.make "minlength" ~datatype:"integer" ();
55 Attr_spec.make "multiple" ~datatype:"boolean" ();
56 Attr_spec.make "name" ~datatype:"string" ();
57 Attr_spec.make "pattern" ~datatype:"string" ();
58 Attr_spec.make "placeholder" ~datatype:"string" ();
59 Attr_spec.make "popovertarget" ~datatype:"string" ();
60 Attr_spec.make "popovertargetaction" ~datatype:"popovertargetaction" ();
61 Attr_spec.make "readonly" ~datatype:"boolean" ();
62 Attr_spec.make "required" ~datatype:"boolean" ();
63 Attr_spec.make "size" ~datatype:"integer" ();
64 Attr_spec.make "src" ~datatype:"url" ();
65 Attr_spec.make "step" ~datatype:"string" ();
66 Attr_spec.make "type" ~enum_values:[
67 "hidden"; "text"; "search"; "tel"; "url"; "email"; "password";
68 "date"; "month"; "week"; "time"; "datetime-local"; "number";
69 "range"; "color"; "checkbox"; "radio"; "file"; "submit"; "image";
70 "reset"; "button"
71 ] ();
72 Attr_spec.make "value" ~datatype:"string" ();
73 Attr_spec.make "width" ~datatype:"integer" ();
74 ]
75 ()
76
77let button =
78 Element_spec.make ~name:"button"
79 ~categories:[Flow; Phrasing; Interactive; Palpable]
80 ~content_model:(Except (Categories [Phrasing], [Interactive]))
81 ~attrs:[
82 Attr_spec.make "disabled" ~datatype:"boolean" ();
83 Attr_spec.make "form" ~datatype:"idref" ();
84 Attr_spec.make "formaction" ~datatype:"url" ();
85 Attr_spec.make "formenctype" ~datatype:"encoding" ();
86 Attr_spec.make "formmethod" ~datatype:"method" ();
87 Attr_spec.make "formnovalidate" ~datatype:"boolean" ();
88 Attr_spec.make "formtarget" ~datatype:"target" ();
89 Attr_spec.make "name" ~datatype:"string" ();
90 Attr_spec.make "popovertarget" ~datatype:"string" ();
91 Attr_spec.make "popovertargetaction" ~datatype:"popovertargetaction" ();
92 Attr_spec.make "type" ~enum_values:["submit"; "reset"; "button"] ();
93 Attr_spec.make "value" ~datatype:"string" ();
94 ]
95 ()
96
97let select =
98 Element_spec.make ~name:"select"
99 ~categories:[Flow; Phrasing; Interactive; Palpable]
100 ~content_model:(Elements ["option"; "optgroup"; "script"; "template"])
101 ~attrs:[
102 Attr_spec.make "autocomplete" ~datatype:"autocomplete" ();
103 Attr_spec.make "disabled" ~datatype:"boolean" ();
104 Attr_spec.make "form" ~datatype:"idref" ();
105 Attr_spec.make "multiple" ~datatype:"boolean" ();
106 Attr_spec.make "name" ~datatype:"string" ();
107 Attr_spec.make "required" ~datatype:"boolean" ();
108 Attr_spec.make "size" ~datatype:"integer" ();
109 ]
110 ~implicit_aria_role:"combobox"
111 ()
112
113let datalist =
114 Element_spec.make ~name:"datalist"
115 ~categories:[Flow; Phrasing]
116 ~content_model:(Choice [
117 Categories [Phrasing];
118 Elements ["option"; "script"; "template"]
119 ])
120 ~implicit_aria_role:"listbox"
121 ()
122
123let optgroup =
124 Element_spec.make ~name:"optgroup"
125 ~categories:[]
126 ~content_model:(Elements ["option"; "script"; "template"])
127 ~attrs:[
128 Attr_spec.make "disabled" ~datatype:"boolean" ();
129 Attr_spec.make "label" ~required:true ~datatype:"string" ();
130 ]
131 ~permitted_parents:["select"]
132 ~implicit_aria_role:"group"
133 ()
134
135let option =
136 Element_spec.make ~name:"option"
137 ~categories:[]
138 ~content_model:Text
139 ~attrs:[
140 Attr_spec.make "disabled" ~datatype:"boolean" ();
141 Attr_spec.make "label" ~datatype:"string" ();
142 Attr_spec.make "selected" ~datatype:"boolean" ();
143 Attr_spec.make "value" ~datatype:"string" ();
144 ]
145 ~permitted_parents:["select"; "datalist"; "optgroup"]
146 ~implicit_aria_role:"option"
147 ()
148
149let textarea =
150 Element_spec.make ~name:"textarea"
151 ~categories:[Flow; Phrasing; Interactive; Palpable]
152 ~content_model:Text
153 ~attrs:[
154 Attr_spec.make "autocomplete" ~datatype:"autocomplete" ();
155 Attr_spec.make "cols" ~datatype:"integer" ();
156 Attr_spec.make "dirname" ~datatype:"directionality" ();
157 Attr_spec.make "disabled" ~datatype:"boolean" ();
158 Attr_spec.make "form" ~datatype:"idref" ();
159 Attr_spec.make "maxlength" ~datatype:"integer" ();
160 Attr_spec.make "minlength" ~datatype:"integer" ();
161 Attr_spec.make "name" ~datatype:"string" ();
162 Attr_spec.make "placeholder" ~datatype:"string" ();
163 Attr_spec.make "readonly" ~datatype:"boolean" ();
164 Attr_spec.make "required" ~datatype:"boolean" ();
165 Attr_spec.make "rows" ~datatype:"integer" ();
166 Attr_spec.make "wrap" ~enum_values:["soft"; "hard"] ();
167 ]
168 ~implicit_aria_role:"textbox"
169 ()
170
171let output =
172 Element_spec.make ~name:"output"
173 ~categories:[Flow; Phrasing; Palpable]
174 ~content_model:(Categories [Phrasing])
175 ~attrs:[
176 Attr_spec.make "for" ~datatype:"idrefs" ();
177 Attr_spec.make "form" ~datatype:"idref" ();
178 Attr_spec.make "name" ~datatype:"string" ();
179 ]
180 ~implicit_aria_role:"status"
181 ()
182
183let progress =
184 Element_spec.make ~name:"progress"
185 ~categories:[Flow; Phrasing; Palpable]
186 ~content_model:(Except (Categories [Phrasing], []))
187 ~attrs:[
188 Attr_spec.make "value" ~datatype:"float" ();
189 Attr_spec.make "max" ~datatype:"float" ();
190 ]
191 ~prohibited_ancestors:["progress"]
192 ()
193
194let meter =
195 Element_spec.make ~name:"meter"
196 ~categories:[Flow; Phrasing; Palpable]
197 ~content_model:(Except (Categories [Phrasing], []))
198 ~attrs:[
199 Attr_spec.make "value" ~required:true ~datatype:"float" ();
200 Attr_spec.make "min" ~datatype:"float" ();
201 Attr_spec.make "max" ~datatype:"float" ();
202 Attr_spec.make "low" ~datatype:"float" ();
203 Attr_spec.make "high" ~datatype:"float" ();
204 Attr_spec.make "optimum" ~datatype:"float" ();
205 ]
206 ~prohibited_ancestors:["meter"]
207 ()
208
209let fieldset =
210 Element_spec.make ~name:"fieldset"
211 ~categories:[Flow; Palpable]
212 ~content_model:(Sequence [
213 Optional (Elements ["legend"]);
214 Categories [Flow]
215 ])
216 ~attrs:[
217 Attr_spec.make "disabled" ~datatype:"boolean" ();
218 Attr_spec.make "form" ~datatype:"idref" ();
219 Attr_spec.make "name" ~datatype:"string" ();
220 ]
221 ~implicit_aria_role:"group"
222 ()
223
224let legend =
225 Element_spec.make ~name:"legend"
226 ~categories:[]
227 ~content_model:(Choice [
228 Categories [Phrasing];
229 Categories [Phrasing; Heading]
230 ])
231 ~permitted_parents:["fieldset"]
232 ()
233
234let all = [
235 form; label; input; button; select; datalist; optgroup; option;
236 textarea; output; progress; meter; fieldset; legend
237]