metanorma-standoc 2.1.1 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/lib/metanorma/standoc/base.rb +3 -1
  3. data/lib/metanorma/standoc/biblio.rng +32 -34
  4. data/lib/metanorma/standoc/blocks.rb +8 -3
  5. data/lib/metanorma/standoc/blocks_notes.rb +3 -0
  6. data/lib/metanorma/standoc/cleanup.rb +1 -0
  7. data/lib/metanorma/standoc/cleanup_footnotes.rb +14 -9
  8. data/lib/metanorma/standoc/cleanup_inline.rb +17 -0
  9. data/lib/metanorma/standoc/cleanup_terms.rb +3 -1
  10. data/lib/metanorma/standoc/cleanup_text.rb +9 -4
  11. data/lib/metanorma/standoc/converter.rb +2 -0
  12. data/lib/metanorma/standoc/isodoc.rng +9 -0
  13. data/lib/metanorma/standoc/lists.rb +8 -3
  14. data/lib/metanorma/standoc/macros.rb +28 -1
  15. data/lib/metanorma/standoc/macros_note.rb +1 -6
  16. data/lib/metanorma/standoc/version.rb +1 -1
  17. data/metanorma-standoc.gemspec +1 -1
  18. data/spec/metanorma/base_spec.rb +41 -5
  19. data/spec/metanorma/blocks_spec.rb +53 -1
  20. data/spec/metanorma/cleanup_sections_spec.rb +5 -5
  21. data/spec/metanorma/cleanup_spec.rb +5 -5
  22. data/spec/metanorma/cleanup_terms_spec.rb +1 -1
  23. data/spec/metanorma/inline_spec.rb +3 -3
  24. data/spec/metanorma/lists_spec.rb +10 -4
  25. data/spec/metanorma/macros_spec.rb +21 -12
  26. data/spec/metanorma/refs_spec.rb +1 -1
  27. data/spec/metanorma/table_spec.rb +24 -6
  28. data/spec/spec_helper.rb +1 -1
  29. data/spec/vcr_cassettes/bsi16341.yml +64 -64
  30. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +83 -83
  31. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec1.yml +10 -10
  32. data/spec/vcr_cassettes/hide_refs.yml +55 -55
  33. data/spec/vcr_cassettes/isobib_get_123.yml +13 -13
  34. data/spec/vcr_cassettes/isobib_get_123_1.yml +25 -25
  35. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +33 -33
  36. data/spec/vcr_cassettes/isobib_get_123_2001.yml +12 -12
  37. data/spec/vcr_cassettes/isobib_get_124.yml +12 -12
  38. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
  39. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +47 -49
  40. data/spec/vcr_cassettes/std-link.yml +12 -12
  41. metadata +7 -8
  42. data/docs/quickstart.adoc +0 -375
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2c3089664934dc34b5f41b7e03a7bc2d2b1060e17decafb29dfc1f36fb7bed0
4
- data.tar.gz: 7ecc333b2847252e7965be128c701f4cb2241d148179cd43b66a9f5cd2a2e108
3
+ metadata.gz: 56e2b9105572c28858ffc12d075b16615ec8195836ad4bf7d7d2122fbf81dc05
4
+ data.tar.gz: 2594f703aeba2f78a5bf3df715709f78b3b6da1a751cb52fedd3ebce299eaf2d
5
5
  SHA512:
6
- metadata.gz: 5308c4354dc5fd14e1d5d18dc32e7b52d81ba492e53381771e7dfecea4c83af0bd73387af2bfb6c913687352eaad85c44ded592e1c95179d5d41b3974bc923ff
7
- data.tar.gz: ba8122c376d231eb6f1f4f4ea235b608b4dd1769394a899fe9fcd6f5bee011f2384cf1455fae0d86d32648e37aee080c0db18755d4a761e793ad5164b500ce61
6
+ metadata.gz: eeef127fe3ea160b49aa62cbb1aa665fb4e0cdb6d1712f646667394a41633c89864a294900c444abc1fceb7fbe2649bdfb2f539d1ccc66d3df89cd247ea31655
7
+ data.tar.gz: 2d1ded28e889db67a42275a5890a8e942b2b966e342e7bb7bc2b21129875394dff03ce1c1cd634b409ce72a68de0e4fd4eff518731cb3b8809c70d5c0c5f0449
@@ -171,7 +171,9 @@ module Metanorma
171
171
  end
