metanorma-standoc 1.10.8 → 1.11.2

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/lib/asciidoctor/standoc/base.rb +5 -4
  4. data/lib/asciidoctor/standoc/blocks.rb +1 -1
  5. data/lib/asciidoctor/standoc/cleanup.rb +20 -11
  6. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +28 -20
  7. data/lib/asciidoctor/standoc/cleanup_inline.rb +20 -7
  8. data/lib/asciidoctor/standoc/cleanup_maths.rb +5 -6
  9. data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +25 -15
  10. data/lib/asciidoctor/standoc/cleanup_reqt.rb +2 -21
  11. data/lib/asciidoctor/standoc/cleanup_section_names.rb +2 -2
  12. data/lib/asciidoctor/standoc/cleanup_symbols.rb +48 -0
  13. data/lib/asciidoctor/standoc/cleanup_terms.rb +54 -79
  14. data/lib/asciidoctor/standoc/cleanup_terms_designations.rb +179 -0
  15. data/lib/asciidoctor/standoc/cleanup_text.rb +23 -0
  16. data/lib/asciidoctor/standoc/converter.rb +2 -0
  17. data/lib/asciidoctor/standoc/datamodel/attributes_table_preprocessor.rb +6 -6
  18. data/lib/asciidoctor/standoc/inline.rb +20 -16
  19. data/lib/asciidoctor/standoc/isodoc.rng +254 -27
  20. data/lib/asciidoctor/standoc/lists.rb +1 -3
  21. data/lib/asciidoctor/standoc/macros_plantuml.rb +29 -14
  22. data/lib/asciidoctor/standoc/macros_terms.rb +49 -5
  23. data/lib/asciidoctor/standoc/ref.rb +101 -75
  24. data/lib/asciidoctor/standoc/ref_date_id.rb +30 -1
  25. data/lib/asciidoctor/standoc/ref_sect.rb +42 -24
  26. data/lib/asciidoctor/standoc/reqt.rb +1 -1
  27. data/lib/asciidoctor/standoc/section.rb +14 -13
  28. data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +50 -11
  29. data/lib/asciidoctor/standoc/terms.rb +12 -2
  30. data/lib/asciidoctor/standoc/utils.rb +36 -23
  31. data/lib/asciidoctor/standoc/validate.rb +25 -16
  32. data/lib/isodoc/html/htmlstyle.css +1 -1
  33. data/lib/isodoc/html/htmlstyle.scss +1 -1
  34. data/lib/metanorma/standoc/version.rb +1 -1
  35. data/metanorma-standoc.gemspec +3 -3
  36. data/spec/asciidoctor/base_spec.rb +4 -3
  37. data/spec/asciidoctor/blocks_spec.rb +202 -21
  38. data/spec/asciidoctor/cleanup_sections_spec.rb +7 -7
  39. data/spec/asciidoctor/cleanup_spec.rb +23 -197
  40. data/spec/asciidoctor/cleanup_terms_spec.rb +1205 -0
  41. data/spec/asciidoctor/datamodel/attributes_table_preprocessor_spec.rb +21 -21
  42. data/spec/asciidoctor/datamodel/diagram_preprocessor_spec.rb +16 -16
  43. data/spec/asciidoctor/inline_spec.rb +7 -7
  44. data/spec/asciidoctor/isobib_cache_spec.rb +4 -8
  45. data/spec/asciidoctor/macros_plantuml_spec.rb +36 -1
  46. data/spec/asciidoctor/macros_spec.rb +189 -112
  47. data/spec/asciidoctor/refs_dl_spec.rb +4 -4
  48. data/spec/asciidoctor/refs_spec.rb +860 -522
  49. data/spec/asciidoctor/section_spec.rb +18 -18
  50. data/spec/asciidoctor/validate_spec.rb +59 -2
  51. data/spec/spec_helper.rb +3 -2
  52. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +180 -180
  53. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec1.yml +12 -12
  54. data/spec/vcr_cassettes/isobib_get_123.yml +12 -12
  55. data/spec/vcr_cassettes/isobib_get_123_1.yml +27 -27
  56. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +35 -35
  57. data/spec/vcr_cassettes/isobib_get_123_2001.yml +13 -13
  58. data/spec/vcr_cassettes/isobib_get_124.yml +12 -12
  59. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
  60. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +45 -65
  61. metadata +11 -8
