metanorma-standoc 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +0 -7
  3. data/.github/workflows/ubuntu.yml +6 -11
  4. data/.github/workflows/windows.yml +0 -8
  5. data/.rubocop.yml +1 -1
  6. data/Rakefile +2 -0
  7. data/lib/asciidoctor/standoc/base.rb +28 -27
  8. data/lib/asciidoctor/standoc/biblio.rng +1 -1
  9. data/lib/asciidoctor/standoc/blocks.rb +25 -95
  10. data/lib/asciidoctor/standoc/blocks_notes.rb +89 -0
  11. data/lib/asciidoctor/standoc/cleanup.rb +10 -6
  12. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +11 -24
  13. data/lib/asciidoctor/standoc/cleanup_inline.rb +1 -1
  14. data/lib/asciidoctor/standoc/cleanup_ref.rb +47 -1
  15. data/lib/asciidoctor/standoc/cleanup_section.rb +72 -5
  16. data/lib/asciidoctor/standoc/cleanup_terms.rb +10 -0
  17. data/lib/asciidoctor/standoc/converter.rb +16 -2
  18. data/lib/asciidoctor/standoc/inline.rb +1 -1
  19. data/lib/asciidoctor/standoc/isodoc.rng +439 -6
  20. data/lib/asciidoctor/standoc/lists.rb +12 -12
  21. data/lib/asciidoctor/standoc/macros_yaml2text.rb +32 -15
  22. data/lib/asciidoctor/standoc/ref.rb +75 -34
  23. data/lib/asciidoctor/standoc/reqt.rb +11 -6
  24. data/lib/asciidoctor/standoc/reqt.rng +23 -0
  25. data/lib/asciidoctor/standoc/section.rb +27 -25
  26. data/lib/asciidoctor/standoc/table.rb +3 -2
  27. data/lib/asciidoctor/standoc/utils.rb +16 -0
  28. data/lib/asciidoctor/standoc/views/datamodel/model_representation.adoc.erb +1 -1
  29. data/lib/metanorma/standoc/processor.rb +5 -7
  30. data/lib/metanorma/standoc/version.rb +1 -1
  31. data/metanorma-standoc.gemspec +3 -2
  32. data/spec/asciidoctor-standoc/base_spec.rb +3 -2
  33. data/spec/asciidoctor-standoc/blocks_spec.rb +68 -32
  34. data/spec/asciidoctor-standoc/cleanup_spec.rb +1221 -17
  35. data/spec/asciidoctor-standoc/datamodel/attributes_table_preprocessor_spec.rb +35 -0
  36. data/spec/asciidoctor-standoc/inline_spec.rb +3 -3
  37. data/spec/asciidoctor-standoc/isobib_cache_spec.rb +4 -4
  38. data/spec/asciidoctor-standoc/lists_spec.rb +7 -5
  39. data/spec/asciidoctor-standoc/macros_spec.rb +4 -3
  40. data/spec/asciidoctor-standoc/refs_dl_spec.rb +8 -6
  41. data/spec/asciidoctor-standoc/refs_spec.rb +275 -30
  42. data/spec/asciidoctor-standoc/section_spec.rb +42 -38
  43. data/spec/asciidoctor-standoc/table_spec.rb +3 -3
  44. data/spec/asciidoctor-standoc/validate_spec.rb +56 -0
  45. data/spec/assets/{html.css → html.scss} +0 -0
  46. data/spec/assets/i18n.yaml +17 -2
  47. data/spec/assets/iso123.rxl +107 -0
  48. data/spec/assets/{word.css → word.scss} +0 -0
  49. data/spec/examples/datamodel/blank_definition_profile.adoc +4 -0
  50. data/spec/examples/datamodel/models/models/{Signature copy.yml → SignatureBlankDefinition.yml} +2 -2
  51. data/spec/fixtures/macros_datamodel/blank_definition_profile.xml +51 -0
  52. data/spec/metanorma/processor_spec.rb +5 -6
  53. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +83 -83
  54. data/spec/vcr_cassettes/isobib_get_123.yml +19 -198
  55. data/spec/vcr_cassettes/isobib_get_123_1.yml +361 -0
  56. data/spec/vcr_cassettes/isobib_get_123_2001.yml +19 -19
  57. data/spec/vcr_cassettes/isobib_get_124.yml +21 -21
  58. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +10 -10
  59. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +42 -42
  60. metadata +32 -18
  61. data/lib/asciidoctor-yaml/i18n-en.yaml +0 -20
  62. data/lib/asciidoctor-yaml/i18n-fr.yaml +0 -13
  63. data/lib/asciidoctor-yaml/i18n-zh-Hans.yaml +0 -15
  64. data/lib/asciidoctor/standoc/i18n.rb +0 -39
