[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master dcd917c 01/23: Consolidated all RelaxNG files into `/schem
From: |
Stefan Monnier |
Subject: |
[elpa] master dcd917c 01/23: Consolidated all RelaxNG files into `/schema` dir. |
Date: |
Thu, 14 Jan 2016 19:22:32 +0000 |
branch: master
commit dcd917ce458345acd2aa7beef6493c54ce56ba5b
Author: Michael[tm] Smith <address@hidden>
Commit: Michael[tm] Smith <address@hidden>
Consolidated all RelaxNG files into `/schema` dir.
---
.htaccess | 10 +
LICENSE | 23 +
applications.rnc | 441 +++++++++++++++++
aria.rnc | 1237 ++++++++++++++++++++++++++++++++++++++++++++++
assertions.sch | 1228 +++++++++++++++++++++++++++++++++++++++++++++
block.rnc | 249 ++++++++++
common.rnc | 512 +++++++++++++++++++
core-scripting.rnc | 344 +++++++++++++
data.rnc | 94 ++++
embed.rnc | 732 +++++++++++++++++++++++++++
form-datatypes.rnc | 63 +++
html5.rnc | 56 +++
html5exclusions.rnc | 63 +++
media.rnc | 210 ++++++++
meta.rnc | 390 +++++++++++++++
microdata.rnc | 101 ++++
phrase.rnc | 399 +++++++++++++++
rdfa.rnc | 285 +++++++++++
revision.rnc | 54 ++
ruby.rnc | 51 ++
sectional.rnc | 172 +++++++
structural.rnc | 135 +++++
tables.rnc | 244 +++++++++
web-components.rnc | 43 ++
web-forms-scripting.rnc | 27 +
web-forms.rnc | 604 ++++++++++++++++++++++
web-forms2-scripting.rnc | 9 +
web-forms2.rnc | 830 +++++++++++++++++++++++++++++++
xhtml5.rnc | 40 ++
29 files changed, 8646 insertions(+), 0 deletions(-)
diff --git a/.htaccess b/.htaccess
new file mode 100644
index 0000000..8727307
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,10 @@
+AddDescription "RelaxNG Schema for HTML 5 Core (XML)" xhtml5core.rnc
+AddDescription "RelaxNG Schema for HTML 5 Core (HTML)" html5core.rnc
+AddDescription "RelaxNG Schema for HTML 5 Exclusions" html5exclusions.rnc
+
+AddDescription "RelaxNG Schema for HTML 5: Common Definitions" common.rnc
+AddDescription "RelaxNG Schema for HTML 5: Global Structure & Meta Data"
meta.rnc
+AddDescription "RelaxNG Schema for HTML 5: (Inline) Phrase Markup" phrase.rnc
+AddDescription "RelaxNG Schema for HTML 5: Basic Block Markup" block.rnc
+AddDescription "Schema Testing Scripts and Instances" tests
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..0a2a5e0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,23 @@
+The RELAX NG Schema for (X)HTML 5 is licensed under the MIT open source
license.
+The following legal notice applies to all files in this directory:
+
+Copyright (c) 2005-2007 Elika J. Etemad (fantasai) and Henri Sivonen (hsivonen)
+Copyright (c) 2007-2012 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/applications.rnc b/applications.rnc
new file mode 100644
index 0000000..2a592fb
--- /dev/null
+++ b/applications.rnc
@@ -0,0 +1,441 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Web Application Features #
+# #####################################################################
+
+## Additions to Common Attributes
+
+ common.attrs.interact &=
+ ( common.attrs.contextmenu?
+ & common.attrs.contenteditable?
+ & common.attrs.draggable?
+ & common.attrs.dropzone?
+ & common.attrs.hidden?
+ & common.attrs.spellcheck?
+ )
+
+ common.attrs.other &= common.attrs.interact
+
+## Context Menu: contextmenu
+
+ common.attrs.contextmenu =
+ attribute contextmenu {
+ common.data.idref
+ }
+
+## Editable Content: contenteditable
+
+ common.attrs.contenteditable =
+ attribute contenteditable {
+ w:string "true" | w:string "false" | w:string ""
+ }
+
+## Draggable Element: draggable
+
+ common.attrs.draggable =
+ attribute draggable {
+ w:string "true" | w:string "false"
+ }
+
+## Dropzone: dropzone
+
+ common.attrs.dropzone =
+ attribute dropzone {
+ list {
+ ( xsd:string { pattern =
"[sS][tT][rR][iI][nN][gG]:.+" }
+ | xsd:string { pattern =
"[fF][iI][lL][eE]:.+" }
+ )*
+ ,
+ ( w:string "copy"
+ | w:string "move"
+ | w:string "link"
+ )?
+ ,
+ ( xsd:string { pattern =
"[sS][tT][rR][iI][nN][gG]:.+" }
+ | xsd:string { pattern =
"[fF][iI][lL][eE]:.+" }
+ )*
+ }
+ }
+
+## Hidden Element: hidden
+
+ common.attrs.hidden =
+ attribute hidden {
+ w:string "hidden" | w:string ""
+ }
+
+## Spellchecking and grammar checking: spellcheck
+
+ common.attrs.spellcheck =
+ attribute spellcheck{
+ w:string "true" | w:string "false" | w:string ""
+ }
+
+## Application Cache: manifest
+
+ html.attrs.manifest =
+ attribute manifest {
+ common.data.uri.non-empty
+ }
+
+ html.attrs &= html.attrs.manifest?
+
+## Progess Indicator: <progress>
+
+ progress.elem =
+ element progress { progress.inner & progress.attrs }
+ progress.attrs =
+ ( common.attrs
+ & progress.attrs.value?
+ & progress.attrs.max?
+ & ( common.attrs.aria.implicit.progressbar
+ | common.attrs.aria.role.progressbar
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ progress.attrs.value =
+ attribute value {
+ common.data.float.non-negative
+ }
+ progress.attrs.max =
+ attribute max {
+ common.data.float.positive
+ }
+ progress.inner =
+ ( common.inner.phrasing ) #Cannot enforce textContent format
here
+
+ common.elem.phrasing |= progress.elem
+
+## Dialog box, inspector, or window: <dialog>
+ dialog.elem =
+ element dialog { dialog.inner & dialog.attrs }
+ dialog.attrs =
+ ( common.attrs
+ & dialog.attrs.open?
+ & ( common.attrs.aria.implicit.dialog
+ | common.attrs.aria.role.alert
+ | common.attrs.aria.role.alertdialog
+ | common.attrs.aria.role.contentinfo
+ | common.attrs.aria.role.dialog
+ | common.attrs.aria.role.log
+ | common.attrs.aria.role.marquee
+ | common.attrs.aria.role.region
+ | common.attrs.aria.role.status
+ | common.attrs.aria.landmark.application
+ | common.attrs.aria.landmark.document
+ | common.attrs.aria.landmark.main
+ | common.attrs.aria.landmark.search
+ )?
+ )
+ dialog.attrs.open =
+ attribute open {
+ w:string "open" | w:string ""
+ }
+ dialog.inner =
+ ( common.inner.flow )
+ common.elem.flow |= dialog.elem
+
+## Toolbar: <menu type=toolbar>
+
+ menu.toolbar.elem =
+ element menu { menu.toolbar.inner & menu.toolbar.attrs }
+ menu.toolbar.attrs =
+ ( common.attrs
+ & menu.toolbar.attrs.type?
+ & ( common.attrs.aria.implicit.toolbar
+ | common.attrs.aria.role.directory
+ | common.attrs.aria.role.list
+ | common.attrs.aria.role.listbox
+ | common.attrs.aria.role.menu
+ | common.attrs.aria.role.menubar
+ | common.attrs.aria.role.tablist
+ | common.attrs.aria.role.toolbar
+ | common.attrs.aria.role.tree
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ menu.toolbar.attrs.type =
+ attribute type {
+ w:string "toolbar"
+ }
+ menu.toolbar.inner =
+ ( mli.elem*
+ | common.inner.flow
+ )
+ menu.elem |= menu.toolbar.elem
+
+## Toolbar item: <li>
+
+ mli.elem =
+ element li { mli.inner & mli.attrs }
+ mli.attrs =
+ ( common.attrs
+ & ( ( common.attrs.aria.role.listitem
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.option
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.treeitem
+ | common.attrs.aria.role.presentation
+ )
+ )?
+ )
+ mli.inner =
+ ( common.inner.flow )
+
+## Popup menu: <menu type=popup>
+
+ menu.popup.elem =
+ element menu { menu.popup.inner & menu.popup.attrs }
+ menu.popup.attrs =
+ ( common.attrs
+ & menu.popup.attrs.type?
+ & menu.attrs.label?
+ & common.attrs.aria?
+ )
+ menu.popup.attrs.type =
+ attribute type {
+ w:string "popup"
+ }
+ menu.attrs.label =
+ attribute label {
+ string
+ }
+ menu.popup.inner =
+ ( menuitem.elem*
+ & hr.elem*
+ & menu.popup.elem*
+ & common.elem.script-supporting*
+ )
+ menu.elem |= menu.popup.elem
+
+## Ambiguous menu: <menu> (with no "type" attribute)
+ menu.ambiguous.elem =
+ element menu { menu.ambiguous.inner & menu.ambiguous.attrs }
+ menu.ambiguous.attrs =
+ ( common.attrs
+ & menu.attrs.label?
+ & common.attrs.aria?
+ )
+ menu.ambiguous.inner =
+ ( ( menuitem.elem*
+ & hr.elem*
+ & menu.ambiguous.elem*
+ & common.elem.script-supporting*
+ )
+ | ( mli.elem*
+ | common.inner.flow
+ )
+ )
+ menu.elem |= menu.ambiguous.elem
+
+ common.elem.flow |= menu.elem
+ # REVISIT allow nested menus
+
+## Explicit command in popup menu: <menuitem type=command>
+ menuitem.explicit.command.elem =
+ element menuitem { menuitem.inner &
menuitem.explicit.command.attrs }
+ menuitem.explicit.command.attrs =
+ ( common.attrs
+ & menuitem.explicit.command.attrs.type?
+ & menuitem.attrs.label?
+ & menuitem.attrs.icon?
+ & menuitem.attrs.disabled?
+ & menuitem.attrs.default?
+ & common.attrs.aria?
+ )
+ menuitem.explicit.command.attrs.type =
+ attribute type {
+ w:string "command"
+ }
+ menuitem.attrs.label =
+ attribute label {
+ w:non-empty-string
+ }
+ menuitem.attrs.icon =
+ attribute icon {
+ common.data.uri.non-empty
+ }
+ menuitem.attrs.disabled =
+ attribute disabled {
+ w:string "" | w:string "disabled"
+ }
+ menuitem.attrs.default =
+ attribute default {
+ w:string "" | w:string "default"
+ }
+ menuitem.elem |= menuitem.explicit.command.elem
+
+## Checkbox in popup menu: <menuitem type=checkbox>
+ menuitem.checkbox.elem =
+ element menuitem { menuitem.inner & menuitem.checkbox.attrs }
+ menuitem.checkbox.attrs =
+ ( common.attrs
+ & menuitem.checkbox.attrs.type
+ & menuitem.attrs.label?
+ & menuitem.attrs.icon?
+ & menuitem.attrs.disabled?
+ & menuitem.attrs.checked?
+ & menuitem.attrs.radiogroup?
+ & menuitem.attrs.default?
+ & common.attrs.aria?
+ )
+ menuitem.checkbox.attrs.type =
+ attribute type {
+ w:string "checkbox"
+ }
+ menuitem.attrs.checked =
+ attribute checked {
+ w:string "checked" | w:string ""
+ }
+ menuitem.attrs.radiogroup =
+ attribute radiogroup {
+ string
+ }
+ menuitem.elem |= menuitem.checkbox.elem
+
+## Radio button in popup menu: <menuitem type=radio>
+ menuitem.radio.elem =
+ element menuitem { menuitem.inner & menuitem.radio.attrs }
+ menuitem.radio.attrs =
+ ( common.attrs
+ & menuitem.radio.attrs.type
+ & menuitem.attrs.label?
+ & menuitem.attrs.icon?
+ & menuitem.attrs.disabled?
+ & menuitem.attrs.checked?
+ & menuitem.attrs.radiogroup?
+ & menuitem.attrs.default?
+ & common.attrs.aria?
+ )
+ menuitem.radio.attrs.type =
+ attribute type {
+ w:string "radio"
+ }
+ menuitem.elem |= menuitem.radio.elem
+
+## Indirect command in popup menu: <menuitem command>
+ menuitem.indirect.command.elem =
+ element menuitem { menuitem.inner &
menuitem.indirect.command.attrs }
+ menuitem.indirect.command.attrs =
+ ( common.attrs
+ & menuitem.attrs.default?
+ & menuitem.attrs.command
+ & common.attrs.aria?
+ )
+ menuitem.attrs.command =
+ attribute command {
+ common.data.idref
+ }
+ menuitem.elem |= menuitem.indirect.command.elem
+
+ menuitem.inner =
+ ( empty )
+
+## Canvas for Dynamic Graphics: <canvas>
+
+ canvas.elem.flow =
+ element canvas { canvas.inner.flow & canvas.attrs }
+ canvas.elem.phrasing =
+ element canvas { canvas.inner.phrasing & canvas.attrs }
+ canvas.attrs =
+ ( common.attrs
+ & canvas.attrs.height?
+ & canvas.attrs.width?
+ & common.attrs.aria?
+ )
+ canvas.attrs.height =
+ attribute height {
+ common.data.integer.non-negative
+ }
+ canvas.attrs.width =
+ attribute width {
+ common.data.integer.non-negative
+ }
+ canvas.inner.flow =
+ ( common.inner.transparent.flow )
+ canvas.inner.phrasing =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= canvas.elem.flow
+ common.elem.phrasing |= canvas.elem.phrasing
+
+## Additional On-Demand Information: <details>
+
+ details.elem =
+ element details { details.inner & details.attrs }
+ details.attrs =
+ ( common.attrs
+ & details.attrs.open?
+ & ( common.attrs.aria.implicit.group #
aria-expanded must be true if open attr present; check by assertions
+ | common.attrs.aria.role.alertdialog
+ | common.attrs.aria.role.banner
+ | common.attrs.aria.role.button
+ | common.attrs.aria.role.combobox
+ | common.attrs.aria.role.dialog
+ | common.attrs.aria.role.directory
+ | common.attrs.aria.role.group
+ | common.attrs.aria.role.heading
+ | common.attrs.aria.role.img
+ | common.attrs.aria.role.link
+ | common.attrs.aria.role.list
+ | common.attrs.aria.role.listbox
+ | common.attrs.aria.role.listitem
+ | common.attrs.aria.role.log
+ | common.attrs.aria.role.marquee
+ | common.attrs.aria.role.menu
+ | common.attrs.aria.role.menubar
+ | common.attrs.aria.role.note
+ | common.attrs.aria.role.status
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.tablist
+ | common.attrs.aria.role.tabpanel
+ | common.attrs.aria.role.toolbar
+ | common.attrs.aria.role.tree
+ | common.attrs.aria.role.treeitem
+ | common.attrs.aria.landmark.application
+ | common.attrs.aria.landmark.article
+ | common.attrs.aria.landmark.complementary
+ | common.attrs.aria.landmark.contentinfo
+ | common.attrs.aria.landmark.document
+ | common.attrs.aria.landmark.form
+ | common.attrs.aria.landmark.main
+ | common.attrs.aria.landmark.navigation
+ | common.attrs.aria.landmark.search
+ )?
+ )
+ details.attrs.open =
+ attribute open {
+ w:string "open" | w:string ""
+ }
+ details.inner =
+ ( summary.elem
+ , common.inner.flow
+ )
+
+ common.elem.flow |= details.elem
+
+## Caption/summary for details element: <summary>
+
+ summary.elem =
+ element summary { summary.inner & summary.attrs }
+ summary.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.button
+ )?
+ )
+ summary.inner =
+ ( common.inner.phrasing
+ | h1.elem
+ | h2.elem
+ | h3.elem
+ | h4.elem
+ | h5.elem
+ | h6.elem
+ | hgroup.elem
+ )
diff --git a/aria.rnc b/aria.rnc
new file mode 100644
index 0000000..3e724a1
--- /dev/null
+++ b/aria.rnc
@@ -0,0 +1,1237 @@
+# #####################################################################
+## RELAX NG Schema for HTML 5: Accessible Rich Internet Applications #
+# #####################################################################
+#
+# history: http://hsivonen.iki.fi/aria-html5-bis/
+
+# #####################################################################
+## ARIA
+
+## Global states and properties
+
+aria.global =
+ ( aria.prop.atomic?
+ & aria.state.busy?
+ & aria.prop.controls?
+ & aria.prop.describedby?
+ & aria.state.disabled?
+ & aria.state.dropeffect?
+ & aria.prop.flowto?
+ & aria.state.grabbed?
+ & aria.prop.haspopup?
+ & aria.state.hidden?
+ & aria.state.invalid?
+ & aria.prop.label?
+ & aria.prop.labelledby?
+ & aria.prop.live?
+ & aria.prop.owns?
+ & aria.prop.relevant?
+ )
+
+common.attrs.other &= aria.global?
+
+## States and Properties for Native Roles
+
+common.attrs.aria.implicit.button |=
+ ( aria.state.expanded?
+ & aria.state.pressed?
+ )
+
+common.attrs.aria.implicit.checkbox |=
+ ( aria.state.checked? )
+
+common.attrs.aria.implicit.combobox |=
+ ( aria.state.expanded?
+ & aria.prop.autocomplete?
+ & aria.prop.required?
+ & aria.prop.activedescendant?
+ )
+
+common.attrs.aria.implicit.dialog |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.document |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.group |=
+ ( aria.state.expanded?
+ & aria.prop.activedescendant?
+ )
+
+common.attrs.aria.implicit.heading |=
+ ( aria.state.expanded?
+ & aria.prop.level?
+ )
+
+common.attrs.aria.implicit.img |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.link |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.listbox |=
+ ( aria.prop.multiselectable?
+ & aria.prop.required?
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+
+common.attrs.aria.implicit.listitem |=
+ ( aria.prop.level?
+ & aria.prop.posinset?
+ & aria.prop.setsize?
+ & aria.state.expanded?
+ )
+
+common.attrs.aria.implicit.option |=
+ ( aria.prop.posinset?
+ & aria.prop.setsize?
+ & aria.state.checked?
+ & aria.state.selected?
+ )
+
+common.attrs.aria.implicit.progressbar |=
+ ( aria.prop.valuemax?
+ & aria.prop.valuemin?
+ & aria.prop.valuenow?
+ & aria.prop.valuetext?
+ )
+
+common.attrs.aria.implicit.radio |=
+ ( aria.prop.posinset?
+ & aria.prop.setsize?
+ & aria.state.checked?
+ & aria.state.selected?
+ )
+
+common.attrs.aria.implicit.slider |=
+ ( aria.prop.valuemax?
+ & aria.prop.valuemin?
+ & aria.prop.valuenow?
+ & aria.prop.valuetext?
+ & aria.prop.orientation?
+ )
+
+common.attrs.aria.implicit.spinbutton |=
+ ( aria.prop.valuemax?
+ & aria.prop.valuemin?
+ & aria.prop.valuenow?
+ & aria.prop.valuetext?
+ & aria.prop.required?
+ )
+
+common.attrs.aria.implicit.textbox |=
+ ( aria.prop.activedescendant?
+ & aria.prop.autocomplete?
+ & aria.prop.multiline?
+ & aria.prop.readonly?
+ & aria.prop.required?
+ )
+
+common.attrs.aria.implicit.toolbar |=
+ ( aria.state.expanded?
+ & aria.prop.activedescendant?
+ )
+
+common.attrs.aria.implicit.column-or-row-header |=
+ ( aria.prop.sort?
+ & aria.prop.readonly?
+ & aria.prop.required?
+ & aria.state.selected?
+ & aria.state.expanded?
+ )
+
+#common.attrs.aria.implicit.select |=
+# ( aria.state.invalid?
+# & aria.prop.required?
+# & aria.prop.atomic?
+# & aria.state.busy?
+# & aria.prop.channel?
+# & aria.prop.controls?
+# & aria.prop.live?
+# & aria.prop.relevant?
+# )
+
+# section
+# |
+# |_ region
+# |
+# |_ article
+# |
+# |_ landmark
+# | |_ banner
+# | |_ complementary
+# | |_ contentinfo
+# | |_ main
+# | |_ navigation
+# |
+# |_ list
+# |
+# |_ status
+
+common.attrs.aria.implicit.section |=
+ ( aria.state.expanded? )
+
+common.attrs.aria.implicit.region |= common.attrs.aria.implicit.section
+
+common.attrs.aria.implicit.article |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.landmark |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.list |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.status |= common.attrs.aria.implicit.region
+
+common.attrs.aria.implicit.banner |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.complementary |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.contentinfo |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.main |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.navigation |= common.attrs.aria.implicit.landmark
+
+# #####################################################################
+## States
+
+## busy
+ aria.state.busy =
+ attribute aria-busy
+ { string "true"
+ | string "false" #default
+ }
+
+## checked
+ aria.state.checked =
+ attribute aria-checked
+ { string "true"
+ | string "false"
+ | string "mixed"
+ | string "undefined" #default
+ }
+
+## disabled
+ aria.state.disabled =
+ attribute aria-disabled
+ { string "true"
+ | string "false" #default
+ }
+
+## dropeffect
+ aria.state.dropeffect =
+ attribute aria-dropeffect
+ { token "none" #default
+ | token "popup"
+ | token "execute"
+ | list
+ { ( string "copy" )
+ , ( string "execute" )?
+ }
+ | list
+ { ( string "move" )
+ , ( string "execute" )?
+ }
+ | list
+ { ( string "link" )
+ , ( string "execute" )?
+ }
+ | list
+ { ( string "execute" )
+ , ( string "copy" )
+ }
+ | list
+ { ( string "execute" )
+ , ( string "move" )
+ }
+ | list
+ { ( string "execute" )
+ , ( string "link" )
+ }
+ }
+
+## expanded
+ aria.state.expanded =
+ attribute aria-expanded
+ { string "true"
+ | string "false"
+ | string "undefined" #default
+ }
+
+## grabbed
+ aria.state.grabbed =
+ attribute aria-grabbed
+ { string "true"
+ | string "false"
+ | string "undefined" #default
+ }
+
+## hidden
+ aria.state.hidden =
+ attribute aria-hidden
+ { string "true"
+ | string "false" #default
+ }
+
+## invalid
+ aria.state.invalid =
+ attribute aria-invalid
+ { string "true"
+ | string "false" #default
+ | string "grammar"
+ | string "spelling"
+ }
+
+## pressed
+ aria.state.pressed =
+ attribute aria-pressed
+ { string "true"
+ | string "false"
+ | string "mixed"
+ | string "undefined" #default
+ }
+
+## selected
+ aria.state.selected =
+ attribute aria-selected
+ { string "true"
+ | string "false"
+ | string "undefined" #default
+ }
+
+
+
+# #####################################################################
+## Properties
+
+## activedescendant
+ aria.prop.activedescendant =
+ attribute aria-activedescendant {
+ common.data.idref #REVISIT add Schematron check
+ }
+
+## atomic
+ aria.prop.atomic =
+ attribute aria-atomic
+ { string "true"
+ | string "false" #default
+ }
+
+## autocomplete
+ aria.prop.autocomplete =
+ attribute aria-autocomplete
+ { string "inline"
+ | string "list"
+ | string "both"
+ | string "none" #default
+ }
+
+## controls
+ aria.prop.controls =
+ attribute aria-controls {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## describedby
+ aria.prop.describedby =
+ attribute aria-describedby {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## flowto
+ aria.prop.flowto =
+ attribute aria-flowto {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## haspopup
+ aria.prop.haspopup =
+ attribute aria-haspopup
+ { string "true" #REVISIT check owns or descendant
+ | string "false" #default
+ }
+
+## label
+ aria.prop.label =
+ attribute aria-label {
+ string
+ }
+
+## labelledby
+ aria.prop.labelledby =
+ attribute aria-labelledby {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## level
+ aria.prop.level =
+ attribute aria-level {
+ common.data.integer.positive
+ }
+
+## live
+ aria.prop.live =
+ attribute aria-live
+ { string "off" #default
+ | string "polite"
+ | string "assertive"
+ }
+
+## multiline
+ aria.prop.multiline =
+ attribute aria-multiline
+ { string "true"
+ | string "false" #default
+ }
+
+## multiselectable
+ aria.prop.multiselectable =
+ attribute aria-multiselectable
+ { string "true"
+ | string "false" #default
+ }
+
+## orientation
+ aria.prop.orientation =
+ attribute aria-orientation
+ { string "vertical"
+ | string "horizontal" #default
+ }
+
+## owns
+ aria.prop.owns =
+ attribute aria-owns {
+ common.data.idrefs #REVISIT add Schematron check
+ }
+
+## posinset
+ aria.prop.posinset =
+ attribute aria-posinset {
+ common.data.integer.positive
+ }
+
+## readonly
+ aria.prop.readonly =
+ attribute aria-readonly
+ { string "true"
+ | string "false" #default
+ }
+ common.attrs.aria.prop.readonly |= aria.prop.readonly
+
+## relevant
+ aria.prop.relevant =
+ attribute aria-relevant
+ { token "all"
+ | list
+ { ( string "additions" )
+ , ( string "removals" )?
+ , ( string "text" )?
+ }
+ | list
+ { ( string "additions" )
+ , ( string "text" )?
+ , ( string "removals" )?
+ }
+ | list
+ { ( string "removals" )
+ , ( string "additions" )?
+ , ( string "text" )?
+ }
+ | list
+ { ( string "removals" )
+ , ( string "text" )?
+ , ( string "additions" )?
+ }
+ | list
+ { ( string "text" )
+ , ( string "additions" )?
+ , ( string "removals" )?
+ }
+ | list
+ { ( string "text" )
+ , ( string "removals" )?
+ , ( string "additions" )?
+ }
+ }
+
+## required
+ aria.prop.required =
+ attribute aria-required
+ { string "true"
+ | string "false" #default
+ }
+
+## setsize
+ aria.prop.setsize =
+ attribute aria-setsize {
+ common.data.integer.non-negative
+ }
+
+## sort
+ aria.prop.sort =
+ attribute aria-sort
+ { string "ascending"
+ | string "descending"
+ | string "none" #default
+ | string "other"
+ }
+
+## valuemax
+ aria.prop.valuemax =
+ attribute aria-valuemax {
+ common.data.float #REVISIT
+ }
+
+## valuemin
+ aria.prop.valuemin =
+ attribute aria-valuemin {
+ common.data.float #REVISIT
+ }
+
+## valuenow
+ aria.prop.valuenow =
+ attribute aria-valuenow {
+ common.data.float #REVISIT
+ }
+
+## valuetext
+ aria.prop.valuetext =
+ attribute aria-valuetext {
+ string
+ }
+
+# #####################################################################
+## Roles
+
+## alert
+ aria.alert =
+ ( aria.role.alert
+ & aria.state.expanded?
+ )
+ aria.role.alert =
+ attribute role { string "alert" }
+
+ common.attrs.aria |= aria.alert
+ common.attrs.aria.role.alert |= aria.alert
+
+## alertdialog
+ aria.alertdialog =
+ ( aria.role.alertdialog
+ & aria.state.expanded?
+ )
+ aria.role.alertdialog =
+ attribute role { string "alertdialog" }
+
+ common.attrs.aria |= aria.alertdialog
+ common.attrs.aria.role.alertdialog |= aria.alertdialog
+
+## application
+ aria.application =
+ ( aria.role.application
+ & aria.state.expanded?
+ )
+ aria.role.application =
+ attribute role { string "application" }
+
+ common.attrs.aria |= aria.application
+ common.attrs.aria.landmark.application |= aria.application
+
+## article
+ aria.article =
+ ( aria.role.article
+ & aria.state.expanded?
+ )
+ aria.role.article =
+ attribute role { string "article" }
+
+ common.attrs.aria |= aria.article
+ common.attrs.aria.landmark.article |= aria.article
+
+## banner
+ aria.banner =
+ ( aria.role.banner
+ & aria.state.expanded?
+ )
+ aria.role.banner =
+ attribute role { string "banner" }
+
+ common.attrs.aria |= aria.banner
+ common.attrs.aria.landmark.banner |= aria.banner
+
+## button
+ aria.button =
+ ( aria.role.button
+ & aria.state.expanded?
+ & aria.state.pressed? # not inherited
+ )
+ aria.role.button =
+ attribute role { string "button" }
+
+ common.attrs.aria |= aria.button
+ common.attrs.aria.role.button |= aria.button
+
+## checkbox
+ aria.checkbox =
+ ( aria.role.checkbox
+ & aria.state.checked #required!
+ )
+ aria.role.checkbox =
+ attribute role { string "checkbox" }
+
+ common.attrs.aria |= aria.checkbox
+ common.attrs.aria.role.checkbox |= aria.checkbox
+
+# columnheader
+ aria.columnheader =
+ ( aria.role.columnheader
+ & aria.prop.sort? # not inherited
+ & aria.prop.readonly? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.columnheader =
+ attribute role { string "columnheader" }
+
+ common.attrs.aria |= aria.columnheader
+
+## combobox
+ aria.combobox =
+ ( aria.role.combobox
+ & aria.prop.activedescendant?
+ & aria.state.expanded #required!
+ & aria.prop.autocomplete?
+ & aria.prop.required?
+ )
+ aria.role.combobox =
+ attribute role { string "combobox" }
+
+ common.attrs.aria |= aria.combobox
+ common.attrs.aria.role.combobox |= aria.combobox
+
+## complementary
+ aria.complementary =
+ ( aria.role.complementary
+ & aria.state.expanded?
+ )
+ aria.role.complementary =
+ attribute role { string "complementary" }
+
+ common.attrs.aria |= aria.complementary
+ common.attrs.aria.landmark.complementary |= aria.complementary
+
+## contentinfo
+ aria.contentinfo =
+ ( aria.role.contentinfo
+ & aria.state.expanded?
+ )
+ aria.role.contentinfo =
+ attribute role { string "contentinfo" }
+
+ common.attrs.aria |= aria.contentinfo
+ common.attrs.aria.landmark.contentinfo |= aria.contentinfo
+
+## definition
+ aria.definition =
+ ( aria.role.definition
+ & aria.state.expanded?
+ )
+ aria.role.definition =
+ attribute role { string "definition" }
+
+ common.attrs.aria |= aria.definition
+
+## dialog
+ aria.dialog =
+ ( aria.role.dialog
+ & aria.state.expanded?
+ )
+ aria.role.dialog =
+ attribute role { string "dialog" }
+
+ common.attrs.aria |= aria.dialog
+ common.attrs.aria.role.dialog |= aria.dialog
+
+## directory
+ aria.directory =
+ ( aria.role.directory
+ & aria.state.expanded?
+ )
+ aria.role.directory =
+ attribute role { string "directory" }
+
+ common.attrs.aria |= aria.directory
+ common.attrs.aria.role.directory |= aria.directory
+
+## document
+ aria.document =
+ ( aria.role.document
+ & aria.state.expanded?
+ )
+ aria.role.document =
+ attribute role { string "document" }
+
+ common.attrs.aria |= aria.document
+ common.attrs.aria.landmark.document |= aria.document
+
+## form
+ aria.form =
+ ( aria.role.form
+ & aria.state.expanded?
+ )
+ aria.role.form =
+ attribute role { string "form" }
+
+ common.attrs.aria |= aria.form
+ common.attrs.aria.landmark.form |= aria.form
+
+## grid
+ aria.grid =
+ ( aria.role.grid
+ & aria.prop.level? # not inherited
+ & aria.prop.multiselectable? # not inherited
+ & aria.prop.readonly? # not inherited
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.grid =
+ attribute role { string "grid" }
+
+ common.attrs.aria |= aria.grid
+
+## gridcell
+ aria.gridcell =
+ ( aria.role.gridcell
+ & aria.prop.level? # net inherited
+ & aria.prop.readonly? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.gridcell =
+ attribute role { string "gridcell" }
+
+ common.attrs.aria |= aria.gridcell
+
+## group
+ aria.group =
+ ( aria.role.group
+ & aria.prop.activedescendant? # not inherited
+ & aria.state.expanded? # not inherited
+ )
+ aria.role.group =
+ attribute role { string "group" }
+
+ common.attrs.aria |= aria.group
+ common.attrs.aria.role.group |= aria.group
+
+## heading
+ aria.heading =
+ ( aria.role.heading
+ & aria.prop.level ? # not inherited
+ & aria.state.expanded?
+ )
+ aria.role.heading =
+ attribute role { string "heading" }
+
+ common.attrs.aria |= aria.heading
+ common.attrs.aria.role.heading |= aria.heading
+
+## img
+ aria.img =
+ ( aria.role.img
+ & aria.state.expanded?
+ )
+ aria.role.img =
+ attribute role { string "img" }
+
+ common.attrs.aria |= aria.img
+ common.attrs.aria.role.img |= aria.img
+
+## link
+ aria.link =
+ ( aria.role.link
+ & aria.state.expanded?
+ )
+ aria.role.link =
+ attribute role { string "link" }
+
+ common.attrs.aria |= aria.link
+ common.attrs.aria.role.link |= aria.link
+
+## list
+ aria.list =
+ ( aria.role.list
+ & aria.state.expanded?
+ )
+ aria.role.list =
+ attribute role { string "list" }
+
+ common.attrs.aria |= aria.list
+ common.attrs.aria.role.list |= aria.list
+
+## listbox
+ aria.listbox =
+ ( aria.role.listbox
+ & aria.prop.multiselectable? # not inherited
+ & aria.prop.required?
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.listbox =
+ attribute role { string "listbox" }
+
+ common.attrs.aria |= aria.listbox
+ common.attrs.aria.role.listbox |= aria.listbox
+
+## listitem
+ aria.listitem =
+ ( aria.role.listitem
+ & aria.prop.posinset? # not inherited
+ & aria.prop.setsize? # not inherited
+ & aria.prop.level? # not inherited
+ & aria.state.expanded?
+ )
+ aria.role.listitem =
+ attribute role { string "listitem" }
+
+ common.attrs.aria |= aria.listitem
+ common.attrs.aria.role.listitem |= aria.listitem
+
+## log
+ aria.log =
+ ( aria.role.log
+ & aria.state.expanded?
+ )
+ aria.role.log =
+ attribute role { string "log" }
+
+ common.attrs.aria |= aria.log
+ common.attrs.aria.role.log |= aria.log
+
+## main
+ aria.main =
+ ( aria.role.main
+ & aria.state.expanded?
+ )
+ aria.role.main =
+ attribute role { string "main" }
+
+ common.attrs.aria |= aria.main
+ common.attrs.aria.landmark.main |= aria.main
+
+## marquee
+ aria.marquee =
+ ( aria.role.marquee
+ & aria.state.expanded?
+ )
+ aria.role.marquee =
+ attribute role { string "marquee" }
+
+ common.attrs.aria |= aria.marquee
+ common.attrs.aria.role.marquee |= aria.marquee
+
+## math
+ aria.math =
+ ( aria.role.math
+ & aria.state.expanded?
+ )
+ aria.role.math =
+ attribute role { string "math" }
+
+ common.attrs.aria |= aria.math
+
+## menu
+ aria.menu =
+ ( aria.role.menu
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.menu =
+ attribute role { string "menu" }
+
+ common.attrs.aria |= aria.menu
+ common.attrs.aria.role.menu |= aria.menu
+
+## menubar
+ aria.menubar =
+ ( aria.role.menubar
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.menubar =
+ attribute role { string "menubar" }
+
+ common.attrs.aria |= aria.menubar
+ common.attrs.aria.role.menubar |= aria.menubar
+
+
+## menuitem
+ aria.menuitem =
+ ( aria.role.menuitem )
+ aria.role.menuitem =
+ attribute role { string "menuitem" }
+
+ common.attrs.aria |= aria.menuitem
+ common.attrs.aria.role.menuitem |= aria.menuitem
+
+## menuitemcheckbox
+ aria.menuitemcheckbox =
+ ( aria.role.menuitemcheckbox
+ & aria.state.checked #required
+ )
+ aria.role.menuitemcheckbox =
+ attribute role { string "menuitemcheckbox" }
+
+ common.attrs.aria |= aria.menuitemcheckbox
+ common.attrs.aria.role.menuitemcheckbox |= aria.menuitemcheckbox
+
+## menuitemradio
+ aria.menuitemradio =
+ ( aria.role.menuitemradio
+ & aria.state.checked #required
+ & aria.state.selected?
+ & aria.prop.posinset?
+ & aria.prop.setsize?
+ )
+ aria.role.menuitemradio =
+ attribute role { string "menuitemradio" }
+
+ common.attrs.aria |= aria.menuitemradio
+ common.attrs.aria.role.menuitemradio |= aria.menuitemradio
+
+## navigation
+ aria.navigation =
+ ( aria.role.navigation
+ & aria.state.expanded?
+ )
+ aria.role.navigation =
+ attribute role { string "navigation" }
+
+ common.attrs.aria |= aria.navigation
+ common.attrs.aria.landmark.navigation |= aria.navigation
+
+## note
+ aria.note =
+ ( aria.role.note
+ & aria.state.expanded?
+ )
+ aria.role.note =
+ attribute role { string "note" }
+
+ common.attrs.aria |= aria.note
+ common.attrs.aria.landmark.note |= aria.note
+
+## option
+ aria.option =
+ ( aria.role.option
+ & aria.state.checked? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.prop.posinset?
+ & aria.prop.setsize?
+ )
+ aria.role.option =
+ attribute role { string "option" }
+
+ common.attrs.aria |= aria.option
+ common.attrs.aria.role.option |= aria.option
+
+
+## presentation
+ aria.presentation =
+ ( aria.role.presentation
+ & aria.state.expanded?
+ )
+ aria.role.presentation =
+ attribute role { string "presentation" }
+
+ common.attrs.aria |= aria.presentation
+ common.attrs.aria.role.presentation |= aria.presentation
+
+## progressbar
+ aria.progressbar =
+ ( aria.role.progressbar
+ & aria.prop.valuemax? # not inherited
+ & aria.prop.valuemin? # not inherited
+ & aria.prop.valuenow? # not inherited
+ & aria.prop.valuetext? # not inherited
+ )
+ aria.role.progressbar =
+ attribute role { string "progressbar" }
+
+ common.attrs.aria |= aria.progressbar
+ common.attrs.aria.role.progressbar |= aria.progressbar
+
+## radio
+ aria.radio =
+ ( aria.role.radio
+ & aria.state.checked #required!
+ & aria.state.selected?
+ & aria.prop.posinset?
+ & aria.prop.setsize?
+ )
+ aria.role.radio =
+ attribute role { string "radio" }
+
+ common.attrs.aria |= aria.radio
+ common.attrs.aria.role.radio |= aria.radio
+
+## radiogroup
+ aria.radiogroup =
+ ( aria.role.radiogroup
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.radiogroup =
+ attribute role { string "radiogroup" }
+
+ common.attrs.aria |= aria.radiogroup
+
+## region
+ aria.region =
+ ( aria.role.region
+ & aria.state.expanded?
+ )
+ aria.role.region =
+ attribute role { string "region" }
+
+ common.attrs.aria |= aria.region
+ common.attrs.aria.role.region |= aria.region
+
+## row
+ aria.row =
+ ( aria.role.row
+ & aria.prop.level? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.row =
+ attribute role { string "row" }
+
+ common.attrs.aria |= aria.row
+
+## rowgroup
+ aria.rowgroup =
+ ( aria.role.rowgroup
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.rowgroup =
+ attribute role { string "rowgroup" }
+
+ common.attrs.aria |= aria.rowgroup
+
+# rowheader
+ aria.rowheader =
+ ( aria.role.rowheader
+ & aria.prop.sort? # not inherited
+ & aria.prop.readonly? # not inherited
+ & aria.state.selected? # not inherited
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.rowheader =
+ attribute role { string "rowheader" }
+
+ common.attrs.aria |= aria.rowheader
+
+## scrollbar
+ aria.scrollbar =
+ ( aria.role.scrollbar
+ & aria.prop.orientation
+ & aria.prop.valuemax
+ & aria.prop.valuemin
+ & aria.prop.valuenow
+ & aria.prop.valuetext?
+ )
+ aria.role.scrollbar =
+ attribute role { string "scrollbar" }
+
+ common.attrs.aria |= aria.scrollbar
+
+## search
+ aria.search =
+ ( aria.role.search
+ & aria.state.expanded?
+ )
+ aria.role.search =
+ attribute role { string "search" }
+
+ common.attrs.aria |= aria.search
+ common.attrs.aria.landmark.search |= aria.search
+
+## separator
+ aria.separator =
+ ( aria.role.separator
+ & aria.state.expanded?
+ & aria.prop.orientation?
+ )
+ aria.role.separator =
+ attribute role { string "separator" }
+
+ common.attrs.aria |= aria.separator
+ common.attrs.aria.role.separator |= aria.separator
+
+## slider
+ aria.slider =
+ ( aria.role.slider
+ & aria.prop.valuemax
+ & aria.prop.valuemin
+ & aria.prop.valuenow
+ & aria.prop.valuetext?
+ & aria.prop.orientation?
+ )
+ aria.role.slider =
+ attribute role { string "slider" }
+
+ common.attrs.aria |= aria.slider
+ common.attrs.aria.role.slider |= aria.slider
+
+## spinbutton
+ aria.spinbutton =
+ ( aria.role.spinbutton
+ & aria.prop.valuemax
+ & aria.prop.valuemin
+ & aria.prop.valuenow
+ & aria.prop.valuetext?
+ & aria.prop.required?
+ )
+ aria.role.spinbutton =
+ attribute role { string "spinbutton" }
+
+ common.attrs.aria |= aria.spinbutton
+ common.attrs.aria.role.spinbutton |= aria.spinbutton
+
+## status
+ aria.status =
+ ( aria.role.status
+ & aria.state.expanded?
+ )
+ aria.role.status =
+ attribute role { string "status" }
+
+ common.attrs.aria |= aria.status
+ common.attrs.aria.role.status |= aria.status
+
+## tab
+ aria.tab =
+ ( aria.role.tab
+ & aria.state.selected?
+ & aria.state.expanded?
+ )
+ aria.role.tab =
+ attribute role { string "tab" }
+
+ common.attrs.aria |= aria.tab
+ common.attrs.aria.role.tab |= aria.tab
+
+## tablist
+ aria.tablist =
+ ( aria.role.tablist
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ & aria.prop.level?
+ & aria.prop.multiselectable?
+ )
+ aria.role.tablist =
+ attribute role { string "tablist" }
+ common.attrs.aria |= aria.tablist
+ common.attrs.aria.role.tablist |= aria.tablist
+
+## tabpanel
+ aria.tabpanel =
+ ( aria.role.tabpanel
+ & aria.state.expanded?
+ )
+ aria.role.tabpanel =
+ attribute role { string "tabpanel" }
+
+ common.attrs.aria |= aria.tabpanel
+ common.attrs.aria.role.tabpanel |= aria.tabpanel
+
+## textbox
+ aria.textbox =
+ ( aria.role.textbox
+ & aria.prop.activedescendant?
+ & aria.prop.autocomplete? # not inherited
+ & aria.prop.multiline? # not inherited
+ & aria.prop.readonly? # not inherited
+ & aria.prop.required?
+ )
+ aria.role.textbox =
+ attribute role { string "textbox" }
+
+ common.attrs.aria |= aria.textbox
+ common.attrs.aria.role.textbox |= aria.textbox
+
+## timer
+ aria.timer =
+ ( aria.role.timer
+ & aria.state.expanded?
+ )
+ aria.role.timer =
+ attribute role { string "timer" }
+
+ common.attrs.aria |= aria.timer
+
+## toolbar
+ aria.toolbar =
+ ( aria.role.toolbar
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ )
+ aria.role.toolbar =
+ attribute role { string "toolbar" }
+
+ common.attrs.aria |= aria.toolbar
+ common.attrs.aria.role.toolbar |= aria.toolbar
+
+## tooltip
+ aria.tooltip =
+ ( aria.role.tooltip
+ & aria.state.expanded?
+ )
+ aria.role.tooltip =
+ attribute role { string "tooltip" }
+
+ common.attrs.aria |= aria.tooltip
+
+## tree
+ aria.tree =
+ ( aria.role.tree
+ & aria.prop.multiselectable? # not inherited
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ & aria.prop.required?
+ )
+ aria.role.tree =
+ attribute role { string "tree" }
+
+ common.attrs.aria |= aria.tree
+ common.attrs.aria.role.tree |= aria.tree
+
+## treegrid
+ aria.treegrid =
+ ( aria.role.treegrid
+ & aria.prop.activedescendant?
+ & aria.state.expanded?
+ & aria.prop.level?
+ & aria.prop.multiselectable?
+ & aria.prop.readonly?
+ & aria.prop.required?
+ )
+ aria.role.treegrid =
+ attribute role { string "treegrid" }
+
+ common.attrs.aria |= aria.treegrid
+
+## treeitem
+ aria.treeitem =
+ ( aria.role.treeitem
+ & aria.state.checked?
+ & aria.state.expanded?
+ & aria.prop.level?
+ & aria.prop.posinset?
+ & aria.state.selected?
+ & aria.prop.setsize?
+ )
+ aria.role.treeitem =
+ attribute role { string "treeitem" }
+
+ common.attrs.aria |= aria.treeitem
+ common.attrs.aria.role.treeitem |= aria.treeitem
diff --git a/assertions.sch b/assertions.sch
new file mode 100644
index 0000000..77656f8
--- /dev/null
+++ b/assertions.sch
@@ -0,0 +1,1228 @@
+<?xml version="1.0"?>
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
+<!-- Schematron assertions for HTML5
-->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
+
+Copyright (c) 2005-2007 Elika J. Etemad (fantasai) and Henri Sivonen (hsivonen)
+Copyright (c) 2007-2012 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+<schema xmlns='http://www.ascc.net/xml/schematron'>
+ <ns prefix='h' uri='http://www.w3.org/1999/xhtml'/>
+
+ <pattern name="required attributes">
+ <rule context='h:bdo'>
+ <assert test='@dir'>
+ A “bdo” element must have a
+ “dir” attribute.
+ </assert>
+ </rule>
+ <rule context='h:img[not(@alt)]'>
+ <assert test='(@title and not(@title = ""))
+ or //h:meta[(translate(@name,
+ "GENERATOR", "generator") = "generator")]
+ or (ancestor::h:figure
+ and (ancestor::h:figure[1]/h:figcaption
+ and
not(ancestor::h:figure[1]/h:figcaption = ""))
+ and normalize-space(ancestor::h:figure[1])
+ =
normalize-space(ancestor::h:figure[1]/h:figcaption)
+ and not(ancestor::h:figure[1]//*[
+ local-name() = "audio"
+ or local-name() = "canvas"
+ or local-name() = "embed"
+ or local-name() = "iframe"
+ or local-name() = "math"
+ or local-name() = "object"
+ or local-name() = "svg"
+ or local-name() = "video"])
+ and not(count(ancestor::h:figure[1]//h:img) >
1))'>
+ An “img” element must have an
+ “alt” attribute, except under
certain
+ conditions. For details, consult guidance on
+ providing text alternatives for images.
+
http://www.w3.org/wiki/HTML/Usage/TextAlternatives
+ </assert>
+ </rule>
+ </pattern>
+
+ <pattern name='Triggered on mutually exclusive elements and
prohibited-descendant cases'>
+
+ <!-- Exclusions and prohibited-descendant contraints - - - - - - - - -
- - -->
+
+ <rule context='h:form|h:dfn|h:noscript|h:address'>
+ <report test='ancestor::*[name() = name(current())]'>
+ The “<name/>” element must not
contain any nested
+ “<name/>” elements.
+ </report>
+ </rule>
+
+ <rule context='h:label'>
+ <report test='ancestor::*[name() = name(current())]'>
+ The “<name/>” element must not
contain any nested
+ “<name/>” elements.
+ </report>
+ <report test='count(descendant::h:input
+ | descendant::h:button
+ | descendant::h:select
+ | descendant::h:keygen
+ | descendant::h:textarea) > 1'>
+ The “label” element may contain
at most one descendant
+ “input” element,
+ “button” element,
+ “select” element,
+ or “textarea” element.
+ </report>
+ <report test='@for and
+ not(//h:input[not(translate(@type,
"HIDEN", "hiden")="hidden")address@hidden = current()/@for] or
+ //h:address@hidden = current()/@for] or
+ //h:address@hidden = current()/@for] or
+ //h:address@hidden = current()/@for] or
+ //h:address@hidden = current()/@for] or
+ //h:address@hidden = current()/@for])'>
+ The “for” attribute of the
“label”
+ element must refer to a form control.
+ </report>
+ </rule>
+
+ <rule context='h:section|h:nav|h:article|h:aside'>
+ <report test='ancestor::h:address'>
+ The sectioning element “<name/>”
must not
+ appear as a descendant of the
“address” element.
+ </report>
+ </rule>
+
+ <rule context='h:footer'>
+ <report test='ancestor::h:header'>
+ The element “footer” must not
+ appear as a descendant of the
“header” element.
+ </report>
+ <report test='ancestor::h:footer'>
+ The element “footer” must not
+ appear as a descendant of the
“footer” element.
+ </report>
+ <report test='ancestor::h:address'>
+ The element “footer” must not
+ appear as a descendant of the
“address” element.
+ </report>
+ </rule>
+
+ <rule context='h:h1|h:h2|h:h3|h:h4|h:h5|h:h6'>
+ <report test='ancestor::h:address'>
+ The “<name/>” element must not
appear as a
+ descendant of the “address”
element.
+ </report>
+ </rule>
+
+ <rule context='h:header'>
+ <report test='ancestor::h:footer'>
+ The “<name/>” element must not
appear as a
+ descendant of the “footer”
element.
+ </report>
+ <report test='ancestor::h:address'>
+ The “<name/>” element must not
appear as a
+ descendant of the “address”
element.
+ </report>
+ <report test='ancestor::h:header'>
+ The “header” element must not
appear as a
+ descendant of the “header”
element.
+ </report>
+ </rule>
+
+ <rule context='h:table'>
+ <report test='ancestor::h:caption'>
+ The element “table” must not
appear as a
+ descendant of the “caption”
element.
+ </report>
+ <report test='@summary' role='warning'>
+ The “summary” attribute on the
+ “table” element is obsolete.
+ Consider describing the structure of the table
+ in a “caption” element or
+ in a “figure” element containing
+ the “table” element; or, simplify
+ the structue of the table so that no
+ description is needed.
+ </report>
+ </rule>
+ </pattern>
+
+ <!-- Interactive element exclusions -->
+ <pattern name='interactive element exclusions'>
+
+ <!--
+ - Interactive descendants:
+ - a
+ - video[controls]
+ - audio[controls]
+ - details
+ - menu[type=toolbar]
+ - button
+ - input[type!=hidden]
+ - textarea
+ - select
+ - img[usemap]
+ - embed
+ - iframe
+ - keygen
+ - label
+ - object[usemap]
+
+ - Interactive ancestors
+ - a
+ - button
+ -->
+
+ <rule context='h:a|h:details|h:embed|h:iframe|h:label'>
+ <report test='ancestor::h:a'>
+ The interactive element “<name/>”
must not
+ appear as a descendant of the “a”
element.
+ </report>
+ <report test='ancestor::h:button'>
+ The interactive element “<name/>”
must not
+ appear as a descendant of the
“button” element.
+ </report>
+ </rule>
+
+ <rule
context='h:button|h:textarea|h:select|h:keygen|h:input[not(translate(@type,
"HIDEN", "hiden")="hidden")]'>
+ <report test='ancestor::h:a'>
+ The interactive element “<name/>”
must not
+ appear as a descendant of the “a”
element.
+ </report>
+ <report test='ancestor::h:button'>
+ The interactive element “<name/>”
must not
+ appear as a descendant of the
“button” element.
+ </report>
+ <report test='ancestor::h:address@hidden and
not(ancestor::h:address@hidden = current()/@id])'>
+ Any “<name/>” element descendant
of a “label” element
+ with a “for” attribute must have
an
+ ID value that matches that “for”
attribute.
+ </report>
+ </rule>
+
+ <rule context='h:address@hidden|h:address@hidden'>
+ <report test='ancestor::h:a'>
+ The interactive element “<name/>”
+ with the attribute “controls”
must not
+ appear as a descendant of the “a”
element.
+ </report>
+ <report test='ancestor::h:button'>
+ The interactive element “<name/>”
+ with the attribute “controls”
must not
+ appear as a descendant of the
“button” element.
+ </report>
+ </rule>
+
+ <rule context='h:menu[translate(@type, "TOLBAR",
"tolbar")="toolbar"]'>
+ <report test='ancestor::h:a'>
+ The element “menu”
+ with the attribute “type” whose
value is “toolbar” must not
+ appear as a descendant of the “a”
element.
+ </report>
+ <report test='ancestor::h:button'>
+ The element “menu”
+ with the attribute “type” whose
value is “toolbar” must not
+ appear as a descendant of the
“button” element.
+ </report>
+ </rule>
+
+ <rule context='h:address@hidden'>
+ <report test='ancestor::h:a'>
+ The element “img”
+ with the attribute “usemap” must
not
+ appear as a descendant of the “a”
element.
+ </report>
+ <report test='ancestor::h:button'>
+ The element “img”
+ with the attribute “usemap” must
not
+ appear as a descendant of the
“button” element.
+ </report>
+ </rule>
+
+ <rule context='h:address@hidden'>
+ <report test='ancestor::h:a'>
+ The element “object”
+ with the attribute “usemap” must
not
+ appear as a descendant of the “a”
element.
+ </report>
+ <report test='ancestor::h:button'>
+ The element “object”
+ with the attribute “usemap” must
not
+ appear as a descendant of the
“button” element.
+ </report>
+ </rule>
+ </pattern>
+
+ <!-- REVISIT fieldset
http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2006-April/006181.html -->
+
+ <!-- Misc requirements -->
+
+ <pattern name="miscellaneous requirements">
+ <rule context='h:area'>
+ <assert test='ancestor::h:map'>
+ The “area” element must have an
ancestor
+ “map” element.
+ </assert>
+ </rule>
+
+ <rule context='h:address@hidden'>
+ <assert test='ancestor::h:address@hidden'>
+ The “img” element with the
+ “ismap” attribute set must have
an ancestor
+ “a” element with the
“href” attribute.
+ </assert>
+ </rule>
+
+ <rule context='h:input'>
+ <report test='@list and not(//h:address@hidden =
current()/@list])'>
+ The “list” attribute of the
“input”
+ element must refer to a
“datalist” element.
+ </report>
+ <report test='@type = "button" and (not(@value) or
@value = "")'>
+ Element “input” with attribute
“type”
+ whose value is “button” must have
non-empty attribute
+ “value”.
+ </report>
+ </rule>
+
+ <rule context='h:track'>
+ <report test='@label = ""'>
+ Attribute “label” for element
“track”
+ must have non-empty value.
+ </report>
+ <report test='@default and
preceding-sibling::h:address@hidden'>
+ The “default” attribute must not
occur on more than one
+ “track” element within the same
“audio”
+ element or “video” element.
+ </report>
+ </rule>
+
+ <rule context='h:address@hidden and @name]'>
+ <assert test='@id = @name'>
+ The “id” attribute on a
“map” element must have
+ the same value as the “name”
attribute.
+ </assert>
+ </rule>
+
+ <rule context='h:select'>
+ <report test='not(@multiple) and
count(descendant::h:address@hidden) > 1'>
+ The “select” element cannot have
more than one
+ selected “option” element
descendant unless the
+ “multiple” attribute is specified.
+ </report>
+ <report test='@required and not(@multiple)
+ and (not(@size)
+ or (starts-with(normalize-space(@size),
"+")
+ and substring-after(@size,"+") = 1)
+ or @size = 1)
+ and not(h:option)'>
+ A “select” element with
+ a “required” attribute and without
+ a “multiple” attribute, and whose
+ size is “1”, must have a child
+ “option” element.
+ </report>
+ </rule>
+
+ <rule context='h:address@hidden and not(@multiple)
+ and (not(@size)
+ or (starts-with(normalize-space(@size), "+")
+ and substring-after(@size,"+") = 1)
+ or @size = 1)]/h:option[1]'>
+ <assert test='(@value and @value = "")
+ or ((not(@value) or @value = "") and . = "")'>
+ The first child “option” element
+ of a “select” element with
+ a “required” attribute and without
+ a “multiple” attribute, and whose
+ size is “1”, must have either an
+ empty “value” attribute, or must
+ have no text content.
+ </assert>
+ </rule>
+
+ <rule context='h:script'>
+ <report test='@language and translate(@language,
"JAVSCRIPT", "javscript")="javascript"
+ and @type and not(translate(@type,
"EXJAVSCRIPT", "exjavscript")="text/javascript")'>
+ Element “script” with attribute
+ “language” whose value is
“JavaScript”
+ must not have attribute “type”
whose value is not
+ “text/javascript”.
+ </report>
+ <report test='not(@src) and @charset'>
+ Element “script” must not have
attribute
+ “charset” unless attribute
“src” is
+ also specified.
+ </report>
+ <report test='not(@src) and @defer'>
+ Element “script” must not have
attribute
+ “defer” unless attribute
“src” is
+ also specified.
+ </report>
+ <report test='not(@src) and @async'>
+ Element “script” must not have
attribute
+ “async” unless attribute
“src” is
+ also specified.
+ </report>
+ </rule>
+
+ <rule context='h:time'>
+ <report test='ancestor::h:time'>
+ The element “time” must not
+ appear as a descendant of the
“time” element.
+ </report>
+ </rule>
+
+ <rule context='h:progress'>
+ <report test='ancestor::h:progress'>
+ The element “progress” must not
+ appear as a descendant of the
“progress” element.
+ </report>
+ <assert test='@max and @value and number(@value) <=
number(@max)'>
+ The value of the “value”
attribute must be less than or equal to
+ the value of the “max” attribute.
+ </assert>
+ <assert test='not(@max) and @value and number(@value)
<= 1'>
+ The value of the “value”
attribute must be less than or equal to
+ one when the “max” attribute is
absent.
+ </assert>
+ </rule>
+
+ <!--
+ min <= value <= max
+ min <= low <= high <= max
+ min <= optimum <= max
+ -->
+
+ <rule context='h:meter'>
+ <report test='ancestor::h:meter'>
+ The element “meter” must not
+ appear as a descendant of the
“meter” element.
+ </report>
+ <report test='@min and @value and not(number(@min)
<= number(@value))'>
+ The value of the “min” attribute
must be less than or equal to
+ the value of the “value”
attribute.
+ </report>
+ <report test='not(@min) and @value and not(0 <=
number(@value))'>
+ The value of the “value”
attribute must be greater than or equal to
+ zero when the “min” attribute is
absent.
+ </report>
+ <report test='@value and @max and not(number(@value)
<= number(@max))'>
+ The value of the “value”
attribute must be less than or equal to
+ the value of the “max” attribute.
+ </report>
+ <report test='@value and not(@max) and
not(number(@value) <= 1)'>
+ The value of the “value”
attribute must be less than or equal to
+ one when the “max” attribute is
absent.
+ </report>
+ <report test='@min and @max and not(number(@min) <=
number(@max))'>
+ The value of the “min” attribute
must be less than or equal to
+ the value of the “max” attribute.
+ </report>
+ <report test='not(@min) and @max and not(0 <=
number(@max))'>
+ The value of the “max” attribute
must be greater than or equal to
+ zero when the “min” attribute is
absent.
+ </report>
+ <report test='@min and not(@max) and not(number(@min)
<= 1)'>
+ The value of the “min” attribute
must be less than or equal to
+ one when the “max” attribute is
absent.
+ </report>
+ <report test='@min and @low and not(number(@min) <=
number(@low))'>
+ The value of the “min” attribute
must be less than or equal to
+ the value of the “low” attribute.
+ </report>
+ <report test='not(@min) and @low and not(0 <=
number(@low))'>
+ The value of the “low” attribute
must be greater than or equal to
+ zero when the “min” attribute is
absent.
+ </report>
+ <report test='@min and @high and not(number(@min) <=
number(@high))'>
+ The value of the “min” attribute
must be less than or equal to
+ the value of the “high” attribute.
+ </report>
+ <report test='not(@min) and @high and not(0 <=
number(@high))'>
+ The value of the “high” attribute
must be greater than or equal to
+ zero when the “min” attribute is
absent.
+ </report>
+ <report test='@low and @high and not(number(@low) <=
number(@high))'>
+ The value of the “low” attribute
must be less than or equal to
+ the value of the “high” attribute.
+ </report>
+ <report test='@high and @max and not(number(@high)
<= number(@max))'>
+ The value of the “high”
attribute must be less than or equal to
+ the value of the “max” attribute.
+ </report>
+ <report test='@high and not(@max) and not(number(@high)
<= 1)'>
+ The value of the “high”
attribute must be less than or equal to
+ one when the “max” attribute is
absent.
+ </report>
+ <report test='@low and @max and not(number(@low) <=
number(@max))'>
+ The value of the “low” attribute
must be less than or equal to
+ the value of the “max” attribute.
+ </report>
+ <report test='@low and not(@max) and not(number(@low)
<= 1)'>
+ The value of the “low” attribute
must be less than or equal to
+ one when the “max” attribute is
absent.
+ </report>
+ <report test='@min and @optimum and not(number(@min)
<= number(@optimum))'>
+ The value of the “min” attribute
must be less than or equal to
+ the value of the “optimum”
attribute.
+ </report>
+ <report test='not(@min) and @optimum and not(0 <=
number(@optimum))'>
+ The value of the “optimum”
attribute must be greater than or equal to
+ zero when the “min” attribute is
absent.
+ </report>
+ <report test='@optimum and @max and
not(number(@optimum) <= number(@max))'>
+ The value of the “optimum”
attribute must be less than or equal to
+ the value of the “max” attribute.
+ </report>
+ <report test='@optimum and not(@max) and
not(number(@optimum) <= 1)'>
+ The value of the “optimum”
attribute must be less than or equal to
+ one when the “max” attribute is
absent.
+ </report>
+ </rule>
+ </pattern>
+
+ <!-- Obsolete Elements - - - - - - - - - - - - - - - - - - - - - - -->
+ <pattern name="obsolete elements">
+ <rule context='h:acronym'>
+ <report test='true()'>
+ The “acronym” element is
obsolete. Use the “abbr” element instead.
+ </report>
+ </rule>
+
+ <rule context='h:applet'>
+ <report test='true()'>
+ The “applet” element is obsolete.
Use the “object” element instead.
+ </report>
+ </rule>
+
+ <rule context='h:center|h:font|h:big|h:strike|h:tt|h:basefont'>
+ <report test='true()'>
+ The “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:dir'>
+ <report test='true()'>
+ The “dir” element is obsolete.
Use the “ul” element instead.
+ </report>
+ </rule>
+
+ <rule context='h:frameset|h:noframes'>
+ <report test='true()'>
+ The “<name/>” element is obsolete.
+ Use the “iframe” element and CSS
instead, or use server-side includes.
+ </report>
+ </rule>
+ </pattern>
+
+ <!-- Obsolete Attributes- - - - - - - - - - - - - - - - - - - - - - -->
+
+ <pattern name="obsolete attributes">
+ <rule context='h:a'>
+ <report test='@coords'>
+ The “coords” attribute on the
“<name/>” element is obsolete.
+ For image maps, use the “area”
element instead of the “a” element.
+ </report>
+ <report test='@shape'>
+ The “shape” attribute on the
“<name/>” element is obsolete.
+ For image maps, use the “area”
element instead of the “a” element.
+ </report>
+ <report test='@urn'>
+ The “urn” attribute on the
“<name/>” element is obsolete.
+ Specify the preferred persistent identifier
using the “href” attribute instead.
+ </report>
+ <report test='@charset'>
+ The “charset” attribute on the
“<name/>” element is obsolete.
+ Use an HTTP Content-Type header on the linked
resource instead.
+ </report>
+ <report test='@methods'>
+ The “methods” attribute on the
“<name/>” element is obsolete.
+ Use the HTTP OPTIONS feature instead.
+ </report>
+ <report test='@rev'>
+ The “rev” attribute on the
“<name/>” element is obsolete.
+ Use the “rel” attribute instead,
with a term having the opposite meaning.
+ </report>
+ </rule>
+
+ <rule context='h:link'>
+ <report test='@target'>
+ The “target” attribute on the
“<name/>” element is obsolete.
+ You can safely omit it.
+ </report>
+ <report test='@urn'>
+ The “urn” attribute on the
“<name/>” element is obsolete.
+ Specify the preferred persistent identifier
using the “href” attribute instead.
+ </report>
+ <report test='@charset'>
+ The “charset” attribute on the
“<name/>” element is obsolete.
+ Use an HTTP Content-Type header on the linked
resource instead.
+ </report>
+ <report test='@methods'>
+ The “methods” attribute on the
“<name/>” element is obsolete.
+ Use the HTTP OPTIONS feature instead.
+ </report>
+ <report test='@rev'>
+ The “rev” attribute on the
“<name/>” element is obsolete.
+ Use the “rel” attribute instead,
with a term having the opposite meaning.
+ </report>
+ </rule>
+
+ <rule context="h:area">
+ <report test='@nohref'>
+ The “nohref” attribute on the
“<name/>” element is obsolete.
+ Omitting the “href” attribute is
sufficient.
+ </report>
+ </rule>
+
+ <rule context='h:embed'>
+ <report test='@name'>
+ The “name” attribute on the
“<name/>” element is obsolete.
+ Use the “id” attribute instead.
+ </report>
+ </rule>
+
+ <rule context='h:head'>
+ <report test='@profile'>
+ The “profile” attribute on the
“<name/>” element is obsolete.
+ To declare which “meta” element
terms are used in the document, instead register the
+ names as meta extensions.
<http://wiki.whatwg.org/wiki/MetaExtensions>
+ To trigger specific UA behaviors, use a
“link” element instead.
+ </report>
+ </rule>
+
+ <rule context='h:html'>
+ <report test='@version'>
+ The “version” attribute on the
“<name/>” element is obsolete.
+ You can safely omit it.
+ </report>
+ </rule>
+
+ <rule context='h:iframe'>
+ <report test='@longdesc'>
+ The “longdesc” attribute on the
“<name/>” element is obsolete.
+ Use a regular “a” element to link
to the description.
+ </report>
+ </rule>
+
+ <rule context='h:img'>
+ <report test='@longdesc'>
+ The “longdesc” attribute on the
“<name/>” element is obsolete.
+ Use a regular “a” element to link
to the description.
+ </report>
+ <report test='@name'>
+ The “name” attribute on the
“<name/>” element is obsolete.
+ Use the “id” attribute instead.
+ </report>
+ </rule>
+
+ <rule context='h:input'>
+ <report test='@usemap'>
+ The “usemap” attribute on the
“<name/>” element is obsolete.
+ Use the “img” element instead of
the “input” element for image maps.
+ </report>
+ </rule>
+
+ <rule context='h:li|h:ul'>
+ <report test='@type'>
+ The “type” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:meta'>
+ <report test='@scheme'>
+ The “scheme” attribute on the
“<name/>” element is obsolete.
+ Use only one scheme per field, or make the
scheme declaration part of the value.
+ </report>
+ <report test='translate(@http-equiv,"CONTELAGUA",
"contelagua")="content-language"' role='warning'>
+ Using the “meta” element to
specify the document-wide default language is obsolete.
+ Consider specifying the language on the root
element instead.
+ </report>
+ </rule>
+
+ <rule context='h:object'>
+ <report test='@archive'>
+ The “archive” attribute on the
“<name/>” element is obsolete.
+ Use the “data” attribute and
“type” attribute to invoke plugins.
+ To set a parameter with the name
“archive”, use the “param” element.
+ </report>
+ <report test='@classid'>
+ The “classid” attribute on the
“<name/>” element is obsolete.
+ Use the “data” attribute and
“type” attribute to invoke plugins.
+ To set a parameter with the name
“classid”, use the “param” element.
+ </report>
+ <report test='@code'>
+ The “code” attribute on the
“<name/>” element is obsolete.
+ Use the “data” attribute and
“type” attribute to invoke plugins.
+ To set a parameter with the name
“code”, use the “param” element.
+ </report>
+ <report test='@codebase'>
+ The “codebase” attribute on the
“<name/>” element is obsolete.
+ Use the “data” attribute and
“type” attribute to invoke plugins.
+ To set a parameter with the name
“codebase”, use the “param” element.
+ </report>
+ <report test='@codetype'>
+ The “codetype” attribute on the
“<name/>” element is obsolete.
+ Use the “data” attribute and
“type” attribute to invoke plugins.
+ To set a parameter with the name
“codetype”, use the “param” element.
+ </report>
+ <report test='@declare'>
+ The “declare” attribute on the
“<name/>” element is obsolete.
+ Repeat the “object” element
completely each time the resource is to be reused.
+ </report>
+ <report test='@standby'>
+ The “standby” attribute on the
“<name/>” element is obsolete.
+ Optimize the linked resource so that it loads
quickly or, at least, incrementally.
+ </report>
+ </rule>
+
+ <rule context='h:option'>
+ <report test='@name'>
+ The “name” attribute on the
“<name/>” element is obsolete.
+ Use the “id” attribute instead.
+ </report>
+ </rule>
+
+ <rule context='h:param'>
+ <report test='@type'>
+ The “type” attribute on the
“<name/>” element is obsolete.
+ Use the “name” attribute and
“value” attribute without declaring value types.
+ </report>
+ <report test='@valuetype'>
+ The “valuetype” attribute on the
“<name/>” element is obsolete.
+ Use the “name” attribute and
“value” attribute without declaring value types.
+ </report>
+ </rule>
+
+ <rule context='h:address@hidden and not(translate(@language,
"JAVSCRIPT", "javscript")="javascript")]'>
+ <report test='true()'>
+ The “language” attribute on the
“script” element is obsolete.
+ Use the “type” attribute instead.
+ </report>
+ </rule>
+
+ <rule context='h:td|h:th'>
+ <report test='@scope and self::h:td'>
+ The “scope” attribute on the
“td” element is obsolete.
+ Use the “scope” attribute on a
“th” element instead.
+ </report>
+ <report test='@abbr'>
+ The “abbr” attribute on the
“<name/>” element is obsolete.
+ Consider instead beginning the cell contents
with concise text, followed by further elaboration if needed.
+ </report>
+ <report test='@axis'>
+ The “axis” attribute on the
“<name/>” element is obsolete.
+ Use the “scope” attribute instead.
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name="obsolete presentational align attribute">
+ <rule
context='h:caption|h:iframe|h:img|h:input|h:object|h:embed|h:legend
+
|h:table|h:hr|h:div|h:h1|h:h2|h:h3|h:h4|h:h5|h:h6|h:p|h:col|h:colgroup
+ |h:tbody|h:td|h:tfoot|h:th|h:thead|h:tr'>
+ <report test='@align'>
+ The “align” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name="obsolete presentational width attribute">
+ <rule context='h:col|h:colgroup|h:hr|h:pre|h:table|h:td|h:th'>
+ <report test='@width'>
+ The “width” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name="obsolete presentational table attributes">
+ <rule
context='h:col|h:colgroup|h:tbody|h:td|h:tfoot|h:th|h:thead|h:tr'>
+ <report test='@char'>
+ The “char” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@charoff'>
+ The “charoff” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@valign'>
+ The “valign” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name="obsolete presentational attributes">
+ <rule context='h:body'>
+ <report test='@alink'>
+ The “alink” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@background'>
+ The “background” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@bgcolor'>
+ The “bgcolor” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@link'>
+ The “link” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@marginbottom'>
+ The “marginbottom” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@marginheight'>
+ The “marginheight” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@marginleft'>
+ The “marginleft” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@marginright'>
+ The “marginright” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@margintop'>
+ The “margintop” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@marginwidth'>
+ The “marginwidth” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@text'>
+ The “text” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@vlink'>
+ The “vlink” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:br'>
+ <report test='@clear'>
+ The “clear” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:embed'>
+ <report test='@hspace'>
+ The “hspace” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@vspace'>
+ The “vspace” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:hr'>
+ <report test='@noshade'>
+ The “noshade” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@size'>
+ The “size” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@color'>
+ The “color” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:dl|h:menu|h:ol|h:ul'>
+ <report test='@compact'>
+ The “compact” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:iframe'>
+ <report test='@allowtransparency'>
+ The “allowtransparency” attribute
on the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@frameborder'>
+ The “frameborder” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@marginheight'>
+ The “marginheight” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@marginwidth'>
+ The “marginwidth” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@scrolling'>
+ The “scrolling” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:img|h:object'>
+ <report test='@hspace'>
+ The “hspace” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@vspace'>
+ The “vspace” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@border and self::h:object'>
+ The “border” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:table'>
+ <report test='@bgcolor'>
+ The “bgcolor” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@border and not(@border = "" or @border =
"1")'>
+ The value of the “border”
attribute on the “<name/>” element
+ must be either “1” or the empty
string. To regulate the thickness of table borders,
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@cellpadding'>
+ The “cellpadding” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@cellspacing'>
+ The “cellspacing” attribute on
the “<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@frame'>
+ The “frame” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@rules'>
+ The “rules” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:td|h:th'>
+ <report test='@bgcolor'>
+ The “bgcolor” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@height'>
+ The “height” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ <report test='@nowrap'>
+ The “nowrap” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+
+ <rule context='h:tr'>
+ <report test='@bgcolor'>
+ The “bgcolor” attribute on the
“<name/>” element is obsolete.
+ Use CSS instead.
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+ </report>
+ </rule>
+ </pattern>
+
+<!-- lang and xml:lang in XHTML - - - - - - - - - - - - - - - - - -->
+
+ <pattern name='lang and xml:lang in XHTML'>
+ <rule context='h:address@hidden and @xml:lang]'>
+ <assert test='translate(@lang,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz") =
translate(@xml:lang, "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
"abcdefghijklmnopqrstuvwxyz")'>
+ When the attribute “lang” in no
namespace and the attribute “lang”
+ in the XML namespace are both present, they
must have the same value.
+ </assert>
+ </rule>
+ </pattern>
+
+<!-- IDREFs - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+ <!-- Assuming that ID uniqueness is already enforced. -->
+
+ <pattern name='contextmenu must refer to a menu'>
+ <rule context='h:address@hidden'>
+ <assert test='//h:address@hidden = current()/@contextmenu]'>
+ The “contextmenu” attribute must
refer to a
+ “menu” element.
+ </assert>
+ </rule>
+ </pattern>
+
+ <!-- FIXME form attribute -->
+
+ <!-- FIXME output for -->
+
+<!-- Unique Definitions - - - - - - - - - - - - - - - - - - - - - -->
+
+ <!-- Only one definition per term per document' -->
+
+<!-- ARIA containment - - - - - - - - - - - - - - - - - - - - - -->
+
+ <pattern name='Mutually Exclusive Role triggers'>
+
+ <!-- XXX columnheader and rowheader require row parent -->
+
+ <rule context='address@hidden"option"]'>
+ <assert test='../@role="listbox"'>
+ An element with “role=option”
requires
+ “role=listbox” on the parent.
+ </assert>
+ </rule>
+
+ <rule context='address@hidden"menuitem"]'>
+ <assert test='../@role="menu"'>
+ An element with “role=menuitem”
requires
+ “role=menu” on the parent.
+ </assert>
+ </rule>
+
+ <rule context='address@hidden"menuitemcheckbox"]'>
+ <assert test='../@role="menu"'>
+ An element with
“role=menuitemcheckbox” requires
+ “role=menu” on the parent.
+ </assert>
+ </rule>
+
+ <rule context='address@hidden"menuitemradio"]'>
+ <assert test='../@role="menu"'>
+ An element with
“role=menuitemradio” requires
+ “role=menu” on the parent.
+ </assert>
+ </rule>
+
+ <rule context='address@hidden"tab"]'>
+ <assert test='../@role="tablist"'>
+ An element with “role=tab”
requires
+ “role=tablist” on the parent.
+ </assert>
+ </rule>
+
+ <rule context='address@hidden"treeitem"]'>
+ <assert test='../@role="tree"'>
+ An element with “role=treeitem”
requires
+ “role=tree” on the parent.
+ </assert>
+ </rule>
+
+ <rule context='address@hidden"listitem"]'>
+ <assert test='../@role="list"'>
+ An element with “role=listitem”
requires
+ “role=list” on the parent.
+ </assert>
+ </rule>
+
+ <rule context='address@hidden"row"]'>
+ <assert test='../@role="grid" or
+ ../../@role="grid" or
+ ../@role="treegrid" or
+ ../../@role="treegrid"'>
+ An element with “role=row”
requires
+ “role=treegrid” or
“role=grid” on the parent or grandparent.
+ </assert>
+ </rule>
+ <!-- XXX hoping for a spec change so not bothering with the
reciprocal case -->
+
+ <rule context='address@hidden"gridcell"]'>
+ <assert test='../@role="row"'>
+ An element with “role=gridcell”
requires
+ “role=row” on the parent.
+ </assert>
+ </rule>
+ <!-- XXX hoping for a spec change so not bothering with the
reciprocal case -->
+
+ </pattern>
+
+ <pattern name='Not Option'>
+ <rule context='*[not(@role="option")]'>
+ <report test='../@role="listbox"'>
+ An element must not be a child of
+ “role=listbox” unless it has
“role=option”.
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name='Not menuitem*'>
+ <rule context='*[not(@role="menuitem" or
+ @role="menuitemcheckbox" or
+ @role="menuitemradio")]'>
+ <report test='../@role="menu"'>
+ An element must not be a child of
+ “role=menu” unless it has
+ “role=menuitem”,
+ “role=menuitemcheckbox” or
+ “role=menuitemradio”.
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name='Not treeitem'>
+ <rule context='*[not(@role="treeitem")]'>
+ <report test='../@role="tree"'>
+ An element must not be a child of
+ “role=tree” unless it has
+ “role=treeitem”.
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name='Not listitem'>
+ <rule context='*[not(@role="listitem")]'>
+ <report test='../@role="list"'>
+ An element must not be a child of
+ “role=list” unless it has
+ “role=listitem”.
+ </report>
+ </rule>
+ <!-- XXX role=group omitted due to lack of detail in spec -->
+ </pattern>
+
+ <pattern name='Not radio'>
+ <rule context='*[not(@role="radio")]'>
+ <report test='../@role="radiogroup"'>
+ An element must not be a child of
+ “role=radiogroup” unless it has
+ “role=radio”.
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name='Not gridcell'>
+ <rule context='*[not(@role="gridcell")]'>
+ <report test='../@role="row"'>
+ An element must not be a child of
+ “role=row” unless it has
+ “role=gridcell”.
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name='Not tab'>
+ <rule context='*[not(@role="tab")]'>
+ <report test='../@role="tablist"'>
+ An element must not be a child of
+ “role=tablist” unless it has
+ “role=role”.
+ </report>
+ </rule>
+ </pattern>
+
+ <!-- XXX combobox requires a listbox child -->
+
+ <pattern name='aria-activedescendant must refer to a descendant'>
+ <rule context='address@hidden'>
+ <assert test='descendant::address@hidden =
current()/@aria-activedescendant]'>
+ The “aria-activedescendant”
attribute must refer to a
+ descendant element.
+ </assert>
+ </rule>
+ </pattern>
+
+ <pattern name='controls must not dangle'>
+ <rule context='address@hidden'>
+ <assert test='//address@hidden = current()/@aria-controls]'>
+ The “aria-controls” attribute
must point to an element in the
+ same document.
+ </assert>
+ </rule>
+ </pattern>
+
+ <pattern name='describedby must not dangle'>
+ <rule context='address@hidden'>
+ <assert test='//address@hidden =
current()/@aria-describedby]'>
+ The “aria-describedby” attribute
must point to an element in the
+ same document.
+ </assert>
+ </rule>
+ </pattern>
+
+ <pattern name='flowto must not dangle'>
+ <rule context='address@hidden'>
+ <assert test='//address@hidden = current()/@aria-flowto]'>
+ The “aria-flowto” attribute must
point to an element in the
+ same document.
+ </assert>
+ </rule>
+ </pattern>
+
+ <pattern name='labelledby must not dangle'>
+ <rule context='address@hidden'>
+ <assert test='//address@hidden = current()/@aria-labelledby]'>
+ The “aria-labelledby” attribute
must point to an element in the
+ same document.
+ </assert>
+ </rule>
+ </pattern>
+
+ <pattern name='owns must not dangle'>
+ <rule context='address@hidden'>
+ <assert test='//address@hidden = current()/@aria-owns]'>
+ The “aria-owns” attribute must
point to an element in the
+ same document.
+ </assert>
+ </rule>
+ </pattern>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
+<!-- Warnings
-->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-->
+ <pattern name="Warnings for HTML5 attributes that are obsolete but
conforming">
+ <rule context='h:img'>
+ <report test='@border' role='warning'>
+ The “border” attribute on the
“img” element is obsolete.
+ Consider specifying “img { border: 0;
}“ in CSS instead.
+ </report>
+ </rule>
+ <rule context='h:script[translate(@language, "JAVSCRIPT",
"javscript")="javascript"]'>
+ <report test='not(@type) or translate(@type,
"EXJAVSCRIPT", "exjavscript")="text/javascript"' role='warning'>
+ The “language” attribute on the
“script” element is obsolete. You can safely omit it.
+ </report>
+ </rule>
+ <rule context='h:a'>
+ <report test='@name' role='warning'>
+ The “name” attribute on the
“a” element is obsolete. Consider putting an
+ “id” attribute on the nearest
container instead.
+ </report>
+ </rule>
+ </pattern>
+
+ <pattern name="Other warnings">
+ <rule context='h:video|h:audio'>
+ <report test='count(h:address@hidden) > 1'
role='warning'>
+ “<name/>” element has more than
one “track”
+ child element with a “default”
attribute.
+ </report>
+ </rule>
+ </pattern>
+
+</schema>
diff --git a/block.rnc b/block.rnc
new file mode 100644
index 0000000..bc2b3a1
--- /dev/null
+++ b/block.rnc
@@ -0,0 +1,249 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Basic Prose Markup #
+# #####################################################################
+
+# #####################################################################
+## Paragraph-Level
+
+## Paragraph: <p>
+
+ p.elem =
+ element p { p.inner & p.attrs }
+ p.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ p.inner =
+ ( common.inner.phrasing ) # REVISIT lists in span?
+
+ common.elem.flow |= p.elem
+
+## Hint Transition: <hr>
+
+ hr.elem =
+ element hr { hr.inner & hr.attrs }
+ hr.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.separator
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ hr.inner =
+ ( empty )
+
+ common.elem.flow |= hr.elem
+
+# #####################################################################
+## Preformatting Blocks
+
+## Preformatted Text: <pre>
+
+ pre.elem =
+ element pre { pre.inner & pre.attrs }
+ pre.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ pre.inner =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= pre.elem
+
+# #####################################################################
+## Simple Lists
+
+## Unordered List: <ul>
+
+ ul.elem =
+ element ul { ul.inner & ul.attrs }
+ ul.attrs =
+ ( common.attrs
+ & ( ( common.attrs.aria.role.directory
+ | common.attrs.aria.role.group
+ | common.attrs.aria.role.list
+ | common.attrs.aria.role.listbox
+ | common.attrs.aria.role.menu
+ | common.attrs.aria.role.menubar
+ | common.attrs.aria.role.tablist
+ | common.attrs.aria.role.toolbar
+ | common.attrs.aria.role.tree
+ | common.attrs.aria.role.presentation
+ )
+ | common.attrs.aria.implicit.list
+ )?
+ )
+ ul.inner =
+ ( li.elem*
+ & common.elem.script-supporting*
+ )
+
+ common.elem.flow |= ul.elem
+
+## Unordered List Item: <li>
+
+ li.elem =
+ element li { li.inner & li.attrs }
+ li.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.listitem
+ | common.attrs.aria.role.listitem
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.option
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.treeitem
+ | common.attrs.aria.role.separator
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ li.inner =
+ ( common.inner.flow )
+
+## Ordered List: <ol>
+
+ ol.elem =
+ element ol { ol.inner & ol.attrs }
+ ol.attrs =
+ ( common.attrs
+ & ol.attrs.start?
+ & ol.attrs.reversed?
+ & ol.attrs.type?
+ & ( ( common.attrs.aria.role.directory
+ | common.attrs.aria.role.group
+ | common.attrs.aria.role.list
+ | common.attrs.aria.role.listbox
+ | common.attrs.aria.role.menu
+ | common.attrs.aria.role.menubar
+ | common.attrs.aria.role.tablist
+ | common.attrs.aria.role.toolbar
+ | common.attrs.aria.role.tree
+ | common.attrs.aria.role.presentation
+ )
+ | common.attrs.aria.implicit.list
+ )?
+ )
+ ol.attrs.start =
+ attribute start {
+ common.data.integer
+ }
+ ol.attrs.reversed =
+ attribute reversed {
+ w:string "reversed" | w:string ""
+ }
+ ol.attrs.type =
+ attribute type {
+ w:string "1" | w:string "a" | w:string "A" |
w:string "i" | w:string "I"
+ }
+ ol.inner =
+ ( oli.elem*
+ & common.elem.script-supporting*
+ )
+
+ common.elem.flow |= ol.elem
+
+## Ordered List Item: <li>
+
+ oli.elem =
+ element li { oli.inner & oli.attrs }
+ oli.attrs =
+ ( common.attrs
+ & oli.attrs.value?
+ & ( common.attrs.aria.implicit.listitem
+ | common.attrs.aria.role.listitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.option
+ | common.attrs.aria.role.treeitem
+ | common.attrs.aria.role.separator
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ oli.attrs.value =
+ attribute value {
+ common.data.integer
+ }
+ oli.inner =
+ ( common.inner.flow )
+
+# #####################################################################
+## Definition Lists
+
+## Definition List: <dl>
+
+ dl.elem =
+ element dl { dl.inner & dl.attrs }
+ dl.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ dl.inner =
+ ( ( ( dt.elem
+ & common.elem.script-supporting*
+ )+
+ ,
+ ( dd.elem
+ & common.elem.script-supporting*
+ )+
+ )*
+ )
+
+ common.elem.flow |= dl.elem
+
+## Definition Term: <dt>
+
+ dt.elem =
+ element dt { dt.inner & dt.attrs }
+ dt.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ dt.inner =
+ ( common.inner.flow )
+
+## Definition Description: <dd>
+
+ dd.elem =
+ element dd { dd.inner & dd.attrs }
+ dd.elem.phrasing =
+ element dd { dd.inner.phrasing & dd.attrs }
+ dd.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ dd.inner =
+ ( common.inner.flow )
+ dd.inner.phrasing =
+ ( common.inner.phrasing )
+
+# #####################################################################
+## Miscellaneous Elements
+
+## Generic Container: <div>
+
+ div.elem =
+ element div { div.inner & div.attrs }
+ div.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ div.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= div.elem
+
+## Title or Explanatory Caption: <legend>
+
+ legend.elem =
+ element legend { legend.inner & legend.attrs }
+ legend.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ legend.inner =
+ ( common.inner.phrasing )
diff --git a/common.rnc b/common.rnc
new file mode 100644
index 0000000..e87d49b
--- /dev/null
+++ b/common.rnc
@@ -0,0 +1,512 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Common Definitions #
+# #####################################################################
+
+
+# #####################################################################
+## Language Parameters - redefine in inclusion block as necessary #
+# #####################################################################
+
+## HTML vs. XHTML restrictions
+
+ XMLonly = empty
+ HTMLonly = notAllowed
+
+## HTML 4 Compatibility - set to notAllowed to disallow markup introduced in
HTML 5
+# (This only affects mixed-version modules; wholly
HTML5
+# modules should simply be left out of the inclusion
list.)
+
+ v5only = empty
+
+## HTML Compatibility Switches - set to notAllowed to disallow
+
+ ## XML features that can't be roundtripped HTML <-> XHTML
+ # (xml:base on elements other than <html>)
+ nonRoundtrippable = empty
+
+ ## XML features that can't be serialized as HTML
+ nonHTMLizable = empty
+
+## features that are not part of the W3C HTML spec
+ nonW3C = empty
+
+# #####################################################################
+## Wildcards #
+# #####################################################################
+
+## Any attribute from any namespace
+
+ common.attr.anything =
+ attribute * { text }*
+
+## Any element from any namespace
+
+ common.elem.anything =
+ element * { common.inner.anything & common.attr.anything }
+
+## Any content from any namespace
+
+ common.inner.anything =
+ ( text
+ & common.elem.anything*
+ )
+
+# #####################################################################
+## Common Element Classes #
+# #####################################################################
+
+## Metadata Elements
+
+ common.elem.metadata =
+ ( notAllowed )
+
+## Phrase Elements
+
+ common.elem.phrasing =
+ ( notAllowed )
+
+## Prose Elements
+
+ common.elem.flow =
+ ( common.elem.phrasing )
+
+
+# #####################################################################
+## Common Content Models #
+# #####################################################################
+
+## Metadata Content
+
+ common.inner.metadata =
+ ( common.elem.metadata* )
+
+## Phrase Content
+
+ common.inner.phrasing =
+ ( text & common.elem.phrasing* )
+
+## Prose Content
+
+ common.inner.transparent.flow =
+ ( text & common.elem.flow* )
+
+ common.inner.flow =
+ ( style.elem.scoped*,
+ ( text
+ & common.elem.flow*
+ )
+ )
+
+# #####################################################################
+## Common Attributes #
+# #####################################################################
+
+# When updating, check <bdo> definition too
+
+common.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ )
+
+common.attrs.basic =
+ ( common.attrs.id?
+ & common.attrs.class?
+ & common.attrs.title?
+ & common.attrs.base?
+ & common.attrs.space?
+ )
+ common.attrs.id =
+ attribute id {
+ common.data.id
+ }
+ common.attrs.class =
+ attribute class {
+ common.data.tokens
+ }
+ common.attrs.title =
+ attribute title {
+ text
+ }
+ common.attrs.base =
+ common.attrs.xmlbase
+ & nonRoundtrippable
+ common.attrs.xmlbase =
+ attribute xml:base {
+ common.data.uri
+ } & XMLonly
+ common.attrs.space =
+ common.attrs.xmlspace
+ common.attrs.xmlspace =
+ attribute xml:space {
+ string "preserve" | string "default"
+ } & XMLonly
+
+common.attrs.i18n =
+ ( common.attrs.dir?
+ & common.attrs.language?
+ & common.attrs.translate?
+ )
+ common.attrs.dir =
+ attribute dir {
+ w:string "ltr" | w:string "rtl" | w:string "auto"
+ }
+ # This lang definition is a hack for enviroments where
+ # the HTML5 parser maps lang to xml:lang.
+ # Sameness check left to Schematron
+ common.attrs.language =
+ ( common.attrs.xmllang?
+ & common.attrs.lang?
+ )
+ common.attrs.lang =
+ attribute lang {
+ common.data.langcode
+ } & XMLonly
+ common.attrs.xmllang =
+ attribute xml:lang {
+ common.data.langcode
+ }
+# common.attrs.language =
+# ( common.attrs.lang
+# | common.attrs.xmllang
+# )
+# common.attrs.lang =
+# attribute lang {
+# common.data.langcode
+# } & HTMLonly
+# common.attrs.xmllang =
+# attribute xml:lang {
+# common.data.langcode
+# } & XMLonly
+ common.attrs.translate =
+ attribute translate {
+ w:string "" | w:string "yes" | w:string "no"
+ }
+
+common.attrs.present =
+ ( common.attrs.style?
+ & common.attrs.tabindex?
+ & common.attrs.accesskey?
+ )
+ common.attrs.style =
+ attribute style {
+ string
+ }
+ common.attrs.tabindex =
+ attribute tabindex {
+ common.data.integer
+ }
+ # REVISIT move style to a module and bundle tabindex with ARIA
+ common.attrs.accesskey =
+ attribute accesskey {
+ common.data.keylabellist
+ }
+
+common.attrs.other =
+ empty
+
+# #####################################################################
+## Common Datatypes #
+# #####################################################################
+
+## Names and Tokens
+
+ common.data.tokens =
+ list { token* }
+
+ common.data.browsing-context =
+ w:browsing-context
+
+ common.data.browsing-context-or-keyword =
+ w:browsing-context-or-keyword
+# xsd:string {
+# pattern =
"()|([^_].*)|(_[bB][lL][aA][nN][kK])|(_[sS][eE][lL][fF])|(_[pP][aA][rR][eE][nN][tT])|(_[tT][oO][pP])"
+# }
+
+
+## IDs and IDREFs
+
+ common.data.id =
+ w:ID
+# xsd:string {
+# pattern = "\S+"
+# }
+
+ common.data.idref =
+ w:IDREF
+
+ common.data.idrefs =
+ w:IDREFS
+
+ common.data.name =
+ w:ID #FIXME
+
+ common.data.hash-name =
+ w:hash-name
+# xsd:string {
+# pattern = "#.+"
+# }
+
+## Numerical
+
+ common.data.integer =
+ w:integer
+# xsd:string {
+# pattern = "-?[0-9]+"
+# }
+
+ common.data.integer.positive =
+ w:integer-positive
+# xsd:string {
+# pattern = "0*[1-9][0-9]*"
+# }
+
+ common.data.integer.non-negative =
+ w:integer-non-negative
+# xsd:string {
+# pattern = "[0-9]+"
+# }
+
+# common.data.percent =
+# xsd:string {
+# pattern = "(100)|([1-9]?[0-9](\.[0-9]+)?)%"
+# }
+
+ common.data.float =
+ w:float
+# xsd:string {
+# pattern = "-?[0-9]+(\.[0-9]+)?([eE]-?[0-9]+)?"
+# }
+
+ common.data.float.positive =
+ w:float-positive
+# xsd:string {
+# pattern =
"(0*[1-9][0-9]*(\.[0-9]+)?)|([0-9]+(\.0*[1-9][0-9]*)?)([eE]-?[0-9]+)?"
+# }
+
+ common.data.float.non-negative =
+ w:float-non-negative
+# xsd:string {
+# pattern = "[0-9]+(\.[0-9]+)?([eE]-?[0-9]+)?"
+# }
+
+## Temporal
+
+ common.data.datetime =
+ w:datetime-tz
+
+ common.data.date-or-time =
+ w:date-or-time
+
+ common.data.date =
+ w:date
+
+ common.data.time-datetime =
+ w:time-datetime
+
+## IRIs
+
+ common.data.uri =
+ # allow either a non-empty IRI ref or zero or more HTML
+ # space characters (which are: space, tab, LF, FF, CR)
+ ( w:iri-ref
+ | xsd:string {
+ pattern = "[ \x{0A}-\x{0D}]*"
+ # NOTE The range above incorrectly allows U+000B
+ # in addition to the HTML space characters; but
+ # that's not a problem in practice because HTML
+ # and XML parsers will both catch any U+000B
+ # and report an error for it before that pattern
+ # ever gets evaluated.
+ }
+ )
+
+ common.data.uri.non-empty =
+ w:iri-ref
+
+ common.data.uris =
+ list { w:iri-ref* }
+
+ common.data.uri.absolute =
+ w:iri
+
+## <link type='icon'> sizes
+
+ common.data.sizes =
+# list { w:sizes }
+ list {
+ xsd:string {
+ pattern = "[1-9][0-9]*x[1-9][0-9]*"
+ }+
+ }
+
+## MIME types
+
+ common.data.mimetype =
+ w:mime-type
+
+## Encodings
+
+ common.data.charset =
+ w:charset
+
+ common.data.meta-charset =
+ w:meta-charset
+
+## Refresh
+
+ common.data.refresh =
+ w:refresh
+
+## Default style
+
+ common.data.default-style =
+ string
+# w:default-style
+
+## X-UA-Compatible
+
+ common.data.x-ua-compatible =
+ string
+
+## Media Queries
+
+ common.data.mediaquery =
+ w:media-query
+
+## Language Codes
+
+ common.data.langcode =
+ w:string "" | w:language
+
+## List of Key Labels
+ common.data.keylabellist =
+ w:keylabellist
+
+## List of Source Sizes
+ common.data.source.size.list =
+ w:source-size-list
+
+## Microdata Properties
+ common.data.microdata-properties =
+ list { w:microdata-property+ }
+
+## Zero
+ common.data.zero =
+ w:zero
+
+## ECMAScript FunctionBody
+ common.data.functionbody =
+ w:functionbody
+
+# #####################################################################
+## WF2 Module Hook #
+# #####################################################################
+
+common-form.attrs.form = ( notAllowed )
+
+# #####################################################################
+## Script-supporting elements
+# #####################################################################
+
+common.elem.script-supporting = ( notAllowed )
+
+# #####################################################################
+## ARIA Module Hooks #
+# #####################################################################
+
+common.attrs.aria = ( notAllowed )
+common.attrs.aria.role.alert = ( notAllowed )
+common.attrs.aria.role.alertdialog = ( notAllowed )
+common.attrs.aria.role.application = ( notAllowed )
+common.attrs.aria.role.article = ( notAllowed )
+common.attrs.aria.role.banner = ( notAllowed )
+common.attrs.aria.role.button = ( notAllowed )
+common.attrs.aria.role.checkbox = ( notAllowed )
+common.attrs.aria.role.combobox = ( notAllowed )
+common.attrs.aria.role.complementary = ( notAllowed )
+common.attrs.aria.role.contentinfo = ( notAllowed )
+common.attrs.aria.role.dialog = ( notAllowed )
+common.attrs.aria.role.directory = ( notAllowed )
+common.attrs.aria.role.document = ( notAllowed )
+common.attrs.aria.role.group = ( notAllowed )
+common.attrs.aria.role.heading = ( notAllowed )
+common.attrs.aria.role.img = ( notAllowed )
+common.attrs.aria.role.link = ( notAllowed )
+common.attrs.aria.role.list = ( notAllowed )
+common.attrs.aria.role.listitem = ( notAllowed )
+common.attrs.aria.role.log = ( notAllowed )
+common.attrs.aria.role.listbox = ( notAllowed )
+common.attrs.aria.role.main = ( notAllowed )
+common.attrs.aria.role.marquee = ( notAllowed )
+common.attrs.aria.role.menu = ( notAllowed )
+common.attrs.aria.role.menubar = ( notAllowed )
+common.attrs.aria.role.menuitem = ( notAllowed )
+common.attrs.aria.role.menuitemcheckbox = ( notAllowed )
+common.attrs.aria.role.menuitemradio = ( notAllowed )
+common.attrs.aria.role.note = ( notAllowed )
+common.attrs.aria.role.option = ( notAllowed )
+common.attrs.aria.role.presentation = ( notAllowed )
+common.attrs.aria.role.progressbar = ( notAllowed )
+common.attrs.aria.role.radio = ( notAllowed )
+common.attrs.aria.role.region = ( notAllowed )
+common.attrs.aria.role.search = ( notAllowed )
+common.attrs.aria.role.separator = ( notAllowed )
+common.attrs.aria.role.slider = ( notAllowed )
+common.attrs.aria.role.spinbutton = ( notAllowed )
+common.attrs.aria.role.status = ( notAllowed )
+common.attrs.aria.role.tab = ( notAllowed )
+common.attrs.aria.role.tablist = ( notAllowed )
+common.attrs.aria.role.tabpanel = ( notAllowed )
+common.attrs.aria.role.textbox = ( notAllowed )
+common.attrs.aria.role.toolbar = ( notAllowed )
+common.attrs.aria.role.tree = ( notAllowed )
+common.attrs.aria.role.treeitem = ( notAllowed )
+common.attrs.aria.implicit.article = ( notAllowed )
+common.attrs.aria.implicit.banner = ( notAllowed )
+common.attrs.aria.implicit.button = ( notAllowed )
+common.attrs.aria.implicit.checkbox = ( notAllowed )
+common.attrs.aria.implicit.column-or-row-header = ( notAllowed )
+common.attrs.aria.implicit.combobox = ( notAllowed )
+common.attrs.aria.implicit.complementary = ( notAllowed )
+common.attrs.aria.implicit.contentinfo = ( notAllowed )
+common.attrs.aria.implicit.dialog = ( notAllowed )
+common.attrs.aria.implicit.document = ( notAllowed )
+common.attrs.aria.implicit.group = ( notAllowed )
+common.attrs.aria.implicit.heading = ( notAllowed )
+common.attrs.aria.implicit.img = ( notAllowed )
+common.attrs.aria.implicit.landmark = ( notAllowed )
+common.attrs.aria.implicit.link = ( notAllowed )
+common.attrs.aria.implicit.list = ( notAllowed )
+common.attrs.aria.implicit.listbox = ( notAllowed )
+common.attrs.aria.implicit.listitem = ( notAllowed )
+common.attrs.aria.implicit.main = ( notAllowed )
+common.attrs.aria.implicit.navigation = ( notAllowed )
+common.attrs.aria.implicit.option = ( notAllowed )
+common.attrs.aria.implicit.progressbar = ( notAllowed )
+common.attrs.aria.implicit.radio = ( notAllowed )
+common.attrs.aria.implicit.region = ( notAllowed )
+common.attrs.aria.implicit.section = ( notAllowed )
+common.attrs.aria.implicit.select = ( notAllowed )
+common.attrs.aria.implicit.slider = ( notAllowed )
+common.attrs.aria.implicit.spinbutton = ( notAllowed )
+common.attrs.aria.implicit.status = ( notAllowed )
+common.attrs.aria.implicit.structure = ( notAllowed )
+common.attrs.aria.implicit.textbox = ( notAllowed )
+common.attrs.aria.implicit.toolbar = ( notAllowed )
+common.attrs.aria.prop.readonly = ( notAllowed )
+common.attrs.aria.landmark.application = ( notAllowed )
+common.attrs.aria.landmark.banner = ( notAllowed )
+common.attrs.aria.landmark.complementary = ( notAllowed )
+common.attrs.aria.landmark.contentinfo = ( notAllowed )
+common.attrs.aria.landmark.form = ( notAllowed )
+common.attrs.aria.landmark.main = ( notAllowed )
+common.attrs.aria.landmark.navigation = ( notAllowed )
+common.attrs.aria.landmark.search = ( notAllowed )
+# per ARIA spec: article, document, and note are not actually landmarks
+common.attrs.aria.landmark.article = ( notAllowed )
+common.attrs.aria.landmark.document = ( notAllowed )
+common.attrs.aria.landmark.note = ( notAllowed )
diff --git a/core-scripting.rnc b/core-scripting.rnc
new file mode 100644
index 0000000..ff64969
--- /dev/null
+++ b/core-scripting.rnc
@@ -0,0 +1,344 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Core Scripting #
+# #####################################################################
+
+# #####################################################################
+## Scripting Elements
+
+## Inline Scripts: <script>
+
+ script.elem.embedded =
+ element script { script.inner.embedded & script.attrs.embedded }
+ script.attrs.embedded =
+ ( common.attrs
+ & script.attrs.type?
+ & script.attrs.language? # restricted in Schematron
+ & embedded.content.attrs.crossorigin?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ script.elem.imported =
+ element script { script.inner.imported & script.attrs.imported }
+ script.attrs.imported =
+ ( common.attrs
+ & script.attrs.src?
+ & script.attrs.defer?
+ & script.attrs.async?
+ & script.attrs.type?
+ & script.attrs.charset?
+ & script.attrs.language? # restricted in Schematron
+ & embedded.content.attrs.crossorigin?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ script.attrs.src =
+ attribute src {
+ common.data.uri.non-empty
+ }
+ script.attrs.defer =
+ attribute defer {
+ w:string "defer" | w:string ""
+ }
+ script.attrs.async =
+ attribute async {
+ w:string "async" | w:string ""
+ } & v5only
+ script.attrs.type =
+ attribute type {
+ common.data.mimetype # XXX without charset
parameter!
+ }
+ script.attrs.charset =
+ attribute charset {
+ common.data.charset
+ }
+ script.attrs.language =
+ attribute language {
+ string
+ }
+ script.inner.embedded =
+ ( common.inner.anything )
+ script.inner.imported =
+ ( common.inner.anything )
+
+ script.elem =
+ ( script.elem.embedded
+ | script.elem.imported
+ )
+
+ common.elem.metadata |= script.elem
+ common.elem.phrasing |= script.elem
+
+## Fallback Unscripted Content: <noscript>
+
+ noscript.elem.head =
+ element noscript { noscript.inner.head & noscript.attrs }
+ & HTMLonly
+ noscript.inner.head =
+ ( link.elem
+ | meta.http-equiv.default-style.elem
+ | meta.http-equiv.refresh.elem
+ | style.elem
+ )*
+ noscript.elem.phrasing =
+ element noscript { noscript.inner.phrasing & noscript.attrs }
+ & HTMLonly
+ noscript.inner.phrasing =
+ ( common.inner.phrasing )
+ noscript.elem.flow =
+ element noscript { noscript.inner.flow & noscript.attrs }
+ & HTMLonly
+ noscript.inner.flow =
+ ( common.inner.flow )
+ noscript.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+
+ common.elem.metadata |= noscript.elem.head
+ common.elem.phrasing |= noscript.elem.phrasing
+ common.elem.flow |= noscript.elem.flow
+
+# #####################################################################
+## Event Handler Attribute Definitions
+
+ common.attrs.scripting &=
+ ( scripting.attr.onabort?
+ & scripting.attr.onblur?
+ & scripting.attr.oncanplay?
+ & scripting.attr.oncanplaythrough?
+ & scripting.attr.onchange?
+ & scripting.attr.onclick?
+ & scripting.attr.onclose?
+ & scripting.attr.oncontextmenu?
+ & scripting.attr.ondblclick?
+ & scripting.attr.ondrag?
+ & scripting.attr.ondragend?
+ & scripting.attr.ondragenter?
+ & scripting.attr.ondragleave?
+ & scripting.attr.ondragover?
+ & scripting.attr.ondragstart?
+ & scripting.attr.ondrop?
+ & scripting.attr.ondurationchange?
+ & scripting.attr.onemptied?
+ & scripting.attr.onended?
+ & scripting.attr.onerror?
+ & scripting.attr.onfocus?
+ & scripting.attr.oninput?
+ & scripting.attr.oninvalid?
+ & scripting.attr.onkeydown?
+ & scripting.attr.onkeypress?
+ & scripting.attr.onkeyup?
+ & scripting.attr.onload?
+ & scripting.attr.onloadeddata?
+ & scripting.attr.onloadedmetadata?
+ & scripting.attr.onloadstart?
+ & scripting.attr.onmousedown?
+ & scripting.attr.onmousemove?
+ & scripting.attr.onmouseout?
+ & scripting.attr.onmouseover?
+ & scripting.attr.onmouseup?
+ & scripting.attr.onmousewheel?
+ & scripting.attr.onpause?
+ & scripting.attr.onplay?
+ & scripting.attr.onplaying?
+ & scripting.attr.onprogress?
+ & scripting.attr.onratechange?
+ & scripting.attr.onreset?
+ & scripting.attr.onscroll?
+ & scripting.attr.onseeked?
+ & scripting.attr.onseeking?
+ & scripting.attr.onselect?
+ & scripting.attr.onshow?
+ & scripting.attr.onstalled?
+ & scripting.attr.onsubmit?
+ & scripting.attr.onsuspend?
+ & scripting.attr.ontimeupdate?
+ & scripting.attr.onvolumechange?
+ & scripting.attr.onwaiting?
+ )
+
+ common.attrs.other &= common.attrs.scripting
+
+ scripting.attr.onabort =
+ attribute onabort { common.data.functionbody }
+ scripting.attr.onblur =
+ attribute onblur { common.data.functionbody }
+ scripting.attr.oncanplay =
+ attribute oncanplay { common.data.functionbody }
+ scripting.attr.oncanplaythrough =
+ attribute oncanplaythrough { common.data.functionbody }
+ scripting.attr.onchange =
+ attribute onchange { common.data.functionbody }
+ scripting.attr.onclick =
+ attribute onclick { common.data.functionbody }
+ scripting.attr.onclose =
+ attribute onclose { common.data.functionbody }
+ scripting.attr.oncontextmenu =
+ attribute oncontextmenu { common.data.functionbody }
+ scripting.attr.ondblclick =
+ attribute ondblclick { common.data.functionbody }
+ scripting.attr.ondrag =
+ attribute ondrag { common.data.functionbody }
+ scripting.attr.ondragend =
+ attribute ondragend { common.data.functionbody }
+ scripting.attr.ondragenter =
+ attribute ondragenter { common.data.functionbody }
+ scripting.attr.ondragleave =
+ attribute ondragleave { common.data.functionbody }
+ scripting.attr.ondragover =
+ attribute ondragover { common.data.functionbody }
+ scripting.attr.ondragstart =
+ attribute ondragstart { common.data.functionbody }
+ scripting.attr.ondrop =
+ attribute ondrop { common.data.functionbody }
+ scripting.attr.ondurationchange =
+ attribute ondurationchange { common.data.functionbody }
+ scripting.attr.onemptied =
+ attribute onemptied { common.data.functionbody }
+ scripting.attr.onended =
+ attribute onended { common.data.functionbody }
+ scripting.attr.onerror =
+ attribute onerror { common.data.functionbody }
+ scripting.attr.onfocus =
+ attribute onfocus { common.data.functionbody }
+ scripting.attr.onformchange =
+ attribute onformchange { common.data.functionbody }
+ scripting.attr.onforminput =
+ attribute onforminput { common.data.functionbody }
+ scripting.attr.oninput =
+ attribute oninput { common.data.functionbody }
+ scripting.attr.oninvalid =
+ attribute oninvalid { common.data.functionbody }
+ scripting.attr.onkeydown =
+ attribute onkeydown { common.data.functionbody }
+ scripting.attr.onkeypress =
+ attribute onkeypress { common.data.functionbody }
+ scripting.attr.onkeyup =
+ attribute onkeyup { common.data.functionbody }
+ scripting.attr.onload =
+ attribute onload { common.data.functionbody }
+ scripting.attr.onloadeddata =
+ attribute onloadeddata { common.data.functionbody }
+ scripting.attr.onloadedmetadata =
+ attribute onloadedmetadata { common.data.functionbody }
+ scripting.attr.onloadstart =
+ attribute onloadstart { common.data.functionbody }
+ scripting.attr.onmousedown =
+ attribute onmousedown { common.data.functionbody }
+ scripting.attr.onmousemove =
+ attribute onmousemove { common.data.functionbody }
+ scripting.attr.onmouseout =
+ attribute onmouseout { common.data.functionbody }
+ scripting.attr.onmouseover =
+ attribute onmouseover { common.data.functionbody }
+ scripting.attr.onmouseup =
+ attribute onmouseup { common.data.functionbody }
+ scripting.attr.onmousewheel =
+ attribute onmousewheel { common.data.functionbody }
+ scripting.attr.onpause =
+ attribute onpause { common.data.functionbody }
+ scripting.attr.onplay =
+ attribute onplay { common.data.functionbody }
+ scripting.attr.onplaying =
+ attribute onplaying { common.data.functionbody }
+ scripting.attr.onprogress =
+ attribute onprogress { common.data.functionbody }
+ scripting.attr.onratechange =
+ attribute onratechange { common.data.functionbody }
+ scripting.attr.onreset =
+ attribute onreset { common.data.functionbody }
+ scripting.attr.onscroll =
+ attribute onscroll { common.data.functionbody }
+ scripting.attr.onseeked =
+ attribute onseeked { common.data.functionbody }
+ scripting.attr.onseeking =
+ attribute onseeking { common.data.functionbody }
+ scripting.attr.onselect =
+ attribute onselect { common.data.functionbody }
+ scripting.attr.onshow =
+ attribute onshow { common.data.functionbody }
+ scripting.attr.onstalled =
+ attribute onstalled { common.data.functionbody }
+ scripting.attr.onsubmit =
+ attribute onsubmit { common.data.functionbody }
+ scripting.attr.onsuspend =
+ attribute onsuspend { common.data.functionbody }
+ scripting.attr.ontimeupdate =
+ attribute ontimeupdate { common.data.functionbody }
+ scripting.attr.onvolumechange =
+ attribute onvolumechange { common.data.functionbody }
+ scripting.attr.onwaiting =
+ attribute onwaiting { common.data.functionbody }
+
+# scripting.attr.common =
+# ( scripting.attr.mouse
+# & scripting.attr.keyboard
+# & scripting.attr.focus
+# )
+#
+# scripting.attr.mouse =
+# ( scripting.attr.mouse.click?
+# & scripting.attr.mouse.dblclick?
+# & scripting.attr.mouse.down?
+# & scripting.attr.mouse.up?
+# & scripting.attr.mouse.over?
+# & scripting.attr.mouse.move?
+# & scripting.attr.mouse.out?
+# )
+# scripting.attr.mouse.click =
+# attribute onclick { string }
+# scripting.attr.mouse.dblclick =
+# attribute ondblclick { string }
+# scripting.attr.mouse.down =
+# attribute onmousedown { string }
+# scripting.attr.mouse.up =
+# attribute onmouseup { string }
+# scripting.attr.mouse.over =
+# attribute onmouseover { string }
+# scripting.attr.mouse.move =
+# attribute onmousemove { string }
+# scripting.attr.mouse.out =
+# attribute onmouseout { string }
+#
+# scripting.attr.keyboard =
+# ( scripting.attr.keyboard.press?
+# & scripting.attr.keyboard.down?
+# & scripting.attr.keyboard.up?
+# )
+# scripting.attr.keyboard.press =
+# attribute onkeypress { string }
+# scripting.attr.keyboard.down =
+# attribute onkeydown { string }
+# scripting.attr.keyboard.up =
+# attribute onkeyup { string }
+#
+#
+# scripting.attr.focus =
+# ( scripting.attr.focus.gain?
+# & scripting.attr.focus.lose?
+# )
+# scripting.attr.focus.gain =
+# attribute onfocus { string }
+# scripting.attr.focus.lose =
+# attribute onblur { string }
+#
+# scripting.attr.loading =
+# ( scripting.attr.loading.load?
+# & scripting.attr.loading.unload?
+# )
+# scripting.attr.loading.load =
+# attribute onload { string }
+# scripting.attr.loading.unload =
+# attribute onunload { string }
+
+
+# #####################################################################
+# Event Handler Attribute Assignments
+
+# body.attrs &= scripting.attr.loading
diff --git a/data.rnc b/data.rnc
new file mode 100644
index 0000000..acb7964
--- /dev/null
+++ b/data.rnc
@@ -0,0 +1,94 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Static Data Markup #
+# #####################################################################
+
+## Time: <time>
+
+ time.elem =
+ element time { time.inner & time.attrs }
+ time.attrs =
+ ( common.attrs
+ & time.attrs.datetime?
+ & common.attrs.aria?
+ )
+ time.attrs.datetime =
+ attribute datetime {
+ common.data.time-datetime
+ }
+ time.attrs.datetime.dateonly =
+ attribute datetime {
+ common.data.date
+ }
+ time.attrs.datetime.tz =
+ attribute datetime {
+ common.data.datetime
+ }
+ time.inner =
+ ( common.inner.phrasing ) #Cannot enforce textContent format
here
+
+ common.elem.phrasing |= time.elem
+
+## Data: <data>
+
+ data.elem =
+ element data { data.inner & data.attrs }
+ data.attrs =
+ ( common.attrs
+ & data.attrs.value
+ & common.attrs.aria?
+ )
+ data.attrs.value =
+ attribute value {
+ string
+ }
+ data.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= data.elem
+
+## Scalar Gauge: <meter>
+
+ meter.elem =
+ element meter { meter.inner & meter.attrs }
+ meter.attrs =
+ ( common.attrs
+ & meter.attrs.value
+ & meter.attrs.min?
+ & meter.attrs.low?
+ & meter.attrs.high?
+ & meter.attrs.max?
+ & meter.attrs.optimum?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ meter.attrs.value =
+ attribute value {
+ common.data.float
+ }
+ meter.attrs.min =
+ attribute min {
+ common.data.float
+ }
+ meter.attrs.low =
+ attribute low {
+ common.data.float
+ }
+ meter.attrs.high =
+ attribute high {
+ common.data.float
+ }
+ meter.attrs.max =
+ attribute max {
+ common.data.float
+ }
+ meter.attrs.optimum =
+ attribute optimum {
+ common.data.float
+ }
+ meter.inner =
+ ( common.inner.phrasing ) #Cannot enforce textContent format
here
+
+ common.elem.phrasing |= meter.elem
diff --git a/embed.rnc b/embed.rnc
new file mode 100644
index 0000000..1b20ba8
--- /dev/null
+++ b/embed.rnc
@@ -0,0 +1,732 @@
+datatypes w = "http://whattf.org/datatype-draft"
+namespace local = ""
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Embedded Content #
+# #####################################################################
+
+#######################################################################
+## Replaced Content
+
+## Images: <img>
+
+ img.elem =
+ element img { img.inner & img.attrs }
+ img.attrs =
+ ( common.attrs
+ & img.attrs.src
+ & img.attrs.srcset?
+ & img.attrs.sizes?
+ & img.attrs.alt? # ARIA: if alt empty, only allowed role
value is "presentation"; check in assertions
+ & img.attrs.height?
+ & img.attrs.width?
+ & img.attrs.usemap?
+ & img.attrs.ismap?
+ & img.attrs.border? # obsolete
+ & embedded.content.attrs.crossorigin?
+ & ( common.attrs.aria.implicit.img
+ | common.attrs.aria
+ )?
+ )
+ img.attrs.src =
+ attribute src {
+ common.data.uri.non-empty
+ }
+ img.attrs.srcset =
+ attribute srcset {
+ string
+ } & v5only
+ img.attrs.sizes =
+ attribute sizes {
+ common.data.source.size.list
+ } & v5only
+ img.attrs.alt =
+ attribute alt {
+ text
+ }
+ img.attrs.height =
+ attribute height {
+ common.data.integer.non-negative
+ }
+ img.attrs.width =
+ attribute width {
+ common.data.integer.non-negative
+ }
+ img.attrs.usemap =
+ attribute usemap {
+ common.data.hash-name
+ }
+ img.attrs.ismap =
+ attribute ismap {
+ w:string "ismap" | w:string ""
+ }
+ img.attrs.border =
+ attribute border {
+ common.data.zero
+ }
+ img.inner =
+ empty
+
+ common.elem.phrasing |= img.elem
+
+## Image with multiple sources: <picture>
+
+ picture.elem =
+ element picture { picture.inner & picture.attrs }
+ & v5only
+ picture.attrs =
+ ( common.attrs )
+ picture.inner =
+ ( ( source.picture.elem*
+ & common.elem.script-supporting*
+ ),
+ ( img.elem
+ & common.elem.script-supporting*
+ )
+ )
+
+ common.elem.phrasing |= picture.elem
+
+## Picture source: <source srcset>
+
+ source.picture.elem =
+ element source { source.picture.inner & source.picture.attrs }
+ source.picture.attrs =
+ ( common.attrs
+ & source.picture.attrs.media?
+ & source.picture.attrs.srcset
+ & source.picture.attrs.sizes?
+ & source.picture.attrs.type?
+ )
+ source.picture.attrs.media =
+ attribute media {
+ common.data.mediaquery
+ }
+ source.picture.attrs.srcset =
+ attribute srcset {
+ string
+ }
+ source.picture.attrs.sizes =
+ attribute sizes {
+ common.data.source.size.list
+ }
+ source.picture.attrs.type =
+ attribute type {
+ common.data.mimetype
+ }
+ source.picture.inner =
+ ( empty )
+
+## Plug-ins: <embed>
+
+ embed.elem =
+ element embed { embed.inner & embed.attrs }
+ embed.attrs =
+ ( common.attrs
+ & embed.attrs.src?
+ & embed.attrs.type?
+ & embed.attrs.height?
+ & embed.attrs.width?
+ & embed.attrs.other*
+ & ( common.attrs.aria.landmark.application
+ | common.attrs.aria.landmark.document
+ | common.attrs.aria.role.img
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ embed.attrs.src =
+ attribute src {
+ common.data.uri.non-empty
+ }
+ embed.attrs.type =
+ attribute type {
+ common.data.mimetype
+ }
+ embed.attrs.height =
+ attribute height {
+ common.data.integer.non-negative
+ }
+ embed.attrs.width =
+ attribute width {
+ common.data.integer.non-negative
+ }
+ embed.attrs.other = # REVISIT common.attrs
+ attribute local:* - ( src
+ | type
+ | height
+ | width
+ | id
+ | class
+ | title
+ | dir
+ | lang
+ | translate
+ | style
+ | tabindex
+ | contextmenu
+ | contenteditable
+ | draggable
+ | dropzone
+ | hidden
+ | onabort
+ | onblur
+ | oncanplay
+ | oncanplaythrough
+ | onchange
+ | onclick
+ | onclose
+ | oncontextmenu
+ | ondblclick
+ | ondrag
+ | ondragend
+ | ondragenter
+ | ondragleave
+ | ondragover
+ | ondragstart
+ | ondrop
+ | ondurationchange
+ | onemptied
+ | onended
+ | onerror
+ | onfocus
+ | oninput
+ | oninvalid
+ | onkeydown
+ | onkeypress
+ | onkeyup
+ | onload
+ | onloadeddata
+ | onloadedmetadata
+ | onloadstart
+ | onmousedown
+ | onmousemove
+ | onmouseout
+ | onmouseover
+ | onmouseup
+ | onmousewheel
+ | onpause
+ | onplay
+ | onplaying
+ | onprogress
+ | onratechange
+ | onreset
+ | onscroll
+ | onseeked
+ | onseeking
+ | onselect
+ | onshow
+ | onstalled
+ | onsubmit
+ | onsuspend
+ | ontimeupdate
+ | onvolumechange
+ | onwaiting
+ | onafterprint
+ | onbeforeprint
+ | onbeforeunload
+ | onhashchange
+ | onmessage
+ | onoffline
+ | ononline
+ | onpopstate
+ | onredo
+ | onresize
+ | onstorage
+ | onundo
+ | onunload
+ | role
+ | aria-atomic
+ | aria-busy
+ | aria-controls
+ | aria-describedby
+ | aria-disabled
+ | aria-dropeffect
+ | aria-expanded
+ | aria-flowto
+ | aria-grabbed
+ | aria-haspopup
+ | aria-hidden
+ | aria-invalid
+ | aria-label
+ | aria-labelledby
+ | aria-live
+ | aria-owns
+ | aria-relevant
+ | aria-required
+ | spellcheck
+ | accesskey
+ | itemref
+ | itemprop
+ | itemscope
+ | itemtype
+ | itemid
+ | name
+ | align
+ | about
+ | prefix
+ | property
+ | typeof
+ | vocab
+ | content
+ | datatype
+ | href
+ | rel
+ | resource
+ | rev
+ | inlist
+ | its-loc-note
+ | its-loc-note-type
+ | its-loc-note-ref
+ | its-term-info-ref
+ | its-term
+ | its-term-confidence
+ | its-within-text
+ | its-domain-mapping
+ | its-ta-confidence
+ | its-ta-class-ref
+ | its-ta-ident
+ | its-ta-ident-ref
+ | its-ta-source
+ | its-locale-filter-list
+ | its-locale-filter-type
+ | its-person
+ | its-person-ref
+ | its-org
+ | its-org-ref
+ | its-tool
+ | its-tool-ref
+ | its-rev-person
+ | its-rev-person-ref
+ | its-rev-org
+ | its-rev-org-ref
+ | its-rev-tool
+ | its-rev-tool-ref
+ | its-prov-ref
+ | its-provenance-records-ref
+ | its-loc-quality-issues-ref
+ | its-loc-quality-issue-type
+ | its-loc-quality-issue-comment
+ | its-loc-quality-issue-severity
+ | its-loc-quality-issue-profile-ref
+ | its-loc-quality-issue-enabled
+ | its-loc-quality-rating-score
+ | its-loc-quality-rating-vote
+ |
its-loc-quality-rating-score-threshold
+ |
its-loc-quality-rating-vote-threshold
+ |
its-loc-quality-rating-profile-ref
+ | its-mt-confidence
+ | its-allowed-characters
+ | its-storage-size
+ | its-storage-encoding
+ | its-line-break-type
+ | its-annotators-ref
+ )
+ {
+ string
+ }
+ embed.inner =
+ empty
+
+ common.elem.phrasing |= embed.elem
+
+## Generic Objects: <object>
+
+ object.elem.flow =
+ element object { object.inner.flow & object.attrs }
+ object.elem.phrasing =
+ element object { object.inner.phrasing & object.attrs }
+ object.attrs =
+ ( common.attrs
+ & ( ( object.attrs.data
+ & object.attrs.type?
+ )
+ | object.attrs.type
+ )
+ & object.attrs.typemustmatch?
+# & object.attrs.classid?
+# & object.attrs.codebase?
+# & object.attrs.codetype?
+ & object.attrs.height?
+ & object.attrs.width?
+ & object.attrs.usemap?
+ & object.attrs.name?
+ & common-form.attrs.form?
+ & ( common.attrs.aria.landmark.application
+ | common.attrs.aria.landmark.document
+ | common.attrs.aria.role.img
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ object.attrs.data =
+ attribute data {
+ common.data.uri.non-empty
+ }
+ object.attrs.type =
+ attribute type {
+ common.data.mimetype
+ }
+ object.attrs.typemustmatch =
+ attribute typemustmatch {
+ w:string "typemustmatch" | w:string ""
+ } & v5only
+ object.attrs.height =
+ attribute height {
+ common.data.integer.non-negative
+ }
+ object.attrs.width =
+ attribute width {
+ common.data.integer.non-negative
+ }
+ object.attrs.usemap =
+ attribute usemap {
+ common.data.hash-name
+ }
+ object.attrs.name =
+ attribute name {
+ common.data.browsing-context
+ }
+ object.inner.flow =
+ ( param.elem*
+ , common.inner.transparent.flow
+ )
+ object.inner.phrasing =
+ ( param.elem*
+ , common.inner.phrasing
+ )
+
+ common.elem.flow |= object.elem.flow
+ common.elem.phrasing |= object.elem.phrasing
+
+## Initialization Parameters: <param>
+
+ param.elem =
+ element param { param.inner & param.attrs }
+ param.attrs =
+ ( common.attrs
+ & param.attrs.name
+ & param.attrs.value
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ param.attrs.name =
+ attribute name {
+ string
+ }
+ param.attrs.value =
+ attribute value {
+ string
+ }
+ param.inner =
+ ( empty )
+
+## Inline Frame: <iframe>
+
+ iframe.elem =
+ element iframe { iframe.inner & iframe.attrs }
+ iframe.attrs =
+ ( common.attrs
+ & iframe.attrs.src?
+ & iframe.attrs.srcdoc?
+ & iframe.attrs.name?
+ & iframe.attrs.width?
+ & iframe.attrs.height?
+ & iframe.attrs.sandbox?
+ & iframe.attrs.seamless?
+ & iframe.attrs.allowfullscreen?
+ & ( common.attrs.aria.landmark.application
+ | common.attrs.aria.landmark.document
+ | common.attrs.aria.role.img
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ iframe.attrs.src =
+ attribute src {
+ common.data.uri.non-empty
+ }
+ iframe.attrs.srcdoc =
+ attribute srcdoc {
+ string #FIXME
+ }
+ iframe.attrs.name =
+ attribute name {
+ common.data.browsing-context
+ }
+ iframe.attrs.height =
+ attribute height {
+ common.data.integer.non-negative
+ }
+ iframe.attrs.width =
+ attribute width {
+ common.data.integer.non-negative
+ }
+ iframe.attrs.seamless =
+ attribute seamless {
+ w:string "seamless" | w:string ""
+ } & v5only
+ iframe.attrs.sandbox =
+ attribute sandbox
+ { list
+ { ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-forms" )?
+ , ( w:string "allow-scripts" )?
+ }
+ | list
+ { ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-scripts" )?
+ , ( w:string "allow-forms" )?
+ }
+ | list
+ { ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-forms" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-scripts" )?
+ }
+ | list
+ { ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-forms" )?
+ , ( w:string "allow-scripts" )?
+ , ( w:string "allow-same-origin"
)?
+ }
+ | list
+ { ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-scripts" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-forms" )?
+ }
+ | list
+ { ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-scripts" )?
+ , ( w:string "allow-forms" )?
+ , ( w:string "allow-same-origin"
)?
+ }
+ | list
+ { ( w:string "allow-same-origin"
)?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-forms" )?
+ , ( w:string "allow-scripts" )?
+ }
+ | list
+ { ( w:string "allow-same-origin"
)?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-scripts" )?
+ , ( w:string "allow-forms" )?
+ }
+ | list
+ { ( w:string "allow-forms" )?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-scripts" )?
+ }
+ | list
+ { ( w:string "allow-forms" )?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-scripts" )?
+ , ( w:string "allow-same-origin"
)?
+ }
+ | list
+ { ( w:string "allow-scripts" )?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-forms" )?
+ }
+ | list
+ { ( w:string "allow-scripts" )?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-forms" )?
+ , ( w:string "allow-same-origin"
)?
+ }
+ | list
+ { ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-forms" )?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-scripts" )?
+ }
+ | list
+ { ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-scripts" )?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-forms" )?
+ }
+ | list
+ { ( w:string "allow-forms" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-scripts" )?
+ }
+ | list
+ { ( w:string "allow-forms" )?
+ , ( w:string "allow-scripts" )?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-same-origin"
)?
+ }
+ | list
+ { ( w:string "allow-scripts" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-forms" )?
+ }
+ | list
+ { ( w:string "allow-scripts" )?
+ , ( w:string "allow-forms" )?
+ , ( w:string
"allow-top-navigation" )?
+ , ( w:string "allow-same-origin"
)?
+ }
+ | list
+ { ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-forms" )?
+ , ( w:string "allow-scripts" )?
+ , ( w:string
"allow-top-navigation" )?
+ }
+ | list
+ { ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-scripts" )?
+ , ( w:string "allow-forms" )?
+ , ( w:string
"allow-top-navigation" )?
+ }
+ | list
+ { ( w:string "allow-forms" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-scripts" )?
+ , ( w:string
"allow-top-navigation" )?
+ }
+ | list
+ { ( w:string "allow-forms" )?
+ , ( w:string "allow-scripts" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string
"allow-top-navigation" )?
+ }
+ | list
+ { ( w:string "allow-scripts" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string "allow-forms" )?
+ , ( w:string
"allow-top-navigation" )?
+ }
+ | list
+ { ( w:string "allow-scripts" )?
+ , ( w:string "allow-forms" )?
+ , ( w:string "allow-same-origin"
)?
+ , ( w:string
"allow-top-navigation" )?
+ }
+ } & v5only
+ iframe.attrs.allowfullscreen =
+ attribute allowfullscreen {
+ w:string "allowfullscreen" | w:string ""
+ } & v5only
+ iframe.inner =
+ ( ( text & HTMLonly ) | empty )
+
+ common.elem.phrasing |= iframe.elem
+
+#######################################################################
+## Image Maps
+
+## Map Definition: <map>
+
+ map.elem.flow =
+ element map { map.inner.flow & map.attrs }
+ map.elem.phrasing =
+ element map { map.inner.phrasing & map.attrs }
+ map.attrs =
+ ( common.attrs
+ & map.attrs.name
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ ) # REVISIT make id required in Schematron
+ map.attrs.name =
+ attribute name {
+ common.data.name
+ }
+ map.inner.flow =
+ ( common.inner.transparent.flow )
+ map.inner.phrasing =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= map.elem.flow
+ common.elem.phrasing |= map.elem.phrasing
+
+## Map Area Definition: <area>
+
+ area.elem =
+ element area { area.inner & area.attrs }
+ area.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & shared-hyperlink.attrs.download?
+ & ( area.attrs.alt
+ & shared-hyperlink.attrs.href
+ )?
+ & shared-hyperlink.attrs.target?
+ & shared-hyperlink.attrs.ping?
+ & shared-hyperlink.attrs.rel?
+ & shared-hyperlink.attrs.hreflang?
+ & shared-hyperlink.attrs.type?
+ & area.attrs.shape?
+ & ( common.attrs.aria.role.link
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ area.attrs.alt =
+ attribute alt {
+ text
+ }
+ area.attrs.shape =
+ ( ( area.attrs.shape.rect? &
area.attrs.coords.rect )
+ | ( area.attrs.shape.circle &
area.attrs.coords.circle )
+ | ( area.attrs.shape.poly &
area.attrs.coords.poly )
+ | ( area.attrs.shape.default )
+ )
+ area.attrs.shape.rect =
+ attribute shape {
+ w:string "rect"
+ }
+ area.attrs.coords.rect =
+ attribute coords {
+ w:rectangle
+# xsd:token {
+# pattern =
"-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+"
+# }
+ }
+ area.attrs.shape.circle =
+ attribute shape {
+ w:string "circle"
+ }
+ area.attrs.coords.circle =
+ attribute coords {
+ w:circle
+# xsd:token {
+# pattern = "-?[0-9]+,-?[0-9]+,[0-9]+"
+# }
+ }
+ area.attrs.shape.poly =
+ attribute shape {
+ w:string "poly"
+ }
+ area.attrs.coords.poly =
+ attribute coords {
+ w:polyline
+# xsd:token {
+# pattern =
"-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+(,-?[0-9]+,-?[0-9]+)*"
+# }
+ }
+ area.attrs.shape.default =
+ attribute shape {
+ w:string "default"
+ }
+ area.inner =
+ ( empty )
+
+ common.elem.phrasing |= area.elem
+
+## Attributes Common to Embedded Content
+
+ embedded.content.attrs.crossorigin =
+ attribute crossorigin {
+ w:string "anonymous" | w:string
"use-credentials" | w:string ""
+ } & v5only
diff --git a/form-datatypes.rnc b/form-datatypes.rnc
new file mode 100644
index 0000000..db719f9
--- /dev/null
+++ b/form-datatypes.rnc
@@ -0,0 +1,63 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Datatypes related to forms #
+# #####################################################################
+
+## MIME types
+
+ form.data.mimetypelist =
+ w:mime-type-list
+
+ form.data.charsetlist =
+ string # FIXME should be a "a space- and/or comma-delimited
+ # list of charset values"
+
+## ECMAScript Regular Expression
+
+ form.data.pattern =
+ w:pattern
+
+## Temporal
+
+ form.data.datetime-local =
+ w:datetime-local
+
+ form.data.date =
+ w:date
+
+ form.data.month =
+ w:month
+
+ form.data.week =
+ w:week
+
+ form.data.time =
+ w:time
+
+## Email
+
+ form.data.emailaddress =
+ w:email-address
+
+ form.data.emailaddresslist =
+ w:email-address-list
+
+## Color
+
+ form.data.color =
+ w:simple-color
+# xsd:string {
+# pattern = "#[a-fA-F0-9]{6}"
+# }
+
+## Text without line breaks
+
+ form.data.stringwithoutlinebreaks =
+ w:string-without-line-breaks
+
+## Non-empty string
+
+ form.data.nonemptystring =
+ w:non-empty-string
+
diff --git a/html5.rnc b/html5.rnc
new file mode 100644
index 0000000..0d8cef8
--- /dev/null
+++ b/html5.rnc
@@ -0,0 +1,56 @@
+default namespace = "http://www.w3.org/1999/xhtml"
+# #####################################################################
+## RELAX NG Schema for HTML 5 #
+# #####################################################################
+
+ # To validate an HTML 5 document, you must first validate against #
+ # this schema and then ALSO validate against assertions.sch #
+
+ ## HTML flavor RELAX NG schemas can only be used after the #
+ ## document has been transformed to well-formed XML. #
+ ## - Insert closing slashes in all empty element tags #
+ ## - Insert all optional start and end tags #
+ ## - Add xmlns "http://www.w3.org/1999/xhtml" #
+ ## - Properly escape <script> and <style> CDATA #
+ ## - Parse and transform all HTML-only entities to numeric #
+ ## character references #
+ ## Obviously, syntax-checking involving these features cannot be #
+ ## done by the RELAX NG schema and must be checked, along with the #
+ ## <!DOCTYPE> requirement, by some other application. #
+
+# #####################################################################
+## Schema Framework & Parameters
+
+include "common.rnc" {
+ # XHTML flavor #
+ XMLonly = notAllowed
+ HTMLonly = empty
+ # HTML 4 compat #
+ v5only = empty
+ # HTML-serializability #
+ nonHTMLizable = notAllowed
+ # HTML-roundtrippability #
+ nonRoundtrippable = notAllowed
+}
+
+# #####################################################################
+## Language Definitions
+
+start = html.elem
+
+include "meta.rnc"
+include "phrase.rnc"
+include "block.rnc"
+include "sectional.rnc"
+include "structural.rnc"
+include "revision.rnc"
+include "embed.rnc"
+include "ruby.rnc"
+include "media.rnc"
+include "core-scripting.rnc"
+include "tables.rnc"
+include "form-datatypes.rnc"
+include "web-forms.rnc"
+include "web-forms2.rnc"
+include "applications.rnc"
+include "data.rnc"
diff --git a/html5exclusions.rnc b/html5exclusions.rnc
new file mode 100644
index 0000000..1fa0915
--- /dev/null
+++ b/html5exclusions.rnc
@@ -0,0 +1,63 @@
+default namespace = "http://www.w3.org/1999/xhtml"
+# #####################################################################
+## RELAX NG Schema for (X)HTML 5: Exclusions #
+# #####################################################################
+
+ ## This file is unmaintained. Please use assertions.sch instead.
+
+# #####################################################################
+## Schema Framework & Parameters
+
+ start = normal.elem.all-inclusive
+
+# #####################################################################
+## Normal Element Patterns
+
+## Any attribute from any namespace
+
+ normal.attr.anything =
+ attribute * { text }*
+
+## Any element from any namespace except exceptional elements,
+## but allowing those elements as descendants
+
+ normal.elem.all =
+ element * - (dfn) {
+ normal.elem.all-inclusive
+ }
+
+## Any element from any namespace including exceptional elements
+
+ normal.elem.all-inclusive =
+ wildcard.elem.exclude-all | dfn.elem.exclude-self
+
+
+# #####################################################################
+## Exclusion Element Patterns
+
+ # exclude all exceptional elements from the name classes;
+ # list them explicitly in content models instead
+
+normal.elem.exclude-dfn =
+ element * - (dfn) {
+ normal.elem.exclude-dfn
+ }
+
+dfn.elem.exclude-self =
+ element dfn {
+ ( normal.attr.anything
+ & normal.elem.exclude-dfn
+ )
+ }
+
+# FIXME this part was cut off -- hsivonen
+wildcard.elem.exclude-all =
+ notAllowed
+
+#FIXME no nested forms in HTML-serializable docs
+
+#FIXME no nested labels
+
+#FIXME no blockquote inside header or footer
+
+#FIXME exactly one hn in header
diff --git a/media.rnc b/media.rnc
new file mode 100644
index 0000000..28cbb63
--- /dev/null
+++ b/media.rnc
@@ -0,0 +1,210 @@
+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 )
diff --git a/meta.rnc b/meta.rnc
new file mode 100644
index 0000000..91d9d1c
--- /dev/null
+++ b/meta.rnc
@@ -0,0 +1,390 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Global Structure & Metadata #
+# #####################################################################
+
+## Root Element: <html>
+
+ html.elem =
+ element html { html.inner & html.attrs }
+ html.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ html.inner =
+ ( head.elem
+ , body.elem
+ )
+
+## Metadata Container: <head>
+
+ head.elem =
+ element head { head.inner & head.attrs }
+ head.attrs =
+ ( common.attrs
+# & head.attrs.profile?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+# head.attrs.profile =
+# attribute profile {
+# common.data.uris #REVISIT should these be
absolute (zero or more)
+# }
+ head.inner =
+ ( title.elem
+ & base.elem? # REVISIT need a non-schema checker or
Schematron
+ & common.inner.metadata # Limit encoding decl position in
Schematron
+ )
+# head.inner =
+# ( meta.elem.encoding?
+# , ( title.elem
+# & base.elem? # REVISIT need a non-schema checker
or Schematron
+# & common.inner.metadata
+# )
+# )
+
+## Content Container: <body>
+
+ body.elem =
+ element body { body.inner & body.attrs }
+ body.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.landmark.application
+ | common.attrs.aria.landmark.document
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.implicit.document
+ )?
+ & body.attrs.onafterprint?
+ & body.attrs.onbeforeprint?
+ & body.attrs.onbeforeunload?
+ & body.attrs.onhashchange?
+ & body.attrs.onmessage?
+ & body.attrs.onoffline?
+ & body.attrs.ononline?
+ & body.attrs.onpagehide?
+ & body.attrs.onpageshow?
+ & body.attrs.onpopstate?
+ & body.attrs.onresize?
+ & body.attrs.onstorage?
+ & body.attrs.onunload?
+ )
+ body.inner =
+ ( common.inner.flow )
+
+ body.attrs.onafterprint =
+ attribute onafterprint { common.data.functionbody }
+ body.attrs.onbeforeprint =
+ attribute onbeforeprint { common.data.functionbody }
+ body.attrs.onbeforeunload =
+ attribute onbeforeunload { common.data.functionbody }
+ body.attrs.onhashchange =
+ attribute onhashchange { common.data.functionbody }
+ body.attrs.onmessage =
+ attribute onmessage { common.data.functionbody }
+ body.attrs.onoffline =
+ attribute onoffline { common.data.functionbody }
+ body.attrs.ononline =
+ attribute ononline { common.data.functionbody }
+ body.attrs.onpopstate =
+ attribute onpopstate { common.data.functionbody }
+ body.attrs.onpagehide =
+ attribute onpagehide { common.data.functionbody }
+ body.attrs.onpageshow =
+ attribute onpageshow { common.data.functionbody }
+ body.attrs.onredo =
+ attribute onredo { common.data.functionbody }
+ body.attrs.onresize =
+ attribute onresize { common.data.functionbody }
+ body.attrs.onstorage =
+ attribute onstorage { common.data.functionbody }
+ body.attrs.onundo =
+ attribute onundo { common.data.functionbody }
+ body.attrs.onunload =
+ attribute onunload { common.data.functionbody }
+
+## Document Title: <title>
+
+ title.elem =
+ element title { title.inner & title.attrs }
+ title.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ title.inner =
+ ( text )
+
+## Base URI: <base>
+
+ base.elem =
+ element base { base.inner & base.attrs }
+ base.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & ( ( base.attrs.href
+ & base.attrs.target?
+ )
+ | base.attrs.target
+ )
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ base.attrs.href =
+ attribute href {
+ common.data.uri
+ }
+ base.attrs.target =
+ attribute target {
+ common.data.browsing-context-or-keyword
+ }
+ base.inner =
+ ( empty )
+
+## Global Relationships: <link>
+
+ link.elem =
+ element link { link.inner & link.attrs }
+ link.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & link.attrs.href
+ & link.attrs.rel
+ & shared-hyperlink.attrs.hreflang?
+ & shared-hyperlink.attrs.media?
+ & shared-hyperlink.attrs.type?
+ & link.attrs.sizes?
+ # link.attrs.title included in common.attrs
+ & embedded.content.attrs.crossorigin?
+ & ( common.attrs.aria.role.link
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ link.attrs.href =
+ attribute href {
+ common.data.uri.non-empty
+ }
+ link.attrs.rel =
+ attribute rel {
+ w:link-rel
+ }
+ link.attrs.sizes =
+ attribute sizes {
+ w:string "any" | common.data.sizes
+ }
+ link.inner =
+ ( empty )
+
+ common.elem.metadata |= link.elem
+
+## Global Style: <style>
+
+ style.elem =
+ element style { style.inner & style.attrs }
+ style.attrs =
+ ( common.attrs
+ & style.attrs.type?
+ & style.attrs.media?
+ # style.attrs.title included in common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ style.attrs.type =
+ attribute type {
+ common.data.mimetype
+ }
+ style.attrs.media =
+ attribute media {
+ common.data.mediaquery
+ }
+ style.inner =
+ ( common.inner.anything )
+
+ common.elem.metadata |= style.elem
+
+## Scoped Style: <style scoped>
+
+ style.elem.scoped =
+ element style { style.inner & style.scoped.attrs }
+ style.scoped.attrs =
+ ( common.attrs
+ & style.attrs.type?
+ & style.attrs.media?
+ & style.attrs.scoped
+ # style.attrs.title included in common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ style.attrs.scoped =
+ attribute scoped {
+ w:string "scoped" | w:string ""
+ }
+
+## Name-Value Metadata: <meta name>
+
+ meta.name.elem =
+ element meta { meta.inner & meta.name.attrs }
+ meta.name.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & meta.name.attrs.name
+ & meta.name.attrs.content
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ meta.name.attrs.name =
+ attribute name {
+ w:meta-name
+ }
+ meta.name.attrs.content =
+ attribute content {
+ string
+ }
+ meta.inner =
+ ( empty )
+
+ common.elem.metadata |= meta.name.elem
+
+## "refresh" pragma directive: <meta http-equiv='refresh'>
+
+ meta.http-equiv.refresh.elem =
+ element meta { meta.inner & meta.http-equiv.refresh.attrs }
+ meta.http-equiv.refresh.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & meta.http-equiv.attrs.http-equiv.refresh
+ & meta.http-equiv.attrs.content.refresh
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ meta.http-equiv.attrs.http-equiv.refresh =
+ attribute http-equiv {
+ w:string "refresh"
+ }
+ meta.http-equiv.attrs.content.refresh =
+ attribute content {
+ common.data.refresh
+ }
+ common.elem.metadata |= meta.http-equiv.refresh.elem # not quite right
per spec
+ # if the definition is
+ # reused in another
language
+
+## "default-style" pragma directive: <meta http-equiv='default-style'>
+
+ meta.http-equiv.default-style.elem =
+ element meta { meta.inner & meta.http-equiv.default-style.attrs
}
+ meta.http-equiv.default-style.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & meta.http-equiv.attrs.http-equiv.default-style
+ & meta.http-equiv.attrs.content.default-style
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ meta.http-equiv.attrs.http-equiv.default-style =
+ attribute http-equiv {
+ w:string "default-style"
+ }
+ meta.http-equiv.attrs.content.default-style =
+ attribute content {
+ common.data.default-style
+ }
+
+ common.elem.metadata |= meta.http-equiv.default-style.elem # not quite
right per spec
+ # if the
definition is
+ # reused in
another language
+
+## "x-ua-compatible" pragma directive: <meta http-equiv='x-ua-compatible'>
+
+ meta.http-equiv.x-ua-compatible.elem =
+ element meta { meta.inner &
meta.http-equiv.x-ua-compatible.attrs }
+ meta.http-equiv.x-ua-compatible.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & meta.http-equiv.attrs.http-equiv.x-ua-compatible
+ & meta.http-equiv.attrs.content.x-ua-compatible
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ meta.http-equiv.attrs.http-equiv.x-ua-compatible =
+ attribute http-equiv {
+ w:string "x-ua-compatible"
+ }
+ meta.http-equiv.attrs.content.x-ua-compatible =
+ attribute content {
+ common.data.x-ua-compatible
+ }
+ common.elem.metadata |= meta.http-equiv.x-ua-compatible.elem
+
+## Inline Character Encoding Statement for HTML: <meta charset>
+
+ meta.charset.elem =
+ element meta { meta.inner & meta.charset.attrs }
+ meta.charset.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & meta.charset.attrs.charset
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ meta.charset.attrs.charset =
+ attribute charset {
+ (common.data.charset & HTMLonly)
+ | (xsd:string {
+ pattern = "[uU][tT][fF]-8"
+ } & XMLonly )
+ }
+
+## Inline Character Encoding Statement for HTML: <meta
http-equiv='content-type'>
+
+ meta.http-equiv.content-type.elem =
+ element meta { meta.inner & meta.http-equiv.content-type.attrs }
+ & HTMLonly
+ meta.http-equiv.content-type.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & meta.http-equiv.attrs.http-equiv.content-type
+ & meta.http-equiv.attrs.content.content-type
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ meta.http-equiv.attrs.http-equiv.content-type =
+ attribute http-equiv {
+ w:string "content-type"
+ }
+ meta.http-equiv.attrs.content.content-type =
+ attribute content {
+ common.data.meta-charset
+ }
+
+ common.elem.metadata |= ( meta.charset.elem |
meta.http-equiv.content-type.elem )
diff --git a/microdata.rnc b/microdata.rnc
new file mode 100644
index 0000000..91616c8
--- /dev/null
+++ b/microdata.rnc
@@ -0,0 +1,101 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Microdata #
+# #####################################################################
+
+common.attrs.microdata =
+ ( common.attrs.microdata.itemref?
+ & common.attrs.microdata.itemprop?
+ & common.attrs.microdata.itemscope?
+ & common.attrs.microdata.itemtype?
+ & common.attrs.microdata.itemid?
+ )
+ common.attrs.microdata.itemref =
+ attribute itemref {
+ common.data.idrefs
+ }
+ common.attrs.microdata.itemprop =
+ attribute itemprop {
+ common.data.microdata-properties
+ }
+ common.attrs.microdata.itemscope =
+ attribute itemscope {
+ w:string "itemscope" | w:string ""
+ }
+ common.attrs.microdata.itemtype =
+ attribute itemtype {
+ list { common.data.uri.absolute+ }
+ }
+ common.attrs.microdata.itemid =
+ attribute itemid {
+ common.data.uri
+ }
+
+common.attrs &= common.attrs.microdata
+
+a.attrs &= common.attrs.microdata
+area.attrs &= common.attrs.microdata
+base.attrs &= common.attrs.microdata
+
+## URL-valued Property Metadata: <link itemprop>
+
+ link.elem.phrasing =
+ element link { link.inner & link.phrasing.attrs }
+ link.phrasing.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & common.attrs.microdata.itemprop
+ & common.attrs.microdata.itemref?
+ & common.attrs.microdata.itemscope?
+ & common.attrs.microdata.itemtype?
+ & common.attrs.microdata.itemid?
+ & shared-hyperlink.attrs.href
+ & shared-hyperlink.attrs.hreflang?
+ & shared-hyperlink.attrs.media?
+ & shared-hyperlink.attrs.type?
+ & link.attrs.sizes?
+ # link.attrs.title included in common.attrs
+ & embedded.content.attrs.crossorigin?
+ & ( common.attrs.aria.role.link
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ common.elem.phrasing |= link.elem.phrasing
+
+## <link> element in head, extensions
+
+link.attrs.rel |= common.attrs.microdata.itemprop
+link.attrs &= common.attrs.microdata.itemref?
+link.attrs &= common.attrs.microdata.itemscope?
+link.attrs &= common.attrs.microdata.itemtype?
+link.attrs &= common.attrs.microdata.itemid?
+
+## Property Metadata: <meta itemprop>
+
+ meta.itemprop.elem =
+ element meta { meta.inner & meta.itemprop.attrs }
+ meta.itemprop.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & common.attrs.microdata.itemprop
+ & common.attrs.microdata.itemref?
+ & common.attrs.microdata.itemscope?
+ & common.attrs.microdata.itemtype?
+ & common.attrs.microdata.itemid?
+ & meta.itemprop.attrs.content
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ meta.itemprop.attrs.content =
+ attribute content {
+ string
+ }
+ common.elem.metadata |= meta.itemprop.elem
+ common.elem.phrasing |= meta.itemprop.elem
diff --git a/phrase.rnc b/phrase.rnc
new file mode 100644
index 0000000..dc70881
--- /dev/null
+++ b/phrase.rnc
@@ -0,0 +1,399 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Phrase Markup #
+# #####################################################################
+
+## Contextual Hyperlink: <a>
+
+ a.elem.phrasing =
+ element a { a.inner.phrasing & a.attrs }
+ a.elem.flow =
+ element a { a.inner.flow & a.attrs }
+ a.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & a.attrs.name?
+ & shared-hyperlink.attrs.download?
+ & shared-hyperlink.attrs.href?
+ & shared-hyperlink.attrs.target?
+ & shared-hyperlink.attrs.rel?
+ & shared-hyperlink.attrs.hreflang?
+ & shared-hyperlink.attrs.type?
+ & shared-hyperlink.attrs.ping?
+ & ( common.attrs.aria.implicit.link
+ | common.attrs.aria.role.button
+ | common.attrs.aria.role.checkbox
+ | common.attrs.aria.role.link
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.treeitem
+ )?
+ )
+ a.attrs.name =
+ attribute name {
+ common.data.id # XXX not what the spec says
+ }
+ a.inner.phrasing =
+ ( common.inner.phrasing )
+ a.inner.flow =
+ ( common.inner.transparent.flow )
+
+ common.elem.phrasing |= a.elem.phrasing
+ common.elem.flow |= a.elem.flow
+
+## Shared hyperlink attributes
+
+ shared-hyperlink.attrs.download =
+ attribute download {
+ string
+ }
+ shared-hyperlink.attrs.href =
+ attribute href {
+ common.data.uri
+ }
+ shared-hyperlink.attrs.target =
+ attribute target {
+ common.data.browsing-context-or-keyword
+ }
+ shared-hyperlink.attrs.rel =
+ attribute rel {
+ w:a-rel
+ }
+ shared-hyperlink.attrs.hreflang =
+ attribute hreflang {
+ common.data.langcode
+ }
+ shared-hyperlink.attrs.media =
+ attribute media {
+ common.data.mediaquery
+ }
+ shared-hyperlink.attrs.type =
+ attribute type {
+ common.data.mimetype
+ }
+ shared-hyperlink.attrs.ping =
+ attribute ping {
+ common.data.uris
+ } & v5only
+
+## Emphatic Stress: <em>
+
+ em.elem =
+ element em { em.inner & em.attrs }
+ em.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ em.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= em.elem
+
+## Strong Importance: <strong>
+
+ strong.elem =
+ element strong { strong.inner & strong.attrs }
+ strong.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ strong.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= strong.elem
+
+## Small Print and Side Comments: <small>
+
+ small.elem =
+ element small { small.inner & small.attrs }
+ small.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ small.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= small.elem
+
+## Marked (Highlighted) Text: <mark>
+
+ mark.elem =
+ element mark { mark.inner & mark.attrs }
+ & v5only
+ mark.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ mark.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= mark.elem
+
+## Abbreviation: <abbr>
+
+ abbr.elem =
+ element abbr { abbr.inner & abbr.attrs }
+ abbr.attrs =
+ ( common.attrs
+ # abbr.attrs.title included in common.attrs
+ & common.attrs.aria?
+ )
+ abbr.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= abbr.elem
+
+## Defining Instance: <dfn>
+
+ dfn.elem =
+ element dfn { dfn.inner & dfn.attrs }
+ dfn.attrs =
+ ( common.attrs
+ # dfn.attrs.title included in common.attrs
+ & common.attrs.aria?
+ )
+ dfn.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= dfn.elem
+
+## Italic: <i>
+
+ i.elem =
+ element i { i.inner & i.attrs }
+ i.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ i.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= i.elem
+
+## Bold: <b>
+
+ b.elem =
+ element b { b.inner & b.attrs }
+ b.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ b.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= b.elem
+
+## Struck Text: <s>
+
+ s.elem =
+ element s { s.inner & s.attrs }
+ s.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ s.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= s.elem
+
+## Underline: <u>
+
+ u.elem =
+ element u { u.inner & u.attrs }
+ u.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ u.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= u.elem
+
+## Code Fragment: <code>
+
+ code.elem =
+ element code { code.inner & code.attrs }
+ code.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ code.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= code.elem
+
+## Variable or Placeholder: <var>
+
+ var.elem =
+ element var { var.inner & var.attrs }
+ var.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ var.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= var.elem
+
+## (Sample) Output: <samp>
+
+ samp.elem =
+ element samp { samp.inner & samp.attrs }
+ samp.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ samp.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= samp.elem
+
+## User Input: <kbd>
+
+ kbd.elem =
+ element kbd { kbd.inner & kbd.attrs }
+ kbd.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ kbd.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= kbd.elem
+
+## Superscript: <sup>
+
+ sup.elem =
+ element sup { sup.inner & sup.attrs }
+ sup.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ sup.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= sup.elem
+
+## Subscript: <sub>
+
+ sub.elem =
+ element sub { sub.inner & sub.attrs }
+ sub.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ sub.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= sub.elem
+
+## Quotation: <q>
+
+ q.elem =
+ element q { q.inner & q.attrs }
+ q.attrs =
+ ( common.attrs
+ & q.attrs.cite?
+ & common.attrs.aria?
+ )
+ q.attrs.cite =
+ attribute cite {
+ common.data.uri
+ }
+ q.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= q.elem
+
+## Title of Work: <cite>
+
+ cite.elem =
+ element cite { cite.inner & cite.attrs }
+ cite.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ cite.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= cite.elem
+
+## Generic Span: <span>
+
+ span.elem =
+ element span { span.inner & span.attrs }
+ span.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ span.inner =
+ ( common.inner.phrasing ) # REVISIT allow ol and ul?
+
+ common.elem.phrasing |= span.elem
+
+## Bidirectional Override: <bdo>
+
+ bdo.elem =
+ element bdo { bdo.inner & bdo.attrs }
+ bdo.attrs =
+ ( common.attrs # dir required in Schematron
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ bdo.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= bdo.elem
+
+## Bidirectional Isolate: <bdi>
+
+ bdi.elem =
+ element bdi { bdi.inner & bdi.attrs }
+ bdi.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ bdi.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= bdi.elem
+
+## Line Break: <br>
+
+ br.elem =
+ element br { br.inner & br.attrs }
+ br.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ br.inner =
+ ( empty )
+
+ common.elem.phrasing |= br.elem
+
+## Line-break opportunity: <wbr>
+
+ wbr.elem =
+ element wbr { wbr.inner & wbr.attrs }
+ wbr.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ wbr.inner =
+ ( empty )
+
+ common.elem.phrasing |= wbr.elem
diff --git a/rdfa.rnc b/rdfa.rnc
new file mode 100644
index 0000000..3c849d9
--- /dev/null
+++ b/rdfa.rnc
@@ -0,0 +1,285 @@
+nonRDFaLite = empty
+# #####################################################################
+## RELAX NG Schema for HTML 5: RDFa 1.1 and RDFa Lite 1.1 #
+# #####################################################################
+
+# #####################################################################
+## RDFa Datatypes #
+# #####################################################################
+
+common.data.rdfa.safecurie =
+ xsd:string {
+ pattern = "\[(([\i-[:]][\c-[:]]*)?:?)[^\s]*\]"
+ minLength = "2"
+ }
+common.data.rdfa.curie =
+ xsd:string {
+ pattern = "(([\i-[:]][\c-[:]]*)?:)[^\s]*"
+ minLength = "1"
+ }
+common.data.rdfa.term =
+ xsd:string {
+ pattern = "[\i-[:]][/\c-[:]]*"
+ }
+
+# #####################################################################
+## RDFa Attributes #
+# #####################################################################
+
+common.attrs.rdfa &=
+ ( common.attrs.rdfa.about?
+ & common.attrs.rdfa.prefix?
+ & common.attrs.rdfa.property?
+ & common.attrs.rdfa.typeof?
+ & common.attrs.rdfa.vocab?
+ & common.attrs.rdfa.content?
+ & common.attrs.rdfa.datatype?
+ & common.attrs.rdfa.rel?
+ & common.attrs.rdfa.resource?
+ & common.attrs.rdfa.rev?
+ & common.attrs.rdfa.inlist?
+ )
+ common.attrs.rdfa.prefix =
+ attribute prefix {
+ (
+ xsd:string {
+ pattern = "\s*([\i-[:]][\c-[:]]*: [^
]+)(\s+[\i-[:]][\c-[:]]*: [^ ]+)*\s*"
+ }
+ | string ""
+ )
+ }
+ common.attrs.rdfa.property =
+ attribute property {
+ (
+ list {
+ ( common.data.rdfa.term
+ | common.data.rdfa.curie
+ | common.data.uri.absolute
+ )+
+ }
+ | string ""
+ )
+ }
+ common.attrs.rdfa.resource =
+ attribute resource {
+ ( common.data.rdfa.safecurie
+ | common.data.rdfa.curie
+ | common.data.uri
+ )
+ }
+ common.attrs.rdfa.typeof =
+ attribute typeof {
+ (
+ list {
+ ( common.data.rdfa.term
+ | common.data.rdfa.curie
+ | common.data.uri.absolute
+ )+
+ }
+ | string ""
+ )
+ }
+ common.attrs.rdfa.vocab =
+ attribute vocab {
+ ( common.data.uri.absolute
+ | string ""
+ )
+ }
+ common.attrs.rdfa.about =
+ attribute about {
+ ( common.data.rdfa.safecurie
+ | common.data.rdfa.curie
+ | common.data.uri
+ )
+ } & nonRDFaLite
+ common.attrs.rdfa.content =
+ attribute content {
+ string
+ } & nonRDFaLite
+ common.attrs.rdfa.datatype =
+ attribute datatype {
+ ( common.data.rdfa.term
+ | common.data.rdfa.curie
+ | common.data.uri.absolute
+ | string ""
+ )
+ } & nonRDFaLite
+ common.attrs.rdfa.rel =
+ attribute rel {
+ (
+ list {
+ ( common.data.rdfa.term
+ | common.data.rdfa.curie
+ | common.data.uri.absolute
+ )+
+ }
+ | string ""
+ )
+ } & nonRDFaLite
+ common.attrs.rdfa.rev =
+ attribute rev {
+ (
+ list {
+ ( common.data.rdfa.term
+ | common.data.rdfa.curie
+ | common.data.uri.absolute
+ )+
+ }
+ | string ""
+ )
+ } & nonRDFaLite
+ common.attrs.rdfa.inlist =
+ attribute inlist {
+ string
+ } & nonRDFaLite
+
+common.attrs.rdfa.no-rel &=
+ ( common.attrs.rdfa.about?
+ & common.attrs.rdfa.prefix?
+ & common.attrs.rdfa.property?
+ & common.attrs.rdfa.typeof?
+ & common.attrs.rdfa.vocab?
+ & common.attrs.rdfa.content?
+ & common.attrs.rdfa.datatype?
+ & common.attrs.rdfa.resource?
+ & common.attrs.rdfa.rev?
+ & common.attrs.rdfa.inlist?
+ )
+common.attrs.rdfa.no-rel-rev &=
+ ( common.attrs.rdfa.about?
+ & common.attrs.rdfa.prefix?
+ & common.attrs.rdfa.property?
+ & common.attrs.rdfa.typeof?
+ & common.attrs.rdfa.vocab?
+ & common.attrs.rdfa.content?
+ & common.attrs.rdfa.datatype?
+ & common.attrs.rdfa.resource?
+ & common.attrs.rdfa.inlist?
+ )
+common.attrs.rdfa.no-content-noproperty &=
+ ( common.attrs.rdfa.about?
+ & common.attrs.rdfa.prefix?
+ & common.attrs.rdfa.typeof?
+ & common.attrs.rdfa.vocab?
+ & common.attrs.rdfa.datatype?
+ & common.attrs.rdfa.resource?
+ & common.attrs.rdfa.inlist?
+ )
+
+common.attrs &= common.attrs.rdfa
+
+a.attrs &= common.attrs.rdfa.no-rel-rev
+area.attrs &= common.attrs.rdfa.no-rel
+base.attrs &= common.attrs.rdfa.no-rel
+
+link.rdfa.elem.metadata =
+ element link { link.inner & link.rdfa.attrs.metadata }
+link.rdfa.elem.phrasing =
+ element link { link.inner & link.rdfa.attrs.phrasing }
+link.rdfa.attrs.metadata =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & ( ( common.attrs.rdfa.property
+ & link.attrs.rel?
+ )
+ |
+ ( common.attrs.rdfa.property?
+ & link.attrs.rel
+ )
+ )
+ & link.attrs.href
+ & common.attrs.rdfa.about?
+ & common.attrs.rdfa.prefix?
+ & common.attrs.rdfa.typeof?
+ & common.attrs.rdfa.vocab?
+ & common.attrs.rdfa.content?
+ & common.attrs.rdfa.datatype?
+ & common.attrs.rdfa.resource?
+ & common.attrs.rdfa.rev?
+ & common.attrs.rdfa.inlist?
+ & shared-hyperlink.attrs.hreflang?
+ & shared-hyperlink.attrs.media?
+ & shared-hyperlink.attrs.type?
+ & link.attrs.sizes?
+ # link.attrs.title included in common.attrs
+ & embedded.content.attrs.crossorigin?
+ & ( common.attrs.aria.role.link
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+link.rdfa.attrs.phrasing =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & common.attrs.rdfa.property
+ & link.attrs.rel?
+ & ( ( common.attrs.rdfa.resource
+ & link.attrs.href?
+ )
+ |
+ ( common.attrs.rdfa.resource?
+ & link.attrs.href
+ )
+ )
+ & common.attrs.rdfa.about?
+ & common.attrs.rdfa.prefix?
+ & common.attrs.rdfa.typeof?
+ & common.attrs.rdfa.vocab?
+ & common.attrs.rdfa.content?
+ & common.attrs.rdfa.datatype?
+ & common.attrs.rdfa.rev?
+ & common.attrs.rdfa.inlist?
+ & shared-hyperlink.attrs.hreflang?
+ & shared-hyperlink.attrs.media?
+ & shared-hyperlink.attrs.type?
+ & link.attrs.sizes?
+ # link.attrs.title included in common.attrs
+ & embedded.content.attrs.crossorigin?
+ & ( common.attrs.aria.role.link
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ common.elem.metadata |= link.rdfa.elem.metadata
+ common.elem.phrasing |= link.rdfa.elem.phrasing
+
+## <meta property=foo content=bar> in head ("name" attribute optional)
+ meta.property.elem =
+ element meta { meta.inner & meta.property.attrs }
+ meta.property.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & meta.name.attrs.name?
+ & common.attrs.rdfa.property
+ & meta.name.attrs.content
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ common.elem.metadata |= meta.property.elem
+
+## <meta property=foo content=bar> in body ("name" attribute disallowed)
+ meta.property-no-name.elem =
+ element meta { meta.inner & meta.property-no-name.attrs }
+ meta.property-no-name.attrs =
+ ( common.attrs.basic
+ & common.attrs.i18n
+ & common.attrs.present
+ & common.attrs.other
+ & common.attrs.rdfa.property
+ & meta.name.attrs.content
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ common.elem.phrasing |= meta.property-no-name.elem
+
+meta.property.attrs &= common.attrs.rdfa.no-content-noproperty
+meta.property-no-name.attrs &= common.attrs.rdfa.no-content-noproperty
+meta.name.attrs &= common.attrs.rdfa.no-content-noproperty
diff --git a/revision.rnc b/revision.rnc
new file mode 100644
index 0000000..a357bd4
--- /dev/null
+++ b/revision.rnc
@@ -0,0 +1,54 @@
+# #####################################################################
+## RELAX NG Schema for HTML 5: Revision Annotations #
+# #####################################################################
+
+## Common Attributes
+
+ edit.attrs.cite =
+ attribute cite {
+ common.data.uri
+ }
+ edit.attrs.datetime =
+ attribute datetime {
+ common.data.datetime | common.data.date
+ }
+
+## Inserts: <ins>
+
+ ins.elem.flow =
+ element ins { ins.inner.flow & ins.attrs }
+ ins.elem.phrasing =
+ element ins { ins.inner.phrasing & ins.attrs }
+ ins.attrs =
+ ( common.attrs
+ & edit.attrs.cite?
+ & edit.attrs.datetime?
+ & common.attrs.aria?
+ )
+ ins.inner.flow =
+ ( common.inner.transparent.flow )
+ ins.inner.phrasing =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= ins.elem.flow
+ common.elem.phrasing |= ins.elem.phrasing
+
+## Deletions: <del>
+
+ del.elem.flow =
+ element del { del.inner.flow & del.attrs }
+ del.elem.phrasing =
+ element del { del.inner.phrasing & del.attrs }
+ del.attrs =
+ ( common.attrs
+ & edit.attrs.cite?
+ & edit.attrs.datetime?
+ & common.attrs.aria?
+ )
+ del.inner.flow =
+ ( common.inner.transparent.flow )
+ del.inner.phrasing =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= del.elem.flow
+ common.elem.phrasing |= del.elem.phrasing
diff --git a/ruby.rnc b/ruby.rnc
new file mode 100644
index 0000000..cd95ff8
--- /dev/null
+++ b/ruby.rnc
@@ -0,0 +1,51 @@
+datatypes w = "http://whattf.org/datatype-draft"
+namespace local = ""
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Ruby #
+# #####################################################################
+
+#######################################################################
+
+## Ruby Annotation: <ruby>
+
+ ruby.elem =
+ element ruby { ruby.inner & ruby.attrs }
+ ruby.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ ruby.inner =
+ ( ( common.inner.phrasing
+ , ( rt.elem
+ | ( rp.elem
+ , rt.elem
+ , rp.elem
+ )
+ )
+ )+
+ )
+
+ common.elem.phrasing |= ruby.elem
+
+## Ruby Text: <rt>
+
+ rt.elem =
+ element rt { rt.inner & rt.attrs }
+ rt.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ rt.inner =
+ ( common.inner.phrasing )
+
+## Ruby Parenthesis: <rp>
+
+ rp.elem =
+ element rp { rp.inner & rp.attrs }
+ rp.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ rp.inner =
+ ( common.inner.phrasing )
diff --git a/sectional.rnc b/sectional.rnc
new file mode 100644
index 0000000..afbac8f
--- /dev/null
+++ b/sectional.rnc
@@ -0,0 +1,172 @@
+# #####################################################################
+## RELAX NG Schema for HTML 5: Sectioning Markup #
+# #####################################################################
+
+# #####################################################################
+## Headings
+
+## Heading (Rank 1): <h1>
+
+ h1.elem =
+ element h1 { h1.inner & h1.attrs }
+ h1.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.heading
+ | common.attrs.aria.role.heading
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ h1.inner =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= h1.elem
+
+## Heading (Rank 2): <h2>
+
+ h2.elem =
+ element h2 { h2.inner & h2.attrs }
+ h2.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.heading
+ | common.attrs.aria.role.heading
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ h2.inner =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= h2.elem
+
+## Heading (Rank 3): <h3>
+
+ h3.elem =
+ element h3 { h3.inner & h3.attrs }
+ h3.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.heading
+ | common.attrs.aria.role.heading
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ h3.inner =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= h3.elem
+
+## Heading (Rank 4): <h4>
+
+ h4.elem =
+ element h4 { h4.inner & h4.attrs }
+ h4.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.heading
+ | common.attrs.aria.role.heading
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ h4.inner =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= h4.elem
+
+## Heading (Rank 5): <h5>
+
+ h5.elem =
+ element h5 { h5.inner & h5.attrs }
+ h5.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.heading
+ | common.attrs.aria.role.heading
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ h5.inner =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= h5.elem
+
+## Heading (Rank 6): <h6>
+
+ h6.elem =
+ element h6 { h6.inner & h6.attrs }
+ h6.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.heading
+ | common.attrs.aria.role.heading
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ h6.inner =
+ ( common.inner.phrasing )
+
+ common.elem.flow |= h6.elem
+
+## Heading Group: <hgroup>
+
+ hgroup.elem =
+ element hgroup { hgroup.inner & hgroup.attrs } & nonW3C
+ hgroup.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.heading
+ | common.attrs.aria.role.heading
+ | common.attrs.aria.role.tab
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ hgroup.inner =
+ ( ( h1.elem
+ | h2.elem
+ | h3.elem
+ | h4.elem
+ | h5.elem
+ | h6.elem
+ )
+ & common.elem.script-supporting*
+ )+
+
+ common.elem.flow |= hgroup.elem
+
+# #####################################################################
+## Section Meta
+
+## Contact Info: <address>
+
+ address.elem =
+ element address { address.inner & address.attrs }
+ address.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.contentinfo
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ address.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= address.elem
+
+# #####################################################################
+## Quotations
+
+## Block Quotes: <blockquote>
+
+ blockquote.elem =
+ element blockquote { blockquote.inner & blockquote.attrs }
+ blockquote.attrs =
+ ( common.attrs
+ & blockquote.attrs.cite?
+ & common.attrs.aria?
+ )
+ blockquote.attrs.cite =
+ attribute cite {
+ common.data.uri
+ }
+ blockquote.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= blockquote.elem
diff --git a/structural.rnc b/structural.rnc
new file mode 100644
index 0000000..9e72b5f
--- /dev/null
+++ b/structural.rnc
@@ -0,0 +1,135 @@
+# #####################################################################
+## RELAX NG Schema for HTML 5: Block Markup Added in HTML5 #
+# #####################################################################
+
+## Section: <section>
+
+ section.elem =
+ element section { section.inner & section.attrs }
+ section.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.region
+ | common.attrs.aria.role.alert
+ | common.attrs.aria.role.alertdialog
+ | common.attrs.aria.role.contentinfo
+ | common.attrs.aria.role.dialog
+ | common.attrs.aria.role.log
+ | common.attrs.aria.role.marquee
+ | common.attrs.aria.role.region
+ | common.attrs.aria.role.status
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.landmark.application
+ | common.attrs.aria.landmark.document
+ | common.attrs.aria.landmark.main
+ | common.attrs.aria.landmark.search
+ )?
+ )
+ section.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= section.elem
+
+## Navigational Links: <nav>
+
+ nav.elem =
+ element nav { nav.inner & nav.attrs }
+ nav.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.navigation
+ | common.attrs.aria.landmark.navigation
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ nav.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= nav.elem
+
+## Article: <article>
+
+ article.elem =
+ element article { article.inner & article.attrs }
+ article.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.article
+ | common.attrs.aria.landmark.article
+ | common.attrs.aria.landmark.document
+ | common.attrs.aria.landmark.application
+ | common.attrs.aria.landmark.main
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ article.inner =
+ ( style.elem*
+ , common.inner.flow
+ )
+
+ common.elem.flow |= article.elem
+
+## Tangential Aside: <aside>
+
+ aside.elem =
+ element aside { aside.inner & aside.attrs }
+ aside.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.complementary
+ | common.attrs.aria.landmark.note
+ | common.attrs.aria.landmark.complementary
+ | common.attrs.aria.landmark.search
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ aside.inner =
+ ( style.elem*
+ , common.inner.flow
+ )
+
+ common.elem.flow |= aside.elem
+
+## Header: <header>
+
+ header.elem =
+ element header { header.inner & header.attrs }
+ header.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.banner
+ | common.attrs.aria.landmark.banner
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ header.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= header.elem
+
+## Footer: <footer>
+
+ footer.elem =
+ element footer { footer.inner & footer.attrs }
+ footer.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.contentinfo
+ | common.attrs.aria.landmark.contentinfo
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ footer.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= footer.elem
+
+## main content: <main>
+
+ main.elem =
+ element main { main.inner & main.attrs }
+ main.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.main
+ | common.attrs.aria.landmark.main
+ )?
+ )
+ main.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= main.elem
diff --git a/tables.rnc b/tables.rnc
new file mode 100644
index 0000000..b6021da
--- /dev/null
+++ b/tables.rnc
@@ -0,0 +1,244 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Tables #
+# #####################################################################
+
+# #####################################################################
+## Table Envelope
+
+## Table Datatypes
+
+# tables.data.multilen =
+# ( common.data.integer.positive
+# | common.data.percent
+# | xsd:token { pattern = "[0-9]+\*" } #REVISIT should this
one be string?
+# )
+
+## Table Alignment Attributes
+
+ tables.attrs.alignment =
+ ( tables.attrs.align?
+ & tables.attrs.char?
+ & tables.attrs.valign?
+ )
+ tables.attrs.align =
+ attribute align {
+ ( w:string "left"
+ | w:string "center"
+ | w:string "right"
+ | w:string "justify"
+ | w:string "char"
+ )
+ }
+ tables.attrs.char =
+ attribute char {
+ xsd:string { pattern = "." }
+ }
+ tables.attrs.valign =
+ attribute valign {
+ ( w:string "top"
+ | w:string "middle"
+ | w:string "bottom"
+ | w:string "baseline"
+ )
+ }
+
+## Data Table: <table>
+
+ table.elem =
+ element table { table.inner & table.attrs }
+ table.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ table.inner =
+ ( caption.elem?
+ , common.elem.script-supporting*
+ , colgroup.elem*
+ , common.elem.script-supporting*
+ , thead.elem?
+ , common.elem.script-supporting*
+ , ( ( tfoot.elem
+ , common.elem.script-supporting*
+ , ( tbody.elem* | tr.elem+ )
+ , common.elem.script-supporting*
+ )
+ | ( ( tbody.elem* | tr.elem+ )
+ , common.elem.script-supporting*
+ , tfoot.elem?
+ )
+ )
+ )
+
+ common.elem.flow |= table.elem
+
+## Table Caption: <caption>
+
+ caption.elem =
+ element caption { caption.inner & caption.attrs }
+ caption.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ caption.inner =
+ ( common.inner.flow )
+
+# #####################################################################
+## Table Super Structure
+
+## Table Column Group: <colgroup>
+
+ colgroup.elem =
+ element colgroup { colgroup.inner & colgroup.attrs }
+ colgroup.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ colgroup.attrs.span =
+ attribute span {
+ common.data.integer.positive
+ }
+ colgroup.inner =
+ ( ( col.elem*
+ & common.elem.script-supporting*
+ )
+ | colgroup.attrs.span?
+ )
+
+## Table Column: <col>
+
+ col.elem =
+ element col { col.inner & col.attrs }
+ col.attrs =
+ ( common.attrs
+ & col.attrs.span?
+ & common.attrs.aria?
+ )
+ col.attrs.span =
+ attribute span {
+ common.data.integer.positive
+ }
+ col.inner =
+ ( empty )
+
+## Table Header Row Group
+
+ thead.elem =
+ element thead { thead.inner & thead.attrs }
+ thead.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ thead.inner =
+ ( tr.elem*
+ & common.elem.script-supporting*
+ )
+
+## Table Footer Row Group
+
+ tfoot.elem =
+ element tfoot { tfoot.inner & tfoot.attrs }
+ tfoot.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ tfoot.inner =
+ ( tr.elem*
+ & common.elem.script-supporting*
+ )
+
+## Table Row Group
+
+ tbody.elem =
+ element tbody { tbody.inner & tbody.attrs }
+ tbody.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ tbody.inner =
+ ( tr.elem*
+ & common.elem.script-supporting*
+ )
+
+# #####################################################################
+## Cell Structure
+
+## Table Row
+
+ tr.elem =
+ element tr { tr.inner & tr.attrs }
+ tr.attrs =
+ ( common.attrs
+ & common.attrs.aria?
+ )
+ tr.inner =
+ ( ( td.elem | th.elem | common.elem.script-supporting )* )
+
+## Common Table Cell Attributes
+
+ tables.attrs.cell-structure =
+ ( tables.attrs.colspan?
+ & tables.attrs.rowspan?
+ )
+ tables.attrs.colspan =
+ attribute colspan {
+ common.data.integer.positive
+ }
+ tables.attrs.rowspan =
+ attribute rowspan {
+ common.data.integer.non-negative
+ }
+
+ tables.attrs.access-headers =
+ ( tables.attrs.headers? )
+ tables.attrs.headers =
+ attribute headers {
+ common.data.idrefs
+ }
+
+ tables.attrs.define-headers =
+ ( tables.attrs.scope? )
+ tables.attrs.scope =
+ attribute scope {
+ ( w:string "row"
+ | w:string "col"
+ | w:string "rowgroup"
+ | w:string "colgroup"
+ )
+ }
+ tables.attrs.abbr =
+ attribute abbr {
+ text
+ }
+
+## Table Data Cell: <td>
+
+ td.elem =
+ element td { td.inner & td.attrs }
+ td.attrs =
+ ( common.attrs
+ & tables.attrs.cell-structure
+ & tables.attrs.headers?
+# & tables.attrs.alignment
+ & common.attrs.aria?
+ )
+ td.inner =
+ ( common.inner.flow )
+
+## Table Header Cells: <th>
+
+ th.elem =
+ element th { th.inner & th.attrs }
+ th.attrs =
+ ( common.attrs
+ & tables.attrs.cell-structure
+ & tables.attrs.scope?
+ & tables.attrs.headers?
+# & tables.attrs.alignment
+ & ( common.attrs.aria?
+ | common.attrs.aria.implicit.column-or-row-header
+ )
+ )
+ th.inner =
+ ( common.inner.flow )
diff --git a/web-components.rnc b/web-components.rnc
new file mode 100644
index 0000000..bf45715
--- /dev/null
+++ b/web-components.rnc
@@ -0,0 +1,43 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Web Components
+# #####################################################################
+
+## Templates: <template>
+
+ template.elem =
+ element template { template.inner & template.attrs }
+ template.attrs =
+ ( common.attrs )
+ template.inner =
+ ( common.inner.metadata
+ | common.inner.flow
+ | ol.inner
+ | ul.inner
+ | dl.inner
+ | figure.inner
+ | ruby.inner
+ | object.inner.flow
+ | object.inner.phrasing
+ | video.inner.flow
+ | video.inner.phrasing
+ | audio.inner.flow
+ | audio.inner.phrasing
+ | table.inner
+ | colgroup.inner
+ | thead.inner
+ | tbody.inner
+ | tfoot.inner
+ | tr.inner
+ | fieldset.inner
+ | select.inner
+ | details.inner
+ | menu.popup.inner
+ )
+ common.elem.metadata |= template.elem
+ common.elem.phrasing |= template.elem
+ common.elem.script-supporting |= template.elem
+
+# also allow <script> wherever <template> is allowed
+ common.elem.script-supporting |= script.elem
diff --git a/web-forms-scripting.rnc b/web-forms-scripting.rnc
new file mode 100644
index 0000000..63fe1c4
--- /dev/null
+++ b/web-forms-scripting.rnc
@@ -0,0 +1,27 @@
+# #####################################################################
+## RELAX NG Schema for HTML 5: Web Forms 1.0 Scripting #
+# #####################################################################
+
+ scripting.attr.form.select =
+ attribute onselect { string }
+ scripting.attr.form.change =
+ attribute onchange { string }
+
+# input.text.attrs &=
+# ( scripting.attr.form.select?
+# )
+
+# shared-form.attrs &=
+# ( scripting.attr.form.change?
+# )
+
+# form.attrs &=
+# ( scripting.attr.form.reset?
+# & scripting.attr.form.submit?
+# )
+ scripting.attr.form.submit =
+ attribute onsubmit { string }
+ scripting.attr.form.reset =
+ attribute onreset { string }
+
+
diff --git a/web-forms.rnc b/web-forms.rnc
new file mode 100644
index 0000000..f786a1b
--- /dev/null
+++ b/web-forms.rnc
@@ -0,0 +1,604 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Web Forms 1.0 markup #
+# #####################################################################
+
+## Shared attributes for form controls
+
+ common-form.attrs =
+ ( common-form.attrs.name?
+ & common-form.attrs.disabled?
+ )
+
+ common-form.attrs.name =
+ attribute name {
+ string #REVISIT should this be restricted somehow? No &
and = perhaps?
+ }
+
+ common-form.attrs.disabled =
+ attribute disabled {
+ w:string "disabled" | w:string ""
+ }
+
+ shared-form.attrs.readonly =
+ attribute readonly {
+ w:string "readonly" | w:string ""
+ }
+
+ shared-form.attrs.maxlength =
+ attribute maxlength {
+ common.data.integer.non-negative
+ }
+
+ shared-form.attrs.size =
+ attribute size {
+ common.data.integer.positive
+ }
+
+ # REVISIT tabindex goes in common.attrs
+
+## Shared attributes for <input>
+
+ input.attrs.checked =
+ attribute checked {
+ w:string "checked" | w:string ""
+ }
+
+## Text Field: <input type='text'>
+
+ input.text.elem =
+ element input { input.text.attrs }
+ input.text.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.text.attrs.type?
+ & shared-form.attrs.maxlength?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.size?
+ & input.text.attrs.value?
+ & ( common.attrs.aria.implicit.textbox
+ | common.attrs.aria.implicit.combobox
+ | common.attrs.aria.role.textbox
+ | common.attrs.aria.role.combobox
+ )?
+ )
+ input.text.attrs.type =
+ attribute type {
+ w:string "text"
+ }
+ input.text.attrs.value =
+ attribute value {
+ form.data.stringwithoutlinebreaks
+ }
+
+ input.elem = input.text.elem
+
+## Password Field: <input type='password'>
+
+ input.password.elem =
+ element input { input.password.attrs }
+ input.password.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.password.attrs.type
+ & shared-form.attrs.maxlength?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.size?
+ & input.password.attrs.value?
+ & ( common.attrs.aria.implicit.textbox
+ | common.attrs.aria.role.textbox
+ )?
+ )
+ input.password.attrs.type =
+ attribute type {
+ w:string "password"
+ }
+ input.password.attrs.value =
+ attribute value {
+ form.data.stringwithoutlinebreaks
+ }
+
+ input.elem |= input.password.elem
+
+## Checkbox: <input type='checkbox'>
+
+ input.checkbox.elem =
+ element input { input.checkbox.attrs }
+ input.checkbox.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.checkbox.attrs.type
+ & input.attrs.checked?
+ & input.checkbox.attrs.value?
+ & ( common.attrs.aria.implicit.checkbox
+ | common.attrs.aria.role.checkbox
+ | common.attrs.aria.role.menuitemcheckbox
+ )?
+ )
+ input.checkbox.attrs.type =
+ attribute type {
+ w:string "checkbox"
+ }
+ input.checkbox.attrs.value =
+ attribute value {
+ string #REVISIT require non-empty value?
+ }
+
+ input.elem |= input.checkbox.elem
+
+## Radiobutton: <input type='radio'>
+
+ input.radio.elem =
+ element input { input.radio.attrs }
+ input.radio.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.radio.attrs.type
+ & input.attrs.checked?
+ & input.radio.attrs.value?
+ & ( common.attrs.aria.implicit.radio
+ | common.attrs.aria.role.radio
+ | common.attrs.aria.role.menuitemradio
+ )?
+ )
+ input.radio.attrs.type =
+ attribute type {
+ w:string "radio"
+ }
+ input.radio.attrs.value =
+ attribute value {
+ string #REVISIT require non-empty value?
+ }
+
+ input.elem |= input.radio.elem
+
+## Scripting Hook Button: <input type='button'>
+
+ input.button.elem =
+ element input { input.button.attrs }
+ input.button.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.button.attrs.type
+ & input.button.attrs.value?
+ & ( common.attrs.aria.implicit.button
+ | common.attrs.aria.role.button
+ | common.attrs.aria.role.link
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.radio
+ )?
+ )
+ input.button.attrs.type =
+ attribute type {
+ w:string "button"
+ }
+ input.button.attrs.value =
+ attribute value {
+ string #REVISIT require non-empty value?
+ }
+
+ input.elem |= input.button.elem
+ #REVISIT should this be enabled by a scripting module only?
+
+## Submit Button: <input type='submit'>
+
+ input.submit.elem =
+ element input { input.submit.attrs }
+ input.submit.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.submit.attrs.type
+ & input.submit.attrs.value?
+ & ( common.attrs.aria.implicit.button
+ | common.attrs.aria.role.button
+ )?
+ )
+ input.submit.attrs.type =
+ attribute type {
+ w:string "submit"
+ }
+ input.submit.attrs.value =
+ attribute value {
+ string #REVISIT require non-empty value?
+ }
+
+ input.elem |= input.submit.elem
+
+## Reset Button: <input type='reset'>
+
+ input.reset.elem =
+ element input { input.reset.attrs }
+ input.reset.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.reset.attrs.type
+ & input.reset.attrs.value?
+ & ( common.attrs.aria.implicit.button
+ | common.attrs.aria.role.button
+ )?
+ )
+ input.reset.attrs.type =
+ attribute type {
+ w:string "reset"
+ }
+ input.reset.attrs.value =
+ attribute value {
+ string #REVISIT require non-empty value?
+ }
+
+ input.elem |= input.reset.elem
+ # REVISIT does reset make sense outside a form?
+
+## File Upload: <input type='file'>
+
+ input.file.elem =
+ element input { input.file.attrs }
+ input.file.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.file.attrs.type
+ & input.file.attrs.accept?
+ & common.attrs.aria?
+ )
+ input.file.attrs.type =
+ attribute type {
+ w:string "file"
+ }
+ input.file.attrs.accept =
+ attribute accept {
+ form.data.mimetypelist
+ }
+
+ input.elem |= input.file.elem
+
+## Hidden String: <input type='hidden'>
+
+ input.hidden.elem =
+ element input { input.hidden.attrs }
+ input.hidden.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.hidden.attrs.type
+ & input.hidden.attrs.value?
+ & common.attrs.aria?
+ )
+ input.hidden.attrs.type =
+ attribute type {
+ w:string "hidden"
+ }
+ input.hidden.attrs.value =
+ attribute value {
+ string
+ }
+
+ input.elem |= input.hidden.elem
+
+## Image Submit Button: <input type='image'>
+
+ input.image.elem =
+ element input { input.image.attrs }
+ input.image.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.image.attrs.type
+ & input.image.attrs.alt
+ & input.image.attrs.src?
+ & ( common.attrs.aria.implicit.button
+ | common.attrs.aria.role.button
+ | common.attrs.aria.role.link
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.radio
+ )?
+ )
+ input.image.attrs.type =
+ attribute type {
+ w:string "image"
+ }
+ input.image.attrs.alt =
+ attribute alt {
+ form.data.nonemptystring
+ }
+ input.image.attrs.src =
+ attribute src {
+ common.data.uri.non-empty
+ }
+
+ input.elem |= input.image.elem
+
+ common.elem.phrasing |= input.elem
+
+## Text Area: <textarea>
+
+ textarea.elem =
+ element textarea { textarea.inner & textarea.attrs }
+ textarea.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & shared-form.attrs.readonly?
+ & textarea.attrs.rows-and-cols-wf1
+ & ( common.attrs.aria.implicit.textbox
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.textbox
+ )?
+ #FIXME onfocus, onblur, onselect,onchange
+ )
+ # This is ugly.
+ textarea.attrs.rows-and-cols-wf1 =
+ textarea.attrs.rows-and-cols-wf1.inner
+ textarea.attrs.rows-and-cols-wf1.inner =
+ ( textarea.attrs.cols
+ & textarea.attrs.rows
+ )
+ textarea.attrs.cols =
+ attribute cols {
+ common.data.integer.positive
+ }
+ textarea.attrs.rows =
+ attribute rows {
+ common.data.integer.positive
+ }
+ textarea.inner =
+ ( text )
+
+ common.elem.phrasing |= textarea.elem
+
+# Due to limitations with interleave, handling single/multiple selection
+# enforcement in RELAX NG seems to be possible but really awkward.
+# Tried it. Leaving it to Schematron.
+
+## Select menu option: <option selected>
+
+ option.elem =
+ element option { option.inner & option.attrs }
+ option.attrs =
+ ( common.attrs
+ & common-form.attrs.disabled?
+ & option.attrs.selected?
+ & option.attrs.label?
+ & option.attrs.value?
+ & ( common.attrs.aria.implicit.option
+ | common.attrs.aria.role.option
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.presentation
+ )?
+ )
+ option.attrs.selected =
+ attribute selected {
+ w:string "selected" | w:string ""
+ }
+ option.attrs.label =
+ attribute label {
+ form.data.nonemptystring
+ }
+ option.attrs.value =
+ attribute value {
+ string
+ }
+ option.inner =
+ ( text )
+
+## Option Group: <optgroup>
+
+ optgroup.elem =
+ element optgroup { optgroup.inner & optgroup.attrs }
+ optgroup.attrs =
+ ( common.attrs
+ & optgroup.attrs.label
+ & common-form.attrs.disabled?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ optgroup.attrs.label =
+ attribute label {
+ string
+ }
+ optgroup.inner =
+ ( option.elem*
+ & common.elem.script-supporting*
+ )
+
+## Selection Menu: <select>
+
+ select.elem =
+ element select { select.inner & select.attrs }
+ select.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & select.attrs.size?
+ & select.attrs.multiple?
+ # FIXME onfocus, onblur, onchange
+ & ( common.attrs.aria.implicit.listbox
+ | common.attrs.aria.role.listbox #
aria-multiselectable depends on "multiple" value; check in assertions
+ | common.attrs.aria.role.menu
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ select.attrs.size =
+ attribute size {
+ common.data.integer.positive
+ }
+ select.attrs.multiple =
+ attribute multiple {
+ w:string "multiple" | w:string ""
+ }
+ select.inner =
+ ( optgroup.elem*
+ & option.elem*
+ & common.elem.script-supporting*
+ )
+
+ common.elem.phrasing |= select.elem
+
+## Shared Definitions for Complex Button
+
+ button.attrs.value =
+ attribute value {
+ string
+ }
+ button.inner =
+ ( common.inner.phrasing )
+
+## Complex Submit Button: <button type='submit'>
+
+ button.submit.elem =
+ element button { button.inner & button.submit.attrs }
+ button.submit.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & button.submit.attrs.type?
+ & button.attrs.value?
+ & ( common.attrs.aria.implicit.button
+ | common.attrs.aria.role.button
+ | common.attrs.aria.role.link
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.radio
+ )?
+ )
+ button.submit.attrs.type =
+ attribute type {
+ w:string "submit"
+ }
+
+ button.elem = button.submit.elem
+
+## Complex Reset Button: <button type='reset'>
+
+ button.reset.elem =
+ element button { button.inner & button.reset.attrs }
+ button.reset.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & button.reset.attrs.type
+ & button.attrs.value? #REVISIT I guess this still affects
the DOM
+ & ( common.attrs.aria.implicit.button
+ | common.attrs.aria.role.button
+ | common.attrs.aria.role.link
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.radio
+ )?
+ )
+ button.reset.attrs.type =
+ attribute type {
+ w:string "reset"
+ }
+
+ button.elem |= button.reset.elem
+
+## Complex Push Button: <button type='button'>
+
+ button.button.elem =
+ element button { button.inner & button.button.attrs }
+ button.button.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & button.button.attrs.type
+ & button.attrs.value? #REVISIT I guess this still affects
the DOM
+ & ( common.attrs.aria.implicit.button
+ | common.attrs.aria.role.button
+ | common.attrs.aria.role.link
+ | common.attrs.aria.role.menuitem
+ | common.attrs.aria.role.menuitemcheckbox
+ | common.attrs.aria.role.menuitemradio
+ | common.attrs.aria.role.radio
+ )?
+ )
+ button.button.attrs.type =
+ attribute type {
+ w:string "button"
+ }
+
+ button.elem |= button.button.elem
+
+ common.elem.phrasing |= button.elem
+
+## Form: <form>
+
+ form.elem =
+ element form { form.inner & form.attrs }
+ form.attrs =
+ ( common.attrs
+ & form.attrs.action? #REVISIT Should this be required
anyway?
+ & form.attrs.method?
+ & form.attrs.enctype?
+ & common-form.attrs.name?
+ & form.attrs.accept-charset?
+ & common.attrs.aria?
+ )
+ form.attrs.action =
+ attribute action {
+ common.data.uri.non-empty
+ }
+ form.attrs.method =
+ attribute method {
+ form.attrs.method.data
+ }
+ form.attrs.method.data =
+ ( w:string "get" | w:string "post" )
+ form.attrs.enctype =
+ attribute enctype {
+ form.attrs.enctype.data
+ }
+ form.attrs.enctype.data =
+ ( w:string
"application/x-www-form-urlencoded"
+ | w:string "multipart/form-data"
+ )
+ form.attrs.accept-charset =
+ attribute accept-charset {
+ form.data.charsetlist
+ }
+ form.inner =
+ ( common.inner.flow )
+
+ common.elem.flow |= form.elem
+
+## Fieldset: <fieldset>
+
+ fieldset.elem =
+ element fieldset { fieldset.inner & fieldset.attrs }
+ fieldset.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.implicit.group
+ | common.attrs.aria
+ )?
+ )
+ fieldset.inner =
+ ( legend.elem? #REVISIT should this be required?
+ , common.inner.flow
+ )
+
+ common.elem.flow |= fieldset.elem
+
+## Label: <label>
+
+ label.elem =
+ element label { label.inner & label.attrs }
+ label.attrs =
+ ( common.attrs
+ & label.attrs.for?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ label.attrs.for =
+ attribute for {
+ common.data.idref
+ }
+ label.inner =
+ ( common.inner.phrasing ) #REVISIT making obvious guess
+
+ common.elem.phrasing |= label.elem
+
diff --git a/web-forms2-scripting.rnc b/web-forms2-scripting.rnc
new file mode 100644
index 0000000..e0f6a38
--- /dev/null
+++ b/web-forms2-scripting.rnc
@@ -0,0 +1,9 @@
+# #####################################################################
+## RELAX NG Schema for HTML 5: Web Forms 2.0 Scripting #
+# #####################################################################
+
+# output.attrs &=
+# ( scripting.attr.form.formchange?
+# & scripting.attr.form.forminput?
+# & scripting.attr.form.change?
+# )
diff --git a/web-forms2.rnc b/web-forms2.rnc
new file mode 100644
index 0000000..e83c399
--- /dev/null
+++ b/web-forms2.rnc
@@ -0,0 +1,830 @@
+datatypes w = "http://whattf.org/datatype-draft"
+
+# #####################################################################
+## RELAX NG Schema for HTML 5: Web Forms 2.0 markup #
+# #####################################################################
+
+## Shared attributes for form controls
+
+ common-form.attrs &=
+ ( common-form.attrs.form? )
+
+ common-form.attrs.form |=
+ attribute form {
+ common.data.idref
+ }
+
+ shared-form.attrs.formaction =
+ attribute formaction {
+ common.data.uri.non-empty
+ }
+
+ shared-form.attrs.formenctype =
+ attribute formenctype {
+ shared-form.attrs.formenctype.data
+ }
+ shared-form.attrs.formenctype.data =
+ ( w:string "application/x-www-form-urlencoded"
+ | w:string "multipart/form-data"
+ | w:string "text/plain"
+ )
+
+ shared-form.attrs.formmethod =
+ attribute formmethod {
+ shared-form.attrs.formmethod.data
+ }
+ shared-form.attrs.formmethod.data =
+ ( w:string "get"
+ | w:string "post"
+ )
+
+ shared-form.attrs.formtarget =
+ attribute formtarget {
+ common.data.browsing-context-or-keyword
+ }
+
+ shared-form.attrs.formnovalidate =
+ attribute formnovalidate {
+ w:string "formnovalidate" | w:string ""
+ }
+
+ shared-form.attrs.autofocus =
+ attribute autofocus {
+ w:string "autofocus" | w:string ""
+ }
+
+ shared-form.attrs.pattern =
+ attribute pattern {
+ form.data.pattern
+ }
+
+ shared-form.attrs.template =
+ attribute template {
+ common.data.idref
+ }
+
+ shared-form.attrs.required =
+ attribute required {
+ w:string "required" | w:string ""
+ }
+
+ shared-form.attrs.placeholder =
+ attribute placeholder {
+ form.data.stringwithoutlinebreaks
+ }
+
+ shared-form.attrs.dirname =
+ attribute dirname {
+ form.data.nonemptystring
+ }
+
+## Shared attributes for <input>
+
+ input.attrs.autocomplete =
+ attribute autocomplete {
+ w:string "on" | w:string "off"
+ }
+
+ input.attrs.list =
+ attribute list {
+ common.data.idref
+ }
+
+ input.attrs.step.float =
+ attribute step {
+ w:string "any" | common.data.float.positive
+ }
+
+ input.attrs.step.integer =
+ attribute step {
+ w:string "any" | common.data.integer.positive
+ }
+
+ input.attrs.multiple =
+ attribute multiple {
+ w:string "multiple" | w:string ""
+ }
+
+## Text Field: <input type='text'>, Extensions
+
+ input.text.attrs &=
+ ( input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & shared-form.attrs.pattern?
+ & shared-form.attrs.required?
+ & shared-form.attrs.placeholder?
+ & shared-form.attrs.dirname?
+ )
+
+## Password Field: <input type='password'>, Extensions
+
+ input.password.attrs &=
+ ( input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & shared-form.attrs.pattern?
+ & shared-form.attrs.required?
+ & shared-form.attrs.placeholder?
+ )
+
+## Checkbox <input type='checkbox'>, Extensions
+
+ input.checkbox.attrs &=
+ ( shared-form.attrs.autofocus?
+ & shared-form.attrs.required?
+ )
+
+## Radiobutton: <input type='radio'>, Extensions
+
+ input.radio.attrs &=
+ ( shared-form.attrs.autofocus?
+ & shared-form.attrs.required?
+ )
+
+## Scripting Hook Button: <input type='button'>, Extensions
+
+ input.button.attrs &=
+ ( shared-form.attrs.autofocus? )
+
+## Submit Button: <input type='submit'>, Extensions
+
+ input.submit.attrs &=
+ ( shared-form.attrs.formaction?
+ & shared-form.attrs.autofocus?
+ & shared-form.attrs.formenctype?
+ & shared-form.attrs.formmethod?
+ & shared-form.attrs.formtarget?
+ & shared-form.attrs.formnovalidate?
+ )
+
+## Reset Button: <input type='reset'>, Extensions
+
+ input.reset.attrs &=
+ ( shared-form.attrs.autofocus? )
+
+## File Upload: <input type='file'>, Extensions
+
+ input.file.attrs &=
+ ( shared-form.attrs.autofocus?
+ & shared-form.attrs.required?
+ & input.attrs.multiple?
+ )
+
+## Image Submit Button: <input type='image'>, Extensions
+
+ input.image.attrs &=
+ ( shared-form.attrs.formaction?
+ & shared-form.attrs.autofocus?
+ & shared-form.attrs.formenctype?
+ & shared-form.attrs.formmethod?
+ & shared-form.attrs.formtarget?
+ & shared-form.attrs.formnovalidate?
+ & input.image.attrs.height?
+ & input.image.attrs.width?
+ )
+ input.image.attrs.height =
+ attribute height {
+ common.data.integer.non-negative
+ }
+ input.image.attrs.width =
+ attribute width {
+ common.data.integer.non-negative
+ }
+
+## Global Date and Time: <input type='datetime'>
+
+ input.datetime.elem =
+ element input { input.datetime.attrs }
+ input.datetime.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.datetime.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.datetime.attrs.min?
+ & input.datetime.attrs.max?
+ & input.attrs.step.float?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & input.datetime.attrs.value?
+ & common.attrs.aria?
+ )
+ input.datetime.attrs.type =
+ attribute type {
+ w:string "datetime"
+ }
+ input.datetime.attrs.min =
+ attribute min {
+ common.data.datetime
+ }
+ input.datetime.attrs.max =
+ attribute max {
+ common.data.datetime
+ }
+ input.datetime.attrs.value =
+ attribute value {
+ w:string "" | common.data.datetime
+ }
+
+ input.elem |= input.datetime.elem
+
+## Date and Time with No Time Zone Information: <input type='datetime-local'>
+
+ input.datetime-local.elem =
+ element input { input.datetime-local.attrs }
+ input.datetime-local.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.datetime-local.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.datetime-local.attrs.min?
+ & input.datetime-local.attrs.max?
+ & input.attrs.step.float?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & input.datetime-local.attrs.value?
+ & common.attrs.aria?
+ )
+ input.datetime-local.attrs.type =
+ attribute type {
+ w:string "datetime-local"
+ }
+ input.datetime-local.attrs.min =
+ attribute min {
+ form.data.datetime-local
+ }
+ input.datetime-local.attrs.max =
+ attribute max {
+ form.data.datetime-local
+ }
+ input.datetime-local.attrs.value =
+ attribute value {
+ w:string "" | form.data.datetime-local
+ }
+
+ input.elem |= input.datetime-local.elem
+
+## Date: <input type='date'>
+
+ input.date.elem =
+ element input { input.date.attrs }
+ input.date.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.date.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.date.attrs.min?
+ & input.date.attrs.max?
+ & input.attrs.step.integer?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & input.date.attrs.value?
+ & common.attrs.aria?
+ )
+ input.date.attrs.type =
+ attribute type {
+ w:string "date"
+ }
+ input.date.attrs.min =
+ attribute min {
+ form.data.date
+ }
+ input.date.attrs.max =
+ attribute max {
+ form.data.date
+ }
+ input.date.attrs.value =
+ attribute value {
+ w:string "" | form.data.date
+ }
+
+ input.elem |= input.date.elem
+
+## Year and Month: <input type='month'>
+
+ input.month.elem =
+ element input { input.month.attrs }
+ input.month.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.month.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.month.attrs.min?
+ & input.month.attrs.max?
+ & input.attrs.step.integer?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & input.month.attrs.value?
+ & common.attrs.aria?
+ )
+ input.month.attrs.type =
+ attribute type {
+ w:string "month"
+ }
+ input.month.attrs.min =
+ attribute min {
+ form.data.month
+ }
+ input.month.attrs.max =
+ attribute max {
+ form.data.month
+ }
+ input.month.attrs.value =
+ attribute value {
+ w:string "" | form.data.month
+ }
+
+ input.elem |= input.month.elem
+
+## Time without Time Zone Information: <input type='time'>
+
+ input.time.elem =
+ element input { input.time.attrs }
+ input.time.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.time.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.time.attrs.min?
+ & input.time.attrs.max?
+ & input.attrs.step.float?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & input.time.attrs.value?
+ & common.attrs.aria?
+ )
+ input.time.attrs.type =
+ attribute type {
+ w:string "time"
+ }
+ input.time.attrs.min =
+ attribute min {
+ form.data.time
+ }
+ input.time.attrs.max =
+ attribute max {
+ form.data.time
+ }
+ input.time.attrs.value =
+ attribute value {
+ w:string "" | form.data.time
+ }
+
+ input.elem |= input.time.elem
+
+## Year and Week: <input type='week'>
+
+ input.week.elem =
+ element input { input.week.attrs }
+ input.week.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.week.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.week.attrs.min?
+ & input.week.attrs.max?
+ & input.attrs.step.integer?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & input.week.attrs.value?
+ & common.attrs.aria?
+ )
+ input.week.attrs.type =
+ attribute type {
+ w:string "week"
+ }
+ input.week.attrs.min =
+ attribute min {
+ form.data.week
+ }
+ input.week.attrs.max =
+ attribute max {
+ form.data.week
+ }
+ input.week.attrs.value =
+ attribute value {
+ w:string "" | form.data.week
+ }
+
+ input.elem |= input.week.elem
+
+## Number: <input type='number'>
+
+ input.number.elem =
+ element input { input.number.attrs }
+ input.number.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.number.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.number.attrs.min?
+ & input.number.attrs.max?
+ & input.attrs.step.float?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & shared-form.attrs.placeholder?
+ & input.number.attrs.value?
+ & ( common.attrs.aria.implicit.spinbutton
+ | common.attrs.aria.role.spinbutton
+ )?
+ )
+ input.number.attrs.type =
+ attribute type {
+ w:string "number"
+ }
+ input.number.attrs.min =
+ attribute min {
+ common.data.float
+ }
+ input.number.attrs.max =
+ attribute max {
+ common.data.float
+ }
+ input.number.attrs.value =
+ attribute value {
+ w:string "" | common.data.float
+ }
+
+ input.elem |= input.number.elem
+
+## Imprecise Number: <input type='range'>
+
+ input.range.elem =
+ element input { input.range.attrs }
+ input.range.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.range.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.range.attrs.min?
+ & input.range.attrs.max?
+ & input.attrs.step.float?
+ & input.range.attrs.value?
+ & ( common.attrs.aria.implicit.slider
+ | common.attrs.aria.role.slider
+ )?
+ )
+ input.range.attrs.type =
+ attribute type {
+ w:string "range"
+ }
+ input.range.attrs.min =
+ attribute min {
+ common.data.float
+ }
+ input.range.attrs.max =
+ attribute max {
+ common.data.float
+ }
+ input.range.attrs.value =
+ attribute value {
+ common.data.float
+ }
+
+ input.elem |= input.range.elem
+
+## Email Address: <input type='email'>
+
+ input.email.elem =
+ element input { input.email.attrs }
+ input.email.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.email.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & shared-form.attrs.maxlength?
+ & shared-form.attrs.pattern?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & shared-form.attrs.size?
+ & shared-form.attrs.placeholder?
+ & ( ( input.attrs.multiple
+ & input.email.attrs.value.multiple?
+ )
+ | input.email.attrs.value.single?
+ )?
+ & ( common.attrs.aria.implicit.textbox
+ | common.attrs.aria.implicit.combobox
+ | common.attrs.aria.role.textbox
+ | common.attrs.aria.role.combobox
+ )?
+ )
+ input.email.attrs.type =
+ attribute type {
+ w:string "email"
+ }
+ input.email.attrs.value.single =
+ attribute value {
+ form.data.emailaddress
+ }
+ input.email.attrs.value.multiple =
+ attribute value {
+ form.data.emailaddresslist
+ }
+
+ input.elem |= input.email.elem
+
+## IRI: <input type='url'>
+
+ input.url.elem =
+ element input { input.url.attrs }
+ input.url.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.url.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & shared-form.attrs.maxlength?
+ & shared-form.attrs.pattern?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & shared-form.attrs.size?
+ & shared-form.attrs.placeholder?
+ & input.url.attrs.value?
+ & ( common.attrs.aria.implicit.textbox
+ | common.attrs.aria.implicit.combobox
+ | common.attrs.aria.role.textbox
+ | common.attrs.aria.role.combobox
+ )?
+ )
+ input.url.attrs.type =
+ attribute type {
+ w:string "url"
+ }
+ input.url.attrs.value =
+ attribute value {
+ w:string "" | common.data.uri.absolute
+ }
+
+ input.elem |= input.url.elem
+
+## Search: <input type='search'>
+
+ input.search.elem =
+ element input { input.search.attrs }
+ input.search.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.search.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & shared-form.attrs.maxlength?
+ & shared-form.attrs.pattern?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & shared-form.attrs.size?
+ & shared-form.attrs.placeholder?
+ & shared-form.attrs.dirname?
+ & input.search.attrs.value?
+ & ( common.attrs.aria.implicit.textbox
+ | common.attrs.aria.implicit.combobox
+ | common.attrs.aria.role.textbox
+ | common.attrs.aria.role.combobox
+ )?
+ )
+ input.search.attrs.type =
+ attribute type {
+ w:string "search"
+ }
+ input.search.attrs.value =
+ attribute value {
+ form.data.stringwithoutlinebreaks
+ }
+
+ input.elem |= input.search.elem
+
+## Telephone Number: <input type='tel'>
+
+ input.tel.elem =
+ element input { input.tel.attrs }
+ input.tel.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.tel.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & shared-form.attrs.maxlength?
+ & shared-form.attrs.pattern?
+ & shared-form.attrs.readonly?
+ & shared-form.attrs.required?
+ & shared-form.attrs.size?
+ & shared-form.attrs.placeholder?
+ & input.tel.attrs.value?
+ & ( common.attrs.aria.implicit.textbox
+ | common.attrs.aria.implicit.combobox
+ | common.attrs.aria.role.textbox
+ | common.attrs.aria.role.combobox
+ )?
+ )
+ input.tel.attrs.type =
+ attribute type {
+ w:string "tel"
+ }
+ input.tel.attrs.value =
+ attribute value {
+ form.data.stringwithoutlinebreaks
+ }
+
+ input.elem |= input.tel.elem
+
+## Color: <input type='color'>
+
+ input.color.elem =
+ element input { input.color.attrs }
+ input.color.attrs =
+ ( common.attrs
+ & common-form.attrs
+ & input.color.attrs.type
+ & input.attrs.autocomplete?
+ & shared-form.attrs.autofocus?
+ & input.attrs.list?
+ & input.color.attrs.value?
+ & common.attrs.aria?
+ )
+ input.color.attrs.type =
+ attribute type {
+ w:string "color"
+ }
+ input.color.attrs.value =
+ attribute value {
+ w:string "" | form.data.color
+ }
+
+ input.elem |= input.color.elem
+
+## Form Output: <output>
+
+ output.elem =
+ element output { output.inner & output.attrs }
+ output.attrs =
+ ( common.attrs
+ & common-form.attrs.name?
+ & common-form.attrs.form?
+ & output.attrs.for?
+ & ( common.attrs.aria.implicit.status
+ | common.attrs.aria
+ )?
+ )
+ output.attrs.for =
+ attribute for {
+ common.data.idrefs #REVISIT spec says
space--not whitespace
+ }
+ output.inner =
+ ( common.inner.phrasing )
+
+ common.elem.phrasing |= output.elem
+
+## Text Area: <textarea>, extensions
+
+ textarea.attrs.rows-and-cols-wf1.inner &=
+ notAllowed
+ textarea.attrs.rows-and-cols-wf1 |=
+ empty
+ textarea.attrs &=
+ ( shared-form.attrs.maxlength?
+ & shared-form.attrs.autofocus?
+ & shared-form.attrs.required?
+ & shared-form.attrs.placeholder?
+ & shared-form.attrs.dirname?
+ & textarea.attrs.rows?
+ & ( ( textarea.attrs.wrap.hard
+ & textarea.attrs.cols
+ )
+ | ( textarea.attrs.wrap.soft?
+ & textarea.attrs.cols?
+ )
+ )
+ )
+ textarea.attrs.wrap.hard =
+ attribute wrap {
+ w:string "hard"
+ }
+ textarea.attrs.wrap.soft =
+ attribute wrap {
+ w:string "soft"
+ }
+
+## List of Prefill Data: <datalist>
+
+ #REVISIT should the options in datalist be non-selectable?
+
+ datalist.elem =
+ element datalist { datalist.inner & datalist.attrs }
+ datalist.inner =
+ ( option.elem* & common.inner.phrasing )
+ datalist.attrs =
+ ( common.attrs
+ & ( common.attrs.aria.role.listbox #
aria-multiselectable must be false; check by assertions
+ | common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+
+ common.elem.phrasing |= datalist.elem
+
+## Complex Submit Button: <button type='submit'>, extensions
+
+ button.submit.attrs &=
+ ( shared-form.attrs.formaction?
+ & shared-form.attrs.autofocus?
+ & shared-form.attrs.formenctype?
+ & shared-form.attrs.formmethod?
+ & shared-form.attrs.formtarget?
+ & shared-form.attrs.formnovalidate?
+ )
+
+## Complex Reset Button: <button type='reset'>, extensions
+
+ button.reset.attrs &=
+ ( shared-form.attrs.autofocus? )
+
+## Complex Push Button: <button type='button'>, extensions
+
+ button.button.attrs &=
+ ( shared-form.attrs.autofocus? )
+
+## Form: <form>, extensions
+ form.attrs &=
+ ( form.attrs.novalidate?
+ & form.attrs.target?
+ & form.attrs.autocomplete?
+ )
+ form.attrs.novalidate =
+ attribute novalidate {
+ w:string "novalidate" | w:string ""
+ }
+ form.attrs.target =
+ attribute target {
+ common.data.browsing-context-or-keyword
+ }
+ form.attrs.autocomplete =
+ attribute autocomplete {
+ w:string "on" | w:string "off"
+ }
+ # REVISIT should this be case-insensitive in conforming XHTML
documents?
+ form.attrs.enctype.data |=
+ ( w:string "text/plain" )
+
+## Fieldset: <fieldset>, extensions
+
+ fieldset.attrs &=
+ ( common-form.attrs )
+
+## Label: <label>, extensions
+
+ label.attrs &=
+ ( common-form.attrs.form? )
+
+## Key-pair generator/input control: <keygen>
+
+ keygen.elem =
+ element keygen { keygen.inner & keygen.attrs }
+ keygen.attrs =
+ ( common.attrs
+ & keygen.attrs.challenge?
+ & keygen.attrs.keytype?
+ & shared-form.attrs.autofocus?
+ & common-form.attrs?
+ & ( common.attrs.aria.role.presentation
+ | common.attrs.aria.role.menuitem
+ )?
+ )
+ keygen.attrs.challenge =
+ attribute challenge {
+ string
+ }
+ keygen.attrs.keytype =
+ attribute keytype {
+ w:string "rsa"
+ }
+ keygen.inner =
+ ( empty )
+
+ common.elem.phrasing |= keygen.elem
+
+## Selection Menu: <select>, Extensions
+
+ select.attrs &=
+ ( shared-form.attrs.autofocus?
+ & shared-form.attrs.required?
+ )
diff --git a/xhtml5.rnc b/xhtml5.rnc
new file mode 100644
index 0000000..1c6c524
--- /dev/null
+++ b/xhtml5.rnc
@@ -0,0 +1,40 @@
+default namespace = "http://www.w3.org/1999/xhtml"
+# #####################################################################
+## RELAX NG Schema for XHTML 5 #
+# #####################################################################
+
+ # To validate an XHTML 5 document, you must first validate against #
+ # this schema and then ALSO validate against assertions.sch #
+
+# #####################################################################
+## Schema Framework & Parameters
+
+include "common.rnc" {
+ # XHTML flavor #
+ XMLonly = empty
+ HTMLonly = notAllowed
+ # HTML 4 compat #
+ v5only = empty
+}
+
+# #####################################################################
+## Language Definitions
+
+start = html.elem
+
+include "meta.rnc"
+include "phrase.rnc"
+include "block.rnc"
+include "sectional.rnc"
+include "structural.rnc"
+include "revision.rnc"
+include "embed.rnc"
+include "ruby.rnc"
+include "media.rnc"
+include "core-scripting.rnc"
+include "tables.rnc"
+include "form-datatypes.rnc"
+include "web-forms.rnc"
+include "web-forms2.rnc"
+include "applications.rnc"
+include "data.rnc"
- [elpa] master 1c11a56 12/23: Add the "integrity" attribute, (continued)
- [elpa] master 1c11a56 12/23: Add the "integrity" attribute, Stefan Monnier, 2016/01/14
- [elpa] master f1cac66 11/23: Refine some ARIA checking to sync w/ current spec, Stefan Monnier, 2016/01/14
- [elpa] master ae3a23b 19/23: Allow the "nonce" attribute, Stefan Monnier, 2016/01/14
- [elpa] master 44fe4a7 16/23: Allow "minlength", Stefan Monnier, 2016/01/14
- [elpa] master 67350aa 15/23: Allow ARIA role=switch, Stefan Monnier, 2016/01/14
- [elpa] master fec8cdf 20/23: Add CSP syntax checking for <meta> & HTTP header, Stefan Monnier, 2016/01/14
- [elpa] master 6e7c7c3 21/23: Make minlength checking behave as expected, Stefan Monnier, 2016/01/14
- [elpa] master 7635384 17/23: Align iframe[sandbox] checking with spec, Stefan Monnier, 2016/01/14
- [elpa] master 1f870ab 18/23: Align event-handler-attribute checking with spec, Stefan Monnier, 2016/01/14
- [elpa] master a426434 23/23: * html5-schema: Add locating-rules.xml and setup nxml to use it, Stefan Monnier, 2016/01/14
- [elpa] master dcd917c 01/23: Consolidated all RelaxNG files into `/schema` dir.,
Stefan Monnier <=
- [elpa] master 07bcdb8 22/23: Add 'packages/html5-schema/' from commit '6e7c7c331e7f6692be6c7d39fb9485792f0d3513', Stefan Monnier, 2016/01/14