datatypes w = "http://whattf.org/datatype-draft"

# #####################################################################
##  RELAX NG Schema for HTML 5: Tables                                #
# #####################################################################

# #####################################################################
## Table Envelope

## Table Datatypes

#	tables.data.multilen =
#		(	common.data.integer.positive
#		|	common.data.percent
#		|	xsd:token { pattern = "[0-9]+\*" } #REVISIT should this one be string? 
#		)

## Table Alignment Attributes

	tables.attrs.alignment =
		(	tables.attrs.align?
		&	tables.attrs.char?
		&	tables.attrs.valign?
		)
		tables.attrs.align =
			attribute align {
				(	w:string "left" 
				|	w:string "center"
				|	w:string "right"
				|	w:string "justify"
				|	w:string "char"
				)
			}
		tables.attrs.char =
			attribute char {
				xsd:string { pattern = "." }
			}
		tables.attrs.valign =
			attribute valign {
				(	w:string "top"
				|	w:string "middle"
				|	w:string "bottom"
				|	w:string "baseline"
				)
			}

## Data Table: <table>

	table.elem =
		element table { table.inner & table.attrs }
	table.attrs =
		(	common.attrs
		&	(	common.attrs.aria.implicit.table
			|	common.attrs.aria
			)?
		)
	table.inner =
		(	caption.elem?
		,	common.elem.script-supporting*
		,	colgroup.elem*
		,	common.elem.script-supporting*
		,	thead.elem?
		,	common.elem.script-supporting*
		,	(	( tbody.elem* | tr.elem+ )
			,	common.elem.script-supporting*
			,	tfoot.elem?
			)
		)

	common.elem.flow |= table.elem

## Table Caption: <caption>

	caption.elem =
		element caption { caption.inner & caption.attrs }
	caption.attrs =
		common.attrs
	caption.inner =
		( common.inner.flow )

# #####################################################################
## Table Super Structure

## Table Column Group: <colgroup>

	colgroup.elem =
		element colgroup { colgroup.inner & colgroup.attrs }
	colgroup.attrs =
		common.attrs
		colgroup.attrs.span =
			attribute span {
				common.data.integer.positive
			}
	colgroup.inner =
		(	(	col.elem*
			&	common.elem.script-supporting*
			)
			|	colgroup.attrs.span?
		)

## Table Column: <col>

	col.elem =
		element col { col.inner & col.attrs }
	col.attrs =
		(	common.attrs
		&	col.attrs.span?
		)
		col.attrs.span =
			attribute span {
				common.data.integer.positive
			}
	col.inner =
		( empty )

## Table Header Row Group

	thead.elem =
		element thead { thead.inner & thead.attrs }
	thead.attrs =
		(	common.attrs
		&	(	common.attrs.aria.implicit.rowgroup
			|	common.attrs.aria
			)?
		)
	thead.inner =
		(	tr.elem*
		&	common.elem.script-supporting*
		)

## Table Footer Row Group

	tfoot.elem =
		element tfoot { tfoot.inner & tfoot.attrs }
	tfoot.attrs =
		(	common.attrs
		&	(	common.attrs.aria.implicit.rowgroup
			|	common.attrs.aria
			)?
		)
	tfoot.inner =
		(	tr.elem*
		&	common.elem.script-supporting*
		)

## Table Row Group

	tbody.elem =
		element tbody { tbody.inner & tbody.attrs }
	tbody.attrs =
		(	common.attrs
		&	(	common.attrs.aria.implicit.rowgroup
			|	common.attrs.aria
			)?
		)
	tbody.inner =
		(	tr.elem*
		&	common.elem.script-supporting*
		)

# #####################################################################
## Cell Structure

## Table Row

	tr.elem =
		element tr { tr.inner & tr.attrs }
	tr.attrs =
		(	common.attrs
		&	(	common.attrs.aria.implicit.row
			|	common.attrs.aria
			)?
		)
	tr.inner =
		( ( td.elem | th.elem | common.elem.script-supporting )* )

## Common Table Cell Attributes

	tables.attrs.cell-structure =
		(	tables.attrs.colspan?
		&	tables.attrs.rowspan?
		)
		tables.attrs.colspan =
			attribute colspan {
				common.data.integer.positive
			}
		tables.attrs.rowspan =
			attribute rowspan {
				common.data.integer.non-negative
			}

	tables.attrs.access-headers =
		( tables.attrs.headers? )
		tables.attrs.headers =
			attribute headers {
				common.data.idrefs
			}

	tables.attrs.define-headers =
		( tables.attrs.scope? )
		tables.attrs.scope =
			attribute scope {
				(	w:string "row"
				|	w:string "col"
				|	w:string "rowgroup"
				|	w:string "colgroup"
				)
			}
		tables.attrs.abbr =
			attribute abbr {
				text
			}

## Table Data Cell: <td>

	td.elem =
		element td { td.inner & td.attrs }
	td.attrs =
		(	common.attrs
		&	tables.attrs.cell-structure
		&	tables.attrs.headers?
#		&	tables.attrs.alignment
		&	(	common.attrs.aria.implicit.cell
			|	common.attrs.aria.implicit.gridcell
			|	common.attrs.aria
			)?
		)
	td.inner =
		( common.inner.flow )

## Table Header Cells: <th>

	th.elem =
		element th { th.inner & th.attrs }
	th.attrs =
		(	common.attrs
		&	tables.attrs.cell-structure
		&	tables.attrs.scope?
		&	tables.attrs.headers?
#		&	tables.attrs.alignment
		&	(	common.attrs.aria?
			|	common.attrs.aria.implicit.column-or-row-header
			)
		)
	th.inner =
		( common.inner.flow )
