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.size =
36 common.data.integer.positive
39 # REVISIT tabindex goes in common.attrs
41 ## Shared attributes for <input>
45 w:string "checked" | w:string ""
48 ## Text Field: <input type='text'>
51 element input { input.text.attrs }
55 & input.text.attrs.type?
56 & shared-form.attrs.maxlength?
57 & shared-form.attrs.readonly?
58 & shared-form.attrs.size?
59 & input.text.attrs.value?
60 & ( common.attrs.aria.implicit.textbox
61 | common.attrs.aria.implicit.combobox
62 | common.attrs.aria.role.textbox
63 | common.attrs.aria.role.combobox
66 input.text.attrs.type =
70 input.text.attrs.value =
72 form.data.stringwithoutlinebreaks
75 input.elem = input.text.elem
77 ## Password Field: <input type='password'>
80 element input { input.password.attrs }
81 input.password.attrs =
84 & input.password.attrs.type
85 & shared-form.attrs.maxlength?
86 & shared-form.attrs.readonly?
87 & shared-form.attrs.size?
88 & input.password.attrs.value?
89 & ( common.attrs.aria.implicit.textbox
90 | common.attrs.aria.role.textbox
93 input.password.attrs.type =
97 input.password.attrs.value =
99 form.data.stringwithoutlinebreaks
102 input.elem |= input.password.elem
104 ## Checkbox: <input type='checkbox'>
106 input.checkbox.elem =
107 element input { input.checkbox.attrs }
108 input.checkbox.attrs =
111 & input.checkbox.attrs.type
112 & input.attrs.checked?
113 & input.checkbox.attrs.value?
114 & ( common.attrs.aria.implicit.checkbox
115 | common.attrs.aria.role.checkbox
116 | common.attrs.aria.role.menuitemcheckbox
119 input.checkbox.attrs.type =
123 input.checkbox.attrs.value =
125 string #REVISIT require non-empty value?
128 input.elem |= input.checkbox.elem
130 ## Radiobutton: <input type='radio'>
133 element input { input.radio.attrs }
137 & input.radio.attrs.type
138 & input.attrs.checked?
139 & input.radio.attrs.value?
140 & ( common.attrs.aria.implicit.radio
141 | common.attrs.aria.role.radio
142 | common.attrs.aria.role.menuitemradio
145 input.radio.attrs.type =
149 input.radio.attrs.value =
151 string #REVISIT require non-empty value?
154 input.elem |= input.radio.elem
156 ## Scripting Hook Button: <input type='button'>
159 element input { input.button.attrs }
163 & input.button.attrs.type
164 & input.button.attrs.value?
165 & ( common.attrs.aria.implicit.button
166 | common.attrs.aria.role.button
167 | common.attrs.aria.role.link
168 | common.attrs.aria.role.menuitem
169 | common.attrs.aria.role.menuitemcheckbox
170 | common.attrs.aria.role.menuitemradio
171 | common.attrs.aria.role.radio
174 input.button.attrs.type =
178 input.button.attrs.value =
180 string #REVISIT require non-empty value?
183 input.elem |= input.button.elem
184 #REVISIT should this be enabled by a scripting module only?
186 ## Submit Button: <input type='submit'>
189 element input { input.submit.attrs }
193 & input.submit.attrs.type
194 & input.submit.attrs.value?
195 & ( common.attrs.aria.implicit.button
196 | common.attrs.aria.role.button
199 input.submit.attrs.type =
203 input.submit.attrs.value =
205 string #REVISIT require non-empty value?
208 input.elem |= input.submit.elem
210 ## Reset Button: <input type='reset'>
213 element input { input.reset.attrs }
217 & input.reset.attrs.type
218 & input.reset.attrs.value?
219 & ( common.attrs.aria.implicit.button
220 | common.attrs.aria.role.button
223 input.reset.attrs.type =
227 input.reset.attrs.value =
229 string #REVISIT require non-empty value?
232 input.elem |= input.reset.elem
233 # REVISIT does reset make sense outside a form?
235 ## File Upload: <input type='file'>
238 element input { input.file.attrs }
242 & input.file.attrs.type
243 & input.file.attrs.accept?
246 input.file.attrs.type =
250 input.file.attrs.accept =
252 form.data.mimetypelist
255 input.elem |= input.file.elem
257 ## Hidden String: <input type='hidden'>
260 element input { input.hidden.attrs }
264 & input.hidden.attrs.type
265 & input.hidden.attrs.value?
268 input.hidden.attrs.type =
272 input.hidden.attrs.value =
277 input.elem |= input.hidden.elem
279 ## Image Submit Button: <input type='image'>
282 element input { input.image.attrs }
286 & input.image.attrs.type
287 & input.image.attrs.alt
288 & input.image.attrs.src?
289 & ( common.attrs.aria.implicit.button
290 | common.attrs.aria.role.button
291 | common.attrs.aria.role.link
292 | common.attrs.aria.role.menuitem
293 | common.attrs.aria.role.menuitemcheckbox
294 | common.attrs.aria.role.menuitemradio
295 | common.attrs.aria.role.radio
298 input.image.attrs.type =
302 input.image.attrs.alt =
304 form.data.nonemptystring
306 input.image.attrs.src =
308 common.data.uri.non-empty
311 input.elem |= input.image.elem
313 common.elem.phrasing |= input.elem
315 ## Text Area: <textarea>
318 element textarea { textarea.inner & textarea.attrs }
322 & shared-form.attrs.readonly?
323 & textarea.attrs.rows-and-cols-wf1
324 & ( common.attrs.aria.implicit.textbox
325 | common.attrs.aria.role.textbox
327 #FIXME onfocus, onblur, onselect,onchange
330 textarea.attrs.rows-and-cols-wf1 =
331 textarea.attrs.rows-and-cols-wf1.inner
332 textarea.attrs.rows-and-cols-wf1.inner =
333 ( textarea.attrs.cols
334 & textarea.attrs.rows
336 textarea.attrs.cols =
338 common.data.integer.positive
340 textarea.attrs.rows =
342 common.data.integer.positive
347 common.elem.phrasing |= textarea.elem
349 # Due to limitations with interleave, handling single/multiple selection
350 # enforcement in RELAX NG seems to be possible but really awkward.
351 # Tried it. Leaving it to Schematron.
353 ## Select menu option: <option selected>
356 element option { option.inner & option.attrs }
359 & common-form.attrs.disabled?
360 & option.attrs.selected?
361 & option.attrs.label?
362 & option.attrs.value?
363 & ( common.attrs.aria.implicit.option
364 | common.attrs.aria.role.option
367 option.attrs.selected =
369 w:string "selected" | w:string ""
373 form.data.nonemptystring
382 ## Option Group: <optgroup>
385 element optgroup { optgroup.inner & optgroup.attrs }
388 & optgroup.attrs.label
389 & common-form.attrs.disabled?
390 & ( common.attrs.aria.role.presentation
391 | common.attrs.aria.role.menuitem
394 optgroup.attrs.label =
400 & common.elem.script-supporting*
403 ## Selection Menu: <select>
406 element select { select.inner & select.attrs }
411 & select.attrs.multiple?
412 # FIXME onfocus, onblur, onchange
413 & ( common.attrs.aria.implicit.listbox
414 | common.attrs.aria.role.listbox # aria-multiselectable depends on "multiple" value; check in assertions
419 common.data.integer.positive
421 select.attrs.multiple =
423 w:string "multiple" | w:string ""
428 & common.elem.script-supporting*
431 common.elem.phrasing |= select.elem
433 ## Shared Definitions for Complex Button
440 ( common.inner.phrasing )
442 ## Complex Submit Button: <button type='submit'>
445 element button { button.inner & button.submit.attrs }
446 button.submit.attrs =
449 & button.submit.attrs.type?
450 & button.attrs.value?
451 & ( common.attrs.aria.implicit.button
452 | common.attrs.aria.role.button
453 | common.attrs.aria.role.link
454 | common.attrs.aria.role.menuitem
455 | common.attrs.aria.role.menuitemcheckbox
456 | common.attrs.aria.role.menuitemradio
457 | common.attrs.aria.role.radio
460 button.submit.attrs.type =
465 button.elem = button.submit.elem
467 ## Complex Reset Button: <button type='reset'>
470 element button { button.inner & button.reset.attrs }
474 & button.reset.attrs.type
475 & button.attrs.value? #REVISIT I guess this still affects the DOM
476 & ( common.attrs.aria.implicit.button
477 | common.attrs.aria.role.button
478 | common.attrs.aria.role.link
479 | common.attrs.aria.role.menuitem
480 | common.attrs.aria.role.menuitemcheckbox
481 | common.attrs.aria.role.menuitemradio
482 | common.attrs.aria.role.radio
485 button.reset.attrs.type =
490 button.elem |= button.reset.elem
492 ## Complex Push Button: <button type='button'>
495 element button { button.inner & button.button.attrs }
496 button.button.attrs =
499 & button.button.attrs.type
500 & button.attrs.value? #REVISIT I guess this still affects the DOM
501 & ( common.attrs.aria.implicit.button
502 | common.attrs.aria.role.button
503 | common.attrs.aria.role.link
504 | common.attrs.aria.role.menuitem
505 | common.attrs.aria.role.menuitemcheckbox
506 | common.attrs.aria.role.menuitemradio
507 | common.attrs.aria.role.radio
510 button.button.attrs.type =
515 button.elem |= button.button.elem
517 common.elem.phrasing |= button.elem
522 element form { form.inner & form.attrs }
525 & form.attrs.action? #REVISIT Should this be required anyway?
527 & form.attrs.enctype?
528 & common-form.attrs.name?
529 & form.attrs.accept-charset?
530 & ( common.attrs.aria.implicit.form
531 | common.attrs.aria.landmark.form
532 | common.attrs.aria.role.search
533 | common.attrs.aria.role.presentation
538 common.data.uri.non-empty
542 form.attrs.method.data
544 form.attrs.method.data =
545 ( w:string "get" | w:string "post" )
548 form.attrs.enctype.data
550 form.attrs.enctype.data =
551 ( w:string "application/x-www-form-urlencoded"
552 | w:string "multipart/form-data"
554 form.attrs.accept-charset =
555 attribute accept-charset {
556 form.data.charsetlist
559 ( common.inner.flow )
561 common.elem.flow |= form.elem
563 ## Fieldset: <fieldset>
566 element fieldset { fieldset.inner & fieldset.attrs }
569 & ( common.attrs.aria.implicit.group
574 ( legend.elem? #REVISIT should this be required?
578 common.elem.flow |= fieldset.elem
583 element label { label.inner & label.attrs }
587 & ( common.attrs.aria.role.presentation
588 | common.attrs.aria.role.menuitem
596 ( common.inner.phrasing ) #REVISIT making obvious guess
598 common.elem.phrasing |= label.elem