OCaml HTML5 parser/serialiser based on Python's JustHTML
1(** Document structure elements *)
2
3let html =
4 Element_spec.make ~name:"html"
5 ~content_model:
6 (Content_model.Sequence
7 [
8 Content_model.Optional (Content_model.Elements [ "head" ]);
9 Content_model.Optional (Content_model.Elements [ "body" ]);
10 ])
11 ~implicit_aria_role:"document" ()
12
13let head =
14 Element_spec.make ~name:"head" ~categories:[]
15 ~content_model:
16 (Content_model.Zero_or_more (Content_model.Categories [ Metadata ]))
17 ()
18
19let body =
20 Element_spec.make ~name:"body" ~categories:[ Sectioning ]
21 ~content_model:(Content_model.Categories [ Flow ]) ()
22
23let title =
24 Element_spec.make ~name:"title" ~categories:[ Metadata ]
25 ~content_model:Content_model.Text ()
26
27let base =
28 Element_spec.make ~name:"base" ~void:true ~categories:[ Metadata ]
29 ~content_model:Content_model.Nothing ()
30
31let link =
32 Element_spec.make ~name:"link" ~void:true ~categories:[ Metadata ]
33 ~content_model:Content_model.Nothing ()
34
35let meta =
36 Element_spec.make ~name:"meta" ~void:true ~categories:[ Metadata ]
37 ~content_model:Content_model.Nothing ()
38
39let style =
40 Element_spec.make ~name:"style" ~categories:[ Metadata ]
41 ~content_model:Content_model.Text ()
42
43(** Sectioning elements *)
44
45let article =
46 Element_spec.make ~name:"article" ~categories:[ Flow; Sectioning; Palpable ]
47 ~content_model:(Content_model.Categories [ Flow ]) ()
48
49let section =
50 Element_spec.make ~name:"section" ~categories:[ Flow; Sectioning; Palpable ]
51 ~content_model:(Content_model.Categories [ Flow ]) ()
52
53let nav =
54 Element_spec.make ~name:"nav" ~categories:[ Flow; Sectioning; Palpable ]
55 ~content_model:(Content_model.Categories [ Flow ])
56 ~implicit_aria_role:"navigation" ()
57
58let aside =
59 Element_spec.make ~name:"aside" ~categories:[ Flow; Sectioning; Palpable ]
60 ~content_model:(Content_model.Categories [ Flow ])
61 ~implicit_aria_role:"complementary" ()
62
63let h1 =
64 Element_spec.make ~name:"h1" ~categories:[ Flow; Heading; Palpable ]
65 ~content_model:(Content_model.Categories [ Phrasing ])
66 ~implicit_aria_role:"heading" ()
67
68let h2 =
69 Element_spec.make ~name:"h2" ~categories:[ Flow; Heading; Palpable ]
70 ~content_model:(Content_model.Categories [ Phrasing ])
71 ~implicit_aria_role:"heading" ()
72
73let h3 =
74 Element_spec.make ~name:"h3" ~categories:[ Flow; Heading; Palpable ]
75 ~content_model:(Content_model.Categories [ Phrasing ])
76 ~implicit_aria_role:"heading" ()
77
78let h4 =
79 Element_spec.make ~name:"h4" ~categories:[ Flow; Heading; Palpable ]
80 ~content_model:(Content_model.Categories [ Phrasing ])
81 ~implicit_aria_role:"heading" ()
82
83let h5 =
84 Element_spec.make ~name:"h5" ~categories:[ Flow; Heading; Palpable ]
85 ~content_model:(Content_model.Categories [ Phrasing ])
86 ~implicit_aria_role:"heading" ()
87
88let h6 =
89 Element_spec.make ~name:"h6" ~categories:[ Flow; Heading; Palpable ]
90 ~content_model:(Content_model.Categories [ Phrasing ])
91 ~implicit_aria_role:"heading" ()
92
93let hgroup =
94 Element_spec.make ~name:"hgroup" ~categories:[ Flow; Heading; Palpable ]
95 ~content_model:
96 (Content_model.Sequence
97 [
98 Content_model.Zero_or_more
99 (Content_model.Choice
100 [
101 Content_model.Elements [ "p" ];
102 Content_model.Categories [ Heading ];
103 ]);
104 ])
105 ~implicit_aria_role:"group" ()
106
107let header =
108 Element_spec.make ~name:"header" ~categories:[ Flow; Palpable ]
109 ~content_model:
110 (Content_model.Except
111 ( Content_model.Categories [ Flow ],
112 [] (* no header/footer descendants *) ))
113 ~prohibited_ancestors:[ "header"; "footer" ] ~implicit_aria_role:"banner" ()
114
115let footer =
116 Element_spec.make ~name:"footer" ~categories:[ Flow; Palpable ]
117 ~content_model:
118 (Content_model.Except
119 ( Content_model.Categories [ Flow ],
120 [] (* no header/footer descendants *) ))
121 ~prohibited_ancestors:[ "header"; "footer" ]
122 ~implicit_aria_role:"contentinfo" ()
123
124let address =
125 Element_spec.make ~name:"address" ~categories:[ Flow; Palpable ]
126 ~content_model:
127 (Content_model.Except
128 ( Content_model.Categories [ Flow ],
129 [ Heading; Sectioning ] (* no heading/sectioning content *) ))
130 ~prohibited_ancestors:[ "address" ] ()
131
132let main =
133 Element_spec.make ~name:"main" ~categories:[ Flow; Palpable ]
134 ~content_model:(Content_model.Categories [ Flow ])
135 ~implicit_aria_role:"main" ()
136
137(** Grouping elements *)
138
139let p =
140 Element_spec.make ~name:"p" ~categories:[ Flow; Palpable ]
141 ~content_model:(Content_model.Categories [ Phrasing ]) ()
142
143let hr =
144 Element_spec.make ~name:"hr" ~void:true ~categories:[ Flow ]
145 ~content_model:Content_model.Nothing ~implicit_aria_role:"separator" ()
146
147let pre =
148 Element_spec.make ~name:"pre" ~categories:[ Flow; Palpable ]
149 ~content_model:(Content_model.Categories [ Phrasing ]) ()
150
151let blockquote =
152 Element_spec.make ~name:"blockquote" ~categories:[ Flow; Palpable ]
153 ~content_model:(Content_model.Categories [ Flow ]) ()
154
155let ol =
156 Element_spec.make ~name:"ol" ~categories:[ Flow; Palpable ]
157 ~content_model:(Content_model.Zero_or_more (Content_model.Elements [ "li" ]))
158 ~implicit_aria_role:"list" ()
159
160let ul =
161 Element_spec.make ~name:"ul" ~categories:[ Flow; Palpable ]
162 ~content_model:(Content_model.Zero_or_more (Content_model.Elements [ "li" ]))
163 ~implicit_aria_role:"list" ()
164
165let menu =
166 Element_spec.make ~name:"menu" ~categories:[ Flow; Palpable ]
167 ~content_model:
168 (Content_model.Zero_or_more
169 (Content_model.Choice
170 [
171 Content_model.Elements [ "li" ];
172 Content_model.Elements [ "script" ];
173 Content_model.Elements [ "template" ];
174 ]))
175 ~implicit_aria_role:"list" ()
176
177let li =
178 Element_spec.make ~name:"li" ~categories:[]
179 ~content_model:(Content_model.Categories [ Flow ])
180 ~permitted_parents:[ "ol"; "ul"; "menu" ] ~implicit_aria_role:"listitem" ()
181
182let dl =
183 Element_spec.make ~name:"dl" ~categories:[ Flow; Palpable ]
184 ~content_model:
185 (Content_model.Choice
186 [
187 Content_model.Zero_or_more
188 (Content_model.Sequence
189 [
190 Content_model.One_or_more (Content_model.Elements [ "dt" ]);
191 Content_model.One_or_more (Content_model.Elements [ "dd" ]);
192 ]);
193 Content_model.Zero_or_more
194 (Content_model.Choice
195 [
196 Content_model.Elements [ "div" ];
197 Content_model.Elements [ "script" ];
198 Content_model.Elements [ "template" ];
199 ]);
200 ])
201 ()
202
203let dt =
204 Element_spec.make ~name:"dt" ~categories:[]
205 ~content_model:
206 (Content_model.Except
207 ( Content_model.Categories [ Flow ],
208 [ Heading; Sectioning ] (* no heading/sectioning *) ))
209 ~permitted_parents:[ "dl"; "div" ] ()
210
211let dd =
212 Element_spec.make ~name:"dd" ~categories:[]
213 ~content_model:(Content_model.Categories [ Flow ])
214 ~permitted_parents:[ "dl"; "div" ] ()
215
216let figure =
217 Element_spec.make ~name:"figure" ~categories:[ Flow; Palpable ]
218 ~content_model:
219 (Content_model.Choice
220 [
221 Content_model.Sequence
222 [
223 Content_model.Optional
224 (Content_model.Elements [ "figcaption" ]);
225 Content_model.Categories [ Flow ];
226 ];
227 Content_model.Sequence
228 [
229 Content_model.Categories [ Flow ];
230 Content_model.Optional
231 (Content_model.Elements [ "figcaption" ]);
232 ];
233 ])
234 ~implicit_aria_role:"figure" ()
235
236let figcaption =
237 Element_spec.make ~name:"figcaption" ~categories:[]
238 ~content_model:(Content_model.Categories [ Flow ])
239 ~permitted_parents:[ "figure" ] ()
240
241let div =
242 Element_spec.make ~name:"div" ~categories:[ Flow; Palpable ]
243 ~content_model:(Content_model.Categories [ Flow ]) ()
244
245(** Element registry *)
246
247let all =
248 [
249 (* Document structure *)
250 html;
251 head;
252 body;
253 title;
254 base;
255 link;
256 meta;
257 style;
258 (* Sectioning *)
259 article;
260 section;
261 nav;
262 aside;
263 h1;
264 h2;
265 h3;
266 h4;
267 h5;
268 h6;
269 hgroup;
270 header;
271 footer;
272 address;
273 main;
274 (* Grouping *)
275 p;
276 hr;
277 pre;
278 blockquote;
279 ol;
280 ul;
281 menu;
282 li;
283 dl;
284 dt;
285 dd;
286 figure;
287 figcaption;
288 div;
289 ]