1 datatypes w = "http://whattf.org/datatype-draft"
3 # #####################################################################
4 ## RELAX NG Schema for HTML 5: Web Forms 1.0 markup #
5 # #####################################################################
7 ## Shared attributes for form controls
10 ( common-form.attrs.name?
11 & common-form.attrs.disabled?
14 common-form.attrs.name =
16 form.data.nonemptystring
19 common-form.attrs.disabled =
21 w:string "disabled" | w:string ""
24 shared-form.attrs.readonly =
26 w:string "readonly" | w:string ""
29 shared-form.attrs.maxlength =
31 common.data.integer.non-negative
34 shared-form.attrs.minlength =
36 common.data.integer.non-negative
39 shared-form.attrs.size =
41 common.data.integer.positive
44 # REVISIT tabindex goes in common.attrs
46 ## Shared attributes for <input>
50 w:string "checked" | w:string ""
53 ## Text Field: <input type='text'>
56 element input { input.text.attrs }
60 & input.text.attrs.type?
61 & shared-form.attrs.maxlength?
62 & shared-form.attrs.readonly?
63 & shared-form.attrs.size?
64 & input.text.attrs.value?
65 & ( common.attrs.aria.implicit.textbox
66 | common.attrs.aria.implicit.combobox
67 | common.attrs.aria.role.textbox
68 | common.attrs.aria.role.combobox
71 input.text.attrs.type =
75 input.text.attrs.value =
77 form.data.stringwithoutlinebreaks
80 input.elem = input.text.elem
82 ## Password Field: <input type='password'>
85 element input { input.password.attrs }
86 input.password.attrs =
89 & input.password.attrs.type
90 & shared-form.attrs.maxlength?
91 & shared-form.attrs.readonly?
92 & shared-form.attrs.size?
93 & input.password.attrs.value?
94 & ( common.attrs.aria.implicit.textbox
95 | common.attrs.aria.role.textbox
98 input.password.attrs.type =
102 input.password.attrs.value =
104 form.data.stringwithoutlinebreaks
107 input.elem |= input.password.elem
109 ## Checkbox: <input type='checkbox'>
111 input.checkbox.elem =
112 element input { input.checkbox.attrs }
113 input.checkbox.attrs =
116 & input.checkbox.attrs.type
117 & input.attrs.checked?
118 & input.checkbox.attrs.value?
119 & ( common.attrs.aria.implicit.checkbox
120 | common.attrs.aria.role.checkbox
121 | common.attrs.aria.role.menuitemcheckbox
122 | common.attrs.aria.role.switch
125 input.checkbox.attrs.type =
129 input.checkbox.attrs.value =
131 string #REVISIT require non-empty value?
134 input.elem |= input.checkbox.elem
136 ## Radiobutton: <input type='radio'>
139 element input { input.radio.attrs }
143 & input.radio.attrs.type
144 & input.attrs.checked?
145 & input.radio.attrs.value?
146 & ( common.attrs.aria.implicit.radio
147 | common.attrs.aria.role.radio
148 | common.attrs.aria.role.menuitemradio
151 input.radio.attrs.type =
155 input.radio.attrs.value =
157 string #REVISIT require non-empty value?
160 input.elem |= input.radio.elem
162 ## Scripting Hook Button: <input type='button'>
165 element input { input.button.attrs }
169 & input.button.attrs.type
170 & input.button.attrs.value?
171 & ( common.attrs.aria.implicit.button
172 | common.attrs.aria.role.button
173 | common.attrs.aria.role.link
174 | common.attrs.aria.role.menuitem
175 | common.attrs.aria.role.menuitemcheckbox
176 | common.attrs.aria.role.menuitemradio
177 | common.attrs.aria.role.radio
178 | common.attrs.aria.role.switch
181 input.button.attrs.type =
185 input.button.attrs.value =
187 string #REVISIT require non-empty value?
190 input.elem |= input.button.elem
191 #REVISIT should this be enabled by a scripting module only?
193 ## Submit Button: <input type='submit'>
196 element input { input.submit.attrs }
200 & input.submit.attrs.type
201 & input.submit.attrs.value?
202 & ( common.attrs.aria.implicit.button
203 | common.attrs.aria.role.button
206 input.submit.attrs.type =
210 input.submit.attrs.value =
212 string #REVISIT require non-empty value?
215 input.elem |= input.submit.elem
217 ## Reset Button: <input type='reset'>
220 element input { input.reset.attrs }
224 & input.reset.attrs.type
225 & input.reset.attrs.value?
226 & ( common.attrs.aria.implicit.button
227 | common.attrs.aria.role.button
230 input.reset.attrs.type =
234 input.reset.attrs.value =
236 string #REVISIT require non-empty value?
239 input.elem |= input.reset.elem
240 # REVISIT does reset make sense outside a form?
242 ## File Upload: <input type='file'>
245 element input { input.file.attrs }
249 & input.file.attrs.type
250 & input.file.attrs.accept?
253 input.file.attrs.type =
257 input.file.attrs.accept =
259 form.data.mimetypelist
262 input.elem |= input.file.elem
264 ## Hidden String: <input type='hidden'>
267 element input { input.hidden.attrs }
271 & input.hidden.attrs.type
272 & input.hidden.attrs.value?
275 input.hidden.attrs.type =
279 input.hidden.attrs.value =
284 input.elem |= input.hidden.elem
286 ## Image Submit Button: <input type='image'>
289 element input { input.image.attrs }
293 & input.image.attrs.type
294 & input.image.attrs.alt
295 & input.image.attrs.src?
296 & ( common.attrs.aria.implicit.button
297 | common.attrs.aria.role.button
298 | common.attrs.aria.role.link
299 | common.attrs.aria.role.menuitem
300 | common.attrs.aria.role.menuitemcheckbox
301 | common.attrs.aria.role.menuitemradio
302 | common.attrs.aria.role.radio
303 | common.attrs.aria.role.switch
306 input.image.attrs.type =
310 input.image.attrs.alt =
312 form.data.nonemptystring
314 input.image.attrs.src =
316 common.data.uri.non-empty
319 input.elem |= input.image.elem
321 common.elem.phrasing |= input.elem
323 ## Text Area: <textarea>
326 element textarea { textarea.inner & textarea.attrs }
330 & shared-form.attrs.readonly?
331 & textarea.attrs.rows-and-cols-wf1
332 & ( common.attrs.aria.implicit.textbox
333 | common.attrs.aria.role.textbox
335 #FIXME onfocus, onblur, onselect,onchange
338 textarea.attrs.rows-and-cols-wf1 =
339 textarea.attrs.rows-and-cols-wf1.inner
340 textarea.attrs.rows-and-cols-wf1.inner =
341 ( textarea.attrs.cols
342 & textarea.attrs.rows
344 textarea.attrs.cols =
346 common.data.integer.positive
348 textarea.attrs.rows =
350 common.data.integer.positive
355 common.elem.phrasing |= textarea.elem
357 # Due to limitations with interleave, handling single/multiple selection
358 # enforcement in RELAX NG seems to be possible but really awkward.
359 # Tried it. Leaving it to Schematron.
361 ## Select menu option: <option selected>
364 element option { option.inner & option.attrs }
367 & common-form.attrs.disabled?
368 & option.attrs.selected?
369 & option.attrs.label?
370 & option.attrs.value?
371 & ( common.attrs.aria.implicit.option
372 | common.attrs.aria.role.option
375 option.attrs.selected =
377 w:string "selected" | w:string ""
381 form.data.nonemptystring
390 ## Option Group: <optgroup>
393 element optgroup { optgroup.inner & optgroup.attrs }
396 & optgroup.attrs.label
397 & common-form.attrs.disabled?
398 & ( common.attrs.aria.role.presentation
399 | common.attrs.aria.role.menuitem
402 optgroup.attrs.label =
408 & common.elem.script-supporting*
411 ## Selection Menu: <select>
414 element select { select.inner & select.attrs }
419 & select.attrs.multiple?
420 # FIXME onfocus, onblur, onchange
421 & ( common.attrs.aria.implicit.listbox
422 | common.attrs.aria.role.listbox # aria-multiselectable depends on "multiple" value; check in assertions
427 common.data.integer.positive
429 select.attrs.multiple =
431 w:string "multiple" | w:string ""
436 & common.elem.script-supporting*
439 common.elem.phrasing |= select.elem
441 ## Shared Definitions for Complex Button
448 ( common.inner.phrasing )
450 ## Complex Submit Button: <button type='submit'>
453 element button { button.inner & button.submit.attrs }
454 button.submit.attrs =
457 & button.submit.attrs.type?
458 & button.attrs.value?
459 & ( common.attrs.aria.implicit.button
460 | common.attrs.aria.role.button
461 | common.attrs.aria.role.checkbox
462 | common.attrs.aria.role.link
463 | common.attrs.aria.role.menuitem
464 | common.attrs.aria.role.menuitemcheckbox
465 | common.attrs.aria.role.menuitemradio
466 | common.attrs.aria.role.radio
469 button.submit.attrs.type =
474 button.elem = button.submit.elem
476 ## Complex Reset Button: <button type='reset'>
479 element button { button.inner & button.reset.attrs }
483 & button.reset.attrs.type
484 & button.attrs.value? #REVISIT I guess this still affects the DOM
485 & ( common.attrs.aria.implicit.button
486 | common.attrs.aria.role.button
487 | common.attrs.aria.role.checkbox
488 | common.attrs.aria.role.link
489 | common.attrs.aria.role.menuitem
490 | common.attrs.aria.role.menuitemcheckbox
491 | common.attrs.aria.role.menuitemradio
492 | common.attrs.aria.role.radio
493 | common.attrs.aria.role.switch
496 button.reset.attrs.type =
501 button.elem |= button.reset.elem
503 ## Complex Push Button: <button type='button'>
506 element button { button.inner & button.button.attrs }
507 button.button.attrs =
510 & button.button.attrs.type
511 & button.attrs.value? #REVISIT I guess this still affects the DOM
512 & ( common.attrs.aria.implicit.button
513 | common.attrs.aria.role.button
514 | common.attrs.aria.role.checkbox
515 | common.attrs.aria.role.link
516 | common.attrs.aria.role.menuitem
517 | common.attrs.aria.role.menuitemcheckbox
518 | common.attrs.aria.role.menuitemradio
519 | common.attrs.aria.role.radio
520 | common.attrs.aria.role.switch
523 button.button.attrs.type =
528 button.elem |= button.button.elem
530 common.elem.phrasing |= button.elem
535 element form { form.inner & form.attrs }
538 & form.attrs.action? #REVISIT Should this be required anyway?
540 & form.attrs.enctype?
541 & common-form.attrs.name?
542 & form.attrs.accept-charset?
543 & ( common.attrs.aria.implicit.form
544 | common.attrs.aria.landmark.form
545 | common.attrs.aria.role.search
546 | common.attrs.aria.role.presentation
551 common.data.uri.non-empty
555 form.attrs.method.data
557 form.attrs.method.data =
558 ( w:string "get" | w:string "post" )
561 form.attrs.enctype.data
563 form.attrs.enctype.data =
564 ( w:string "application/x-www-form-urlencoded"
565 | w:string "multipart/form-data"
567 form.attrs.accept-charset =
568 attribute accept-charset {
569 form.data.charsetlist
572 ( common.inner.flow )
574 common.elem.flow |= form.elem
576 ## Fieldset: <fieldset>
579 element fieldset { fieldset.inner & fieldset.attrs }
582 & ( common.attrs.aria.implicit.group
587 ( legend.elem? #REVISIT should this be required?
591 common.elem.flow |= fieldset.elem
596 element label { label.inner & label.attrs }
600 & ( common.attrs.aria.role.presentation
601 | common.attrs.aria.role.menuitem
609 ( common.inner.phrasing ) #REVISIT making obvious guess
611 common.elem.phrasing |= label.elem