metanorma-standoc 1.3.24 → 1.3.29

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +10 -1
  3. data/.github/workflows/ubuntu.yml +13 -3
  4. data/.github/workflows/windows.yml +8 -1
  5. data/lib/asciidoctor/standoc/base.rb +29 -11
  6. data/lib/asciidoctor/standoc/biblio.rng +75 -28
  7. data/lib/asciidoctor/standoc/blocks.rb +12 -5
  8. data/lib/asciidoctor/standoc/cleanup.rb +17 -8
  9. data/lib/asciidoctor/standoc/cleanup_block.rb +3 -0
  10. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +1 -3
  11. data/lib/asciidoctor/standoc/cleanup_inline.rb +3 -0
  12. data/lib/asciidoctor/standoc/cleanup_ref.rb +15 -6
  13. data/lib/asciidoctor/standoc/cleanup_section.rb +36 -8
  14. data/lib/asciidoctor/standoc/front.rb +5 -3
  15. data/lib/asciidoctor/standoc/inline.rb +43 -18
  16. data/lib/asciidoctor/standoc/isodoc.rng +31 -1
  17. data/lib/asciidoctor/standoc/macros.rb +2 -1
  18. data/lib/asciidoctor/standoc/macros_yaml2text.rb +142 -0
  19. data/lib/asciidoctor/standoc/ref.rb +6 -4
  20. data/lib/asciidoctor/standoc/section.rb +41 -9
  21. data/lib/asciidoctor/standoc/utils.rb +2 -11
  22. data/lib/asciidoctor/standoc/validate.rb +8 -2
  23. data/lib/asciidoctor/standoc/validate_section.rb +1 -3
  24. data/lib/metanorma/standoc/latexml_requirement.rb +14 -12
  25. data/lib/metanorma/standoc/version.rb +1 -1
  26. data/metanorma-standoc.gemspec +2 -2
  27. data/spec/asciidoctor-standoc/base_spec.rb +8 -0
  28. data/spec/asciidoctor-standoc/blocks_spec.rb +74 -2
  29. data/spec/asciidoctor-standoc/cleanup_spec.rb +75 -28
  30. data/spec/asciidoctor-standoc/inline_spec.rb +4 -3
  31. data/spec/asciidoctor-standoc/macros_spec.rb +9 -8
  32. data/spec/asciidoctor-standoc/macros_yaml2text_spec.rb +564 -0
  33. data/spec/asciidoctor-standoc/refs_dl_spec.rb +91 -3
  34. data/spec/asciidoctor-standoc/refs_spec.rb +272 -166
  35. data/spec/asciidoctor-standoc/section_spec.rb +197 -6
  36. data/spec/asciidoctor-standoc/validate_spec.rb +67 -2
  37. data/spec/assets/codes.yml +695 -0
  38. data/spec/assets/xref_error.adoc +7 -0
  39. data/spec/examples/codes_table.html +3174 -0
  40. data/spec/metanorma/processor_spec.rb +2 -2
  41. data/spec/spec_helper.rb +1 -0
  42. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +77 -271
  43. data/spec/vcr_cassettes/isobib_get_123.yml +36 -82
  44. data/spec/vcr_cassettes/isobib_get_123_2001.yml +17 -40
  45. data/spec/vcr_cassettes/isobib_get_124.yml +19 -101
  46. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
  47. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +34 -34
  48. metadata +11 -6
@@ -62,6 +62,7 @@ module Asciidoctor
62
62
  t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
63
63
  docid(t, m[:usrlbl]) if m[:usrlbl]
64
64
  docid(t, id_and_year(m[:code], yr))
65
+ t.docnumber m[:code].sub(/^[^\d]*/, "")
65
66
  yr and t.date **{ type: "published" } do |d|
66
67
  set_date_range(d, yr)
67
68
  end
@@ -78,6 +79,7 @@ module Asciidoctor
78
79
  t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
79
80
  docid(t, m[:usrlbl]) if m[:usrlbl]
80
81
  docid(t, id_and_year(m[:code], "--"))
82
+ t.docnumber m[:code].sub(/^[^\d]*/, "")
81
83
  t.date **{ type: "published" } do |d|
82
84
  d.on "--"
83
85
  end
@@ -108,6 +110,7 @@ module Asciidoctor
108
110
  t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
109
111
  docid(t, m[:usrlbl]) if m[:usrlbl]
110
112
  docid(t, id_and_year(m[:code], yr) + " (all parts)")
