asciidoctor-metanorma_sample 0.3.3

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 (38) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +13 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE +25 -0
  7. data/README.adoc +13 -0
  8. data/Rakefile +6 -0
  9. data/asciidoctor-metanorma_sample.gemspec +46 -0
  10. data/bin/console +14 -0
  11. data/bin/rspec +18 -0
  12. data/bin/setup +8 -0
  13. data/lib/asciidoctor-sample.rb +10 -0
  14. data/lib/asciidoctor/sample.rb +9 -0
  15. data/lib/asciidoctor/sample/biblio.rng +631 -0
  16. data/lib/asciidoctor/sample/converter.rb +207 -0
  17. data/lib/asciidoctor/sample/isodoc.rng +1041 -0
  18. data/lib/asciidoctor/sample/isostandard.rng +1001 -0
  19. data/lib/asciidoctor/sample/pdf.js +31 -0
  20. data/lib/asciidoctor/sample/sample.rng +212 -0
  21. data/lib/asciidoctor/sample/version.rb +5 -0
  22. data/lib/isodoc/sample/html/header.html +184 -0
  23. data/lib/isodoc/sample/html/html_sample_intro.html +8 -0
  24. data/lib/isodoc/sample/html/html_sample_titlepage.html +106 -0
  25. data/lib/isodoc/sample/html/htmlstyle.scss +1028 -0
  26. data/lib/isodoc/sample/html/logo.jpg +0 -0
  27. data/lib/isodoc/sample/html/sample.scss +564 -0
  28. data/lib/isodoc/sample/html/scripts.html +82 -0
  29. data/lib/isodoc/sample/html/word_sample_intro.html +72 -0
  30. data/lib/isodoc/sample/html/word_sample_titlepage.html +75 -0
  31. data/lib/isodoc/sample/html/wordstyle.scss +1096 -0
  32. data/lib/isodoc/sample/html_convert.rb +198 -0
  33. data/lib/isodoc/sample/metadata.rb +85 -0
  34. data/lib/isodoc/sample/pdf_convert.rb +196 -0
  35. data/lib/isodoc/sample/word_convert.rb +155 -0
  36. data/lib/metanorma/sample.rb +7 -0
  37. data/lib/metanorma/sample/processor.rb +51 -0
  38. metadata +307 -0