172
172
 
173
173
  def doctype(node)
174
- node.attr("doctype")&.gsub(/\s+/, "-")&.downcase
174
+ ret = node.attr("doctype")&.gsub(/\s+/, "-")&.downcase || "standard"
175
+ ret = "standard" if ret == "article"
176
+ ret
175
177
  end
176
178
 
177
179
  def front(node, xml)
@@ -614,12 +614,12 @@
614
614
  <optional>
615
615
  <ref name="fetched"/>
616
616
  </optional>
617
- <choice>
618
- <oneOrMore>
619
- <ref name="btitle"/>
620
- </oneOrMore>
617
+ <optional>
621
618
  <ref name="formattedref"/>
622
- </choice>
619
+ </optional>
620
+ <oneOrMore>
621
+ <ref name="btitle"/>
622
+ </oneOrMore>
623
623
  <zeroOrMore>
624
624
  <ref name="bsource"/>
625
625
  </zeroOrMore>
@@ -986,36 +986,34 @@
986
986
  <ref name="SeriesType"/>
987
987
  </attribute>
988
988
  </optional>
989
- <choice>
989
+ <optional>
990
990
  <ref name="formattedref"/>
991
- <group>
992
- <ref name="btitle"/>
993
- <optional>
994
- <ref name="bplace"/>
995
- </optional>
996
- <optional>
997
- <ref name="seriesorganization"/>
998
- </optional>
999
- <optional>
1000
- <ref name="abbreviation"/>
1001
- </optional>
1002
- <optional>
1003
- <ref name="seriesfrom"/>
1004
- </optional>
1005
- <optional>
1006
- <ref name="seriesto"/>
1007
- </optional>
1008
- <optional>
1009
- <ref name="seriesnumber"/>
1010
- </optional>
1011
- <optional>
1012
- <ref name="seriespartnumber"/>
1013
- </optional>
1014
- <optional>
1015
- <ref name="seriesrun"/>
1016
- </optional>
1017
- </group>
1018
- </choice>
991
+ </optional>
992
+ <ref name="btitle"/>
993
+ <optional>
994
+ <ref name="bplace"/>
995
+ </optional>
996
+ <optional>
997
+ <ref name="seriesorganization"/>
998
+ </optional>
999
+ <optional>
1000
+ <ref name="abbreviation"/>
1001
+ </optional>
1002
+ <optional>
1003
+ <ref name="seriesfrom"/>
1004
+ </optional>
1005
+ <optional>
1006
+ <ref name="seriesto"/>
1007
+ </optional>
1008
+ <optional>
1009
+ <ref name="seriesnumber"/>
1010
+ </optional>
1011
+ <optional>
1012
+ <ref name="seriespartnumber"/>
1013
+ </optional>
1014
+ <optional>
1015
+ <ref name="seriesrun"/>
1016
+ </optional>
1019
1017
  </element>
1020
1018
  </define>
1021
1019
  <define name="SeriesType">
@@ -80,14 +80,17 @@ module Metanorma
80
80
 
81
81
  def term_example(node)
82
82
  noko do |xml|
83
- xml.termexample **attr_code(id_attr(node)) do |ex|
83
+ xml.termexample **attr_code(id_attr(node)
84
+ .merge(
85
+ keepasterm: node.option?("termexample") ? "true" : nil,
86
+ )) do |ex|
84
87
  wrap_in_para(node, ex)
85
88
  end
86
89
  end.join("\n")
87
90
  end
88
91
 
89
92
  def example(node)
90
- return term_example(node) if in_terms?
93
+ return term_example(node) if in_terms? || node.option?("termexample")
91
94
 
92
95
  role = node.role || node.attr("style")
93
96
  %w(recommendation requirement permission).include?(role) and
@@ -237,10 +240,12 @@ module Metanorma
237
240
  end
238
241
 
239
242
  def pass(node)