113
+ t.docnumber m[:code].sub(/^[^\d]*/, "")
111
114
  conditional_date(t, m, noyr)
112
115
  iso_publisher(t, m[:code])
113
116
  m.names.include?("fn") && m[:fn] and
@@ -139,6 +142,7 @@ module Asciidoctor
139
142
  end
140
143
  docid(t, m[:usrlbl]) if m[:usrlbl]
141
144
  docid(t, /^\d+$/.match(m[:code]) ? "[#{m[:code]}]" : m[:code])
145
+ t.docnumber m[:code].sub(/^[^\d]*/, "") unless /^\d+$|^\(.+\)$/.match(m[:code])
142
146
  end
143
147
  end
144
148
 
@@ -149,7 +153,7 @@ module Asciidoctor
149
153
  # TODO: alternative where only title is available
150
154
  def refitem(xml, item, node)
151
155
  unless m = NON_ISO_REF.match(item)
152
- @log.add("Asciidoctor Input", node, "#{MALFORMED_REF}: #{item}")
156
+ @log.add("AsciiDoc Input", node, "#{MALFORMED_REF}: #{item}")
153
157
  return
154
158
  end
155
159
  unless m[:code] && /^\d+$/.match(m[:code])
@@ -206,9 +210,7 @@ module Asciidoctor
206
210
 
207
211
  def reference(node)
208
212
  noko do |xml|
209
- node.items.each do |item|
210
- reference1(node, item.text, xml)
211
- end
213
+ node.items.each { |item| reference1(node, item.text, xml) }
212
214
  end.join
213
215
  end
214
216
 
@@ -53,7 +53,15 @@ module Asciidoctor
53
53
  def section_attributes(node)
54
54
  { id: Utils::anchor_or_uuid(node),
55
55
  language: node.attributes["language"],
56
- script: node.attributes["script"] }
56
+ script: node.attributes["script"],
57
+ annex: (
58
+ ((node.attr("style") == "appendix" || node.role == "appendix") &&
59
+ node.level == 1) ? true : nil
60
+ ),
61
+ preface: (
62
+ (node.role == "preface" || node.attr("style") == "preface") ?
63
+ true : nil),
64
+ }
57
65
  end
58
66
 
59
67
  def section(node)
@@ -75,7 +83,12 @@ module Asciidoctor
75
83
  else
76
84
  if @term_def then term_def_subclause_parse(a, xml, node)
77
85
  elsif @definitions then symbols_parse(a, xml, node)
86
+ elsif @norm_ref then norm_ref_parse(a, xml, node)
78
87
  elsif @biblio then bibliography_parse(a, xml, node)
88
+ elsif node.attr("style") == "bibliography" && sectiontype(node, false) == "normative references"
89
+ norm_ref_parse(a, xml, node)
90
+ elsif node.attr("style") == "bibliography" && sectiontype(node, false) == "bibliography"
91
+ bibliography_parse(a, xml, node)
79
92
  elsif node.attr("style") == "bibliography"
80
93
  bibliography_parse(a, xml, node)
81
94
  elsif node.attr("style") == "abstract"
@@ -118,7 +131,6 @@ module Asciidoctor
118
131
  def clause_parse(attrs, xml, node)
119
132
  attrs["inline-header".to_sym] = node.option? "inline-header"
120
133
  attrs[:bibitem] = true if node.option? "bibitem"
121
- attrs[:preface] = true if node.role == "preface" || node.attr("style") == "preface"
122
134
  attrs[:level] = node.attr("level")
123
135
  set_obligation(attrs, node)
124
136
  xml.send "clause", **attr_code(attrs) do |xml_section|
@@ -137,11 +149,11 @@ module Asciidoctor
137
149
  end
138
150
 
139
151
  def bibliography_parse(attrs, xml, node)
152
+ node.option? "bibitem" and return bibitem_parse(attrs, xml, node)
140
153
  node.attr("style") == "bibliography" or
141
- #warn "Section not marked up as [bibliography]!"
142
- @log.add("Asciidoctor Input", node, "Section not marked up as [bibliography]!")
154
+ @log.add("AsciiDoc Input", node, "Section not marked up as [bibliography]!")
143
155
  @biblio = true
144
- xml.references **attr_code(attrs) do |xml_section|
156
+ xml.references **attr_code(attrs.merge(normative: false)) do |xml_section|
145
157
  title = node.level == 1 ? "Bibliography" : node.title
