A <value> pattern now carries its datatype, so matching compares the instance and the literal in that type's value space rather than purely lexically. Numeric and date/time types compare by value (1 equals 01, 1.5 equals 1.50); booleans treat 1/true and 0/false as equal; string and token compare by their whitespace-normalized lexical form, as before. Untyped values default to the built-in token type, and a bare string literal in the compact syntax is token-typed. Durations and binary types fall under the lexical rule.
45 lines
1.8 KiB
Swift
45 lines
1.8 KiB
Swift
public extension PureXML.Schema {
|
|
/// A RELAX NG name class: which element or attribute names a pattern matches.
|
|
indirect enum NameClass: Sendable {
|
|
case anyName
|
|
case anyNameExcept(NameClass)
|
|
case name(namespace: String, localName: String)
|
|
case nsName(String)
|
|
case nsNameExcept(namespace: String, except: NameClass)
|
|
case choice(NameClass, NameClass)
|
|
|
|
/// Whether `name` is in this class.
|
|
func contains(_ name: PureXML.Model.QualifiedName) -> Bool {
|
|
let namespace = name.namespaceURI ?? ""
|
|
switch self {
|
|
case .anyName: return true
|
|
case let .anyNameExcept(except): return !except.contains(name)
|
|
case let .name(wantedNamespace, wantedLocal): return namespace == wantedNamespace && name.localName == wantedLocal
|
|
case let .nsName(wantedNamespace): return namespace == wantedNamespace
|
|
case let .nsNameExcept(wantedNamespace, except): return namespace == wantedNamespace && !except.contains(name)
|
|
case let .choice(left, right): return left.contains(name) || right.contains(name)
|
|
}
|
|
}
|
|
}
|
|
|
|
/// A RELAX NG pattern (the simplified algebra used by the derivative
|
|
/// algorithm). `optional`, `zeroOrMore`, and `mixed` are expressed through
|
|
/// these constructors; `after` is internal to derivation.
|
|
indirect enum Pattern: Sendable {
|
|
case empty
|
|
case notAllowed
|
|
case text
|
|
case choice(Pattern, Pattern)
|
|
case interleave(Pattern, Pattern)
|
|
case group(Pattern, Pattern)
|
|
case oneOrMore(Pattern)
|
|
case element(NameClass, Pattern)
|
|
case attribute(NameClass, Pattern)
|
|
case data(SimpleType)
|
|
case value(SimpleType, String)
|
|
case list(Pattern)
|
|
case ref(String)
|
|
case after(Pattern, Pattern)
|
|
}
|
|
}
|