[ xml:id = "datatypes-common" ]
div {
  datatype.ID = datatype.ID.lexical
  datatype.IDREF = datatype.IDREF.lexical
  datatype.IDREFS = datatype.IDREFS.lexical
    
  datatype.languagecode = datatype.BCP47
  # http://www.w3.org/TR/xmlschema11-2/#language
  datatype.BCP47 = xsd:language { pattern = "[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*" }
  # http://www.w3.org/TR/xmlschema11-2/#ID  
  datatype.ID.xsd = xsd:ID
  # http://www.w3.org/TR/xmlschema11-2/#NCName
  datatype.IDREF.lexical = xsd:NCName
  datatype.IDREFS.lexical = list { datatype.IDREF.lexical+ }
  datatype.ID.lexical = xsd:NCName
  # http://www.w3.org/TR/xmlschema11-2/#IDREF
  datatype.IDREF.xsd = xsd:IDREF
  # http://www.w3.org/TR/xmlschema11-2/#IDREFS
  datatype.IDREFS.xsd = xsd:IDREFS  
  # http://www.w3.org/TR/xmlschema11-2/#NMTOKEN
  datatype.NMTOKEN = xsd:NMTOKEN
  # http://www.w3.org/TR/xmlschema11-2/#NMTOKENS  
  datatype.NMTOKENS = xsd:NMTOKENS
  # http://www.w3.org/TR/xmlschema11-2/#string
  datatype.string = xsd:string
  datatype.string.nonempty = xsd:token { minLength='1' }    
  datatype.text = text
  # http://www.w3.org/TR/xmlschema11-2/#nt-dateRep
  datatype.date = xsd:date
  # http://www.w3.org/TR/xmlschema11-2/#nt-dateTimeRep
  datatype.dateTime = xsd:dateTime
  # http://www.w3.org/TR/xmlschema11-2/#nt-timeRep
  datatype.date.or.dateTime = datatype.date | datatype.dateTime     
  datatype.LEIRI = xsd:anyURI
  # http://www.w3.org/TR/xmlschema11-2/#anyURI
  # http://tools.ietf.org/html/rfc3986#appendix-B
  # http://www.w3.org/TR/html5/urls.html#valid-url-potentially-surrounded-by-spaces  
  datatype.URI = xsd:anyURI
  datatype.URI.absolute = xsd:anyURI
  datatype.IRI = datatype.URI  
  datatype.character.encoding = datatype.iana.charset
  datatype.iana.charset = xsd:NMTOKEN  
  # http://www.w3.org/TR/html5/infrastructure.html#valid-mime-type
  # http://tools.ietf.org/html/rfc4288#section-4.2
  # http://tools.ietf.org/html/rfc2616#section-3.7
  datatype.mimetype = xsd:string { pattern='[a-zA-Z0-9!#$&+\-\^_]+/[a-zA-Z0-9!#$&+\-\^_]+.*' }  
  datatype.mimetype.nocharset = datatype.mimetype
  # http://www.w3.org/TR/xmlschema11-2/#nonNegativeInteger
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#non-negative-integers
  datatype.non-negative.integer = xsd:nonNegativeInteger
  # http://www.w3.org/TR/xmlschema11-2/#positiveInteger
  datatype.positive.integer = xsd:positiveInteger
  # http://www.w3.org/TR/xmlschema11-2/#integer  
  datatype.integer = xsd:integer
  # http://www.w3.org/TR/xmlschema11-2/#nt-floatRep
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#real-numbers
  datatype.float = xsd:float
  datatype.float.positive = xsd:float { minExclusive = '0'}
  datatype.float.non-negative = xsd:float { minInclusive = '0' }
  datatype.token = xsd:string { pattern = '[^\s]+' }
  datatype.space.separated.tokens = list { datatype.token* }
  
}
[ xml:id = "datatypes-smil" ]
div {
  # http://www.w3.org/TR/smil/smil-timing.html#TimingSyntax-Full-clock-value
  # http://www.w3.org/TR/smil/smil-timing.html#TimingSyntax-Partial-clock-value
  # http://www.w3.org/TR/smil/smil-timing.html#TimingSyntax-Timecount-value
  datatype.smil.npt =
    xsd:string { pattern = "(\s*)[0-9]+:[0-5][0-9]:[0-5][0-9](\.[0-9]+)?(\s*)" }
  | xsd:string { pattern = "(\s*)[0-5][0-9]:[0-5][0-9](\.[0-9]+)?(\s*)" }
  | xsd:string { pattern = "(\s*)[0-9]+(\.[0-9]+)?(h|min|s|ms)?(\s*)" }          
}

