metanorma-itu 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.hound.yml +3 -0
  3. data/.rubocop.yml +10 -0
  4. data/.travis.yml +17 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +25 -0
  8. data/README.adoc +72 -0
  9. data/Rakefile +6 -0
  10. data/appveyor.yml +29 -0
  11. data/lib/asciidoctor/itu.rb +7 -0
  12. data/lib/asciidoctor/itu/biblio.rng +949 -0
  13. data/lib/asciidoctor/itu/converter.rb +164 -0
  14. data/lib/asciidoctor/itu/front.rb +182 -0
  15. data/lib/asciidoctor/itu/isodoc.rng +1132 -0
  16. data/lib/asciidoctor/itu/isostandard.rng +801 -0
  17. data/lib/asciidoctor/itu/itu.rng +223 -0
  18. data/lib/asciidoctor/itu/reqt.rng +162 -0
  19. data/lib/asciidoctor/itu/validate.rb +55 -0
  20. data/lib/isodoc/itu.rb +11 -0
  21. data/lib/isodoc/itu/base_convert.rb +210 -0
  22. data/lib/isodoc/itu/html/Logo_ITU.jpg +0 -0
  23. data/lib/isodoc/itu/html/header.html +162 -0
  24. data/lib/isodoc/itu/html/html_itu_intro.html +42 -0
  25. data/lib/isodoc/itu/html/html_itu_titlepage.html +144 -0
  26. data/lib/isodoc/itu/html/htmlstyle.scss +1167 -0
  27. data/lib/isodoc/itu/html/itu-document-comb.png +0 -0
  28. data/lib/isodoc/itu/html/itu.scss +707 -0
  29. data/lib/isodoc/itu/html/logo.png +0 -0
  30. data/lib/isodoc/itu/html/scripts.html +82 -0
  31. data/lib/isodoc/itu/html/scripts.pdf.html +70 -0
  32. data/lib/isodoc/itu/html/word_itu_intro.html +246 -0
  33. data/lib/isodoc/itu/html/word_itu_titlepage.html +283 -0
  34. data/lib/isodoc/itu/html/wordstyle.scss +1237 -0
  35. data/lib/isodoc/itu/html_convert.rb +72 -0
  36. data/lib/isodoc/itu/i18n-en.yaml +2 -0
  37. data/lib/isodoc/itu/metadata.rb +100 -0
  38. data/lib/isodoc/itu/pdf_convert.rb +70 -0
  39. data/lib/isodoc/itu/word_convert.rb +115 -0
  40. data/lib/metanorma-itu.rb +8 -0
  41. data/lib/metanorma/itu.rb +11 -0
  42. data/lib/metanorma/itu/processor.rb +43 -0
  43. data/lib/metanorma/itu/version.rb +5 -0
  44. data/metanorma-itu.gemspec +44 -0
  45. metadata +327 -0
