metanorma-iso 2.1.3 → 2.1.6

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/lib/isodoc/iso/html/isodoc-dis.css +1 -10
  3. data/lib/isodoc/iso/html/isodoc-dis.scss +1 -13
  4. data/lib/isodoc/iso/html/isodoc.css +4 -11
  5. data/lib/isodoc/iso/html/isodoc.scss +5 -15
  6. data/lib/isodoc/iso/html/style-human.css +3 -0
  7. data/lib/isodoc/iso/html/style-human.scss +4 -0
  8. data/lib/isodoc/iso/html/style-iso.css +3 -0
  9. data/lib/isodoc/iso/html/style-iso.scss +4 -0
  10. data/lib/isodoc/iso/i18n-en.yaml +1 -1
  11. data/lib/isodoc/iso/iso.amendment.xsl +3611 -2912
  12. data/lib/isodoc/iso/iso.international-standard.xsl +3611 -2912
  13. data/lib/isodoc/iso/metadata.rb +1 -1
  14. data/lib/isodoc/iso/presentation_xml_convert.rb +4 -0
  15. data/lib/isodoc/iso/word_cleanup.rb +50 -19
  16. data/lib/isodoc/iso/word_dis_cleanup.rb +10 -14
  17. data/lib/isodoc/iso/word_dis_convert.rb +1 -1
  18. data/lib/metanorma/iso/base.rb +0 -6
  19. data/lib/metanorma/iso/boilerplate-fr.xml +1 -1
  20. data/lib/metanorma/iso/boilerplate-ru.xml +1 -1
  21. data/lib/metanorma/iso/boilerplate.xml +1 -1
  22. data/lib/metanorma/iso/cleanup.rb +4 -2
  23. data/lib/metanorma/iso/front_id.rb +28 -0
  24. data/lib/metanorma/iso/isodoc.rng +32 -1
  25. data/lib/metanorma/iso/isostandard.rng +3 -1
  26. data/lib/metanorma/iso/reqt.rng +1 -1
  27. data/lib/metanorma/iso/version.rb +1 -1
  28. data/metanorma-iso.gemspec +2 -1
  29. data/spec/isodoc/blocks_spec.rb +3 -3
  30. data/spec/isodoc/metadata_spec.rb +1 -2
  31. data/spec/isodoc/postproc_spec.rb +8 -75
  32. data/spec/isodoc/terms_spec.rb +62 -0
  33. data/spec/isodoc/word_dis_spec.rb +133 -15
  34. data/spec/metanorma/base_spec.rb +6 -17
  35. data/spec/metanorma/blocks_spec.rb +0 -33
  36. data/spec/metanorma/cleanup_spec.rb +201 -201
  37. data/spec/metanorma/processor_spec.rb +1 -2
  38. data/spec/metanorma/refs_spec.rb +5 -3
  39. data/spec/metanorma/section_spec.rb +6 -6
  40. data/spec/spec_helper.rb +1 -1
  41. data/spec/vcr_cassettes/withdrawn_iso.yml +28 -28
  42. metadata +18 -5
  43. data/lib/metanorma/iso/macros.rb +0 -29
@@ -230,7 +230,7 @@ module IsoDoc
230
230
  ret = [ag]
231
231
  ret << sc_base(xml, "approvalgroup")
232
232
  ret << wg_base(xml, "approvalgroup")
233
- set(:approvalgroup, ret)
233
+ set(:approvalgroup, ret.compact)
234
234
  end
235
235
 
236
236
  def secretariat(xml)
@@ -196,6 +196,10 @@ module IsoDoc
196
196
  type
197
197
  end
198
198
 
199
+ def related1(node)
200
+ node.remove
201
+ end
202
+
199
203
  include Init
200
204
  end
201
205
  end
@@ -11,11 +11,10 @@ module IsoDoc
11
11
  end
12
12
  end
13
13
 
14
- # force Annex h2 down to be p.h2Annex, so it is not picked up by ToC
15
14
  def word_annex_cleanup1(docxml, lvl)
