metanorma-ietf 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.hound.yml +3 -0
  4. data/.oss-guides.rubocop.yml +1077 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.ribose.yml +65 -0
  7. data/.rubocop.tb.yml +650 -0
  8. data/.rubocop.yml +15 -0
  9. data/.travis.yml +23 -0
  10. data/CODE_OF_CONDUCT.md +74 -0
  11. data/Gemfile +4 -0
  12. data/Guardfile +22 -0
  13. data/LICENSE +25 -0
  14. data/README.adoc +1660 -0
  15. data/Rakefile +6 -0
  16. data/bin/asciidoctor-rfc2 +14 -0
  17. data/bin/asciidoctor-rfc3 +14 -0
  18. data/bin/console +14 -0
  19. data/bin/rspec +17 -0
  20. data/bin/setup +8 -0
  21. data/docs/installation.md +21 -0
  22. data/docs/navigation.md +10 -0
  23. data/docs/overview.md +5 -0
  24. data/lib/asciidoctor/rfc.rb +8 -0
  25. data/lib/asciidoctor/rfc/common/base.rb +531 -0
  26. data/lib/asciidoctor/rfc/common/front.rb +120 -0
  27. data/lib/asciidoctor/rfc/v2/base.rb +379 -0
  28. data/lib/asciidoctor/rfc/v2/blocks.rb +261 -0
  29. data/lib/asciidoctor/rfc/v2/converter.rb +60 -0
  30. data/lib/asciidoctor/rfc/v2/front.rb +69 -0
  31. data/lib/asciidoctor/rfc/v2/inline_anchor.rb +111 -0
  32. data/lib/asciidoctor/rfc/v2/lists.rb +135 -0
  33. data/lib/asciidoctor/rfc/v2/table.rb +114 -0
  34. data/lib/asciidoctor/rfc/v2/validate.rb +32 -0
  35. data/lib/asciidoctor/rfc/v2/validate2.rng +716 -0
  36. data/lib/asciidoctor/rfc/v3/base.rb +329 -0
  37. data/lib/asciidoctor/rfc/v3/blocks.rb +246 -0
  38. data/lib/asciidoctor/rfc/v3/converter.rb +62 -0
  39. data/lib/asciidoctor/rfc/v3/front.rb +122 -0
  40. data/lib/asciidoctor/rfc/v3/inline_anchor.rb +89 -0
  41. data/lib/asciidoctor/rfc/v3/lists.rb +176 -0
  42. data/lib/asciidoctor/rfc/v3/svg.rng +9081 -0
  43. data/lib/asciidoctor/rfc/v3/table.rb +65 -0
  44. data/lib/asciidoctor/rfc/v3/validate.rb +34 -0
  45. data/lib/asciidoctor/rfc/v3/validate.rng +2143 -0
  46. data/lib/metanorma-ietf.rb +7 -0
  47. data/lib/metanorma/ietf.rb +8 -0
  48. data/lib/metanorma/ietf/processor.rb +89 -0
  49. data/lib/metanorma/ietf/version.rb +5 -0
  50. data/metanorma-ietf.gemspec +51 -0
  51. data/rfc2629-other.ent +61 -0
  52. data/rfc2629-xhtml.ent +165 -0
  53. data/rfc2629.dtd +312 -0
  54. metadata +289 -0
