blob: 2a592fbbd781342ee72ca27d47a49ea9986e5123 [file] [log] [blame]
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
)