package tyxml-lwd

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file tyxml_lwd.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
open Js_of_ocaml

type raw_node = Dom.node Js.t
type 'a live = 'a Lwd_seq.t Lwd.t
type 'a attr = 'a option Lwd.t

let some x = Some x
let empty = Lwd.pure Lwd_seq.empty

module W : Xml_wrap.T
  with type 'a t = 'a Lwd.t
  with type ('a, 'b) ft = 'a -> 'b
  with type 'a tlist = 'a Lwd.t list
=
struct
  type 'a t = 'a Lwd.t
  type (-'a, 'b) ft = 'a -> 'b
  type 'a tlist = 'a Lwd.t list

  let return = Lwd.pure
  let fmap f x = Lwd.map ~f x
  let nil () = []
  let singleton x = [x]
  let append = (@)
  let cons x xs = x :: xs
  let map f xs = List.map (fun x -> Lwd.map ~f x) xs
end

type child_tree =
  | Leaf of raw_node
  | Inner of { mutable bound: raw_node Js.opt;
               left: child_tree; right: child_tree; }

let child_node node = Leaf node

let child_join left right = Inner { bound = Js.null; left; right }

let js_lwd_to_remove =
  Js.string "lwd-to-remove" (* HACK Could be turned into a Javascript symbol *)