16
15
  docxml.xpath("//h#{lvl}[ancestor::*[@class = 'Section3']]").each do |h2|
17
16
  h2.name = "p"
18
- h2["class"] = "h#{lvl}Annex"
17
+ h2["class"] = "a#{lvl}"
19
18
  end
20
19
  end
21
20
 
@@ -37,40 +36,72 @@ module IsoDoc
37
36
 
38
37
  def style_cleanup(docxml)
39
38
  word_annex_cleanup_h1(docxml)
40
- style_cleanup1(docxml)
39
+ figure_style(docxml)
40
+ new_styles(docxml)
41
41
  end
42
42
 
43
- def style_cleanup1(docxml)
44
- docxml.xpath("//*[@class = 'example']").each do |p|
45
- p["class"] = "Example"
43
+ def figure_style(docxml)
44
+ docxml.xpath("//div[@class = 'figure']").each do |f|
45
+ f["style"] ||= ""
46
+ f["style"] += "text-align:center;"
46
47
  end
48
+ end
49
+
50
+ def quote_style(docxml)
51
+ docxml.xpath("//div[@class = 'Quote' or @class = 'Note' or "\
52
+ "@class = 'Example' or @class = 'Admonition']").each do |d|
53
+ quote_style1(d)
54
+ end
55
+ end
56
+
57
+ def quote_style1(div)
58
+ div.xpath(".//li").each do |p|
59
+ p["style"] ||= ""
60
+ p["style"] += "font-size:#{default_fonts({})[:smallerfontsize]};"
61
+ end
62
+ end
63
+
64
+ STYLESMAP = {
65
+ example: "Example",
66
+ note: "Note",
67
+ Sourcecode: "Code",
68
+ tabletitle: "Tabletitle",
69
+ Biblio: "MsoNormal",
70
+ figure: "MsoNormal",
71
+ SourceTitle: "FigureTitle",
72
+ }.freeze
73
+
74
+ def new_styles(docxml)
75
+ STYLESMAP.each do |k, v|
76
+ docxml.xpath("//*[@class = '#{k}']").each { |s| s["class"] = v }
77
+ end
78
+ docxml.xpath("//div[@class = 'Section3']//p[@class = 'Tabletitle']")
79
+ .each { |t| t["class"] = "AnnexTableTitle" }
47
80
  docxml.xpath("//*[@class = 'zzHelp']/p[not(@class)]").each do |p|
48
81
  p["class"] = "zzHelp"
49
82
  end
83
+ quote_style(docxml)
50
84
  end
51
85
 
52
86
  def authority_hdr_cleanup(docxml)
53
- docxml&.xpath("//div[@class = 'boilerplate-license']")&.each do |d|
54
- d.xpath(".//h1").each do |p|
55
- p.name = "p"
56
- p["class"] = "zzWarningHdr"
87
+ { "boilerplate-license": "zzWarningHdr",
88
+ "boilerplate-copyright": "zzCopyrightHdr" }.each do |k, v|
89
+ docxml.xpath("//div[@class = '#{k}']").each do |d|
90
+ d.xpath(".//h1").each do |p|
91
+ p.name = "p"
92
+ p["class"] = v
93
+ end
94
+ end
57
95
  end
58
- end
59
- docxml&.xpath("//div[@class = 'boilerplate-copyright']")&.each do |d|
60
- d.xpath(".//h1").each do |p|
61
- p.name = "p"
62
- p["class"] = "zzCopyrightHdr"
63
- end
64
- end
65
96
  end
66
97
 
67
98
  def authority_cleanup(docxml)
68
99
  insert = docxml.at("//div[@id = 'boilerplate-license-destination']")
69
- auth = docxml&.at("//div[@class = 'boilerplate-license']")&.remove
100
+ auth = docxml.at("//div[@class = 'boilerplate-license']")&.remove
70
101
  auth&.xpath(".//p[not(@class)]")&.each { |p| p["class"] = "zzWarning" }