243
+ c = HTMLEntities.new
240
244
  noko do |xml|
241
245
  xml.passthrough **attr_code(formats:
242
246
  node.attr("format") || "metanorma") do |p|
243
- p << HTMLEntities.new.encode(node.content, :basic, :hexadecimal)
247
+ p << c.encode(c.decode(node.content),
248
+ :basic, :hexadecimal)
244
249
  end
245
250
  end
246
251
  end
@@ -8,6 +8,7 @@ module Metanorma
8
8
  number: node.attr("number"),
9
9
  subsequence: node.attr("subsequence"),
10
10
  "keep-separate": node.attr("keep-separate"),
11
+ keepasterm: node.option?("termnote") ? "true" : nil,
11
12
  )))
12
13
  end
13
14
 
@@ -61,6 +62,8 @@ module Metanorma
61
62
  end
62
63
 
63
64
  def note(node)
65
+ return termnote(node) if node.option?("termnote")
66
+
64
67
  noko do |xml|
65
68
  xml.note **note_attrs(node) do |c|
66
69
  wrap_in_para(node, c)
@@ -25,6 +25,7 @@ module Metanorma
25
25
  module Cleanup
26
26
  def cleanup(xmldoc)
27
27
  element_name_cleanup(xmldoc)
28
+ passthrough_cleanup(xmldoc)
28
29
  sections_cleanup(xmldoc)
29
30
  obligations_cleanup(xmldoc)
30
31
  table_cleanup(xmldoc)
@@ -5,12 +5,15 @@ require "json"
5
5
  module Metanorma
6
6
  module Standoc
7
7
  module Cleanup
8
- def footnote_content(fn)
9
- c = fn.children.respond_to?(:to_xml) ? fn.children.to_xml : fn.children
8
+ def footnote_content(fnote)
9
+ c = if fnote.children.respond_to?(:to_xml)
10
+ fnote.children.to_xml
11
+ else fn.children
12
+ end
10
13
  c.gsub(/ id="[^"]+"/, "")
11
14
  end
12
15
 
13
- # include footnotes inside figure if they are the only content
16
+ # include footnotes inside figure if they are the only content
14
17
  # of the paras following
15
18
  def figure_footnote_cleanup(xmldoc)
16
19
  nomatches = false
@@ -18,7 +21,9 @@ module Metanorma
18
21
  q = "//figure/following-sibling::*[1][self::p and *[1][self::fn]]"
19
22
  nomatches = true
20
23
  xmldoc.xpath(q).each do |s|
21
- next if s.children.map { |c| c.text? && /[[:alpha:]]/.match(c.text) }.any?
24
+ next if s.children.map do |c|
25
+ c.text? && /[[:alpha:]]/.match(c.text)
26
+ end.any?
22
27
 
23
28
  s.previous_element << s.first_element_child.remove
24
29
  s.remove
@@ -27,16 +32,16 @@ module Metanorma
27
32
  end
28
33
  end
29
34
 
30
- def table_footnote_renumber1(fn, i, seen)
31
- content = footnote_content(fn)
35
+ def table_footnote_renumber1(fnote, i, seen)
36
+ content = footnote_content(fnote)
32
37
  if seen[content] then outnum = seen[content]
33
38
  else
34
39
  i += 1
35
40
  outnum = i
36
41
  seen[content] = outnum
37
42
  end
38
- fn["reference"] = (outnum - 1 + "a".ord).chr
39
- fn["table"] = true
43
+ fnote["reference"] = (outnum - 1 + "a".ord).chr
44
+ fnote["table"] = true
40
45
  [i, seen]
41
46
  end
42
47
 
@@ -84,7 +89,7 @@ module Metanorma
84
89
 
85
90
  def footnote_block_cleanup(xmldoc)
86
91
  xmldoc.xpath("//footnoteblock").each do |f|
87
- f.name = 'fn'
92
+ f.name = "fn"
88
93
  if id = xmldoc.at("//*[@id = '#{f.text}']")
89
94
  f.children = id.remove.children
90
95
  else
@@ -185,6 +185,23 @@ module Metanorma
185
185
  Digest::MD5.hexdigest("#{elem.path}////#{elem.text}")