@@ -40,10 +40,9 @@ module Asciidoctor
40
40
  end
41
41
 
42
42
  def attr_code(attributes)
43
- attributes = attributes.reject { |_, val| val.nil? }.map
44
- attributes.map do |k, v|
45
- [k, (v.is_a? String) ? HTMLEntities.new.decode(v) : v]
46
- end.to_h
43
+ attributes.compact.transform_values do |v|
44
+ v.is_a?(String) ? HTMLEntities.new.decode(v) : v
45
+ end
47
46
  end
48
47
 
49
48
  # if the contents of node are blocks, output them to out;
@@ -56,7 +55,7 @@ module Asciidoctor
56
55
  end
57
56
 
58
57
  SUBCLAUSE_XPATH = "//clause[not(parent::sections)]"\
59
- "[not(ancestor::boilerplate)]".freeze
58
+ "[not(ancestor::boilerplate)]".freeze
60
59
 
61
60
  def isodoc(lang, script, i18nyaml = nil)
62
61
  conv = html_converter(EmptyAttr.new)
@@ -67,29 +66,43 @@ module Asciidoctor
67
66
 
68
67
  def default_script(lang)
69
68
  case lang
70
- when "ar", "fa"
71
- "Arab"
72
- when "ur"
73
- "Aran"
74
- when "ru", "bg"
75
- "Cyrl"
76
- when "hi"
77
- "Deva"
78
- when "el"
79
- "Grek"
80
- when "zh"
81
- "Hans"
82
- when "ko"
83
- "Kore"
84
- when "he"
85
- "Hebr"
86
- when "ja"
87
- "Jpan"
69
+ when "ar", "fa" then "Arab"
70
+ when "ur" then "Aran"
71
+ when "ru", "bg" then "Cyrl"
72
+ when "hi" then "Deva"
73
+ when "el" then "Grek"
74
+ when "zh" then "Hans"
75
+ when "ko" then "Kore"
76
+ when "he" then "Hebr"
77
+ when "ja" then "Jpan"
88
78
  else
89
79
  "Latn"
90
80
  end
91
81
  end
92
82
 
83
+ def dl_to_attrs(elem, dlist, name)
84
+ e = dlist.at("./dt[text()='#{name}']") or return
85
+ val = e.at("./following::dd/p") || e.at("./following::dd") or return
86
+ elem[name] = val.text
87
+ end
88
+
89
+ def dl_to_elems(ins, elem, dlist, name)
90
+ a = elem.at("./#{name}[last()]")
91
+ ins = a if a
92
+ dlist.xpath("./dt[text()='#{name}']").each do |e|
93
+ v = e.at("./following::dd")
94
+ e = v.elements and e.size == 1 && e.first.name == "p" and v = e.first
95
+ v.name = name
96
+ ins.next = v
97
+ ins = ins.next
98
+ end
99
+ ins
100
+ end
101
+
102
+ def term_expr(elem)
103
+ "<expression><name>#{elem}</name></expression>"
104
+ end
105
+
93
106
  class EmptyAttr
94
107
  def attr(_any_attribute)
95
108
  nil
@@ -7,7 +7,7 @@ require "iev"
7
7
  module Asciidoctor
8
8
  module Standoc
9
9
  module Validate
10
- SOURCELOCALITY = "./termsource/origin//locality[@type = 'clause']/"\
10
+ SOURCELOCALITY = "./origin//locality[@type = 'clause']/"\
11
11
  "referenceFrom".freeze
12
12
 
13
13
  def init_iev
@@ -21,18 +21,25 @@ module Asciidoctor
21
21
  def iev_validate(xmldoc)
22
22
  @iev = init_iev or return
23
23
  xmldoc.xpath("//term").each do |t|
