metanorma-standoc 1.4.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asciidoctor/standoc/base.rb +2 -2
  3. data/lib/asciidoctor/standoc/biblio.rng +1 -1
  4. data/lib/asciidoctor/standoc/blocks.rb +25 -95
  5. data/lib/asciidoctor/standoc/blocks_notes.rb +89 -0
  6. data/lib/asciidoctor/standoc/cleanup.rb +10 -6
  7. data/lib/asciidoctor/standoc/cleanup_inline.rb +1 -1
  8. data/lib/asciidoctor/standoc/cleanup_ref.rb +45 -0
  9. data/lib/asciidoctor/standoc/isodoc.rng +427 -0
  10. data/lib/asciidoctor/standoc/lists.rb +12 -12
  11. data/lib/asciidoctor/standoc/macros_yaml2text.rb +32 -15
  12. data/lib/asciidoctor/standoc/ref.rb +71 -29
  13. data/lib/asciidoctor/standoc/reqt.rb +11 -6
  14. data/lib/asciidoctor/standoc/reqt.rng +23 -0
  15. data/lib/asciidoctor/standoc/table.rb +3 -2
  16. data/lib/asciidoctor/standoc/views/datamodel/model_representation.adoc.erb +1 -1
  17. data/lib/metanorma/standoc/version.rb +1 -1
  18. data/spec/asciidoctor-standoc/blocks_spec.rb +55 -26
  19. data/spec/asciidoctor-standoc/cleanup_spec.rb +1 -1
  20. data/spec/asciidoctor-standoc/datamodel/attributes_table_preprocessor_spec.rb +35 -0
  21. data/spec/asciidoctor-standoc/lists_spec.rb +7 -5
  22. data/spec/asciidoctor-standoc/macros_spec.rb +3 -2
  23. data/spec/asciidoctor-standoc/refs_spec.rb +250 -5
  24. data/spec/asciidoctor-standoc/table_spec.rb +2 -2
  25. data/spec/asciidoctor-standoc/validate_spec.rb +56 -0
  26. data/spec/assets/iso123.rxl +107 -0
  27. data/spec/examples/datamodel/blank_definition_profile.adoc +4 -0
  28. data/spec/examples/datamodel/models/models/{Signature copy.yml → SignatureBlankDefinition.yml} +2 -2
  29. data/spec/fixtures/macros_datamodel/blank_definition_profile.xml +51 -0
  30. metadata +7 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e86d9135fffb1f112db82f9d052632aa36f134a76b03ff48e65dcb841c7cbb4
4
- data.tar.gz: ea05dff988ebaf6b51c029d99cbadd195300c3c524acd301157a335257436c01
3
+ metadata.gz: ec38f1dc395a1d89eb57193772856d31e40e0d4e725f449884529f794a77c341
4
+ data.tar.gz: be6615f68c933d6028ef70aad058e4ec042d7ff5eabdf489c13abe7743aa1010
5
5
  SHA512:
6
- metadata.gz: beead161e217dba5841732200aa8cb897900ea90b1a449f092fe63ffe40ca59a6b904b098affd1a475723ac4663ba5dadd09fdab48b661376c4fe659360c79a4
7
- data.tar.gz: 43b697f04165938864eab22a1d4d49613adef7ae1703995a5541018fe438f09ff21dd43e37e25ebeab9a0d514b50f64b64d2a8a47c8836b924d4578b9f076d19
6
+ metadata.gz: 425e48990782c8de5e70d18fb3404eebdfa9b7c0bf1e6e454e89451e4593266d80b87981162881eac9e17aa5dcf6f711e3f2c4c4d61141be15b396446163bb30
7
+ data.tar.gz: 4d534831af15ebdd19c9e81ea000a13022cd1ed2ff0e9c1bedab90a829cbb105dd454adfe72befedd3341d5a47ca6920925ea6de77266259f93a17f25287a62a
@@ -192,7 +192,7 @@ module Asciidoctor
192
192
  end
193
193
  end
194
194
 
195
- def term_source_attr(seen_xref)
195
+ def term_source_attrs(seen_xref)
196
196
  { bibitemid: seen_xref.children[0]["target"],
197
197
  format: seen_xref.children[0]["format"],
198
198
  type: "inline" }
@@ -203,7 +203,7 @@ module Asciidoctor
203
203
  xml_t.origin { |o| o << seen_xref.children[0].to_xml }
204
204
  else
205
205
  xml_t.origin seen_xref.children[0].content,
206
- **attr_code(term_source_attr(seen_xref))
206
+ **attr_code(term_source_attrs(seen_xref))
207
207
  end
208
208
  m[:text] && xml_t.modification do |mod|