186
186
  .sub(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, "_\\1-\\2-\\3-\\4-\\5")
187
187
  end
188
+
189
+ def passthrough_cleanup(doc)
190
+ doc.xpath("//passthrough-inline").each do |p|
191
+ p.name = "passthrough"
192
+ p.children = select_odd_chars(p.children.to_xml)
193
+ end
194
+ doc.xpath("//identifier").each do |p|
195
+ p.children = select_odd_chars(p.children.to_xml)
196
+ end
197
+ end
198
+
199
+ private
200
+
201
+ # skip ZWNJ inserted to prevent regexes operating in asciidoctor
202
+ def select_odd_chars(text)
203
+ text.gsub(/(?!&)([[:punct:]])\u200c/, "\\1")
204
+ end
188
205
  end
189
206
  end
190
207
  end
@@ -93,7 +93,9 @@ module Metanorma
93
93
  def termnote_example_cleanup(xmldoc)
94
94
  %w(note example).each do |w|
95
95
  xmldoc.xpath("//term#{w}[not(ancestor::term)]").each do |x|
96
- x.name = w
96
+ if x["keepasterm"] then x.delete("keepasterm")
97
+ else x.name = w
98
+ end
97
99
  end
98
100
  end
99
101
  end
@@ -5,8 +5,11 @@ module Metanorma
5
5
  text = result.flatten.map { |l| l.sub(/\s*\Z/, "") } * "\n"
6
6
  !@keepasciimath and text = asciimath2mathml(text)
7
7
  text = text.gsub(/\s+<fn /, "<fn ")