71
102
  auth and insert and insert.children = auth
72
103
  insert = docxml.at("//div[@id = 'boilerplate-copyright-destination']")
73
- auth = docxml&.at("//div[@class = 'boilerplate-copyright']")&.remove
104
+ auth = docxml.at("//div[@class = 'boilerplate-copyright']")&.remove
74
105
  auth&.xpath(".//p[not(@class)]")&.each do |p|
75
106
  p["class"] = "zzCopyright"
76
107
  end
@@ -1,11 +1,6 @@
1
1
  module IsoDoc
2
2
  module Iso
3
3
  class WordDISConvert < WordConvert
4
- def style_cleanup(docxml)
5
- super
6
- dis_styles(docxml)
7
- end
8
-
9
4
  STYLESMAP = {
10
5
  AltTerms: "AdmittedTerm",
11
6
  TableFootnote: "Tablefootnote",
@@ -30,7 +25,7 @@ module IsoDoc
30
25
  zzCopyright1: "zzCopyright",
31
26
  }.freeze
32
27
 
33
- def dis_styles(docxml)
28
+ def new_styles(docxml)
34
29
  STYLESMAP.each do |k, v|
35
30
  docxml.xpath("//*[@class = '#{k}']").each { |s| s["class"] = v }
36
31
  end
@@ -46,8 +41,8 @@ module IsoDoc
46
41
  figure_style(docxml)
47
42
  note_style(docxml)
48
43
  example_style(docxml)
49
- quote_style(docxml)
50
44
  dis_style_interactions(docxml)
45
+ quote_style(docxml)
51
46
  end
52
47
 
53
48
  def dis_style_interactions(docxml)
@@ -68,13 +63,6 @@ module IsoDoc
68
63
  end
69
64
  end
70
65
 
71
- def quote_style(docxml)
72
- docxml.xpath("//div[@class = 'Quote' or @class = 'Note' or "\
73
- "@class = 'Example' or @class = 'Admonition']").each do |d|
74
- quote_style1(d)
75
- end
76
- end
77
-
78
66
  def para_style_change(div, class1, class2)
79
67
  s = class1 ? "@class = '#{class1}'" : "not(@class)"
80
68
  div.xpath(".//p[#{s}]").each do |p|
@@ -230,6 +218,14 @@ module IsoDoc
230
218
  end
231
219
  end
232
220
  end
221
+
222
+ def make_FigureWordToC(docxml)
223
+ super.sub(/FigureTitle,figuretitle/, "Figure title,Annex Figure Title")
224
+ end
225
+
226
+ def make_TableWordToC(docxml)
227
+ super.sub(/TableTitle,tabletitle/, "Table title,Annex Table Title")
228
+ end
233
229
  end
234
230
  end
235
231
  end
@@ -98,7 +98,7 @@ module IsoDoc
98
98
  @meta.get[:doctitlemain] && @meta.get[:doctitlepart] and p << " &#x2014; "
99
99
  if @meta.get[:doctitlepart]
100
100
  b = @meta.get[:doctitlepartlabel] and
101
- p << "<span style='font-weight:normal'>#{b}</span> "
101
+ p << "<span style='font-weight:normal'>#{b}:</span> "
102
102
  p << " #{@meta.get[:doctitlepart]}"
103
103
  end
104
104
  @meta.get[:doctitleamdlabel] || @meta.get[:doctitleamd] ||
@@ -5,16 +5,10 @@ require "pathname"
5
5
  require "open-uri"
6
6
  require "isodoc"
7
7
  require "fileutils"
8
- require_relative "macros"
9
8
 
10
9
  module Metanorma
11
10
  module ISO
12
11
  class Converter < Standoc::Converter
13
- Asciidoctor::Extensions.register do
14
- block Metanorma::ISO::EditorAdmonitionBlock
15
- treeprocessor Metanorma::ISO::EditorInlineAdmonitionBlock
16
- end
17
-
18
12
  XML_ROOT_TAG = "iso-standard".freeze