@@ -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)
@@ -2,25 +2,25 @@ module Asciidoctor
2
2
  module Standoc
3
3
  module Cleanup
4
4
  def external_terms_boilerplate(sources)
5
- IsoDoc::Function::I18n::l10n(
6
- @external_terms_boilerplate.gsub(/%/, sources || "???"),
5
+ @i18n.l10n(
6
+ @i18n.external_terms_boilerplate.gsub(/%/, sources || "???"),
7
7
  @lang, @script)
8
8
  end
9
9
 
10
10
  def internal_external_terms_boilerplate(sources)
11
- IsoDoc::Function::I18n::l10n(
12
- @internal_external_terms_boilerplate.gsub(/%/, sources || "??"),
11
+ @i18n.l10n(
12
+ @i18n.internal_external_terms_boilerplate.gsub(/%/, sources || "??"),
13
13
  @lang, @script)
14
14
  end
15
15
 
16
16
  def term_defs_boilerplate(div, source, term, preface, isodoc)
17
- div.next = @term_def_boilerplate
17
+ a = @i18n.term_def_boilerplate and div.next = a
18
18
  source.each do |s|
19
19
  @anchors[s["bibitemid"]] or
20
20
  @log.add("Crossreferences", nil, "term source #{s['bibitemid']} not referenced")
21
21
  end
22
22
  if source.empty? && term.nil?
23
- div.next = @no_terms_boilerplate
23
+ div.next = @i18n.no_terms_boilerplate
24
24
  else
25
25
  div.next = term_defs_boilerplate_cont(source, term, isodoc)
26
26
  end
@@ -30,7 +30,7 @@ module Asciidoctor
30
30
  sources = isodoc.sentence_join(src.map do |s|
31
31
  %{<eref bibitemid="#{s['bibitemid']}"/>}
32
32
  end)
33
- if src.empty? then @internal_terms_boilerplate
33
+ if src.empty? then @i18n.internal_terms_boilerplate
34
34
  elsif term.nil? then external_terms_boilerplate(sources)
35
35
  else
36
36
  internal_external_terms_boilerplate(sources)
@@ -42,7 +42,7 @@ module Asciidoctor
42
42
  ["reference", "bibitem"].include? e.name
43
43
  end
44
44
  f.at("./title").next =
45
- "<p>#{(refs.empty? ? @norm_empty_pref : @norm_with_refs_pref)}</p>"
45
+ "<p>#{(refs.empty? ? @i18n.norm_empty_pref : @i18n.norm_with_refs_pref)}</p>"
46
46
  end
47
47
 
48
48
  TERM_CLAUSE = "//sections/terms | "\
@@ -54,13 +54,9 @@ module Asciidoctor
54
54
  x = xmldoc.dup
55
55
  x.root.add_namespace(nil, self.class::XML_NAMESPACE)
56
56
  xml = Nokogiri::XML(x.to_xml)
57
- conv = html_converter(EmptyAttr.new)
58
- @lang = xmldoc&.at("//bibdata/language")&.text
59
- @script = xmldoc&.at("//bibdata/script")&.text
60
- conv.i18n_init(@lang, @script)
61
- conv.metadata_init(@lang, @script, conv.labels)
62
- conv.info(xml, nil)
63
- conv
57
+ @isodoc ||= isodoc(@lang, @script)
58
+ @isodoc.info(xml, nil)
59
+ @isodoc
64
60
  end
65
61
 
66
62
  def boilerplate_cleanup(xmldoc)
@@ -83,15 +79,6 @@ module Asciidoctor
83
79
  preface.previous = b
84
80
  end
85
81
 
86
- class EmptyAttr
87
- def attr(_x)
88
- nil
89
- end
90
- def attributes
91
- {}
92
- end
93
- end
94
-
95
82
  def boilerplate_file(xmldoc)
96
83
  File.join(@libdir, "boilerplate.xml")
97
84
  end
@@ -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,:-]*|"[^"]"))?|
@@ -50,7 +50,8 @@ module Asciidoctor
50
50
  # only numeric references are renumbered