@@ -0,0 +1,135 @@
1
+ module Asciidoctor
2
+ module Rfc::V2
3
+ module Lists
4
+ # Syntax:
5
+ # * A
6
+ # * B
7
+ def ulist(node)
8
+ noko { |xml| wrap_list :ulist_naked, node, xml }
9
+ end
10
+
11
+ OLIST_TYPES = Hash.new("numbers").merge(
12
+ arabic: "numbers",
13
+ # decimal: "1", # not supported
14
+ loweralpha: "letters",
15
+ # lowergreek: "lower-greek", # not supported
16
+ lowerroman: "format %i.",
17
+ upperalpha: "format %C.",
18
+ upperroman: "format %I.",
19
+ ).freeze
20
+
21
+ # Syntax:
22
+ # [counter=token] (optional)
23
+ # . A
24
+ # . B
25
+ def olist(node)
26
+ noko { |xml| wrap_list :olist_naked, node, xml }
27
+ end
28
+
29
+ # Syntax:
30
+ # [hangIndent=n] (optional)
31
+ # A:: B
32
+ # C:: D
33
+ def dlist(node)
34
+ noko { |xml| wrap_list :dlist_naked, node, xml }
35
+ end
36
+
37
+ private
38
+
39
+ def wrap_list(method_name, node, xml)
40
+ if node.parent.context !~ /paragraph|list_item/
41
+ xml.t do |xml_t|
42
+ send method_name, node, xml_t
43
+ end
44
+ else
45
+ send method_name, node, xml
46
+ end
47
+ end
48
+
49
+ def ulist_naked(node, xml)
50
+ style = "symbols"
51
+ style = "empty" if node.attr("style") == "empty"
52
+ style = "empty" if node.option?("empty")
53
+ list_attributes = {
54
+ style: style,
55
+ hangIndent: node.attr("hang-indent"),
56
+ }
57
+
58
+ xml.list **attr_code(list_attributes) do |xml_list|
59
+ node.items.each do |item|
60
+ t_attributes = {
61
+ anchor: nil,
62
+ }
63
+
64
+ xml_list.t **attr_code(t_attributes) do |xml_t|
65
+ xml_t << item.text
66
+ xml_t << para_to_vspace(item.content) if item.blocks?
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ def olist_naked(node, xml)
73
+ style = OLIST_TYPES[node.style.to_sym]
74
+ style = "empty" if node.attr("style") == "empty"
75
+ style = "format #{node.attr('format')}" unless node.attr("format").nil?
76
+ list_attributes = {
77
+ hangIndent: node.attr("hang-indent"),
78
+ counter: node.attr("counter"),
79
+ style: style,
80
+ }
81
+
82
+ xml.list **attr_code(list_attributes) do |xml_list|
83
+ node.items.each do |item|
84
+ t_attributes = {
85
+ anchor: item.id,
86
+ }
87
+
88
+ xml_list.t **attr_code(t_attributes) do |xml_t|
89
+ xml_t << item.text
90
+ xml_t << para_to_vspace(item.content) if item.blocks?
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ def dlist_naked(node, xml)
97
+ style = "hanging"
98
+ style = "empty" if node.attr("style") == "empty"
99
+ list_attributes = {
100
+ hangIndent: node.attr("hang-indent"),
101
+ style: style,
102
+ }
103
+
104
+ xml.list **attr_code(list_attributes) do |xml_list|
105
+ node.items.each do |terms, dd|
106
+ # all but last term have empty dd
107
+ terms.each_with_index do |term, idx|
108
+ t_attributes = {
109
+ hangText: flatten_rawtext(term.text).join(" "),
110
+ }
111
+
112
+ if idx < terms.size - 1
113
+ xml_list.t **attr_code(t_attributes)
114
+ else
115
+ xml_list.t **attr_code(t_attributes) do |xml_t|
116
+ if !dd.nil? && dd.text?
117
+ # This vspace element is extraneous to the RFC XML spec,
118
+ # but is required by IDNITS
119
+ xml_t.vspace(blankLines: "1") unless $inline_definition_lists
120
+ xml_t << dd.text
121
+ end
122
+ if !dd.nil? && dd.blocks?
123
+ # v2 does not support multi paragraph list items;
124
+ # vspace is used to emulate them
125
+ xml_t << para_to_vspace(dd.content)
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,114 @@
1
+ module Asciidoctor
2
+ module Rfc::V2
3
+ module Table
4
+ # Syntax:
5
+ # [[id]]
6
+ # .Title
7
+ # [suppress-title,align,style]
8
+ # |===
9
+ # |col | col
10
+ # |===
11
+ def table(node)
12
+ has_body = false
13
+ has_head = false
14
+ style_value = case node.attr "grid"
15
+ when "all"
16
+ "all"
17
+ when "rows"
18
+ "headers"
19
+ when "cols"
20
+ "full"
21
+ when "none"
22
+ "none"
23
+ else
24
+ "full"
25
+ end
26
+ warn "asciidoctor: WARNING (#{current_location(node)}): grid=rows attribute is not supported on tables" if node.attr("grid") == "rows"
27
+ texttable_attributes = {
28
+ anchor: node.id,
29
+ title: node.title,
30
+ 'suppress-title': node.attr("supress-title") ? true : false,
31
+ align: node.attr("align"),
32
+ style: style_value,
33
+ }
34
+
35
+ noko do |xml|
36
+ xml.texttable **attr_code(texttable_attributes) do |xml_texttable|
37
+ [:head, :body, :foot].reject { |tblsec| node.rows[tblsec].empty? }.each do |tblsec|
38
+ has_body = true if tblsec == :body
39
+ has_head = true if tblsec == :head
40
+ end
41
+ warn "asciidoctor: WARNING (#{current_location(node)}): tables must have at least one body row" unless has_body
42
+ warn "asciidoctor: WARNING (#{current_location(node)}): tables must have at least one head row" unless has_head
43
+
44
+ # preamble, postamble elements not supported
45
+ table_head node, xml_texttable
46
+ table_body_and_foot node, xml_texttable
47
+ end
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def table_head(node, xml)
54
+ [:head].reject { |tblsec| node.rows[tblsec].empty? }.each do |tblsec|
55
+ warn "asciidoctor: WARNING (#{current_location(node)}): RFC XML v2 tables only support a single header row" if node.rows[tblsec].size > 1
56
+ widths = table_widths(node)
57
+ node.rows[tblsec].each do |row|
58
+ rowlength = 0
59
+ row.each_with_index do |cell, i|
60
+ warn "asciidoctor: WARNING (#{current_location(node)}): RFC XML v2 tables do not support colspan attribute" unless cell.colspan.nil?
61
+ warn "asciidoctor: WARNING (#{current_location(node)}): RFC XML v2 tables do not support rowspan attribute" unless cell.rowspan.nil?
62
+ width = if node.option?("autowidth") || i >= widths[:percentage].size || !widths[:named]
63
+ nil
64
+ else
65
+ "#{widths[:percentage][i]}%"
66
+ end
67
+ ttcol_attributes = {
68
+ # NOTE: anchor (ttcol.id) not supported
69
+ align: cell.attr("halign"),
70
+ width: width,
71
+ }
72
+
73
+ rowlength += cell.text.size
74
+ xml.ttcol **attr_code(ttcol_attributes) do |ttcol|
75
+ ttcol << cell.text
76
+ # NOT cell.content: v2 does not permit blocks in cells
77
+ end
78
+ end
79
+ warn "asciidoctor: WARNING (#{current_location(node)}): header row of table is longer than 72 ascii characters" if rowlength > 72
80
+ end
81
+ end
82
+ end
83
+
84
+ def table_widths(node)
85
+ percentage_widths = []
86
+ named_widths = false
87
+ node.columns.each do |col|
88
+ percentage_widths << col.attr("colpcwidth")
89
+ named_widths = true if col.attr("width") != 1
90
+ # 1 is the default set value if no width has been given for the column
91
+ # if a columns widths have been set as [1,1,1,1,...], they will be ignored
92
+ end
93
+ { percentage: percentage_widths, named: named_widths }
94
+ end
95
+
96
+ def table_body_and_foot(node, xml)
97
+ [:body, :foot].reject { |tblsec| node.rows[tblsec].empty? }.each do |tblsec|
98
+ # NOTE: anchor (tblsec.id) not supported
99
+ node.rows[tblsec].each_with_index do |row, i|
100
+ rowlength = 0
101
+ row.each do |cell|
102
+ rowlength += cell.text.size
103
+ xml.c do |c|
104
+ c << cell.text
105
+ # NOT cell.content: v2 does not permit blocks in cells
106
+ end
107
+ end
108
+ warn "asciidoctor: WARNING (#{current_location(node)}): row #{i} of table is longer than 72 ascii characters" if rowlength > 72
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,32 @@
1
+ require "nokogiri"
2
+ require "jing"
3
+
4
+ module Asciidoctor
5
+ module Rfc::V2
6
+ module Validate
7
+ class << self
8
+ def validate(doc)
9
+ filename = File.join(File.dirname(__FILE__), "validate2.rng")
10
+ schema = Jing.new(filename)
11
+
12
+ File.open(".tmp.xml", "w") { |f| f.write(doc.to_xml) }
13
+
14
+ begin
15
+ errors = schema.validate(".tmp.xml")
16
+ rescue Jing::Error => e
17
+ abort "[metanorma-ietf] Validation error: #{e}"
18
+ end
19
+
20
+ if errors.none?
21
+ warn "[metanorma-ietf] Validation passed."
22
+ else
23
+ errors.each do |error|
24
+ warn "[metanorma-ietf] #{error[:message]} @ #{error[:line]}:#{error[:column]}"
25
+ end
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,716 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
3
+ <define name="rfc">
4
+ <element name="rfc">
5
+ <optional>
6
+ <attribute name="number"/>
7
+ </optional>
8
+ <optional>
9
+ <attribute name="obsoletes" a:defaultValue=""/>
10
+ </optional>
11
+ <optional>
12
+ <attribute name="updates" a:defaultValue=""/>
13
+ </optional>
14
+ <optional>
15
+ <attribute name="category">
16
+ <choice>
17
+ <value>std</value>
18
+ <value>bcp</value>
19
+ <value>info</value>
20
+ <value>exp</value>
21
+ <value>historic</value>
22
+ </choice>
23
+ </attribute>
24
+ </optional>
25
+ <optional>
26
+ <attribute name="consensus">
27
+ <choice>
28
+ <value>no</value>
29
+ <value>yes</value>
30
+ </choice>
31
+ </attribute>
32
+ </optional>
33
+ <optional>
34
+ <attribute name="seriesNo"/>
35
+ </optional>
36
+ <optional>
37
+ <attribute name="ipr">
38
+ <choice>
39
+ <value>full2026</value>
40
+ <value>noDerivativeWorks2026</value>
41
+ <value>none</value>
42
+ <value>full3667</value>
43
+ <value>noModification3667</value>
44
+ <value>noDerivatives3667</value>
45
+ <value>full3978</value>
46
+ <value>noModification3978</value>
47
+ <value>noDerivatives3978</value>
48
+ <value>trust200811</value>
49
+ <value>noModificationTrust200811</value>
50
+ <value>noDerivativesTrust200811</value>
51
+ <value>trust200902</value>
52
+ <value>noModificationTrust200902</value>
53
+ <value>noDerivativesTrust200902</value>
54
+ <value>pre5378Trust200902</value>
55
+ </choice>
56
+ </attribute>
57
+ </optional>
58
+ <optional>
59
+ <attribute name="iprExtract">
60
+ <data type="IDREF"/>
61
+ </attribute>
62
+ </optional>
63
+ <optional>
64
+ <attribute name="submissionType" a:defaultValue="IETF">
65
+ <choice>
66
+ <value>IETF</value>
67
+ <value>IAB</value>
68
+ <value>IRTF</value>
69
+ <value>independent</value>
70
+ </choice>
71
+ </attribute>
72
+ </optional>
73
+ <optional>
74
+ <attribute name="docName"/>
75
+ </optional>
76
+ <optional>
77
+ <attribute name="xml:lang" a:defaultValue="en"/>
78
+ </optional>
79
+ <ref name="front"/>
80
+ <ref name="middle"/>
81
+ <optional>
82
+ <ref name="back"/>
83
+ </optional>
84
+ </element>
85
+ </define>
86
+ <define name="front">
87
+ <element name="front">
88
+ <ref name="title"/>
89
+ <oneOrMore>
90
+ <ref name="author"/>
91
+ </oneOrMore>
92
+ <ref name="date"/>
93
+ <zeroOrMore>
94
+ <ref name="area"/>
95
+ </zeroOrMore>
96
+ <zeroOrMore>
97
+ <ref name="workgroup"/>
98
+ </zeroOrMore>
99
+ <zeroOrMore>
100
+ <ref name="keyword"/>
101
+ </zeroOrMore>
102
+ <optional>
103
+ <ref name="abstract"/>
104
+ </optional>
105
+ <zeroOrMore>
106
+ <ref name="note"/>
107
+ </zeroOrMore>
108
+ </element>
109
+ </define>
110
+ <define name="title">
111
+ <element name="title">
112
+ <optional>
113
+ <attribute name="abbrev"/>
114
+ </optional>
115
+ <text/>
116
+ </element>
117
+ </define>
118
+ <define name="author">
119
+ <element name="author">
120
+ <optional>
121
+ <attribute name="initials"/>
122
+ </optional>
123
+ <optional>
124
+ <attribute name="surname"/>
125
+ </optional>
126
+ <optional>
127
+ <attribute name="fullname"/>
128
+ </optional>
129
+ <optional>
130
+ <attribute name="role">
131
+ <value>editor</value>
132
+ </attribute>
133
+ </optional>
134
+ <optional>
135
+ <ref name="organization"/>
136
+ </optional>
137
+ <optional>
138
+ <ref name="address"/>
139
+ </optional>
140
+ </element>
141
+ </define>
142
+ <define name="organization">
143
+ <element name="organization">
144
+ <optional>
145
+ <attribute name="abbrev"/>
146
+ </optional>
147
+ <text/>
148
+ </element>
149
+ </define>
150
+ <define name="address">
151
+ <element name="address">
152
+ <optional>
153
+ <ref name="postal"/>
154
+ </optional>
155
+ <optional>
156
+ <ref name="phone"/>
157
+ </optional>
158
+ <optional>
159
+ <ref name="facsimile"/>
160
+ </optional>
161
+ <optional>
162
+ <ref name="email"/>
163
+ </optional>
164
+ <optional>
165
+ <ref name="uri"/>
166
+ </optional>
167
+ </element>
168
+ </define>
169
+ <define name="postal">
170
+ <element name="postal">
171
+ <oneOrMore>
172
+ <ref name="street"/>
173
+ </oneOrMore>
174
+ <zeroOrMore>
175
+ <choice>
176
+ <ref name="city"/>
177
+ <ref name="region"/>
178
+ <ref name="code"/>
179
+ <ref name="country"/>
180
+ </choice>
181
+ </zeroOrMore>
182
+ </element>
183
+ </define>
184
+ <define name="street">
185
+ <element name="street">
186
+ <text/>
187
+ </element>
188
+ </define>
189
+ <define name="city">
190
+ <element name="city">
191
+ <text/>
192
+ </element>
193
+ </define>
194
+ <define name="region">
195
+ <element name="region">
196
+ <text/>
197
+ </element>
198
+ </define>
199
+ <define name="code">
200
+ <element name="code">
201
+ <text/>
202
+ </element>
203
+ </define>
204
+ <define name="country">
205
+ <element name="country">
206
+ <text/>
207
+ </element>
208
+ </define>
209
+ <define name="phone">
210
+ <element name="phone">
211
+ <text/>
212
+ </element>
213
+ </define>
214
+ <define name="facsimile">
215
+ <element name="facsimile">
216
+ <text/>
217
+ </element>
218
+ </define>
219
+ <define name="email">
220
+ <element name="email">
221
+ <text/>
222
+ </element>
223
+ </define>
224
+ <define name="uri">
225
+ <element name="uri">
226
+ <text/>
227
+ </element>
228
+ </define>
229
+ <define name="date">
230
+ <element name="date">
231
+ <optional>
232
+ <attribute name="day"/>
233
+ </optional>
234
+ <optional>
235
+ <attribute name="month"/>
236
+ </optional>
237
+ <optional>
238
+ <attribute name="year"/>
239
+ </optional>
240
+ <empty/>
241
+ </element>
242
+ </define>
243
+ <define name="area">
244
+ <element name="area">
245
+ <text/>
246
+ </element>
247
+ </define>
248
+ <define name="workgroup">
249
+ <element name="workgroup">
250
+ <text/>
251
+ </element>
252
+ </define>
253
+ <define name="keyword">
254
+ <element name="keyword">
255
+ <text/>
256
+ </element>
257
+ </define>
258
+ <define name="abstract">
259
+ <element name="abstract">
260
+ <oneOrMore>
261
+ <ref name="t"/>
262
+ </oneOrMore>
263
+ </element>
264
+ </define>
265
+ <define name="note">
266
+ <element name="note">
267
+ <attribute name="title"/>
268
+ <oneOrMore>
269
+ <ref name="t"/>
270
+ </oneOrMore>
271
+ </element>
272
+ </define>
273
+ <define name="middle">
274
+ <element name="middle">
275
+ <oneOrMore>
276
+ <ref name="section"/>
277
+ </oneOrMore>
278
+ </element>
279
+ </define>
280
+ <define name="section">
281
+ <element name="section">
282
+ <optional>
283
+ <attribute name="anchor">
284
+ <data type="ID"/>
285
+ </attribute>
286
+ </optional>
287
+ <attribute name="title"/>
288
+ <optional>
289
+ <attribute name="toc" a:defaultValue="default">
290
+ <choice>
291
+ <value>include</value>
292
+ <value>exclude</value>
293
+ <value>default</value>
294
+ </choice>
295
+ </attribute>
296
+ </optional>
297
+ <zeroOrMore>
298
+ <choice>
299
+ <ref name="t"/>
300
+ <ref name="figure"/>
301
+ <ref name="texttable"/>
302
+ <ref name="iref"/>
303
+ </choice>
304
+ </zeroOrMore>
305
+ <zeroOrMore>
306
+ <ref name="section"/>
307
+ </zeroOrMore>
308
+ </element>
309
+ </define>
310
+ <define name="t">
311
+ <element name="t">
312
+ <optional>
313
+ <attribute name="anchor">
314
+ <data type="ID"/>
315
+ </attribute>
316
+ </optional>
317
+ <optional>
318
+ <attribute name="hangText"/>
319
+ </optional>
320
+ <zeroOrMore>
321
+ <choice>
322
+ <text/>
323
+ <ref name="list"/>
324
+ <ref name="figure"/>
325
+ <ref name="xref"/>
326
+ <ref name="eref"/>
327
+ <ref name="iref"/>
328
+ <ref name="cref"/>
329
+ <ref name="spanx"/>
330
+ <ref name="vspace"/>
331
+ </choice>
332
+ </zeroOrMore>
333
+ </element>
334
+ </define>
335
+ <define name="list">
336
+ <element name="list">
337
+ <optional>
338
+ <attribute name="style"/>
339
+ </optional>
340
+ <optional>
341
+ <attribute name="hangIndent"/>
342
+ </optional>
343
+ <optional>
344
+ <attribute name="counter"/>
345
+ </optional>
346
+ <oneOrMore>
347
+ <ref name="t"/>
348
+ </oneOrMore>
349
+ </element>
350
+ </define>
351
+ <define name="xref">
352
+ <element name="xref">
353
+ <attribute name="target">
354
+ <data type="IDREF"/>
355
+ </attribute>
356
+ <optional>
357
+ <attribute name="pageno" a:defaultValue="false">
358
+ <choice>
359
+ <value>true</value>
360
+ <value>false</value>
361
+ </choice>
362
+ </attribute>
363
+ </optional>
364
+ <optional>
365
+ <attribute name="format" a:defaultValue="default">
366
+ <choice>
367
+ <value>counter</value>
368
+ <value>title</value>
369
+ <value>none</value>
370
+ <value>default</value>
371
+ </choice>
372
+ </attribute>
373
+ </optional>
374
+ <text/>
375
+ </element>
376
+ </define>
377
+ <define name="eref">
378
+ <element name="eref">
379
+ <attribute name="target"/>
380
+ <text/>
381
+ </element>
382
+ </define>
383
+ <define name="iref">
384
+ <element name="iref">
385
+ <attribute name="item"/>
386
+ <optional>
387
+ <attribute name="subitem" a:defaultValue=""/>
388
+ </optional>
389
+ <optional>
390
+ <attribute name="primary" a:defaultValue="false">
391
+ <choice>
392
+ <value>true</value>
393
+ <value>false</value>
394
+ </choice>
395
+ </attribute>
396
+ </optional>
397
+ <empty/>
398
+ </element>
399
+ </define>
400
+ <define name="cref">
401
+ <element name="cref">
402
+ <optional>
403
+ <attribute name="anchor">
404
+ <data type="ID"/>
405
+ </attribute>
406
+ </optional>
407
+ <optional>
408
+ <attribute name="source"/>
409
+ </optional>
410
+ <text/>
411
+ </element>
412
+ </define>
413
+ <define name="spanx">
414
+ <element name="spanx">
415
+ <optional>
416
+ <attribute name="xml:space" a:defaultValue="preserve">
417
+ <choice>
418
+ <value>default</value>
419
+ <value>preserve</value>
420
+ </choice>
421
+ </attribute>
422
+ </optional>
423
+ <optional>
424
+ <attribute name="style" a:defaultValue="emph"/>
425
+ </optional>
426
+ <text/>
427
+ </element>
428
+ </define>
429
+ <define name="vspace">
430
+ <element name="vspace">
431
+ <optional>
432
+ <attribute name="blankLines" a:defaultValue="0"/>
433
+ </optional>
434
+ <empty/>
435
+ </element>
436
+ </define>
437
+ <define name="figure">
438
+ <element name="figure">
439
+ <optional>
440
+ <attribute name="anchor">
441
+ <data type="ID"/>
442
+ </attribute>
443
+ </optional>
444
+ <optional>
445
+ <attribute name="title" a:defaultValue=""/>
446
+ </optional>
447
+ <optional>
448
+ <attribute name="suppress-title" a:defaultValue="false">
449
+ <choice>
450
+ <value>true</value>
451
+ <value>false</value>
452
+ </choice>
453
+ </attribute>
454
+ </optional>
455
+ <optional>
456
+ <attribute name="src"/>
457
+ </optional>
458
+ <optional>
459
+ <attribute name="align" a:defaultValue="left">
460
+ <choice>
461
+ <value>left</value>
462
+ <value>center</value>
463
+ <value>right</value>
464
+ </choice>
465
+ </attribute>
466
+ </optional>
467
+ <optional>
468
+ <attribute name="alt" a:defaultValue=""/>
469
+ </optional>
470
+ <optional>
471
+ <attribute name="width" a:defaultValue=""/>
472
+ </optional>
473
+ <optional>
474
+ <attribute name="height" a:defaultValue=""/>
475
+ </optional>
476
+ <zeroOrMore>
477
+ <ref name="iref"/>
478
+ </zeroOrMore>
479
+ <optional>
480
+ <ref name="preamble"/>
481
+ </optional>
482
+ <ref name="artwork"/>
483
+ <optional>
484
+ <ref name="postamble"/>
485
+ </optional>
486
+ </element>
487
+ </define>
488
+ <define name="preamble">
489
+ <element name="preamble">
490
+ <zeroOrMore>
491
+ <choice>
492
+ <text/>
493
+ <ref name="xref"/>
494
+ <ref name="eref"/>
495
+ <ref name="iref"/>
496
+ <ref name="cref"/>
497
+ <ref name="spanx"/>
498
+ </choice>
499
+ </zeroOrMore>
500
+ </element>
501
+ </define>
502
+ <define name="artwork">
503
+ <element name="artwork">
504
+ <optional>
505
+ <attribute name="xml:space" a:defaultValue="preserve">
506
+ <choice>
507
+ <value>default</value>
508
+ <value>preserve</value>
509
+ </choice>
510
+ </attribute>
511
+ </optional>
512
+ <optional>
513
+ <attribute name="name" a:defaultValue=""/>
514
+ </optional>
515
+ <optional>
516
+ <attribute name="type" a:defaultValue=""/>
517
+ </optional>
518
+ <optional>
519
+ <attribute name="src"/>
520
+ </optional>
521
+ <optional>
522
+ <attribute name="align" a:defaultValue="left">
523
+ <choice>
524
+ <value>left</value>
525
+ <value>center</value>
526
+ <value>right</value>
527
+ </choice>
528
+ </attribute>
529
+ </optional>
530
+ <optional>
531
+ <attribute name="alt" a:defaultValue=""/>
532
+ </optional>
533
+ <optional>
534
+ <attribute name="width" a:defaultValue=""/>
535
+ </optional>
536
+ <optional>
537
+ <attribute name="height" a:defaultValue=""/>
538
+ </optional>
539
+ <zeroOrMore>
540
+ <text/>
541
+ </zeroOrMore>
542
+ </element>
543
+ </define>
544
+ <define name="postamble">
545
+ <element name="postamble">
546
+ <zeroOrMore>
547
+ <choice>
548
+ <text/>
549
+ <ref name="xref"/>
550
+ <ref name="eref"/>
551
+ <ref name="iref"/>
552
+ <ref name="cref"/>
553
+ <ref name="spanx"/>
554
+ </choice>
555
+ </zeroOrMore>
556
+ </element>
557
+ </define>
558
+ <define name="texttable">
559
+ <element name="texttable">
560
+ <optional>
561
+ <attribute name="anchor">
562
+ <data type="ID"/>
563
+ </attribute>
564
+ </optional>
565
+ <optional>
566
+ <attribute name="title" a:defaultValue=""/>
567
+ </optional>
568
+ <optional>
569
+ <attribute name="suppress-title" a:defaultValue="false">
570
+ <choice>
571
+ <value>true</value>
572
+ <value>false</value>
573
+ </choice>
574
+ </attribute>
575
+ </optional>
576
+ <optional>
577
+ <attribute name="align" a:defaultValue="center">
578
+ <choice>
579
+ <value>left</value>
580
+ <value>center</value>
581
+ <value>right</value>
582
+ </choice>
583
+ </attribute>
584
+ </optional>
585
+ <optional>
586
+ <attribute name="style" a:defaultValue="full">
587
+ <choice>
588
+ <value>all</value>
589
+ <value>none</value>
590
+ <value>headers</value>
591
+ <value>full</value>
592
+ </choice>
593
+ </attribute>
594
+ </optional>
595
+ <optional>
596
+ <ref name="preamble"/>
597
+ </optional>
598
+ <oneOrMore>
599
+ <ref name="ttcol"/>
600
+ </oneOrMore>
601
+ <zeroOrMore>
602
+ <ref name="c"/>
603
+ </zeroOrMore>
604
+ <optional>
605
+ <ref name="postamble"/>
606
+ </optional>
607
+ </element>
608
+ </define>
609
+ <define name="ttcol">
610
+ <element name="ttcol">
611
+ <optional>
612
+ <attribute name="width"/>
613
+ </optional>
614
+ <optional>
615
+ <attribute name="align" a:defaultValue="left">
616
+ <choice>
617
+ <value>left</value>
618
+ <value>center</value>
619
+ <value>right</value>
620
+ </choice>
621
+ </attribute>
622
+ </optional>
623
+ <text/>
624
+ </element>
625
+ </define>
626
+ <define name="c">
627
+ <element name="c">
628
+ <zeroOrMore>
629
+ <choice>
630
+ <text/>
631
+ <ref name="xref"/>
632
+ <ref name="eref"/>
633
+ <ref name="iref"/>
634
+ <ref name="cref"/>
635
+ <ref name="spanx"/>
636
+ </choice>
637
+ </zeroOrMore>
638
+ </element>
639
+ </define>
640
+ <define name="back">
641
+ <element name="back">
642
+ <zeroOrMore>
643
+ <ref name="references"/>
644
+ </zeroOrMore>
645
+ <zeroOrMore>
646
+ <ref name="section"/>
647
+ </zeroOrMore>
648
+ </element>
649
+ </define>
650
+ <define name="references">
651
+ <element name="references">
652
+ <optional>
653
+ <attribute name="title" a:defaultValue="References"/>
654
+ </optional>
655
+ <oneOrMore>
656
+ <ref name="reference"/>
657
+ </oneOrMore>
658
+ </element>
659
+ </define>
660
+ <define name="reference">
661
+ <element name="reference">
662
+ <attribute name="anchor">
663
+ <data type="ID"/>
664
+ </attribute>
665
+ <optional>
666
+ <attribute name="target"/>
667
+ </optional>
668
+ <ref name="front"/>
669
+ <zeroOrMore>
670
+ <ref name="seriesInfo"/>
671
+ </zeroOrMore>
672
+ <zeroOrMore>
673
+ <ref name="format"/>
674
+ </zeroOrMore>
675
+ <zeroOrMore>
676
+ <ref name="annotation"/>
677
+ </zeroOrMore>
678
+ </element>
679
+ </define>
680
+ <define name="seriesInfo">
681
+ <element name="seriesInfo">
682
+ <attribute name="name"/>
683
+ <attribute name="value"/>
684
+ <empty/>
685
+ </element>
686
+ </define>
687
+ <define name="format">
688
+ <element name="format">
689
+ <optional>
690
+ <attribute name="target"/>
691
+ </optional>
692
+ <attribute name="type"/>
693
+ <optional>
694
+ <attribute name="octets"/>
695
+ </optional>
696
+ <empty/>
697
+ </element>
698
+ </define>
699
+ <define name="annotation">
700
+ <element name="annotation">
701
+ <zeroOrMore>
702
+ <choice>
703
+ <text/>
704
+ <ref name="xref"/>
705
+ <ref name="eref"/>
706
+ <ref name="iref"/>
707
+ <ref name="cref"/>
708
+ <ref name="spanx"/>
709
+ </choice>
710
+ </zeroOrMore>
711
+ </element>
712
+ </define>
713
+ <start>
714
+ <ref name="rfc"/>
715
+ </start>
716
+ </grammar>