19
13
  XML_NAMESPACE = "https://www.metanorma.org/ns/iso".freeze
20
14
 
@@ -19,7 +19,7 @@ l’adresse ci-après ou au comité membre de l’ISO dans le pays du demandeur.
19
19
  ISO copyright office<br/>
20
20
  CP 401 &#x2022; Ch. de Blandonnet 8<br/>
21
21
  CH-1214 Vernier, Geneva<br/>
22
- Tél.&#xa0;&#xa0;+ 41 22 749 01 11<br/>
22
+ Tél: +41 22 749 01 11<br/>
23
23
  Email: copyright@iso.org<br/>
24
24
  Website: www.iso.org
25
25
  </p>
@@ -14,7 +14,7 @@
14
14
  Бюро ISO по охране авторских прав<br/>
15
15
  CP 401 &#x2022; Ch. de Blandonnet 8<br/>
16
16
  CH-1214 Vernier, Geneva<br/>
17
- Тел.&#xa0;&#xa0;+ 41 22 749 01 11<br/>
17
+ Тел: +41 22 749 01 11<br/>
18
18
  Электронная почта: copyright@iso.org<br/>
19
19
  Сайт: www.iso.org
20
20
  </p>
@@ -20,7 +20,7 @@ at the address below or ISO's member body in the country of the requester.
20
20
  ISO copyright office<br/>
21
21
  CP 401 &#x2022; Ch. de Blandonnet 8<br/>
22
22
  CH-1214 Vernier, Geneva<br/>
23
- Phone:&#xa0;&#xa0;+ 41 22 749 01 11<br/>
23
+ Phone: +41 22 749 01 11<br/>
24
24
  Email: copyright@iso.org<br/>
25
25
  Website: www.iso.org
26
26
  </p>
@@ -76,7 +76,8 @@ module Metanorma
76
76
  return 2 if bib.at("#{PUBLISHER}[abbreviation = 'IEC']")
77
77
  return 2 if bib.at("#{PUBLISHER}[name = 'International "\
78
78
  "Electrotechnical Commission']")
79
- return 3 if bib.at("./docidentifier[@type][not(#{OTHERIDS})]")
79
+ return 3 if bib.at("./docidentifier[@type][not(#{OTHERIDS})]") ||
80
+ bib.at("./docidentifier[not(@type)]")
80
81
 
81
82
  4
82
83
  end
@@ -98,7 +99,8 @@ module Metanorma
98
99
  def sort_biblio_key(bib)
99
100
  pubclass = pub_class(bib)
100
101
  num = bib&.at("./docnumber")&.text
101
- id = bib&.at("./docidentifier[not(#{OTHERIDS})]")
102
+ id = bib&.at("./docidentifier[@primary]") ||
103
+ bib&.at("./docidentifier[not(#{OTHERIDS})]")
102
104
  metaid = bib&.at("./docidentifier[@type = 'metanorma']")&.text
103
105
  abbrid = metaid unless /^\[\d+\]$/.match?(metaid)
104
106
  /\d-(?<partid>\d+)/ =~ id&.text
@@ -5,6 +5,34 @@ require "json"
5
5
  require "pathname"
6
6
  require "open-uri"
7
7
  require "twitter_cldr"