209
209
  mod.p { |p| p << m[:text].sub(/^\s+/, "") }
@@ -532,7 +532,7 @@
532
532
  </define>
533
533
  <define name="LocalityType">
534
534
  <data type="string">
535
- <param name="pattern">section|clause|part|paragraph|chapter|page|whole|table|annex|figure|note|list|example|volume|issue|time|locality:[a-zA-Z0-9_]+</param>
535
+ <param name="pattern">section|clause|part|paragraph|chapter|page|whole|table|annex|figure|note|list|example|volume|issue|time|anchor|locality:[a-zA-Z0-9_]+</param>
536
536
  </data>
537
537
  </define>
538
538
  <define name="referenceFrom">
@@ -1,5 +1,6 @@
1
1
  require "htmlentities"
2
2
  require "uri"
3
+ require_relative "./blocks_notes"
3
4
 
4
5
  module Asciidoctor
5
6
  module Standoc
@@ -8,28 +9,21 @@ module Asciidoctor
8
9
  { id: Utils::anchor_or_uuid(node) }
9
10
  end
10
11
 
11
- def id_unnum_attr(node)
12
+ def id_unnum_attrs(node)
12
13
  attr_code( id: Utils::anchor_or_uuid(node),
13
14
  unnumbered: node.option?("unnumbered") ? "true" : nil,
15
+ number: node.attr("number"),
14
16
  subsequence: node.attr("subsequence") )
15
17
  end
16
18
 
17
- def formula_attr(node)
18
- attr_code( id: Utils::anchor_or_uuid(node),
19
- inequality: node.option?("inequality") ? "true" : nil,
20
- unnumbered: node.option?("unnumbered") ? "true" : nil,
21
- subsequence: node.attr("subsequence") )
22
- end
23
-
24
- def termnote_attr(node)
25
- attr_code(id_attr(node).merge(
26
- "keep-separate": node.attr("keep-separate")))
19
+ def formula_attrs(node)
20
+ attr_code(id_unnum_attrs(node).merge(keep_attrs(node).merge(
21
+ inequality: node.option?("inequality") ? "true" : nil)))
27
22
  end
28
23
 
29
- def note_attr(node)
30
- attr_code(id_attr(node).merge(
31
- "keep-separate": node.attr("keep-separate"),
32
- beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil))
24
+ def keep_attrs(node)
25
+ { "keep-with-next": node.attr("keep-with-next"),
26
+ "keep-lines-together": node.attr("keep-lines-together") }
33
27
  end
34
28
 
35
29
  # We append each contained block to its parent
@@ -44,7 +38,7 @@ module Asciidoctor
44
38
  end
45
39
 
46
40
  def literal_attrs(node)
47
- attr_code(id_attr(node))
41
+ attr_code(id_attr(node).merge(keep_attrs(node)))
48
42
  end
49
43
 
50
44
  def literal(node)
@@ -60,80 +54,12 @@ module Asciidoctor
60
54
  # NOTE: html escaping is performed by Nokogiri
61
55
  def stem(node)
62
56
  noko do |xml|
63
- xml.formula **formula_attr(node) do |s|
57
+ xml.formula **formula_attrs(node) do |s|
64
58
  stem_parse(node.lines.join("\n"), s, node.style.to_sym)
65
59
  end
66
60
  end
67
61
  end
68
62
 
69
- def sidebar_attrs(node)
70
- todo_attrs(node).merge(attr_code(
71
- from: node.attr("from"), to: node.attr("to") || node.attr("from") ))
72
- end
73
-
74
- def sidebar(node)
75
- return unless draft?
76
- noko do |xml|
77
- xml.review **(sidebar_attrs(node)) do |r|
78
- wrap_in_para(node, r)
79
- end
80
- end
81
- end
82
-
83
- def todo_attrs(node)
84
- date = node.attr("date") || Date.today.iso8601.gsub(/\+.*$/, "")
85
- date += "T00:00:00Z" unless /T/.match date
86
- attr_code(
87
- id: Utils::anchor_or_uuid(node),
88
- reviewer: node.attr("reviewer") || node.attr("source") || "(Unknown)",
89
- date: date )
90
- end
91
-
92
- def todo(node)
93
- noko do |xml|
94
- xml.review **(todo_attrs(node)) do |r|
95
- wrap_in_para(node, r)
96
- end
97
- end
98
- end
99
-
100
- def termnote(n)
101
- noko do |xml|
102
- xml.termnote **termnote_attr(n) do |ex|
103
- wrap_in_para(n, ex)
104
- end
105
- end.join("\n")
106
- end
107
-
108
- def note(n)
109
- noko do |xml|
110
- xml.note **note_attr(n) do |c|
111
- wrap_in_para(n, c)
112
- end
113
- end.join("\n")
114
- end
115
-
116
- def admonition_attrs(node)
117
- name = node.attr("name")
118
- a = node.attr("type") and ["danger", "safety precautions"].each do |t|
119
- name = t if a.casecmp(t).zero?
120
- end
121
- attr_code(id: Utils::anchor_or_uuid(node), type: name,
122
- beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil)
123
- end
124
-
125
- def admonition(node)
126
- return termnote(node) if in_terms?
127
- return note(node) if node.attr("name") == "note"
128
- return todo(node) if node.attr("name") == "todo"
129
- noko do |xml|
130
- xml.admonition **admonition_attrs(node) do |a|
131
- node.title.nil? or a.name { |name| name << node.title }
132
- wrap_in_para(node, a)
133
- end
134
- end.join("\n")
135
- end
136
-
137
63
  def term_example(node)
