]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/FeedSub/extlib/XML/Feed/schemas/atom.rnc
Initial functional version of feed subscription plugin, currently supporting only...
[quix0rs-gnu-social.git] / plugins / FeedSub / extlib / XML / Feed / schemas / atom.rnc
1 # -*- rnc -*-
2 # RELAX NG Compact Syntax Grammar for the
3 # Atom Format Specification Version 11
4
5 namespace atom = "http://www.w3.org/2005/Atom"
6 namespace xhtml = "http://www.w3.org/1999/xhtml"
7 namespace s = "http://www.ascc.net/xml/schematron"
8 namespace local = ""
9
10 start = atomFeed | atomEntry
11
12 # Common attributes
13
14 atomCommonAttributes =
15    attribute xml:base { atomUri }?,
16    attribute xml:lang { atomLanguageTag }?,
17    undefinedAttribute*
18
19 # Text Constructs
20
21 atomPlainTextConstruct =
22    atomCommonAttributes,
23    attribute type { "text" | "html" }?,
24    text
25
26 atomXHTMLTextConstruct =
27    atomCommonAttributes,
28    attribute type { "xhtml" },
29    xhtmlDiv
30
31 atomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct
32
33 # Person Construct
34
35 atomPersonConstruct =
36    atomCommonAttributes,
37    (element atom:name { text }
38     & element atom:uri { atomUri }?
39     & element atom:email { atomEmailAddress }?
40     & extensionElement*)
41
42 # Date Construct
43
44 atomDateConstruct =
45    atomCommonAttributes,
46    xsd:dateTime
47
48 # atom:feed
49
50 atomFeed =
51    [
52       s:rule [
53          context = "atom:feed"
54          s:assert [
55             test = "atom:author or not(atom:entry[not(atom:author)])"
56             "An atom:feed must have an atom:author unless all "
57             ~ "of its atom:entry children have an atom:author."
58          ]
59       ]
60    ]
61    element atom:feed {
62       atomCommonAttributes,
63       (atomAuthor*
64        & atomCategory*
65        & atomContributor*
66        & atomGenerator?
67        & atomIcon?
68        & atomId
69        & atomLink*
70        & atomLogo?
71        & atomRights?
72        & atomSubtitle?
73        & atomTitle
74        & atomUpdated
75        & extensionElement*),
76       atomEntry*
77    }
78
79 # atom:entry
80
81 atomEntry =
82    [
83       s:rule [
84          context = "atom:entry"
85          s:assert [
86             test = "atom:link[@rel='alternate'] "
87             ~ "or atom:link[not(@rel)] "
88             ~ "or atom:content"
89             "An atom:entry must have at least one atom:link element "
90             ~ "with a rel attribute of 'alternate' "
91             ~ "or an atom:content."
92          ]
93       ]
94       s:rule [
95          context = "atom:entry"
96          s:assert [
97             test = "atom:author or "
98             ~ "../atom:author or atom:source/atom:author"
99             "An atom:entry must have an atom:author "
100             ~ "if its feed does not."
101          ]
102       ]
103    ]
104    element atom:entry {
105       atomCommonAttributes,
106       (atomAuthor*
107        & atomCategory*
108        & atomContent?
109        & atomContributor*
110        & atomId
111        & atomLink*
112        & atomPublished?
113        & atomRights?
114        & atomSource?
115        & atomSummary?
116        & atomTitle
117        & atomUpdated
118        & extensionElement*)
119    }
120
121 # atom:content
122
123 atomInlineTextContent =
124    element atom:content {
125       atomCommonAttributes,
126       attribute type { "text" | "html" }?,
127       (text)*
128    }
129
130 atomInlineXHTMLContent =
131    element atom:content {
132       atomCommonAttributes,
133       attribute type { "xhtml" },
134       xhtmlDiv
135    }
136
137 atomInlineOtherContent =
138    element atom:content {
139       atomCommonAttributes,
140       attribute type { atomMediaType }?,
141       (text|anyElement)*
142    }
143
144 atomOutOfLineContent =
145    element atom:content {
146       atomCommonAttributes,
147       attribute type { atomMediaType }?,
148       attribute src { atomUri },
149       empty
150    }
151
152 atomContent = atomInlineTextContent
153  | atomInlineXHTMLContent
154  | atomInlineOtherContent
155  | atomOutOfLineContent
156
157 # atom:author
158
159 atomAuthor = element atom:author { atomPersonConstruct }
160
161 # atom:category
162
163 atomCategory =
164    element atom:category {
165       atomCommonAttributes,
166       attribute term { text },
167       attribute scheme { atomUri }?,
168       attribute label { text }?,
169       undefinedContent
170    }
171
172 # atom:contributor
173
174 atomContributor = element atom:contributor { atomPersonConstruct }
175
176 # atom:generator
177
178 atomGenerator = element atom:generator {
179    atomCommonAttributes,
180    attribute uri { atomUri }?,
181    attribute version { text }?,
182    text
183 }
184
185 # atom:icon
186
187 atomIcon = element atom:icon {
188    atomCommonAttributes,
189    (atomUri)
190 }
191
192 # atom:id
193
194 atomId = element atom:id {
195    atomCommonAttributes,
196    (atomUri)
197 }
198
199 # atom:logo
200
201 atomLogo = element atom:logo {
202    atomCommonAttributes,
203    (atomUri)
204 }
205
206 # atom:link
207
208 atomLink =
209    element atom:link {
210       atomCommonAttributes,
211       attribute href { atomUri },
212       attribute rel { atomNCName | atomUri }?,
213       attribute type { atomMediaType }?,
214       attribute hreflang { atomLanguageTag }?,
215       attribute title { text }?,
216       attribute length { text }?,
217       undefinedContent
218    }
219
220 # atom:published
221
222 atomPublished = element atom:published { atomDateConstruct }
223
224 # atom:rights
225
226 atomRights = element atom:rights { atomTextConstruct }
227
228 # atom:source
229
230 atomSource =
231    element atom:source {
232       atomCommonAttributes,
233       (atomAuthor*
234        & atomCategory*
235        & atomContributor*
236        & atomGenerator?
237        & atomIcon?
238        & atomId?
239        & atomLink*
240        & atomLogo?
241        & atomRights?
242        & atomSubtitle?
243        & atomTitle?
244        & atomUpdated?
245        & extensionElement*)
246    }
247
248 # atom:subtitle
249
250 atomSubtitle = element atom:subtitle { atomTextConstruct }
251
252 # atom:summary
253
254 atomSummary = element atom:summary { atomTextConstruct }
255
256 # atom:title
257
258 atomTitle = element atom:title { atomTextConstruct }
259
260 # atom:updated
261
262 atomUpdated = element atom:updated { atomDateConstruct }
263
264 # Low-level simple types
265
266 atomNCName = xsd:string { minLength = "1" pattern = "[^:]*" }
267
268 # Whatever a media type is, it contains at least one slash
269 atomMediaType = xsd:string { pattern = ".+/.+" }
270
271 # As defined in RFC 3066
272 atomLanguageTag = xsd:string {
273    pattern = "[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*"
274 }
275
276 # Unconstrained; it's not entirely clear how IRI fit into
277 # xsd:anyURI so let's not try to constrain it here
278 atomUri = text
279
280 # Whatever an email address is, it contains at least one @
281 atomEmailAddress = xsd:string { pattern = ".+@.+" }
282
283 # Simple Extension
284
285 simpleExtensionElement =
286    element * - atom:* {
287       text
288    }
289
290 # Structured Extension
291
292 structuredExtensionElement =
293    element * - atom:* {
294       (attribute * { text }+,
295          (text|anyElement)*)
296     | (attribute * { text }*,
297        (text?, anyElement+, (text|anyElement)*))
298    }
299
300 # Other Extensibility
301
302 extensionElement =
303    simpleExtensionElement | structuredExtensionElement
304
305 undefinedAttribute =
306   attribute * - (xml:base | xml:lang | local:*) { text }
307
308 undefinedContent = (text|anyForeignElement)*
309
310 anyElement =
311    element * {
312       (attribute * { text }
313        | text
314        | anyElement)*
315    }
316
317 anyForeignElement =
318    element * - atom:* {
319       (attribute * { text }
320        | text
321        | anyElement)*
322    }
323
324 # XHTML
325
326 anyXHTML = element xhtml:* {
327    (attribute * { text }
328     | text
329     | anyXHTML)*
330 }
331
332 xhtmlDiv = element xhtml:div {
333    (attribute * { text }
334     | text
335     | anyXHTML)*
336 }
337
338 # EOF