--- /dev/null
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Advanced Embedded Content #
+# #####################################################################
+
+## Attributes Common to Media Elements
+
+ # src not included
+ media.attrs =
+ ( media.attrs.autoplay?
+ & media.attrs.preload?
+ & media.attrs.controls?
+ & media.attrs.loop?
+ & media.attrs.mediagroup?
+ & media.attrs.muted?
+ & embedded.content.attrs.crossorigin?
+ )
+ media.attrs.autoplay =
+ attribute autoplay {
+ w:string "autoplay" | w:string ""
+ }
+ media.attrs.preload =
+ attribute preload {
+ w:string "none" | w:string "metadata" | w:string "auto" | w:string ""
+ }
+ media.attrs.controls =
+ attribute controls {
+ w:string "controls" | w:string ""
+ }
+ media.attrs.loop =
+ attribute loop {
+ w:string "loop" | w:string ""
+ }
+ media.attrs.mediagroup =
+ attribute mediagroup {
+ string
+ }
+ media.attrs.muted =
+ attribute muted {
+ w:string "muted" | w:string ""
+ }
+
+## Source: <source>
+
+ source.elem =
+ element source { source.inner & source.attrs }
+ source.attrs =
+ ( common.attrs
+ & source.attrs.src
+ & source.attrs.type?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ source.attrs.src =
+ attribute src {
+ common.data.uri.non-empty
+ }
+ source.attrs.type =
+ attribute type {
+ common.data.mimetype
+ }
+ source.inner =
+ ( empty )
+
+## Media Source
+
+ media.source =
+ ( media.attrs.src
+ | source.elem*
+ )
+
+ media.attrs.src =
+ attribute src {
+ common.data.uri.non-empty
+ }
+
+## Video: <video>
+
+ video.elem.flow =
+ element video { video.inner.flow & video.attrs }
+ video.elem.phrasing =
+ element video { video.inner.phrasing & video.attrs }
+ video.attrs =
+ ( common.attrs
+ & media.attrs
+ & video.attrs.poster?
+ & video.attrs.height?
+ & video.attrs.width?
+ & common.attrs.aria.landmark.application?
+ )
+ video.attrs.poster =
+ attribute poster {
+ common.data.uri.non-empty
+ }
+ video.attrs.height =
+ attribute height {
+ common.data.integer.non-negative
+ }
+ video.attrs.width =
+ attribute width {
+ common.data.integer.non-negative
+ }
+ video.inner.flow =
+ ( media.source
+ , track.elem*
+ , common.inner.transparent.flow
+ )
+ video.inner.phrasing =
+ ( media.source
+ , track.elem*
+ , common.inner.phrasing
+ )
+
+ common.elem.flow |= video.elem.flow
+ common.elem.phrasing |= video.elem.phrasing
+
+## Audio: <audio>
+
+ audio.elem.flow =
+ element audio { audio.inner.flow & audio.attrs }
+ audio.elem.phrasing =
+ element audio { audio.inner.phrasing & audio.attrs }
+ audio.attrs =
+ ( common.attrs
+ & media.attrs
+ & common.attrs.aria.landmark.application?
+ )
+ audio.inner.flow =
+ ( media.source
+ , track.elem*
+ , common.inner.transparent.flow
+ )
+ audio.inner.phrasing =
+ ( media.source
+ , track.elem*
+ , common.inner.phrasing
+ )
+
+ common.elem.flow |= audio.elem.flow
+ common.elem.phrasing |= audio.elem.phrasing
+
+## supplementary media track: <track>
+#
+ track.elem =
+ element track { track.inner & track.attrs }
+
+ track.attrs =
+ ( common.attrs
+ & track.attrs.kind?
+ & track.attrs.src
+ & track.attrs.srclang?
+ & track.attrs.label?
+ & track.attrs.default?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ track.attrs.kind =
+ attribute kind {
+ w:string "subtitles" | w:string "captions" | w:string "descriptions" | w:string "chapters" | w:string "metadata"
+ }
+ track.attrs.src =
+ attribute src {
+ common.data.uri.non-empty
+ }
+ track.attrs.srclang =
+ attribute srclang {
+ common.data.langcode
+ }
+ track.attrs.label =
+ attribute label {
+ string # must be non-empty value; check is in assertions code
+ }
+ track.attrs.default =
+ attribute default {
+ w:string "default" | w:string ""
+ }
+
+ track.inner =
+ ( empty )
+
+## Captioned Content: <figure>
+
+ figure.elem =
+ element figure { figure.inner & figure.attrs }
+ figure.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ figure.inner =
+ ( ( figcaption.elem?, common.inner.flow )
+ | ( common.inner.flow, figcaption.elem? )
+ )
+
+ common.elem.flow |= figure.elem
+
+## Figure caption: <figcaption>
+
+ figcaption.elem =
+ element figcaption { figcaption.inner & figcaption.attrs }
+ figcaption.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ figcaption.inner =
+ ( common.inner.flow )