138
64
  noko do |xml|
139
65
  xml.termexample **id_attr(node) do |ex|
@@ -155,7 +81,7 @@ module Asciidoctor
155
81
  # prevent A's and other subs inappropriate for pseudocode
156
82
  node.blocks.each { |b| b.remove_sub(:replacements) }
157
83
  noko do |xml|
158
- xml.figure **id_unnum_attr(node).merge(class: "pseudocode") do |ex|
84
+ xml.figure **example_attrs(node).merge(class: "pseudocode") do |ex|
159
85
  figure_title(node, ex)
160
86
  wrap_in_para(node, ex)
161
87
  end
@@ -163,7 +89,7 @@ module Asciidoctor
163
89
  end
164
90
 
165
91
  def example_attrs(node)
166
- attr_code(id_unnum_attr(node))
92
+ attr_code(id_unnum_attrs(node).merge(keep_attrs(node)))
167
93
  end
168
94
 
169
95
  def example_proper(node)
@@ -181,7 +107,7 @@ module Asciidoctor
181
107
  end
182
108
 
183
109
  def figure_attrs(node)
184
- attr_code(id_unnum_attr(node))
110
+ attr_code(id_unnum_attrs(node).merge(keep_attrs(node)))
185
111
  end
186
112
 
187
113
  def image(node)
@@ -194,7 +120,8 @@ module Asciidoctor
194
120
  end
195
121
 
196
122
  def para_attrs(node)
197
- attr_code(align: node.attr("align"), id: Utils::anchor_or_uuid(node))
123
+ attr_code(keep_attrs(node).merge(align: node.attr("align"),
124
+ id: Utils::anchor_or_uuid(node)))
198
125
  end
199
126
 
200
127
  def paragraph(node)
@@ -207,7 +134,8 @@ module Asciidoctor
207
134
  end
208
135
 
209
136
  def quote_attrs(node)
210
- attr_code(id: Utils::anchor_or_uuid(node), align: node.attr("align"))
137
+ attr_code(keep_attrs(node).merge(align: node.attr("align"),
138
+ id: Utils::anchor_or_uuid(node)))
211
139
  end
212
140
 
213
141
  def quote_attribution(node, out)
@@ -231,10 +159,11 @@ module Asciidoctor
231
159
  end
232
160
 
233
161
  def listing_attrs(node)
234
- attr_code(lang: node.attr("language"),
235
- id: Utils::anchor_or_uuid(node),
236
- unnumbered: node.option?("unnumbered") ? "true" : nil,
237
- filename: node.attr("filename"))
162
+ attr_code(keep_attrs(node).merge(lang: node.attr("language"),
163
+ id: Utils::anchor_or_uuid(node),
164
+ unnumbered: node.option?("unnumbered") ? "true" : nil,
165
+ number: node.attr("number"),
166
+ filename: node.attr("filename")))
238
167
  end
239
168
 
240
169
  # NOTE: html escaping is performed by Nokogiri
@@ -251,7 +180,8 @@ module Asciidoctor
251
180
 
252
181
  def pass(node)
253
182
  noko do |xml|
254
- xml.passthrough **attr_code(formats: node.attr("format")) do |p|
183
+ xml.passthrough **attr_code(formats:
184
+ node.attr("format") || "metanorma") do |p|
255
185
  p << HTMLEntities.new.encode(node.content, :basic, :hexadecimal)
256
186
  end
257
187
  end