51
51
  def biblio_renumber(xmldoc)
52
52
  r = xmldoc.at("//references[@normative = 'false'] | "\
53
- "//clause[.//references[@normative = 'false']]") or return
53
+ "//clause[.//references[@normative = 'false']] | "\
54
+ "//annex[.//references[@normative = 'false']]") or return
54
55
  r.xpath(".//bibitem[not(ancestor::bibitem)]").each_with_index do |b, i|
55
56
  next unless docid = b.at("./docidentifier[@type = 'metanorma']")
56
57
  next unless /^\[\d+\]$/.match(docid.text)
@@ -122,6 +123,7 @@ module Asciidoctor
122
123
  def ref_dl_cleanup(xmldoc)
123
124
  xmldoc.xpath("//clause[@bibitem = 'true']").each do |c|
124
125
  bib = dl_bib_extract(c) or next
126
+ validate_ref_dl(bib, c)
125
127
  bibitemxml = RelatonBib::BibliographicItem.new(
126
128
  RelatonBib::HashConverter::hash_to_bib(bib)).to_xml or next
127
129
  bibitem = Nokogiri::XML(bibitemxml)
@@ -130,6 +132,18 @@ module Asciidoctor
130
132
  end
131
133
  end
132
134
 
135
+ def validate_ref_dl(bib, c)
136
+ unless bib["id"]
137
+ @log.add("Anchors", c, "The following reference is missing "\
138
+ "an anchor:\n" + c.to_xml)
139
+ return
140
+ end
141
+ bib["title"] or @log.add("Bibliography", c, "Reference #{bib['id']} "\
142
+ "is missing a title")
143
+ bib["docid"] or @log.add("Bibliography", c, "Reference #{bib['id']} "\
144
+ "is missing a document identifier (docid)")
145
+ end
146
+
133
147
  def extract_from_p(tag, bib, key)
134
148
  return unless bib[tag]
135
149
  "<#{key}>#{bib[tag].at('p').children}</#{key}>"
@@ -196,6 +210,38 @@ module Asciidoctor
196
210
  def fetch_termbase(termbase, id)
197
211
  ""
198
212
  end
