1 datatypes w = "http://whattf.org/datatype-draft"
3 # #####################################################################
4 ## RELAX NG Schema for HTML 5: Web Application Features #
5 # #####################################################################
7 ## Additions to Common Attributes
9 common.attrs.interact &=
10 ( common.attrs.contextmenu?
11 & common.attrs.contenteditable?
12 & common.attrs.draggable?
13 & common.attrs.dropzone?
14 & common.attrs.hidden?
15 & common.attrs.spellcheck?
18 common.attrs.other &= common.attrs.interact
20 ## Context Menu: contextmenu
22 common.attrs.contextmenu =
23 attribute contextmenu {
27 ## Editable Content: contenteditable
29 common.attrs.contenteditable =
30 attribute contenteditable {
31 w:string "true" | w:string "false" | w:string ""
34 ## Draggable Element: draggable
36 common.attrs.draggable =
38 w:string "true" | w:string "false"
43 common.attrs.dropzone =
46 ( xsd:string { pattern = "[sS][tT][rR][iI][nN][gG]:.+" }
47 | xsd:string { pattern = "[fF][iI][lL][eE]:.+" }
55 ( xsd:string { pattern = "[sS][tT][rR][iI][nN][gG]:.+" }
56 | xsd:string { pattern = "[fF][iI][lL][eE]:.+" }
61 ## Hidden Element: hidden
65 w:string "hidden" | w:string ""
68 ## Spellchecking and grammar checking: spellcheck
70 common.attrs.spellcheck =
72 w:string "true" | w:string "false" | w:string ""
75 ## Application Cache: manifest
79 common.data.uri.non-empty
82 html.attrs &= html.attrs.manifest?
84 ## Progess Indicator: <progress>
87 element progress { progress.inner & progress.attrs }
90 & progress.attrs.value?
92 & ( common.attrs.aria.implicit.progressbar
93 | common.attrs.aria.role.progressbar
96 progress.attrs.value =
98 common.data.float.non-negative
102 common.data.float.positive
105 ( common.inner.phrasing ) #Cannot enforce textContent format here
107 common.elem.phrasing |= progress.elem
109 ## Dialog box, inspector, or window: <dialog>
111 element dialog { dialog.inner & dialog.attrs }
115 & ( common.attrs.aria.implicit.dialog
116 | common.attrs.aria.role.alert
117 | common.attrs.aria.role.alertdialog
118 | common.attrs.aria.role.contentinfo
119 | common.attrs.aria.role.dialog
120 | common.attrs.aria.role.log
121 | common.attrs.aria.role.marquee
122 | common.attrs.aria.role.region
123 | common.attrs.aria.role.status
124 | common.attrs.aria.landmark.application
125 | common.attrs.aria.landmark.document
126 | common.attrs.aria.landmark.main
127 | common.attrs.aria.landmark.search
132 w:string "open" | w:string ""
135 ( common.inner.flow )
136 common.elem.flow |= dialog.elem
138 ## Toolbar: <menu type=toolbar>
141 element menu { menu.toolbar.inner & menu.toolbar.attrs }
144 & menu.toolbar.attrs.type?
145 & ( common.attrs.aria.implicit.toolbar
146 | common.attrs.aria.role.directory
147 | common.attrs.aria.role.list
148 | common.attrs.aria.role.listbox
149 | common.attrs.aria.role.menu
150 | common.attrs.aria.role.menubar
151 | common.attrs.aria.role.tablist
152 | common.attrs.aria.role.toolbar
153 | common.attrs.aria.role.tree
154 | common.attrs.aria.role.presentation
157 menu.toolbar.attrs.type =
165 menu.elem |= menu.toolbar.elem
167 ## Toolbar item: <li>
170 element li { mli.inner & mli.attrs }
173 & ( ( common.attrs.aria.role.listitem
174 | common.attrs.aria.role.menuitem
175 | common.attrs.aria.role.menuitemcheckbox
176 | common.attrs.aria.role.menuitemradio
177 | common.attrs.aria.role.option
178 | common.attrs.aria.role.tab
179 | common.attrs.aria.role.treeitem
180 | common.attrs.aria.role.presentation
185 ( common.inner.flow )
187 ## Popup menu: <menu type=popup>
190 element menu { menu.popup.inner & menu.popup.attrs }
193 & menu.popup.attrs.type?
197 menu.popup.attrs.type =
209 & common.elem.script-supporting*
211 menu.elem |= menu.popup.elem
213 ## Ambiguous menu: <menu> (with no "type" attribute)
214 menu.ambiguous.elem =
215 element menu { menu.ambiguous.inner & menu.ambiguous.attrs }
216 menu.ambiguous.attrs =
221 menu.ambiguous.inner =
224 & menu.ambiguous.elem*
225 & common.elem.script-supporting*
231 menu.elem |= menu.ambiguous.elem
233 common.elem.flow |= menu.elem
234 # REVISIT allow nested menus
236 ## Explicit command in popup menu: <menuitem type=command>
237 menuitem.explicit.command.elem =
238 element menuitem { menuitem.inner & menuitem.explicit.command.attrs }
239 menuitem.explicit.command.attrs =
241 & menuitem.explicit.command.attrs.type?
242 & menuitem.attrs.label?
243 & menuitem.attrs.icon?
244 & menuitem.attrs.disabled?
245 & menuitem.attrs.default?
248 menuitem.explicit.command.attrs.type =
252 menuitem.attrs.label =
256 menuitem.attrs.icon =
258 common.data.uri.non-empty
260 menuitem.attrs.disabled =
262 w:string "" | w:string "disabled"
264 menuitem.attrs.default =
266 w:string "" | w:string "default"
268 menuitem.elem |= menuitem.explicit.command.elem
270 ## Checkbox in popup menu: <menuitem type=checkbox>
271 menuitem.checkbox.elem =
272 element menuitem { menuitem.inner & menuitem.checkbox.attrs }
273 menuitem.checkbox.attrs =
275 & menuitem.checkbox.attrs.type
276 & menuitem.attrs.label?
277 & menuitem.attrs.icon?
278 & menuitem.attrs.disabled?
279 & menuitem.attrs.checked?
280 & menuitem.attrs.radiogroup?
281 & menuitem.attrs.default?
284 menuitem.checkbox.attrs.type =
288 menuitem.attrs.checked =
290 w:string "checked" | w:string ""
292 menuitem.attrs.radiogroup =
293 attribute radiogroup {
296 menuitem.elem |= menuitem.checkbox.elem
298 ## Radio button in popup menu: <menuitem type=radio>
299 menuitem.radio.elem =
300 element menuitem { menuitem.inner & menuitem.radio.attrs }
301 menuitem.radio.attrs =
303 & menuitem.radio.attrs.type
304 & menuitem.attrs.label?
305 & menuitem.attrs.icon?
306 & menuitem.attrs.disabled?
307 & menuitem.attrs.checked?
308 & menuitem.attrs.radiogroup?
309 & menuitem.attrs.default?
312 menuitem.radio.attrs.type =
316 menuitem.elem |= menuitem.radio.elem
318 ## Indirect command in popup menu: <menuitem command>
319 menuitem.indirect.command.elem =
320 element menuitem { menuitem.inner & menuitem.indirect.command.attrs }
321 menuitem.indirect.command.attrs =
323 & menuitem.attrs.default?
324 & menuitem.attrs.command
327 menuitem.attrs.command =
331 menuitem.elem |= menuitem.indirect.command.elem
336 ## Canvas for Dynamic Graphics: <canvas>
339 element canvas { canvas.inner.flow & canvas.attrs }
340 canvas.elem.phrasing =
341 element canvas { canvas.inner.phrasing & canvas.attrs }
344 & canvas.attrs.height?
345 & canvas.attrs.width?
348 canvas.attrs.height =
350 common.data.integer.non-negative
354 common.data.integer.non-negative
357 ( common.inner.transparent.flow )
358 canvas.inner.phrasing =
359 ( common.inner.phrasing )
361 common.elem.flow |= canvas.elem.flow
362 common.elem.phrasing |= canvas.elem.phrasing
364 ## Additional On-Demand Information: <details>
367 element details { details.inner & details.attrs }
370 & details.attrs.open?
371 & ( common.attrs.aria.implicit.group # aria-expanded must be true if open attr present; check by assertions
372 | common.attrs.aria.role.group
377 w:string "open" | w:string ""
384 common.elem.flow |= details.elem
386 ## Caption/summary for details element: <summary>
389 element summary { summary.inner & summary.attrs }
392 & ( common.attrs.aria.implicit.button
393 | common.attrs.aria.role.button
397 ( common.inner.phrasing