@@ -0,0 +1,207 @@
1
+ require "asciidoctor"
2
+ require "asciidoctor/sample"
3
+ require "asciidoctor/iso/converter"
4
+ require "isodoc/sample/html_convert"
5
+ require "isodoc/sample/word_convert"
6
+
7
+ module Asciidoctor
8
+ module Sample
9
+
10
+ # A {Converter} implementation that generates RSD output, and a document
11
+ # schema encapsulation of the document for validation
12
+ #
13
+ class Converter < ISO::Converter
14
+
15
+ register_for "sample"
16
+
17
+ def metadata_author(node, xml)
18
+ xml.contributor do |c|
19
+ c.role **{ type: "author" }
20
+ c.organization do |a|
21
+ a.name "Acme"
22
+ end
23
+ end
24
+ end
25
+
26
+ def metadata_publisher(node, xml)
27
+ xml.contributor do |c|
28
+ c.role **{ type: "publisher" }
29
+ c.organization do |a|
30
+ a.name "Acme"
31
+ end
32
+ end
33
+ end
34
+
35
+ def metadata_committee(node, xml)
36
+ xml.editorialgroup do |a|
37
+ a.committee node.attr("committee"),
38
+ **attr_code(type: node.attr("committee-type"))
39
+ end
40
+ end
41
+
42
+ def title(node, xml)
43
+ ["en"].each do |lang|
44
+ xml.title **{ language: lang, format: "plain" } do |t|
45
+ t << asciidoc_sub(node.attr("title"))
46
+ end
47
+ end
48
+ end
49
+
50
+ def metadata_status(node, xml)
51
+ xml.status(**{ format: "plain" }) { |s| s << node.attr("status") }
52
+ end
53
+
54
+ def metadata_id(node, xml)
55
+ xml.docidentifier { |i| i << node.attr("docnumber") }
56
+ end
57
+
58
+ def metadata_copyright(node, xml)
59
+ from = node.attr("copyright-year") || Date.today.year
60
+ xml.copyright do |c|
61
+ c.from from
62
+ c.owner do |owner|
63
+ owner.organization do |o|
64
+ o.name "Acme"
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ def metadata_security(node, xml)
71
+ security = node.attr("security") || return
72
+ xml.security security
73
+ end
74
+
75
+ def metadata(node, xml)
76
+ super
77
+ metadata_security(node, xml)
78
+ end
79
+
80
+ def title_validate(root)
81
+ nil
82
+ end
83
+
84
+ def makexml(node)
85
+ result = ["<?xml version='1.0' encoding='UTF-8'?>\n<sample-standard>"]
86
+ @draft = node.attributes.has_key?("draft")
87
+ result << noko { |ixml| front node, ixml }
88
+ result << noko { |ixml| middle node, ixml }
89
+ result << "</sample-standard>"
90
+ result = textcleanup(result.flatten * "\n")
91
+ ret1 = cleanup(Nokogiri::XML(result))
92
+ validate(ret1)
93
+ ret1.root.add_namespace(nil, EXAMPLE_NAMESPACE)
94
+ ret1
95
+ end
96
+
97
+ def doctype(node)
98
+ d = node.attr("doctype")
99
+ unless %w{policy-and-procedures best-practices supporting-document report legal directives proposal standard}.include? d
100
+ warn "#{d} is not a legal document type: reverting to 'standard'"
101
+ d = "standard"
102
+ end
103
+ d
104
+ end
105
+
106
+ def pdf_convert(filename)
107
+ url = "#{Dir.pwd}/#{filename}.html"
108
+ pdfjs = File.join(File.dirname(__FILE__), 'pdf.js')
109
+ system "export NODE_PATH=$(npm root --quiet -g);
110
+ node #{pdfjs} file://#{url} #{filename}.pdf"
111
+ end
112
+
113
+ def document(node)
114
+ init(node)
115
+ ret1 = makexml(node)
116
+ ret = ret1.to_xml(indent: 2)
117
+ unless node.attr("nodoc") || !node.attr("docfile")
118
+ filename = node.attr("docfile").gsub(/\.adoc/, ".xml").
119
+ gsub(%r{^.*/}, "")
120
+ File.open(filename, "w") { |f| f.write(ret) }
121
+ html_converter(node).convert filename unless node.attr("nodoc")
122
+ word_converter(node).convert filename unless node.attr("nodoc")
123
+ pdf_convert(filename.sub(/\.xml$/, "")) unless node.attr("nodoc")
124
+ end
125
+ @files_to_delete.each { |f| system "rm #{f}" }
126
+ ret
127
+ end
128
+
129
+ def validate(doc)
130
+ content_validate(doc)
131
+ schema_validate(formattedstr_strip(doc.dup),
132
+ File.join(File.dirname(__FILE__), "sample.rng"))
133
+ end
134
+
135
+ def html_doc_path(file)
136
+ File.join(File.dirname(__FILE__), File.join("html", file))
137
+ end
138
+
139
+ def literal(node)
140
+ noko do |xml|
141
+ xml.figure **id_attr(node) do |f|
142
+ figure_title(node, f)
143
+ f.pre node.lines.join("\n")
144
+ end
145
+ end
146
+ end
147
+
148
+ def sections_cleanup(x)
149
+ super
150
+ x.xpath("//*[@inline-header]").each do |h|
151
+ h.delete("inline-header")
152
+ end
153
+ end
154
+
155
+ def style(n, t)
156
+ return
157
+ end
158
+
159
+ def html_converter(node)
160
+ IsoDoc::Sample::HtmlConvert.new(
161
+ script: node.attr("script"),
162
+ bodyfont: node.attr("body-font"),
163
+ headerfont: node.attr("header-font"),
164
+ monospacefont: node.attr("monospace-font"),
165
+ titlefont: node.attr("title-font"),
166
+ i18nyaml: node.attr("i18nyaml"),
167
+ scope: node.attr("scope"),
168
+ )
169
+ end
170
+
171
+ def word_converter(node)
172
+ IsoDoc::Sample::WordConvert.new(
173
+ script: node.attr("script"),
174
+ bodyfont: node.attr("body-font"),
175
+ headerfont: node.attr("header-font"),
176
+ monospacefont: node.attr("monospace-font"),
177
+ titlefont: node.attr("title-font"),
178
+ i18nyaml: node.attr("i18nyaml"),
179
+ scope: node.attr("scope"),
180
+ )
181
+ end
182
+
183
+ def inline_quoted(node)
184
+ noko do |xml|
185
+ case node.type
186
+ when :emphasis then xml.em node.text
187
+ when :strong then xml.strong node.text
188
+ when :monospaced then xml.tt node.text
189
+ when :double then xml << "\"#{node.text}\""
190
+ when :single then xml << "'#{node.text}'"
191
+ when :superscript then xml.sup node.text
192
+ when :subscript then xml.sub node.text
193
+ when :asciimath then stem_parse(node.text, xml)
194
+ else
195
+ case node.role
196
+ when "strike" then xml.strike node.text
197
+ when "smallcap" then xml.smallcap node.text
198
+ when "keyword" then xml.keyword node.text
199
+ else
200
+ xml << node.text
201
+ end
202
+ end
203
+ end.join
204
+ end
205
+ end
206
+ end
207
+ end
@@ -0,0 +1,1041 @@
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="biblio.rng"/>
22
+ <start>
23
+ <ref name="standard-document"/>
24
+ </start>
25
+ <define name="standard-document">
26
+ <element name="standard-document">
27
+ <ref name="bibdata"/>
28
+ <optional>
29
+ <ref name="version"/>
30
+ </optional>
31
+ <oneOrMore>
32
+ <ref name="sections"/>
33
+ </oneOrMore>
34
+ <zeroOrMore>
35
+ <ref name="annex"/>
36
+ </zeroOrMore>
37
+ <zeroOrMore>
38
+ <ref name="references"/>
39
+ </zeroOrMore>
40
+ </element>
41
+ </define>
42
+ <define name="bibdata">
43
+ <element name="bibdata">
44
+ <ref name="BibData"/>
45
+ </element>
46
+ </define>
47
+ <define name="status">
48
+ <element name="status">
49
+ <ref name="FormattedString"/>
50
+ </element>
51
+ </define>
52
+ <define name="version">
53
+ <element name="version">
54
+ <optional>
55
+ <ref name="vedition"/>
56
+ </optional>
57
+ <optional>
58
+ <ref name="revision-date"/>
59
+ </optional>
60
+ <zeroOrMore>
61
+ <ref name="draft"/>
62
+ </zeroOrMore>
63
+ </element>
64
+ </define>
65
+ <define name="vedition">
66
+ <element name="edition">
67
+ <data type="int"/>
68
+ </element>
69
+ </define>
70
+ <define name="revision-date">
71
+ <element name="revision-date">
72
+ <data type="date"/>
73
+ </element>
74
+ </define>
75
+ <define name="draft">
76
+ <element name="draft">
77
+ <text/>
78
+ </element>
79
+ </define>
80
+ <define name="sections">
81
+ <element name="sections">
82
+ <oneOrMore>
83
+ <choice>
84
+ <ref name="content"/>
85
+ <ref name="clause"/>
86
+ <ref name="terms"/>
87
+ <ref name="definitions"/>
88
+ </choice>
89
+ </oneOrMore>
90
+ </element>
91
+ </define>
92
+ <define name="definitions">
93
+ <element name="definitions">
94
+ <optional>
95
+ <attribute name="id">
96
+ <data type="ID"/>
97
+ </attribute>
98
+ </optional>
99
+ <optional>
100
+ <ref name="section-title"/>
101
+ </optional>
102
+ <ref name="dl"/>
103
+ </element>
104
+ </define>
105
+ <define name="section-title">
106
+ <element name="title">
107
+ <text/>
108
+ </element>
109
+ </define>
110
+ <define name="content">
111
+ <element name="content">
112
+ <ref name="Content-Section"/>
113
+ </element>
114
+ </define>
115
+ <define name="content-subsection">
116
+ <element name="clause">
117
+ <ref name="Content-Section"/>
118
+ </element>
119
+ </define>
120
+ <define name="Basic-Section">
121
+ <optional>
122
+ <attribute name="id">
123
+ <data type="ID"/>
124
+ </attribute>
125
+ </optional>
126
+ <optional>
127
+ <ref name="section-title"/>
128
+ </optional>
129
+ <oneOrMore>
130
+ <ref name="BasicBlock"/>
131
+ </oneOrMore>
132
+ <zeroOrMore>
133
+ <ref name="note"/>
134
+ </zeroOrMore>
135
+ </define>
136
+ <define name="Content-Section">
137
+ <optional>
138
+ <attribute name="id">
139
+ <data type="ID"/>
140
+ </attribute>
141
+ </optional>
142
+ <optional>
143
+ <ref name="section-title"/>
144
+ </optional>
145
+ <choice>
146
+ <group>
147
+ <oneOrMore>
148
+ <ref name="BasicBlock"/>
149
+ </oneOrMore>
150
+ <zeroOrMore>
151
+ <ref name="note"/>
152
+ </zeroOrMore>
153
+ </group>
154
+ <oneOrMore>
155
+ <ref name="content-subsection"/>
156
+ </oneOrMore>
157
+ </choice>
158
+ </define>
159
+ <define name="clause">
160
+ <element name="clause">
161
+ <ref name="Clause-Section"/>
162
+ </element>
163
+ </define>
164
+ <define name="Clause-Section">
165
+ <optional>
166
+ <attribute name="id">
167
+ <data type="ID"/>
168
+ </attribute>
169
+ </optional>
170
+ <optional>
171
+ <ref name="section-title"/>
172
+ </optional>
173
+ <choice>
174
+ <group>
175
+ <oneOrMore>
176
+ <ref name="BasicBlock"/>
177
+ </oneOrMore>
178
+ <zeroOrMore>
179
+ <ref name="note"/>
180
+ </zeroOrMore>
181
+ </group>
182
+ <oneOrMore>
183
+ <ref name="clause-subsection"/>
184
+ </oneOrMore>
185
+ </choice>
186
+ </define>
187
+ <define name="clause-subsection">
188
+ <element name="clause">
189
+ <ref name="Clause-Section"/>
190
+ </element>
191
+ </define>
192
+ <define name="annex">
193
+ <element name="annex">
194
+ <optional>
195
+ <attribute name="id">
196
+ <data type="ID"/>
197
+ </attribute>
198
+ </optional>
199
+ <attribute name="obligation">
200
+ <choice>
201
+ <value>normative</value>
202
+ <value>informative</value>
203
+ </choice>
204
+ </attribute>
205
+ <optional>
206
+ <ref name="section-title"/>
207
+ </optional>
208
+ <choice>
209
+ <group>
210
+ <oneOrMore>
211
+ <ref name="BasicBlock"/>
212
+ </oneOrMore>
213
+ <zeroOrMore>
214
+ <ref name="note"/>
215
+ </zeroOrMore>
216
+ </group>
217
+ <oneOrMore>
218
+ <ref name="clause-subsection"/>
219
+ </oneOrMore>
220
+ </choice>
221
+ </element>
222
+ </define>
223
+ <define name="references">
224
+ <element name="references">
225
+ <optional>
226
+ <attribute name="id">
227
+ <data type="ID"/>
228
+ </attribute>
229
+ </optional>
230
+ <optional>
231
+ <ref name="section-title"/>
232
+ </optional>
233
+ <zeroOrMore>
234
+ <ref name="bibitem"/>
235
+ </zeroOrMore>
236
+ </element>
237
+ </define>
238
+ <define name="terms">
239
+ <element name="terms">
240
+ <optional>
241
+ <attribute name="id">
242
+ <data type="ID"/>
243
+ </attribute>
244
+ </optional>
245
+ <oneOrMore>
246
+ <ref name="term"/>
247
+ </oneOrMore>
248
+ </element>
249
+ </define>
250
+ <define name="term">
251
+ <element name="term">
252
+ <optional>
253
+ <attribute name="id">
254
+ <data type="ID"/>
255
+ </attribute>
256
+ </optional>
257
+ <oneOrMore>
258
+ <ref name="preferred"/>
259
+ </oneOrMore>
260
+ <zeroOrMore>
261
+ <ref name="admitted"/>
262
+ </zeroOrMore>
263
+ <zeroOrMore>
264
+ <ref name="deprecates"/>
265
+ </zeroOrMore>
266
+ <optional>
267
+ <ref name="termdomain"/>
268
+ </optional>
269
+ <ref name="definition"/>
270
+ <zeroOrMore>
271
+ <ref name="termnote"/>
272
+ </zeroOrMore>
273
+ <zeroOrMore>
274
+ <ref name="termexample"/>
275
+ </zeroOrMore>
276
+ <zeroOrMore>
277
+ <ref name="termsource"/>
278
+ </zeroOrMore>
279
+ </element>
280
+ </define>
281
+ <define name="preferred">
282
+ <element name="preferred">
283
+ <oneOrMore>
284
+ <ref name="TextElement"/>
285
+ </oneOrMore>
286
+ </element>
287
+ </define>
288
+ <define name="admitted">
289
+ <element name="admitted">
290
+ <oneOrMore>
291
+ <ref name="TextElement"/>
292
+ </oneOrMore>
293
+ </element>
294
+ </define>
295
+ <define name="deprecates">
296
+ <element name="deprecates">
297
+ <oneOrMore>
298
+ <ref name="TextElement"/>
299
+ </oneOrMore>
300
+ </element>
301
+ </define>
302
+ <define name="termdomain">
303
+ <element name="domain">
304
+ <oneOrMore>
305
+ <ref name="TextElement"/>
306
+ </oneOrMore>
307
+ </element>
308
+ </define>
309
+ <define name="definition">
310
+ <element name="definition">
311
+ <ref name="paragraph"/>
312
+ </element>
313
+ </define>
314
+ <define name="termnote">
315
+ <element name="termnote">
316
+ <attribute name="id">
317
+ <data type="ID"/>
318
+ </attribute>
319
+ <ref name="paragraph"/>
320
+ </element>
321
+ </define>
322
+ <define name="termexample">
323
+ <element name="termexample">
324
+ <attribute name="id">
325
+ <data type="ID"/>
326
+ </attribute>
327
+ <ref name="BasicBlock"/>
328
+ </element>
329
+ </define>
330
+ <define name="termsource">
331
+ <element name="termsource">
332
+ <attribute name="status">
333
+ <choice>
334
+ <value>identical</value>
335
+ <value>modified</value>
336
+ </choice>
337
+ </attribute>
338
+ <ref name="origin"/>
339
+ <optional>
340
+ <ref name="modification"/>
341
+ </optional>
342
+ </element>
343
+ </define>
344
+ <define name="origin">
345
+ <element name="origin">
346
+ <ref name="erefType"/>
347
+ </element>
348
+ </define>
349
+ <define name="modification">
350
+ <element name="modification">
351
+ <ref name="paragraph"/>
352
+ </element>
353
+ </define>
354
+ <define name="BasicBlock">
355
+ <choice>
356
+ <ref name="paragraph-with-footnote"/>
357
+ <ref name="table"/>
358
+ <ref name="formula"/>
359
+ <ref name="admonition"/>
360
+ <ref name="ol"/>
361
+ <ref name="ul"/>
362
+ <ref name="dl"/>
363
+ <ref name="figure"/>
364
+ <ref name="quote"/>
365
+ <ref name="sourcecode"/>
366
+ <ref name="example"/>
367
+ <ref name="review"/>
368
+ </choice>
369
+ </define>
370
+ <define name="paragraph">
371
+ <element name="p">
372
+ <ref name="ParagraphType"/>
373
+ </element>
374
+ </define>
375
+ <define name="Alignments">
376
+ <choice>
377
+ <value>left</value>
378
+ <value>right</value>
379
+ <value>center</value>
380
+ <value>justified</value>
381
+ </choice>
382
+ </define>
383
+ <define name="ParagraphType">
384
+ <attribute name="id">
385
+ <data type="ID"/>
386
+ </attribute>
387
+ <optional>
388
+ <attribute name="align">
389
+ <ref name="Alignments"/>
390
+ </attribute>
391
+ </optional>
392
+ <zeroOrMore>
393
+ <ref name="TextElement"/>
394
+ </zeroOrMore>
395
+ <zeroOrMore>
396
+ <ref name="note"/>
397
+ </zeroOrMore>
398
+ </define>
399
+ <define name="paragraph-with-footnote">
400
+ <element name="p">
401
+ <attribute name="id">
402
+ <data type="ID"/>
403
+ </attribute>
404
+ <optional>
405
+ <attribute name="align">
406
+ <ref name="Alignments"/>
407
+ </attribute>
408
+ </optional>
409
+ <zeroOrMore>
410
+ <choice>
411
+ <ref name="TextElement"/>
412
+ <ref name="fn"/>
413
+ </choice>
414
+ </zeroOrMore>
415
+ <zeroOrMore>
416
+ <ref name="note"/>
417
+ </zeroOrMore>
418
+ </element>
419
+ </define>
420
+ <define name="note">
421
+ <element name="note">
422
+ <attribute name="id">
423
+ <data type="ID"/>
424
+ </attribute>
425
+ <oneOrMore>
426
+ <ref name="paragraph-with-footnote"/>
427
+ </oneOrMore>
428
+ </element>
429
+ </define>
430
+ <define name="review">
431
+ <element name="review">
432
+ <attribute name="id">
433
+ <data type="ID"/>
434
+ </attribute>
435
+ <attribute name="reviewer"/>
436
+ <optional>
437
+ <attribute name="date">
438
+ <data type="dateTime"/>
439
+ </attribute>
440
+ </optional>
441
+ <attribute name="from">
442
+ <data type="IDREF"/>
443
+ </attribute>
444
+ <optional>
445
+ <attribute name="to">
446
+ <data type="IDREF"/>
447
+ </attribute>
448
+ </optional>
449
+ <oneOrMore>
450
+ <ref name="paragraph"/>
451
+ </oneOrMore>
452
+ </element>
453
+ </define>
454
+ <define name="formula">
455
+ <element name="formula">
456
+ <attribute name="id">
457
+ <data type="ID"/>
458
+ </attribute>
459
+ <ref name="stem"/>
460
+ <optional>
461
+ <ref name="dl"/>
462
+ </optional>
463
+ <zeroOrMore>
464
+ <ref name="note"/>
465
+ </zeroOrMore>
466
+ </element>
467
+ </define>
468
+ <define name="quote">
469
+ <element name="quote">
470
+ <attribute name="id">
471
+ <data type="ID"/>
472
+ </attribute>
473
+ <optional>
474
+ <attribute name="alignment">
475
+ <ref name="Alignments"/>
476
+ </attribute>
477
+ </optional>
478
+ <optional>
479
+ <ref name="quote-source"/>
480
+ </optional>
481
+ <optional>
482
+ <ref name="quote-author"/>
483
+ </optional>
484
+ <oneOrMore>
485
+ <ref name="paragraph-with-footnote"/>
486
+ </oneOrMore>
487
+ <zeroOrMore>
488
+ <ref name="note"/>
489
+ </zeroOrMore>
490
+ </element>
491
+ </define>
492
+ <define name="quote-source">
493
+ <element name="source">
494
+ <ref name="erefType"/>
495
+ </element>
496
+ </define>
497
+ <define name="quote-author">
498
+ <element name="author">
499
+ <text/>
500
+ </element>
501
+ </define>
502
+ <define name="sourcecode">
503
+ <element name="sourcecode">
504
+ <attribute name="id">
505
+ <data type="ID"/>
506
+ </attribute>
507
+ <optional>
508
+ <ref name="tname"/>
509
+ </optional>
510
+ <oneOrMore>
511
+ <choice>
512
+ <text/>
513
+ <ref name="callout"/>
514
+ </choice>
515
+ </oneOrMore>
516
+ <zeroOrMore>
517
+ <ref name="annotation"/>
518
+ </zeroOrMore>
519
+ <zeroOrMore>
520
+ <ref name="note"/>
521
+ </zeroOrMore>
522
+ </element>
523
+ </define>
524
+ <define name="table">
525
+ <element name="table">
526
+ <attribute name="id">
527
+ <data type="ID"/>
528
+ </attribute>
529
+ <optional>
530
+ <ref name="tname"/>
531
+ </optional>
532
+ <optional>
533
+ <ref name="thead"/>
534
+ </optional>
535
+ <ref name="tbody"/>
536
+ <optional>
537
+ <ref name="tfoot"/>
538
+ </optional>
539
+ <zeroOrMore>
540
+ <ref name="table-note"/>
541
+ </zeroOrMore>
542
+ <optional>
543
+ <ref name="dl"/>
544
+ </optional>
545
+ </element>
546
+ </define>
547
+ <define name="tname">
548
+ <element name="name">
549
+ <text/>
550
+ </element>
551
+ </define>
552
+ <define name="thead">
553
+ <element name="thead">
554
+ <ref name="tr"/>
555
+ </element>
556
+ </define>
557
+ <define name="tfoot">
558
+ <element name="tfoot">
559
+ <ref name="tr"/>
560
+ </element>
561
+ </define>
562
+ <define name="tbody">
563
+ <element name="tbody">
564
+ <oneOrMore>
565
+ <ref name="tr"/>
566
+ </oneOrMore>
567
+ </element>
568
+ </define>
569
+ <define name="table-note">
570
+ <element name="note">
571
+ <ref name="paragraph"/>
572
+ </element>
573
+ </define>
574
+ <define name="tr">
575
+ <element name="tr">
576
+ <oneOrMore>
577
+ <choice>
578
+ <ref name="td"/>
579
+ <ref name="th"/>
580
+ </choice>
581
+ </oneOrMore>
582
+ </element>
583
+ </define>
584
+ <define name="td">
585
+ <element name="td">
586
+ <optional>
587
+ <attribute name="colspan"/>
588
+ </optional>
589
+ <optional>
590
+ <attribute name="rowspan"/>
591
+ </optional>
592
+ <optional>
593
+ <attribute name="align">
594
+ <choice>
595
+ <value>left</value>
596
+ <value>right</value>
597
+ <value>center</value>
598
+ </choice>
599
+ </attribute>
600
+ </optional>
601
+ <choice>
602
+ <zeroOrMore>
603
+ <ref name="TextElement"/>
604
+ </zeroOrMore>
605
+ <oneOrMore>
606
+ <ref name="paragraph-with-footnote"/>
607
+ </oneOrMore>
608
+ </choice>
609
+ </element>
610
+ </define>
611
+ <define name="th">
612
+ <element name="th">
613
+ <optional>
614
+ <attribute name="colspan"/>
615
+ </optional>
616
+ <optional>
617
+ <attribute name="rowspan"/>
618
+ </optional>
619
+ <optional>
620
+ <attribute name="align">
621
+ <choice>
622
+ <value>left</value>
623
+ <value>right</value>
624
+ <value>center</value>
625
+ </choice>
626
+ </attribute>
627
+ </optional>
628
+ <choice>
629
+ <zeroOrMore>
630
+ <ref name="TextElement"/>
631
+ </zeroOrMore>
632
+ <oneOrMore>
633
+ <ref name="paragraph-with-footnote"/>
634
+ </oneOrMore>
635
+ </choice>
636
+ </element>
637
+ </define>
638
+ <define name="example">
639
+ <element name="example">
640
+ <attribute name="id">
641
+ <data type="ID"/>
642
+ </attribute>
643
+ <oneOrMore>
644
+ <choice>
645
+ <ref name="formula"/>
646
+ <ref name="ul"/>
647
+ <ref name="ol"/>
648
+ <ref name="dl"/>
649
+ <ref name="quote"/>
650
+ <ref name="sourcecode"/>
651
+ <ref name="paragraph-with-footnote"/>
652
+ </choice>
653
+ </oneOrMore>
654
+ <zeroOrMore>
655
+ <ref name="note"/>
656
+ </zeroOrMore>
657
+ </element>
658
+ </define>
659
+ <define name="admonition">
660
+ <element name="admonition">
661
+ <attribute name="type">
662
+ <choice>
663
+ <value>warning</value>
664
+ <value>note</value>
665
+ <value>tip</value>
666
+ <value>important</value>
667
+ <value>caution</value>
668
+ </choice>
669
+ </attribute>
670
+ <attribute name="id">
671
+ <data type="ID"/>
672
+ </attribute>
673
+ <zeroOrMore>
674
+ <ref name="paragraph-with-footnote"/>
675
+ </zeroOrMore>
676
+ <zeroOrMore>
677
+ <ref name="note"/>
678
+ </zeroOrMore>
679
+ </element>
680
+ </define>
681
+ <define name="figure">
682
+ <element name="figure">
683
+ <attribute name="id">
684
+ <data type="ID"/>
685
+ </attribute>
686
+ <optional>
687
+ <ref name="source"/>
688
+ </optional>
689
+ <optional>
690
+ <ref name="tname"/>
691
+ </optional>
692
+ <choice>
693
+ <oneOrMore>
694
+ <ref name="figure"/>
695
+ </oneOrMore>
696
+ <group>
697
+ <zeroOrMore>
698
+ <ref name="TextElement"/>
699
+ </zeroOrMore>
700
+ <zeroOrMore>
701
+ <ref name="note"/>
702
+ </zeroOrMore>
703
+ <optional>
704
+ <ref name="dl"/>
705
+ </optional>
706
+ </group>
707
+ </choice>
708
+ </element>
709
+ </define>
710
+ <define name="TextElement">
711
+ <choice>
712
+ <text/>
713
+ <ref name="em"/>
714
+ <ref name="eref"/>
715
+ <ref name="strong"/>
716
+ <ref name="stem"/>
717
+ <ref name="sub"/>
718
+ <ref name="sup"/>
719
+ <ref name="tt"/>
720
+ <ref name="strike"/>
721
+ <ref name="smallcap"/>
722
+ <ref name="xref"/>
723
+ <ref name="br"/>
724
+ <ref name="hyperlink"/>
725
+ <ref name="hr"/>
726
+ <ref name="pagebreak"/>
727
+ <ref name="bookmark"/>
728
+ </choice>
729
+ </define>
730
+ <define name="source">
731
+ <element name="source">
732
+ <ref name="TypedUri"/>
733
+ </element>
734
+ </define>
735
+ <define name="em">
736
+ <element name="em">
737
+ <text/>
738
+ </element>
739
+ </define>
740
+ <define name="strong">
741
+ <element name="strong">
742
+ <text/>
743
+ </element>
744
+ </define>
745
+ <define name="tt">
746
+ <element name="tt">
747
+ <text/>
748
+ </element>
749
+ </define>
750
+ <define name="sub">
751
+ <element name="sub">
752
+ <text/>
753
+ </element>
754
+ </define>
755
+ <define name="sup">
756
+ <element name="sup">
757
+ <text/>
758
+ </element>
759
+ </define>
760
+ <define name="strike">
761
+ <element name="strike">
762
+ <text/>
763
+ </element>
764
+ </define>
765
+ <define name="smallcap">
766
+ <element name="smallcap">
767
+ <text/>
768
+ </element>
769
+ </define>
770
+ <define name="br">
771
+ <element name="br">
772
+ <empty/>
773
+ </element>
774
+ </define>
775
+ <define name="hr">
776
+ <element name="hr">
777
+ <empty/>
778
+ </element>
779
+ </define>
780
+ <define name="pagebreak">
781
+ <element name="pagebreak">
782
+ <empty/>
783
+ </element>
784
+ </define>
785
+ <!-- bare ID element, used for referencing arbitrary spans of text -->
786
+ <define name="bookmark">
787
+ <element name="bookmark">
788
+ <attribute name="id">
789
+ <data type="ID"/>
790
+ </attribute>
791
+ <empty/>
792
+ </element>
793
+ </define>
794
+ <define name="ReferenceFormat">
795
+ <choice>
796
+ <value>external</value>
797
+ <value>inline</value>
798
+ <value>footnote</value>
799
+ <value>callout</value>
800
+ </choice>
801
+ </define>
802
+ <define name="eref">
803
+ <element name="eref">
804
+ <ref name="erefType"/>
805
+ </element>
806
+ </define>
807
+ <define name="erefType">
808
+ <optional>
809
+ <attribute name="normative">
810
+ <data type="boolean"/>
811
+ </attribute>
812
+ </optional>
813
+ <attribute name="citeas"/>
814
+ <attribute name="type">
815
+ <ref name="ReferenceFormat"/>
816
+ </attribute>
817
+ <ref name="CitationType"/>
818
+ <text/>
819
+ </define>
820
+ <define name="hyperlink">
821
+ <element name="link">
822
+ <attribute name="target">
823
+ <data type="anyURI"/>
824
+ </attribute>
825
+ <attribute name="type">
826
+ <ref name="ReferenceFormat"/>
827
+ </attribute>
828
+ <text/>
829
+ </element>
830
+ </define>
831
+ <define name="xref">
832
+ <element name="xref">
833
+ <attribute name="target">
834
+ <data type="IDREF"/>
835
+ </attribute>
836
+ <attribute name="type">
837
+ <ref name="ReferenceFormat"/>
838
+ </attribute>
839
+ <text/>
840
+ </element>
841
+ </define>
842
+ <define name="fn">
843
+ <element name="fn">
844
+ <attribute name="reference"/>
845
+ <oneOrMore>
846
+ <ref name="paragraph"/>
847
+ </oneOrMore>
848
+ </element>
849
+ </define>
850
+ <!--
851
+ This is xref with fixed @type="footnote", and @target built in as paragraph+
852
+ @reference replaces ReferenceElement/text
853
+ so <fn reference="2"><p>This is a footnote</p></fn>
854
+ corresponds to
855
+ <eref type="footnote" target="fn2">2</xref> <p id="fn2">This is a footnote</p>
856
+ -->
857
+ <define name="callout">
858
+ <element name="callout">
859
+ <attribute name="target">
860
+ <data type="IDREF"/>
861
+ </attribute>
862
+ <text/>
863
+ </element>
864
+ </define>
865
+ <!--
866
+ This is xref with fixed @type="callout"; the target by convention is in an annotation in the same source code snippet
867
+ so <callout target="xyz">1</callout>
868
+ corresponds to <xref type="callout" target="xyz">1</xref>
869
+ -->
870
+ <define name="image">
871
+ <element name="image">
872
+ <attribute name="id">
873
+ <data type="ID"/>
874
+ </attribute>
875
+ <optional>
876
+ <attribute name="src">
877
+ <data type="anyURI"/>
878
+ </attribute>
879
+ </optional>
880
+ <attribute name="imagetype">
881
+ <choice>
882
+ <value>SVG</value>
883
+ <value>JPEG</value>
884
+ <value>GIF</value>
885
+ <value>PNG</value>
886
+ <value>PDF</value>
887
+ </choice>
888
+ </attribute>
889
+ <optional>
890
+ <attribute name="width">
891
+ <choice>
892
+ <data type="int"/>
893
+ <value>auto</value>
894
+ </choice>
895
+ </attribute>
896
+ </optional>
897
+ <optional>
898
+ <attribute name="height">
899
+ <choice>
900
+ <data type="int"/>
901
+ <value>auto</value>
902
+ </choice>
903
+ </attribute>
904
+ </optional>
905
+ </element>
906
+ </define>
907
+ <define name="stem">
908
+ <element name="stem">
909
+ <attribute name="type">
910
+ <choice>
911
+ <value>MathML</value>
912
+ <value>AsciiMath</value>
913
+ </choice>
914
+ </attribute>
915
+ <text/>
916
+ </element>
917
+ </define>
918
+ <define name="annotation">
919
+ <element name="annotation">
920
+ <attribute name="id">
921
+ <data type="ID"/>
922
+ </attribute>
923
+ <ref name="paragraph"/>
924
+ </element>
925
+ </define>
926
+ <define name="ul">
927
+ <element name="ul">
928
+ <attribute name="id">
929
+ <data type="ID"/>
930
+ </attribute>
931
+ <oneOrMore>
932
+ <ref name="li"/>
933
+ </oneOrMore>
934
+ <zeroOrMore>
935
+ <ref name="note"/>
936
+ </zeroOrMore>
937
+ </element>
938
+ </define>
939
+ <define name="li">
940
+ <element name="li">
941
+ <oneOrMore>
942
+ <ref name="paragraph-with-footnote"/>
943
+ </oneOrMore>
944
+ </element>
945
+ </define>
946
+ <define name="ol">
947
+ <element name="ol">
948
+ <attribute name="id">
949
+ <data type="ID"/>
950
+ </attribute>
951
+ <attribute name="type">
952
+ <choice>
953
+ <value>roman</value>
954
+ <value>alphabet</value>
955
+ <value>arabic</value>
956
+ <value>roman_upper</value>
957
+ <value>alphabet_upper</value>
958
+ </choice>
959
+ </attribute>
960
+ <oneOrMore>
961
+ <ref name="li"/>
962
+ </oneOrMore>
963
+ <zeroOrMore>
964
+ <ref name="note"/>
965
+ </zeroOrMore>
966
+ </element>
967
+ </define>
968
+ <define name="dl">
969
+ <element name="dl">
970
+ <attribute name="id">
971
+ <data type="ID"/>
972
+ </attribute>
973
+ <oneOrMore>
974
+ <ref name="dt"/>
975
+ <ref name="dd"/>
976
+ </oneOrMore>
977
+ <zeroOrMore>
978
+ <ref name="note"/>
979
+ </zeroOrMore>
980
+ </element>
981
+ </define>
982
+ <define name="dt">
983
+ <element name="dt">
984
+ <ref name="TextElement"/>
985
+ </element>
986
+ </define>
987
+ <define name="dd">
988
+ <element name="dd">
989
+ <zeroOrMore>
990
+ <ref name="paragraph-with-footnote"/>
991
+ </zeroOrMore>
992
+ </element>
993
+ </define>
994
+ <define name="BibData">
995
+ <optional>
996
+ <attribute name="type">
997
+ <ref name="BibItemType"/>
998
+ </attribute>
999
+ </optional>
1000
+ <oneOrMore>
1001
+ <ref name="btitle"/>
1002
+ </oneOrMore>
1003
+ <optional>
1004
+ <ref name="formattedref"/>
1005
+ </optional>
1006
+ <zeroOrMore>
1007
+ <ref name="bsource"/>
1008
+ </zeroOrMore>
1009
+ <zeroOrMore>
1010
+ <ref name="docidentifier"/>
1011
+ </zeroOrMore>
1012
+ <zeroOrMore>
1013
+ <ref name="bdate"/>
1014
+ </zeroOrMore>
1015
+ <zeroOrMore>
1016
+ <ref name="contributor"/>
1017
+ </zeroOrMore>
1018
+ <optional>
1019
+ <ref name="edition"/>
1020
+ </optional>
1021
+ <zeroOrMore>
1022
+ <ref name="biblionote"/>
1023
+ </zeroOrMore>
1024
+ <zeroOrMore>
1025
+ <ref name="language"/>
1026
+ </zeroOrMore>
1027
+ <zeroOrMore>
1028
+ <ref name="script"/>
1029
+ </zeroOrMore>
1030
+ <optional>
1031
+ <ref name="abstract"/>
1032
+ </optional>
1033
+ <optional>
1034
+ <ref name="status"/>
1035
+ </optional>
1036
+ <ref name="copyright"/>
1037
+ <zeroOrMore>
1038
+ <ref name="docrelation"/>
1039
+ </zeroOrMore>
1040
+ </define>
1041
+ </grammar>