213
+
214
+ def read_local_bibitem(uri)
215
+ return nil if %r{^http[s]?://}.match(uri)
216
+ file = @localdir + uri + ".rxl"
217
+ File.file?(file) or file = @localdir + uri + ".xml"
218
+ File.file?(file) or return nil
219
+ xml = Nokogiri::XML(File.read(file, encoding: "utf-8"))
220
+ ret = xml.at("//*[local-name() = 'bibdata']") or return nil
221
+ ret = Nokogiri::XML(ret.to_xml.sub(
222
+ %r{(<bibdata[^>]*?) xmlns=("[^"]+"|'[^']+')}, "\\1")).root
223
+ ret.name = "bibitem"
224
+ ins = ret.at("./*[local-name() = 'docidentifier']") or return nil
225
+ ins.previous = %{<uri type="citation">#{uri}</uri>}
226
+ ret&.at("./*[local-name() = 'ext']")&.remove
227
+ ret
228
+ end
229
+
230
+ # if citation uri points to local file, get bibitem from it
231
+ def fetch_local_bibitem(xmldoc)
232
+ xmldoc.xpath("//bibitem[formattedref]"\
233
+ "[uri[@type = 'citation']]").each do |b|
234
+ uri = b&.at("./uri[@type = 'citation']")&.text
235
+ bibitem = read_local_bibitem(uri) or next
236
+ bibitem["id"] = b["id"]
237
+ b.replace(bibitem)
238
+ end
239
+ end
240
+
241
+ def bibitem_cleanup(xmldoc)
242
+ ref_dl_cleanup(xmldoc)
243
+ fetch_local_bibitem(xmldoc)
244
+ end
199
245
  end
200
246
  end
201
247
  end
@@ -39,6 +39,7 @@ module Asciidoctor
39
39
  dupabstract.traverse { |n| n.remove_attribute("id") }
40
40
  dupabstract.remove_attribute("language")
41
41
  dupabstract.remove_attribute("script")
42
+ dupabstract&.at("./title")&.remove
42
43
  bibabstract.next = dupabstract
43
44
  end
44
45
  end
@@ -105,6 +106,7 @@ module Asciidoctor
105
106
  def sections_cleanup(x)
106
107
  sections_order_cleanup(x)
107
108
  sections_level_cleanup(x)
109
+ sections_names_cleanup(x)
108
110
  end
109
111
 
110
112
  def obligations_cleanup(x)
@@ -118,15 +120,15 @@ module Asciidoctor
118
120
  (s = x.at("//introduction")) && s["obligation"] = "informative"
119
121
  (s = x.at("//acknowledgements")) && s["obligation"] = "informative"
120
122
  x.xpath("//references").each { |r| r["obligation"] = "informative" }
121
- x.xpath("//preface//clause").each { |r| r["obligation"] = "informative" }
123
+ x.xpath("//preface//clause").each do |r|
124
+ r["obligation"] = "informative"
125
+ end
122
126
  end
123
127
 
124
128
  def obligations_cleanup_norm(x)
125
- (s = x.at("//clause[title = 'Scope']")) && s["obligation"] = "normative"
126
- (s = x.at("//clause[title = 'Symbols and Abbreviated Terms']")) &&
127
- s["obligation"] = "normative"
129
+ (s = x.at("//clause[@type = 'scope']")) && s["obligation"] = "normative"
128
130
  x.xpath("//terms").each { |r| r["obligation"] = "normative" }
129
- x.xpath("//symbols-abbrevs").each { |r| r["obligation"] = "normative" }
131
+ x.xpath("//definitions").each { |r| r["obligation"] = "normative" }
130
132
  end
131
133
 
132
134
  def obligations_cleanup_inherit(x)
@@ -149,6 +151,71 @@ module Asciidoctor
149
151
  ins.previous = x.remove
150
152
  end
151
153
  end
154
+
155
+ def get_or_make_title(node)
156
+ unless node.at("./title")
157
+ if node.children.empty?
158
+ node << "<title/>"
159
+ else
160
+ node.children.first.previous = "<title/>"
161
+ end
162
+ end
163
+ node.at("./title")
164
+ end
165
+
166
+ def replace_title(doc, xpath, text, first = false)
167
+ return unless text
168
+ doc.xpath(xpath).each_with_index do |node, i|
169
+ next if first && !i.zero?
170
+ title = get_or_make_title(node)
171
+ fn = title.xpath("./fn")
172
+ fn.each { |n| n.remove }
173
+ title.content = text
174
+ fn.each { |n| title << n }
175
+ end
176
+ end
177
+
178
+ def sections_names_cleanup(x)
179
+ replace_title(x, "//clause[@type = 'scope']", @i18n&.scope)
180
+ replace_title(x, "//preface//abstract", @i18n&.abstract)
181
+ replace_title(x, "//foreword", @i18n&.foreword)
182
+ replace_title(x, "//introduction", @i18n&.introduction)
183
+ replace_title(x, "//acknowledgements", @i18n&.acknowledgements)
184
+ section_names_refs_cleanup(x)
185
+ section_names_terms_cleanup(x)
186
+ end
187
+
188
+ def section_names_refs_cleanup(x)
189
+ replace_title(x, "//references[@normative = 'true']",
190
+ @i18n&.normref, true)
191
+ replace_title(x, "//references[@normative = 'false']",
192
+ @i18n&.bibliography, true)
193
+ end
194
+
195
+ NO_SYMABBR = "[.//definitions[not(@type)]]"
196
+ SYMABBR = "[.//definitions[@type = 'symbols']"\
197
+ "[@type = 'abbreviated_terms']]".freeze
198
+ SYMnoABBR = "[.//definitions[@type = 'symbols']"\
199
+ "[not(@type = 'abbreviated_terms')]]".freeze
200
+ ABBRnoSYM = "[.//definitions[not(@type = 'symbols')]"\
201
+ "[@type = 'abbreviated_terms']]".freeze
202
+
203
+ def section_names_terms_cleanup(x)
204
+ replace_title(x, "//definitions[@type = 'symbols']", @i18n&.symbols)
205
+ replace_title(x, "//definitions[@type = 'abbreviated_terms']", @i18n&.abbrev)
206
+ replace_title(x, "//definitions[not(@type)]", @i18n&.symbolsabbrev)
207
+ replace_title(x, "//terms#{SYMnoABBR} | //clause[.//terms]#{SYMnoABBR}",
208
+ @i18n&.termsdefsymbols, true)
209
+ replace_title(x, "//terms#{ABBRnoSYM} | //clause[.//terms]#{ABBRnoSYM}",
210
+ @i18n&.termsdefabbrev, true)
211
+ replace_title(x, "//terms#{SYMABBR} | //clause[.//terms]#{SYMABBR}",
212
+ @i18n&.termsdefsymbolsabbrev, true)
213
+ replace_title(x, "//terms#{NO_SYMABBR} | //clause[.//terms]#{NO_SYMABBR}",
214
+ @i18n&.termsdefsymbolsabbrev, true)
215
+ replace_title(
216
+ x, "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
217
+ @i18n&.termsdef, true)
218
+ end
152
219
  end
153
220
  end
154
221
  end
@@ -76,6 +76,15 @@ module Asciidoctor
76
76
  end
77
77
  end
78
78
 
79
+ def termnote_example_cleanup(xmldoc)
80
+ xmldoc.xpath("//termnote[not(ancestor::term)]").each do |x|
81
+ x.name = "note"
82
+ end
83
+ xmldoc.xpath("//termexample[not(ancestor::term)]").each do |x|
84
+ x.name = "note"
85
+ end
86
+ end
87
+
79
88
  def termdef_cleanup(xmldoc)
80
89
  termdef_from_termbase(xmldoc)
81
90
  termdef_unnest_cleanup(xmldoc)
@@ -83,6 +92,7 @@ module Asciidoctor
83
92
  termdomain_cleanup(xmldoc)
84
93
  termdefinition_cleanup(xmldoc)
85
94
  termdomain1_cleanup(xmldoc)
95
+ termnote_example_cleanup(xmldoc)
86
96
  termdef_boilerplate_cleanup(xmldoc)
87
97
  termdef_subclause_cleanup(xmldoc)
88
98
  term_children_cleanup(xmldoc)
@@ -11,7 +11,6 @@ require "asciidoctor/standoc/table"
11
11
  require "asciidoctor/standoc/validate"
12
12
  require "asciidoctor/standoc/utils"
13
13
  require "asciidoctor/standoc/cleanup"
14
- require "asciidoctor/standoc/i18n"
15
14
  require "asciidoctor/standoc/reqt"
16
15
  require_relative "./macros.rb"
17
16
  require_relative "./log.rb"
@@ -21,6 +20,22 @@ module Asciidoctor
21
20
  # A {Converter} implementation that generates Standoc output, and a document
22
21
  # schema encapsulation of the document for validation
23
22
  class Converter
23
+ Asciidoctor::Extensions.register do
24
+ preprocessor Asciidoctor::Standoc::Datamodel::AttributesTablePreprocessor
25
+ preprocessor Asciidoctor::Standoc::Datamodel::DiagramPreprocessor
26
+ preprocessor Asciidoctor::Standoc::Yaml2TextPreprocessor
27
+ inline_macro Asciidoctor::Standoc::AltTermInlineMacro
28
+ inline_macro Asciidoctor::Standoc::DeprecatedTermInlineMacro
29
+ inline_macro Asciidoctor::Standoc::DomainTermInlineMacro
30
+ inline_macro Asciidoctor::Standoc::InheritInlineMacro
31
+ inline_macro Asciidoctor::Standoc::HTML5RubyMacro
32
+ inline_macro Asciidoctor::Standoc::ConceptInlineMacro
33
+ block Asciidoctor::Standoc::ToDoAdmonitionBlock
34
+ treeprocessor Asciidoctor::Standoc::ToDoInlineAdmonitionBlock
35
+ block Asciidoctor::Standoc::PlantUMLBlockMacro
36
+ block Asciidoctor::Standoc::PseudocodeBlockMacro
37
+ end
38
+
24
39
  include ::Asciidoctor::Converter
25
40
  include ::Asciidoctor::Writer
26
41
 
@@ -32,7 +47,6 @@ module Asciidoctor
32
47
  include ::Asciidoctor::Standoc::Section
33
48
  include ::Asciidoctor::Standoc::Table
34
49
  include ::Asciidoctor::Standoc::Utils
35
- include ::Asciidoctor::Standoc::I18n
36
50
  include ::Asciidoctor::Standoc::Cleanup
37
51
  include ::Asciidoctor::Standoc::Validate
38
52
 
@@ -135,7 +135,7 @@ module Asciidoctor
135
135
  results.nil? and
136
136
  @log.add('Math', nil,
137
137
  "latexmlmath failed to process equation:\n#{lxm_input}")
138
- results
138
+ results&.sub(%r{<math ([^>]+ )?display="block"}, "<math \\1")
139
139
  end
140
140
 
141
141
  def stem_parse(text, xml, style)
@@ -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"/>
@@ -516,6 +922,9 @@
516
922
  <optional>
517
923
  <attribute name="script"/>
518
924
  </optional>
925
+ <optional>
926
+ <attribute name="type"/>
927
+ </optional>
519
928
  <optional>
520
929
  <attribute name="obligation">
521
930
  <choice>
@@ -555,9 +964,6 @@
555
964
  </define>
556
965
  <define name="content-subsection">
557
966
  <element name="clause">
558
- <optional>
559
- <attribute name="type"/>
560
- </optional>
561
967
  <ref name="Content-Section"/>
562
968
  </element>
563
969
  </define>
@@ -586,6 +992,9 @@
586
992
  </choice>
587
993
  </attribute>
588
994
  </optional>
995
+ <optional>
996
+ <attribute name="type"/>
997
+ </optional>
589
998
  <optional>
590
999
  <ref name="section-title"/>
591
1000
  </optional>
@@ -605,9 +1014,6 @@
605
1014
  </define>
606
1015
  <define name="clause">
607
1016
  <element name="clause">
608
- <optional>
609
- <attribute name="type"/>
610
- </optional>
611
1017
  <ref name="Clause-Section"/>
612
1018
  </element>
613
1019
  </define>
@@ -636,6 +1042,9 @@
636
1042
  </choice>
637
1043
  </attribute>
638
1044
  </optional>
1045
+ <optional>
1046
+ <attribute name="type"/>
1047
+ </optional>
639
1048
  <optional>
640
1049
  <ref name="section-title"/>
641
1050
  </optional>
@@ -774,6 +1183,9 @@
774
1183
  <optional>
775
1184
  <attribute name="script"/>
776
1185
  </optional>
1186
+ <optional>
1187
+ <attribute name="type"/>
1188
+ </optional>
777
1189
  <optional>
778
1190
  <attribute name="obligation">
779
1191
  <choice>
@@ -910,6 +1322,27 @@
910
1322
  <attribute name="id">
911
1323
  <data type="ID"/>
912
1324
  </attribute>
1325
+ <optional>
1326
+ <attribute name="unnumbered">
1327
+ <data type="boolean"/>
1328
+ </attribute>
1329
+ </optional>
1330
+ <optional>
1331
+ <attribute name="number"/>
1332
+ </optional>
1333
+ <optional>
1334
+ <attribute name="subsequence"/>
1335
+ </optional>
1336
+ <optional>
1337
+ <attribute name="keep-with-next">
1338
+ <data type="boolean"/>
1339
+ </attribute>
1340
+ </optional>
1341
+ <optional>
1342
+ <attribute name="keep-lines-together">
1343
+ <data type="boolean"/>
1344
+ </attribute>
1345
+ </optional>
913
1346
  <oneOrMore>
914
1347
  <choice>
915
1348
  <ref name="paragraph"/>