8
- text.gsub(%r{<passthrough\s+formats="metanorma">([^<]*)
9
- </passthrough>}mx) { HTMLEntities.new.decode($1) }
8
+ %w(passthrough passthrough-inline).each do |v|
9
+ text.gsub!(%r{<#{v}\s+formats="metanorma">([^<]*)
10
+ </#{v}>}mx) { HTMLEntities.new.decode($1) }
11
+ end
12
+ text
10
13
  end
11
14
 
12
15
  def smartquotes_cleanup(xmldoc)
@@ -33,7 +36,8 @@ module Metanorma
33
36
 
34
37
  def uninterrupt_quotes_around_xml_skip(elem)
35
38
  !(/\A['"]/.match?(elem.text) &&
36
- elem.previous.ancestors("pre, tt, sourcecode, stem, figure, bibdata")
39
+ elem.previous.ancestors("pre, tt, sourcecode, stem, figure, bibdata,
40
+ passthrough, identifer")
37
41
  .empty? &&
38
42
  ((elem.previous.text.strip.empty? &&
39
43
  !empty_tag_with_text_content?(elem.previous)) ||
@@ -70,7 +74,8 @@ module Metanorma
70
74
  empty_tag_with_text_content?(x) and prev = "dummy"
71
75
  next unless x.text?
72
76
 
73
- x.ancestors("pre, tt, sourcecode, stem, figure, bibdata").empty? and
77
+ x.ancestors("pre, tt, sourcecode, stem, figure, bibdata, passthrough,
78
+ identifier").empty? and
74
79
  dumb2smart_quotes1(x, prev)
75
80
  prev = x.text if x.ancestors("index").empty?
76
81
  end
@@ -36,6 +36,7 @@ module Metanorma
36
36
  inline_macro Metanorma::Standoc::DomainTermInlineMacro
37
37
  inline_macro Metanorma::Standoc::InheritInlineMacro
38
38
  inline_macro Metanorma::Standoc::HTML5RubyMacro
39
+ inline_macro Metanorma::Standoc::IdentifierInlineMacro
39
40
  inline_macro Metanorma::Standoc::ConceptInlineMacro
40
41
  inline_macro Metanorma::Standoc::AutonumberInlineMacro
41
42
  inline_macro Metanorma::Standoc::VariantInlineMacro
@@ -63,6 +64,7 @@ module Metanorma
63
64
  block Metanorma::Plugin::Lutaml::LutamlDiagramBlock
64
65
  block Metanorma::Standoc::PseudocodeBlockMacro
65
66
  preprocessor Metanorma::Standoc::EmbedIncludeProcessor
67
+ preprocessor Metanorma::Standoc::NamedEscapePreprocessor
66
68
  end
67
69
 
68
70
  include ::Asciidoctor::Converter
@@ -282,6 +282,9 @@
282
282
  <ref name="MultilingualRenderingType"/>
283
283
  </attribute>
284
284
  </optional>
285
+ <optional>
286
+ <ref name="tname"/>
287
+ </optional>
285
288
  <oneOrMore>
286
289
  <ref name="ul_li"/>
287
290
  </oneOrMore>
@@ -324,6 +327,9 @@
324
327
  </choice>
325
328
  </attribute>
326
329
  </optional>
330
+ <optional>
331
+ <ref name="tname"/>
332
+ </optional>
327
333
  <oneOrMore>
328
334
  <ref name="li"/>
329
335
  </oneOrMore>
@@ -360,6 +366,9 @@
360
366
  <ref name="MultilingualRenderingType"/>
361
367
  </attribute>
362
368
  </optional>
369
+ <optional>
370
+ <ref name="tname"/>
371
+ </optional>
363
372
  <oneOrMore>
364
373
  <ref name="dt"/>
365
374
  <ref name="dd"/>
@@ -38,9 +38,8 @@ module Metanorma
38
38
 
39
39
  noko do |xml|
40
40
  xml.ul **ul_attrs(node) do |xml_ul|
41
- node.items.each do |item|
42
- ul_li(xml_ul, item)
43
- end
41
+ list_caption(node, xml_ul)
42
+ node.items.each { |item| ul_li(xml_ul, item) }
44
43
  end
45
44
  end.join("\n")
46
45
  end
@@ -62,6 +61,7 @@ module Metanorma
62
61
  def olist(node)
63
62
  noko do |xml|
64
63
  xml.ol **ol_attrs(node) do |xml_ol|
64
+ list_caption(node, xml_ol)
65
65
  node.items.each { |item| li(xml_ol, item) }
66
66
  end
67
67
  end.join("\n")
@@ -98,6 +98,7 @@ module Metanorma
98
98
  def dlist(node)
99
99
  noko do |xml|
100
100
  xml.dl **dl_attrs(node) do |xml_dl|
101
+ list_caption(node, xml_dl)
101
102
  node.items.each do |terms, dd|
102
103
  dt(terms, xml_dl)
103
104
  dd(dd, xml_dl)
@@ -115,6 +116,10 @@ module Metanorma
115
116
  end
116
117
  end.join("\n")
117
118
  end
119
+
120
+ def list_caption(node, out)
121
+ a = node.title and out.name { |n| n << a }
122
+ end
118
123
  end
119
124
  end
120
125
  end
@@ -191,6 +191,7 @@ module Metanorma
191
191
  end
192
192
  end
193
193
 
194
+ # inject ZWNJ to prevent Asciidoctor from attempting regex substitutions
194
195
  class PassInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
195
196
  use_dsl
196
197
  named :"pass-format"
@@ -198,7 +199,21 @@ module Metanorma
198
199
  def process(parent, target, attrs)
199
200
  format = target || "metanorma"
200
201
  out = Asciidoctor::Inline.new(parent, :quoted, attrs[1]).convert
201
- %{<passthrough formats="#{format}">#{out}</passthrough>}
202
+ .gsub(/((?![<>&])[[:punct:]])/, "\\1&#x200c;")
203
+ %{<passthrough-inline formats="#{format}">#{out}</passthrough-inline>}
204
+ end
205
+ end
206
+
207
+ class IdentifierInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
208
+ use_dsl
209
+ named :identifier
210
+ parse_content_as :raw
211
+ using_format :short
212
+
213
+ def process(parent, _target, attrs)
214
+ out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
215
+ .gsub(/((?![<>&])[[:punct:]])/, "\\1&#x200c;")
216
+ %{<identifier>#{out}</identifier>}
202
217
  end
203
218
  end
204
219
 
@@ -213,5 +228,17 @@ module Metanorma
213
228
  type: :xref, target: "_#{UUIDTools::UUID.random_create}")
214
229
  end
215
230
  end
231
+
232
+ class NamedEscapePreprocessor < Asciidoctor::Extensions::Preprocessor
233
+ def process(_document, reader)
234
+ c = HTMLEntities.new
235
+ lines = reader.readlines.map do |l|
236
+ l.split(/(&[A-Za-z][^;]*;)/).map do |s|
237
+ /^&[A-Za-z]/.match?(s) ? c.encode(c.decode(s), :hexadecimal) : s
238
+ end.join
239
+ end
240
+ ::Asciidoctor::Reader.new lines
241
+ end
242
+ end
216
243
  end
217
244
  end
@@ -18,15 +18,10 @@ module Metanorma
18
18
  (document.find_by context: :paragraph).each do |para|
19
19
  next unless /^TODO: /.match? para.lines[0]
20
20
 
21
- parent = para.parent
22
21
  para.set_attr("name", "todo")
23
22
  para.set_attr("caption", "TODO")
24
23
  para.lines[0].sub!(/^TODO: /, "")
25
- todo = Asciidoctor::Block
26
- .new(parent, :admonition, attributes: para.attributes,
27
- source: para.lines,
28
- content_model: :compound)
29
- parent.blocks[parent.blocks.index(para)] = todo
24
+ para.context = :admonition
30
25
  end
31
26
  end
32
27
  end
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.1.1".freeze
22
+ VERSION = "2.1.2".freeze
23
23
  end
24
24
  end
@@ -46,7 +46,7 @@ Gem::Specification.new do |spec|
46
46
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
47
47
  spec.add_development_dependency "guard", "~> 2.14"
48
48
  spec.add_development_dependency "guard-rspec", "~> 4.7"
49
- spec.add_development_dependency "metanorma-iso"
49
+ spec.add_development_dependency "metanorma-iso", "~>2.1.2"
50
50
  spec.add_development_dependency "rake", "~> 13.0"
51
51
  spec.add_development_dependency "rspec", "~> 3.6"
52
52
  spec.add_development_dependency "rubocop", "~> 1.5.2"
@@ -6,6 +6,42 @@ RSpec.describe Metanorma::Standoc do
6
6
  expect(Metanorma::Standoc::VERSION).not_to be nil
7
7
  end
8
8
 
9
+ it "processes named entities" do
10
+ FileUtils.rm_f "test.doc"
11
+ input = <<~INPUT
12
+ = Document title
13
+ Author
14
+ :docfile: test.adoc
15
+ :novalid:
16
+ :no-pdf:
17
+
18
+ Text &times; text
19
+ INPUT
20
+ output = <<~OUTPUT
21
+ <standard-document xmlns='https://www.metanorma.org/ns/standoc' type='semantic' version='#{Metanorma::Standoc::VERSION}'>
22
+ <bibdata type='standard'>
23
+ <title language='en' format='text/plain'>Document title</title>
24
+ <language>en</language>
25
+ <script>Latn</script>
26
+ <status>
27
+ <stage>published</stage>
28
+ </status>
29
+ <copyright>
30
+ <from>#{Time.now.year}</from>
31
+ </copyright>
32
+ <ext>
33
+ <doctype>standard</doctype>
34
+ </ext>
35
+ </bibdata>
36
+ <sections>
37
+ <p id='_'>Text × text</p>
38
+ </sections>
39
+ </standard-document>
40
+ OUTPUT
41
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
42
+ .to be_equivalent_to xmlpp(output)
43
+ end
44
+
9
45
  it "assigns default scripts to major languages" do
10
46
  FileUtils.rm_f "test.doc"
11
47
  input = <<~INPUT
@@ -29,7 +65,7 @@ RSpec.describe Metanorma::Standoc do
29
65
  <from>#{Time.now.year}</from>
30
66
  </copyright>
31
67
  <ext>
32
- <doctype>article</doctype>
68
+ <doctype>standard</doctype>
33
69
  </ext>
34
70
  </bibdata>
35
71
  <sections> </sections>
@@ -125,7 +161,7 @@ RSpec.describe Metanorma::Standoc do
125
161
  </owner>
126
162
  </copyright>
127
163
  <ext>
128
- <doctype>article</doctype>
164
+ <doctype>standard</doctype>
129
165
  </ext>
130
166
  </bibdata>
131
167
  <sections> </sections>
@@ -468,7 +504,7 @@ RSpec.describe Metanorma::Standoc do
468
504
  <keyword>b</keyword>
469
505
  <keyword>c</keyword>
470
506
  <ext>
471
- <doctype>article</doctype>
507
+ <doctype>standard</doctype>
472
508
  <editorialgroup>
473
509
  <technical-committee number="1" type="A">TC</technical-committee>
474
510
  <technical-committee number="11" type="A1">TC1</technical-committee>
@@ -789,7 +825,7 @@ RSpec.describe Metanorma::Standoc do
789
825
  <from>#{Time.now.year}</from>
790
826
  </copyright>
791
827
  <ext>
792
- <doctype>article</doctype>
828
+ <doctype>standard</doctype>
793
829
  </ext>
794
830
  </bibdata>
795
831
  <sections> </sections>
@@ -924,7 +960,7 @@ RSpec.describe Metanorma::Standoc do
924
960
  </bibitem>
925
961
  </relation>
926
962
  <ext>
927
- <doctype>article</doctype>
963
+ <doctype>standard</doctype>
928
964
  </ext>
929
965
  </bibdata>
930
966
  <sections> </sections>
@@ -304,7 +304,7 @@ RSpec.describe Metanorma::Standoc do
304
304
  <from>#{Date.today.year}</from>
305
305
  </copyright>
306
306
  <ext>
307
- <doctype>article</doctype>
307
+ <doctype>standard</doctype>
308
308
  </ext>
309
309
  </bibdata>
310
310
  <sections><p id="foreword">Foreword</p>
@@ -440,6 +440,32 @@ RSpec.describe Metanorma::Standoc do
440
440
  .to be_equivalent_to xmlpp(output)
441
441
  end
442
442
 
443
+ it "processes term notes outside of terms sections" do
444
+ input = <<~INPUT
445
+ #{ASCIIDOC_BLANK_HDR}
446
+ == Clause
447
+
448
+ [NOTE%termnote]
449
+ ====
450
+ XYZ
451
+ ====
452
+ INPUT
453
+ output = <<~OUTPUT
454
+ #{BLANK_HDR}
455
+ <sections>
456
+ <clause id='_' inline-header='false' obligation='normative'>
457
+ <title>Clause</title>
458
+ <termnote id='_'>
459
+ <p id='_'>XYZ</p>
460
+ </termnote>
461
+ </clause>
462
+ </sections>
463
+ </standard-document>
464
+ OUTPUT
465
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
466
+ .to be_equivalent_to xmlpp(output)
467
+ end
468
+
443
469
  it "processes term notes as plain notes in nonterm clauses" do
444
470
  input = <<~INPUT
445
471
  #{ASCIIDOC_BLANK_HDR}
@@ -722,6 +748,32 @@ RSpec.describe Metanorma::Standoc do
722
748
  .to be_equivalent_to xmlpp(output)
723
749
  end
724
750
 
751
+ it "processes term examples outside of terms sections" do
752
+ input = <<~INPUT
753
+ #{ASCIIDOC_BLANK_HDR}
754
+ == Clause
755
+
756
+ [%termexample]
757
+ ====
758
+ XYZ
759
+ ====
760
+ INPUT
761
+ output = <<~OUTPUT
762
+ #{BLANK_HDR}
763
+ <sections>
764
+ <clause id='_' inline-header='false' obligation='normative'>
765
+ <title>Clause</title>
766
+ <termexample id='_'>
767
+ <p id='_'>XYZ</p>
768
+ </termexample>
769
+ </clause>
770
+ </sections>
771
+ </standard-document>
772
+ OUTPUT
773
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
774
+ .to be_equivalent_to xmlpp(output)
775
+ end
776
+
725
777
  it "processes term examples as plain examples in nonterm clauses" do
726
778
  input = <<~INPUT
727
779
  #{ASCIIDOC_BLANK_HDR}