@@ -0,0 +1,89 @@
1
+ module Asciidoctor
2
+ module Standoc
3
+ module Blocks
4
+ def termnote_attrs(node)
5
+ attr_code(id_attr(node).merge(
6
+ unnumbered: node.attr("unnumbered"),
7
+ number: node.attr("number"),
8
+ subsequence: node.attr("subsequence"),
9
+ "keep-with-next": node.attr("keep-with-next"),
10
+ "keep-lines-together": node.attr("keep-with-next"),
11
+ "keep-separate": node.attr("keep-separate")))
12
+ end
13
+
14
+ def note_attrs(node)
15
+ attr_code(termnote_attrs(node).merge(
16
+ type: node.attr("type"),
17
+ beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil))
18
+ end
19
+
20
+ def sidebar_attrs(node)
21
+ todo_attrs(node).merge(attr_code(
22
+ from: node.attr("from"), to: node.attr("to") || node.attr("from") ))
23
+ end
24
+
25
+ def sidebar(node)
26
+ return unless draft?
27
+ noko do |xml|
28
+ xml.review **(sidebar_attrs(node)) do |r|
29
+ wrap_in_para(node, r)
30
+ end
31
+ end
32
+ end
33
+
34
+ def todo_attrs(node)
35
+ date = node.attr("date") || Date.today.iso8601.gsub(/\+.*$/, "")
36
+ date += "T00:00:00Z" unless /T/.match date
37
+ attr_code(
38
+ id: Utils::anchor_or_uuid(node),
39
+ reviewer: node.attr("reviewer") || node.attr("source") || "(Unknown)",
40
+ date: date )
41
+ end
42
+
43
+ def todo(node)
44
+ noko do |xml|
45
+ xml.review **(todo_attrs(node)) do |r|
46
+ wrap_in_para(node, r)
47
+ end
48
+ end
49
+ end
50
+
51
+ def termnote(n)
52
+ noko do |xml|
53
+ xml.termnote **termnote_attrs(n) do |ex|
54
+ wrap_in_para(n, ex)
55
+ end
56
+ end.join("\n")
57
+ end
58
+
59
+ def note(n)
60
+ noko do |xml|
61
+ xml.note **note_attrs(n) do |c|
62
+ wrap_in_para(n, c)
63
+ end
64
+ end.join("\n")
65
+ end
66
+
67
+ def admonition_attrs(node)
68
+ name = node.attr("name")
69
+ a = node.attr("type") and ["danger", "safety precautions"].each do |t|
70
+ name = t if a.casecmp(t).zero?
71
+ end
72
+ attr_code(keep_attrs(node).merge(id: Utils::anchor_or_uuid(node), type: name,
73
+ beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil))
74
+ end
75
+
76
+ def admonition(node)
77
+ return termnote(node) if in_terms?
78
+ return note(node) if node.attr("name") == "note"
79
+ return todo(node) if node.attr("name") == "todo"
80
+ noko do |xml|
81
+ xml.admonition **admonition_attrs(node) do |a|
82
+ node.title.nil? or a.name { |name| name << node.title }
83
+ wrap_in_para(node, a)
84
+ end
85
+ end.join("\n")
86
+ end
87
+ end
88
+ end
89
+ end
@@ -16,8 +16,14 @@ module Asciidoctor
16
16
  module Cleanup
17
17
  def textcleanup(result)
18
18
  text = result.flatten.map { |l| l.sub(/\s*$/, "") } * "\n"
19
- if !@keepasciimath
20
- text = text.gsub(%r{<stem type="AsciiMath">(.+?)</stem>}m) do |m|
19
+ !@keepasciimath and text = asciimath2mathml(text)
20
+ text = text.gsub(/\s+<fn /, "<fn ")
21
+ text.gsub(%r{<passthrough\s+formats="metanorma">([^<]*)
22
+ </passthrough>}mx) { |m| HTMLEntities.new.decode($1) }
23
+ end
24
+
25
+ def asciimath2mathml(text)
26
+ text = text.gsub(%r{<stem type="AsciiMath">(.+?)</stem>}m) do |m|
21
27
  "<amathstem>#{HTMLEntities.new.decode($1)}</amathstem>"
22
28
  end
23
29
  text = Html2Doc.
@@ -26,9 +32,7 @@ module Asciidoctor
26
32
  x.xpath("//*[local-name() = 'math'][not(parent::stem)]").each do |y|
27
33
  y.wrap("<stem type='MathML'></stem>")
28
34
  end
29
- text = x.to_xml
30
- end
31
- text.gsub(/\s+<fn /, "<fn ")
35
+ x.to_xml
32
36
  end
33
37
 
34
38
  def cleanup(xmldoc)
@@ -41,7 +45,7 @@ module Asciidoctor
41
45
  ref_cleanup(xmldoc)
42
46
  note_cleanup(xmldoc)
