OCaml HTML5 parser/serialiser based on Python's JustHTML
1open Content_category
2open Content_model
3open Attr_spec
4
5let picture =
6 Element_spec.make ~name:"picture"
7 ~categories:[ Flow; Phrasing; Embedded; Palpable ]
8 ~content_model:
9 (Sequence
10 [
11 Zero_or_more (Elements [ "source" ]);
12 Elements [ "img" ];
13 Zero_or_more (Elements [ "script"; "template" ]);
14 ])
15 ~attrs:[] ()
16
17let source =
18 Element_spec.make ~name:"source" ~void:true
19 ~categories:[]
20 ~content_model:Nothing
21 ~attrs:
22 [
23 make "type" ~datatype:"mime" ();
24 make "media" ~datatype:"media_query" ();
25 make "src" ~datatype:"url" ();
26 make "srcset" ~datatype:"srcset" ();
27 make "sizes" ();
28 make "width" ~datatype:"integer" ();
29 make "height" ~datatype:"integer" ();
30 ]
31 ()
32
33let img =
34 Element_spec.make ~name:"img" ~void:true
35 ~categories:[ Flow; Phrasing; Embedded; Palpable; Interactive ]
36 ~content_model:Nothing
37 ~attrs:
38 [
39 make "src" ~required:true ~datatype:"url" ();
40 make "alt" ();
41 make "srcset" ~datatype:"srcset" ();
42 make "sizes" ();
43 make "crossorigin" ~datatype:"crossorigin" ();
44 make "usemap" ~datatype:"hash" ();
45 make "ismap" ~datatype:"boolean" ();
46 make "width" ~datatype:"integer" ();
47 make "height" ~datatype:"integer" ();
48 make "referrerpolicy" ~datatype:"referrer" ();
49 make "decoding" ~datatype:"decoding" ();
50 make "loading" ~datatype:"loading" ();
51 make "fetchpriority" ~datatype:"fetchpriority" ();
52 ]
53 ~implicit_aria_role:"img" ()
54
55let iframe =
56 Element_spec.make ~name:"iframe"
57 ~categories:[ Flow; Phrasing; Embedded; Interactive; Palpable ]
58 ~content_model:Nothing
59 ~attrs:
60 [
61 make "src" ~datatype:"url" ();
62 make "srcdoc" ();
63 make "name" ~datatype:"target" ();
64 make "sandbox" ~datatype:"sandbox" ();
65 make "allow" ();
66 make "allowfullscreen" ~datatype:"boolean" ();
67 make "width" ~datatype:"integer" ();
68 make "height" ~datatype:"integer" ();
69 make "referrerpolicy" ~datatype:"referrer" ();
70 make "loading" ~datatype:"loading" ();
71 ]
72 ()
73
74let embed =
75 Element_spec.make ~name:"embed" ~void:true
76 ~categories:[ Flow; Phrasing; Embedded; Interactive; Palpable ]
77 ~content_model:Nothing
78 ~attrs:
79 [
80 make "src" ~required:true ~datatype:"url" ();
81 make "type" ~datatype:"mime" ();
82 make "width" ~datatype:"integer" ();
83 make "height" ~datatype:"integer" ();
84 ]
85 ()
86
87let object_ =
88 Element_spec.make ~name:"object"
89 ~categories:[ Flow; Phrasing; Embedded; Palpable; Interactive ]
90 ~content_model:(Mixed [ Flow ])
91 ~attrs:
92 [
93 make "data" ~datatype:"url" ();
94 make "type" ~datatype:"mime" ();
95 make "name" ~datatype:"target" ();
96 make "form" ~datatype:"id" ();
97 make "width" ~datatype:"integer" ();
98 make "height" ~datatype:"integer" ();
99 ]
100 ()
101
102let param =
103 Element_spec.make ~name:"param" ~void:true
104 ~categories:[]
105 ~content_model:Nothing
106 ~attrs:[ make "name" ~required:true (); make "value" ~required:true () ]
107 ()
108
109let video =
110 Element_spec.make ~name:"video"
111 ~categories:[ Flow; Phrasing; Embedded; Palpable; Interactive ]
112 ~content_model:
113 (Choice
114 [
115 Sequence
116 [
117 Zero_or_more (Elements [ "source" ]);
118 Zero_or_more (Elements [ "track" ]);
119 Zero_or_more Transparent;
120 ];
121 Sequence [ Zero_or_more Transparent; Zero_or_more (Elements [ "track" ]) ];
122 ])
123 ~prohibited_ancestors:[ "audio"; "video" ]
124 ~attrs:
125 [
126 make "src" ~datatype:"url" ();
127 make "crossorigin" ~datatype:"crossorigin" ();
128 make "poster" ~datatype:"url" ();
129 make "preload" ~datatype:"preload" ();
130 make "autoplay" ~datatype:"boolean" ();
131 make "playsinline" ~datatype:"boolean" ();
132 make "loop" ~datatype:"boolean" ();
133 make "muted" ~datatype:"boolean" ();
134 make "controls" ~datatype:"boolean" ();
135 make "width" ~datatype:"integer" ();
136 make "height" ~datatype:"integer" ();
137 ]
138 ()
139
140let audio =
141 Element_spec.make ~name:"audio"
142 ~categories:[ Flow; Phrasing; Embedded; Palpable; Interactive ]
143 ~content_model:
144 (Choice
145 [
146 Sequence
147 [
148 Zero_or_more (Elements [ "source" ]);
149 Zero_or_more (Elements [ "track" ]);
150 Zero_or_more Transparent;
151 ];
152 Sequence [ Zero_or_more Transparent; Zero_or_more (Elements [ "track" ]) ];
153 ])
154 ~prohibited_ancestors:[ "audio"; "video" ]
155 ~attrs:
156 [
157 make "src" ~datatype:"url" ();
158 make "crossorigin" ~datatype:"crossorigin" ();
159 make "preload" ~datatype:"preload" ();
160 make "autoplay" ~datatype:"boolean" ();
161 make "loop" ~datatype:"boolean" ();
162 make "muted" ~datatype:"boolean" ();
163 make "controls" ~datatype:"boolean" ();
164 ]
165 ()
166
167let track =
168 Element_spec.make ~name:"track" ~void:true
169 ~categories:[]
170 ~content_model:Nothing
171 ~permitted_parents:[ "audio"; "video" ]
172 ~attrs:
173 [
174 make "kind" ~datatype:"kind" ();
175 make "src" ~required:true ~datatype:"url" ();
176 make "srclang" ~datatype:"language" ();
177 make "label" ();
178 make "default" ~datatype:"boolean" ();
179 ]
180 ()
181
182let map =
183 Element_spec.make ~name:"map"
184 ~categories:[ Flow; Phrasing; Palpable ]
185 ~content_model:Transparent
186 ~attrs:[ make "name" ~required:true () ] ()
187
188let area =
189 Element_spec.make ~name:"area" ~void:true
190 ~categories:[ Flow; Phrasing ]
191 ~content_model:Nothing
192 ~attrs:
193 [
194 make "alt" ();
195 make "coords" ~datatype:"coords" ();
196 make "shape" ~datatype:"shape" ();
197 make "href" ~datatype:"url" ();
198 make "target" ~datatype:"target" ();
199 make "download" ();
200 make "ping" ();
201 make "rel" ~datatype:"link_type" ();
202 make "referrerpolicy" ~datatype:"referrer" ();
203 ]
204 ~implicit_aria_role:"link" ()
205
206let all =
207 [
208 picture;
209 source;
210 img;
211 iframe;
212 embed;
213 object_;
214 param;
215 video;
216 audio;
217 track;
218 map;
219 area;
220 ]