metanorma-standoc 1.7.3 → 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/asciidoctor/standoc/base.rb +31 -44
  3. data/lib/asciidoctor/standoc/basicdoc.rng +5 -3
  4. data/lib/asciidoctor/standoc/blocks.rb +7 -7
  5. data/lib/asciidoctor/standoc/blocks_notes.rb +2 -2
  6. data/lib/asciidoctor/standoc/cleanup.rb +5 -6
  7. data/lib/asciidoctor/standoc/cleanup_block.rb +3 -3
  8. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +56 -0
  9. data/lib/asciidoctor/standoc/cleanup_inline.rb +22 -26
  10. data/lib/asciidoctor/standoc/cleanup_ref.rb +0 -85
  11. data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +94 -0
  12. data/lib/asciidoctor/standoc/converter.rb +0 -1
  13. data/lib/asciidoctor/standoc/front.rb +2 -2
  14. data/lib/asciidoctor/standoc/inline.rb +1 -1
  15. data/lib/asciidoctor/standoc/isodoc.rng +3 -0
  16. data/lib/asciidoctor/standoc/lists.rb +2 -2
  17. data/lib/asciidoctor/standoc/macros_plantuml.rb +1 -1
  18. data/lib/asciidoctor/standoc/ref_sect.rb +2 -2
  19. data/lib/asciidoctor/standoc/reqt.rb +6 -1
  20. data/lib/asciidoctor/standoc/section.rb +3 -80
  21. data/lib/asciidoctor/standoc/table.rb +1 -1
  22. data/lib/asciidoctor/standoc/terms.rb +125 -0
  23. data/lib/asciidoctor/standoc/utils.rb +2 -96
  24. data/lib/metanorma/standoc/version.rb +1 -1
  25. data/metanorma-standoc.gemspec +2 -2
  26. data/spec/asciidoctor-standoc/base_spec.rb +30 -1
  27. data/spec/asciidoctor-standoc/cleanup_spec.rb +111 -2
  28. data/spec/asciidoctor-standoc/isobib_cache_spec.rb +4 -4
  29. data/spec/asciidoctor-standoc/refs_dl_spec.rb +13 -1
  30. data/spec/asciidoctor-standoc/refs_spec.rb +12 -12
  31. data/spec/asciidoctor-standoc/section_spec.rb +5 -3
  32. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +47 -47
  33. data/spec/vcr_cassettes/isobib_get_123.yml +11 -11
  34. data/spec/vcr_cassettes/isobib_get_123_1.yml +26 -26
  35. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +36 -36
  36. data/spec/vcr_cassettes/isobib_get_123_2001.yml +14 -14
  37. data/spec/vcr_cassettes/isobib_get_124.yml +14 -14
  38. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
  39. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +45 -45
  40. metadata +19 -18
  41. data/lib/asciidoctor/standoc/log.rb +0 -59
@@ -5,105 +5,11 @@ require "json"
5
5
  require "pathname"
6
6
  require "open-uri"
7
7
  require "uuidtools"
8
- require "sterile"
9
8
  require "mimemagic"
10
9
 
11
10
  module Asciidoctor
12
11
  module Standoc
13
12
  module Utils