8
+ require "pubid-iso"
9
+
10
+ # @param stage [String] stage, eg. "WD", "CD", "DIS"
11
+ # @param urn_stage [Float] numeric stage for URN rendering
12
+ # @param iteration [Integer] document iteration, eg. "1", "2", "3"
13
+ # @param joint_document [Identifier] joint document
14
+ # @param supplement [Supplement] supplement
15
+ # @param tctype [String] Technical Committee type, eg. "TC", "JTC"
16
+ # @param sctype [String] TC subsommittee, eg. "SC"
17
+ # @param wgtype [String] TC working group type, eg. "AG", "AHG"
18
+ # @param tcnumber [Integer] Technical Committee number, eg. "1", "2"
19
+ # @param scnumber [Integer] Subsommittee number, eg. "1", "2"
20
+ # @param wgnumber [Integer] Working group number, eg. "1", "2"
21
+ # @param dir [Boolean] Directives document
22
+ # @param dirtype [String] Directives document type, eg. "JTC"
23
+ # @see Supplement
24
+ # @see Identifier
25
+ # @see Pubid::Core::Identifier
26
+ # @see Parser
27
+ #
28
+ =begin
29
+ def initialize(number: nil, stage: nil, iteration: nil, supplement: nil,
30
+ joint_document: nil, urn_stage: nil,
31
+ tctype: nil, sctype: nil, wgtype: nil, tcnumber: nil,
32
+ scnumber: nil, wgnumber:nil,
33
+ dir: nil, dirtype: nil, **opts)
34
+ super(**opts.merge(number: number))
35
+ =end
8
36
 
9
37
  module Metanorma
10
38
  module ISO
@@ -69,6 +69,17 @@
69
69
  </zeroOrMore>
70
70
  </element>
71
71
  </define>
72
+ <define name="AdmonitionType">
73
+ <choice>
74
+ <value>warning</value>
75
+ <value>note</value>
76
+ <value>tip</value>
77
+ <value>important</value>
78
+ <value>caution</value>
79
+ <value>statement</value>
80
+ <value>editorial</value>
81
+ </choice>
82
+ </define>
72
83
  <define name="index">
73
84
  <element name="index">
74
85
  <optional>
@@ -116,6 +127,11 @@
116
127
  <data type="boolean"/>
117
128
  </attribute>
118
129
  </optional>
130
+ <optional>
131
+ <attribute name="suppress_identifier">
132
+ <data type="boolean"/>
133
+ </attribute>
134
+ </optional>
119
135
  <ref name="BibliographicItem"/>
120
136
  </element>
121
137
  </define>
@@ -1269,7 +1285,12 @@
1269
1285
  </define>
1270
1286
  <define name="span">
1271
1287
  <element name="span">
1272
- <attribute name="class"/>
1288
+ <optional>
1289
+ <attribute name="class"/>
1290
+ </optional>
1291
+ <optional>
1292
+ <attribute name="style"/>
1293
+ </optional>
1273
1294
  <oneOrMore>
1274
1295
  <ref name="TextElement"/>
1275
1296
  </oneOrMore>
@@ -2488,6 +2509,16 @@
2488
2509
  <text/>
2489
2510
  </element>
2490
2511
  </optional>
2512
+ <optional>
2513
+ <element name="amendment">
2514
+ <text/>
2515
+ </element>
2516
+ </optional>
2517
+ <optional>
2518
+ <element name="corrigendum">
2519
+ <text/>
2520
+ </element>
2521
+ </optional>
2491
2522
  <optional>
2492
2523
  <element name="language">
2493
2524
  <text/>
@@ -45,7 +45,9 @@
45
45
  <ref name="horizontal"/>
46
46
  </optional>
47
47
  <ref name="editorialgroup"/>
48
- <ref name="approvalgroup"/>
48
+ <optional>
49
+ <ref name="approvalgroup"/>
50
+ </optional>
49
51
  <zeroOrMore>
50
52
  <ref name="ics"/>
51
53
  </zeroOrMore>
@@ -108,7 +108,7 @@
108
108
  </element>
109
109
  </define>
110
110
  <define name="label">
111
- <element name="label">
111
+ <element name="identifier">
112
112
  <oneOrMore>
113
113
  <ref name="TextElement"/>
114
114
  </oneOrMore>
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module ISO
3
- VERSION = "2.1.3".freeze
3
+ VERSION = "2.1.6".freeze
4
4
  end
5
5
  end
@@ -29,11 +29,12 @@ Gem::Specification.new do |spec|
29
29
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
30
30
  spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
31
31
 