let contains_focus node =
  Js.to_bool (Js.Unsafe.meth_call (node : raw_node) "contains"
                [|Js.Unsafe.inject Dom_html.document##.activeElement|])

let update_children (self : raw_node) (children : raw_node live) : unit Lwd.t =
  let reducer =
    ref (Lwd_seq.Reducer.make ~map:child_node ~reduce:child_join)
  in
  Lwd.map children ~f:begin fun children ->
    let dropped, reducer' =
      Lwd_seq.Reducer.update_and_get_dropped !reducer children in
    reducer := reducer';
    let schedule_for_removal child () = match child with
      | Leaf node -> Js.Unsafe.set node js_lwd_to_remove Js._true
      | Inner _ -> ()
    in
    Lwd_seq.Reducer.fold_dropped `Map schedule_for_removal dropped ();
    let preserve_focus = contains_focus self in
    begin match Lwd_seq.Reducer.reduce reducer' with
      | None -> ()
      | Some tree ->
        let rec update acc = function
          | Leaf x ->
            Js.Unsafe.delete x js_lwd_to_remove;
            if x##.parentNode != Js.some self then
              ignore (self##insertBefore x acc)
            else if x##.nextSibling != acc then begin
              (* Parent is correct but sibling is not: swap nodes, but be
                 cautious with focus *)
              if preserve_focus && contains_focus x then (
                let rec shift_siblings () =
                  let sibling = x##.nextSibling in
                  if sibling == acc then
                    true
                  else match Js.Opt.to_option sibling with
                    | None -> false
                    | Some sibling ->
                      ignore (self##insertBefore sibling (Js.some x));
                      shift_siblings ()
                in
                if not (shift_siblings ()) then
                  ignore (self##insertBefore x acc)
              )
              else
                ignore (self##insertBefore x acc)
            end;
            Js.some x
          | Inner t ->
            if Js.Opt.test t.bound then t.bound else (
              let acc = update acc t.right in
              let acc = update acc t.left in
              t.bound <- acc;
              acc
            )
        in
        ignore (update Js.null tree)
    end;
    let remove_child child () = match child with
      | Leaf node ->
        if Js.Opt.test (Js.Unsafe.get node js_lwd_to_remove) then
          ignore (self##removeChild node)
      | Inner _ -> ()
    in
    Lwd_seq.Reducer.fold_dropped `Map remove_child dropped ();
  end

let update_children_list self children =
  update_children self (Lwd.join (Lwd_utils.pack Lwd_seq.lwd_monoid children))

module Attrib = struct
  type t =
    | Event of
        { name: string; value: (Dom_html.event Js.t -> bool) attr }
    | Event_mouse of
        { name: string; value: (Dom_html.mouseEvent Js.t -> bool) attr }
    | Event_keyboard of
        { name: string; value: (Dom_html.keyboardEvent Js.t -> bool) attr }
    | Event_touch of
        { name: string; value: (Dom_html.touchEvent Js.t -> bool) attr }
    | Attrib of
        { name: string; value: Js.js_string Js.t attr }
end

module Xml :
sig
  include Xml_sigs.T
    with module W = W
     and type uri = string
     and type elt = raw_node live
     and type attrib = Attrib.t
     and type event_handler          = (Dom_html.event Js.t -> bool) attr
     and type mouse_event_handler    = (Dom_html.mouseEvent Js.t -> bool) attr
     and type keyboard_event_handler = (Dom_html.keyboardEvent Js.t -> bool) attr
     and type touch_event_handler    = (Dom_html.touchEvent Js.t -> bool) attr

end
= struct

  module W = W

  type elt = raw_node live
  type 'a wrap = 'a W.t
  type 'a list_wrap = 'a W.tlist

  type uri = string
  let uri_of_string s = s
  let string_of_uri s = s

  type aname = string

  type event_handler          = (Dom_html.event Js.t -> bool) attr
  type mouse_event_handler    = (Dom_html.mouseEvent Js.t -> bool) attr
  type keyboard_event_handler = (Dom_html.keyboardEvent Js.t -> bool) attr
  type touch_event_handler    = (Dom_html.touchEvent Js.t -> bool) attr

  type attrib = Attrib.t

  let attrib name value f = Attrib.Attrib {name; value = Lwd.map ~f value}

  let js_string_of_float f = (Js.number_of_float f)##toString
  let js_string_of_int i = (Js.number_of_float (float_of_int i))##toString

  let float_attrib n v = attrib n v
      (fun v -> Some (js_string_of_float v))
  let int_attrib n v = attrib n v
      (fun v -> Some (js_string_of_int v))
  let string_attrib n v = attrib n v
      (fun v -> Some (Js.string v))
  let space_sep_attrib n v = attrib n v
      (fun v -> Some (Js.string (String.concat " " v)))
  let comma_sep_attrib n v = attrib n v
      (fun v -> Some (Js.string (String.concat "," v)))

  let event_handler_attrib n v =
    Attrib.Event {name = n; value = v}

  let mouse_event_handler_attrib n v =
    Attrib.Event_mouse {name = n; value = v}

  let keyboard_event_handler_attrib n v =
    Attrib.Event_keyboard {name = n; value = v}

  let touch_event_handler_attrib n v =
    Attrib.Event_touch {name = n; value = v}

  let uri_attrib n v = attrib n v
      (fun v -> Some (Js.string v))

  let uris_attrib n v = attrib n v
      (fun v -> Some (Js.string (String.concat " " v)))

  let attach_attrib (node: #Dom.element Js.t) name value =
    let f = match name with
      | "style" -> (function
          | None -> node##.style##.cssText := Js.string ""
          | Some v -> node##.style##.cssText := v
        )
      | "value" -> (function
          | None -> (Obj.magic node : _ Js.t)##.value := Js.string ""
          | Some v -> (Obj.magic node : _ Js.t)##.value := v
        )
      | name -> let name = Js.string name in (function
          | None -> node##removeAttribute name
          | Some v -> node##setAttribute name v
        )
    in
    Lwd.map ~f value

  let attach_event (node: #Dom.element Js.t) name value =
    let name = Js.string name in
    Lwd.map ~f:(function
        | None -> Js.Unsafe.set node name Js.null
        | Some v -> Js.Unsafe.set node name (fun ev -> Js.bool (v ev))
      ) value

  (** Element *)

  type data = raw_node

  type ename = string

  let pure x = Lwd.pure (Lwd_seq.element x)
  let as_node (x : #Dom.node Js.t) = (x :> Dom.node Js.t)
  let pure_node x = pure (as_node x)

  let empty () = empty

  let comment c = pure_node (Dom_html.document##createComment (Js.string c))

  let pcdata (text : string Lwd.t) : elt =
    let node =
      Lwd_seq.element (Dom_html.document##createTextNode (Js.string ""))
    in
    Lwd.map text ~f:(fun text ->
        begin match Lwd_seq.view node with
          | Lwd_seq.Element elt -> elt##.data := Js.string text;
          | _ -> assert false
        end;
        (node : Dom.text Js.t Lwd_seq.t :> raw_node Lwd_seq.t)
      )

  let encodedpcdata = pcdata

  let entity =
    let string_fold s ~pos ~init ~f =
      let r = ref init in
      for i = pos to String.length s - 1 do
        let c = s.[i] in
        r := f !r c
      done;
      !r
    in
    let invalid_entity e = failwith (Printf.sprintf "Invalid entity %S" e) in
    let int_of_char = function
      | '0' .. '9' as x -> Some (Char.code x - Char.code '0')
      | 'a' .. 'f' as x -> Some (Char.code x - Char.code 'a' + 10)
      | 'A' .. 'F' as x -> Some (Char.code x - Char.code 'A' + 10)
      | _ -> None
    in
    let parse_int ~pos ~base e =
      string_fold e ~pos ~init:0 ~f:(fun acc x ->
          match int_of_char x with
          | Some d when d < base -> (acc * base) + d
          | Some _ | None -> invalid_entity e)
    in
    let is_alpha_num = function
      | '0' .. '9' | 'a' .. 'z' | 'A' .. 'Z' -> true
      | _ -> false
    in
    fun e ->
      let len = String.length e in
      let str =
        if len >= 1 && Char.equal e.[0] '#'
        then
          let i =
            if len >= 2 && (Char.equal e.[1] 'x' || Char.equal e.[1] 'X')
            then parse_int ~pos:2 ~base:16 e
            else parse_int ~pos:1 ~base:10 e
          in
          Js.string_constr##fromCharCode i
        else if string_fold e ~pos:0 ~init:true ~f:(fun acc x ->
                    (* This is not quite right according to
                       https://www.xml.com/axml/target.html#NT-Name.
                       but it seems to cover all html5 entities
                       https://dev.w3.org/html5/html-author/charref *)
                    acc && is_alpha_num x)
        then
          match e with
          | "quot" -> Js.string "\""
          | "amp" -> Js.string "&"
          | "apos" -> Js.string "'"
          | "lt" -> Js.string "<"
          | "gt" -> Js.string ">"
          | "" -> invalid_entity e
          | _ -> Dom_html.decode_html_entities (Js.string ("&" ^ e ^ ";"))
        else invalid_entity e
      in
      pure_node (Dom_html.document##createTextNode str)

  let attach_attribs node l =
    Lwd_utils.pack ((), fun () () -> ())
      (List.map (function
           | Attrib.Attrib  {name; value} -> attach_attrib node name value
           | Event          {name; value} -> attach_event node name value
           | Event_mouse    {name; value} -> attach_event node name value
           | Event_keyboard {name; value} -> attach_event node name value
           | Event_touch    {name; value} -> attach_event node name value
         ) l)

  let rec find_ns : attrib list -> Js.js_string Js.t option = function
    | [] -> None
    | Attrib {name = "xmlns"; value} :: _ ->
      begin
        (* The semantics should not differ whether an Lwd value is pure or not,
           but let's do an exception for xml namespaces (those are managed
           differently from other and can't be changed at runtime). *)
        match Lwd.is_pure value with
        | None ->
          prerr_endline "xmlns attribute should be static";
          None
        | Some x -> x
      end
    | _ :: rest -> find_ns rest

  let createElement ~ns name =
    let name = Js.string name in
    match ns with
    | None -> Dom_html.document##createElement name
    | Some ns -> Dom_html.document##createElementNS ns name

  let leaf ?(a = []) name : elt =
    let e = createElement ~ns:(find_ns a) name in
    let e' = Lwd_seq.element (e : Dom_html.element Js.t :> data) in
    Lwd.map (attach_attribs e a) ~f:(fun () -> e')

  let node ?(a = []) name (children : elt list_wrap) : elt =
    let e = createElement ~ns:(find_ns a) name in
    let e' = Lwd_seq.element e in
    Lwd.map2
      (update_children_list (e :> data) children)
      (attach_attribs e a)
      ~f:(fun () () -> (e' :> data Lwd_seq.t))

  let cdata s = pure_node (Dom_html.document##createTextNode (Js.string s))

  let cdata_script s = cdata s

  let cdata_style s = cdata s
end

type +'a node = raw_node
type +'a attrib = Xml.attrib

module Raw_svg = Svg_f.Make(struct
    include Xml

    let svg_xmlns = Attrib.Attrib {
        name = "xmlns";
        value = Lwd.pure (Some (Js.string "http://www.w3.org/2000/svg"));
      }

    let leaf ?(a = []) name =
      leaf ~a:(svg_xmlns :: a) name

    let node ?(a = []) name (children : elt list_wrap) =
      node ~a:(svg_xmlns :: a) name children
  end)

open Svg_types
module Svg : sig
  type +'a elt = 'a node live
  type doc = [`Svg] elt
  type nonrec +'a attrib = 'a attrib

  module Xml = Xml
  type ('a, 'b) nullary = ?a:'a attrib list -> unit -> 'b elt
  type ('a, 'b, 'c) unary = ?a:'a attrib list -> 'b elt -> 'c elt
  type ('a, 'b, 'c) star = ?a:'a attrib list -> 'b elt list -> 'c elt

  module Info : Xml_sigs.Info
  type uri = string
  val string_of_uri : uri -> string
  val uri_of_string : string -> uri

  val a_x : Unit.length Lwd.t -> [>`X] attrib
  val a_y : Unit.length Lwd.t -> [>`Y] attrib
  val a_width : Unit.length Lwd.t -> [>`Width] attrib
  val a_height : Unit.length Lwd.t -> [>`Height] attrib
  val a_preserveAspectRatio : uri Lwd.t -> [>`PreserveAspectRatio] attrib
  val a_zoomAndPan : [<`Disable|`Magnify] Lwd.t -> [>`ZoomAndSpan] attrib
  val a_href : uri Lwd.t -> [>`Xlink_href] attrib
  val a_requiredExtensions : spacestrings Lwd.t -> [>`RequiredExtension] attrib
  val a_systemLanguage :
    commastrings Lwd.t -> [>`SystemLanguage] attrib
  val a_externalRessourcesRequired :
    bool Lwd.t -> [>`ExternalRessourcesRequired] attrib
  val a_id : uri Lwd.t -> [>`Id] attrib
  val a_user_data : uri -> uri Lwd.t -> [>`User_data] attrib
  val a_xml_lang : uri Lwd.t -> [>`Xml_Lang] attrib
  val a_type : uri Lwd.t -> [>`Type] attrib
  val a_media : commastrings Lwd.t -> [>`Media] attrib
  val a_class : spacestrings Lwd.t -> [>`Class] attrib
  val a_style : uri Lwd.t -> [>`Style] attrib
  val a_transform : transforms Lwd.t -> [>`Transform] attrib
  val a_viewBox : fourfloats Lwd.t -> [>`ViewBox] attrib
  val a_d : uri Lwd.t -> [>`D] attrib
  val a_pathLength : float Lwd.t -> [>`PathLength] attrib
  val a_rx : Unit.length Lwd.t -> [>`Rx] attrib
  val a_ry : Unit.length Lwd.t -> [>`Ry] attrib
  val a_cx : Unit.length Lwd.t -> [>`Cx] attrib
  val a_cy : Unit.length Lwd.t -> [>`Cy] attrib
  val a_r : Unit.length Lwd.t -> [>`R] attrib
  val a_x1 : Unit.length Lwd.t -> [>`X1] attrib
  val a_y1 : Unit.length Lwd.t -> [>`Y1] attrib
  val a_x2 : Unit.length Lwd.t -> [>`X2] attrib
  val a_y2 : Unit.length Lwd.t -> [>`Y2] attrib
  val a_points : coords Lwd.t -> [>`Points] attrib
  val a_x_list : lengths Lwd.t -> [>`X_list] attrib
  val a_y_list : lengths Lwd.t -> [>`Y_list] attrib
  val a_dx : float Lwd.t -> [>`Dx] attrib
  val a_dy : float Lwd.t -> [>`Dy] attrib
  val a_dx_list : lengths Lwd.t -> [>`Dx_list] attrib
  val a_dy_list : lengths Lwd.t -> [>`Dy_list] attrib
  val a_lengthAdjust :
    [<`Spacing|`SpacingAndGlyphs] Lwd.t -> [>`LengthAdjust] attrib
  val a_textLength : Unit.length Lwd.t -> [>`TextLength] attrib
  val a_text_anchor :
    [<`End|`Inherit|`Middle|`Start] Lwd.t -> [>`Text_Anchor] attrib
  val a_text_decoration :
    [<`Blink|`Inherit|`Line_through|`None|`Overline|`Underline] Lwd.t ->
    [>`Text_Decoration] attrib
  val a_text_rendering :
    [<`Auto|`GeometricPrecision|`Inherit
    |`OptimizeLegibility|`OptimizeSpeed] Lwd.t ->
    [>`Text_Rendering] attrib
  val a_rotate : numbers Lwd.t -> [>`Rotate] attrib
  val a_startOffset : Unit.length Lwd.t -> [>`StartOffset] attrib
  val a_method : [<`Align | `Stretch] Lwd.t -> [>`Method] attrib
  val a_spacing : [<`Auto | `Exact] Lwd.t -> [>`Spacing] attrib
  val a_glyphRef : uri Lwd.t -> [>`GlyphRef] attrib
  val a_format : uri Lwd.t -> [>`Format] attrib
  val a_markerUnits :
    [<`StrokeWidth | `UserSpaceOnUse] Lwd.t -> [>`MarkerUnits] attrib
  val a_refX : Unit.length Lwd.t -> [>`RefX] attrib
  val a_refY : Unit.length Lwd.t -> [>`RefY] attrib
  val a_markerWidth : Unit.length Lwd.t -> [>`MarkerWidth] attrib
  val a_markerHeight :
    Unit.length Lwd.t -> [>`MarkerHeight] attrib
  val a_orient : Unit.angle option Lwd.t -> [>`Orient] attrib
  val a_local : uri Lwd.t -> [>`Local] attrib
  val a_rendering_intent :
    [<`Absolute_colorimetric|`Auto|`Perceptual
    |`Relative_colorimetric|`Saturation] Lwd.t ->
    [>`Rendering_Indent] attrib
  val a_gradientUnits :
    [<`ObjectBoundingBox|`UserSpaceOnUse] Lwd.t -> [`GradientUnits] attrib
  val a_gradientTransform : transforms Lwd.t -> [>`Gradient_Transform] attrib
  val a_spreadMethod : [<`Pad|`Reflect|`Repeat] Lwd.t -> [>`SpreadMethod] attrib
  val a_fx : Unit.length Lwd.t -> [>`Fx] attrib
  val a_fy : Unit.length Lwd.t -> [>`Fy] attrib
  val a_offset : [<`Number of float | `Percentage of float] Lwd.t ->
    [>`Offset] attrib
  val a_patternUnits : [<`ObjectBoundingBox|`UserSpaceOnUse] Lwd.t ->
    [>`PatternUnits] attrib
  val a_patternContentUnits : [<`ObjectBoundingBox|`UserSpaceOnUse] Lwd.t ->
    [>`PatternContentUnits] attrib
  val a_patternTransform : transforms Lwd.t -> [>`PatternTransform] attrib
  val a_clipPathUnits : [<`ObjectBoundingBox|`UserSpaceOnUse] Lwd.t ->
    [>`ClipPathUnits] attrib
  val a_maskUnits : [<`ObjectBoundingBox|`UserSpaceOnUse] Lwd.t ->
    [>`MaskUnits] attrib
  val a_maskContentUnits : [<`ObjectBoundingBox|`UserSpaceOnUse] Lwd.t ->
    [>`MaskContentUnits] attrib
  val a_primitiveUnits : [<`ObjectBoundingBox|`UserSpaceOnUse] Lwd.t ->
    [>`PrimitiveUnits] attrib
  val a_filterRes : number_optional_number Lwd.t -> [>`FilterResUnits] attrib
  val a_result : uri Lwd.t -> [>`Result] attrib
  val a_in :
    [<`BackgroundAlpha|`BackgroundImage|`FillPaint|`Ref of uri
    |`SourceAlpha|`SourceGraphic|`StrokePaint] Lwd.t -> [>`In] attrib
  val a_in2 :
    [<`BackgroundAlpha|`BackgroundImage|`FillPaint|`Ref of uri
    |`SourceAlpha|`SourceGraphic|`StrokePaint] Lwd.t -> [>`In2] attrib
  val a_azimuth : float Lwd.t -> [>`Azimuth] attrib
  val a_elevation : float Lwd.t -> [>`Elevation] attrib
  val a_pointsAtX : float Lwd.t -> [>`PointsAtX] attrib
  val a_pointsAtY : float Lwd.t -> [>`PointsAtY] attrib
  val a_pointsAtZ : float Lwd.t -> [>`PointsAtZ] attrib
  val a_specularExponent : float Lwd.t -> [>`SpecularExponent] attrib
  val a_specularConstant : float Lwd.t -> [>`SpecularConstant] attrib
  val a_limitingConeAngle : float Lwd.t -> [>`LimitingConeAngle] attrib
  val a_mode :
    [<`Darken|`Lighten|`Multiply|`Normal|`Screen] Lwd.t -> [>`Mode] attrib
  val a_feColorMatrix_type :
    [<`HueRotate|`LuminanceToAlpha|`Matrix|`Saturate] Lwd.t ->
    [>`Typefecolor] attrib
  val a_values : numbers Lwd.t -> [>`Values] attrib
  val a_transfer_type : [<`Discrete|`Gamma|`Identity|`Linear|`Table] Lwd.t ->
    [>`Type_transfert] attrib
  val a_tableValues : numbers Lwd.t -> [>`TableValues] attrib
  val a_intercept : float Lwd.t -> [>`Intercept] attrib
  val a_amplitude : float Lwd.t -> [>`Amplitude] attrib
  val a_exponent : float Lwd.t -> [>`Exponent] attrib
  val a_transfer_offset : float Lwd.t -> [>`Offset_transfer] attrib
  val a_feComposite_operator : [<`Arithmetic|`Atop|`In|`Out|`Over|`Xor] Lwd.t ->
    [>`OperatorComposite] attrib
  val a_k1 : float Lwd.t -> [>`K1] attrib
  val a_k2 : float Lwd.t -> [>`K2] attrib
  val a_k3 : float Lwd.t -> [>`K3] attrib
  val a_k4 : float Lwd.t -> [>`K4] attrib
  val a_order : number_optional_number Lwd.t -> [>`Order] attrib
  val a_kernelMatrix : numbers Lwd.t -> [>`KernelMatrix] attrib
  val a_divisor : float Lwd.t -> [>`Divisor] attrib
  val a_bias : float Lwd.t -> [>`Bias] attrib
  val a_kernelUnitLength :
    number_optional_number Lwd.t -> [>`KernelUnitLength] attrib
  val a_targetX : int Lwd.t -> [>`TargetX] attrib
  val a_targetY : int Lwd.t -> [>`TargetY] attrib
  val a_edgeMode : [<`Duplicate|`None|`Wrap] Lwd.t -> [>`TargetY] attrib
  val a_preserveAlpha : bool Lwd.t -> [>`TargetY] attrib
  val a_surfaceScale : float Lwd.t -> [>`SurfaceScale] attrib
  val a_diffuseConstant : float Lwd.t -> [>`DiffuseConstant] attrib
  val a_scale : float Lwd.t -> [>`Scale] attrib
  val a_xChannelSelector : [<`A|`B|`G|`R] Lwd.t -> [>`XChannelSelector] attrib
  val a_yChannelSelector : [<`A|`B|`G|`R] Lwd.t -> [>`YChannelSelector] attrib
  val a_stdDeviation : number_optional_number Lwd.t -> [>`StdDeviation] attrib
  val a_feMorphology_operator : [<`Dilate|`Erode] Lwd.t -> [>`OperatorMorphology] attrib
  val a_radius : number_optional_number Lwd.t -> [>`Radius] attrib
  val a_baseFrenquency : number_optional_number Lwd.t -> [>`BaseFrequency] attrib
  val a_numOctaves : int Lwd.t -> [>`NumOctaves] attrib
  val a_seed : float Lwd.t -> [>`Seed] attrib
  val a_stitchTiles : [<`NoStitch|`Stitch] Lwd.t -> [>`StitchTiles] attrib
  val a_feTurbulence_type : [<`FractalNoise|`Turbulence] Lwd.t -> [>`TypeStitch] attrib
  val a_target : uri Lwd.t -> [>`Xlink_target] attrib
  val a_attributeName : uri Lwd.t -> [>`AttributeName] attrib
  val a_attributeType : [<`Auto|`CSS|`XML] Lwd.t -> [>`AttributeType] attrib
  val a_begin : uri Lwd.t -> [>`Begin] attrib
  val a_dur : uri Lwd.t -> [>`Dur] attrib
  val a_min : uri Lwd.t -> [>`Min] attrib
  val a_max : uri Lwd.t -> [>`Max] attrib
  val a_restart : [<`Always|`Never|`WhenNotActive] Lwd.t -> [>`Restart] attrib
  val a_repeatCount : uri Lwd.t -> [>`RepeatCount] attrib
  val a_repeatDur : uri Lwd.t -> [>`RepeatDur] attrib
  val a_fill : paint Lwd.t -> [>`Fill] attrib
  val a_animation_fill : [<`Freeze|`Remove] Lwd.t -> [>`Fill_Animation] attrib
  val a_calcMode : [<`Discrete|`Linear|`Paced|`Spline] Lwd.t -> [>`CalcMode] attrib
  val a_animation_values : strings Lwd.t -> [>`Valuesanim] attrib
  val a_keyTimes : strings Lwd.t -> [>`KeyTimes] attrib
  val a_keySplines : strings Lwd.t -> [>`KeySplines] attrib
  val a_from : uri Lwd.t -> [>`From] attrib
  val a_to : uri Lwd.t -> [>`To] attrib
  val a_by : uri Lwd.t -> [>`By] attrib
  val a_additive : [<`Replace|`Sum] Lwd.t -> [>`Additive] attrib
  val a_accumulate : [<`None|`Sum] Lwd.t -> [>`Accumulate] attrib
  val a_keyPoints : numbers_semicolon Lwd.t -> [>`KeyPoints] attrib
  val a_path : uri Lwd.t -> [>`Path] attrib
  val a_animateTransform_type :
    [`Rotate|`Scale|`SkewX|`SkewY|`Translate] Lwd.t ->
    [`Typeanimatetransform] attrib
  val a_horiz_origin_x : float Lwd.t -> [>`HorizOriginX] attrib
  val a_horiz_origin_y : float Lwd.t -> [>`HorizOriginY] attrib
  val a_horiz_adv_x : float Lwd.t -> [>`HorizAdvX] attrib
  val a_vert_origin_x : float Lwd.t -> [>`VertOriginX] attrib
  val a_vert_origin_y : float Lwd.t -> [>`VertOriginY] attrib
  val a_vert_adv_y : float Lwd.t -> [>`VertAdvY] attrib
  val a_unicode : uri Lwd.t -> [>`Unicode] attrib
  val a_glyph_name : uri Lwd.t -> [>`glyphname] attrib
  val a_orientation : [<`H | `V] Lwd.t -> [>`Orientation] attrib
  val a_arabic_form : [<`Initial|`Isolated|`Medial|`Terminal] Lwd.t ->
    [>`Arabicform] attrib
  val a_lang : uri Lwd.t -> [>`Lang] attrib
  val a_u1 : uri Lwd.t -> [>`U1] attrib
  val a_u2 : uri Lwd.t -> [>`U2] attrib
  val a_g1 : uri Lwd.t -> [>`G1] attrib
  val a_g2 : uri Lwd.t -> [>`G2] attrib
  val a_k : uri Lwd.t -> [>`K] attrib
  val a_font_family : uri Lwd.t -> [>`Font_Family] attrib
  val a_font_style : uri Lwd.t -> [>`Font_Style] attrib
  val a_font_variant : uri Lwd.t -> [>`Font_Variant] attrib
  val a_font_weight : uri Lwd.t -> [>`Font_Weight] attrib
  val a_font_stretch : uri Lwd.t -> [>`Font_Stretch] attrib
  val a_font_size : uri Lwd.t -> [>`Font_Size] attrib
  val a_unicode_range : uri Lwd.t -> [>`UnicodeRange] attrib
  val a_units_per_em : uri Lwd.t -> [>`UnitsPerEm] attrib
  val a_stemv : float Lwd.t -> [>`Stemv] attrib
  val a_stemh : float Lwd.t -> [>`Stemh] attrib
  val a_slope : float Lwd.t -> [>`Slope] attrib
  val a_cap_height : float Lwd.t -> [>`CapHeight] attrib
  val a_x_height : float Lwd.t -> [>`XHeight] attrib
  val a_accent_height : float Lwd.t -> [>`AccentHeight] attrib
  val a_ascent : float Lwd.t -> [>`Ascent] attrib
  val a_widths : uri Lwd.t -> [>`Widths] attrib
  val a_bbox : uri Lwd.t -> [>`Bbox] attrib
  val a_ideographic : float Lwd.t -> [>`Ideographic] attrib
  val a_alphabetic : float Lwd.t -> [>`Alphabetic] attrib
  val a_mathematical : float Lwd.t -> [>`Mathematical] attrib
  val a_hanging : float Lwd.t -> [>`Hanging] attrib
  val a_videographic : float Lwd.t -> [>`VIdeographic] attrib
  val a_v_alphabetic : float Lwd.t -> [>`VAlphabetic] attrib
  val a_v_mathematical : float Lwd.t -> [>`VMathematical] attrib
  val a_v_hanging : float Lwd.t -> [>`VHanging] attrib
  val a_underline_position : float Lwd.t -> [>`UnderlinePosition] attrib
  val a_underline_thickness : float Lwd.t -> [>`UnderlineThickness] attrib
  val a_strikethrough_position : float Lwd.t -> [>`StrikethroughPosition] attrib
  val a_strikethrough_thickness : float Lwd.t -> [>`StrikethroughThickness] attrib
  val a_overline_position : float Lwd.t -> [>`OverlinePosition] attrib
  val a_overline_thickness : float Lwd.t -> [>`OverlineThickness] attrib
  val a_string : uri Lwd.t -> [>`String] attrib
  val a_name : uri Lwd.t -> [>`Name] attrib
  val a_alignment_baseline :
    [<`After_edge|`Alphabetic|`Auto|`Baseline|`Before_edge|`Central|`Hanging
    |`Ideographic|`Inherit|`Mathematical|`Middle
    |`Text_after_edge|`Text_before_edge] Lwd.t -> [>`Alignment_Baseline] attrib
  val a_dominant_baseline :
    [<`Alphabetic|`Auto|`Central|`Hanging|`Ideographic|`Inherit
    |`Mathematical|`Middle|`No_change|`Reset_size|`Text_after_edge
    |`Text_before_edge|`Use_script] Lwd.t -> [>`Dominant_Baseline] attrib
  val a_stop_color : uri Lwd.t -> [>`Stop_Color] attrib
  val a_stop_opacity : float Lwd.t -> [>`Stop_Opacity] attrib
  val a_stroke : paint Lwd.t -> [>`Stroke] attrib
  val a_stroke_width : Unit.length Lwd.t -> [>`Stroke_Width] attrib
  val a_stroke_linecap : [<`Butt|`Round|`Square] Lwd.t -> [>`Stroke_Linecap] attrib
  val a_stroke_linejoin : [<`Bever|`Miter|`Round] Lwd.t -> [>`Stroke_Linejoin] attrib
  val a_stroke_miterlimit : float Lwd.t -> [>`Stroke_Miterlimit] attrib
  val a_stroke_dasharray : Unit.length list Lwd.t -> [>`Stroke_Dasharray] attrib
  val a_stroke_dashoffset : Unit.length Lwd.t -> [>`Stroke_Dashoffset] attrib
  val a_stroke_opacity : float Lwd.t -> [>`Stroke_Opacity] attrib
  val a_onabort : Xml.event_handler -> [>`OnAbort] attrib
  val a_onactivate : Xml.event_handler -> [>`OnActivate] attrib
  val a_onbegin : Xml.event_handler -> [>`OnBegin] attrib
  val a_onend : Xml.event_handler -> [>`OnEnd] attrib
  val a_onerror : Xml.event_handler -> [>`OnError] attrib
  val a_onfocusin : Xml.event_handler -> [>`OnFocusIn] attrib
  val a_onfocusout : Xml.event_handler -> [>`OnFocusOut] attrib
  val a_onrepeat : Xml.event_handler -> [>`OnRepeat] attrib
  val a_onresize : Xml.event_handler -> [>`OnResize] attrib
  val a_onscroll : Xml.event_handler -> [>`OnScroll] attrib
  val a_onunload : Xml.event_handler -> [>`OnUnload] attrib
  val a_onzoom : Xml.event_handler -> [>`OnZoom] attrib
  val a_onclick : Xml.mouse_event_handler -> [>`OnClick] attrib
  val a_onmousedown : Xml.mouse_event_handler -> [>`OnMouseDown] attrib
  val a_onmouseup : Xml.mouse_event_handler -> [>`OnMouseUp] attrib
  val a_onmouseover : Xml.mouse_event_handler -> [>`OnMouseOver] attrib
  val a_onmouseout : Xml.mouse_event_handler -> [>`OnMouseOut] attrib
  val a_onmousemove : Xml.mouse_event_handler -> [>`OnMouseMove] attrib
  val a_ontouchstart : Xml.touch_event_handler -> [>`OnTouchStart] attrib
  val a_ontouchend : Xml.touch_event_handler -> [>`OnTouchEnd] attrib
  val a_ontouchmove : Xml.touch_event_handler -> [>`OnTouchMove] attrib
  val a_ontouchcancel : Xml.touch_event_handler -> [>`OnTouchCancel] attrib
  val txt : uri Lwd.t -> [>txt] elt
  val svg : ([<svg_attr], [<svg_content], [>svg]) star
  val g : ([<g_attr], [<g_content], [>g]) star
  val defs : ([<defs_attr], [<defs_content], [>defs]) star
  val desc : ([<desc_attr], [<desc_content], [>desc]) unary
  val title : ([<desc_attr], [<title_content], [>title]) unary
  val symbol : ([<symbol_attr], [<symbol_content], [>symbol]) star
  val use : ([<use_attr], [<use_content], [>use]) star
  val image : ([<image_attr], [<image_content], [>image]) star
  val switch : ([<switch_attr], [<switch_content], [>switch]) star
  val style : ([<style_attr], [<style_content], [>style]) unary
  val path : ([<path_attr], [<path_content], [>path]) star
  val rect : ([<rect_attr], [<rect_content], [>rect]) star
  val circle : ([<circle_attr], [<circle_content], [>circle]) star
  val ellipse : ([<ellipse_attr], [<ellipse_content], [>ellipse]) star
  val line : ([<line_attr], [<line_content], [>line]) star
  val polyline : ([<polyline_attr], [<polyline_content], [>polyline]) star
  val polygon : ([<polygon_attr], [<polygon_content], [>polygon]) star
  val text : ([<text_attr], [<text_content], [>text]) star
  val tspan : ([<tspan_attr], [<tspan_content], [>tspan]) star
  val textPath : ([<textpath_attr], [<textpath_content], [>textpath]) star
  val marker : ([<marker_attr], [<marker_content], [>marker]) star
  val linearGradient :
    ([<lineargradient_attr], [<lineargradient_content], [>lineargradient]) star
  val radialGradient :
    ([<radialgradient_attr], [<radialgradient_content], [>radialgradient]) star
  val stop : ([<stop_attr], [<stop_content], [>stop]) star
  val pattern : ([<pattern_attr], [<pattern_content], [>pattern]) star
  val clipPath : ([<clippath_attr], [<clippath_content], [>clippath]) star
  val filter : ([<filter_attr], [<filter_content], [>filter]) star
  val feDistantLight :
    ([<fedistantlight_attr], [<fedistantlight_content], [>fedistantlight]) star
  val fePointLight :
    ([<fepointlight_attr], [<fepointlight_content], [>fepointlight]) star
  val feSpotLight :
    ([<fespotlight_attr], [<fespotlight_content], [>fespotlight]) star
  val feBlend : ([<feblend_attr], [<feblend_content], [>feblend]) star
  val feColorMatrix :
    ([<fecolormatrix_attr], [<fecolormatrix_content], [>fecolormatrix]) star
  val feComponentTransfer :
    ([<fecomponenttransfer_attr], [<fecomponenttransfer_content],
     [>fecomponenttransfer]) star
  val feFuncA : ([<fefunca_attr], [<fefunca_content], [>fefunca]) star
  val feFuncG : ([<fefuncg_attr], [<fefuncg_content], [>fefuncg]) star
  val feFuncB : ([<fefuncb_attr], [<fefuncb_content], [>fefuncb]) star
  val feFuncR : ([<fefuncr_attr], [<fefuncr_content], [>fefuncr]) star
  val feComposite :
    ([<fecomposite_attr], [<fecomposite_content], [>fecomposite]) star
  val feConvolveMatrix :
    ([<feconvolvematrix_attr], [<feconvolvematrix_content],
     [>feconvolvematrix]) star
  val feDiffuseLighting :
    ([<fediffuselighting_attr], [<fediffuselighting_content],
     [>fediffuselighting]) star
  val feDisplacementMap :
    ([<fedisplacementmap_attr], [<fedisplacementmap_content],
     [>fedisplacementmap]) star
  val feFlood : ([<feflood_attr], [<feflood_content], [>feflood]) star
  val feGaussianBlur :
    ([<fegaussianblur_attr], [<fegaussianblur_content], [>fegaussianblur]) star
  val feImage : ([<feimage_attr], [<feimage_content], [>feimage]) star
  val feMerge : ([<femerge_attr], [<femerge_content], [>femerge]) star
  val feMorphology :
    ([<femorphology_attr], [<femorphology_content], [>femorphology]) star
  val feOffset :
    ([<feoffset_attr], [<feoffset_content], [>feoffset]) star
  val feSpecularLighting :
    ([<fespecularlighting_attr], [<fespecularlighting_content],
     [>fespecularlighting]) star
  val feTile : ([<fetile_attr], [<fetile_content], [>fetile]) star
  val feTurbulence :
    ([<feturbulence_attr], [<feturbulence_content], [>feturbulence]) star
  val cursor :
    ([<cursor_attr], [<descriptive_element], [>cursor]) star
  val a : ([<a_attr], [<a_content], [>a]) star
  val view : ([<view_attr], [<descriptive_element], [>view]) star
  val script : ([<script_attr], [<script_content], [>script]) unary
  val animate : ([<animate_attr], [<descriptive_element], [>animate]) star
  val animation : ([<animation_attr], [<descriptive_element], [>animation]) star
  [@@ocaml.warning "-3"]
  val set : ([<set_attr], [<descriptive_element], [>set]) star
  val animateMotion :
    ([<animatemotion_attr], [<animatemotion_content], [>animatemotion]) star
  val mpath :
    ([<mpath_attr], [<descriptive_element], [>mpath]) star
  val animateColor :
    ([<animatecolor_attr], [<descriptive_element], [>animatecolor]) star
  val animateTransform :
    ([<animatetransform_attr], [<descriptive_element],
     [>animatetransform]) star
  val metadata : ?a:metadata_attr attrib list -> Xml.elt list -> [>metadata] elt
  val foreignObject : ?a:foreignobject_attr attrib list -> Xml.elt list -> [>foreignobject] elt


  (* val pcdata : string Lwd.t -> [>txt] elt *)
  (* val of_seq : Xml_stream.signal Seq.t -> 'a elt list *)
  val tot : Xml.elt -> 'a elt
  (* val totl : Xml.elt list -> 'a elt list *)
  val toelt : 'a elt -> Xml.elt
  (* val toeltl : 'a elt list -> Xml.elt list *)
  val doc_toelt : doc -> Xml.elt
  val to_xmlattribs : 'a attrib list -> Xml.attrib list
  val to_attrib : Xml.attrib -> 'a attrib

  (*module Unsafe : sig
    val data : string Lwd.t -> 'a elt
    val node : string -> ?a:'a attrib list -> 'b elt list -> 'c elt
    val leaf : string -> ?a:'a attrib list -> unit -> 'b elt
    val coerce_elt : 'a elt -> 'b elt
    val string_attrib : string -> string Lwd.t -> 'a attrib
    val float_attrib : string -> float Lwd.t -> 'a attrib
    val int_attrib : string -> int Lwd.t -> 'a attrib
    val uri_attrib : string -> Xml.uri Lwd.t -> 'a attrib
    val space_sep_attrib : string -> string list Lwd.t -> 'a attrib
    val comma_sep_attrib : string -> string list Lwd.t -> 'a attrib
  end*)
end = struct
  type +'a elt = 'a node live
  type doc = [`Svg] elt
  type nonrec +'a attrib = 'a attrib

  module Xml = Xml
  type ('a, 'b) nullary = ?a:'a attrib list -> unit -> 'b elt
  type ('a, 'b, 'c) unary = ?a:'a attrib list -> 'b elt -> 'c elt
  type ('a, 'b, 'c) star = ?a:'a attrib list -> 'b elt list -> 'c elt

  module Info = Raw_svg.Info

  type uri = string

  let string_of_uri                = Raw_svg.string_of_uri
  let uri_of_string                = Raw_svg.uri_of_string
  let a_x                          = Raw_svg.a_x
  let a_y                          = Raw_svg.a_y
  let a_width                      = Raw_svg.a_width
  let a_height                     = Raw_svg.a_height
  let a_preserveAspectRatio        = Raw_svg.a_preserveAspectRatio
  let a_zoomAndPan                 = Raw_svg.a_zoomAndPan
  let a_href                       = Raw_svg.a_href
  let a_requiredExtensions         = Raw_svg.a_requiredExtensions
  let a_systemLanguage             = Raw_svg.a_systemLanguage
  let a_externalRessourcesRequired = Raw_svg.a_externalRessourcesRequired
  let a_id                         = Raw_svg.a_id
  let a_user_data                  = Raw_svg.a_user_data
  let a_xml_lang                   = Raw_svg.a_xml_lang
  let a_type                       = Raw_svg.a_type
  let a_media                      = Raw_svg.a_media
  let a_class                      = Raw_svg.a_class
  let a_style                      = Raw_svg.a_style
  let a_transform                  = Raw_svg.a_transform
  let a_viewBox                    = Raw_svg.a_viewBox
  let a_d                          = Raw_svg.a_d
  let a_pathLength                 = Raw_svg.a_pathLength
  let a_rx                         = Raw_svg.a_rx
  let a_ry                         = Raw_svg.a_ry
  let a_cx                         = Raw_svg.a_cx
  let a_cy                         = Raw_svg.a_cy
  let a_r                          = Raw_svg.a_r
  let a_x1                         = Raw_svg.a_x1
  let a_y1                         = Raw_svg.a_y1
  let a_x2                         = Raw_svg.a_x2
  let a_y2                         = Raw_svg.a_y2
  let a_points                     = Raw_svg.a_points
  let a_x_list                     = Raw_svg.a_x_list
  let a_y_list                     = Raw_svg.a_y_list
  let a_dx                         = Raw_svg.a_dx
  let a_dy                         = Raw_svg.a_dy
  let a_dx_list                    = Raw_svg.a_dx_list
  let a_dy_list                    = Raw_svg.a_dy_list
  let a_lengthAdjust               = Raw_svg.a_lengthAdjust
  let a_textLength                 = Raw_svg.a_textLength
  let a_text_anchor                = Raw_svg.a_text_anchor
  let a_text_decoration            = Raw_svg.a_text_decoration
  let a_text_rendering             = Raw_svg.a_text_rendering
  let a_rotate                     = Raw_svg.a_rotate
  let a_startOffset                = Raw_svg.a_startOffset
  let a_method                     = Raw_svg.a_method
  let a_spacing                    = Raw_svg.a_spacing
  let a_glyphRef                   = Raw_svg.a_glyphRef
  let a_format                     = Raw_svg.a_format
  let a_markerUnits                = Raw_svg.a_markerUnits
  let a_refX                       = Raw_svg.a_refX
  let a_refY                       = Raw_svg.a_refY
  let a_markerWidth                = Raw_svg.a_markerWidth
  let a_markerHeight               = Raw_svg.a_markerHeight
  let a_orient                     = Raw_svg.a_orient
  let a_local                      = Raw_svg.a_local
  let a_rendering_intent           = Raw_svg.a_rendering_intent
  let a_gradientUnits              = Raw_svg.a_gradientUnits
  let a_gradientTransform          = Raw_svg.a_gradientTransform
  let a_spreadMethod               = Raw_svg.a_spreadMethod
  let a_fx                         = Raw_svg.a_fx
  let a_fy                         = Raw_svg.a_fy
  let a_offset                     = Raw_svg.a_offset
  let a_patternUnits               = Raw_svg.a_patternUnits
  let a_patternContentUnits        = Raw_svg.a_patternContentUnits
  let a_patternTransform           = Raw_svg.a_patternTransform
  let a_clipPathUnits              = Raw_svg.a_clipPathUnits
  let a_maskUnits                  = Raw_svg.a_maskUnits
  let a_maskContentUnits           = Raw_svg.a_maskContentUnits
  let a_primitiveUnits             = Raw_svg.a_primitiveUnits
  let a_filterRes                  = Raw_svg.a_filterRes
  let a_result                     = Raw_svg.a_result
  let a_in                         = Raw_svg.a_in
  let a_in2                        = Raw_svg.a_in2
  let a_azimuth                    = Raw_svg.a_azimuth
  let a_elevation                  = Raw_svg.a_elevation
  let a_pointsAtX                  = Raw_svg.a_pointsAtX
  let a_pointsAtY                  = Raw_svg.a_pointsAtY
  let a_pointsAtZ                  = Raw_svg.a_pointsAtZ
  let a_specularExponent           = Raw_svg.a_specularExponent
  let a_specularConstant           = Raw_svg.a_specularConstant
  let a_limitingConeAngle          = Raw_svg.a_limitingConeAngle
  let a_mode                       = Raw_svg.a_mode
  let a_feColorMatrix_type         = Raw_svg.a_feColorMatrix_type
  let a_values                     = Raw_svg.a_values
  let a_transfer_type              = Raw_svg.a_transfer_type
  let a_tableValues                = Raw_svg.a_tableValues
  let a_intercept                  = Raw_svg.a_intercept
  let a_amplitude                  = Raw_svg.a_amplitude
  let a_exponent                   = Raw_svg.a_exponent
  let a_transfer_offset            = Raw_svg.a_transfer_offset
  let a_feComposite_operator       = Raw_svg.a_feComposite_operator
  let a_k1                         = Raw_svg.a_k1
  let a_k2                         = Raw_svg.a_k2
  let a_k3                         = Raw_svg.a_k3
  let a_k4                         = Raw_svg.a_k4
  let a_order                      = Raw_svg.a_order
  let a_kernelMatrix               = Raw_svg.a_kernelMatrix
  let a_divisor                    = Raw_svg.a_divisor
  let a_bias                       = Raw_svg.a_bias
  let a_kernelUnitLength           = Raw_svg.a_kernelUnitLength
  let a_targetX                    = Raw_svg.a_targetX
  let a_targetY                    = Raw_svg.a_targetY
  let a_edgeMode                   = Raw_svg.a_edgeMode
  let a_preserveAlpha              = Raw_svg.a_preserveAlpha
  let a_surfaceScale               = Raw_svg.a_surfaceScale
  let a_diffuseConstant            = Raw_svg.a_diffuseConstant
  let a_scale                      = Raw_svg.a_scale
  let a_xChannelSelector           = Raw_svg.a_xChannelSelector
  let a_yChannelSelector           = Raw_svg.a_yChannelSelector
  let a_stdDeviation               = Raw_svg.a_stdDeviation
  let a_feMorphology_operator      = Raw_svg.a_feMorphology_operator
  let a_radius                     = Raw_svg.a_radius
  let a_baseFrenquency             = Raw_svg.a_baseFrenquency
  let a_numOctaves                 = Raw_svg.a_numOctaves
  let a_seed                       = Raw_svg.a_seed
  let a_stitchTiles                = Raw_svg.a_stitchTiles
  let a_feTurbulence_type          = Raw_svg.a_feTurbulence_type
  let a_target                     = Raw_svg.a_target
  let a_attributeName              = Raw_svg.a_attributeName
  let a_attributeType              = Raw_svg.a_attributeType
  let a_begin                      = Raw_svg.a_begin
  let a_dur                        = Raw_svg.a_dur
  let a_min                        = Raw_svg.a_min
  let a_max                        = Raw_svg.a_max
  let a_restart                    = Raw_svg.a_restart
  let a_repeatCount                = Raw_svg.a_repeatCount
  let a_repeatDur                  = Raw_svg.a_repeatDur
  let a_fill                       = Raw_svg.a_fill
  let a_animation_fill             = Raw_svg.a_animation_fill
  let a_calcMode                   = Raw_svg.a_calcMode
  let a_animation_values           = Raw_svg.a_animation_values
  let a_keyTimes                   = Raw_svg.a_keyTimes
  let a_keySplines                 = Raw_svg.a_keySplines
  let a_from                       = Raw_svg.a_from
  let a_to                         = Raw_svg.a_to
  let a_by                         = Raw_svg.a_by
  let a_additive                   = Raw_svg.a_additive
  let a_accumulate                 = Raw_svg.a_accumulate
  let a_keyPoints                  = Raw_svg.a_keyPoints
  let a_path                       = Raw_svg.a_path
  let a_animateTransform_type      = Raw_svg.a_animateTransform_type
  let a_horiz_origin_x             = Raw_svg.a_horiz_origin_x
  let a_horiz_origin_y             = Raw_svg.a_horiz_origin_y
  let a_horiz_adv_x                = Raw_svg.a_horiz_adv_x
  let a_vert_origin_x              = Raw_svg.a_vert_origin_x
  let a_vert_origin_y              = Raw_svg.a_vert_origin_y
  let a_vert_adv_y                 = Raw_svg.a_vert_adv_y
  let a_unicode                    = Raw_svg.a_unicode
  let a_glyph_name                 = Raw_svg.a_glyph_name
  let a_orientation                = Raw_svg.a_orientation
  let a_arabic_form                = Raw_svg.a_arabic_form
  let a_lang                       = Raw_svg.a_lang
  let a_u1                         = Raw_svg.a_u1
  let a_u2                         = Raw_svg.a_u2
  let a_g1                         = Raw_svg.a_g1
  let a_g2                         = Raw_svg.a_g2
  let a_k                          = Raw_svg.a_k
  let a_font_family                = Raw_svg.a_font_family
  let a_font_style                 = Raw_svg.a_font_style
  let a_font_variant               = Raw_svg.a_font_variant
  let a_font_weight                = Raw_svg.a_font_weight
  let a_font_stretch               = Raw_svg.a_font_stretch
  let a_font_size                  = Raw_svg.a_font_size
  let a_unicode_range              = Raw_svg.a_unicode_range
  let a_units_per_em               = Raw_svg.a_units_per_em
  let a_stemv                      = Raw_svg.a_stemv
  let a_stemh                      = Raw_svg.a_stemh
  let a_slope                      = Raw_svg.a_slope
  let a_cap_height                 = Raw_svg.a_cap_height
  let a_x_height                   = Raw_svg.a_x_height
  let a_accent_height              = Raw_svg.a_accent_height
  let a_ascent                     = Raw_svg.a_ascent
  let a_widths                     = Raw_svg.a_widths
  let a_bbox                       = Raw_svg.a_bbox
  let a_ideographic                = Raw_svg.a_ideographic
  let a_alphabetic                 = Raw_svg.a_alphabetic
  let a_mathematical               = Raw_svg.a_mathematical
  let a_hanging                    = Raw_svg.a_hanging
  let a_videographic               = Raw_svg.a_videographic
  let a_v_alphabetic               = Raw_svg.a_v_alphabetic
  let a_v_mathematical             = Raw_svg.a_v_mathematical
  let a_v_hanging                  = Raw_svg.a_v_hanging
  let a_underline_position         = Raw_svg.a_underline_position
  let a_underline_thickness        = Raw_svg.a_underline_thickness
  let a_strikethrough_position     = Raw_svg.a_strikethrough_position
  let a_strikethrough_thickness    = Raw_svg.a_strikethrough_thickness
  let a_overline_position          = Raw_svg.a_overline_position
  let a_overline_thickness         = Raw_svg.a_overline_thickness
  let a_string                     = Raw_svg.a_string
  let a_name                       = Raw_svg.a_name
  let a_alignment_baseline         = Raw_svg.a_alignment_baseline
  let a_dominant_baseline          = Raw_svg.a_dominant_baseline
  let a_stop_color                 = Raw_svg.a_stop_color
  let a_stop_opacity               = Raw_svg.a_stop_opacity
  let a_stroke                     = Raw_svg.a_stroke
  let a_stroke_width               = Raw_svg.a_stroke_width
  let a_stroke_linecap             = Raw_svg.a_stroke_linecap
  let a_stroke_linejoin            = Raw_svg.a_stroke_linejoin
  let a_stroke_miterlimit          = Raw_svg.a_stroke_miterlimit
  let a_stroke_dasharray           = Raw_svg.a_stroke_dasharray
  let a_stroke_dashoffset          = Raw_svg.a_stroke_dashoffset
  let a_stroke_opacity             = Raw_svg.a_stroke_opacity
  let a_onabort                    = Raw_svg.a_onabort
  let a_onactivate                 = Raw_svg.a_onactivate
  let a_onbegin                    = Raw_svg.a_onbegin
  let a_onend                      = Raw_svg.a_onend
  let a_onerror                    = Raw_svg.a_onerror
  let a_onfocusin                  = Raw_svg.a_onfocusin
  let a_onfocusout                 = Raw_svg.a_onfocusout
  let a_onrepeat                   = Raw_svg.a_onrepeat
  let a_onresize                   = Raw_svg.a_onresize
  let a_onscroll                   = Raw_svg.a_onscroll
  let a_onunload                   = Raw_svg.a_onunload
  let a_onzoom                     = Raw_svg.a_onzoom
  let a_onclick                    = Raw_svg.a_onclick
  let a_onmousedown                = Raw_svg.a_onmousedown
  let a_onmouseup                  = Raw_svg.a_onmouseup
  let a_onmouseover                = Raw_svg.a_onmouseover
  let a_onmouseout                 = Raw_svg.a_onmouseout
  let a_onmousemove                = Raw_svg.a_onmousemove
  let a_ontouchstart               = Raw_svg.a_ontouchstart
  let a_ontouchend                 = Raw_svg.a_ontouchend
  let a_ontouchmove                = Raw_svg.a_ontouchmove
  let a_ontouchcancel              = Raw_svg.a_ontouchcancel

  let unary (f: ('a, 'b, 'c) Raw_svg.unary) : ('a, 'b, 'c) unary =
    fun ?a elt -> f ?a (Lwd.pure elt)

  let star (f: ('a, 'b, 'c) Raw_svg.star) : ('a, 'b, 'c) star =
    fun ?a elts -> f ?a (List.map Lwd.pure elts)

  let txt                          = Raw_svg.txt
  let svg                          = star Raw_svg.svg
  let g                            = star Raw_svg.g
  let defs                         = star Raw_svg.defs
  let desc                         = unary Raw_svg.desc
  let title                        = unary Raw_svg.title
  let symbol                       = star Raw_svg.symbol
  let use                          = star Raw_svg.use
  let image                        = star Raw_svg.image
  let switch                       = star Raw_svg.switch
  let style                        = unary Raw_svg.style
  let path                         = star Raw_svg.path
  let rect                         = star Raw_svg.rect
  let circle                       = star Raw_svg.circle
  let ellipse                      = star Raw_svg.ellipse
  let line                         = star Raw_svg.line
  let polyline                     = star Raw_svg.polyline
  let polygon                      = star Raw_svg.polygon
  let text                         = star Raw_svg.text
  let tspan                        = star Raw_svg.tspan
  let textPath                     = star Raw_svg.textPath
  let marker                       = star Raw_svg.marker
  let linearGradient               = star Raw_svg.linearGradient
  let radialGradient               = star Raw_svg.radialGradient
  let stop                         = star Raw_svg.stop
  let pattern                      = star Raw_svg.pattern
  let clipPath                     = star Raw_svg.clipPath
  let filter                       = star Raw_svg.filter
  let feDistantLight               = star Raw_svg.feDistantLight
  let fePointLight                 = star Raw_svg.fePointLight
  let feSpotLight                  = star Raw_svg.feSpotLight
  let feBlend                      = star Raw_svg.feBlend
  let feColorMatrix                = star Raw_svg.feColorMatrix
  let feComponentTransfer          = star Raw_svg.feComponentTransfer
  let feFuncA                      = star Raw_svg.feFuncA
  let feFuncG                      = star Raw_svg.feFuncG
  let feFuncB                      = star Raw_svg.feFuncB
  let feFuncR                      = star Raw_svg.feFuncR
  let feComposite                  = star Raw_svg.feComposite
  let feConvolveMatrix             = star Raw_svg.feConvolveMatrix
  let feDiffuseLighting            = star Raw_svg.feDiffuseLighting
  let feDisplacementMap            = star Raw_svg.feDisplacementMap
  let feFlood                      = star Raw_svg.feFlood
  let feGaussianBlur               = star Raw_svg.feGaussianBlur
  let feImage                      = star Raw_svg.feImage
  let feMerge                      = star Raw_svg.feMerge
  let feMorphology                 = star Raw_svg.feMorphology
  let feOffset                     = star Raw_svg.feOffset
  let feSpecularLighting           = star Raw_svg.feSpecularLighting
  let feTile                       = star Raw_svg.feTile
  let feTurbulence                 = star Raw_svg.feTurbulence
  let cursor                       = star Raw_svg.cursor
  let a                            = star Raw_svg.a
  let view                         = star Raw_svg.view
  let script                       = unary Raw_svg.script
  let animate                      = star Raw_svg.animate
  let animation                    = star Raw_svg.animation
  [@@ocaml.warning "-3"]
  let set                          = star Raw_svg.set
  let animateMotion                = star Raw_svg.animateMotion
  let mpath                        = star Raw_svg.mpath
  let animateColor                 = star Raw_svg.animateColor
  let animateTransform             = star Raw_svg.animateTransform
  let metadata                     = star Raw_svg.metadata
  let foreignObject                = star Raw_svg.foreignObject
  (* let of_seq = Raw_svg.of_seq *)
  let tot = Raw_svg.tot
  (* let totl = Raw_svg.totl *)
  let toelt = Raw_svg.toelt
  (* let toeltl = Raw_svg.toeltl *)
  let doc_toelt = Raw_svg.doc_toelt
  let to_xmlattribs = Raw_svg.to_xmlattribs
  let to_attrib = Raw_svg.to_attrib
end

module Raw_html = Html_f.Make(Xml)(Raw_svg)

open Html_types
module Html : sig
  type 'a elt = 'a node live
  type doc = html elt
  type nonrec +'a attrib = 'a attrib
  type ('a, 'b) nullary = ?a:'a attrib list -> unit -> 'b elt
  type ('a, 'b, 'c) unary = ?a:'a attrib list -> 'b elt -> 'c elt
  type ('a, 'b, 'c) star = ?a:'a attrib list -> 'b elt list -> 'c elt
  module Info : Xml_sigs.Info

  val string_of_uri : Xml.uri -> string
  val uri_of_string : string -> Xml.uri
  val a_class : nmtokens Lwd.t -> [>`Class] attrib
  val a_user_data : string -> string Lwd.t -> [>`User_data] attrib
  val a_id : string Lwd.t -> [>`Id] attrib
  val a_title : string Lwd.t -> [>`Title] attrib
  val a_xml_lang : string Lwd.t -> [>`XML_lang] attrib
  val a_lang : string Lwd.t -> [>`Lang] attrib
  val a_onabort : Xml.event_handler -> [>`OnAbort] attrib
  val a_onafterprint : Xml.event_handler -> [>`OnAfterPrint] attrib
  val a_onbeforeprint : Xml.event_handler -> [>`OnBeforePrint] attrib
  val a_onbeforeunload : Xml.event_handler -> [>`OnBeforeUnload] attrib
  val a_onblur : Xml.event_handler -> [>`OnBlur] attrib
  val a_oncanplay : Xml.event_handler -> [>`OnCanPlay] attrib
  val a_oncanplaythrough : Xml.event_handler -> [>`OnCanPlayThrough] attrib
  val a_onchange : Xml.event_handler -> [>`OnChange] attrib
  val a_ondurationchange : Xml.event_handler -> [>`OnDurationChange] attrib
  val a_onemptied : Xml.event_handler -> [>`OnEmptied] attrib
  val a_onended : Xml.event_handler -> [>`OnEnded] attrib
  val a_onerror : Xml.event_handler -> [>`OnError] attrib
  val a_onfocus : Xml.event_handler -> [>`OnFocus] attrib
  val a_onformchange : Xml.event_handler -> [>`OnFormChange] attrib
  val a_onforminput : Xml.event_handler -> [>`OnFormInput] attrib
  val a_onhashchange : Xml.event_handler -> [>`OnHashChange] attrib
  val a_oninput : Xml.event_handler -> [>`OnInput] attrib
  val a_oninvalid : Xml.event_handler -> [>`OnInvalid] attrib
  val a_onmousewheel : Xml.event_handler -> [>`OnMouseWheel] attrib
  val a_onoffline : Xml.event_handler -> [>`OnOffLine] attrib
  val a_ononline : Xml.event_handler -> [>`OnOnLine] attrib
  val a_onpause : Xml.event_handler -> [>`OnPause] attrib
  val a_onplay : Xml.event_handler -> [>`OnPlay] attrib
  val a_onplaying : Xml.event_handler -> [>`OnPlaying] attrib
  val a_onpagehide : Xml.event_handler -> [>`OnPageHide] attrib
  val a_onpageshow : Xml.event_handler -> [>`OnPageShow] attrib
  val a_onpopstate : Xml.event_handler -> [>`OnPopState] attrib
  val a_onprogress : Xml.event_handler -> [>`OnProgress] attrib
  val a_onratechange : Xml.event_handler -> [>`OnRateChange] attrib
  val a_onreadystatechange : Xml.event_handler -> [>`OnReadyStateChange] attrib
  val a_onredo : Xml.event_handler -> [>`OnRedo] attrib
  val a_onresize : Xml.event_handler -> [>`OnResize] attrib
  val a_onscroll : Xml.event_handler -> [>`OnScroll] attrib
  val a_onseeked : Xml.event_handler -> [>`OnSeeked] attrib
  val a_onseeking : Xml.event_handler -> [>`OnSeeking] attrib
  val a_onselect : Xml.event_handler -> [>`OnSelect] attrib
  val a_onshow : Xml.event_handler -> [>`OnShow] attrib
  val a_onstalled : Xml.event_handler -> [>`OnStalled] attrib
  val a_onstorage : Xml.event_handler -> [>`OnStorage] attrib
  val a_onsubmit : Xml.event_handler -> [>`OnSubmit] attrib
  val a_onsuspend : Xml.event_handler -> [>`OnSuspend] attrib
  val a_ontimeupdate : Xml.event_handler -> [>`OnTimeUpdate] attrib
  val a_onundo : Xml.event_handler -> [>`OnUndo] attrib
  val a_onunload : Xml.event_handler -> [>`OnUnload] attrib
  val a_onvolumechange : Xml.event_handler -> [>`OnVolumeChange] attrib
  val a_onwaiting : Xml.event_handler -> [>`OnWaiting] attrib
  val a_onload : Xml.event_handler -> [>`OnLoad] attrib
  val a_onloadeddata : Xml.event_handler -> [>`OnLoadedData] attrib
  val a_onloadedmetadata : Xml.event_handler -> [>`OnLoadedMetaData] attrib
  val a_onloadstart : Xml.event_handler -> [>`OnLoadStart] attrib
  val a_onmessage : Xml.event_handler -> [>`OnMessage] attrib
  val a_onclick : Xml.mouse_event_handler -> [>`OnClick] attrib
  val a_oncontextmenu : Xml.mouse_event_handler -> [>`OnContextMenu] attrib
  val a_ondblclick : Xml.mouse_event_handler -> [>`OnDblClick] attrib
  val a_ondrag : Xml.mouse_event_handler -> [>`OnDrag] attrib
  val a_ondragend : Xml.mouse_event_handler -> [>`OnDragEnd] attrib
  val a_ondragenter : Xml.mouse_event_handler -> [>`OnDragEnter] attrib
  val a_ondragleave : Xml.mouse_event_handler -> [>`OnDragLeave] attrib
  val a_ondragover : Xml.mouse_event_handler -> [>`OnDragOver] attrib
  val a_ondragstart : Xml.mouse_event_handler -> [>`OnDragStart] attrib
  val a_ondrop : Xml.mouse_event_handler -> [>`OnDrop] attrib
  val a_onmousedown : Xml.mouse_event_handler -> [>`OnMouseDown] attrib
  val a_onmouseup : Xml.mouse_event_handler -> [>`OnMouseUp] attrib
  val a_onmouseover : Xml.mouse_event_handler -> [>`OnMouseOver] attrib
  val a_onmousemove : Xml.mouse_event_handler -> [>`OnMouseMove] attrib
  val a_onmouseout : Xml.mouse_event_handler -> [>`OnMouseOut] attrib
  val a_ontouchstart : Xml.touch_event_handler -> [>`OnTouchStart] attrib
  val a_ontouchend : Xml.touch_event_handler -> [>`OnTouchEnd] attrib
  val a_ontouchmove : Xml.touch_event_handler -> [>`OnTouchMove] attrib
  val a_ontouchcancel : Xml.touch_event_handler -> [>`OnTouchCancel] attrib
  val a_onkeypress : Xml.keyboard_event_handler -> [>`OnKeyPress] attrib
  val a_onkeydown : Xml.keyboard_event_handler -> [>`OnKeyDown] attrib
  val a_onkeyup : Xml.keyboard_event_handler -> [>`OnKeyUp] attrib
  val a_allowfullscreen : unit -> [>`Allowfullscreen] attrib
  val a_allowpaymentrequest : unit -> [>`Allowpaymentrequest] attrib
  val a_autocomplete : autocomplete_option Lwd.t -> [>`Autocomplete] attrib
  val a_async : unit -> [>`Async] attrib
  val a_autofocus : unit -> [>`Autofocus] attrib
  val a_autoplay : unit -> [>`Autoplay] attrib
  val a_muted : unit -> [>`Muted] attrib
  val a_crossorigin :
    [<`Anonymous|`Use_credentials] Lwd.t -> [>`Crossorigin] attrib
  val a_integrity : string Lwd.t -> [>`Integrity] attrib
  val a_mediagroup : string Lwd.t -> [>`Mediagroup] attrib
  val a_challenge : string Lwd.t -> [>`Challenge] attrib
  val a_contenteditable : bool Lwd.t -> [>`Contenteditable] attrib
  val a_contextmenu : string Lwd.t -> [>`Contextmenu] attrib
  val a_controls : unit -> [>`Controls] attrib
  val a_dir : [<`Ltr|`Rtl] Lwd.t -> [>`Dir] attrib
  val a_draggable : bool Lwd.t -> [>`Draggable] attrib
  val a_form : string Lwd.t -> [>`Form] attrib
  val a_formaction : Xml.uri Lwd.t -> [>`Formaction] attrib
  val a_formenctype : string Lwd.t -> [>`Formenctype] attrib
  val a_formnovalidate : unit -> [>`Formnovalidate] attrib
  val a_formtarget : string Lwd.t -> [>`Formtarget] attrib
  val a_hidden : unit -> [>`Hidden] attrib
  val a_high : float Lwd.t -> [>`High] attrib
  val a_icon : Xml.uri Lwd.t -> [>`Icon] attrib
  val a_ismap : unit -> [>`Ismap] attrib
  val a_keytype : string Lwd.t -> [>`Keytype] attrib
  val a_list : string Lwd.t -> [>`List] attrib
  val a_loop : unit -> [>`Loop] attrib
  val a_low : float Lwd.t -> [>`High] attrib
  val a_max : float Lwd.t -> [>`Max] attrib
  val a_input_max : number_or_datetime Lwd.t -> [>`Input_Max] attrib
  val a_min : float Lwd.t -> [>`Min] attrib
  val a_input_min : number_or_datetime Lwd.t -> [>`Input_Min] attrib
  val a_inputmode :
    [<`Decimal|`Email|`None|`Numeric|`Search|`Tel|`Text|`Url] Lwd.t ->
    [>`Inputmode] attrib
  val a_novalidate : unit -> [>`Novalidate] attrib
  val a_open : unit -> [>`Open] attrib
  val a_optimum : float Lwd.t -> [>`Optimum] attrib
  val a_pattern : string Lwd.t -> [>`Pattern] attrib
  val a_placeholder : string Lwd.t -> [>`Placeholder] attrib
  val a_poster : Xml.uri Lwd.t -> [>`Poster] attrib
  val a_preload : [<`Audio|`Metadata|`None] Lwd.t -> [>`Preload] attrib
  val a_pubdate : unit -> [>`Pubdate] attrib
  val a_radiogroup : string Lwd.t -> [>`Radiogroup] attrib
  val a_referrerpolicy : referrerpolicy Lwd.t -> [>`Referrerpolicy] attrib
  val a_required : unit -> [>`Required] attrib
  val a_reversed : unit -> [>`Reversed] attrib
  val a_sandbox : [<sandbox_token] list Lwd.t -> [>`Sandbox] attrib
  val a_spellcheck : bool Lwd.t -> [>`Spellcheck] attrib
  val a_scoped : unit -> [>`Scoped] attrib
  val a_seamless : unit -> [>`Seamless] attrib
  val a_sizes : (int * int) list option Lwd.t -> [>`Sizes] attrib
  val a_span : int Lwd.t -> [>`Span] attrib

  type image_candidate = [
    | `Url of Xml.uri
    | `Url_pixel of Xml.uri * float
    | `Url_width of Xml.uri * int
  ]
  val a_srcset : image_candidate list Lwd.t -> [>`Srcset] attrib
  val a_img_sizes : string list Lwd.t -> [>`Img_sizes] attrib
  val a_start : int Lwd.t -> [>`Start] attrib
  val a_step : float option Lwd.t -> [>`Step] attrib
  val a_wrap : [<`Hard | `Soft] Lwd.t -> [>`Wrap] attrib
  val a_version : string Lwd.t -> [>`Version] attrib
  val a_xmlns : [<`W3_org_1999_xhtml] Lwd.t -> [>`XMLns] attrib
  val a_manifest : Xml.uri Lwd.t -> [>`Manifest] attrib
  val a_cite : Xml.uri Lwd.t -> [>`Cite] attrib
  val a_xml_space : [<`Default | `Preserve] Lwd.t -> [>`XML_space] attrib
  val a_accesskey : char Lwd.t -> [>`Accesskey] attrib
  val a_charset : string Lwd.t -> [>`Charset] attrib
  val a_accept_charset : charsets Lwd.t -> [>`Accept_charset] attrib
  val a_accept : contenttypes Lwd.t -> [>`Accept] attrib
  val a_href : Xml.uri Lwd.t -> [>`Href] attrib
  val a_hreflang : string Lwd.t -> [>`Hreflang] attrib
  val a_download : string option Lwd.t -> [>`Download] attrib
  val a_rel : linktypes Lwd.t -> [>`Rel] attrib
  val a_tabindex : int Lwd.t -> [>`Tabindex] attrib
  val a_mime_type : string Lwd.t -> [>`Mime_type] attrib
  val a_datetime : string Lwd.t -> [>`Datetime] attrib
  val a_action : Xml.uri Lwd.t -> [>`Action] attrib
  val a_checked : unit -> [>`Checked] attrib
  val a_cols : int Lwd.t -> [>`Cols] attrib
  val a_enctype : string Lwd.t -> [>`Enctype] attrib
  val a_label_for : string Lwd.t -> [>`Label_for] attrib
  val a_output_for : idrefs Lwd.t -> [>`Output_for] attrib
  val a_maxlength : int Lwd.t -> [>`Maxlength] attrib
  val a_minlength : int Lwd.t -> [>`Minlength] attrib
  val a_method : [<`Get | `Post] Lwd.t -> [>`Method] attrib
  val a_multiple : unit -> [>`Multiple] attrib
  val a_name : string Lwd.t -> [>`Name] attrib
  val a_rows : int Lwd.t -> [>`Rows] attrib
  val a_selected : unit -> [>`Selected] attrib
  val a_size : int Lwd.t -> [>`Size] attrib
  val a_src : Xml.uri Lwd.t -> [>`Src] attrib
  val a_input_type :
    [<`Button|`Checkbox|`Color|`Date|`Datetime|`Datetime_local|`Email|`File
    |`Hidden|`Image|`Month|`Number|`Password|`Radio|`Range|`Reset|`Search
    |`Submit|`Tel|`Text|`Time|`Url|`Week] Lwd.t ->
    [>`Input_Type] attrib
  val a_text_value : string Lwd.t -> [>`Text_Value] attrib
  val a_int_value : int Lwd.t -> [>`Int_Value] attrib
  val a_value : string Lwd.t -> [>`Value] attrib
  val a_float_value : float Lwd.t -> [>`Float_Value] attrib
  val a_disabled : unit -> [>`Disabled] attrib
  val a_readonly : unit -> [>`ReadOnly] attrib
  val a_button_type : [<`Button|`Reset|`Submit] Lwd.t -> [>`Button_Type] attrib
  val a_command_type : [<`Checkbox|`Command|`Radio] Lwd.t -> [>`Command_Type] attrib
  val a_menu_type : [<`Context|`Toolbar] Lwd.t -> [>`Menu_Type] attrib
  val a_label : string Lwd.t -> [>`Label] attrib
  val a_colspan : int Lwd.t -> [>`Colspan] attrib
  val a_headers : idrefs Lwd.t -> [>`Headers] attrib
  val a_rowspan : int Lwd.t -> [>`Rowspan] attrib
  val a_alt : string Lwd.t -> [>`Alt] attrib
  val a_height : int Lwd.t -> [>`Height] attrib
  val a_width : int Lwd.t -> [>`Width] attrib

  type shape = [ `Circle | `Default | `Poly | `Rect]
  val a_shape : shape Lwd.t -> [>`Shape] attrib
  val a_coords : numbers Lwd.t -> [>`Coords] attrib
  val a_usemap : string Lwd.t -> [>`Usemap] attrib
  val a_data : Xml.uri Lwd.t -> [>`Data] attrib
  val a_scrolling : [<`Auto | `No | `Yes] Lwd.t -> [>`Scrolling] attrib
  val a_target : string Lwd.t -> [>`Target] attrib
  val a_content : string Lwd.t -> [>`Content] attrib
  val a_http_equiv : string Lwd.t -> [>`Http_equiv] attrib
  val a_defer : unit -> [>`Defer] attrib
  val a_media : mediadesc Lwd.t -> [>`Media] attrib
  val a_style : string Lwd.t -> [>`Style_Attr] attrib
  val a_property : string Lwd.t -> [>`Property] attrib
  val a_role : string list Lwd.t -> [>`Role] attrib
  val a_aria : string -> string list Lwd.t -> [>`Aria] attrib
  val txt : string Lwd.t -> [>txt] elt
  val html : ?a:html_attrib attrib list -> [<head] elt ->
    [<body] elt -> [>html] elt
  val head : ?a:head_attrib attrib list -> [<title] elt ->
    head_content_fun elt list -> [>head] elt
  val base : ([<base_attrib], [>base]) nullary
  val title : (noattrib, [<title_content_fun], [>title]) unary
  val body : ([<body_attrib], [<flow5], [>body]) star
  val svg : ?a:[<Svg_types.svg_attr] Svg.attrib list ->
    [<svg_content] Svg.elt list -> [>svg] elt
  val footer : ([<footer_attrib], [<footer_content_fun], [>footer]) star
  val header : ([<header_attrib], [<header_content_fun], [>header]) star
  val section : ([<section_attrib], [<section_content_fun], [>section]) star
  val nav : ([<nav_attrib], [<nav_content_fun], [>nav]) star
  val h1 : ([<h1_attrib], [<h1_content_fun], [>h1]) star
  val h2 : ([<h2_attrib], [<h2_content_fun], [>h2]) star
  val h3 : ([<h3_attrib], [<h3_content_fun], [>h3]) star
  val h4 : ([<h4_attrib], [<h4_content_fun], [>h4]) star
  val h5 : ([<h5_attrib], [<h5_content_fun], [>h5]) star
  val h6 : ([<h6_attrib], [<h6_content_fun], [>h6]) star
  val hgroup : ([<hgroup_attrib], [<hgroup_content_fun], [>hgroup]) star
  val address : ([<address_attrib], [<address_content_fun], [>address]) star
  val article : ([<article_attrib], [<article_content_fun], [>article]) star
  val aside : ([<aside_attrib], [<aside_content_fun], [>aside]) star
  val main : ([<main_attrib], [<main_content_fun], [>main]) star
  val p : ([<p_attrib], [<p_content_fun], [>p]) star
  val pre : ([<pre_attrib], [<pre_content_fun], [>pre]) star
  val blockquote :
    ([<blockquote_attrib], [<blockquote_content_fun], [>blockquote]) star
  val div : ([<div_attrib], [<div_content_fun], [>div]) star
  val dl : ([<dl_attrib], [<dl_content_fun], [>dl]) star
  val ol : ([<ol_attrib], [<ol_content_fun], [>ol]) star
  val ul : ([<ul_attrib], [<ul_content_fun], [>ul]) star
  val dd : ([<dd_attrib], [<dd_content_fun], [>dd]) star
  val dt : ([<dt_attrib], [<dt_content_fun], [>dt]) star
  val li : ([<li_attrib], [<li_content_fun], [>li]) star
  val figcaption :
    ([<figcaption_attrib], [<figcaption_content_fun], [>figcaption]) star
  val figure :
    ?figcaption:[`Bottom of [<figcaption] elt |`Top of [<figcaption] elt] ->
    ([<figure_attrib], [<figure_content_fun], [>figure]) star
  val hr : ([<hr_attrib], [>hr]) nullary
  val b : ([<b_attrib], [<b_content_fun], [>b]) star
  val i : ([<i_attrib], [<i_content_fun], [>i]) star
  val u : ([<u_attrib], [<u_content_fun], [>u]) star
  val small : ([<small_attrib], [<small_content_fun], [>small]) star
  val sub : ([<sub_attrib], [<sub_content_fun], [>sub]) star
  val sup : ([<sup_attrib], [<sup_content_fun], [>sup]) star
  val mark : ([<mark_attrib], [<mark_content_fun], [>mark]) star
  val wbr : ([<wbr_attrib], [>wbr]) nullary
  val bdo : dir:[<`Ltr | `Rtl] Lwd.t ->
    ([<bdo_attrib], [<bdo_content_fun], [>bdo]) star
  val abbr : ([<abbr_attrib], [<abbr_content_fun], [>abbr]) star
  val br : ([<br_attrib], [>br]) nullary
  val cite : ([<cite_attrib], [<cite_content_fun], [>cite]) star
  val code : ([<code_attrib], [<code_content_fun], [>code]) star
  val dfn : ([<dfn_attrib], [<dfn_content_fun], [>dfn]) star
  val em : ([<em_attrib], [<em_content_fun], [>em]) star
  val kbd : ([<kbd_attrib], [<kbd_content_fun], [>kbd]) star
  val q : ([<q_attrib], [<q_content_fun], [>q]) star
  val samp : ([<samp_attrib], [<samp_content_fun], [>samp]) star
  val span : ([<span_attrib], [<span_content_fun], [>span]) star
  val strong : ([<strong_attrib], [<strong_content_fun], [>strong]) star
  val time : ([<time_attrib], [<time_content_fun], [>time]) star
  val var : ([<var_attrib], [<var_content_fun], [>var]) star
  val a : ([<a_attrib], 'a, [>'a a]) star
  val del : ([<del_attrib], 'a, [>'a del]) star
  val ins : ([<ins_attrib], 'a, [>'a ins]) star
  val img : src:Xml.uri Lwd.t -> alt:string Lwd.t ->
    ([<img_attrib], [>img]) nullary
  val iframe : ([<iframe_attrib], [<iframe_content_fun], [>iframe]) star
  val object_ : ?params:[<param] elt list ->
    ([<object__attrib], 'a, [>`Object of 'a]) star
  val param : ([<param_attrib], [>param]) nullary
  val embed : ([<embed_attrib], [>embed]) nullary
  val audio : ?src:Xml.uri Lwd.t -> ?srcs:[<source] elt list ->
    ([<audio_attrib], 'a, [>'a audio]) star
  val video : ?src:Xml.uri Lwd.t -> ?srcs:[<source] elt list ->
    ([<video_attrib], 'a, [>'a video]) star
  val canvas : ([<canvas_attrib], 'a, [>'a canvas]) star
  val source : ([<source_attrib], [>source]) nullary
  val area : alt:string Lwd.t ->
    ([<`Accesskey|`Alt|`Aria|`Class|`Contenteditable|`Contextmenu|`Coords
     |`Dir|`Draggable|`Hidden|`Hreflang|`Id|`Lang |`Media|`Mime_type
     |`OnAbort|`OnBlur|`OnCanPlay|`OnCanPlayThrough|`OnChange|`OnClick
     |`OnContextMenu|`OnDblClick|`OnDrag|`OnDragEnd|`OnDragEnter
     |`OnDragLeave|`OnDragOver|`OnDragStart|`OnDrop|`OnDurationChange
     |`OnEmptied|`OnEnded|`OnError|`OnFocus|`OnFormChange|`OnFormInput
     |`OnInput|`OnInvalid|`OnKeyDown|`OnKeyPress|`OnKeyUp|`OnLoad
     |`OnLoadStart|`OnLoadedData|`OnLoadedMetaData|`OnMouseDown
     |`OnMouseMove|`OnMouseOut|`OnMouseOver|`OnMouseUp|`OnMouseWheel
     |`OnPause|`OnPlay|`OnPlaying|`OnProgress|`OnRateChange
     |`OnReadyStateChange|`OnScroll|`OnSeeked|`OnSeeking|`OnSelect
     |`OnShow|`OnStalled|`OnSubmit|`OnSuspend|`OnTimeUpdate|`OnTouchCancel
     |`OnTouchEnd|`OnTouchMove|`OnTouchStart|`OnVolumeChange|`OnWaiting
     |`Rel|`Role|`Shape|`Spellcheck|`Style_Attr|`Tabindex|`Target
     |`Title|`User_data|`XML_lang|`XMLns], [>area]) nullary
  val map : ([<map_attrib], 'a, [>'a map]) star
  val caption : ([<caption_attrib], [<caption_content_fun], [>caption]) star
  val table :
    ?caption:[<caption] elt -> ?columns:[<colgroup] elt list ->
    ?thead:[<thead] elt -> ?tfoot:[<tfoot] elt ->
    ([<table_attrib], [<table_content_fun], [>table]) star
  val tablex :
    ?caption:[<caption] elt -> ?columns:[<colgroup] elt list ->
    ?thead:[<thead] elt -> ?tfoot:[<tfoot] elt ->
    ([<tablex_attrib], [<tablex_content_fun], [>tablex]) star
  val colgroup :
    ([<colgroup_attrib], [<colgroup_content_fun], [>colgroup]) star
  val col : ([<col_attrib], [>col]) nullary
  val thead : ([<thead_attrib], [<thead_content_fun], [>thead]) star
  val tbody : ([<tbody_attrib], [<tbody_content_fun], [>tbody]) star
  val tfoot : ([<tfoot_attrib], [<tfoot_content_fun], [>tfoot]) star
  val td : ([<td_attrib], [<td_content_fun], [>td]) star
  val th : ([<th_attrib], [<th_content_fun], [>th]) star
  val tr : ([<tr_attrib], [<tr_content_fun], [>tr]) star
  val form : ([<form_attrib], [<form_content_fun], [>form]) star
  val fieldset : ?legend:[<legend] elt ->
    ([<fieldset_attrib], [<fieldset_content_fun], [>fieldset]) star
  val legend : ([<legend_attrib], [<legend_content_fun], [>legend]) star
  val label : ([<label_attrib], [<label_content_fun], [>label]) star
  val input : ([<input_attrib], [>input]) nullary
  val button : ([<button_attrib], [<button_content_fun], [>button]) star
  val select : ([<select_attrib], [<select_content_fun], [>select]) star
  val datalist : ?children:[<`Options of [<selectoption] elt list
                           | `Phras of [<phrasing] elt list] ->
    ([<datalist_attrib], [>datalist]) nullary
  val optgroup : label:string Lwd.t ->
    ([<optgroup_attrib], [<optgroup_content_fun], [>optgroup]) star
  val option :
    ([<option_attrib], [<option_content_fun], [>selectoption]) unary
  val textarea : ?a:[<textarea_attrib] attrib list -> string Lwd.t -> [>textarea] elt
  (* Textarea syntactically looks like it takes its content from its children
     nodes, but dynamic semantics use the value attribute :-( *)
  val keygen :
    ([<keygen_attrib], [>keygen]) nullary
  val progress :
    ([<progress_attrib], [<progress_content_fun], [>progress]) star
  val meter :
    ([<meter_attrib], [<meter_content_fun], [>meter]) star
  val output_elt :
    ([<output_elt_attrib], [<output_elt_content_fun], [>output_elt]) star
  val entity : string -> [>txt] elt
  val space : unit -> [>txt] elt
  val cdata : string -> [>txt] elt
  val cdata_script : string -> [>txt] elt
  val cdata_style : string -> [>txt] elt
  val details : [<summary] elt ->
    ([<details_attrib], [<details_content_fun], [>details]) star
  val summary : ([<summary_attrib], [<summary_content_fun], [>summary]) star
  val command : label:string Lwd.t -> ([<command_attrib], [>command]) nullary
  val menu : ?children:[<`Flows of [<flow5] elt list
                       | `Lis of [<`Li of [<common]] elt list] ->
    ([<menu_attrib], [>menu]) nullary
  val script :
    ([<script_attrib], [<script_content_fun], [>script]) unary
  val noscript :
    ([<noscript_attrib], [<flow5_without_noscript], [>noscript]) star
  val template :
    ([<template_attrib], [<template_content_fun], [>template]) star
  val meta : ([<meta_attrib], [>meta]) nullary
  val style : ([<style_attrib], [<style_content_fun], [>style]) star
  val link : rel:linktypes Lwd.t -> href:Xml.uri Lwd.t ->
    ([<link_attrib], [>link]) nullary
  val rt : ([<rt_attrib], [<rt_content_fun], [>rt]) star
  val rp : ([<rp_attrib], [<rp_content_fun], [>rp]) star
  val ruby : ([<ruby_attrib], [<ruby_content_fun], [>ruby]) star

   (* val pcdata : string Lwd.t -> [>pcdata] elt *)
   (* val of_seq : Xml_stream.signal Seq.t -> 'a elt list *)
   val tot : Xml.elt -> 'a elt
   (* val totl : Xml.elt list -> 'a elt list *)
   val toelt : 'a elt -> Xml.elt
   (* val toeltl : 'a elt list -> Xml.elt list *)
   val doc_toelt : doc -> Xml.elt
   val to_xmlattribs : 'a attrib list -> Xml.attrib list
   val to_attrib : Xml.attrib -> 'a attrib

  (* module Unsafe : sig
    val data : string Lwd.t -> 'a elt
    val node : string -> ?a:'a attrib list -> 'b elt list -> 'c elt
    val leaf : string -> ?a:'a attrib list -> unit -> 'b elt
    val coerce_elt : 'a elt -> 'b elt
    val string_attrib : string -> string Lwd.t -> 'a attrib
    val float_attrib : string -> float Lwd.t -> 'a attrib
    val int_attrib : string -> int Lwd.t -> 'a attrib
    val uri_attrib : string -> Xml.uri Lwd.t -> 'a attrib
    val space_sep_attrib : string -> string list Lwd.t -> 'a attrib
    val comma_sep_attrib : string -> string list Lwd.t -> 'a attrib
  end *)
end = struct
  type 'a elt = 'a Raw_html.elt
  type doc = Raw_html.doc
  type nonrec +'a attrib = 'a attrib
  type ('a, 'b) nullary = ?a:'a attrib list -> unit -> 'b elt
  type ('a, 'b, 'c) unary = ?a:'a attrib list -> 'b elt -> 'c elt
  type ('a, 'b, 'c) star = ?a:'a attrib list -> 'b elt list -> 'c elt
  module Info = Raw_html.Info

  let string_of_uri         = Raw_html.string_of_uri
  let uri_of_string         = Raw_html.uri_of_string
  let a_class               = Raw_html.a_class
  let a_user_data           = Raw_html.a_user_data
  let a_id                  = Raw_html.a_id
  let a_title               = Raw_html.a_title
  let a_xml_lang            = Raw_html.a_xml_lang
  let a_lang                = Raw_html.a_lang
  let a_onabort             = Raw_html.a_onabort
  let a_onafterprint        = Raw_html.a_onafterprint
  let a_onbeforeprint       = Raw_html.a_onbeforeprint
  let a_onbeforeunload      = Raw_html.a_onbeforeunload
  let a_onblur              = Raw_html.a_onblur
  let a_oncanplay           = Raw_html.a_oncanplay
  let a_oncanplaythrough    = Raw_html.a_oncanplaythrough
  let a_onchange            = Raw_html.a_onchange
  let a_ondurationchange    = Raw_html.a_ondurationchange
  let a_onemptied           = Raw_html.a_onemptied
  let a_onended             = Raw_html.a_onended
  let a_onerror             = Raw_html.a_onerror
  let a_onfocus             = Raw_html.a_onfocus
  let a_onformchange        = Raw_html.a_onformchange
  let a_onforminput         = Raw_html.a_onforminput
  let a_onhashchange        = Raw_html.a_onhashchange
  let a_oninput             = Raw_html.a_oninput
  let a_oninvalid           = Raw_html.a_oninvalid
  let a_onmousewheel        = Raw_html.a_onmousewheel
  let a_onoffline           = Raw_html.a_onoffline
  let a_ononline            = Raw_html.a_ononline
  let a_onpause             = Raw_html.a_onpause
  let a_onplay              = Raw_html.a_onplay
  let a_onplaying           = Raw_html.a_onplaying
  let a_onpagehide          = Raw_html.a_onpagehide
  let a_onpageshow          = Raw_html.a_onpageshow
  let a_onpopstate          = Raw_html.a_onpopstate
  let a_onprogress          = Raw_html.a_onprogress
  let a_onratechange        = Raw_html.a_onratechange
  let a_onreadystatechange  = Raw_html.a_onreadystatechange
  let a_onredo              = Raw_html.a_onredo
  let a_onresize            = Raw_html.a_onresize
  let a_onscroll            = Raw_html.a_onscroll
  let a_onseeked            = Raw_html.a_onseeked
  let a_onseeking           = Raw_html.a_onseeking
  let a_onselect            = Raw_html.a_onselect
  let a_onshow              = Raw_html.a_onshow
  let a_onstalled           = Raw_html.a_onstalled
  let a_onstorage           = Raw_html.a_onstorage
  let a_onsubmit            = Raw_html.a_onsubmit
  let a_onsuspend           = Raw_html.a_onsuspend
  let a_ontimeupdate        = Raw_html.a_ontimeupdate
  let a_onundo              = Raw_html.a_onundo
  let a_onunload            = Raw_html.a_onunload
  let a_onvolumechange      = Raw_html.a_onvolumechange
  let a_onwaiting           = Raw_html.a_onwaiting
  let a_onload              = Raw_html.a_onload
  let a_onloadeddata        = Raw_html.a_onloadeddata
  let a_onloadedmetadata    = Raw_html.a_onloadedmetadata
  let a_onloadstart         = Raw_html.a_onloadstart
  let a_onmessage           = Raw_html.a_onmessage
  let a_onclick             = Raw_html.a_onclick
  let a_oncontextmenu       = Raw_html.a_oncontextmenu
  let a_ondblclick          = Raw_html.a_ondblclick
  let a_ondrag              = Raw_html.a_ondrag
  let a_ondragend           = Raw_html.a_ondragend
  let a_ondragenter         = Raw_html.a_ondragenter
  let a_ondragleave         = Raw_html.a_ondragleave
  let a_ondragover          = Raw_html.a_ondragover
  let a_ondragstart         = Raw_html.a_ondragstart
  let a_ondrop              = Raw_html.a_ondrop
  let a_onmousedown         = Raw_html.a_onmousedown
  let a_onmouseup           = Raw_html.a_onmouseup
  let a_onmouseover         = Raw_html.a_onmouseover
  let a_onmousemove         = Raw_html.a_onmousemove
  let a_onmouseout          = Raw_html.a_onmouseout
  let a_ontouchstart        = Raw_html.a_ontouchstart
  let a_ontouchend          = Raw_html.a_ontouchend
  let a_ontouchmove         = Raw_html.a_ontouchmove
  let a_ontouchcancel       = Raw_html.a_ontouchcancel
  let a_onkeypress          = Raw_html.a_onkeypress
  let a_onkeydown           = Raw_html.a_onkeydown
  let a_onkeyup             = Raw_html.a_onkeyup
  let a_allowfullscreen     = Raw_html.a_allowfullscreen
  let a_allowpaymentrequest = Raw_html.a_allowpaymentrequest
  let a_autocomplete        = Raw_html.a_autocomplete
  let a_async               = Raw_html.a_async
  let a_autofocus           = Raw_html.a_autofocus
  let a_autoplay            = Raw_html.a_autoplay
  let a_muted               = Raw_html.a_muted
  let a_crossorigin         = Raw_html.a_crossorigin
  let a_integrity           = Raw_html.a_integrity
  let a_mediagroup          = Raw_html.a_mediagroup
  let a_challenge           = Raw_html.a_challenge
  let a_contenteditable     = Raw_html.a_contenteditable
  let a_contextmenu         = Raw_html.a_contextmenu
  let a_controls            = Raw_html.a_controls
  let a_dir                 = Raw_html.a_dir
  let a_draggable           = Raw_html.a_draggable
  let a_form                = Raw_html.a_form
  let a_formaction          = Raw_html.a_formaction
  let a_formenctype         = Raw_html.a_formenctype
  let a_formnovalidate      = Raw_html.a_formnovalidate
  let a_formtarget          = Raw_html.a_formtarget
  let a_hidden              = Raw_html.a_hidden
  let a_high                = Raw_html.a_high
  let a_icon                = Raw_html.a_icon
  let a_ismap               = Raw_html.a_ismap
  let a_keytype             = Raw_html.a_keytype
  let a_list                = Raw_html.a_list
  let a_loop                = Raw_html.a_loop
  let a_low                 = Raw_html.a_low
  let a_max                 = Raw_html.a_max
  let a_input_max           = Raw_html.a_input_max
  let a_min                 = Raw_html.a_min
  let a_input_min           = Raw_html.a_input_min
  let a_inputmode           = Raw_html.a_inputmode
  let a_novalidate          = Raw_html.a_novalidate
  let a_open                = Raw_html.a_open
  let a_optimum             = Raw_html.a_optimum
  let a_pattern             = Raw_html.a_pattern
  let a_placeholder         = Raw_html.a_placeholder
  let a_poster              = Raw_html.a_poster
  let a_preload             = Raw_html.a_preload
  let a_pubdate             = Raw_html.a_pubdate
  let a_radiogroup          = Raw_html.a_radiogroup
  let a_referrerpolicy      = Raw_html.a_referrerpolicy
  let a_required            = Raw_html.a_required
  let a_reversed            = Raw_html.a_reversed
  let a_sandbox             = Raw_html.a_sandbox
  let a_spellcheck          = Raw_html.a_spellcheck
  let a_scoped              = Raw_html.a_scoped
  let a_seamless            = Raw_html.a_seamless
  let a_sizes               = Raw_html.a_sizes
  let a_span                = Raw_html.a_span
  type image_candidate = [
    | `Url of Xml.uri
    | `Url_pixel of Xml.uri * float
    | `Url_width of Xml.uri * int
  ]
  let a_srcset              = Raw_html.a_srcset
  let a_img_sizes           = Raw_html.a_img_sizes
  let a_start               = Raw_html.a_start
  let a_step                = Raw_html.a_step
  let a_wrap                = Raw_html.a_wrap
  let a_version             = Raw_html.a_version
  let a_xmlns               = Raw_html.a_xmlns
  let a_manifest            = Raw_html.a_manifest
  let a_cite                = Raw_html.a_cite
  let a_xml_space           = Raw_html.a_xml_space
  let a_accesskey           = Raw_html.a_accesskey
  let a_charset             = Raw_html.a_charset
  let a_accept_charset      = Raw_html.a_accept_charset
  let a_accept              = Raw_html.a_accept
  let a_href                = Raw_html.a_href
  let a_hreflang            = Raw_html.a_hreflang
  let a_download            = Raw_html.a_download
  let a_rel                 = Raw_html.a_rel
  let a_tabindex            = Raw_html.a_tabindex
  let a_mime_type           = Raw_html.a_mime_type
  let a_datetime            = Raw_html.a_datetime
  let a_action              = Raw_html.a_action
  let a_checked             = Raw_html.a_checked
  let a_cols                = Raw_html.a_cols
  let a_enctype             = Raw_html.a_enctype
  let a_label_for           = Raw_html.a_label_for
  let a_output_for          = Raw_html.a_output_for
  let a_maxlength           = Raw_html.a_maxlength
  let a_minlength           = Raw_html.a_minlength
  let a_method              = Raw_html.a_method
  let a_multiple            = Raw_html.a_multiple
  let a_name                = Raw_html.a_name
  let a_rows                = Raw_html.a_rows
  let a_selected            = Raw_html.a_selected
  let a_size                = Raw_html.a_size
  let a_src                 = Raw_html.a_src
  let a_input_type          = Raw_html.a_input_type
  let a_text_value          = Raw_html.a_text_value
  let a_int_value           = Raw_html.a_int_value
  let a_value               = Raw_html.a_value
  let a_float_value         = Raw_html.a_float_value
  let a_disabled            = Raw_html.a_disabled
  let a_readonly            = Raw_html.a_readonly
  let a_button_type         = Raw_html.a_button_type
  let a_command_type        = Raw_html.a_command_type
  let a_menu_type           = Raw_html.a_menu_type
  let a_label               = Raw_html.a_label
  let a_colspan             = Raw_html.a_colspan
  let a_headers             = Raw_html.a_headers
  let a_rowspan             = Raw_html.a_rowspan
  let a_alt                 = Raw_html.a_alt
  let a_height              = Raw_html.a_height
  let a_width               = Raw_html.a_width
  type shape = [ `Circle | `Default | `Poly | `Rect]
  let a_shape               = Raw_html.a_shape
  let a_coords              = Raw_html.a_coords
  let a_usemap              = Raw_html.a_usemap
  let a_data                = Raw_html.a_data
  let a_scrolling           = Raw_html.a_scrolling
  let a_target              = Raw_html.a_target
  let a_content             = Raw_html.a_content
  let a_http_equiv          = Raw_html.a_http_equiv
  let a_defer               = Raw_html.a_defer
  let a_media               = Raw_html.a_media
  let a_style               = Raw_html.a_style
  let a_property            = Raw_html.a_property
  let a_role                = Raw_html.a_role
  let a_aria                = Raw_html.a_aria

  let unary (f: ('a, 'b, 'c) Raw_html.unary) : ('a, 'b, 'c) unary =
    fun ?a elt -> f ?a (Lwd.pure elt)

  let star (f: ('a, 'b, 'c) Raw_html.star) : ('a, 'b, 'c) star =
    fun ?a elts -> f ?a (List.map Lwd.pure elts)

  let pure_opt = function None -> None | Some x -> Some (Lwd.pure x)
  let pures xs = List.map Lwd.pure xs
  let pures_opt = function None -> None | Some xs -> Some (pures xs)

  let txt                   = Raw_html.txt
  let html ?a e1 e2         = Raw_html.html ?a (Lwd.pure e1) (Lwd.pure e2)
  let head ?a e1 elts       = Raw_html.head ?a (Lwd.pure e1) (pures elts)
  let base                  = Raw_html.base
  let title                 = unary Raw_html.title
  let body                  = star Raw_html.body
  let svg                   = star Raw_html.svg
  let footer                = star Raw_html.footer
  let header                = star Raw_html.header
  let section               = star Raw_html.section
  let nav                   = star Raw_html.nav
  let h1                    = star Raw_html.h1
  let h2                    = star Raw_html.h2
  let h3                    = star Raw_html.h3
  let h4                    = star Raw_html.h4
  let h5                    = star Raw_html.h5
  let h6                    = star Raw_html.h6
  let hgroup                = star Raw_html.hgroup
  let address               = star Raw_html.address
  let article               = star Raw_html.article
  let aside                 = star Raw_html.aside
  let main                  = star Raw_html.main
  let p                     = star Raw_html.p
  let pre                   = star Raw_html.pre
  let blockquote            = star Raw_html.blockquote
  let div                   = star Raw_html.div
  let dl                    = star Raw_html.dl
  let ol                    = star Raw_html.ol
  let ul                    = star Raw_html.ul
  let dd                    = star Raw_html.dd
  let dt                    = star Raw_html.dt
  let li                    = star Raw_html.li
  let figcaption            = star Raw_html.figcaption
  let figure ?figcaption ?a elts =
    let figcaption = match figcaption with
      | None -> None
      | Some (`Bottom elt) -> Some (`Bottom (Lwd.pure elt))
      | Some (`Top elt) -> Some (`Top (Lwd.pure elt))
    in
    Raw_html.figure ?figcaption ?a (pures elts)
  let hr                    = Raw_html.hr
  let b                     = star Raw_html.b
  let i                     = star Raw_html.i
  let u                     = star Raw_html.u
  let small                 = star Raw_html.small
  let sub                   = star Raw_html.sub
  let sup                   = star Raw_html.sup
  let mark                  = star Raw_html.mark
  let wbr                   = Raw_html.wbr
  let bdo ~dir              = star (Raw_html.bdo ~dir)
  let abbr                  = star Raw_html.abbr
  let br                    = Raw_html.br
  let cite                  = star Raw_html.cite
  let code                  = star Raw_html.code
  let dfn                   = star Raw_html.dfn
  let em                    = star Raw_html.em
  let kbd                   = star Raw_html.kbd
  let q                     = star Raw_html.q
  let samp                  = star Raw_html.samp
  let span                  = star Raw_html.span
  let strong                = star Raw_html.strong
  let time                  = star Raw_html.time
  let var                   = star Raw_html.var
  let a                     = star Raw_html.a
  let del                   = star Raw_html.del
  let ins                   = star Raw_html.ins
  let img                   = Raw_html.img
  let iframe                = star Raw_html.iframe
  let object_ ?params ?a elts =
    Raw_html.object_ ?params:(pures_opt params) ?a (pures elts)
  let param                 = Raw_html.param
  let embed                 = Raw_html.embed
  let audio ?src ?srcs ?a elts =
    Raw_html.audio ?src ?srcs:(pures_opt srcs) ?a (pures elts)
  let video ?src ?srcs ?a elts =
    Raw_html.video ?src ?srcs:(pures_opt srcs) ?a (pures elts)
  let canvas                = star Raw_html.canvas
  let source                = Raw_html.source
  let area                  = Raw_html.area
  let map                   = star Raw_html.map
  let caption               = star Raw_html.caption
  let table ?caption ?columns ?thead ?tfoot ?a elts =
    Raw_html.table ?caption:(pure_opt caption) ?columns:(pures_opt columns)
      ?thead:(pure_opt thead) ?tfoot:(pure_opt tfoot) ?a (pures elts)
  let tablex ?caption ?columns ?thead ?tfoot ?a elts =
    Raw_html.tablex ?caption:(pure_opt caption) ?columns:(pures_opt columns)
      ?thead:(pure_opt thead) ?tfoot:(pure_opt tfoot) ?a (pures elts)
  let colgroup              = star Raw_html.colgroup
  let col                   = Raw_html.col
  let thead                 = star Raw_html.thead
  let tbody                 = star Raw_html.tbody
  let tfoot                 = star Raw_html.tfoot
  let td                    = star Raw_html.td
  let th                    = star Raw_html.th
  let tr                    = star Raw_html.tr
  let form                  = star Raw_html.form
  let fieldset ?legend ?a elts =
    Raw_html.fieldset ?legend:(pure_opt legend) ?a (pures elts)
  let legend                = star Raw_html.legend
  let label                 = star Raw_html.label
  let input                 = Raw_html.input
  let button                = star Raw_html.button
  let select                = star Raw_html.select
  let datalist ?children ?a () =
    let children = match children with
      | None -> None
      | Some (`Options elts) -> Some (`Options (pures elts))
      | Some (`Phras elts) -> Some (`Phras (pures elts))
    in
    Raw_html.datalist ?children ?a ()
  let optgroup ~label ?a elts = Raw_html.optgroup ~label ?a (pures elts)
  let option                = unary Raw_html.option
  let textarea ?(a=[]) txt =
    let value = Lwd.map ~f:(fun txt -> Some (Js.string txt)) txt in
    let attrib = Attrib.Attrib {name="value"; value} in
    Raw_html.textarea ~a:(attrib :: a)
      (Lwd.pure (Lwd.pure Lwd_seq.empty))
  (*(Lwd.pure (Xml.pcdata txt))*)
  let keygen                = Raw_html.keygen
  let progress              = star Raw_html.progress
  let meter                 = star Raw_html.meter
  let output_elt            = star Raw_html.output_elt
  let entity                = Raw_html.entity
  let space                 = Raw_html.space
  let cdata                 = Raw_html.cdata
  let cdata_script          = Raw_html.cdata_script
  let cdata_style           = Raw_html.cdata_style
  let details elt ?a elts   = Raw_html.details (Lwd.pure elt) ?a (pures elts)
  let summary               = star Raw_html.summary
  let command               = Raw_html.command
  let menu ?children ?a () =
    let children = match children with
      | None -> None
      | Some (`Flows elts) -> Some (`Flows (pures elts))
      | Some (`Lis elts) -> Some (`Lis (pures elts))
    in
    Raw_html.menu ?children ?a ()
  let script                = unary Raw_html.script
  let noscript              = star Raw_html.noscript
  let template              = star Raw_html.template
  let meta                  = Raw_html.meta
  let style                 = star Raw_html.style
  let link                  = Raw_html.link
  let rt                    = star Raw_html.rt
  let rp                    = star Raw_html.rp
  let ruby                  = star Raw_html.ruby
  (* let of_seq = Raw_html.of_seq *)
  let tot = Raw_html.tot
  (* let totl = Raw_html.totl *)
  let toelt = Raw_html.toelt
  (* let toeltl = Raw_html.toeltl *)
  let doc_toelt = Raw_html.doc_toelt
  let to_xmlattribs = Raw_html.to_xmlattribs
  let to_attrib = Raw_html.to_attrib
end

module Lwdom = struct
  type 'a elt = 'a Lwd_seq.t Lwd.t

  let elt x = Lwd.pure (Lwd_seq.element x)
  let attr x : _ attr = Lwd.pure (Some x)
  let rattr x : _ attr = Lwd.map ~f:some x

  (*let to_fragment (elts : _ node elt) =
    let fragment = Dom_html.document##createDocumentFragment in
    Lwd.map' (update_children fragment elts) (fun () -> fragment)*)

  let children : _ elt list -> _ elt = function
    | [] -> empty
    | [x] -> x
    | [x; y] -> Lwd.map2 ~f:Lwd_seq.concat x y
    | xs -> Lwd_utils.reduce Lwd_seq.lwd_monoid xs

  let children_array : _ elt array -> _ elt = function
    | [||] -> empty
    | [|x|] -> x
    | [|x; y|] -> Lwd.map2 ~f:Lwd_seq.concat x y
    | xs -> Lwd_seq.bind (Lwd.pure (Lwd_seq.of_array xs)) (fun x -> x)

  let to_node x = x
end