14
- class << self
15
- def anchor_or_uuid(node = nil)
16
- uuid = UUIDTools::UUID.random_create
17
- node.nil? || node.id.nil? || node.id.empty? ? "_" + uuid : node.id
18
- end
19
-
20
- def asciidoc_sub(x)
21
- return nil if x.nil?
22
- return "" if x.empty?
23
- d = Asciidoctor::Document.new(x.lines.entries, { header_footer: false,
24
- backend: :standoc })
25
- b = d.parse.blocks.first
26
- b.apply_subs(b.source)
27
- end
28
-
29
- def localdir(node)
30
- docfile = node.attr("docfile")
31
- docfile.nil? ? './' : Pathname.new(docfile).parent.to_s + '/'
32
- end
33
-
34
- # TODO needs internationalisation
35
- def smartformat(n)
36
- n.gsub(/ --? /, "&#8201;&#8212;&#8201;").
37
- gsub(/\'(\d\d)(?=[^\u2019\'\s<]+[’\'][\p{P}\p{Z}])([\p{P}\p{Z}])/, "\u2018\\1\\2").
38
- gsub(/--/, "&#8212;").smart_format.gsub(/</, "&lt;").gsub(/>/, "&gt;")
39
- end
40
-
41
- def endash_date(elem)
42
- elem.traverse do |n|
43
- n.text? and n.replace(n.text.gsub(/\s+--?\s+/, "&#8211;").gsub(/--/, "&#8211;"))
44
- end
45
- end
46
-
47
- # Set hash value using keys path
48
- # mod from https://stackoverflow.com/a/42425884
49
- def set_nested_value(hash, keys, new_val)
50
- key = keys[0]
51
- if keys.length == 1
52
- hash[key] = hash[key].is_a?(Array) ? (hash[key] << new_val) :
53
- hash[key].nil? ? new_val : [hash[key], new_val]
54
- return hash
55
- end
56
- if hash[key].is_a?(Array)
57
- hash[key][-1] = {} if hash[key][-1].nil?
58
- set_nested_value(hash[key][-1], keys[1..-1], new_val)
59
- elsif hash[key].nil? || hash[key].empty?
60
- hash[key] = {}
61
- set_nested_value(hash[key], keys[1..-1], new_val)
62
- elsif hash[key].is_a?(Hash) && !hash[key][keys[1]]
63
- set_nested_value(hash[key], keys[1..-1], new_val)
64
- elsif !hash[key][keys[1]]
65
- hash[key] = [hash[key], {}]
66
- set_nested_value(hash[key][-1], keys[1..-1], new_val)
67
- else
68
- set_nested_value(hash[key], keys[1..-1], new_val)
69
- end
70
- end
71
-
72
- def flatten_rawtext_lines(node, result)
73
- node.lines.each do |x|
74
- if node.respond_to?(:context) && (node.context == :literal ||
75
- node.context == :listing)
76
- result << x.gsub(/</, "&lt;").gsub(/>/, "&gt;")
77
- else
78
- # strip not only HTML <tag>, and Asciidoc xrefs <<xref>>
79
- result << x.gsub(/<[^>]*>+/, "")
80
- end
81
- end
82
- result
83
- end
84
-
85
- # if node contains blocks, flatten them into a single line;
86
- # and extract only raw text
87
- def flatten_rawtext(node)
88
- result = []
89
- if node.respond_to?(:blocks) && node.blocks?
90
- node.blocks.each { |b| result << flatten_rawtext(b) }
91
- elsif node.respond_to?(:lines)
92
- result = flatten_rawtext_lines(node, result)
93
- elsif node.respond_to?(:text)
94
- result << node.text.gsub(/<[^>]*>+/, "")
95
- else
96
- result << node.content.gsub(/<[^>]*>+/, "")
97
- end
98
- result.reject(&:empty?)
99
- end
100
-
101
- def reqt_subpart(x)
102
- %w(specification measurement-target verification import label
103
- subject inherit classification title).include? x
104
- end
105
- end
106
-
107
13
  def convert(node, transform = nil, opts = {})
108
14
  transform ||= node.node_name
109
15
  opts.empty? ? (send transform, node) : (send transform, node, opts)
@@ -177,14 +83,14 @@ module Asciidoctor
177
83
  SUBCLAUSE_XPATH = "//clause[not(parent::sections)]"\
178
84
  "[not(ancestor::boilerplate)]".freeze
179
85
 
180
- def isodoc(lang, script, i18nyaml = nil)
86
+ def isodoc(lang, script, i18nyaml = nil)
181
87
  conv = html_converter(EmptyAttr.new)
182
88
  i18n = conv.i18n_init(lang, script, i18nyaml)
183
89
  conv.metadata_init(lang, script, i18n)
184
90
  conv
185
91
  end
186
92
 
187
- class EmptyAttr
93
+ class EmptyAttr
188
94
  def attr(_x)
189
95
  nil
190
96
  end
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "1.7.3".freeze
22
+ VERSION= "1.8.1".freeze
23
23
  end
24
24
  end
@@ -28,16 +28,16 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.add_dependency "asciidoctor", "~> 2.0.0"
30
30
  spec.add_dependency "ruby-jing"
31
- spec.add_dependency "isodoc", "~> 1.4.2"
31
+ spec.add_dependency "isodoc", "~> 1.5.0"
32
32
  spec.add_dependency "iev", "~> 0.2.1"
33
33
  spec.add_dependency "metanorma-plugin-datastruct"
34
34
  spec.add_dependency "metanorma-plugin-lutaml", "~> 0.2.1"
35
35
  # relaton-cli not just relaton, to avoid circular reference in metanorma
36
36
  spec.add_dependency "relaton-cli", "~> 1.7.0"
37
37
  spec.add_dependency "relaton-iev", "~> 1.1.0"
38
- spec.add_dependency "sterile", "~> 1.0.14"
39
38
  spec.add_dependency "concurrent-ruby"
40
39
  spec.add_dependency "unicode2latex", "~> 0.0.1"
40
+ spec.add_dependency "metanorma-utils", "~> 1"
41
41
  spec.add_dependency "mimemagic"
42
42
  spec.add_dependency "mathml2asciimath"
43
43
  spec.add_dependency "latexmath"
@@ -32,7 +32,36 @@ RSpec.describe Asciidoctor::Standoc do
32
32
  expect(File.exist?("htmlstyle.css")).to be false
33
33
  end
34
34
 
35
- it "processes publisher abbreviations" do
35
+ it "assigns default scripts to major languages" do
36
+ FileUtils.rm_f "test.doc"
37
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
38
+ = Document title
39
+ Author
40
+ :docfile: test.adoc
41
+ :novalid:
42
+ :language: ar
43
+ INPUT
44
+ <standard-document xmlns='https://www.metanorma.org/ns/standoc' type='semantic' version='#{Metanorma::Standoc::VERSION}'>
45
+ <bibdata type='standard'>
46
+ <title language='en' format='text/plain'>Document title</title>
47
+ <language>ar</language>
48
+ <script>Arab</script>
49
+ <status>
50
+ <stage>published</stage>
51
+ </status>
52
+ <copyright>
53
+ <from>2021</from>
54
+ </copyright>
55
+ <ext>
56
+ <doctype>article</doctype>
57
+ </ext>
58
+ </bibdata>
59
+ <sections> </sections>
60
+ </standard-document>
61
+ OUTPUT
62
+ end
63
+
64
+ it "processes publisher abbreviations" do
36
65
  mock_org_abbrevs
37
66
  expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true))).to be_equivalent_to xmlpp(<<~"OUTPUT")