32
- spec.add_dependency "metanorma-standoc", "~> 2.1.0"
32
+ spec.add_dependency "metanorma-standoc", "~> 2.2.0"
33
33
  spec.add_dependency "mnconvert", "~> 1.14"
34
34
  spec.add_dependency "ruby-jing"
35
35
  spec.add_dependency "tokenizer", "~> 0.3.0"
36
36
  spec.add_dependency "twitter_cldr"
37
+ spec.add_dependency "pubid-iso"
37
38
 
38
39
  spec.add_development_dependency "debug"
39
40
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
@@ -297,7 +297,7 @@ RSpec.describe IsoDoc do
297
297
  <iso-standard xmlns="http://riboseinc.com/isoxml" type='presentation'>
298
298
  <preface><foreword displayorder="1">
299
299
  <admonition id="_70234f78-64e5-4dfc-8b6f-f3f037348b6a" type="editorial">
300
- <p id='_e94663cc-2473-4ccc-9a72-983a74d989f2'>
300
+ <p id='_e94663cc-2473-4ccc-9a72-983a74d989f2'>EDITORIAL NOTE —
301
301
  Only use paddy or parboiled rice for the
302
302
  determination of husked rice yield.
303
303
  </p>
@@ -312,7 +312,7 @@ RSpec.describe IsoDoc do
312
312
  <div>
313
313
  <h1 class='ForewordTitle'>Foreword</h1>
314
314
  <div id='_70234f78-64e5-4dfc-8b6f-f3f037348b6a' class='zzHelp'>
315
- <p>
315
+ <p>EDITORIAL NOTE —
316
316
  Only use paddy or parboiled rice for the
317
317
  determination of husked rice yield.
318
318
  </p>
@@ -332,7 +332,7 @@ RSpec.describe IsoDoc do
332
332
  <div>
333
333
  <h1 class='ForewordTitle'>Foreword</h1>
334
334
  <div id='_70234f78-64e5-4dfc-8b6f-f3f037348b6a' class='zzHelp'>
335
- <p> Only use paddy or parboiled rice for the determination of husked rice yield. </p>
335
+ <p>EDITORIAL NOTE — Only use paddy or parboiled rice for the determination of husked rice yield. </p>
336
336
  <p class='ForewordText' id='_e94663cc-2473-4ccc-9a72-983a74d989f3'>Para 2.</p>
337
337
  </div>
338
338
  </div>
@@ -209,7 +209,6 @@ RSpec.describe IsoDoc::Iso::Metadata do
209
209
  </editorialgroup>
210
210
  <approvalgroup>
211
211
  <technical-committee number="34" type="ABC">Food products</technical-committee>
212
- <subcommittee number="4" type="DEF">Cereals and pulses</subcommittee>
213
212
  <workgroup number="3" type="GHI">Rice Group</workgroup>
214
213
  </approvalgroup>
215
214
  <ics><code>1.2.3</code></ics>
@@ -224,7 +223,7 @@ RSpec.describe IsoDoc::Iso::Metadata do
224
223
  INPUT
225
224
  output = <<~OUTPUT