24
- /^IEC 60050-/.match(t&.at("./termsource/origin/@citeas")&.text) &&
25
- loc = t.xpath(SOURCELOCALITY)&.text or next
26
- iev = @iev.fetch(loc, xmldoc&.at("//language")&.text || "en") or next
27
- pref = t.xpath("./preferred").inject([]) do |m, x|
28
- m << x&.text&.downcase
24
+ t.xpath(".//termsource").each do |src|
25
+ (/^IEC 60050-/.match(src&.at("./origin/@citeas")&.text) &&
26
+ loc = src.xpath(SOURCELOCALITY)&.text) or next
27
+ iev_validate1(t, loc, xmldoc)
29
28
  end
30
- pref.include?(iev.downcase) or
31
- @log.add("Bibliography", t, %(Term "#{pref[0]}" does not match ) +
32
- %(IEV #{loc} "#{iev}"))
33
29
  end
34
30
  end
35
31
 
32
+ def iev_validate1(term, loc, xmldoc)
33
+ iev = @iev.fetch(loc,
34
+ xmldoc&.at("//language")&.text || "en") or return
35
+ pref = term.xpath("./preferred//name").inject([]) do |m, x|
36
+ m << x&.text&.downcase
37
+ end
38
+ pref.include?(iev.downcase) or
39
+ @log.add("Bibliography", term, %(Term "#{pref[0]}" does not match ) +
40
+ %(IEV #{loc} "#{iev}"))
41
+ end
42
+
36
43
  def content_validate(doc)
37
44
  @fatalerror = []
38
45
  xref_validate(doc)
@@ -40,7 +47,8 @@ module Asciidoctor
40
47
  norm_ref_validate(doc)
41
48
  repeat_id_validate(doc.root)
42
49
  iev_validate(doc.root)
43
- concept_validate(doc)
50
+ concept_validate(doc, "concept", "refterm")
51
+ concept_validate(doc, "related", "preferred//name")
44
52
  @fatalerror.empty? or clean_abort(@fatalerror.join("\n"), doc.to_xml)
45
53
  end
46
54
 
@@ -57,19 +65,20 @@ module Asciidoctor
57
65
  found and @fatalerror << "Numeric reference in normative references"
58
66
  end
59
67
 
60
- def concept_validate(doc)
68
+ def concept_validate(doc, tag, refterm)
61
69
  found = false
62
- doc.xpath("//concept/xref").each do |x|
70
+ doc.xpath("//#{tag}/xref").each do |x|
63
71
  next if doc.at("//term[@id = '#{x['target']}']")
64
72
  next if doc.at("//definitions//dt[@id = '#{x['target']}']")
65
73
 
66
- ref = x&.at("../refterm")&.text
74
+ ref = x&.at("../#{refterm}")&.text
67
75
  @log.add("Anchors", x,
68
- "Concept #{ref} is pointing to "\
76
+ "#{tag.capitalize} #{ref} is pointing to "\
69
77
  "#{x['target']}, which is not a term or symbol")
70
78
  found = true
71
79
  end
72
- found and @fatalerror << "Concept not cross-referencing term or symbol"
80
+ found and
81
+ @fatalerror << "#{tag.capitalize} not cross-referencing term or symbol"
73
82
  end
74
83
 
75
84
  def repeat_id_validate1(ids, elem)
@@ -103,7 +112,7 @@ module Asciidoctor
103
112
  def schema_validate1(file, doc, schema)
104
113
  file.write(doc.to_xml)
105
114
  file.close
106
- errors = Jing.new(schema).validate(file.path)
115
+ errors = Jing.new(schema, encoding: "UTF-8").validate(file.path)
107
116
  warn "Syntax Valid!" if errors.none?
108
117
  errors.each do |e|
109
118
  @log.add("Metanorma XML Syntax",
@@ -492,7 +492,7 @@ h3 {
492
492
  font-size: 1.1em;
493
493
  font-weight: 100; }
494
494
 
495
- .TermNum, .Terms, .AltTerms {
495
+ .TermNum {
496
496
  color: #C70039;
497
497
  font-weight: 100; }
498
498
 
@@ -185,7 +185,7 @@ p.document-stage {
185
185
  font-weight: 100;
186
186
  }
187
187
 
188
- .TermNum, .Terms, .AltTerms {
188
+ .TermNum {
189
189
  color: #C70039;
190
190
  font-weight: 100;
191
191
  }
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "1.10.8".freeze
22
+ VERSION = "1.11.2".freeze
23
23
  end
24
24
  end
@@ -27,8 +27,8 @@ Gem::Specification.new do |spec|
27
27
  spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
28
28
 
29
29
  spec.add_dependency "asciidoctor", "~> 2.0.0"
30
- spec.add_dependency "iev", "~> 0.2.1"
31
- spec.add_dependency "isodoc", "~> 1.7.0"
30
+ spec.add_dependency "iev", "~> 0.3.0"
31
+ spec.add_dependency "isodoc", "~> 1.8.0"
32
32
  spec.add_dependency "metanorma-plugin-datastruct"
33
33
  spec.add_dependency "metanorma-plugin-lutaml"
34
34
  spec.add_dependency "ruby-jing"
@@ -42,7 +42,7 @@ Gem::Specification.new do |spec|
42
42
  spec.add_dependency "relaton-iev", "~> 1.1.0"
43
43
  spec.add_dependency "unicode2latex", "~> 0.0.1"
44
44
 
45
- spec.add_development_dependency "byebug"
45
+ spec.add_development_dependency "debug"
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"
@@ -959,14 +959,15 @@ QU1FOiB0ZXN0Cgo=
959
959
 
960
960
  it "process mn2pdf attributes" do
961
961
  node = Nokogiri::XML("<fake/>").at("fake")
962
- node["mn2pdf-font-manifest-file"] = "passed/as/font/manifest/to/mn2pdf.jar"
962
+ node[Asciidoctor::Standoc::Base::FONTS_MANIFEST] =
963
+ "passed/as/font/manifest/to/mn2pdf.jar"
963
964
 
964
965
  options = Asciidoctor::Standoc::Converter
965
966
  .new(:standoc, header_footer: true)
966
967
  .doc_extract_attributes(node)
967
968
 
968
- expect(options.dig(:mn2pdf, :font_manifest_file))
969
- .to eq(node["mn2pdf-font-manifest-file"])
969
+ expect(options.dig(:mn2pdf, :font_manifest))
970
+ .to eq(node[Asciidoctor::Standoc::Base::FONTS_MANIFEST])
970
971
  end
971
972
 
972
973
  private
@@ -353,10 +353,11 @@ RSpec.describe Asciidoctor::Standoc do
353
353
  <title>Terms and definitions</title>
354
354
  <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
355
355
  <term id='term-term1'>
356
- <preferred>Term1</preferred>
356
+ <preferred><expression><name>Term1</name></expression></preferred>
357
357
  <definition>
358
+ <verbal-definition>
358
359
  <p id='_'>first definition</p>
359
- <termsource status='identical'>
360
+ <termsource status='identical' type="authoritative">
360
361
  <origin bibitemid='ISO2191' type='inline' citeas=''>
361
362
  <localityStack>
362
363
  <locality type='section'>
@@ -365,10 +366,12 @@ RSpec.describe Asciidoctor::Standoc do
365
366
  </localityStack>
366
367
  </origin>
367
368
  </termsource>
369
+ </verbal-definition>
368
370
  </definition>
369
371
  <definition>
372
+ <verbal-definition>
370
373
  <p id='_'>second definition</p>
371
- <termsource status='identical'>
374
+ <termsource status='identical' type="authoritative">
372
375
  <origin bibitemid='ISO2191' type='inline' citeas=''>
373
376
  <localityStack>
374
377
  <locality type='section'>
@@ -377,11 +380,12 @@ RSpec.describe Asciidoctor::Standoc do
377
380
  </localityStack>
378
381
  </origin>
379
382
  </termsource>
383
+ </verbal-definition>
380
384
  </definition>
381
385
  <termnote id='_'>
382
386
  <p id='_'>This is a note</p>
383
387
  </termnote>
384
- <termsource status='identical'>
388
+ <termsource status='identical' type="authoritative">
385
389
  <origin bibitemid='ISO2191' type='inline' citeas=''>
386
390
  <localityStack>
387
391
  <locality type='section'>
@@ -420,7 +424,7 @@ RSpec.describe Asciidoctor::Standoc do
420
424
  <title>Terms and definitions</title>
421
425
  <p id="_">For the purposes of this document, the following terms and definitions apply.</p>
422
426
  <term id="term-term1">
423
- <preferred>Term1</preferred>
427
+ <preferred><expression><name>Term1</name></expression></preferred>
424
428
  <termnote id="_">
425
429
  <p id="_">This is a note</p>
426
430
  </termnote>
@@ -495,7 +499,7 @@ RSpec.describe Asciidoctor::Standoc do
495
499
  <terms id="_" obligation="normative"><title>Terms, definitions and symbols</title>
496
500
  <p id="_">For the purposes of this document, the following terms and definitions apply.</p>
497
501
  <term id="term-term1">
498
- <preferred>Term1</preferred>
502
+ <preferred><expression><name>Term1</name></expression></preferred>
499
503
  </term>
500
504
  <definitions id="_" obligation="normative" type="symbols">
501
505
  <title>Symbols</title>
@@ -510,6 +514,59 @@ RSpec.describe Asciidoctor::Standoc do
510
514
  .to be_equivalent_to xmlpp(output)
511
515
  end
512
516
 
517
+ it "processes nested terms" do
518
+ input = <<~INPUT
519
+ #{ASCIIDOC_BLANK_HDR}
520
+ == Terms and Definitions
521
+
522
+ [.term]
523
+ === Term1
524
+
525
+ definition
526
+
527
+ NOTE: Note 1
528
+
529
+ ==== Term11
530
+ definition2
531
+
532
+ NOTE: Note 2
533
+ INPUT
534
+ output = <<~OUTPUT
535
+ #{BLANK_HDR}
536
+ <sections>
537
+ <clause id='_' obligation='normative'>
538
+ <title>Terms and definitions</title>
539
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
540
+ <terms id='_' obligation='normative'>
541
+ <title>Term1</title>
542
+ <p id='_'>definition</p>
543
+ <note id='_'>
544
+ <p id='_'>Note 1</p>
545
+ </note>
546
+ <term id='term-term11'>
547
+ <preferred>
548
+ <expression>
549
+ <name>Term11</name>
550
+ </expression>
551
+ </preferred>
552
+ <definition>
553
+ <verbal-definition>
554
+ <p id='_'>definition2</p>
555
+ </verbal-definition>
556
+ </definition>
557
+ <termnote id='_'>
558
+ <p id='_'>Note 2</p>
559
+ </termnote>
560
+ </term>
561
+ </terms>
562
+ </clause>
563
+ </sections>
564
+ </standard-document>
565
+ OUTPUT
566
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
567
+ .to be_equivalent_to xmlpp(output)
568
+ end
569
+
513
570
  it "processes notes" do
514
571
  input = <<~INPUT
515
572
  #{ASCIIDOC_BLANK_HDR}
@@ -653,7 +710,7 @@ RSpec.describe Asciidoctor::Standoc do
653
710
  <title>Terms and definitions</title>
654
711
  <p id="_">For the purposes of this document, the following terms and definitions apply.</p>
655
712
  <term id="term-term1">
656
- <preferred>Term1</preferred>
713
+ <preferred><expression><name>Term1</name></expression></preferred>
657
714
  <termexample id="ABC" tag='X' multilingual-rendering='common'>
658
715
  <p id="_">This is an example</p>
659
716
  </termexample></term>
@@ -713,7 +770,7 @@ RSpec.describe Asciidoctor::Standoc do
713
770
  <sections>
714
771
  <terms id="_" obligation="normative"><title>Terms, definitions and symbols</title>
715
772
  <p id="_">For the purposes of this document, the following terms and definitions apply.</p><term id="term-term1">
716
- <preferred>Term1</preferred>
773
+ <preferred><expression><name>Term1</name></expression></preferred>
717
774
  </term>
718
775
  <definitions id="_" obligation="normative" type="symbols">
719
776
  <title>Symbols</title>
@@ -1010,6 +1067,50 @@ RSpec.describe Asciidoctor::Standoc do
1010
1067
  INPUT
1011
1068
  expect(strip_guid(Asciidoctor.convert(input, *OPTIONS)))
1012
1069
  .to include '<image src="data:image/png;base64'
1070
+
1071
+ input = <<~INPUT
1072
+ = Document title
1073
+ Author
1074
+ :docfile: test.adoc
1075
+ :nodoc:
1076
+ :novalid:
1077
+ :no-isobib:
1078
+ :data-uri-image: true
1079
+
1080
+ .Split-it-right sample divider
1081
+ image::spec/examples/rice_images/rice_image1.png[]
1082
+ INPUT
1083
+ expect(strip_guid(Asciidoctor.convert(input, *OPTIONS)))
1084
+ .to include '<image src="data:image/png;base64'
1085
+
1086
+ input = <<~INPUT
1087
+ = Document title
1088
+ Author
1089
+ :docfile: test.adoc
1090
+ :nodoc:
1091
+ :novalid:
1092
+ :no-isobib:
1093
+ :data-uri-image: false
1094
+
1095
+ .Split-it-right sample divider
1096
+ image::spec/examples/rice_images/rice_image1.png[]
1097
+ INPUT
1098
+ expect(strip_guid(Asciidoctor.convert(input, *OPTIONS)))
1099
+ .not_to include '<image src="data:image/png;base64'
1100
+
1101
+ input = <<~INPUT
1102
+ = Document title
1103
+ Author
1104
+ :docfile: test.adoc
1105
+ :nodoc:
1106
+ :novalid:
1107
+ :no-isobib:
1108
+
1109
+ .Split-it-right sample divider
1110
+ image::spec/examples/rice_images/rice_image1.png[]
1111
+ INPUT
1112
+ expect(strip_guid(Asciidoctor.convert(input, *OPTIONS)))
1113
+ .to include '<image src="data:image/png;base64'
1013
1114
  end
1014
1115
 
1015
1116
  it "accepts attributes on paragraphs" do
@@ -1124,6 +1225,8 @@ RSpec.describe Asciidoctor::Standoc do
1124
1225
 
1125
1226
  === Term1
1126
1227
 
1228
+ Definition 0
1229
+
1127
1230
  [.source]
1128
1231
  <<ISO2191,section=1>>
1129
1232
 
@@ -1150,15 +1253,16 @@ RSpec.describe Asciidoctor::Standoc do
1150
1253
  <title>Terms and definitions</title><p id="_">For the purposes of this document,
1151
1254
  the following terms and definitions apply.</p>
1152
1255
  <term id="term-term1">
1153
- <preferred>Term1</preferred>
1154
- <termsource status="identical">
1256
+ <preferred><expression><name>Term1</name></expression></preferred>
1257
+ <definition><verbal-definition><p id='_'>Definition 0</p></verbal-definition></definition>
1258
+ <termsource status="identical" type="authoritative">
1155
1259
  <origin bibitemid="ISO2191" type="inline" citeas="">
1156
1260
  <localityStack>
1157
1261
  <locality type="section"><referenceFrom>1</referenceFrom></locality>
1158
1262
  </localityStack>
1159
1263
  </origin>
1160
1264
  </termsource>
1161
- <termsource status="identical">
1265
+ <termsource status="identical" type="authoritative">
1162
1266
  <origin bibitemid="ISO2191" type="inline" citeas="" case='capital' droploc='true'>
1163
1267
  <localityStack>
1164
1268
  <locality type="section"><referenceFrom>1</referenceFrom></locality>
@@ -1167,21 +1271,23 @@ RSpec.describe Asciidoctor::Standoc do
1167
1271
  </termsource>
1168
1272
  </term>
1169
1273
  <term id='term-term2'>
1170
- <preferred>Term2</preferred>
1274
+ <preferred><expression><name>Term2</name></expression></preferred>
1171
1275
  <definition>
1276
+ <verbal-definition>
1172
1277
  <p id='_'>Definition</p>
1278
+ </verbal-definition>
1173
1279
  </definition>
1174
- <termsource status='identical'>
1280
+ <termsource status='identical' type="authoritative">
1175
1281
  <origin citeas=''>
1176
1282
  <termref base='IEV' target='xyz'/>
1177
1283
  </origin>
1178
1284
  </termsource>
1179
- <termsource status='identical'>
1285
+ <termsource status='identical' type="authoritative">
1180
1286
  <origin citeas=''>
1181
1287
  <termref base='IEV' target='xyz'/>
1182
1288
  </origin>
1183
1289
  </termsource>
1184
- <termsource status='identical'>
1290
+ <termsource status='identical' type="authoritative">
1185
1291
  <origin citeas=''>
1186
1292
  <termref base='IEV' target='xyz'/>
1187
1293
  </origin>
@@ -1202,6 +1308,8 @@ RSpec.describe Asciidoctor::Standoc do
1202
1308
 
1203
1309
  === Term1
1204
1310
 
1311
+ Definition 0
1312
+
1205
1313
  [.source]
1206
1314
  <<ISO2191,section=1>>, with adjustments
1207
1315
 
@@ -1220,8 +1328,9 @@ RSpec.describe Asciidoctor::Standoc do
1220
1328
  <p id="_">For the purposes of this document,
1221
1329
  the following terms and definitions apply.</p>
1222
1330
  <term id="term-term1">
1223
- <preferred>Term1</preferred>
1224
- <termsource status="modified">
1331
+ <preferred><expression><name>Term1</name></expression></preferred>
1332
+ <definition><verbal-definition><p id='_'>Definition 0</p></verbal-definition></definition>
1333
+ <termsource status="modified" type="authoritative">
1225
1334
  <origin bibitemid="ISO2191" type="inline" citeas="">
1226
1335
  <localityStack>
1227
1336
  <locality type="section"><referenceFrom>1</referenceFrom></locality>
@@ -1233,11 +1342,11 @@ RSpec.describe Asciidoctor::Standoc do
1233
1342
  </termsource>
1234
1343
  </term>
1235
1344
  <term id='term-term2'>
1236
- <preferred>Term2</preferred>
1237
- <definition>
1345
+ <preferred><expression><name>Term2</name></expression></preferred>
1346
+ <definition><verbal-definition>
1238
1347
  <p id='_'>Definition</p>
1239
- </definition>
1240
- <termsource status='modified'>
1348
+ </verbal-definition></definition>
1349
+ <termsource status='modified' type="authoritative">
1241
1350
  <origin citeas=''>
1242
1351
  <termref base='IEV' target='xyz'/>
1243
1352
  </origin>
@@ -1254,6 +1363,78 @@ RSpec.describe Asciidoctor::Standoc do
1254
1363
  .to be_equivalent_to xmlpp(output)
1255
1364
  end
1256
1365
 
1366
+
1367
+ it "processes term source attributes" do
1368
+ input = <<~INPUT
1369
+ #{ASCIIDOC_BLANK_HDR}
1370
+ == Terms and Definitions
1371
+
1372
+ === Term1
1373
+
1374
+ Definition 0
1375
+
1376
+ [.source,status=generalisation]
1377
+ <<ISO2191,section=1>>, with adjustments
1378
+
1379
+ === Term2
1380
+
1381
+ Definition
1382
+
1383
+ [.source,type=lineage]
1384
+ {{<<IEV:xyz>>}}, with adjustments
1385
+ INPUT
1386
+ output = <<~OUTPUT
1387
+ #{BLANK_HDR}
1388
+ <sections>
1389
+ <terms id='_' obligation='normative'>
1390
+ <title>Terms and definitions</title>
1391
+ <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
1392
+ <term id='term-term1'>
1393
+ <preferred>
1394
+ <expression>
1395
+ <name>Term1</name>
1396
+ </expression>
1397
+ </preferred>
1398
+ <definition><verbal-definition><p id='_'>Definition 0</p></verbal-definition></definition>
1399
+ <termsource status='generalisation' type='authoritative'>
1400
+ <origin bibitemid='ISO2191' type='inline' citeas=''>
1401
+ <localityStack>
1402
+ <locality type='section'>
1403
+ <referenceFrom>1</referenceFrom>
1404
+ </locality>
1405
+ </localityStack>
1406
+ </origin>
1407
+ <modification>
1408
+ <p id='_'>with adjustments</p>
1409
+ </modification>
1410
+ </termsource>
1411
+ </term>
1412
+ <term id='term-term2'>
1413
+ <preferred>
1414
+ <expression>
1415
+ <name>Term2</name>
1416
+ </expression>
1417
+ </preferred>
1418
+ <definition><verbal-definition>
1419
+ <p id='_'>Definition</p>
1420
+ </verbal-definition></definition>
1421
+ <termsource status='modified' type='lineage'>
1422
+ <origin citeas=''>
1423
+ <termref base='IEV' target='xyz'/>
1424
+ </origin>
1425
+ <modification>
1426
+ <p id='_'>with adjustments</p>
1427
+ </modification>
1428
+ </termsource>
1429
+ </term>
1430
+ </terms>
1431
+ </sections>
1432
+ </standard-document>
1433
+ OUTPUT
1434
+ expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
1435
+ .to be_equivalent_to xmlpp(output)
1436
+ end
1437
+
1257
1438
  it "processes recommendation" do
1258
1439
  input = <<~"INPUT"
1259
1440
  #{ASCIIDOC_BLANK_HDR}
@@ -28,8 +28,8 @@ RSpec.describe Asciidoctor::Standoc do
28
28
  </li>
29
29
  </ul>
30
30
  <term id="term-time">
31
- <preferred>Time</preferred>
32
- <definition><p id="_">This paragraph is extraneous</p></definition>
31
+ <preferred><expression><name>Time</name></expression></preferred>
32
+ <definition><verbal-definition><p id="_">This paragraph is extraneous</p></verbal-definition></definition>
33
33
  </term></terms>
34
34
  </sections>
35
35
  </standard-document>
@@ -521,7 +521,7 @@ RSpec.describe Asciidoctor::Standoc do
521
521
  </title>
522
522
  <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
523
523
  <term id='term-term1'>
524
- <preferred>Term1</preferred>
524
+ <preferred><expression><name>Term1</name></expression></preferred>
525
525
  </term>
526
526
  </terms>
527
527
  <clause id='_' inline-header='false' obligation='normative'>
@@ -796,7 +796,7 @@ RSpec.describe Asciidoctor::Standoc do
796
796
  <title>Terms and definitions</title>
797
797
  <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
798
798
  <term id='term-term1'>
799
- <preferred>Term1</preferred>
799
+ <preferred><expression><name>Term1</name></expression></preferred>
800
800
  </term>
801
801
  </terms>
802
802
  <clause id='_' inline-header='false' obligation='normative'>
@@ -1033,7 +1033,7 @@ RSpec.describe Asciidoctor::Standoc do
1033
1033
  s’appliquent.
1034
1034
  </p>
1035
1035
  <term id='term-term1'>
1036
- <preferred>Term1</preferred>
1036
+ <preferred><expression><name>Term1</name></expression></preferred>
1037
1037
  </term>
1038
1038
  </terms>
1039
1039
  <clause id='_' inline-header='false' obligation='normative'>
@@ -1267,7 +1267,7 @@ RSpec.describe Asciidoctor::Standoc do
1267
1267
  <title>术语和定义</title>
1268
1268
  <p id='_'>下列术语和定义适用于本文件。</p>
1269
1269
  <term id='term-term1'>
1270
- <preferred>Term1</preferred>
1270
+ <preferred><expression><name>Term1</name></expression></preferred>
1271
1271
  </term>
1272
1272
  </terms>
1273
1273
  <clause id='_' inline-header='false' obligation='normative'>
@@ -1501,7 +1501,7 @@ RSpec.describe Asciidoctor::Standoc do
1501
1501
  <title>Terms and definitions</title>
1502
1502
  <p id='_'>For the purposes of this document, the following terms and definitions apply.</p>
1503
1503
  <term id='term-term1'>
1504
- <preferred>Term1</preferred>
1504
+ <preferred><expression><name>Term1</name></expression></preferred>
1505
1505
  </term>
1506
1506
  </terms>
1507
1507
  <clause id='_' inline-header='false' obligation='normative'>