open Content_category open Content_model open Attr_spec let picture = Element_spec.make ~name:"picture" ~categories:[ Flow; Phrasing; Embedded; Palpable ] ~content_model: (Sequence [ Zero_or_more (Elements [ "source" ]); Elements [ "img" ]; Zero_or_more (Elements [ "script"; "template" ]); ]) ~attrs:[] () let source = Element_spec.make ~name:"source" ~void:true ~categories:[] ~content_model:Nothing ~attrs: [ make "type" ~datatype:"mime" (); make "media" ~datatype:"media_query" (); make "src" ~datatype:"url" (); make "srcset" ~datatype:"srcset" (); make "sizes" (); make "width" ~datatype:"integer" (); make "height" ~datatype:"integer" (); ] () let img = (* Note: img is only Interactive when it has usemap attribute; we omit Interactive from static categories since usemap is rare *) Element_spec.make ~name:"img" ~void:true ~categories:[ Flow; Phrasing; Embedded; Palpable ] ~content_model:Nothing ~attrs: [ make "src" ~required:true ~datatype:"url" (); make "alt" (); make "srcset" ~datatype:"srcset" (); make "sizes" (); make "crossorigin" ~datatype:"crossorigin" (); make "usemap" ~datatype:"hash" (); make "ismap" ~datatype:"boolean" (); make "width" ~datatype:"integer" (); make "height" ~datatype:"integer" (); make "referrerpolicy" ~datatype:"referrer" (); make "decoding" ~datatype:"decoding" (); make "loading" ~datatype:"loading" (); make "fetchpriority" ~datatype:"fetchpriority" (); ] ~implicit_aria_role:"img" () let iframe = Element_spec.make ~name:"iframe" ~categories:[ Flow; Phrasing; Embedded; Interactive; Palpable ] ~content_model:Nothing ~attrs: [ make "src" ~datatype:"url" (); make "srcdoc" (); make "name" ~datatype:"target" (); make "sandbox" ~datatype:"sandbox" (); make "allow" (); make "allowfullscreen" ~datatype:"boolean" (); make "width" ~datatype:"integer" (); make "height" ~datatype:"integer" (); make "referrerpolicy" ~datatype:"referrer" (); make "loading" ~datatype:"loading" (); ] () let embed = Element_spec.make ~name:"embed" ~void:true ~categories:[ Flow; Phrasing; Embedded; Interactive; Palpable ] ~content_model:Nothing ~attrs: [ make "src" ~required:true ~datatype:"url" (); make "type" ~datatype:"mime" (); make "width" ~datatype:"integer" (); make "height" ~datatype:"integer" (); ] () let object_ = Element_spec.make ~name:"object" ~categories:[ Flow; Phrasing; Embedded; Palpable; Interactive ] ~content_model:(Mixed [ Flow ]) ~attrs: [ make "data" ~datatype:"url" (); make "type" ~datatype:"mime" (); make "name" ~datatype:"target" (); make "form" ~datatype:"id" (); make "width" ~datatype:"integer" (); make "height" ~datatype:"integer" (); ] () let param = Element_spec.make ~name:"param" ~void:true ~categories:[] ~content_model:Nothing ~attrs:[ make "name" ~required:true (); make "value" ~required:true () ] () let video = Element_spec.make ~name:"video" ~categories:[ Flow; Phrasing; Embedded; Palpable; Interactive ] ~content_model: (Choice [ Sequence [ Zero_or_more (Elements [ "source" ]); Zero_or_more (Elements [ "track" ]); Zero_or_more Transparent; ]; Sequence [ Zero_or_more Transparent; Zero_or_more (Elements [ "track" ]) ]; ]) ~prohibited_ancestors:[ "audio"; "video" ] ~attrs: [ make "src" ~datatype:"url" (); make "crossorigin" ~datatype:"crossorigin" (); make "poster" ~datatype:"url" (); make "preload" ~datatype:"preload" (); make "autoplay" ~datatype:"boolean" (); make "playsinline" ~datatype:"boolean" (); make "loop" ~datatype:"boolean" (); make "muted" ~datatype:"boolean" (); make "controls" ~datatype:"boolean" (); make "width" ~datatype:"integer" (); make "height" ~datatype:"integer" (); ] () let audio = Element_spec.make ~name:"audio" ~categories:[ Flow; Phrasing; Embedded; Palpable; Interactive ] ~content_model: (Choice [ Sequence [ Zero_or_more (Elements [ "source" ]); Zero_or_more (Elements [ "track" ]); Zero_or_more Transparent; ]; Sequence [ Zero_or_more Transparent; Zero_or_more (Elements [ "track" ]) ]; ]) ~prohibited_ancestors:[ "audio"; "video" ] ~attrs: [ make "src" ~datatype:"url" (); make "crossorigin" ~datatype:"crossorigin" (); make "preload" ~datatype:"preload" (); make "autoplay" ~datatype:"boolean" (); make "loop" ~datatype:"boolean" (); make "muted" ~datatype:"boolean" (); make "controls" ~datatype:"boolean" (); ] () let track = Element_spec.make ~name:"track" ~void:true ~categories:[] ~content_model:Nothing ~permitted_parents:[ "audio"; "video" ] ~attrs: [ make "kind" ~datatype:"kind" (); make "src" ~required:true ~datatype:"url" (); make "srclang" ~datatype:"language" (); make "label" (); make "default" ~datatype:"boolean" (); ] () let map = Element_spec.make ~name:"map" ~categories:[ Flow; Phrasing; Palpable ] ~content_model:Transparent ~attrs:[ make "name" ~required:true () ] () let area = Element_spec.make ~name:"area" ~void:true ~categories:[ Flow; Phrasing ] ~content_model:Nothing ~attrs: [ make "alt" (); make "coords" ~datatype:"coords" (); make "shape" ~datatype:"shape" (); make "href" ~datatype:"url" (); make "target" ~datatype:"target" (); make "download" (); make "ping" (); make "rel" ~datatype:"link_type" (); make "referrerpolicy" ~datatype:"referrer" (); ] ~implicit_aria_role:"link" () let all = [ picture; source; img; iframe; embed; object_; param; video; audio; track; map; area; ]