@@ -0,0 +1,164 @@
1
+ require "asciidoctor"
2
+ require "asciidoctor/standoc/converter"
3
+ require "fileutils"
4
+ require_relative "./front.rb"
5
+ require_relative "./validate.rb"
6
+
7
+ module Asciidoctor
8
+ module ITU
9
+
10
+ # A {Converter} implementation that generates RSD output, and a document
11
+ # schema encapsulation of the document for validation
12
+ #
13
+ class Converter < Standoc::Converter
14
+
15
+ register_for "itu"
16
+
17
+ def title_validate(root)
18
+ nil
19
+ end
20
+
21
+ def makexml(node)
22
+ result = ["<?xml version='1.0' encoding='UTF-8'?>\n<itu-standard>"]
23
+ @draft = node.attributes.has_key?("draft")
24
+ result << noko { |ixml| front node, ixml }
25
+ result << noko { |ixml| middle node, ixml }
26
+ result << "</itu-standard>"
27
+ result = textcleanup(result)
28
+ ret1 = cleanup(Nokogiri::XML(result))
29
+ validate(ret1)
30
+ ret1.root.add_namespace(nil, Metanorma::ITU::DOCUMENT_NAMESPACE)
31
+ ret1
32
+ end
33
+
34
+ def doctype(node)
35
+ node.attr("doctype") || "recommendation"
36
+ end
37
+
38
+ def clause_parse(attrs, xml, node)
39
+ attrs[:preface] = true if node.attr("style") == "preface"
40
+ super
41
+ end
42
+
43
+ def move_sections_into_preface(x, preface)
44
+ x.xpath("//clause[@preface]").each do |c|
45
+ c.delete("preface")
46
+ preface.add_child c.remove
47
+ end
48
+ end
49
+
50
+ def make_preface(x, s)
51
+ make_abstract(x, s)
52
+ move_sections_into_preface(x, x.at("//preface"))
53
+ end
54
+
55
+ def document(node)
56
+ init(node)
57
+ ret1 = makexml(node)
58
+ ret = ret1.to_xml(indent: 2)
59
+ unless node.attr("nodoc") || !node.attr("docfile")
60
+ filename = node.attr("docfile").gsub(/\.adoc/, ".xml").
61
+ gsub(%r{^.*/}, "")
62
+ File.open(filename, "w") { |f| f.write(ret) }
63
+ html_converter(node).convert filename unless node.attr("nodoc")
64
+ word_converter(node).convert filename unless node.attr("nodoc")
65
+ pdf_converter(node).convert filename unless node.attr("nodoc")
66
+ end
67
+ @files_to_delete.each { |f| FileUtils.rm f }
68
+ ret
69
+ end
70
+
71
+ def validate(doc)
72
+ content_validate(doc)
73
+ schema_validate(formattedstr_strip(doc.dup),
74
+ File.join(File.dirname(__FILE__), "itu.rng"))
75
+ end
76
+
77
+ def sections_cleanup(x)
78
+ super
79
+ x.xpath("//*[@inline-header]").each do |h|
80
+ h.delete("inline-header")
81
+ end
82
+ end
83
+
84
+ def style(n, t)
85
+ return
86
+ end
87
+
88
+ def section(node)
89
+ a = { id: Asciidoctor::Standoc::Utils::anchor_or_uuid(node) }
90
+ noko do |xml|
91
+ case sectiontype(node)
92
+ when "references" then norm_ref_parse(a, xml, node)
93
+ when "terms and definitions",
94
+ "terms, definitions, symbols and abbreviated terms",
95
+ "terms, definitions, symbols and abbreviations",
96
+ "terms, definitions and symbols",
97
+ "terms, definitions and abbreviations",
98
+ "terms, definitions and abbreviated terms",
99
+ "definitions"
100
+ @term_def = true
101
+ term_def_parse(a, xml, node, true)
102
+ @term_def = false
103
+ when "symbols and abbreviated terms",
104
+ "symbols",
105
+ "abbreviated terms",
106
+ "abbreviations"
107
+ "abbreviations and acronyms"
108
+ symbols_parse(a, xml, node)
109
+ when "bibliography" then bibliography_parse(a, xml, node)
110
+ else
111
+ if @term_def then term_def_subclause_parse(a, xml, node)
112
+ elsif @definitions then symbols_parse(a, xml, node)
113
+ elsif @biblio then bibliography_parse(a, xml, node)
114
+ elsif node.attr("style") == "bibliography"
115
+ bibliography_parse(a, xml, node)
116
+ elsif node.attr("style") == "abstract"
117
+ abstract_parse(a, xml, node)
118
+ elsif node.attr("style") == "appendix" && node.level == 1
119
+ annex_parse(a, xml, node)
120
+ else
121
+ clause_parse(a, xml, node)
122
+ end
123
+ end
124
+ end.join("\n")
125
+ end
126
+
127
+ def norm_ref_parse(attrs, xml, node)
128
+ @norm_ref = true
129
+ xml.references **attr_code(attrs) do |xml_section|
130
+ xml_section.title { |t| t << "References" }
131
+ xml_section << node.content
132
+ end
133
+ @norm_ref = false
134
+ end
135
+
136
+ def term_def_title(toplevel, node)
137
+ return node.title unless toplevel
138
+ "Definitions"
139
+ end
140
+
141
+ def termdef_cleanup(xmldoc)
142
+ xmldoc.xpath("//term/preferred").each do |p|
143
+ if ["terms defined elsewhere", "terms defined in this recommendation"].include? p.text.downcase
144
+ p.name = "title"
145
+ p.parent.name = "terms"
146
+ end
147
+ end
148
+ super
149
+ end
150
+
151
+ def html_converter(node)
152
+ IsoDoc::ITU::HtmlConvert.new(html_extract_attributes(node))
153
+ end
154
+
155
+ def pdf_converter(node)
156
+ IsoDoc::ITU::PdfConvert.new(html_extract_attributes(node))
157
+ end
158
+
159
+ def word_converter(node)
160
+ IsoDoc::ITU::WordConvert.new(doc_extract_attributes(node))
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,182 @@
1
+ require "asciidoctor"
2
+ require "asciidoctor/standoc/converter"
3
+ require "fileutils"
4
+
5
+ module Asciidoctor
6
+ module ITU
7
+
8
+ # A {Converter} implementation that generates RSD output, and a document
9
+ # schema encapsulation of the document for validation
10
+ #
11
+ class Converter < Standoc::Converter
12
+
13
+ def title_english(node, xml)
14
+ ["en"].each do |lang|
15
+ at = { language: lang, format: "text/plain", type: "main" }
16
+ xml.title **attr_code(at) do |t|
17
+ t << asciidoc_sub(node.attr("title") || node.attr("title-en") || node.title)
18
+ end
19
+ end
20
+ end
21
+
22
+ def title_otherlangs(node, xml)
23
+ node.attributes.each do |k, v|
24
+ next unless /^title-(?<titlelang>.+)$/ =~ k
25
+ next if titlelang == "en"
26
+ xml.title v, { language: titlelang, format: "text/plain", type: "main" }
27
+ end
28
+ end
29
+
30
+ def metadata_author(node, xml)
31
+ xml.contributor do |c|
32
+ c.role **{ type: "author" }
33
+ c.organization do |a|
34
+ a.name "International Telecommunication Union"
35
+ a.abbreviation "ITU"
36
+ end
37
+ end
38
+ end
39
+
40
+ def metadata_publisher(node, xml)
41
+ xml.contributor do |c|
42
+ c.role **{ type: "publisher" }
43
+ c.organization do |a|
44
+ a.name "International Telecommunication Union"
45
+ a.abbreviation "ITU"
46
+ end
47
+ end
48
+ end
49
+
50
+ def metadata_committee(node, xml)
51
+ metadata_committee1(node, xml, "")
52
+ suffix = 2
53
+ while node.attr("bureau_#{suffix}")
54
+ metadata_committee1(node, xml, "_#{suffix}")
55
+ end
56
+ end
57
+
58
+ def metadata_committee1(node, xml, suffix)
59
+ xml.editorialgroup do |a|
60
+ a.bureau ( node.attr("bureau#{suffix}") || "T" )
61
+ a.group **attr_code(type: node.attr("grouptype#{suffix}")) do |g|
62
+ g.name node.attr("group#{suffix}")
63
+ g.acronym node.attr("groupacronym#{suffix}") if node.attr("groupacronym#{suffix}")
64
+ if node.attr("groupyearstart#{suffix}")
65
+ g.period do |p|
66
+ period.start node.attr("groupyearstart#{suffix}")
67
+ period.end node.attr("groupyearend#{suffix}") if node.attr("groupacronym#{suffix}")
68
+ end
69
+ end
70
+ end
71
+ if node.attr("subgroup#{suffix}")
72
+ a.subgroup **attr_code(type: node.attr("subgrouptype#{suffix}")) do |g|
73
+ g.name node.attr("subgroup#{suffix}")
74
+ g.acronym node.attr("subgroupacronym#{suffix}") if node.attr("subgroupacronym#{suffix}")
75
+ if node.attr("subgroupyearstart#{suffix}")
76
+ g.period do |p|
77
+ period.start node.attr("subgroupyearstart#{suffix}")
78
+ period.end node.attr("subgroupyearend#{suffix}") if node.attr("subgroupyearend#{suffix}")
79
+ end
80
+ end
81
+ end
82
+ end
83
+ if node.attr("workgroup#{suffix}")
84
+ a.workgroup **attr_code(type: node.attr("workgrouptype#{suffix}")) do |g|
85
+ g.name node.attr("workgroup#{suffix}")
86
+ g.acronym node.attr("workgroupacronym#{suffix}") if node.attr("workgroupacronym#{suffix}")
87
+ if node.attr("workgroupyearstart#{suffix}")
88
+ g.period do |p|
89
+ period.start node.attr("workgroupyearstart#{suffix}")
90
+ period.end node.attr("workgroupyearend#{suffix}") if node.attr("wokrgroupyearend#{suffix}")
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ def metadata_id(node, xml)
99
+ itu_id(node, xml)
100
+ provisional_id(node, xml)
101
+ end
102
+
103
+ def provisional_id(node, xml)
104
+ return unless node.attr("provisional-name")
105
+ xml.docidentifier **{type: "ITU-provisional"} do |i|
106
+ i << node.attr("provisional-name")
107
+ end
108
+ end
109
+
110
+ def itu_id(node, xml)
111
+ bureau = node.attr("bureau") || "T"
112
+ return unless node.attr("docnumber")
113
+ xml.docidentifier **{type: "ITU"} do |i|
114
+ i << "ITU-#{bureau} "\
115
+ "#{node.attr("docnumber")}"
116
+ end
117
+ xml.docnumber { |i| i << node.attr("docnumber") }
118
+ end
119
+
120
+ def metadata_copyright(node, xml)
121
+ from = node.attr("copyright-year") || Date.today.year
122
+ xml.copyright do |c|
123
+ c.from from
124
+ c.owner do |owner|
125
+ owner.organization do |o|
126
+ o.name "International Telecommunication Union"
127
+ o.abbreviation "ITU"
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ def metadata_series(node, xml)
134
+ node.attr("series") and
135
+ xml.series **{ type: "main" } do |s|
136
+ s.title node.attr("series")
137
+ end
138
+ node.attr("series1") and
139
+ xml.series **{ type: "secondary" } do |s|
140
+ s.title node.attr("series1")
141
+ end
142
+ node.attr("series2") and
143
+ xml.series **{ type: "tertiary" } do |s|
144
+ s.title node.attr("series2")
145
+ end
146
+ end
147
+
148
+ def metadata_keywords(node, xml)
149
+ return unless node.attr("keywords")
150
+ node.attr("keywords").split(/,[ ]*/).each do |kw|
151
+ xml.keyword kw
152
+ end
153
+ end
154
+
155
+ def metadata_recommendationstatus(node, xml)
156
+ return unless node.attr("recommendation-from")
157
+ xml.recommendationstatus do |s|
158
+ s.from node.attr("recommendation-from")
159
+ s.to node.attr("recommendation-to") if node.attr("recommendation-to")
160
+ if node.attr("approval-process")
161
+ s.approvalstage **{process: node.attr("approval-process")} do |a|
162
+ a << node.attr("approval-status")
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ def metadata_ip_notice(node, xml)
169
+ xml.ip_notice_received (node.attr("ip-notice-received") || "false")
170
+ end
171
+
172
+ def metadata_ext(node, xml)
173
+ metadata_doctype(node, ext)
174
+ metadata_committee(node, ext)
175
+ metadata_ics(node, ext)
176
+ metadata_keywords(node, xml)
177
+ metadata_recommendationstatus(node, xml)
178
+ metadata_ip_notice(node, xml)
179
+ end
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,1132 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ instantiations of this grammar may replace leaf strings
4
+ with more elaborated types; e.g. title (text) replaced with
5
+ title-main, title-intro, title-part; type replaced with
6
+ enum.
7
+
8
+ some renaming at leaf nodes is permissible
9
+
10
+ obligations can change both from optional to mandatory,
11
+ and from mandatory to optional; optional elements may
12
+ be omitted; freely positioned alternatives may be replaced
13
+ with strict ordering
14
+
15
+ DO NOT introduce a namespace here. We do not want a distinct namespace
16
+ for these elements, and a distinct namespace for any grammar inheriting
17
+ these elements; we just want one namespace for any child grammars
18
+ of this.
19
+ -->
20
+ <grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
21
+ <include href="reqt.rng"/>
22
+ <include href="biblio.rng"/>
23
+ <start>
24
+ <ref name="standard-document"/>
25
+ </start>
26
+ <define name="standard-document">
27
+ <element name="standard-document">
28
+ <ref name="bibdata"/>
29
+ <optional>
30
+ <ref name="boilerplate"/>
31
+ </optional>
32
+ <optional>
33
+ <ref name="preface"/>
34
+ </optional>
35
+ <ref name="sections"/>
36
+ <zeroOrMore>
37
+ <ref name="annex"/>
38
+ </zeroOrMore>
39
+ <zeroOrMore>
40
+ <ref name="references"/>
41
+ </zeroOrMore>
42
+ </element>
43
+ </define>
44
+ <define name="bibdata">
45
+ <element name="bibdata">
46
+ <ref name="BibData"/>
47
+ </element>
48
+ </define>
49
+ <define name="preface">
50
+ <element name="preface">
51
+ <oneOrMore>
52
+ <ref name="content"/>
53
+ </oneOrMore>
54
+ </element>
55
+ </define>
56
+ <define name="boilerplate">
57
+ <element name="boilerplate">
58
+ <optional>
59
+ <ref name="copyright-statement"/>
60
+ </optional>
61
+ <optional>
62
+ <ref name="license-statement"/>
63
+ </optional>
64
+ <optional>
65
+ <ref name="legal-statement"/>
66
+ </optional>
67
+ <optional>
68
+ <ref name="feedback-statement"/>
69
+ </optional>
70
+ </element>
71
+ </define>
72
+ <define name="copyright-statement">
73
+ <element name="copyright-statement">
74
+ <ref name="Content-Section"/>
75
+ </element>
76
+ </define>
77
+ <define name="license-statement">
78
+ <element name="license-statement">
79
+ <ref name="Content-Section"/>
80
+ </element>
81
+ </define>
82
+ <define name="legal-statement">
83
+ <element name="legal-statement">
84
+ <ref name="Content-Section"/>
85
+ </element>
86
+ </define>
87
+ <define name="feedback-statement">
88
+ <element name="feedback-statement">
89
+ <ref name="Content-Section"/>
90
+ </element>
91
+ </define>
92
+ <define name="sections">
93
+ <element name="sections">
94
+ <oneOrMore>
95
+ <choice>
96
+ <ref name="content"/>
97
+ <ref name="clause"/>
98
+ <ref name="terms"/>
99
+ <ref name="definitions"/>
100
+ </choice>
101
+ </oneOrMore>
102
+ </element>
103
+ </define>
104
+ <define name="definitions">
105
+ <element name="definitions">
106
+ <optional>
107
+ <attribute name="id">
108
+ <data type="ID"/>
109
+ </attribute>
110
+ </optional>
111
+ <optional>
112
+ <ref name="section-title"/>
113
+ </optional>
114
+ <ref name="dl"/>
115
+ </element>
116
+ </define>
117
+ <define name="section-title">
118
+ <element name="title">
119
+ <zeroOrMore>
120
+ <ref name="TextElement"/>
121
+ </zeroOrMore>
122
+ </element>
123
+ </define>
124
+ <define name="content">
125
+ <element name="content">
126
+ <ref name="Content-Section"/>
127
+ </element>
128
+ </define>
129
+ <define name="content-subsection">
130
+ <element name="clause">
131
+ <ref name="Content-Section"/>
132
+ </element>
133
+ </define>
134
+ <define name="Basic-Section">
135
+ <optional>
136
+ <attribute name="id">
137
+ <data type="ID"/>
138
+ </attribute>
139
+ </optional>
140
+ <optional>
141
+ <ref name="section-title"/>
142
+ </optional>
143
+ <oneOrMore>
144
+ <ref name="BasicBlock"/>
145
+ </oneOrMore>
146
+ <zeroOrMore>
147
+ <ref name="note"/>
148
+ </zeroOrMore>
149
+ </define>
150
+ <define name="Content-Section">
151
+ <optional>
152
+ <attribute name="id">
153
+ <data type="ID"/>
154
+ </attribute>
155
+ </optional>
156
+ <optional>
157
+ <ref name="section-title"/>
158
+ </optional>
159
+ <choice>
160
+ <group>
161
+ <oneOrMore>
162
+ <ref name="BasicBlock"/>
163
+ </oneOrMore>
164
+ <zeroOrMore>
165
+ <ref name="note"/>
166
+ </zeroOrMore>
167
+ </group>
168
+ <oneOrMore>
169
+ <ref name="content-subsection"/>
170
+ </oneOrMore>
171
+ </choice>
172
+ </define>
173
+ <define name="clause">
174
+ <element name="clause">
175
+ <ref name="Clause-Section"/>
176
+ </element>
177
+ </define>
178
+ <define name="Clause-Section">
179
+ <optional>
180
+ <attribute name="id">
181
+ <data type="ID"/>
182
+ </attribute>
183
+ </optional>
184
+ <optional>
185
+ <ref name="section-title"/>
186
+ </optional>
187
+ <choice>
188
+ <group>
189
+ <oneOrMore>
190
+ <ref name="BasicBlock"/>
191
+ </oneOrMore>
192
+ <zeroOrMore>
193
+ <ref name="note"/>
194
+ </zeroOrMore>
195
+ </group>
196
+ <oneOrMore>
197
+ <ref name="clause-subsection"/>
198
+ </oneOrMore>
199
+ </choice>
200
+ </define>
201
+ <define name="clause-subsection">
202
+ <element name="clause">
203
+ <ref name="Clause-Section"/>
204
+ </element>
205
+ </define>
206
+ <define name="annex">
207
+ <element name="annex">
208
+ <optional>
209
+ <attribute name="id">
210
+ <data type="ID"/>
211
+ </attribute>
212
+ </optional>
213
+ <attribute name="obligation">
214
+ <choice>
215
+ <value>normative</value>
216
+ <value>informative</value>
217
+ </choice>
218
+ </attribute>
219
+ <optional>
220
+ <ref name="section-title"/>
221
+ </optional>
222
+ <choice>
223
+ <group>
224
+ <oneOrMore>
225
+ <ref name="BasicBlock"/>
226
+ </oneOrMore>
227
+ <zeroOrMore>
228
+ <ref name="note"/>
229
+ </zeroOrMore>
230
+ </group>
231
+ <oneOrMore>
232
+ <ref name="clause-subsection"/>
233
+ </oneOrMore>
234
+ </choice>
235
+ </element>
236
+ </define>
237
+ <define name="references">
238
+ <element name="references">
239
+ <optional>
240
+ <attribute name="id">
241
+ <data type="ID"/>
242
+ </attribute>
243
+ </optional>
244
+ <optional>
245
+ <ref name="section-title"/>
246
+ </optional>
247
+ <zeroOrMore>
248
+ <ref name="bibitem"/>
249
+ </zeroOrMore>
250
+ </element>
251
+ </define>
252
+ <define name="terms">
253
+ <element name="terms">
254
+ <optional>
255
+ <attribute name="id">
256
+ <data type="ID"/>
257
+ </attribute>
258
+ </optional>
259
+ <oneOrMore>
260
+ <ref name="term"/>
261
+ </oneOrMore>
262
+ </element>
263
+ </define>
264
+ <define name="term">
265
+ <element name="term">
266
+ <optional>
267
+ <attribute name="id">
268
+ <data type="ID"/>
269
+ </attribute>
270
+ </optional>
271
+ <oneOrMore>
272
+ <ref name="preferred"/>
273
+ </oneOrMore>
274
+ <zeroOrMore>
275
+ <ref name="admitted"/>
276
+ </zeroOrMore>
277
+ <zeroOrMore>
278
+ <ref name="deprecates"/>
279
+ </zeroOrMore>
280
+ <optional>
281
+ <ref name="termdomain"/>
282
+ </optional>
283
+ <ref name="definition"/>
284
+ <zeroOrMore>
285
+ <ref name="termnote"/>
286
+ </zeroOrMore>
287
+ <zeroOrMore>
288
+ <ref name="termexample"/>
289
+ </zeroOrMore>
290
+ <zeroOrMore>
291
+ <ref name="termsource"/>
292
+ </zeroOrMore>
293
+ </element>
294
+ </define>
295
+ <define name="preferred">
296
+ <element name="preferred">
297
+ <oneOrMore>
298
+ <ref name="TextElement"/>
299
+ </oneOrMore>
300
+ </element>
301
+ </define>
302
+ <define name="admitted">
303
+ <element name="admitted">
304
+ <oneOrMore>
305
+ <ref name="TextElement"/>
306
+ </oneOrMore>
307
+ </element>
308
+ </define>
309
+ <define name="deprecates">
310
+ <element name="deprecates">
311
+ <oneOrMore>
312
+ <ref name="TextElement"/>
313
+ </oneOrMore>
314
+ </element>
315
+ </define>
316
+ <define name="termdomain">
317
+ <element name="domain">
318
+ <oneOrMore>
319
+ <ref name="TextElement"/>
320
+ </oneOrMore>
321
+ </element>
322
+ </define>
323
+ <define name="definition">
324
+ <element name="definition">
325
+ <ref name="paragraph"/>
326
+ </element>
327
+ </define>
328
+ <define name="termnote">
329
+ <element name="termnote">
330
+ <attribute name="id">
331
+ <data type="ID"/>
332
+ </attribute>
333
+ <ref name="paragraph"/>
334
+ </element>
335
+ </define>
336
+ <define name="termexample">
337
+ <element name="termexample">
338
+ <attribute name="id">
339
+ <data type="ID"/>
340
+ </attribute>
341
+ <ref name="paragraph"/>
342
+ </element>
343
+ </define>
344
+ <define name="termsource">
345
+ <element name="termsource">
346
+ <attribute name="status">
347
+ <choice>
348
+ <value>identical</value>
349
+ <value>modified</value>
350
+ </choice>
351
+ </attribute>
352
+ <ref name="origin"/>
353
+ <optional>
354
+ <ref name="modification"/>
355
+ </optional>
356
+ </element>
357
+ </define>
358
+ <define name="origin">
359
+ <element name="origin">
360
+ <ref name="erefType"/>
361
+ </element>
362
+ </define>
363
+ <define name="modification">
364
+ <element name="modification">
365
+ <ref name="paragraph"/>
366
+ </element>
367
+ </define>
368
+ <define name="BasicBlock">
369
+ <choice>
370
+ <ref name="paragraph-with-footnote"/>
371
+ <ref name="table"/>
372
+ <ref name="formula"/>
373
+ <ref name="admonition"/>
374
+ <ref name="ol"/>
375
+ <ref name="ul"/>
376
+ <ref name="dl"/>
377
+ <ref name="figure"/>
378
+ <ref name="quote"/>
379
+ <ref name="sourcecode"/>
380
+ <ref name="example"/>
381
+ <ref name="review"/>
382
+ <ref name="pre"/>
383
+ </choice>
384
+ </define>
385
+ <define name="paragraph">
386
+ <element name="p">
387
+ <ref name="ParagraphType"/>
388
+ </element>
389
+ </define>
390
+ <define name="Alignments">
391
+ <choice>
392
+ <value>left</value>
393
+ <value>right</value>
394
+ <value>center</value>
395
+ <value>justified</value>
396
+ </choice>
397
+ </define>
398
+ <define name="ParagraphType">
399
+ <attribute name="id">
400
+ <data type="ID"/>
401
+ </attribute>
402
+ <optional>
403
+ <attribute name="align">
404
+ <ref name="Alignments"/>
405
+ </attribute>
406
+ </optional>
407
+ <zeroOrMore>
408
+ <ref name="TextElement"/>
409
+ </zeroOrMore>
410
+ <zeroOrMore>
411
+ <ref name="note"/>
412
+ </zeroOrMore>
413
+ </define>
414
+ <define name="paragraph-with-footnote">
415
+ <element name="p">
416
+ <attribute name="id">
417
+ <data type="ID"/>
418
+ </attribute>
419
+ <optional>
420
+ <attribute name="align">
421
+ <ref name="Alignments"/>
422
+ </attribute>
423
+ </optional>
424
+ <zeroOrMore>
425
+ <choice>
426
+ <ref name="TextElement"/>
427
+ <ref name="fn"/>
428
+ </choice>
429
+ </zeroOrMore>
430
+ <zeroOrMore>
431
+ <ref name="note"/>
432
+ </zeroOrMore>
433
+ </element>
434
+ </define>
435
+ <define name="note">
436
+ <element name="note">
437
+ <attribute name="id">
438
+ <data type="ID"/>
439
+ </attribute>
440
+ <oneOrMore>
441
+ <ref name="paragraph"/>
442
+ </oneOrMore>
443
+ </element>
444
+ </define>
445
+ <define name="review">
446
+ <element name="review">
447
+ <attribute name="id">
448
+ <data type="ID"/>
449
+ </attribute>
450
+ <attribute name="reviewer"/>
451
+ <optional>
452
+ <attribute name="date">
453
+ <data type="dateTime"/>
454
+ </attribute>
455
+ </optional>
456
+ <attribute name="from">
457
+ <data type="IDREF"/>
458
+ </attribute>
459
+ <optional>
460
+ <attribute name="to">
461
+ <data type="IDREF"/>
462
+ </attribute>
463
+ </optional>
464
+ <oneOrMore>
465
+ <ref name="paragraph"/>
466
+ </oneOrMore>
467
+ </element>
468
+ </define>
469
+ <define name="formula">
470
+ <element name="formula">
471
+ <attribute name="id">
472
+ <data type="ID"/>
473
+ </attribute>
474
+ <optional>
475
+ <attribute name="unnumbered">
476
+ <data type="boolean"/>
477
+ </attribute>
478
+ </optional>
479
+ <ref name="stem"/>
480
+ <optional>
481
+ <ref name="dl"/>
482
+ </optional>
483
+ <zeroOrMore>
484
+ <ref name="note"/>
485
+ </zeroOrMore>
486
+ </element>
487
+ </define>
488
+ <define name="quote">
489
+ <element name="quote">
490
+ <attribute name="id">
491
+ <data type="ID"/>
492
+ </attribute>
493
+ <optional>
494
+ <attribute name="alignment">
495
+ <ref name="Alignments"/>
496
+ </attribute>
497
+ </optional>
498
+ <optional>
499
+ <ref name="quote-source"/>
500
+ </optional>
501
+ <optional>
502
+ <ref name="quote-author"/>
503
+ </optional>
504
+ <oneOrMore>
505
+ <ref name="paragraph-with-footnote"/>
506
+ </oneOrMore>
507
+ <zeroOrMore>
508
+ <ref name="note"/>
509
+ </zeroOrMore>
510
+ </element>
511
+ </define>
512
+ <define name="quote-source">
513
+ <element name="source">
514
+ <ref name="erefType"/>
515
+ </element>
516
+ </define>
517
+ <define name="quote-author">
518
+ <element name="author">
519
+ <text/>
520
+ </element>
521
+ </define>
522
+ <define name="sourcecode">
523
+ <element name="sourcecode">
524
+ <attribute name="id">
525
+ <data type="ID"/>
526
+ </attribute>
527
+ <optional>
528
+ <attribute name="unnumbered">
529
+ <data type="boolean"/>
530
+ </attribute>
531
+ </optional>
532
+ <optional>
533
+ <attribute name="lang"/>
534
+ </optional>
535
+ <optional>
536
+ <ref name="tname"/>
537
+ </optional>
538
+ <oneOrMore>
539
+ <choice>
540
+ <text/>
541
+ <ref name="callout"/>
542
+ </choice>
543
+ </oneOrMore>
544
+ <zeroOrMore>
545
+ <ref name="annotation"/>
546
+ </zeroOrMore>
547
+ <zeroOrMore>
548
+ <ref name="note"/>
549
+ </zeroOrMore>
550
+ </element>
551
+ </define>
552
+ <define name="pre">
553
+ <element name="pre">
554
+ <attribute name="id">
555
+ <data type="ID"/>
556
+ </attribute>
557
+ <optional>
558
+ <ref name="tname"/>
559
+ </optional>
560
+ <text/>
561
+ <zeroOrMore>
562
+ <ref name="note"/>
563
+ </zeroOrMore>
564
+ </element>
565
+ </define>
566
+ <define name="table">
567
+ <element name="table">
568
+ <attribute name="id">
569
+ <data type="ID"/>
570
+ </attribute>
571
+ <optional>
572
+ <attribute name="unnumbered">
573
+ <data type="boolean"/>
574
+ </attribute>
575
+ </optional>
576
+ <optional>
577
+ <attribute name="alt"/>
578
+ </optional>
579
+ <optional>
580
+ <ref name="tname"/>
581
+ </optional>
582
+ <optional>
583
+ <ref name="thead"/>
584
+ </optional>
585
+ <ref name="tbody"/>
586
+ <optional>
587
+ <ref name="tfoot"/>
588
+ </optional>
589
+ <zeroOrMore>
590
+ <ref name="table-note"/>
591
+ </zeroOrMore>
592
+ <optional>
593
+ <ref name="dl"/>
594
+ </optional>
595
+ </element>
596
+ </define>
597
+ <define name="tname">
598
+ <element name="name">
599
+ <text/>
600
+ </element>
601
+ </define>
602
+ <define name="thead">
603
+ <element name="thead">
604
+ <ref name="tr"/>
605
+ </element>
606
+ </define>
607
+ <define name="tfoot">
608
+ <element name="tfoot">
609
+ <ref name="tr"/>
610
+ </element>
611
+ </define>
612
+ <define name="tbody">
613
+ <element name="tbody">
614
+ <oneOrMore>
615
+ <ref name="tr"/>
616
+ </oneOrMore>
617
+ </element>
618
+ </define>
619
+ <define name="table-note">
620
+ <element name="note">
621
+ <ref name="paragraph"/>
622
+ </element>
623
+ </define>
624
+ <define name="tr">
625
+ <element name="tr">
626
+ <oneOrMore>
627
+ <choice>
628
+ <ref name="td"/>
629
+ <ref name="th"/>
630
+ </choice>
631
+ </oneOrMore>
632
+ </element>
633
+ </define>
634
+ <define name="td">
635
+ <element name="td">
636
+ <optional>
637
+ <attribute name="colspan"/>
638
+ </optional>
639
+ <optional>
640
+ <attribute name="rowspan"/>
641
+ </optional>
642
+ <optional>
643
+ <attribute name="align">
644
+ <choice>
645
+ <value>left</value>
646
+ <value>right</value>
647
+ <value>center</value>
648
+ </choice>
649
+ </attribute>
650
+ </optional>
651
+ <choice>
652
+ <zeroOrMore>
653
+ <ref name="TextElement"/>
654
+ </zeroOrMore>
655
+ <oneOrMore>
656
+ <ref name="paragraph-with-footnote"/>
657
+ </oneOrMore>
658
+ </choice>
659
+ </element>
660
+ </define>
661
+ <define name="th">
662
+ <element name="th">
663
+ <optional>
664
+ <attribute name="colspan"/>
665
+ </optional>
666
+ <optional>
667
+ <attribute name="rowspan"/>
668
+ </optional>
669
+ <optional>
670
+ <attribute name="align">
671
+ <choice>
672
+ <value>left</value>
673
+ <value>right</value>
674
+ <value>center</value>
675
+ </choice>
676
+ </attribute>
677
+ </optional>
678
+ <choice>
679
+ <zeroOrMore>
680
+ <ref name="TextElement"/>
681
+ </zeroOrMore>
682
+ <oneOrMore>
683
+ <ref name="paragraph-with-footnote"/>
684
+ </oneOrMore>
685
+ </choice>
686
+ </element>
687
+ </define>
688
+ <define name="example">
689
+ <element name="example">
690
+ <attribute name="id">
691
+ <data type="ID"/>
692
+ </attribute>
693
+ <optional>
694
+ <attribute name="unnumbered">
695
+ <data type="boolean"/>
696
+ </attribute>
697
+ </optional>
698
+ <oneOrMore>
699
+ <choice>
700
+ <ref name="formula"/>
701
+ <ref name="ul"/>
702
+ <ref name="ol"/>
703
+ <ref name="dl"/>
704
+ <ref name="quote"/>
705
+ <ref name="sourcecode"/>
706
+ <ref name="paragraph-with-footnote"/>
707
+ </choice>
708
+ </oneOrMore>
709
+ <zeroOrMore>
710
+ <ref name="note"/>
711
+ </zeroOrMore>
712
+ </element>
713
+ </define>
714
+ <define name="admonition">
715
+ <element name="admonition">
716
+ <attribute name="type">
717
+ <choice>
718
+ <value>warning</value>
719
+ <value>note</value>
720
+ <value>tip</value>
721
+ <value>important</value>
722
+ <value>caution</value>
723
+ </choice>
724
+ </attribute>
725
+ <attribute name="id">
726
+ <data type="ID"/>
727
+ </attribute>
728
+ <zeroOrMore>
729
+ <ref name="paragraph-with-footnote"/>
730
+ </zeroOrMore>
731
+ <zeroOrMore>
732
+ <ref name="note"/>
733
+ </zeroOrMore>
734
+ </element>
735
+ </define>
736
+ <define name="figure">
737
+ <element name="figure">
738
+ <attribute name="id">
739
+ <data type="ID"/>
740
+ </attribute>
741
+ <optional>
742
+ <attribute name="unnumbered">
743
+ <data type="boolean"/>
744
+ </attribute>
745
+ </optional>
746
+ <optional>
747
+ <ref name="source"/>
748
+ </optional>
749
+ <optional>
750
+ <ref name="tname"/>
751
+ </optional>
752
+ <choice>
753
+ <ref name="image"/>
754
+ <ref name="pre"/>
755
+ <zeroOrMore>
756
+ <ref name="figure"/>
757
+ </zeroOrMore>
758
+ </choice>
759
+ <zeroOrMore>
760
+ <ref name="fn"/>
761
+ </zeroOrMore>
762
+ <optional>
763
+ <ref name="dl"/>
764
+ </optional>
765
+ <zeroOrMore>
766
+ <ref name="note"/>
767
+ </zeroOrMore>
768
+ </element>
769
+ </define>
770
+ <define name="TextElement">
771
+ <choice>
772
+ <text/>
773
+ <ref name="em"/>
774
+ <ref name="eref"/>
775
+ <ref name="strong"/>
776
+ <ref name="stem"/>
777
+ <ref name="sub"/>
778
+ <ref name="sup"/>
779
+ <ref name="tt"/>
780
+ <ref name="keyword"/>
781
+ <ref name="strike"/>
782
+ <ref name="smallcap"/>
783
+ <ref name="xref"/>
784
+ <ref name="br"/>
785
+ <ref name="hyperlink"/>
786
+ <ref name="hr"/>
787
+ <ref name="pagebreak"/>
788
+ <ref name="bookmark"/>
789
+ </choice>
790
+ </define>
791
+ <define name="PureTextElement">
792
+ <choice>
793
+ <text/>
794
+ <ref name="em"/>
795
+ <ref name="strong"/>
796
+ <ref name="sub"/>
797
+ <ref name="sup"/>
798
+ <ref name="tt"/>
799
+ <ref name="keyword"/>
800
+ <ref name="strike"/>
801
+ <ref name="smallcap"/>
802
+ <ref name="br"/>
803
+ </choice>
804
+ </define>
805
+ <define name="source">
806
+ <element name="source">
807
+ <ref name="TypedUri"/>
808
+ </element>
809
+ </define>
810
+ <define name="em">
811
+ <element name="em">
812
+ <zeroOrMore>
813
+ <ref name="PureTextElement"/>
814
+ </zeroOrMore>
815
+ </element>
816
+ </define>
817
+ <define name="strong">
818
+ <element name="strong">
819
+ <zeroOrMore>
820
+ <ref name="PureTextElement"/>
821
+ </zeroOrMore>
822
+ </element>
823
+ </define>
824
+ <define name="tt">
825
+ <element name="tt">
826
+ <zeroOrMore>
827
+ <ref name="PureTextElement"/>
828
+ </zeroOrMore>
829
+ </element>
830
+ </define>
831
+ <define name="keyword">
832
+ <element name="keyword">
833
+ <zeroOrMore>
834
+ <ref name="PureTextElement"/>
835
+ </zeroOrMore>
836
+ </element>
837
+ </define>
838
+ <define name="sub">
839
+ <element name="sub">
840
+ <zeroOrMore>
841
+ <ref name="PureTextElement"/>
842
+ </zeroOrMore>
843
+ </element>
844
+ </define>
845
+ <define name="sup">
846
+ <element name="sup">
847
+ <zeroOrMore>
848
+ <ref name="PureTextElement"/>
849
+ </zeroOrMore>
850
+ </element>
851
+ </define>
852
+ <define name="strike">
853
+ <element name="strike">
854
+ <zeroOrMore>
855
+ <ref name="PureTextElement"/>
856
+ </zeroOrMore>
857
+ </element>
858
+ </define>
859
+ <define name="smallcap">
860
+ <element name="smallcap">
861
+ <zeroOrMore>
862
+ <ref name="PureTextElement"/>
863
+ </zeroOrMore>
864
+ </element>
865
+ </define>
866
+ <define name="br">
867
+ <element name="br">
868
+ <empty/>
869
+ </element>
870
+ </define>
871
+ <define name="hr">
872
+ <element name="hr">
873
+ <empty/>
874
+ </element>
875
+ </define>
876
+ <define name="pagebreak">
877
+ <element name="pagebreak">
878
+ <empty/>
879
+ </element>
880
+ </define>
881
+ <!-- bare ID element, used for referencing arbitrary spans of text -->
882
+ <define name="bookmark">
883
+ <element name="bookmark">
884
+ <attribute name="id">
885
+ <data type="ID"/>
886
+ </attribute>
887
+ <empty/>
888
+ </element>
889
+ </define>
890
+ <define name="ReferenceFormat">
891
+ <choice>
892
+ <value>external</value>
893
+ <value>inline</value>
894
+ <value>footnote</value>
895
+ <value>callout</value>
896
+ </choice>
897
+ </define>
898
+ <define name="eref">
899
+ <element name="eref">
900
+ <ref name="erefType"/>
901
+ </element>
902
+ </define>
903
+ <define name="erefType">
904
+ <optional>
905
+ <attribute name="normative">
906
+ <data type="boolean"/>
907
+ </attribute>
908
+ </optional>
909
+ <attribute name="citeas"/>
910
+ <attribute name="type">
911
+ <ref name="ReferenceFormat"/>
912
+ </attribute>
913
+ <ref name="CitationType"/>
914
+ <text/>
915
+ </define>
916
+ <define name="hyperlink">
917
+ <element name="link">
918
+ <attribute name="target">
919
+ <data type="anyURI"/>
920
+ </attribute>
921
+ <attribute name="type">
922
+ <ref name="ReferenceFormat"/>
923
+ </attribute>
924
+ <optional>
925
+ <attribute name="alt"/>
926
+ </optional>
927
+ <text/>
928
+ </element>
929
+ </define>
930
+ <define name="xref">
931
+ <element name="xref">
932
+ <attribute name="target">
933
+ <data type="IDREF"/>
934
+ </attribute>
935
+ <attribute name="type">
936
+ <ref name="ReferenceFormat"/>
937
+ </attribute>
938
+ <text/>
939
+ </element>
940
+ </define>
941
+ <define name="fn">
942
+ <element name="fn">
943
+ <attribute name="reference"/>
944
+ <oneOrMore>
945
+ <ref name="paragraph"/>
946
+ </oneOrMore>
947
+ </element>
948
+ </define>
949
+ <!--
950
+ This is xref with fixed @type="footnote", and @target built in as paragraph+
951
+ @reference replaces ReferenceElement/text
952
+ so <fn reference="2"><p>This is a footnote</p></fn>
953
+ corresponds to
954
+ <eref type="footnote" target="fn2">2</xref> <p id="fn2">This is a footnote</p>
955
+ -->
956
+ <define name="callout">
957
+ <element name="callout">
958
+ <attribute name="target">
959
+ <data type="IDREF"/>
960
+ </attribute>
961
+ <text/>
962
+ </element>
963
+ </define>
964
+ <!--
965
+ This is xref with fixed @type="callout"; the target by convention is in an annotation in the same source code snippet
966
+ so <callout target="xyz">1</callout>
967
+ corresponds to <xref type="callout" target="xyz">1</xref>
968
+ -->
969
+ <define name="image">
970
+ <element name="image">
971
+ <attribute name="id">
972
+ <data type="ID"/>
973
+ </attribute>
974
+ <optional>
975
+ <attribute name="src">
976
+ <data type="anyURI"/>
977
+ </attribute>
978
+ </optional>
979
+ <attribute name="imagetype">
980
+ <choice>
981
+ <value>SVG</value>
982
+ <value>JPEG</value>
983
+ <value>GIF</value>
984
+ <value>PNG</value>
985
+ <value>PDF</value>
986
+ </choice>
987
+ </attribute>
988
+ <optional>
989
+ <attribute name="width">
990
+ <choice>
991
+ <data type="int"/>
992
+ <value>auto</value>
993
+ </choice>
994
+ </attribute>
995
+ </optional>
996
+ <optional>
997
+ <attribute name="height">
998
+ <choice>
999
+ <data type="int"/>
1000
+ <value>auto</value>
1001
+ </choice>
1002
+ </attribute>
1003
+ </optional>
1004
+ <optional>
1005
+ <attribute name="alt"/>
1006
+ </optional>
1007
+ </element>
1008
+ </define>
1009
+ <define name="stem">
1010
+ <element name="stem">
1011
+ <attribute name="type">
1012
+ <choice>
1013
+ <value>MathML</value>
1014
+ <value>AsciiMath</value>
1015
+ </choice>
1016
+ </attribute>
1017
+ <oneOrMore>
1018
+ <choice>
1019
+ <text/>
1020
+ <ref name="AnyElement"/>
1021
+ </choice>
1022
+ </oneOrMore>
1023
+ </element>
1024
+ </define>
1025
+ <define name="annotation">
1026
+ <element name="annotation">
1027
+ <attribute name="id">
1028
+ <data type="ID"/>
1029
+ </attribute>
1030
+ <ref name="paragraph"/>
1031
+ </element>
1032
+ </define>
1033
+ <define name="ul">
1034
+ <element name="ul">
1035
+ <attribute name="id">
1036
+ <data type="ID"/>
1037
+ </attribute>
1038
+ <oneOrMore>
1039
+ <ref name="li"/>
1040
+ </oneOrMore>
1041
+ <zeroOrMore>
1042
+ <ref name="note"/>
1043
+ </zeroOrMore>
1044
+ </element>
1045
+ </define>
1046
+ <define name="li">
1047
+ <element name="li">
1048
+ <optional>
1049
+ <attribute name="id">
1050
+ <data type="ID"/>
1051
+ </attribute>
1052
+ </optional>
1053
+ <oneOrMore>
1054
+ <ref name="paragraph-with-footnote"/>
1055
+ </oneOrMore>
1056
+ </element>
1057
+ </define>
1058
+ <define name="ol">
1059
+ <element name="ol">
1060
+ <attribute name="id">
1061
+ <data type="ID"/>
1062
+ </attribute>
1063
+ <attribute name="type">
1064
+ <choice>
1065
+ <value>roman</value>
1066
+ <value>alphabet</value>
1067
+ <value>arabic</value>
1068
+ <value>roman_upper</value>
1069
+ <value>alphabet_upper</value>
1070
+ </choice>
1071
+ </attribute>
1072
+ <oneOrMore>
1073
+ <ref name="li"/>
1074
+ </oneOrMore>
1075
+ <zeroOrMore>
1076
+ <ref name="note"/>
1077
+ </zeroOrMore>
1078
+ </element>
1079
+ </define>
1080
+ <define name="dl">
1081
+ <element name="dl">
1082
+ <attribute name="id">
1083
+ <data type="ID"/>
1084
+ </attribute>
1085
+ <oneOrMore>
1086
+ <ref name="dt"/>
1087
+ <ref name="dd"/>
1088
+ </oneOrMore>
1089
+ <zeroOrMore>
1090
+ <ref name="note"/>
1091
+ </zeroOrMore>
1092
+ </element>
1093
+ </define>
1094
+ <define name="dt">
1095
+ <element name="dt">
1096
+ <zeroOrMore>
1097
+ <ref name="TextElement"/>
1098
+ </zeroOrMore>
1099
+ </element>
1100
+ </define>
1101
+ <define name="dd">
1102
+ <element name="dd">
1103
+ <zeroOrMore>
1104
+ <ref name="paragraph-with-footnote"/>
1105
+ </zeroOrMore>
1106
+ </element>
1107
+ </define>
1108
+ <define name="ext">
1109
+ <element name="ext">
1110
+ <ref name="BibDataExtensionType"/>
1111
+ </element>
1112
+ </define>
1113
+ <define name="BibDataExtensionType">
1114
+ <optional>
1115
+ <ref name="doctype"/>
1116
+ </optional>
1117
+ </define>
1118
+ <define name="doctype">
1119
+ <element name="doctype">
1120
+ <ref name="DocumentType"/>
1121
+ </element>
1122
+ </define>
1123
+ <define name="DocumentType">
1124
+ <value>document</value>
1125
+ </define>
1126
+ <define name="BibData">
1127
+ <ref name="BibliographicItem"/>
1128
+ <optional>
1129
+ <ref name="ext"/>
1130
+ </optional>
1131
+ </define>
1132
+ </grammar>