38
67
  = Document title
@@ -1867,6 +1867,8 @@ input = <<~INPUT
1867
1867
  <<1:>>
1868
1868
  <<1#b>>
1869
1869
  <<:a#b:>>
1870
+ <</%ab>>
1871
+ <<1!>>
1870
1872
 
1871
1873
  INPUT
1872
1874
  expect(xmlpp(Asciidoctor.convert(input, backend: :standoc, header_footer: true).gsub(/<p id="_[^"]+">/, "").gsub('</p>', ""))).to be_equivalent_to (<<~"OUTPUT")
@@ -1888,18 +1890,27 @@ expect(xmlpp(Asciidoctor.convert(input, backend: :standoc, header_footer: true).
1888
1890
  <sections>
1889
1891
  <clause id='a_b' inline-header='false' obligation='normative'>
1890
1892
  <title>A</title>
1891
- <xref target='__ab'/>
1893
+ <eref bibitemid='__ab' citeas=''/>
1892
1894
  <xref target='_'/>
1893
1895
  <xref target='_1'/>
1894
1896
  <xref target='_1_'/>
1895
1897
  <xref target='1#b'/>
1896
1898
  <xref target='_a#b_'/>
1899
+ <xref target='_%ab'/>
1900
+ <xref target='_1_'/>
1897
1901
  </clause>
1898
1902
  </sections>
1903
+ <bibliography>
1904
+ <references hidden='true' normative='false'>
1905
+ <bibitem id='__ab' type='internal'>
1906
+ <docidentifier type='repository'>//ab</docidentifier>
1907
+ </bibitem>
1908
+ </references>
1909
+ </bibliography>
1899
1910
  </standard-document>
1900
1911
  OUTPUT
1901
1912
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <clause id="a_b" inline-header="false" obligation="normative"/> from a:b}).to_stderr
1902
- expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="__ab"/> from /:ab}).to_stderr
1913
+ expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <eref bibitemid="__ab" citeas=""/> from /_ab}).to_stderr
1903
1914
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_"/> from :}).to_stderr
1904
1915
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_1"/> from 1}).to_stderr
1905
1916
  expect{Asciidoctor.convert(input, backend: :standoc, header_footer: true)}.to output(%r{normalised identifier in <xref target="_1_"/> from 1:}).to_stderr