[ xml:id = "datatypes-vocab" ]
div {
  datatype.property = xsd:NMTOKEN
  datatype.properties = xsd:NMTOKENS
  datatype.prefixdecl = text  #\s*([\i-[:]][\c-[:]]*: +[^ ]+)(\s+[\i-[:]][\c-[:]]*: +[^ ]+)*\s*
}

[ xml:id = "datatypes-ssml" ]
div {
  # http://www.w3.org/TR/speech-synthesis11/#edef_phoneme
  datatype.ssml.PhoneticExpression = xsd:string
  datatype.ssml.PhoneticAlphabet = xsd:string { pattern = "(ipa|x-.+)" }
}

[ xml:id = "datatypes-html5" ]
div {
  datatype.html5.browsing.context.name.or.keyword = xsd:string { pattern = "()|([^_].*)|(_[bB][lL][aA][nN][kK])|(_[sS][eE][lL][fF])|(_[pP][aA][rR][eE][nN][tT])|(_[tT][oO][pP])" }
  datatype.html5.browsing.context.name = xsd:string { pattern = "()|([^_].*)" }  
  datatype.html5.token = xsd:string { pattern = '[^\s]+' }
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#space-separated-tokens
  datatype.html5.space.separated.tokens = list { datatype.html5.token* }
  datatype.html5.ordered.set.unique.tokens = datatype.html5.space.separated.tokens  
  datatype.html5.URL.spaces = datatype.URI
  # http://dev.w3.org/csswg/css3-mediaqueries/#syntax
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#mq
  datatype.html5.media.query = xsd:string
  datatype.html5.name = xsd:string
  datatype.html5.name.reference = xsd:string { pattern = "#.+" }
  
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#months
  datatype.html5.month = xsd:token { pattern ='([0-9]{4,})-([0-9]{2})' }  
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#dates
  datatype.html5.date = xsd:token { pattern ='([0-9]{4,})-([0-9]{2})-([0-9]{2})'}
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#times
  datatype.html5.time = xsd:token { pattern ='([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]+)?)?'}
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#local-dates-and-times
  datatype.html5.datetime.local = xsd:token { pattern = '([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]+)?)?' }
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#global-dates-and-times
  datatype.html5.datetime.global = xsd:token { pattern = '([0-9]{4,})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(:[0-9]{2}(\.[0-9]+)?)?(Z|((\+|-)([0-9]{2}):([0-9]{2})))' }  
  datatype.html5.datetime = datatype.html5.datetime.global
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#vaguer-moments-in-time
  datatype.html5.date.or.time = datatype.html5.date | datatype.html5.month | datatype.html5.time | datatype.html5.datetime.global
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#vaguer-moments-in-time
  datatype.html5.date.optional.time = datatype.html5.date | datatype.html5.datetime.global
  datatype.html5.week = xsd:token { pattern ='([0-9]{4,})-W([0-9]{2})' }
  
  datatype.html5.accesskey = datatype.html5.ordered.set.unique.tokens
  datatype.html5.coords.rectangle = xsd:token { pattern = "-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+" }
  datatype.html5.coords.circle = xsd:token { pattern = "-?[0-9]+,-?[0-9]+,[0-9]+" }
  datatype.html5.coords.poly = xsd:token { pattern = "-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+(,-?[0-9]+,-?[0-9]+)*" }
  datatype.html5.js = xsd:string
  datatype.html5.script = xsd:string
  datatype.html5.script.documentation = xsd:string
  datatype.html5.iframe.srcdoc.xml = xsd:string
  datatype.style = xsd:string
  datatype.html5.sizes = list { xsd:string { pattern = "[1-9][0-9]*x[1-9][0-9]*" }+ }
  datatype.html5.emailaddress = xsd:string { pattern = "[^@]+@[^@]+" }
  datatype.html5.emailaddresslist = xsd:string { pattern = "([^@]+@[^@]+,)*([^@]+@[^@]+)" }
  # http://www.w3.org/TR/html5/common-microsyntaxes.html#colors
  datatype.html5.color = xsd:string { pattern = '#([A-Fa-f0-9]{6})' }
}

[ xml:id = "datatypes-html5forms" ]
div {
  datatype.html5.forms.mimetypelist = xsd:string
  # http://www.w3.org/TR/html5/forms.html#attr-form-accept-charset
  datatype.html5.forms.charsetlist = list { datatype.character.encoding+ }
  datatype.html5.forms.pattern = xsd:string  
  datatype.html5.forms.string.nolinebreaks = xsd:string 
}