146
158
  xml_section.title { |t| t << title }
147
159
  xml_section << node.content
@@ -180,14 +192,16 @@ module Asciidoctor
180
192
 
181
193
  # subclause contains subclauses
182
194
  def term_def_subclause_parse(attrs, xml, node)
183
- node.role == "nonterm" ||
184
- sectiontype(node, false) == "terms and definitions" and
195
+ node.role == "nonterm" and
185
196
  return nonterm_term_def_subclause_parse(attrs, xml, node)
197
+ st = sectiontype(node, false)
186
198
  return symbols_parse(attrs, xml, node) if @definitions
187
199
  sub = node.find_by(context: :section) { |s| s.level == node.level + 1 }
188
200
  sub.empty? || (return term_def_parse(attrs, xml, node, false))
189
- sectiontype(node, false) == "symbols and abbreviated terms" and
201
+ st == "symbols and abbreviated terms" and
190
202
  (return symbols_parse(attrs, xml, node))
203
+ st == "terms and definitions" and
204
+ return clause_parse(attrs, xml, node)
191
205
  term_def_subclause_parse1(attrs, xml, node)
192
206
  end
193
207
 
@@ -204,6 +218,11 @@ module Asciidoctor
204
218
  SYMBOLS_TITLES.include? s.title.downcase
205
219
  end
206
220
  return "Terms and definitions" if sub.empty?
221
+ sym = /symbol/i.match(node.title)
222
+ abbrev = /abbreviat/i.match(node.title)
223
+ sym && abbrev and return "Terms, definitions, symbols and abbreviated terms"
224
+ sym and return "Terms, definitions and symbols"
225
+ abbrev and return "Terms, definitions and abbreviated terms"
207
226
  "Terms, definitions, symbols and abbreviated terms"
208
227
  end
209
228
 
@@ -217,9 +236,22 @@ module Asciidoctor
217
236
  end
218
237
  end
219
238
 
239
+ def bibitem_parse(attrs, xml, node)
240
+ norm_ref = @norm_ref
241
+ biblio = @biblio
242
+ @biblio = false
243
+ @norm_ref = false
244
+ clause_parse(attrs, xml, node)
245
+ @biblio = biblio
246
+ @norm_ref = norm_ref
247
+ end
248
+
220
249
  def norm_ref_parse(attrs, xml, node)
250
+ node.option? "bibitem" and return bibitem_parse(attrs, xml, node)
251
+ node.attr("style") == "bibliography" or
252
+ @log.add("AsciiDoc Input", node, "Section not marked up as [bibliography]!")
221
253
  @norm_ref = true
222
- xml.references **attr_code(attrs) do |xml_section|
254
+ xml.references **attr_code(attrs.merge(normative: true)) do |xml_section|
223
255
  xml_section.title { |t| t << "Normative References" }
224
256
  xml_section << node.content
225
257
  end
@@ -20,7 +20,8 @@ module Asciidoctor
20
20
  def asciidoc_sub(x)
21
21
  return nil if x.nil?
22
22
  return "" if x.empty?
23
- d = Asciidoctor::Document.new(x.lines.entries, {header_footer: false})
23
+ d = Asciidoctor::Document.new(x.lines.entries, { header_footer: false,
24
+ backend: :standoc })
24
25
  b = d.parse.blocks.first
25
26
  b.apply_subs(b.source)
26
27
  end
@@ -66,16 +67,6 @@ module Asciidoctor
66
67
  end
67
68
  end
68
69
 
69
- =begin
70
- def warning(node, msg, text)
71
- return if @novalid
72
- warntext = "asciidoctor: WARNING"\
73
- "(#{current_location(node)}): #{msg}"
74
- warntext += ": #{text}" if text
75
- warn warntext
76
- end
77
- =end
78
-
79
70
  def flatten_rawtext_lines(node, result)
80
71
  node.lines.each do |x|