@@ -2109,6 +2120,104 @@ mock_mathml_italicise({ uppergreek: true, upperroman: true, lowergreek: true, lo
2109
2120
 
2110
2121
  end
2111
2122
 
2123
+ it "process express_ref macro with existing bibliography" do
2124
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true, agree_to_terms: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
2125
+ #{ASCIIDOC_BLANK_HDR}
2126
+ == Clause
2127
+
2128
+ <<uml:A:A.B.C,C>>
2129
+ <<uml:A>>
2130
+ <<express-schema:action:action.AA,AA>>
2131
+ <<express-schema:action:action.AB>>
2132
+
2133
+ [[action]]
2134
+ [type="express-schema"]
2135
+ == Action
2136
+
2137
+ [[action.AA]]
2138
+ === AA
2139
+
2140
+ [bibliography]
2141
+ == Bibliography
2142
+ * [[[D,E]]] F
2143
+ INPUT
2144
+ #{BLANK_HDR}
2145
+ <sections>
2146
+ <clause id='_' inline-header='false' obligation='normative'>
2147
+ <title>Clause</title>
2148
+ <p id='_'>
2149
+ <eref bibitemid='uml_A' citeas="">
2150
+ <localityStack>
2151
+ <locality type='anchor'><referenceFrom>A.B.C</referenceFrom></locality>
2152
+ </localityStack>
2153
+ C
2154
+ </eref>
2155
+ <eref bibitemid='uml_A' citeas=""/>
2156
+ <xref target='action.AA'>AA</xref>
2157
+ <xref target='action'>** Missing target action.AB</xref>
2158
+ </p>
2159
+ </clause>
2160
+ <clause id='action' type='express-schema' inline-header='false' obligation='normative'>
2161
+ <title>Action</title>
2162
+ <clause id='action.AA' inline-header='false' obligation='normative'>
2163
+ <title>AA</title>
2164
+ </clause>
2165
+ </clause>
2166
+ </sections>
2167
+ <bibliography>
2168
+ <references id='_' normative='false' obligation='informative'>
2169
+ <title>Bibliography</title>
2170
+ <bibitem id='D'>
2171
+ <formattedref format='application/x-isodoc+xml'>F</formattedref>
2172
+ <docidentifier>E</docidentifier>
2173
+ </bibitem>
2174
+ </references>
2175
+ <references hidden='true' normative='false'>
2176
+ <bibitem id='uml_A' type='internal'>
2177
+ <docidentifier type='repository'>uml/A</docidentifier>
2178
+ </bibitem>
2179
+ </references>
2180
+ </bibliography>
2181
+ </standard-document>
2182
+ OUTPUT
2183
+ end
2184
+
2185
+
2186
+ it "process express_ref macro with no existing bibliography" do
2187
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true, agree_to_terms: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
2188
+ #{ASCIIDOC_BLANK_HDR}
2189
+ == Clause
2190
+
2191
+ <<express-schema:A:A.B.C,C>>
2192
+ <<express-schema:A>>
2193
+ INPUT
2194
+ #{BLANK_HDR}
2195
+ <sections>
2196
+ <clause id='_' inline-header='false' obligation='normative'>
2197
+ <title>Clause</title>
2198
+ <p id='_'>
2199
+ <eref bibitemid='express-schema_A' citeas="">
2200
+ <localityStack>
2201
+ <locality type='anchor'><referenceFrom>A.B.C</referenceFrom></locality>
2202
+ </localityStack>
2203
+ C
2204
+ </eref>
2205
+ <eref bibitemid='express-schema_A' citeas=""/>
2206
+ </p>
2207
+ </clause>
2208
+ </sections>
2209
+ <bibliography>
2210
+ <references hidden='true' normative='false'>
2211
+ <bibitem id='express-schema_A' type='internal'>
2212
+ <docidentifier type='repository'>express-schema/A</docidentifier>
2213
+ </bibitem>
2214
+ </references>
2215
+ </bibliography>
2216
+ </standard-document>
2217
+ OUTPUT
2218
+ end
2219
+
2220
+
2112
2221
  private
2113
2222
 
2114
2223
  def mock_mathml_italicise(x)
@@ -127,7 +127,7 @@ EOS
127
127
  <script>Latn</script>
128
128
  <status>
129
129
  <stage>90</stage>
130
- <substage>93</substage>
130
+ <substage>20</substage>
131
131
  </status>
132
132
  <copyright>
133
133
  <from>2001</from>
@@ -168,7 +168,7 @@ EOS
168
168
  <script>Latn</script>
169
169
  <status>
170
170
  <stage>90</stage>
171
- <substage>93</substage>
171
+ <substage>20</substage>
172
172
  </status>
173
173
  <copyright>
174
174
  <from>2001</from>
@@ -211,7 +211,7 @@ EOS
211
211
  <uri type="obp">https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
212
212
  <uri type="rss">https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
213
213
  <docidentifier type="ISO">ISO 123:2001</docidentifier>
214
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:en</docidentifier>
214
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:en</docidentifier>
215
215
  <docnumber>123</docnumber>
216
216
  <date type="published">
217
217
  <on>2001-05</on>
@@ -236,7 +236,7 @@ EOS
236
236
  </abstract>
237
237
  <status>
238
238
  <stage>90</stage>
239
- <substage>93</substage>
239
+ <substage>20</substage>
240
240
  </status>
241
241
  <copyright>
242
242
  <from>2001</from>
@@ -74,6 +74,11 @@ RSpec.describe Asciidoctor::Standoc do
74
74
  it "processes complex dl reference" do
75
75
  expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :standoc, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
76
76
  #{ASCIIDOC_BLANK_HDR}
77
+
78
+ == Clause
79
+
80
+ <<ISOTC211>>
81
+
77
82
  [bibliography]
78
83
  == Normative References
79
84
 
@@ -288,7 +293,14 @@ formattedref::
288
293
  INPUT
289
294
  #{BLANK_HDR}
290
295
  <sections>
291
- </sections><bibliography><references id="_" obligation="informative" normative="true">
296
+ <clause id='_' inline-header='false' obligation='normative'>
297
+ <title>Clause</title>
298
+ <p id='_'>
299
+ <eref type='inline' bibitemid='ISOTC211' citeas='TC211'/>
300
+ </p>
301
+ </clause>
302
+ </sections>
303
+ <bibliography><references id="_" obligation="informative" normative="true">
292
304
  <title>Normative references</title>
293
305
  #{NORM_REF_BOILERPLATE}
294
306
  <bibitem id="ISOTC211" type="standard">
@@ -264,7 +264,7 @@ RSpec.describe Asciidoctor::Standoc do
264
264
  <script>Latn</script>
265
265
  <status>
266
266
  <stage>90</stage>
267
- <substage>93</substage>
267
+ <substage>20</substage>
268
268
  </status>
269
269
  <copyright>
270
270
  <from>2001</from>
@@ -289,7 +289,7 @@ RSpec.describe Asciidoctor::Standoc do
289
289
  <uri type='obp'>https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
290
290
  <uri type='rss'>https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
291
291
  <docidentifier type='ISO'>ISO 123:2001</docidentifier>
292
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:en</docidentifier>
292
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:en</docidentifier>
293
293
  <docnumber>123</docnumber>
294
294
  <date type='published'>
295
295
  <on>2001-05</on>
@@ -314,7 +314,7 @@ RSpec.describe Asciidoctor::Standoc do
314
314
  </abstract>
315
315
  <status>
316
316
  <stage>90</stage>
317
- <substage>93</substage>
317
+ <substage>20</substage>
318
318
  </status>
319
319
  <copyright>
320
320
  <from>2001</from>
@@ -372,7 +372,7 @@ RSpec.describe Asciidoctor::Standoc do
372
372
  <script>Latn</script>
373
373
  <status>
374
374
  <stage>90</stage>
375
- <substage>93</substage>
375
+ <substage>20</substage>
376
376
  </status>
377
377
  <copyright>
378
378
  <from>2001</from>
@@ -397,7 +397,7 @@ RSpec.describe Asciidoctor::Standoc do
397
397
  <uri type='obp'>https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
398
398
  <uri type='rss'>https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
399
399
  <docidentifier type='ISO'>ISO 123:2001</docidentifier>
400
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:en</docidentifier>
400
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:en</docidentifier>
401
401
  <docnumber>123</docnumber>
402
402
  <date type='published'>
403
403
  <on>2001-05</on>
@@ -422,7 +422,7 @@ RSpec.describe Asciidoctor::Standoc do
422
422
  </abstract>
423
423
  <status>
424
424
  <stage>90</stage>
425
- <substage>93</substage>
425
+ <substage>20</substage>
426
426
  </status>
427
427
  <copyright>
428
428
  <from>2001</from>
@@ -517,7 +517,7 @@ compris les éventuels amendements).
517
517
  <script>Latn</script>
518
518
  <status>
519
519
  <stage>90</stage>
520
- <substage>93</substage>
520
+ <substage>20</substage>
521
521
  </status>
522
522
  <copyright>
523
523
  <from>2001</from>
@@ -542,7 +542,7 @@ compris les éventuels amendements).
542
542
  <uri type='obp'>https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
