]> code.delx.au - gnu-emacs-elpa/blob - web-forms2.rnc
Align iframe[sandbox] checking with spec
[gnu-emacs-elpa] / web-forms2.rnc
1 datatypes w = "http://whattf.org/datatype-draft"
2
3 # #####################################################################
4 ## RELAX NG Schema for HTML 5: Web Forms 2.0 markup #
5 # #####################################################################
6
7 ## Shared attributes for form controls
8
9 common-form.attrs &=
10 ( common-form.attrs.form? )
11
12 common-form.attrs.form |=
13 attribute form {
14 common.data.idref
15 }
16
17 shared-form.attrs.formaction =
18 attribute formaction {
19 common.data.uri.non-empty
20 }
21
22 shared-form.attrs.formenctype =
23 attribute formenctype {
24 shared-form.attrs.formenctype.data
25 }
26 shared-form.attrs.formenctype.data =
27 ( w:string "application/x-www-form-urlencoded"
28 | w:string "multipart/form-data"
29 | w:string "text/plain"
30 )
31
32 shared-form.attrs.formmethod =
33 attribute formmethod {
34 shared-form.attrs.formmethod.data
35 }
36 shared-form.attrs.formmethod.data =
37 ( w:string "get"
38 | w:string "post"
39 )
40
41 shared-form.attrs.formtarget =
42 attribute formtarget {
43 common.data.browsing-context-or-keyword
44 }
45
46 shared-form.attrs.formnovalidate =
47 attribute formnovalidate {
48 w:string "formnovalidate" | w:string ""
49 }
50
51 shared-form.attrs.autofocus =
52 attribute autofocus {
53 w:string "autofocus" | w:string ""
54 }
55
56 shared-form.attrs.pattern =
57 attribute pattern {
58 form.data.pattern
59 }
60
61 shared-form.attrs.template =
62 attribute template {
63 common.data.idref
64 }
65
66 shared-form.attrs.required =
67 attribute required {
68 w:string "required" | w:string ""
69 }
70
71 shared-form.attrs.placeholder =
72 attribute placeholder {
73 form.data.stringwithoutlinebreaks
74 }
75
76 shared-form.attrs.dirname =
77 attribute dirname {
78 form.data.nonemptystring
79 }
80
81 shared-form.attrs.inputmode =
82 attribute inputmode {
83 string
84 }
85
86 ## Shared attributes for <input>
87
88 shared-input.attrs =
89 ( input.attrs.autocomplete?
90 & shared-form.attrs.autofocus?
91 & input.attrs.list?
92 & shared-form.attrs.maxlength?
93 & shared-form.attrs.minlength?
94 & shared-form.attrs.pattern?
95 & shared-form.attrs.placeholder?
96 & shared-form.attrs.readonly?
97 & shared-form.attrs.required?
98 & shared-form.attrs.size?
99 )
100
101 input.attrs.autocomplete =
102 attribute autocomplete {
103 w:string "on" | w:string "off"
104 }
105
106 input.attrs.list =
107 attribute list {
108 common.data.idref
109 }
110
111 input.attrs.step.float =
112 attribute step {
113 w:string "any" | common.data.float.positive
114 }
115
116 input.attrs.step.integer =
117 attribute step {
118 w:string "any" | common.data.integer.positive
119 }
120
121 input.attrs.multiple =
122 attribute multiple {
123 w:string "multiple" | w:string ""
124 }
125
126 ## Text Field: <input type='text'>, Extensions
127
128 input.text.attrs &=
129 ( input.attrs.autocomplete?
130 & shared-form.attrs.autofocus?
131 & shared-form.attrs.dirname?
132 & input.attrs.list?
133 & shared-form.attrs.pattern?
134 & shared-form.attrs.required?
135 & shared-form.attrs.placeholder?
136 & shared-form.attrs.inputmode?
137 )
138
139 ## Password Field: <input type='password'>, Extensions
140
141 input.password.attrs &=
142 ( input.attrs.autocomplete?
143 & shared-form.attrs.autofocus?
144 & input.attrs.list?
145 & shared-form.attrs.pattern?
146 & shared-form.attrs.placeholder?
147 & shared-form.attrs.required?
148 )
149
150 ## Checkbox <input type='checkbox'>, Extensions
151
152 input.checkbox.attrs &=
153 ( shared-input.attrs )
154
155 ## Radiobutton: <input type='radio'>, Extensions
156
157 input.radio.attrs &=
158 ( shared-input.attrs )
159
160 ## Scripting Hook Button: <input type='button'>, Extensions
161
162 input.button.attrs &=
163 ( shared-input.attrs )
164
165 ## Submit Button: <input type='submit'>, Extensions
166
167 input.submit.attrs &=
168 ( shared-input.attrs
169 & shared-form.attrs.formaction?
170 & shared-form.attrs.formenctype?
171 & shared-form.attrs.formmethod?
172 & shared-form.attrs.formtarget?
173 & shared-form.attrs.formnovalidate?
174 )
175
176 ## Reset Button: <input type='reset'>, Extensions
177
178 input.reset.attrs &=
179 ( shared-input.attrs )
180
181 ## File Upload: <input type='file'>, Extensions
182
183 input.file.attrs &=
184 ( shared-input.attrs
185 & input.attrs.multiple?
186 )
187
188 ## Image Submit Button: <input type='image'>, Extensions
189
190 input.image.attrs &=
191 ( shared-input.attrs
192 & shared-form.attrs.formaction?
193 & shared-form.attrs.formenctype?
194 & shared-form.attrs.formmethod?
195 & shared-form.attrs.formtarget?
196 & shared-form.attrs.formnovalidate?
197 & input.image.attrs.height?
198 & input.image.attrs.width?
199 )
200 input.image.attrs.height =
201 attribute height {
202 common.data.integer.non-negative
203 }
204 input.image.attrs.width =
205 attribute width {
206 common.data.integer.non-negative
207 }
208
209 ## Global Date and Time: <input type='datetime'>
210
211 input.datetime.elem =
212 element input { input.datetime.attrs }
213 input.datetime.attrs =
214 ( common.attrs
215 & common-form.attrs
216 & shared-input.attrs
217 & input.datetime.attrs.type
218 & input.datetime.attrs.min?
219 & input.datetime.attrs.max?
220 & input.attrs.step.float?
221 & input.datetime.attrs.value?
222 & common.attrs.aria?
223 )
224 input.datetime.attrs.type =
225 attribute type {
226 w:string "datetime"
227 }
228 input.datetime.attrs.min =
229 attribute min {
230 common.data.datetime
231 }
232 input.datetime.attrs.max =
233 attribute max {
234 common.data.datetime
235 }
236 input.datetime.attrs.value =
237 attribute value {
238 w:string "" | common.data.datetime
239 }
240
241 input.elem |= input.datetime.elem
242
243 ## Date and Time with No Time Zone Information: <input type='datetime-local'>
244
245 input.datetime-local.elem =
246 element input { input.datetime-local.attrs }
247 input.datetime-local.attrs =
248 ( common.attrs
249 & common-form.attrs
250 & shared-input.attrs
251 & input.datetime-local.attrs.type
252 & input.datetime-local.attrs.min?
253 & input.datetime-local.attrs.max?
254 & input.attrs.step.float?
255 & input.datetime-local.attrs.value?
256 & common.attrs.aria?
257 )
258 input.datetime-local.attrs.type =
259 attribute type {
260 w:string "datetime-local"
261 }
262 input.datetime-local.attrs.min =
263 attribute min {
264 form.data.datetime-local
265 }
266 input.datetime-local.attrs.max =
267 attribute max {
268 form.data.datetime-local
269 }
270 input.datetime-local.attrs.value =
271 attribute value {
272 w:string "" | form.data.datetime-local
273 }
274
275 input.elem |= input.datetime-local.elem
276
277 ## Date: <input type='date'>
278
279 input.date.elem =
280 element input { input.date.attrs }
281 input.date.attrs =
282 ( common.attrs
283 & common-form.attrs
284 & shared-input.attrs
285 & input.date.attrs.type
286 & input.date.attrs.min?
287 & input.date.attrs.max?
288 & input.attrs.step.integer?
289 & input.date.attrs.value?
290 & common.attrs.aria?
291 )
292 input.date.attrs.type =
293 attribute type {
294 w:string "date"
295 }
296 input.date.attrs.min =
297 attribute min {
298 form.data.date
299 }
300 input.date.attrs.max =
301 attribute max {
302 form.data.date
303 }
304 input.date.attrs.value =
305 attribute value {
306 w:string "" | form.data.date
307 }
308
309 input.elem |= input.date.elem
310
311 ## Year and Month: <input type='month'>
312
313 input.month.elem =
314 element input { input.month.attrs }
315 input.month.attrs =
316 ( common.attrs
317 & common-form.attrs
318 & shared-input.attrs
319 & input.month.attrs.type
320 & input.month.attrs.min?
321 & input.month.attrs.max?
322 & input.attrs.step.integer?
323 & input.month.attrs.value?
324 & common.attrs.aria?
325 )
326 input.month.attrs.type =
327 attribute type {
328 w:string "month"
329 }
330 input.month.attrs.min =
331 attribute min {
332 form.data.month
333 }
334 input.month.attrs.max =
335 attribute max {
336 form.data.month
337 }
338 input.month.attrs.value =
339 attribute value {
340 w:string "" | form.data.month
341 }
342
343 input.elem |= input.month.elem
344
345 ## Time without Time Zone Information: <input type='time'>
346
347 input.time.elem =
348 element input { input.time.attrs }
349 input.time.attrs =
350 ( common.attrs
351 & common-form.attrs
352 & shared-input.attrs
353 & input.time.attrs.type
354 & input.time.attrs.min?
355 & input.time.attrs.max?
356 & input.attrs.step.float?
357 & input.time.attrs.value?
358 & common.attrs.aria?
359 )
360 input.time.attrs.type =
361 attribute type {
362 w:string "time"
363 }
364 input.time.attrs.min =
365 attribute min {
366 form.data.time
367 }
368 input.time.attrs.max =
369 attribute max {
370 form.data.time
371 }
372 input.time.attrs.value =
373 attribute value {
374 w:string "" | form.data.time
375 }
376
377 input.elem |= input.time.elem
378
379 ## Year and Week: <input type='week'>
380
381 input.week.elem =
382 element input { input.week.attrs }
383 input.week.attrs =
384 ( common.attrs
385 & common-form.attrs
386 & shared-input.attrs
387 & input.week.attrs.type
388 & input.week.attrs.min?
389 & input.week.attrs.max?
390 & input.attrs.step.integer?
391 & input.week.attrs.value?
392 & common.attrs.aria?
393 )
394 input.week.attrs.type =
395 attribute type {
396 w:string "week"
397 }
398 input.week.attrs.min =
399 attribute min {
400 form.data.week
401 }
402 input.week.attrs.max =
403 attribute max {
404 form.data.week
405 }
406 input.week.attrs.value =
407 attribute value {
408 w:string "" | form.data.week
409 }
410
411 input.elem |= input.week.elem
412
413 ## Number: <input type='number'>
414
415 input.number.elem =
416 element input { input.number.attrs }
417 input.number.attrs =
418 ( common.attrs
419 & common-form.attrs
420 & shared-input.attrs
421 & input.number.attrs.type
422 & input.number.attrs.min?
423 & input.number.attrs.max?
424 & input.attrs.step.float?
425 & input.number.attrs.value?
426 & ( common.attrs.aria.implicit.spinbutton
427 | common.attrs.aria.role.spinbutton
428 )?
429 )
430 input.number.attrs.type =
431 attribute type {
432 w:string "number"
433 }
434 input.number.attrs.min =
435 attribute min {
436 common.data.float
437 }
438 input.number.attrs.max =
439 attribute max {
440 common.data.float
441 }
442 input.number.attrs.value =
443 attribute value {
444 w:string "" | common.data.float
445 }
446
447 input.elem |= input.number.elem
448
449 ## Imprecise Number: <input type='range'>
450
451 input.range.elem =
452 element input { input.range.attrs }
453 input.range.attrs =
454 ( common.attrs
455 & common-form.attrs
456 & shared-input.attrs
457 & input.range.attrs.type
458 & input.range.attrs.min?
459 & input.range.attrs.max?
460 & input.attrs.step.float?
461 & input.range.attrs.value?
462 & ( common.attrs.aria.implicit.slider
463 | common.attrs.aria.role.slider
464 )?
465 )
466 input.range.attrs.type =
467 attribute type {
468 w:string "range"
469 }
470 input.range.attrs.min =
471 attribute min {
472 common.data.float
473 }
474 input.range.attrs.max =
475 attribute max {
476 common.data.float
477 }
478 input.range.attrs.value =
479 attribute value {
480 common.data.float
481 }
482
483 input.elem |= input.range.elem
484
485 ## Email Address: <input type='email'>
486
487 input.email.elem =
488 element input { input.email.attrs }
489 input.email.attrs =
490 ( common.attrs
491 & common-form.attrs
492 & shared-input.attrs
493 & input.email.attrs.type
494 & ( ( input.attrs.multiple
495 & input.email.attrs.value.multiple?
496 )
497 | input.email.attrs.value.single?
498 )?
499 & ( common.attrs.aria.implicit.textbox
500 | common.attrs.aria.implicit.combobox
501 | common.attrs.aria.role.textbox
502 | common.attrs.aria.role.combobox
503 )?
504 )
505 input.email.attrs.type =
506 attribute type {
507 w:string "email"
508 }
509 input.email.attrs.value.single =
510 attribute value {
511 form.data.emailaddress
512 }
513 input.email.attrs.value.multiple =
514 attribute value {
515 form.data.emailaddresslist
516 }
517
518 input.elem |= input.email.elem
519
520 ## IRI: <input type='url'>
521
522 input.url.elem =
523 element input { input.url.attrs }
524 input.url.attrs =
525 ( common.attrs
526 & common-form.attrs
527 & shared-input.attrs
528 & input.url.attrs.type
529 & input.url.attrs.value?
530 & ( common.attrs.aria.implicit.textbox
531 | common.attrs.aria.implicit.combobox
532 | common.attrs.aria.role.textbox
533 | common.attrs.aria.role.combobox
534 )?
535 )
536 input.url.attrs.type =
537 attribute type {
538 w:string "url"
539 }
540 input.url.attrs.value =
541 attribute value {
542 w:string "" | common.data.uri.absolute
543 }
544
545 input.elem |= input.url.elem
546
547 ## Search: <input type='search'>
548
549 input.search.elem =
550 element input { input.search.attrs }
551 input.search.attrs =
552 ( common.attrs
553 & common-form.attrs
554 & shared-input.attrs
555 & input.search.attrs.type
556 & input.search.attrs.value?
557 & shared-form.attrs.dirname?
558 & ( common.attrs.aria.implicit.textbox
559 | common.attrs.aria.implicit.combobox
560 | common.attrs.aria.role.textbox
561 | common.attrs.aria.role.combobox
562 )?
563 )
564 input.search.attrs.type =
565 attribute type {
566 w:string "search"
567 }
568 input.search.attrs.value =
569 attribute value {
570 form.data.stringwithoutlinebreaks
571 }
572
573 input.elem |= input.search.elem
574
575 ## Telephone Number: <input type='tel'>
576
577 input.tel.elem =
578 element input { input.tel.attrs }
579 input.tel.attrs =
580 ( common.attrs
581 & common-form.attrs
582 & shared-input.attrs
583 & input.tel.attrs.type
584 & input.tel.attrs.value?
585 & ( common.attrs.aria.implicit.textbox
586 | common.attrs.aria.implicit.combobox
587 | common.attrs.aria.role.textbox
588 | common.attrs.aria.role.combobox
589 )?
590 )
591 input.tel.attrs.type =
592 attribute type {
593 w:string "tel"
594 }
595 input.tel.attrs.value =
596 attribute value {
597 form.data.stringwithoutlinebreaks
598 }
599
600 input.elem |= input.tel.elem
601
602 ## Color: <input type='color'>
603
604 input.color.elem =
605 element input { input.color.attrs }
606 input.color.attrs =
607 ( common.attrs
608 & common-form.attrs
609 & input.color.attrs.type
610 & input.color.attrs.value?
611 & shared-input.attrs
612 & common.attrs.aria?
613 )
614 input.color.attrs.type =
615 attribute type {
616 w:string "color"
617 }
618 input.color.attrs.value =
619 attribute value {
620 w:string "" | form.data.color
621 }
622
623 input.elem |= input.color.elem
624
625 ## Form Output: <output>
626
627 output.elem =
628 element output { output.inner & output.attrs }
629 output.attrs =
630 ( common.attrs
631 & common-form.attrs.name?
632 & common-form.attrs.form?
633 & output.attrs.for?
634 & ( common.attrs.aria.implicit.status
635 | common.attrs.aria
636 )?
637 )
638 output.attrs.for =
639 attribute for {
640 common.data.idrefs #REVISIT spec says space--not whitespace
641 }
642 output.inner =
643 ( common.inner.phrasing )
644
645 common.elem.phrasing |= output.elem
646
647 ## Text Area: <textarea>, extensions
648
649 textarea.attrs.rows-and-cols-wf1.inner &=
650 notAllowed
651 textarea.attrs.rows-and-cols-wf1 |=
652 empty
653 textarea.attrs &=
654 ( shared-form.attrs.maxlength?
655 & shared-form.attrs.minlength?
656 & shared-form.attrs.autofocus?
657 & shared-form.attrs.required?
658 & shared-form.attrs.placeholder?
659 & shared-form.attrs.dirname?
660 & textarea.attrs.rows?
661 & ( ( textarea.attrs.wrap.hard
662 & textarea.attrs.cols
663 )
664 | ( textarea.attrs.wrap.soft?
665 & textarea.attrs.cols?
666 )
667 )
668 & shared-form.attrs.inputmode?
669 )
670 textarea.attrs.wrap.hard =
671 attribute wrap {
672 w:string "hard"
673 }
674 textarea.attrs.wrap.soft =
675 attribute wrap {
676 w:string "soft"
677 }
678
679 ## List of Prefill Data: <datalist>
680
681 #REVISIT should the options in datalist be non-selectable?
682
683 datalist.elem =
684 element datalist { datalist.inner & datalist.attrs }
685 datalist.inner =
686 ( option.elem* & common.inner.phrasing )
687 datalist.attrs =
688 ( common.attrs
689 & ( common.attrs.aria.role.listbox # aria-multiselectable must be false; check by assertions
690 | common.attrs.aria.role.presentation
691 | common.attrs.aria.role.menuitem
692 )?
693 )
694
695 common.elem.phrasing |= datalist.elem
696
697 ## Complex Submit Button: <button type='submit'>, extensions
698
699 button.submit.attrs &=
700 ( shared-form.attrs.formaction?
701 & shared-form.attrs.autofocus?
702 & shared-form.attrs.formenctype?
703 & shared-form.attrs.formmethod?
704 & shared-form.attrs.formtarget?
705 & shared-form.attrs.formnovalidate?
706 )
707
708 ## Complex Reset Button: <button type='reset'>, extensions
709
710 button.reset.attrs &=
711 ( shared-form.attrs.autofocus? )
712
713 ## Complex Push Button: <button type='button'>, extensions
714
715 button.button.attrs &=
716 ( shared-form.attrs.autofocus? )
717
718 ## Form: <form>, extensions
719 form.attrs &=
720 ( form.attrs.novalidate?
721 & form.attrs.target?
722 & form.attrs.autocomplete?
723 )
724 form.attrs.novalidate =
725 attribute novalidate {
726 w:string "novalidate" | w:string ""
727 }
728 form.attrs.target =
729 attribute target {
730 common.data.browsing-context-or-keyword
731 }
732 form.attrs.autocomplete =
733 attribute autocomplete {
734 w:string "on" | w:string "off"
735 }
736 # REVISIT should this be case-insensitive in conforming XHTML documents?
737 form.attrs.enctype.data |=
738 ( w:string "text/plain" )
739
740 ## Fieldset: <fieldset>, extensions
741
742 fieldset.attrs &=
743 ( common-form.attrs )
744
745 ## Label: <label>, extensions
746
747 label.attrs &=
748 ( common-form.attrs.form? )
749
750 ## Key-pair generator/input control: <keygen>
751
752 keygen.elem =
753 element keygen { keygen.inner & keygen.attrs }
754 keygen.attrs =
755 ( common.attrs
756 & keygen.attrs.challenge?
757 & keygen.attrs.keytype?
758 & shared-form.attrs.autofocus?
759 & common-form.attrs?
760 & ( common.attrs.aria.role.presentation
761 | common.attrs.aria.role.menuitem
762 )?
763 )
764 keygen.attrs.challenge =
765 attribute challenge {
766 string
767 }
768 keygen.attrs.keytype =
769 attribute keytype {
770 w:string "rsa"
771 }
772 keygen.inner =
773 ( empty )
774
775 common.elem.phrasing |= keygen.elem
776
777 ## Selection Menu: <select>, Extensions
778
779 select.attrs &=
780 ( shared-form.attrs.autofocus?
781 & shared-form.attrs.required?
782 )