43
47
  clausebefore_cleanup(xmldoc)
44
- ref_dl_cleanup(xmldoc)
48
+ bibitem_cleanup(xmldoc)
45
49
  normref_cleanup(xmldoc)
46
50
  biblio_cleanup(xmldoc)
47
51
  reference_names(xmldoc)
@@ -34,7 +34,7 @@ module Asciidoctor
34
34
  # extending localities to cover ISO referencing
35
35
  LOCALITY_REGEX_STR = <<~REGEXP.freeze
36
36
  ^((?<locality>section|clause|part|paragraph|chapter|page|
37
- table|annex|figure|example|note|formula|list|
37
+ table|annex|figure|example|note|formula|list|time|anchor|
38
38
  locality:[^ \\t\\n\\r:,;=]+)(\\s+|=)
39
39
  (?<ref>[^"][^ \\t\\n,:-]*|"[^"]+")
40
40
  (-(?<to>[^"][^ \\t\\n,:-]*|"[^"]"))?|
@@ -122,6 +122,7 @@ module Asciidoctor
122
122
  def ref_dl_cleanup(xmldoc)
123
123
  xmldoc.xpath("//clause[@bibitem = 'true']").each do |c|
124
124
  bib = dl_bib_extract(c) or next
125
+ validate_ref_dl(bib, c)
125
126
  bibitemxml = RelatonBib::BibliographicItem.new(
126
127
  RelatonBib::HashConverter::hash_to_bib(bib)).to_xml or next
127
128
  bibitem = Nokogiri::XML(bibitemxml)
@@ -130,6 +131,18 @@ module Asciidoctor
130
131
  end
131
132
  end
132
133
 
134
+ def validate_ref_dl(bib, c)
135
+ unless bib["id"]
136
+ @log.add("Anchors", c, "The following reference is missing "\
137
+ "an anchor:\n" + c.to_xml)
138
+ return
139
+ end
140
+ bib["title"] or @log.add("Bibliography", c, "Reference #{bib['id']} "\
141
+ "is missing a title")
142
+ bib["docid"] or @log.add("Bibliography", c, "Reference #{bib['id']} "\
143
+ "is missing a document identifier (docid)")
144
+ end
145
+
133
146
  def extract_from_p(tag, bib, key)
134
147
  return unless bib[tag]
135
148
  "<#{key}>#{bib[tag].at('p').children}</#{key}>"
@@ -196,6 +209,38 @@ module Asciidoctor
196
209
  def fetch_termbase(termbase, id)
197
210
  ""
198
211
  end
212
+
213
+ def read_local_bibitem(uri)
214
+ return nil if %r{^http[s]?://}.match(uri)
215
+ file = @localdir + uri + ".rxl"
216
+ File.file?(file) or file = @localdir + uri + ".xml"
217
+ File.file?(file) or return nil
218
+ xml = Nokogiri::XML(File.read(file, encoding: "utf-8"))
219
+ ret = xml.at("//*[local-name() = 'bibdata']") or return nil
220
+ ret = Nokogiri::XML(ret.to_xml.sub(
221
+ %r{(<bibdata[^>]*?) xmlns=("[^"]+"|'[^']+')}, "\\1")).root
222
+ ret.name = "bibitem"
223
+ ins = ret.at("./*[local-name() = 'docidentifier']") or return nil
224
+ ins.previous = %{<uri type="citation">#{uri}</uri>}
225
+ ret&.at("./*[local-name() = 'ext']")&.remove
226
+ ret
227
+ end
228
+
229
+ # if citation uri points to local file, get bibitem from it
230
+ def fetch_local_bibitem(xmldoc)
231
+ xmldoc.xpath("//bibitem[formattedref]"\
232
+ "[uri[@type = 'citation']]").each do |b|
233
+ uri = b&.at("./uri[@type = 'citation']")&.text
234
+ bibitem = read_local_bibitem(uri) or next
235
+ bibitem["id"] = b["id"]
236
+ b.replace(bibitem)
237
+ end
238
+ end
239
+
240
+ def bibitem_cleanup(xmldoc)
241
+ ref_dl_cleanup(xmldoc)
242
+ fetch_local_bibitem(xmldoc)
243
+ end
199
244
  end
200
245
  end
201
246
  end
@@ -64,6 +64,85 @@
64
64
  <text/>
65
65
  </element>
66
66
  </define>
67
+ <define name="ul">
68
+ <element name="ul">
69
+ <attribute name="id">
70
+ <data type="ID"/>
71
+ </attribute>
72
+ <optional>
73
+ <attribute name="keep-with-next">
74
+ <data type="boolean"/>
75
+ </attribute>
76
+ </optional>
77
+ <optional>
78
+ <attribute name="keep-lines-together">
79
+ <data type="boolean"/>
80
+ </attribute>
81
+ </optional>
82
+ <oneOrMore>
83
+ <ref name="li"/>
84
+ </oneOrMore>
85
+ <zeroOrMore>
86
+ <ref name="note"/>
87
+ </zeroOrMore>
88
+ </element>
89
+ </define>
90
+ <define name="ol">
91
+ <element name="ol">
92
+ <attribute name="id">
93
+ <data type="ID"/>
94
+ </attribute>
95
+ <optional>
96
+ <attribute name="keep-with-next">
97
+ <data type="boolean"/>
98
+ </attribute>
99
+ </optional>
100
+ <optional>
101
+ <attribute name="keep-lines-together">
102
+ <data type="boolean"/>
103
+ </attribute>
104
+ </optional>
105
+ <attribute name="type">
106
+ <choice>
107
+ <value>roman</value>
108
+ <value>alphabet</value>
109
+ <value>arabic</value>
110
+ <value>roman_upper</value>
111
+ <value>alphabet_upper</value>
112
+ </choice>
113
+ </attribute>
114
+ <oneOrMore>
115
+ <ref name="li"/>
116
+ </oneOrMore>
117
+ <zeroOrMore>
118
+ <ref name="note"/>
119
+ </zeroOrMore>
120
+ </element>
121
+ </define>
122
+ <define name="dl">
123
+ <element name="dl">
124
+ <attribute name="id">
125
+ <data type="ID"/>
126
+ </attribute>
127
+ <optional>
128
+ <attribute name="keep-with-next">
129
+ <data type="boolean"/>
130
+ </attribute>
131
+ </optional>
132
+ <optional>
133
+ <attribute name="keep-lines-together">
134
+ <data type="boolean"/>
135
+ </attribute>
136
+ </optional>
137
+ <oneOrMore>
138
+ <ref name="dt"/>
139
+ <ref name="dd"/>
140
+ </oneOrMore>
141
+ <zeroOrMore>
142
+ <ref name="note"/>
143
+ </zeroOrMore>
144
+ </element>
145
+ </define>
67
146
  <define name="example">
68
147
  <element name="example">
69
148
  <attribute name="id">
@@ -77,6 +156,19 @@
77
156
  <optional>
78
157
  <attribute name="subsequence"/>
79
158
  </optional>
159
+ <optional>
160
+ <attribute name="number"/>
161
+ </optional>
162
+ <optional>
163
+ <attribute name="keep-with-next">
164
+ <data type="boolean"/>
165
+ </attribute>
166
+ </optional>
167
+ <optional>
168
+ <attribute name="keep-lines-together">
169
+ <data type="boolean"/>
170
+ </attribute>
171
+ </optional>
80
172
  <optional>
81
173
  <ref name="tname"/>
82
174
  </optional>
@@ -97,6 +189,296 @@
97
189
  </zeroOrMore>
98
190
  </element>
99
191
  </define>
192
+ <define name="table">
193
+ <element name="table">
194
+ <attribute name="id">
195
+ <data type="ID"/>
196
+ </attribute>
197
+ <optional>
198
+ <attribute name="unnumbered">
199
+ <data type="boolean"/>
200
+ </attribute>
201
+ </optional>
202
+ <optional>
203
+ <attribute name="number"/>
204
+ </optional>
205
+ <optional>
206
+ <attribute name="subsequence"/>
207
+ </optional>
208
+ <optional>
209
+ <attribute name="alt"/>
210
+ </optional>
211
+ <optional>
212
+ <attribute name="summary"/>
213
+ </optional>
214
+ <optional>
215
+ <attribute name="uri">
216
+ <data type="anyURI"/>
217
+ </attribute>
218
+ </optional>
219
+ <optional>
220
+ <attribute name="keep-with-next">
221
+ <data type="boolean"/>
222
+ </attribute>
223
+ </optional>
224
+ <optional>
225
+ <attribute name="keep-lines-together">
226
+ <data type="boolean"/>
227
+ </attribute>
228
+ </optional>
229
+ <optional>
230
+ <ref name="tname"/>
231
+ </optional>
232
+ <optional>
233
+ <ref name="thead"/>
234
+ </optional>
235
+ <ref name="tbody"/>
236
+ <optional>
237
+ <ref name="tfoot"/>
238
+ </optional>
239
+ <zeroOrMore>
240
+ <ref name="table-note"/>
241
+ </zeroOrMore>
242
+ <optional>
243
+ <ref name="dl"/>
244
+ </optional>
245
+ </element>
246
+ </define>
247
+ <define name="figure">
248
+ <element name="figure">
249
+ <attribute name="id">
250
+ <data type="ID"/>
251
+ </attribute>
252
+ <optional>
253
+ <attribute name="unnumbered">
254
+ <data type="boolean"/>
255
+ </attribute>
256
+ </optional>
257
+ <optional>
258
+ <attribute name="number"/>
259
+ </optional>
260
+ <optional>
261
+ <attribute name="subsequence"/>
262
+ </optional>
263
+ <optional>
264
+ <attribute name="keep-with-next">
265
+ <data type="boolean"/>
266
+ </attribute>
267
+ </optional>
268
+ <optional>
269
+ <attribute name="keep-lines-together">
270
+ <data type="boolean"/>
271
+ </attribute>
272
+ </optional>
273
+ <optional>
274
+ <attribute name="class"/>
275
+ </optional>
276
+ <optional>
277
+ <ref name="source"/>
278
+ </optional>
279
+ <optional>
280
+ <ref name="tname"/>
281
+ </optional>
282
+ <choice>
283
+ <ref name="image"/>
284
+ <ref name="video"/>
285
+ <ref name="audio"/>
286
+ <ref name="pre"/>
287
+ <oneOrMore>
288
+ <ref name="paragraph-with-footnote"/>
289
+ </oneOrMore>
290
+ <zeroOrMore>
291
+ <ref name="figure"/>
292
+ </zeroOrMore>
293
+ </choice>
294
+ <zeroOrMore>
295
+ <ref name="fn"/>
296
+ </zeroOrMore>
297
+ <optional>
298
+ <ref name="dl"/>
299
+ </optional>
300
+ <zeroOrMore>
301
+ <ref name="note"/>
302
+ </zeroOrMore>
303
+ </element>
304
+ </define>
305
+ <define name="sourcecode">
306
+ <element name="sourcecode">
307
+ <attribute name="id">
308
+ <data type="ID"/>
309
+ </attribute>
310
+ <optional>
311
+ <attribute name="unnumbered">
312
+ <data type="boolean"/>
313
+ </attribute>
314
+ </optional>
315
+ <optional>
316
+ <attribute name="number"/>
317
+ </optional>
318
+ <optional>
319
+ <attribute name="subsequence"/>
320
+ </optional>
321
+ <optional>
322
+ <attribute name="keep-with-next">
323
+ <data type="boolean"/>
324
+ </attribute>
325
+ </optional>
326
+ <optional>
327
+ <attribute name="keep-lines-together">
328
+ <data type="boolean"/>
329
+ </attribute>
330
+ </optional>
331
+ <optional>
332
+ <attribute name="lang"/>
333
+ </optional>
334
+ <optional>
335
+ <ref name="tname"/>
336
+ </optional>
337
+ <oneOrMore>
338
+ <choice>
339
+ <text/>
340
+ <ref name="callout"/>
341
+ </choice>
342
+ </oneOrMore>
343
+ <zeroOrMore>
344
+ <ref name="annotation"/>
345
+ </zeroOrMore>
346
+ <zeroOrMore>
347
+ <ref name="note"/>
348
+ </zeroOrMore>
349
+ </element>
350
+ </define>
351
+ <define name="formula">
352
+ <element name="formula">
353
+ <attribute name="id">
354
+ <data type="ID"/>
355
+ </attribute>
356
+ <optional>
357
+ <attribute name="unnumbered">
358
+ <data type="boolean"/>
359
+ </attribute>
360
+ </optional>
361
+ <optional>
362
+ <attribute name="number"/>
363
+ </optional>
364
+ <optional>
365
+ <attribute name="subsequence"/>
366
+ </optional>
367
+ <optional>
368
+ <attribute name="keep-with-next">
369
+ <data type="boolean"/>
370
+ </attribute>
371
+ </optional>
372
+ <optional>
373
+ <attribute name="keep-lines-together">
374
+ <data type="boolean"/>
375
+ </attribute>
376
+ </optional>
377
+ <optional>
378
+ <attribute name="inequality">
379
+ <data type="boolean"/>
380
+ </attribute>
381
+ </optional>
382
+ <ref name="stem"/>
383
+ <optional>
384
+ <ref name="dl"/>
385
+ </optional>
386
+ <zeroOrMore>
387
+ <ref name="note"/>
388
+ </zeroOrMore>
389
+ </element>
390
+ </define>
391
+ <define name="ParagraphType">
392
+ <attribute name="id">
393
+ <data type="ID"/>
394
+ </attribute>
395
+ <optional>
396
+ <attribute name="align">
397
+ <ref name="Alignments"/>
398
+ </attribute>
399
+ </optional>
400
+ <optional>
401
+ <attribute name="keep-with-next">
402
+ <data type="boolean"/>
403
+ </attribute>
404
+ </optional>
405
+ <optional>
406
+ <attribute name="keep-lines-together">
407
+ <data type="boolean"/>
408
+ </attribute>
409
+ </optional>
410
+ <zeroOrMore>
411
+ <ref name="TextElement"/>
412
+ </zeroOrMore>
413
+ <zeroOrMore>
414
+ <ref name="note"/>
415
+ </zeroOrMore>
416
+ </define>
417
+ <define name="paragraph-with-footnote">
418
+ <element name="p">
419
+ <attribute name="id">
420
+ <data type="ID"/>
421
+ </attribute>
422
+ <optional>
423
+ <attribute name="align">
424
+ <ref name="Alignments"/>
425
+ </attribute>
426
+ </optional>
427
+ <optional>
428
+ <attribute name="keep-with-next">
429
+ <data type="boolean"/>
430
+ </attribute>
431
+ </optional>
432
+ <optional>
433
+ <attribute name="keep-lines-together">
434
+ <data type="boolean"/>
435
+ </attribute>
436
+ </optional>
437
+ <zeroOrMore>
438
+ <choice>
439
+ <ref name="TextElement"/>
440
+ <ref name="fn"/>
441
+ </choice>
442
+ </zeroOrMore>
443
+ <zeroOrMore>
444
+ <ref name="note"/>
445
+ </zeroOrMore>
446
+ </element>
447
+ </define>
448
+ <define name="quote">
449
+ <element name="quote">
450
+ <attribute name="id">
451
+ <data type="ID"/>
452
+ </attribute>
453
+ <optional>
454
+ <attribute name="alignment">
455
+ <ref name="Alignments"/>
456
+ </attribute>
457
+ </optional>
458
+ <optional>
459
+ <attribute name="keep-with-next">
460
+ <data type="boolean"/>
461
+ </attribute>
462
+ </optional>
463
+ <optional>
464
+ <attribute name="keep-lines-together">
465
+ <data type="boolean"/>
466
+ </attribute>
467
+ </optional>
468
+ <optional>
469
+ <ref name="quote-source"/>
470
+ </optional>
471
+ <optional>
472
+ <ref name="quote-author"/>
473
+ </optional>
474
+ <oneOrMore>
475
+ <ref name="paragraph-with-footnote"/>
476
+ </oneOrMore>
477
+ <zeroOrMore>
478
+ <ref name="note"/>
479
+ </zeroOrMore>
480
+ </element>
481
+ </define>
100
482
  <define name="BibDataExtensionType">
101
483
  <ref name="doctype"/>
102
484
  <optional>
@@ -165,6 +547,30 @@
165
547
  <attribute name="id">
166
548
  <data type="ID"/>
167
549
  </attribute>
550
+ <optional>
551
+ <attribute name="unnumbered">
552
+ <data type="boolean"/>
553
+ </attribute>
554
+ </optional>
555
+ <optional>
556
+ <attribute name="number"/>
557
+ </optional>
558
+ <optional>
559
+ <attribute name="subsequence"/>
560
+ </optional>
561
+ <optional>
562
+ <attribute name="keep-with-next">
563
+ <data type="boolean"/>
564
+ </attribute>
565
+ </optional>
566
+ <optional>
567
+ <attribute name="keep-lines-together">
568
+ <data type="boolean"/>
569
+ </attribute>
570
+ </optional>
571
+ <optional>
572
+ <attribute name="type"/>
573
+ </optional>
168
574
  <oneOrMore>
169
575
  <choice>
170
576
  <ref name="paragraph"/>
@@ -910,6 +1316,27 @@
910
1316
  <attribute name="id">
911
1317
  <data type="ID"/>
912
1318
  </attribute>
1319
+ <optional>
1320
+ <attribute name="unnumbered">
1321
+ <data type="boolean"/>
1322
+ </attribute>
1323
+ </optional>
1324
+ <optional>
1325
+ <attribute name="number"/>
1326
+ </optional>
1327
+ <optional>
1328
+ <attribute name="subsequence"/>
1329
+ </optional>
1330
+ <optional>
1331
+ <attribute name="keep-with-next">
1332
+ <data type="boolean"/>
1333
+ </attribute>
1334
+ </optional>
1335
+ <optional>
1336
+ <attribute name="keep-lines-together">
1337
+ <data type="boolean"/>
1338
+ </attribute>
1339
+ </optional>
913
1340
  <oneOrMore>
914
1341
  <choice>
915
1342
  <ref name="paragraph"/>