543
543
  <uri type='rss'>https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
544
544
  <docidentifier type='ISO'>ISO 123:2001</docidentifier>
545
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:fr</docidentifier>
545
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:fr</docidentifier>
546
546
  <docnumber>123</docnumber>
547
547
  <date type='published'>
548
548
  <on>2001-05</on>
@@ -570,7 +570,7 @@ compris les éventuels amendements).
570
570
  </abstract>
571
571
  <status>
572
572
  <stage>90</stage>
573
- <substage>93</substage>
573
+ <substage>20</substage>
574
574
  </status>
575
575
  <copyright>
576
576
  <from>2001</from>
@@ -629,7 +629,7 @@ compris les éventuels amendements).
629
629
  <script>Latn</script>
630
630
  <status>
631
631
  <stage>90</stage>
632
- <substage>93</substage>
632
+ <substage>20</substage>
633
633
  </status>
634
634
  <copyright>
635
635
  <from>2001</from>
@@ -654,7 +654,7 @@ compris les éventuels amendements).
654
654
  <uri type='obp'>https://www.iso.org/obp/ui/#!iso:std:23281:en</uri>
655
655
  <uri type='rss'>https://www.iso.org/contents/data/standard/02/32/23281.detail.rss</uri>
656
656
  <docidentifier type='ISO'>ISO 123:2001</docidentifier>
657
- <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.93:ed-3:fr</docidentifier>
657
+ <docidentifier type='URN'>urn:iso:std:iso:123:stage-90.20:ed-3:fr</docidentifier>
658
658
  <docnumber>123</docnumber>
659
659
  <date type='published'>
660
660
  <on>2001-05</on>
@@ -682,7 +682,7 @@ compris les éventuels amendements).
682
682
  </abstract>
683
683
  <status>
684
684
  <stage>90</stage>
685
- <substage>93</substage>
685
+ <substage>20</substage>
686
686
  </status>
687
687
  <copyright>
688
688
  <from>2001</from>