226
225
  {:agency=>"ISO/IEC",
227
- :approvalgroup=>["ABC 34", "DEF 4", "GHI 3"],
226
+ :approvalgroup=>["ABC 34", "GHI 3"],
228
227
  :docnumber=>"ISO/IEC/CD 17301-1-3",
229
228
  :docnumber_lang=>"ISO/IEC/CD 17301-1-3 (E)",
230
229
  :docnumber_reference=>"ISO/IEC/CD 17301-1-3 (E)",
@@ -126,66 +126,6 @@ RSpec.describe IsoDoc do
126
126
  expect(File.exist?("spec/assets/iso.pdf")).to be true
127
127
  end
128
128
 
129
- it "converts annex subheadings to h2Annex class for Word" do
130
- IsoDoc::Iso::WordConvert
131
- .new(WORD_HTML_CSS.dup)
132
- .convert("test", <<~"INPUT", false)
133
- <iso-standard xmlns="http://riboseinc.com/isoxml">
134
- <annex id="P" inline-header="false" obligation="normative">
135
- <title>Annex</title>
136
- <clause id="Q" inline-header="false" obligation="normative">
137
- <title>A.1
138
- <tab/>
139
- Annex A.1</title>
140
- </clause>
141
- <appendix id="Q2" inline-header="false" obligation="normative">
142
- <title>Appendix 1
143
- <tab/>
144
- An Appendix</title>
145
- </appendix>
146
- </annex>
147
- <bibliography>
148
- <references id="R" normative="false"><title>Bibliography</title></references>
149
- </bibliography>
150
- </iso-standard>
151
- INPUT
152
-
153
- word = File.read("test.doc", encoding: "UTF-8")
154
- .sub(/^.*<div class="WordSection3">/m, '<div class="WordSection3">')
155
- .sub(%r{<br[^>]*>\s*<div class="colophon".*$}m, "")
156
-
157
- expect(xmlpp(word)).to be_equivalent_to xmlpp(<<~"OUTPUT")
158
- <div class="WordSection3">
159
- <p class="zzSTDTitle1"/>
160
- <p class="MsoNormal">
161
- <br clear="all" style="mso-special-character:line-break;page-break-before:always"/>
162
- </p>
163
- <div class="Section3">
164
- <a id="P" name="P"/>
165
- <p class="ANNEX">Annex</p>
166
- <div>
167
- <a id="Q" name="Q"/>
168
- <p class="h2Annex">A.1
169
- <span style="mso-tab-count:1">  </span>
170
- Annex A.1</p>
171
- </div>
172
- <div>
173
- <a id="Q2" name="Q2"/>
174
- <p class="h2Annex">Appendix 1
175
- <span style="mso-tab-count:1">  </span>
176
- An Appendix</p>
177
- </div>
178
- </div>
179
- <p class='MsoNormal'>
180
- <br clear='all' style='mso-special-character:line-break;page-break-before:always'/>
181
- </p>
182
- <div>
183
- <p class='BiblioTitle'>Bibliography</p>
184
- </div>
185
- </div>
186
- OUTPUT
187
- end
188
-
189
129
  it "populates Word template with terms reference labels" do
190
130
  IsoDoc::Iso::WordConvert
191
131
  .new(WORD_HTML_CSS.dup)
@@ -817,7 +757,7 @@ RSpec.describe IsoDoc do
817
757
  </p>
818
758
  <div class="Section3">
819
759
  <a id="P" name="P"/>
820
- <div class="figure">
760
+ <div class="MsoNormal" style='text-align:center;'>
821
761
  <a id="samplecode" name="samplecode"/>
822
762
  <p class="MsoNormal">Hello</p>
823
763
  <p class="MsoNormal">Key</p>
@@ -864,7 +804,7 @@ RSpec.describe IsoDoc do
864
804
  .sub(/^.*<div class="WordSection3">/m, '<div class="WordSection3">')
865
805
  .sub(%r{<br[^>]*>\s*<div class="colophon".*$}m, "")
866
806
  expect(xmlpp(word)).to be_equivalent_to xmlpp(<<~"OUTPUT")
867
- <div class='WordSection3'>
807
+ <div class='WordSection3'>
868
808
  <p class='zzSTDTitle1'/>
869
809
  <p class='MsoNormal'>
870
810
  <br clear='all' style='mso-special-character:line-break;page-break-before:always'/>
@@ -904,11 +844,9 @@ RSpec.describe IsoDoc do
904
844
  <br/>
905
845
  CH-1214 Vernier, Geneva, Switzerland
906
846
  <br/>
907
- Tel. + 41 22 749 01 11
908
- <br/>
909
- Fax + 41 22 749 09 47
847
+ Phone: +41 22 749 01 11
910
848
  <br/>
911
- copyright@iso.org
849
+ Email: copyright@iso.org
912
850
  <br/>
913
851
  www.iso.org</p>
914
852
  </clause>
@@ -951,11 +889,9 @@ RSpec.describe IsoDoc do
951
889
  <br/>
952
890
  CH-1214 Vernier, Geneva, Switzerland
953
891
  <br/>
954
- Tel. + 41 22 749 01 11
955
- <br/>
956
- Fax + 41 22 749 09 47
892
+ Phone: +41 22 749 01 11
957
893
  <br/>
958
- copyright@iso.org
894
+ Email: copyright@iso.org
959
895
  <br/>
960
896
  www.iso.org</p>
961
897
  </clause>
@@ -1015,13 +951,10 @@ RSpec.describe IsoDoc do
1015
951
  CH-1214 Vernier, Geneva, Switzerland
1016
952
 
1017
953
  <br/>
1018
- Tel. + 41 22 749 01 11
1019
-
1020
- <br/>
1021
- Fax + 41 22 749 09 47
954
+ Phone: +41 22 749 01 11
1022
955
 
1023
956
  <br/>
1024
- copyright@iso.org
957
+ Email: copyright@iso.org
1025
958
 
1026
959
  <br/>
1027
960
  www.iso.org#{' '}</p>
@@ -249,4 +249,66 @@ RSpec.describe IsoDoc do
249
249
  .sub(%r{</div>\s*<br.*$}m, "")))
