Commit | Line | Data |
---|---|---|
ab422c4d | 1 | # Copyright (C) 2003-2004, 2007-2013 Free Software Foundation, Inc. |
14760e95 CY |
2 | |
3 | # This file is part of GNU Emacs. | |
4 | ||
5 | # GNU Emacs is free software: you can redistribute it and/or modify | |
6 | # it under the terms of the GNU General Public License as published by | |
7 | # the Free Software Foundation, either version 3 of the License, or | |
8 | # (at your option) any later version. | |
9 | ||
10 | # GNU Emacs is distributed in the hope that it will be useful, | |
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | # GNU General Public License for more details. | |
14 | ||
15 | # You should have received a copy of the GNU General Public License | |
16 | # along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | |
17 | ||
8cd39fb3 MH |
18 | default namespace this = "http://thaiopensource.com/ns/locating-rules/1.0" |
19 | namespace local = "" | |
20 | ||
21 | start = locatingRules | |
22 | ||
23 | locatingRules = element locatingRules { common, rule* } | |
24 | ||
25 | rule = | |
26 | \include | |
27 | # | group | |
28 | | applyFollowingRules | |
29 | | documentElement | |
30 | # | doctypePublicId | |
31 | | \namespace | |
32 | | uri | |
33 | | transformURI | |
34 | # | typeIdProcessingInstruction | |
35 | | \default | |
36 | | typeId | |
37 | # | typeIdBase | |
38 | | extensionRule | |
39 | ||
40 | ## Group of rules. Useful with xml:base. | |
41 | group = element group { common, rule* } | |
42 | ||
43 | \include = | |
44 | element include { | |
45 | common, | |
46 | attribute rules { xsd:anyURI } | |
47 | } | |
48 | ||
49 | applyFollowingRules = | |
50 | element applyFollowingRules { | |
51 | common, | |
52 | attribute ruleType { | |
53 | "documentElement" | |
54 | | "doctypePublicId" | |
55 | | "namespace" | |
56 | | "uri" | |
57 | | "transformURI" | |
58 | | "typeIdProcessingInstruction" | |
59 | | "default" | |
60 | } | |
61 | } | |
62 | ||
63 | documentElement = | |
64 | ## Matches if the prefix and/or local name of document element | |
65 | ## match the values of the prefix and localName attributes. | |
66 | element documentElement { | |
67 | common, | |
68 | nameAtts, | |
69 | targetAtt | |
70 | } | |
71 | ||
72 | ## If there's no prefix attribute, then only the local name must match. | |
73 | ## If there's no local name attribute, then only the prefix must match. | |
74 | nameAtts = (prefixAtt, localNameAtt?) | localNameAtt | |
75 | ||
76 | ## prefix="" matches if the document element has no prefix. | |
77 | prefixAtt = attribute prefix { (xsd:NCName - "xmlns") | "" } | |
78 | localNameAtt = attribute localName { xsd:NCName - "xmlns" } | |
79 | ||
80 | doctypePublicId = | |
81 | ## Matches if the document has a DOCTYPE declaration with a public | |
82 | ## identifier that, after normalization, matches the value of the | |
83 | ## publicId attribute. | |
84 | element doctypePublicId { | |
85 | common, | |
86 | attribute publicId { publicIdValue }, | |
87 | targetAtt | |
88 | } | |
89 | ||
90 | publicIdValue = | |
91 | xsd:token { | |
92 | ## Newline and tab are excluded, because pattern applies to | |
93 | ## the post-normalization value. | |
94 | pattern = "[\-'()+,./:=?;!*#@$_%a-zA-Z0-9 ]*" | |
95 | } | |
96 | ||
97 | # This is separate from documentElement so it can be distinguished | |
98 | # by applyFollowingRules. | |
99 | \namespace = | |
100 | ## Matches if the document element has a namespace URI equal to the value | |
101 | ## of the ns attribute. A document element with no namespace matches if | |
102 | ## the value of the ns attribute is the empty string. | |
103 | element namespace { | |
104 | common, | |
105 | attribute ns { xsd:string }, | |
106 | targetAtt | |
107 | } | |
108 | ||
109 | uri = | |
110 | ## Matches based on the URI of the document. | |
111 | element uri { | |
112 | common, | |
113 | (resourceAtt | patternAtt), | |
114 | targetAtt | |
115 | } | |
116 | ||
117 | ## Matches if it can be determined that the document resource is | |
118 | ## the same resource as that identified by the value of the resource | |
119 | ## attribute. In determining this, the implementation should apply | |
120 | ## the semantics of the URI scheme used by the URI. | |
121 | resourceAtt = attribute resource { xsd:anyURI } | |
122 | ||
123 | ## Matches if the document's URI matches the pattern specified | |
124 | ## by the pattern attribute. A * in the path component matches | |
125 | ## zero or more characters other than / (after resolving escapes). | |
126 | ## If the pattern is a relative URI, it means that there must | |
127 | ## be some URI such that when the pattern is resolved relative | |
128 | ## to that URI, it matches the document's URI. Thus an empty | |
129 | ## pattern will always match. | |
130 | patternAtt = attribute pattern { uriPattern } | |
131 | ||
132 | ## A pattern for a URI. Same syntax as a URI, except that a * in | |
133 | ## the path component has a special meaning. | |
134 | uriPattern = xsd:anyURI | |
135 | ||
136 | transformURI = | |
137 | ## Generates a URI for the related resource by transforming | |
138 | ## the URI of the document. Matches if the transformation | |
139 | ## yields a valid URI that identifies an existing resource. | |
140 | element transformURI { | |
141 | common, | |
142 | ## Semantics are the same as the pattern attribute of the uri element. | |
143 | attribute fromPattern { uriPattern }, | |
144 | ## The result of the transformation is produced from the toPattern | |
145 | ## by replacing each * by the string that matched the corresponding | |
146 | ## * in the toPattern. The toPattern is appended to the initial | |
147 | ## part of the document's URI that was not explicitly matched | |
148 | ## by fromPattern. | |
149 | attribute toPattern { uriPattern } | |
150 | } | |
151 | ||
152 | \default = | |
153 | ## Always matches. | |
154 | element default { | |
155 | common, | |
156 | targetAtt | |
157 | } | |
158 | ||
159 | ## A document can be mapped onto a URI either indirectly via a typeId | |
160 | ## or directly. | |
161 | targetAtt = uriAtt | typeIdAtt | |
162 | ||
163 | ## Specifies the URI of the related resource. | |
164 | ## xml:base is used if it's relative. | |
165 | uriAtt = attribute uri { xsd:anyURI } | |
166 | ||
167 | ## Specifies an identifier of the type of document. typeId and | |
168 | ## typeIdBase rules will be used to map this to a URI. | |
169 | typeIdAtt = attribute typeId { typeIdValue } | |
170 | ||
171 | ## A type identifier can be anything convenient (e.g. a public identifier, | |
172 | ## a URL or just a string with no formal structure). Whitespace is | |
173 | ## normalized like a public identifier before comparing type identifiers | |
174 | ## for equality. | |
175 | typeIdValue = xsd:token | |
176 | ||
177 | typeIdProcessingInstruction = | |
178 | ## Matches if there's a processing instruction in the prolog | |
179 | ## before any DOCTYPE declaration whose target is the value of | |
180 | ## the target attribute. The value of the processing instruction | |
181 | ## is interpreted as a typeId, which will be mapped to a | |
182 | ## URI as normal. | |
183 | element typeIdProcessingInstruction { | |
184 | common, | |
185 | attribute target { xsd:NCName } | |
186 | } | |
187 | ||
188 | typeId = | |
189 | ## Maps a typeId onto a URI. | |
190 | element typeId { | |
191 | common, | |
192 | attribute id { typeIdValue }, | |
193 | targetAtt | |
194 | } | |
195 | ||
196 | typeIdBase = | |
197 | ## Used to map a typeId onto a URI. First, any URI reserved characters | |
198 | ## are URI encoded. If the append attribute is specified, it is appended. | |
199 | ## This is then treated as a URI. If relative, it is resolved using | |
200 | ## the applicable base URI as usual. If the resulting URI identifies | |
201 | ## an existing resource, then the typeId is mapped to this resource. | |
202 | ## This is intended to be useful with file URIs. | |
203 | element typeIdBase { | |
204 | common, | |
205 | attribute append { xsd:string }? | |
206 | } | |
207 | ||
208 | extensionRule = | |
209 | element * - this:* { | |
210 | attribute * { text }*, (text|anyElement)* | |
211 | } | |
212 | ||
213 | anyElement = element * { attribute * { text }*, (text|anyElement)* } | |
214 | ||
215 | common = | |
216 | # attribute xml:base { xsd:anyURI }?, | |
217 | attribute * - (xml:base|this:*|local:*) { text }* |