datatypes w = "http://whattf.org/datatype-draft" # ##################################################################### ## RELAX NG Schema for HTML 5: Web Forms 1.0 markup # # ##################################################################### ## Shared attributes for form controls common-form.attrs = ( common-form.attrs.name? & common-form.attrs.disabled? ) common-form.attrs.name = attribute name { form.data.nonemptystring } common-form.attrs.disabled = attribute disabled { w:string "disabled" | w:string "" } shared-form.attrs.readonly = attribute readonly { w:string "readonly" | w:string "" } shared-form.attrs.maxlength = attribute maxlength { common.data.integer.non-negative } shared-form.attrs.size = attribute size { common.data.integer.positive } # REVISIT tabindex goes in common.attrs ## Shared attributes for input.attrs.checked = attribute checked { w:string "checked" | w:string "" } ## Text Field: input.text.elem = element input { input.text.attrs } input.text.attrs = ( common.attrs & common-form.attrs & input.text.attrs.type? & shared-form.attrs.maxlength? & shared-form.attrs.readonly? & shared-form.attrs.size? & input.text.attrs.value? & ( common.attrs.aria.implicit.textbox | common.attrs.aria.implicit.combobox | common.attrs.aria.role.textbox | common.attrs.aria.role.combobox )? ) input.text.attrs.type = attribute type { w:string "text" } input.text.attrs.value = attribute value { form.data.stringwithoutlinebreaks } input.elem = input.text.elem ## Password Field: input.password.elem = element input { input.password.attrs } input.password.attrs = ( common.attrs & common-form.attrs & input.password.attrs.type & shared-form.attrs.maxlength? & shared-form.attrs.readonly? & shared-form.attrs.size? & input.password.attrs.value? & ( common.attrs.aria.implicit.textbox | common.attrs.aria.role.textbox )? ) input.password.attrs.type = attribute type { w:string "password" } input.password.attrs.value = attribute value { form.data.stringwithoutlinebreaks } input.elem |= input.password.elem ## Checkbox: input.checkbox.elem = element input { input.checkbox.attrs } input.checkbox.attrs = ( common.attrs & common-form.attrs & input.checkbox.attrs.type & input.attrs.checked? & input.checkbox.attrs.value? & ( common.attrs.aria.implicit.checkbox | common.attrs.aria.role.checkbox | common.attrs.aria.role.menuitemcheckbox | common.attrs.aria.role.switch )? ) input.checkbox.attrs.type = attribute type { w:string "checkbox" } input.checkbox.attrs.value = attribute value { string #REVISIT require non-empty value? } input.elem |= input.checkbox.elem ## Radiobutton: input.radio.elem = element input { input.radio.attrs } input.radio.attrs = ( common.attrs & common-form.attrs & input.radio.attrs.type & input.attrs.checked? & input.radio.attrs.value? & ( common.attrs.aria.implicit.radio | common.attrs.aria.role.radio | common.attrs.aria.role.menuitemradio )? ) input.radio.attrs.type = attribute type { w:string "radio" } input.radio.attrs.value = attribute value { string #REVISIT require non-empty value? } input.elem |= input.radio.elem ## Scripting Hook Button: input.button.elem = element input { input.button.attrs } input.button.attrs = ( common.attrs & common-form.attrs & input.button.attrs.type & input.button.attrs.value? & ( common.attrs.aria.implicit.button | common.attrs.aria.role.button | common.attrs.aria.role.link | common.attrs.aria.role.menuitem | common.attrs.aria.role.menuitemcheckbox | common.attrs.aria.role.menuitemradio | common.attrs.aria.role.radio | common.attrs.aria.role.switch )? ) input.button.attrs.type = attribute type { w:string "button" } input.button.attrs.value = attribute value { string #REVISIT require non-empty value? } input.elem |= input.button.elem #REVISIT should this be enabled by a scripting module only? ## Submit Button: input.submit.elem = element input { input.submit.attrs } input.submit.attrs = ( common.attrs & common-form.attrs & input.submit.attrs.type & input.submit.attrs.value? & ( common.attrs.aria.implicit.button | common.attrs.aria.role.button )? ) input.submit.attrs.type = attribute type { w:string "submit" } input.submit.attrs.value = attribute value { string #REVISIT require non-empty value? } input.elem |= input.submit.elem ## Reset Button: input.reset.elem = element input { input.reset.attrs } input.reset.attrs = ( common.attrs & common-form.attrs & input.reset.attrs.type & input.reset.attrs.value? & ( common.attrs.aria.implicit.button | common.attrs.aria.role.button )? ) input.reset.attrs.type = attribute type { w:string "reset" } input.reset.attrs.value = attribute value { string #REVISIT require non-empty value? } input.elem |= input.reset.elem # REVISIT does reset make sense outside a form? ## File Upload: input.file.elem = element input { input.file.attrs } input.file.attrs = ( common.attrs & common-form.attrs & input.file.attrs.type & input.file.attrs.accept? & common.attrs.aria? ) input.file.attrs.type = attribute type { w:string "file" } input.file.attrs.accept = attribute accept { form.data.mimetypelist } input.elem |= input.file.elem ## Hidden String: input.hidden.elem = element input { input.hidden.attrs } input.hidden.attrs = ( common.attrs & common-form.attrs & input.hidden.attrs.type & input.hidden.attrs.value? & common.attrs.aria? ) input.hidden.attrs.type = attribute type { w:string "hidden" } input.hidden.attrs.value = attribute value { string } input.elem |= input.hidden.elem ## Image Submit Button: input.image.elem = element input { input.image.attrs } input.image.attrs = ( common.attrs & common-form.attrs & input.image.attrs.type & input.image.attrs.alt & input.image.attrs.src? & ( common.attrs.aria.implicit.button | common.attrs.aria.role.button | common.attrs.aria.role.link | common.attrs.aria.role.menuitem | common.attrs.aria.role.menuitemcheckbox | common.attrs.aria.role.menuitemradio | common.attrs.aria.role.radio | common.attrs.aria.role.switch )? ) input.image.attrs.type = attribute type { w:string "image" } input.image.attrs.alt = attribute alt { form.data.nonemptystring } input.image.attrs.src = attribute src { common.data.uri.non-empty } input.elem |= input.image.elem common.elem.phrasing |= input.elem ## Text Area: