metanorma-ietf 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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>