81
72
  if node.respond_to?(:context) && (node.context == :literal ||
@@ -25,7 +25,6 @@ module Asciidoctor
25
25
  @iev = init_iev or return
26
26
  iev = @iev.fetch(locality, xmldoc&.at("//language")&.text || "en") or next
27
27
  pref.include?(iev.downcase) or
28
- #warn %(Term "#{pref[0]}" does not match IEV #{locality} "#{iev}")
29
28
  @log.add("Bibliography", t, %(Term "#{pref[0]}" does not match IEV #{locality} "#{iev}"))
30
29
  end
31
30
  end
@@ -38,14 +37,20 @@ module Asciidoctor
38
37
 
39
38
  def repeat_id_validate(doc)
40
39
  ids = {}
40
+ crash = false
41
41
  doc.xpath("//*[@id]").each do |x|
42
42
  if ids[x["id"]]
43
- @log.add("Anchors", x, "Anchor #{x['id']} has already been used at line #{ids[x['id']]}")
43
+ @log.add("Anchors", x, "Anchor #{x['id']} has already been used at line #{ids[x['id']]}")
44
+ crash = true
44
45
  else
45
46
  ids[x["id"]] = x.line
46
47
  end
47
48
  end
49
+ if crash
50
+ clean_exit
51
+ abort("Cannot deal with multiple instances of same ID")
48
52
  end
53
+ end
49
54
 
50
55
  def schema_validate(doc, schema)
51
56
  Tempfile.open(["tmp", ".xml"], :encoding => 'UTF-8') do |f|
@@ -58,6 +63,7 @@ module Asciidoctor
58
63
  @log.add("Syntax", "XML Line #{"%06d" % error[:line]}:#{error[:column]}", error[:message])
59
64
  end
60
65
  rescue Jing::Error => e
66
+ clean_exit
61
67
  abort "Jing failed with error: #{e}"
62
68
  ensure
63
69
  f.close!
@@ -14,8 +14,7 @@ module Asciidoctor
14
14
  callouts = x.elements.select { |e| e.name == "callout" }
15
15
  annotations = x.elements.select { |e| e.name == "annotation" }
16
16
  if callouts.size != annotations.size
17
- #warn "#{x['id']}: mismatch of callouts and annotations"
18
- @log.add("Asciidoctor Input", x, "mismatch of callouts and annotations")
17
+ @log.add("AsciiDoc Input", x, "mismatch of callouts and annotations")
19
18
  end
20
19
  end
21
20
  end
@@ -23,7 +22,6 @@ module Asciidoctor
23
22
  def style_warning(node, msg, text = nil)
24
23
  w = msg
25
24
  w += ": #{text}" if text
26
- #warn w
27
25
  @log.add("Style Warning", node, w)
28
26
  end
29
27
 
@@ -11,31 +11,33 @@ module Metanorma
11
11
  version = version_output&.match(%r{\d+(.\d+)*})
12
12
 
13
13
  if version.to_s.empty?
14
- @error_message = "LaTeXML not installed (or don't works properly)."\
15
- " You must upgrade/install LaTeXML to #{@recommended_version} version"
14
+ @error_message = "LaTeXML is not available. (Or is PATH not setup properly?)"\
15
+ " You must upgrade/install LaTeXML to a version higher than `#{@recommended_version}`"
16
16
 
17
17
  elsif Gem::Version.new(version) < Gem::Version.new(@minimal_version)
18
- @error_message = "Minimal supported LaTeXML version is #{@minimal_version} "\
19
- "found #{version}, recommended version is #{@recommended_version}"
18
+ @error_message = "Minimal supported LaTeXML version is `#{@minimal_version}` "\
19
+ "Version `#{version}` found; recommended version is `#{@recommended_version}`"
20
20
 
21
21
  elsif Gem::Version.new(version) < Gem::Version.new(@recommended_version)
22
22
  version = "unknown" if version.to_s.empty?
23
- header_msg = "latexmlmath version #{version} below #{@recommended_version}!"
23
+ header_msg = "latexmlmath version `#{version}` below `#{@recommended_version}`!"
24
24
  suggestion = if Gem.win_platform?
25
25
  "cmd encoding is set to UTF-8 with `chcp 65001`"
26
26
  else
27
27
  "terminal encoding is set to UTF-8 with `export LANG=en_US.UTF-8`"
28
28
  end
29
29
 
30
- @error_message = "WARNING #{header_msg} Please sure that #{suggestion} command"
30
+ @error_message = "WARNING #{header_msg} Please sure that #{suggestion} command."
31
31
 
32
- @cmd = "latexmlmath --preload=amsmath -- -"
32
+ @cmd = 'latexmlmath --strict --preload=amsmath -- -'
33
+ @cmd2 = 'latexmlmath --strict -- -'
33
34
  else
34
- @cmd = "latexmlmath --preload=amsmath --inputencoding=UTF-8 -- -"
35
+ @cmd = 'latexmlmath --strict --preload=amsmath --inputencoding=UTF-8 -- -'
36
+ @cmd2 = 'latexmlmath --strict --inputencoding=UTF-8 -- -'
35
37
  end
36
38
  rescue
37
- @error_message = "LaTeXML not installed (or don't works properly)."\
38
- " You must upgrade/install LaTeXML to #{@recommended_version} version"
39
+ @error_message = "LaTeXML is not available. (Or is PATH not setup properly?)"\
40
+ " You must upgrade/install LaTeXML to a version higher than `#{@recommended_version}`"
39
41
  end
40
42
 
41
43
  def satisfied(abort = false)
@@ -53,8 +55,8 @@ module Metanorma
53
55
  def cmd
54
56
  abort @error_message unless @error_message.nil?
55
57
 
56
- @cmd
58
+ [@cmd, @cmd2]
57
59
  end
58
60
  end
59
61
  end
60
- end
62
+ end
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module Standoc
3
- VERSION = "1.3.24".freeze
3
+ VERSION = "1.3.29".freeze
4
4
  end
5
5
  end
@@ -30,8 +30,8 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "ruby-jing"
31
31
  spec.add_dependency "isodoc", "~> 1.0.20"
32
32
  spec.add_dependency "iev", "~> 0.2.1"
33
- spec.add_dependency "relaton", "~> 0.11.0"
34
- spec.add_dependency "relaton-iev", "~> 0.1.0"
33
+ spec.add_dependency "relaton", "~> 1.0.0"
34
+ spec.add_dependency "relaton-iev", "~> 1.0.0"
35
35
  spec.add_dependency "sterile", "~> 1.0.14"
36
36
  spec.add_dependency "concurrent-ruby"
37
37
  spec.add_dependency "unicode2latex", "~> 0.0.1"
@@ -53,6 +53,8 @@ RSpec.describe Asciidoctor::Standoc do
53
53
  :issued-date: 1007-01-01
54
54
  :circulated-date: 1008-01-01
55
55
  :unchanged-date: 1009-01-01
56
+ :vote-started-date: 1011-01-01
57
+ :vote-ended-date: 1012-01-01
56
58
  :date: Fred 1010-01-01
57
59
  :date_2: Jack 1010-01-01
58
60
  :draft: 3.4
@@ -141,6 +143,12 @@ RSpec.describe Asciidoctor::Standoc do
141
143
  <date type="unchanged">
142
144
  <on>1009-01-01</on>
143
145
  </date>
146
+ <date type='vote-started'>
147
+ <on>1011-01-01</on>
148
+ </date>
149
+ <date type='vote-ended'>
150
+ <on>1012-01-01</on>
151
+ </date>
144
152
  <date type="Fred">
145
153
  <on>1010-01-01</on>
146
154
  </date>
@@ -6,13 +6,14 @@ RSpec.describe Asciidoctor::Standoc do
6
6
  expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
7
7
  #{ASCIIDOC_BLANK_HDR}
8
8
 
9
+ [format="rfc,html"]
9
10
  ++++
10
11
  <abc>X &gt; Y</abc>
11
12
  ++++
12
13
  INPUT
13
14
  #{BLANK_HDR}
14
15
  <sections>
15
- <abc>X &gt; Y</abc>
16
+ <passthrough formats='rfc,html'>&lt;abc&gt;X &gt; Y&lt;/abc&gt;</passthrough>
16
17
  </sections>
17
18
  </standard-document>
18
19
  OUTPUT
@@ -75,7 +76,7 @@ RSpec.describe Asciidoctor::Standoc do
75
76
  </formula>
76
77
  <formula id="_" subsequence="A">
77
78
  <stem type="MathML">
78
- <math xmlns="http://www.w3.org/1998/Math/MathML" alttext="M=\\begin{bmatrix}-\\sin\\lambda_{0}&amp;\\cos\\lambda_{0}&amp;0\\\\&#10;-\\sin\\varphi_{0}\\cos\\lambda_{0}&amp;-\\sin\\varphi_{0}\\sin\\lambda_{0}&amp;\\cos\\varphi_{0%&#10;}\\\\&#10;\\cos\\varphi_{0}\\cos\\lambda_{0}&amp;\\cos\\varphi_{0}\\sin\\lambda_{0}&amp;\\sin\\varphi_{0}%&#10;\\end{bmatrix}" display="block">
79
+ <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
79
80
  <mrow>
80
81
  <mi>M</mi>
81
82
  <mo>=</mo>
@@ -309,6 +310,11 @@ RSpec.describe Asciidoctor::Standoc do
309
310
  === Term1
310
311
 
311
312
  NOTE: This is a note
313
+
314
+ [NOTE,keep-separate=true]
315
+ ====
316
+ XYZ
317
+ ====
312
318
  INPUT
313
319
  #{BLANK_HDR}
314
320
  <sections>
@@ -320,6 +326,9 @@ RSpec.describe Asciidoctor::Standoc do
320
326
  <termnote id="_">
321
327
  <p id="_">This is a note</p>
322
328
  </termnote>
329
+ <termnote id='_'>
330
+ <p id='_'>XYZ</p>
331
+ </termnote>
323
332
  </term>
324
333
  </terms>
325
334
  </sections>
@@ -394,6 +403,11 @@ RSpec.describe Asciidoctor::Standoc do
394
403
 
395
404
  [[ABC]]
396
405
  NOTE: This is a note
406
+
407
+ [NOTE,keep-separate=true]
408
+ ====
409
+ XYZ
410
+ ====
397
411
  INPUT
398
412
  #{BLANK_HDR}
399
413
  <preface><foreword id="_" obligation="informative">
@@ -407,6 +421,9 @@ RSpec.describe Asciidoctor::Standoc do
407
421
  <note id="ABC">
408
422
  <p id="_">This is a note</p>
409
423
  </note>
424
+ <note id='_'>
425
+ <p id='_'>XYZ</p>
426
+ </note>
410
427
  </clause></sections>
411
428
 
412
429
  </standard-document>
@@ -924,6 +941,19 @@ RSpec.describe Asciidoctor::Standoc do
924
941
 
925
942
  [.source]
926
943
  <<ISO2191,section=1>>
944
+
945
+ === Term2
946
+
947
+ Definition
948
+
949
+ [.source]
950
+ {{IEV:xyz}}
951
+
952
+ [.source]
953
+ {{IEV:xyz,t1}}
954
+
955
+ [.source]
956
+ {{IEV:xyz,t1,t2}}
927
957
  INPUT
928
958
  #{BLANK_HDR}
929
959
  <sections>
@@ -940,6 +970,27 @@ RSpec.describe Asciidoctor::Standoc do
940
970
  </origin>
941
971
  </termsource>
942
972
  </term>
973
+ <term id='_'>
974
+ <preferred>Term2</preferred>
975
+ <definition>
976
+ <p id='_'>Definition</p>
977
+ </definition>
978
+ <termsource status='identical'>
979
+ <origin citeas=''>
980
+ <termref base='IEV' target='xyz'/>
981
+ </origin>
982
+ </termsource>
983
+ <termsource status='identical'>
984
+ <origin citeas=''>
985
+ <termref base='IEV' target='xyz'>t1</termref>
986
+ </origin>
987
+ </termsource>
988
+ <termsource status='identical'>
989
+ <origin citeas=''>
990
+ <termref base='IEV' target='xyz'>t1</termref>
991
+ </origin>
992
+ </termsource>
993
+ </term>
943
994
  </terms>
944
995
  </sections>
945
996
  </standard-document>
@@ -955,6 +1006,13 @@ RSpec.describe Asciidoctor::Standoc do
955
1006
 
956
1007
  [.source]
957
1008
  <<ISO2191,section=1>>, with adjustments
1009
+
1010
+ === Term2
1011
+
1012
+ Definition
1013
+
1014
+ [.source]
1015
+ {{IEV:xyz}}, with adjustments
958
1016
  INPUT
959
1017
  #{BLANK_HDR}
960
1018
  <sections>
@@ -975,6 +1033,20 @@ RSpec.describe Asciidoctor::Standoc do
975
1033
  </modification>
976
1034
  </termsource>
977
1035
  </term>
1036
+ <term id='_'>
1037
+ <preferred>Term2</preferred>
1038
+ <definition>
1039
+ <p id='_'>Definition</p>
1040
+ </definition>
1041
+ <termsource status='modified'>
1042
+ <origin citeas=''>
1043
+ <termref base='IEV' target='xyz'/>
1044
+ </origin>
1045
+ <modification>
1046
+ <p id='_'>with adjustments</p>
1047
+ </modification>
1048
+ </termsource>
1049
+ </term>
978
1050
  </terms>
979
1051
  </sections>
980
1052
  </standard-document>