250
250
  .to be_equivalent_to xmlpp(word)
251
251
  end
252
+
253
+ it "processes related terms" do
254
+ input = <<~INPUT
255
+ <iso-standard xmlns="http://riboseinc.com/isoxml">
256
+ <sections>
257
+ <terms id='A' obligation='normative'>
258
+ <title>Terms and definitions</title>
259
+ <term id='second'>
260
+ <preferred>
261
+ <expression>
262
+ <name>Second Term</name>
263
+ </expression>
264
+ <field-of-application>Field</field-of-application>
265
+ <usage-info>Usage Info 1</usage-info>
266
+ </preferred>
267
+ <definition><verbal-definition>Definition 1</verbal-definition></definition>
268
+ </term>
269
+ <term id="C">
270
+ <preferred language='fr' script='Latn' type='prefix'>
271
+ <expression>
272
+ <name>First Designation</name>
273
+ </expression></preferred>
274
+ <related type='contrast'>
275
+ <preferred>
276
+ <expression>
277
+ <name>Fifth Designation</name>
278
+ <grammar>
279
+ <gender>neuter</gender>
280
+ </grammar>
281
+ </expression>
282
+ </preferred>
283
+ <xref target='second'/>
284
+ </related>
285
+ <definition><verbal-definition>Definition 2</verbal-definition></definition>
286
+ </term>
287
+ </terms>
288
+ </sections>
289
+ </iso-standard>
290
+ INPUT
291
+ output = <<~OUTPUT
292
+ <?xml version='1.0'?>
293
+ <iso-standard xmlns='http://riboseinc.com/isoxml' type='presentation'>
294
+ <sections>
295
+ <terms id='A' obligation='normative' displayorder='1'>
296
+ <title depth='1'>1<tab/>Terms and definitions</title>
297
+ <term id='second'>
298
+ <name>1.1</name>
299
+ <preferred><strong>Second Term</strong>, &#x3c;Field, Usage Info 1&#x3e;</preferred>
300
+ <definition>Definition 1</definition>
301
+ </term>
302
+ <term id='C'>
303
+ <name>1.2</name>
304
+ <preferred language='fr' script='Latn' type='prefix'><strong>First Designation</strong></preferred>
305
+ <definition>Definition 2</definition>
306
+ </term>
307
+ </terms>
308
+ </sections>
309
+ </iso-standard>
310
+ OUTPUT
311
+ expect(xmlpp(IsoDoc::Iso::PresentationXMLConvert.new({})
312
+ .convert("test", input, true))).to be_equivalent_to xmlpp(output)
313
+ end
252
314
  end