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