metanorma-iso 1.3.21 → 1.3.26

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +8 -7
  3. data/.github/workflows/ubuntu.yml +8 -7
  4. data/.github/workflows/windows.yml +8 -8
  5. data/Gemfile +2 -0
  6. data/lib/asciidoctor/iso/base.rb +22 -0
  7. data/lib/asciidoctor/iso/biblio.rng +142 -37
  8. data/lib/asciidoctor/iso/cleanup.rb +19 -2
  9. data/lib/asciidoctor/iso/front.rb +19 -72
  10. data/lib/asciidoctor/iso/front_id.rb +196 -0
  11. data/lib/asciidoctor/iso/isodoc.rng +48 -2
  12. data/lib/asciidoctor/iso/isostandard-amd.rng +98 -0
  13. data/lib/asciidoctor/iso/isostandard.rng +17 -1
  14. data/lib/asciidoctor/iso/macros.rb +21 -0
  15. data/lib/asciidoctor/iso/section.rb +18 -32
  16. data/lib/asciidoctor/iso/term_lookup_cleanup.rb +87 -0
  17. data/lib/asciidoctor/iso/validate.rb +41 -21
  18. data/lib/asciidoctor/iso/validate_requirements.rb +1 -1
  19. data/lib/asciidoctor/iso/validate_section.rb +2 -2
  20. data/lib/asciidoctor/iso/validate_style.rb +7 -6
  21. data/lib/isodoc/iso/base_convert.rb +48 -64
  22. data/lib/isodoc/iso/html/header.html +10 -6
  23. data/lib/isodoc/iso/html/html_iso_titlepage.html +27 -18
  24. data/lib/isodoc/iso/html/isodoc.scss +49 -28
  25. data/lib/isodoc/iso/html/scripts.html +23 -21
  26. data/lib/isodoc/iso/html/style-human.scss +25 -2
  27. data/lib/isodoc/iso/html/style-iso.scss +20 -2
  28. data/lib/isodoc/iso/html/word_iso_titlepage.html +23 -2
  29. data/lib/isodoc/iso/html/wordstyle.scss +80 -39
  30. data/lib/isodoc/iso/html_convert.rb +7 -9
  31. data/lib/isodoc/iso/iso.amendment.xsl +4597 -0
  32. data/lib/isodoc/iso/iso.international-standard.xsl +4597 -0
  33. data/lib/isodoc/iso/metadata.rb +74 -44
  34. data/lib/isodoc/iso/pdf_convert.rb +39 -0
  35. data/lib/isodoc/iso/sections.rb +66 -0
  36. data/lib/isodoc/iso/sts_convert.rb +29 -0
  37. data/lib/metanorma-iso.rb +2 -0
  38. data/lib/metanorma/iso/processor.rb +16 -1
  39. data/lib/metanorma/iso/version.rb +1 -1
  40. data/metanorma-iso.gemspec +4 -1
  41. data/spec/asciidoctor-iso/amd_spec.rb +726 -0
  42. data/spec/asciidoctor-iso/base_spec.rb +43 -21
  43. data/spec/asciidoctor-iso/blocks_spec.rb +21 -9
  44. data/spec/asciidoctor-iso/cleanup_spec.rb +203 -175
  45. data/spec/asciidoctor-iso/inline_spec.rb +2 -1
  46. data/spec/asciidoctor-iso/macros_spec.rb +275 -0
  47. data/spec/asciidoctor-iso/refs_spec.rb +7 -4
  48. data/spec/asciidoctor-iso/section_spec.rb +8 -8
  49. data/spec/assets/iso.xml +64 -1
  50. data/spec/isodoc/amd_spec.rb +606 -0
  51. data/spec/isodoc/i18n_spec.rb +12 -20
  52. data/spec/isodoc/inline_spec.rb +2 -2
  53. data/spec/isodoc/iso_spec.rb +1 -1
  54. data/spec/isodoc/metadata_spec.rb +12 -4
  55. data/spec/isodoc/postproc_spec.rb +20 -119
  56. data/spec/isodoc/ref_spec.rb +5 -5
  57. data/spec/isodoc/section_spec.rb +36 -13
  58. data/spec/isodoc/table_spec.rb +22 -22
  59. data/spec/isodoc/terms_spec.rb +2 -2
  60. data/spec/isodoc/xref_spec.rb +19 -19
  61. data/spec/metanorma/processor_spec.rb +2 -2
  62. data/spec/spec_helper.rb +13 -1
  63. metadata +57 -5
  64. data/asciidoctor-iso.gemspec.old +0 -50
@@ -6,37 +6,25 @@ module IsoDoc
6
6
  def initialize(lang, script, labels)
7
7
  super
8
8
  @metadata = {
9
- tc: "XXXX",
10
- sc: "XXXX",
11
- wg: "XXXX",
12
- editorialgroup: [],
13
- secretariat: "XXXX",
14
- obsoletes: nil,
15
- obsoletes_part: nil
16
- }
17
- end
18
-
19
- STAGE_ABBRS = {
20
- "00": "PWI",
21
- "10": "NWIP",
22
- "20": "WD",
23
- "30": "CD",
24
- "40": "DIS",
25
- "50": "FDIS",
26
- "60": "IS",
27
- "90": "(Review)",
28
- "95": "(Withdrawal)",
29
- }.freeze
30
-
31
- def stage_abbr(stage)
32
- self.class::STAGE_ABBRS[stage.to_sym] || "??"
33
- end
34
-
35
- def status_abbrev(stage, substage, iter, draft)
9
+ tc: "XXXX",
10
+ sc: "XXXX",
11
+ wg: "XXXX",
12
+ editorialgroup: [],
13
+ secretariat: "XXXX",
14
+ obsoletes: nil,
15
+ obsoletes_part: nil
16
+ }
17
+ end
18
+
19
+ def status_abbrev(stage, substage, iter, draft, doctype)
36
20
  return "" unless stage
37
- stage = self.class::STAGE_ABBRS[stage.to_sym] || "??"
38
- stage = "PRF" if stage == "IS" && substage == "00"
39
- stage += iter if iter
21
+ if %w(technical-report technical-specification).include?(doctype)
22
+ stage = "DTS" if stage == "DIS"
23
+ stage = "FDTS" if stage == "FDIS"
24
+ end
25
+ if %w(PWI NWIP WD CD).include?(stage)
26
+ stage += iter if iter
27
+ end
40
28
  stage = "Pre" + stage if draft =~ /^0\./
41
29
  stage
42
30
  end
@@ -48,12 +36,13 @@ module IsoDoc
48
36
  set(:stage, docstatus.text)
49
37
  set(:stage_int, docstatus.text.to_i)
50
38
  set(:unpublished, unpublished(docstatus.text))
51
- set(:statusabbr, status_abbrev(docstatus.text,
39
+ set(:statusabbr, status_abbrev(docstatus["abbreviation"] || "??",
52
40
  isoxml&.at(ns("//bibdata/status/substage"))&.text,
53
41
  isoxml&.at(ns("//bibdata/status/iteration"))&.text,
54
- isoxml&.at(ns("//version/draft"))&.text))
42
+ isoxml&.at(ns("//version/draft"))&.text,
43
+ isoxml&.at(ns("//bibdata/ext/doctype"))&.text))
55
44
  unpublished(docstatus.text) and
56
- set(:stageabbr, stage_abbr(docstatus.text))
45
+ set(:stageabbr, docstatus["abbreviation"])
57
46
  end
58
47
  revdate = isoxml.at(ns("//version/revision-date"))
59
48
  set(:revdate, revdate&.text)
@@ -68,6 +57,10 @@ module IsoDoc
68
57
  set(:docnumber, dn&.text)
69
58
  tcdn = isoxml.xpath(ns("//bibdata/docidentifier[@type = 'iso-tc']"))
70
59
  set(:tc_docnumber, tcdn.map { |n| n.text })
60
+ dn = isoxml.at(ns("//bibdata/docidentifier[@type = 'iso-with-lang']"))
61
+ set(:docnumber_lang, dn&.text)
62
+ dn = isoxml.at(ns("//bibdata/docidentifier[@type = 'iso-reference']"))
63
+ set(:docnumber_reference, dn&.text)
71
64
  end
72
65
 
73
66
  # we don't leave this to i18n.rb, because we have both English and
@@ -79,6 +72,20 @@ module IsoDoc
79
72
  end
80
73
  end
81
74
 
75
+ def amd_label(lang)
76
+ case lang
77
+ when "en" then "AMENDMENT"
78
+ when "fr" then "AMENDMENT"
79
+ end
80
+ end
81
+
82
+ def corr_label(lang)
83
+ case lang
84
+ when "en" then "TECHNICAL CORRIGENDUM"
85
+ when "fr" then "RECTIFICATIF TECHNIQUE"
86
+ end
87
+ end
88
+
82
89
  def part_title(part, partnum, subpartnum, lang)
83
90
  return "" unless part
84
91
  suffix = @c.encode(part.text, :hexadecimal)
@@ -92,6 +99,14 @@ module IsoDoc
92
99
  "#{part_label(lang)} #{partnum}"
93
100
  end
94
101
 
102
+ def amd_prefix(num, lang)
103
+ "#{amd_label(lang)} #{num}"
104
+ end
105
+
106
+ def corr_prefix(num, lang)
107
+ "#{corr_label(lang)} #{num}"
108
+ end
109
+
95
110
  def compose_title(main, intro, part, partnum, subpartnum, lang)
96
111
  main = main.nil? ? "" : @c.encode(main.text, :hexadecimal)
97
112
  intro &&
@@ -103,12 +118,23 @@ module IsoDoc
103
118
  main
104
119
  end
105
120
 
121
+ def title_nums(isoxml)
122
+ [isoxml.at(ns("//bibdata//project-number/@part")),
123
+ isoxml.at(ns("//bibdata//project-number/@subpart")),
124
+ isoxml.at(ns("//bibdata//project-number/@amendment")),
125
+ isoxml.at(ns("//bibdata//project-number/@corrigendum"))]
126
+ end
127
+
128
+ def title_parts(isoxml, lang)
129
+ [isoxml.at(ns("//bibdata//title[@type='title-intro' and @language='#{lang}']")),
130
+ isoxml.at(ns("//bibdata//title[@type='title-main' and @language='#{lang}']")),
131
+ isoxml.at(ns("//bibdata//title[@type='title-part' and @language='#{lang}']")),
132
+ isoxml.at(ns("//bibdata//title[@type='title-amd' and @language='#{lang}']"))]
133
+ end
134
+
106
135
  def title(isoxml, _out)
107
- intro = isoxml.at(ns("//bibdata//title[@type='title-intro' and @language='en']"))
108
- main = isoxml.at(ns("//bibdata//title[@type='title-main' and @language='en']"))
109
- part = isoxml.at(ns("//bibdata//title[@type='title-part' and @language='en']"))
110
- partnumber = isoxml.at(ns("//bibdata//project-number/@part"))
111
- subpartnumber = isoxml.at(ns("//bibdata//project-number/@subpart"))
136
+ intro, main, part, amd = title_parts(isoxml, "en")
137
+ partnumber, subpartnumber, amdnumber, corrnumber = title_nums(isoxml)
112
138
 
113
139
  set(:doctitlemain, @c.encode(main ? main.text : "", :hexadecimal))
114
140
  main = compose_title(main, intro, part, partnumber, subpartnumber, "en")
@@ -116,20 +142,24 @@ module IsoDoc
116
142
  set(:doctitleintro, @c.encode(intro ? intro.text : "", :hexadecimal)) if intro
117
143
  set(:doctitlepartlabel, part_prefix(partnumber, subpartnumber, "en"))
118
144
  set(:doctitlepart, @c.encode(part.text, :hexadecimal)) if part
145
+ set(:doctitleamdlabel, amd_prefix(amdnumber, "en")) if amdnumber
146
+ set(:doctitleamd, @c.encode(amd.text, :hexadecimal)) if amd
147
+ set(:doctitlecorrlabel, corr_prefix(corrnumber, "en")) if corrnumber
119
148
  end
120
149
 
121
150
  def subtitle(isoxml, _out)
122
- intro = isoxml.at(ns("//bibdata//title[@type='title-intro' and @language='fr']"))
123
- main = isoxml.at(ns("//bibdata//title[@type='title-main' and @language='fr']"))
124
- part = isoxml.at(ns("//bibdata//title[@type='title-part' and @language='fr']"))
125
- partnumber = isoxml.at(ns("//bibdata//project-number/@part"))
126
- subpartnumber = isoxml.at(ns("//bibdata//project-number/@subpart"))
151
+ intro, main, part, amd = title_parts(isoxml, "fr")
152
+ partnumber, subpartnumber, amdnumber, corrnumber = title_nums(isoxml)
153
+
127
154
  set(:docsubtitlemain, @c.encode(main ? main.text : "", :hexadecimal))
128
155
  main = compose_title(main, intro, part, partnumber, subpartnumber, "fr")
129
156
  set(:docsubtitle, main)
130
157
  set(:docsubtitleintro, @c.encode(intro ? intro.text : "", :hexadecimal)) if intro
131
158
  set(:docsubtitlepartlabel, part_prefix(partnumber, subpartnumber, "fr"))
132
159
  set(:docsubtitlepart, @c.encode(part.text, :hexadecimal)) if part
160
+ set(:docsubtitleamdlabel, amd_prefix(amdnumber, "fr")) if amdnumber
161
+ set(:docsubtitleamd, @c.encode(amd.text, :hexadecimal)) if amd
162
+ set(:docsubtitlecorrlabel, corr_prefix(corrnumber, "fr")) if corrnumber
133
163
  end
134
164
 
135
165
  def author(xml, _out)
@@ -180,7 +210,7 @@ module IsoDoc
180
210
  super
181
211
  ics = []
182
212
  isoxml.xpath(ns("//bibdata/ext/ics/code")).each { |i| ics << i.text }
183
- set(:ics, ics.empty? ? "XXX" : ics.join(", "))
213
+ set(:ics, ics.empty? ? nil : ics.join(", "))
184
214
  end
185
215
  end
186
216
  end
@@ -0,0 +1,39 @@
1
+ require_relative "base_convert"
2
+ require "isodoc"
3
+
4
+ module IsoDoc
5
+ module Iso
6
+
7
+ # A {Converter} implementation that generates HTML output, and a document
8
+ # schema encapsulation of the document for validation
9
+ #
10
+ class PdfConvert < IsoDoc::XslfoPdfConvert
11
+ def initialize(options)
12
+ @libdir = File.dirname(__FILE__)
13
+ super
14
+ end
15
+
16
+ def pdf_stylesheet(docxml)
17
+ case doctype = docxml&.at(ns("//bibdata/ext/doctype"))&.text
18
+ when "amendment", "technical-corrigendum" then "itu.recommendation-annex.xsl"
19
+ else
20
+ "iso.international-standard.xsl"
21
+ end
22
+ end
23
+
24
+ def convert(filename, file = nil, debug = false)
25
+ file = File.read(filename, encoding: "utf-8") if file.nil?
26
+ docxml, outname_html, dir = convert_init(file, filename, debug)
27
+ /\.xml$/.match(filename) or
28
+ filename = Tempfile.open([outname_html, ".xml"], encoding: "utf-8") do |f|
29
+ f.write file
30
+ f.path
31
+ end
32
+ FileUtils.rm_rf dir
33
+ ::Metanorma::Output::XslfoPdf.new.convert(
34
+ filename, outname_html + ".pdf", File.join(@libdir, pdf_stylesheet(docxml)))
35
+ end
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,66 @@
1
+ module IsoDoc
2
+ module Iso
3
+ module BaseConvert
4
+ def middle_title(out)
5
+ middle_title_main(out)
6
+ middle_title_amd(out)
7
+ end
8
+
9
+ def middle_title_main(out)
10
+ out.p(**{ class: "zzSTDTitle1" }) do |p|
11
+ p << @meta.get[:doctitleintro]
12
+ p << " &mdash; " if @meta.get[:doctitleintro] && @meta.get[:doctitlemain]
13
+ p << @meta.get[:doctitlemain]
14
+ p << " &mdash; " if @meta.get[:doctitlemain] && @meta.get[:doctitlepart]
15
+ end
16
+ a = @meta.get[:doctitlepart] and out.p(**{ class: "zzSTDTitle2" }) do |p|
17
+ b = @meta.get[:doctitlepartlabel] and p << "#{b}: "
18
+ p << "<br/><b>#{a}</b>"
19
+ end
20
+ end
21
+
22
+ def middle_title_amd(out)
23
+ a = @meta.get[:doctitleamdlabel] and out.p(**{ class: "zzSTDTitle2" }) do |p|
24
+ p << a
25
+ a = @meta.get[:doctitleamd] and p << ": #{a}"
26
+ end
27
+ a = @meta.get[:doctitlecorrlabel] and out.p(**{ class: "zzSTDTitle2" }) do |p|
28
+ p << a
29
+ end
30
+ end
31
+
32
+ def annex(isoxml, out)
33
+ @amd and @suppressheadingnumbers = @oldsuppressheadingnumbers
34
+ super
35
+ @amd and @suppressheadingnumbers = true
36
+ end
37
+
38
+ def introduction(isoxml, out)
39
+ f = isoxml.at(ns("//introduction")) || return
40
+ num = f.at(ns(".//clause")) ? "0" : nil
41
+ title_attr = { class: "IntroTitle" }
42
+ page_break(out)
43
+ out.div **{ class: "Section3", id: f["id"] } do |div|
44
+ clause_name(num, @introduction_lbl, div, title_attr)
45
+ f.elements.each do |e|
46
+ parse(e, div) unless e.name == "title"
47
+ end
48
+ end
49
+ end
50
+
51
+ def foreword(isoxml, out)
52
+ f = isoxml.at(ns("//foreword")) || return
53
+ page_break(out)
54
+ out.div **attr_code(id: f["id"]) do |s|
55
+ s.h1(**{ class: "ForewordTitle" }) { |h1| h1 << @foreword_lbl }
56
+ f.elements.each { |e| parse(e, s) unless e.name == "title" }
57
+ end
58
+ end
59
+
60
+ def clause_parse_title(node, div, c1, out)
61
+ return inline_header_title(out, node, c1) if c1.nil?
62
+ super
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,29 @@
1
+ require "isodoc"
2
+ require "mn2sts"
3
+
4
+ module IsoDoc
5
+ module Iso
6
+
7
+ # A {Converter} implementation that generates HTML output, and a document
8
+ # schema encapsulation of the document for validation
9
+ #
10
+ class StsConvert < IsoDoc::XslfoPdfConvert
11
+ def initialize(options)
12
+ @libdir = File.dirname(__FILE__)
13
+ end
14
+
15
+ def convert(filename, file = nil, debug = false)
16
+ file = File.read(filename, encoding: "utf-8") if file.nil?
17
+ docxml, outname_html, dir = convert_init(file, filename, debug)
18
+ /\.xml$/.match(filename) or
19
+ filename = Tempfile.open([outname_html, ".xml"], encoding: "utf-8") do |f|
20
+ f.write file
21
+ f.path
22
+ end
23
+ FileUtils.rm_rf dir
24
+ Mn2sts.convert(filename, outname_html + ".sts.xml")
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -3,6 +3,8 @@ require_relative "asciidoctor/iso/converter"
3
3
  require_relative "metanorma/iso/version"
4
4
  require_relative "isodoc/iso/html_convert"
5
5
  require_relative "isodoc/iso/word_convert"
6
+ require_relative "isodoc/iso/pdf_convert"
7
+ require_relative "isodoc/iso/sts_convert"
6
8
  require "asciidoctor/extensions"
7
9
 
8
10
  if defined? Metanorma
@@ -2,6 +2,15 @@ require "metanorma/processor"
2
2
 
3
3
  module Metanorma
4
4
  module Iso
5
+ def self.fonts_used
6
+ {
7
+ html: ["Cambria", "Times New Roman", "Cambria Math", "HanSans", "Courier New"],
8
+ html_alt: ["Cambria", "Times New Roman", "Cambria Math", "HanSans", "Courier New"],
9
+ doc: ["Cambria", "Times New Roman", "Cambria Math", "HanSans", "Courier New"],
10
+ pdf: ["Cambria", "Times New Roman", "Cambria Math", "HanSans", "Courier New"],
11
+ }
12
+ end
13
+
5
14
  class Processor < Metanorma::Processor
6
15
 
7
16
  def initialize
@@ -14,7 +23,9 @@ module Metanorma
14
23
  super.merge(
15
24
  html: "html",
16
25
  html_alt: "alt.html",
17
- doc: "doc"
26
+ doc: "doc",
27
+ pdf: "pdf",
28
+ sts: "sts.xml"
18
29
  )
19
30
  end
20
31
 
@@ -34,6 +45,10 @@ module Metanorma
34
45
  IsoDoc::Iso::HtmlConvert.new(options.merge(alt: true)).convert(outname, isodoc_node)
35
46
  when :doc
36
47
  IsoDoc::Iso::WordConvert.new(options).convert(outname, isodoc_node)
48
+ when :pdf
49
+ IsoDoc::Iso::PdfConvert.new(options).convert(outname, isodoc_node)
50
+ when :sts
51
+ IsoDoc::Iso::StsConvert.new(options).convert(outname, isodoc_node)
37
52
  else
38
53
  super
39
54
  end
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module ISO
3
- VERSION = "1.3.21".freeze
3
+ VERSION = "1.3.26".freeze
4
4
  end
5
5
  end
@@ -31,7 +31,10 @@ Gem::Specification.new do |spec|
31
31
 
32
32
  spec.add_dependency "ruby-jing"
33
33
  spec.add_dependency "isodoc", "~> 1.0.0"
34
- spec.add_dependency "metanorma-standoc", "~> 1.3.0"
34
+ spec.add_dependency "metanorma-standoc", "~> 1.4.0"
35
+ spec.add_dependency "tokenizer", "~> 0.3.0"
36
+ spec.add_dependency "twitter_cldr"
37
+ spec.add_dependency "mn2sts", "~> 1.2.0"
35
38
 
36
39
  spec.add_development_dependency "byebug"
37
40
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
@@ -0,0 +1,726 @@
1
+ require "spec_helper"
2
+ require "fileutils"
3
+
4
+ RSpec.describe Asciidoctor::ISO do
5
+ it "validates amendment document against distinct ISO XML schema" do
6
+ FileUtils.rm_f "test.err"
7
+ Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)
8
+ = Document title
9
+ Author
10
+ :docfile: test.adoc
11
+ :nodoc:
12
+ :no-isobib:
13
+ :doctype: amendment
14
+
15
+ [change=mid-air]
16
+ == Para
17
+ INPUT
18
+ expect(File.read("test.err")).to include 'value of attribute "change" is invalid; must be equal to'
19
+ end
20
+
21
+ it "processes amendment sections" do
22
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
23
+ #{AMD_BLANK_HDR}
24
+ == Foreword
25
+
26
+ Text
27
+
28
+ == Introduction
29
+
30
+ === Introduction Subsection
31
+
32
+ == Scope
33
+
34
+ Text
35
+
36
+ == Acknowledgements
37
+
38
+ == Normative References
39
+
40
+ == Terms and Definitions
41
+
42
+ === Term1
43
+
44
+ == Terms, Definitions, Symbols and Abbreviated Terms
45
+
46
+ === Normal Terms
47
+
48
+ ==== Term2
49
+
50
+ === Symbols and Abbreviated Terms
51
+
52
+ == Symbols and Abbreviated Terms
53
+
54
+ == Clause 4
55
+
56
+ === Introduction
57
+
58
+ === Clause 4.2
59
+
60
+ == Terms and Definitions
61
+
62
+ [appendix]
63
+ == Annex
64
+
65
+ === Annex A.1
66
+
67
+ [%appendix]
68
+ === Appendix 1
69
+
70
+ == Bibliography
71
+
72
+ === Bibliography Subsection
73
+ INPUT
74
+ #{BLANK_HDR.sub(%r{<doctype>article</doctype>}, "<doctype>amendment</doctype>")}
75
+ <sections>
76
+ <clause id='_' obligation='normative'>
77
+ <title>Foreword</title>
78
+ <p id='_'>Text</p>
79
+ </clause>
80
+ <clause id='_' obligation='normative'>
81
+ <title>Introduction</title>
82
+ <clause id='_' obligation='normative'>
83
+ <title>Introduction Subsection</title>
84
+ </clause>
85
+ </clause>
86
+ <clause id='_' obligation='normative'>
87
+ <title>Scope</title>
88
+ <p id='_'>Text</p>
89
+ </clause>
90
+ <clause id='_' obligation='normative'>
91
+ <title>Acknowledgements</title>
92
+ </clause>
93
+ <clause id='_' obligation='normative'>
94
+ <title>Normative References</title>
95
+ </clause>
96
+ <clause id='_' obligation='normative'>
97
+ <title>Terms and Definitions</title>
98
+ <clause id='_' obligation='normative'>
99
+ <title>Term1</title>
100
+ </clause>
101
+ </clause>
102
+ <clause id='_' obligation='normative'>
103
+ <title>Terms, Definitions, Symbols and Abbreviated Terms</title>
104
+ <clause id='_' obligation='normative'>
105
+ <title>Normal Terms</title>
106
+ <clause id='_' obligation='normative'>
107
+ <title>Term2</title>
108
+ </clause>
109
+ </clause>
110
+ <clause id='_' obligation='normative'>
111
+ <title>Symbols and Abbreviated Terms</title>
112
+ </clause>
113
+ </clause>
114
+ <clause id='_' obligation='normative'>
115
+ <title>Symbols and Abbreviated Terms</title>
116
+ </clause>
117
+ <clause id='_' obligation='normative'>
118
+ <title>Clause 4</title>
119
+ <clause id='_' obligation='normative'>
120
+ <title>Introduction</title>
121
+ </clause>
122
+ <clause id='_' obligation='normative'>
123
+ <title>Clause 4.2</title>
124
+ </clause>
125
+ </clause>
126
+ <clause id='_' obligation='normative'>
127
+ <title>Terms and Definitions</title>
128
+ </clause>
129
+ <clause id='_' obligation='normative'>
130
+ <title>Bibliography</title>
131
+ <clause id='_' obligation='normative'>
132
+ <title>Bibliography Subsection</title>
133
+ </clause>
134
+ </clause>
135
+ </sections>
136
+ <annex id='_' obligation='normative'>
137
+ <title>Annex</title>
138
+ <clause id='_' obligation='normative'>
139
+ <title>Annex A.1</title>
140
+ </clause>
141
+ <appendix id='_' obligation='normative'>
142
+ <title>Appendix 1</title>
143
+ </appendix>
144
+ </annex>
145
+ </iso-standard>
146
+
147
+ OUTPUT
148
+ end
149
+
150
+ it "processes section attributes" do
151
+ expect(xmlpp(strip_guid(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true)))).to be_equivalent_to xmlpp(<<~"OUTPUT")
152
+ #{AMD_BLANK_HDR}
153
+ [change=delete,locality="clause=introduction,paragraph=4-7",inline-header="true"]
154
+ == Clause 1
155
+
156
+ INPUT
157
+ #{BLANK_HDR.sub(%r{<doctype>article</doctype>}, "<doctype>amendment</doctype>")}
158
+ <sections><clause id="_" obligation="normative" change="delete" locality="clause=introduction,paragraph=4-7">
159
+ <title>Clause 1</title>
160
+ </clause>
161
+ </sections>
162
+ </iso-standard>
163
+ OUTPUT
164
+ end
165
+
166
+ it "processes default metadata, amendment" do
167
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true).sub(%r{<boilerplate>.*</boilerplate>}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
168
+ = Document title
169
+ Author
170
+ :docfile: test.adoc
171
+ :nodoc:
172
+ :novalid:
173
+ :no-isobib:
174
+ :docnumber: 17301
175
+ :partnumber: 1
176
+ :edition: 2
177
+ :revdate: 2000-01-01
178
+ :draft: 0.3.4
179
+ :technical-committee: TC
180
+ :technical-committee-number: 1
181
+ :technical-committee-type: A
182
+ :subcommittee: SC
183
+ :subcommittee-number: 2
184
+ :subcommittee-type: B
185
+ :workgroup: WG
186
+ :workgroup-number: 3
187
+ :workgroup-type: C
188
+ :technical-committee_2: TC1
189
+ :technical-committee-number_2: 11
190
+ :technical-committee-type_2: A1
191
+ :subcommittee_2: SC1
192
+ :subcommittee-number_2: 21
193
+ :subcommittee-type_2: B1
194
+ :workgroup_2: WG1
195
+ :workgroup-number_2: 31
196
+ :workgroup-type_2: C1
197
+ :secretariat: SECRETARIAT
198
+ :docstage: 10
199
+ :docsubstage: 20
200
+ :iteration: 3
201
+ :language: en
202
+ :title-intro-en: Introduction
203
+ :title-main-en: Main Title -- Title
204
+ :title-part-en: Title Part
205
+ :title-intro-fr: Introduction Française
206
+ :title-main-fr: Titre Principal
207
+ :title-part-fr: Part du Titre
208
+ :library-ics: 1,2,3
209
+ :copyright-year: 2017
210
+ :updates: ISO 17301-1:2016
211
+ :created-date: 2016-05-01
212
+ :amendment-number: 1
213
+ :title-amendment-en: Mass fraction of extraneous matter, milled rice (nonglutinous), sample dividers and recommendations relating to storage and transport conditions
214
+ :title-amendment-fr: Fraction massique de matière étrangère, riz usiné (non gluant), diviseurs d’échantillon et recommandations relatives aux conditions d’entreposage et de transport
215
+ :doctype: amendment
216
+ :updates-document-type: international-standard
217
+ INPUT
218
+ <iso-standard xmlns='https://www.metanorma.org/ns/iso'>
219
+ <bibdata type='standard'>
220
+ <title language='en' format='text/plain' type='main'>Introduction — Main Title — Title — Title Part — Mass fraction of
221
+ extraneous matter, milled rice (nonglutinous), sample dividers and
222
+ recommendations relating to storage and transport conditions</title>
223
+ <title language='en' format='text/plain' type='title-intro'>Introduction</title>
224
+ <title language='en' format='text/plain' type='title-main'>Main Title — Title</title>
225
+ <title language='en' format='text/plain' type='title-part'>Title Part</title>
226
+ <title language='en' format='text/plain' type='title-amd'>
227
+ Mass fraction of extraneous matter, milled rice (nonglutinous), sample
228
+ dividers and recommendations relating to storage and transport conditions
229
+ </title>
230
+ <title language='fr' format='text/plain' type='main'>
231
+ Introduction Française — Titre Principal — Part du Titre — Fraction
232
+ massique de matière étrangère, riz usiné (non gluant), diviseurs
233
+ d’échantillon et recommandations relatives aux conditions d’entreposage et
234
+ de transport
235
+ </title>
236
+ <title language='fr' format='text/plain' type='title-intro'>Introduction Française</title>
237
+ <title language='fr' format='text/plain' type='title-main'>Titre Principal</title>
238
+ <title language='fr' format='text/plain' type='title-part'>Part du Titre</title>
239
+ <title language='fr' format='text/plain' type='title-amd'>
240
+ Fraction massique de matière étrangère, riz usiné (non gluant), diviseurs
241
+ d’échantillon et recommandations relatives aux conditions d’entreposage et
242
+ de transport
243
+ </title>
244
+ <docidentifier type='iso'>ISO 17301-1:2016/PreNP Amd 1</docidentifier>
245
+ <docidentifier type='iso-with-lang'>ISO 17301-1:2016/PreNP Amd 1(E)</docidentifier>
246
+ <docidentifier type='iso-reference'>ISO 17301-1:2016/PreNP Amd 1:2017(E)</docidentifier>
247
+ <docnumber>17301</docnumber>
248
+ <date type='created'>
249
+ <on>2016-05-01</on>
250
+ </date>
251
+ <contributor>
252
+ <role type='author'/>
253
+ <organization>
254
+ <name>International Organization for Standardization</name>
255
+ <abbreviation>ISO</abbreviation>
256
+ </organization>
257
+ </contributor>
258
+ <contributor>
259
+ <role type='publisher'/>
260
+ <organization>
261
+ <name>International Organization for Standardization</name>
262
+ <abbreviation>ISO</abbreviation>
263
+ </organization>
264
+ </contributor>
265
+ <edition>2</edition>
266
+ <version>
267
+ <revision-date>2000-01-01</revision-date>
268
+ <draft>0.3.4</draft>
269
+ </version>
270
+ <language>en</language>
271
+ <script>Latn</script>
272
+ <status>
273
+ <stage abbreviation='NP'>10</stage>
274
+ <substage>20</substage>
275
+ <iteration>3</iteration>
276
+ </status>
277
+ <copyright>
278
+ <from>2017</from>
279
+ <owner>
280
+ <organization>
281
+ <name>International Organization for Standardization</name>
282
+ <abbreviation>ISO</abbreviation>
283
+ </organization>
284
+ </owner>
285
+ </copyright>
286
+ <ext>
287
+ <doctype>amendment</doctype>
288
+ <editorialgroup>
289
+ <technical-committee number='1' type='A'>TC</technical-committee>
290
+ <technical-committee number='11' type='A1'>TC1</technical-committee>
291
+ <subcommittee number='2' type='B'>SC</subcommittee>
292
+ <subcommittee number='21' type='B1'>SC1</subcommittee>
293
+ <workgroup number='3' type='C'>WG</workgroup>
294
+ <workgroup number='31' type='C1'>WG1</workgroup>
295
+ <secretariat>SECRETARIAT</secretariat>
296
+ </editorialgroup>
297
+ <ics>
298
+ <code>1</code>
299
+ </ics>
300
+ <ics>
301
+ <code>2</code>
302
+ </ics>
303
+ <ics>
304
+ <code>3</code>
305
+ </ics>
306
+ <structuredidentifier>
307
+ <project-number part='1' amendment='1' origyr='2016-05-01'>17301</project-number>
308
+ </structuredidentifier>
309
+ <stagename>New work item proposal</stagename>
310
+ <updates-document-type>international-standard</updates-document-type>
311
+ </ext>
312
+ </bibdata>
313
+ <sections/>
314
+ </iso-standard>
315
+ OUTPUT
316
+ end
317
+
318
+ it "processes metadata, amendment" do
319
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true).sub(%r{<boilerplate>.*</boilerplate>}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
320
+ = Document title
321
+ Author
322
+ :docfile: test.adoc
323
+ :nodoc:
324
+ :novalid:
325
+ :no-isobib:
326
+ :docnumber: 17301
327
+ :partnumber: 1
328
+ :doctype: amendment
329
+ :docstage: 30
330
+ :updates: ISO 17301-1:2030
331
+ :amendment-number: 1
332
+ INPUT
333
+ <iso-standard xmlns='https://www.metanorma.org/ns/iso'>
334
+ <bibdata type='standard'>
335
+ <docidentifier type='iso'>ISO 17301-1:2030/CD Amd 1</docidentifier>
336
+ <docidentifier type='iso-with-lang'>ISO 17301-1:2030/CD Amd 1(E)</docidentifier>
337
+ <docidentifier type='iso-reference'>ISO 17301-1:2030/CD Amd 1(E)</docidentifier>
338
+ <docnumber>17301</docnumber>
339
+ <contributor>
340
+ <role type='author'/>
341
+ <organization>
342
+ <name>International Organization for Standardization</name>
343
+ <abbreviation>ISO</abbreviation>
344
+ </organization>
345
+ </contributor>
346
+ <contributor>
347
+ <role type='publisher'/>
348
+ <organization>
349
+ <name>International Organization for Standardization</name>
350
+ <abbreviation>ISO</abbreviation>
351
+ </organization>
352
+ </contributor>
353
+ <language>en</language>
354
+ <script>Latn</script>
355
+ <status>
356
+ <stage abbreviation='CD'>30</stage>
357
+ <substage>00</substage>
358
+ </status>
359
+ <copyright>
360
+ <from>2020</from>
361
+ <owner>
362
+ <organization>
363
+ <name>International Organization for Standardization</name>
364
+ <abbreviation>ISO</abbreviation>
365
+ </organization>
366
+ </owner>
367
+ </copyright>
368
+ <ext>
369
+ <doctype>amendment</doctype>
370
+ <editorialgroup>
371
+ <technical-committee/>
372
+ <subcommittee/>
373
+ <workgroup/>
374
+ </editorialgroup>
375
+ <structuredidentifier>
376
+ <project-number part='1' amendment='1'>17301</project-number>
377
+ </structuredidentifier>
378
+ <stagename>Committee draft</stagename>
379
+ </ext>
380
+ </bibdata>
381
+ <sections/>
382
+ </iso-standard>
383
+ OUTPUT
384
+ end
385
+
386
+ it "processes metadata, amendment" do
387
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true).sub(%r{<boilerplate>.*</boilerplate>}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
388
+ = Document title
389
+ Author
390
+ :docfile: test.adoc
391
+ :nodoc:
392
+ :novalid:
393
+ :no-isobib:
394
+ :docnumber: 17301
395
+ :partnumber: 1
396
+ :doctype: amendment
397
+ :docstage: 40
398
+ :updates: ISO 17301-1:2030
399
+ :amendment-number: 1
400
+ INPUT
401
+ <iso-standard xmlns='https://www.metanorma.org/ns/iso'>
402
+ <bibdata type='standard'>
403
+ <docidentifier type='iso'>ISO 17301-1:2030/DAmd 1</docidentifier>
404
+ <docidentifier type='iso-with-lang'>ISO 17301-1:2030/DAmd 1(E)</docidentifier>
405
+ <docidentifier type='iso-reference'>ISO 17301-1:2030/DAmd 1(E)</docidentifier>
406
+ <docnumber>17301</docnumber>
407
+ <contributor>
408
+ <role type='author'/>
409
+ <organization>
410
+ <name>International Organization for Standardization</name>
411
+ <abbreviation>ISO</abbreviation>
412
+ </organization>
413
+ </contributor>
414
+ <contributor>
415
+ <role type='publisher'/>
416
+ <organization>
417
+ <name>International Organization for Standardization</name>
418
+ <abbreviation>ISO</abbreviation>
419
+ </organization>
420
+ </contributor>
421
+ <language>en</language>
422
+ <script>Latn</script>
423
+ <status>
424
+ <stage abbreviation='D'>40</stage>
425
+ <substage>00</substage>
426
+ </status>
427
+ <copyright>
428
+ <from>2020</from>
429
+ <owner>
430
+ <organization>
431
+ <name>International Organization for Standardization</name>
432
+ <abbreviation>ISO</abbreviation>
433
+ </organization>
434
+ </owner>
435
+ </copyright>
436
+ <ext>
437
+ <doctype>amendment</doctype>
438
+ <editorialgroup>
439
+ <technical-committee/>
440
+ <subcommittee/>
441
+ <workgroup/>
442
+ </editorialgroup>
443
+ <structuredidentifier>
444
+ <project-number part='1' amendment='1'>17301</project-number>
445
+ </structuredidentifier>
446
+ <stagename>Draft</stagename>
447
+ </ext>
448
+ </bibdata>
449
+ <sections/>
450
+ </iso-standard>
451
+ OUTPUT
452
+ end
453
+
454
+ it "processes metadata, amendment" do
455
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true).sub(%r{<boilerplate>.*</boilerplate>}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
456
+ = Document title
457
+ Author
458
+ :docfile: test.adoc
459
+ :nodoc:
460
+ :novalid:
461
+ :no-isobib:
462
+ :docnumber: 17301
463
+ :partnumber: 1
464
+ :doctype: amendment
465
+ :updates: ISO 17301-1:2030
466
+ :amendment-number: 1
467
+ INPUT
468
+ <iso-standard xmlns='https://www.metanorma.org/ns/iso'>
469
+ <bibdata type='standard'>
470
+ <docidentifier type='iso'>ISO 17301-1:2030/Amd 1</docidentifier>
471
+ <docidentifier type='iso-with-lang'>ISO 17301-1:2030/Amd 1(E)</docidentifier>
472
+ <docidentifier type='iso-reference'>ISO 17301-1:2030/Amd 1(E)</docidentifier>
473
+ <docnumber>17301</docnumber>
474
+ <contributor>
475
+ <role type='author'/>
476
+ <organization>
477
+ <name>International Organization for Standardization</name>
478
+ <abbreviation>ISO</abbreviation>
479
+ </organization>
480
+ </contributor>
481
+ <contributor>
482
+ <role type='publisher'/>
483
+ <organization>
484
+ <name>International Organization for Standardization</name>
485
+ <abbreviation>ISO</abbreviation>
486
+ </organization>
487
+ </contributor>
488
+ <language>en</language>
489
+ <script>Latn</script>
490
+ <status>
491
+ <stage abbreviation='IS'>60</stage>
492
+ <substage>60</substage>
493
+ </status>
494
+ <copyright>
495
+ <from>2020</from>
496
+ <owner>
497
+ <organization>
498
+ <name>International Organization for Standardization</name>
499
+ <abbreviation>ISO</abbreviation>
500
+ </organization>
501
+ </owner>
502
+ </copyright>
503
+ <ext>
504
+ <doctype>amendment</doctype>
505
+ <editorialgroup>
506
+ <technical-committee/>
507
+ <subcommittee/>
508
+ <workgroup/>
509
+ </editorialgroup>
510
+ <structuredidentifier>
511
+ <project-number part='1' amendment='1'>17301</project-number>
512
+ </structuredidentifier>
513
+ <stagename>International standard</stagename>
514
+ </ext>
515
+ </bibdata>
516
+ <sections/>
517
+ </iso-standard>
518
+ OUTPUT
519
+ end
520
+
521
+ it "processes metadata, corrigendum" do
522
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true).sub(%r{<boilerplate>.*</boilerplate>}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
523
+ = Document title
524
+ Author
525
+ :docfile: test.adoc
526
+ :nodoc:
527
+ :novalid:
528
+ :no-isobib:
529
+ :docnumber: 17301
530
+ :partnumber: 1
531
+ :doctype: technical-corrigendum
532
+ :docstage: 30
533
+ :updates: ISO 17301-1:2030
534
+ :corrigendum-number: 3
535
+ INPUT
536
+ <iso-standard xmlns='https://www.metanorma.org/ns/iso'>
537
+ <bibdata type='standard'>
538
+ <docidentifier type='iso'>ISO 17301-1:2030/CD Cor.3</docidentifier>
539
+ <docidentifier type='iso-with-lang'>ISO 17301-1:2030/CD Cor.3(E)</docidentifier>
540
+ <docidentifier type='iso-reference'>ISO 17301-1:2030/CD Cor.3(E)</docidentifier>
541
+ <docnumber>17301</docnumber>
542
+ <contributor>
543
+ <role type='author'/>
544
+ <organization>
545
+ <name>International Organization for Standardization</name>
546
+ <abbreviation>ISO</abbreviation>
547
+ </organization>
548
+ </contributor>
549
+ <contributor>
550
+ <role type='publisher'/>
551
+ <organization>
552
+ <name>International Organization for Standardization</name>
553
+ <abbreviation>ISO</abbreviation>
554
+ </organization>
555
+ </contributor>
556
+ <language>en</language>
557
+ <script>Latn</script>
558
+ <status>
559
+ <stage abbreviation='CD'>30</stage>
560
+ <substage>00</substage>
561
+ </status>
562
+ <copyright>
563
+ <from>2020</from>
564
+ <owner>
565
+ <organization>
566
+ <name>International Organization for Standardization</name>
567
+ <abbreviation>ISO</abbreviation>
568
+ </organization>
569
+ </owner>
570
+ </copyright>
571
+ <ext>
572
+ <doctype>technical-corrigendum</doctype>
573
+ <editorialgroup>
574
+ <technical-committee/>
575
+ <subcommittee/>
576
+ <workgroup/>
577
+ </editorialgroup>
578
+ <structuredidentifier>
579
+ <project-number part='1' corrigendum='3'>17301</project-number>
580
+ </structuredidentifier>
581
+ <stagename>Committee draft</stagename>
582
+ </ext>
583
+ </bibdata>
584
+ <sections/>
585
+ </iso-standard>
586
+ OUTPUT
587
+ end
588
+
589
+ it "processes metadata, corrigendum" do
590
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true).sub(%r{<boilerplate>.*</boilerplate>}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
591
+ = Document title
592
+ Author
593
+ :docfile: test.adoc
594
+ :nodoc:
595
+ :novalid:
596
+ :no-isobib:
597
+ :docnumber: 17301
598
+ :partnumber: 1
599
+ :doctype: technical-corrigendum
600
+ :docstage: 50
601
+ :updates: ISO 17301-1:2030
602
+ :corrigendum-number: 3
603
+ INPUT
604
+ <iso-standard xmlns='https://www.metanorma.org/ns/iso'>
605
+ <bibdata type='standard'>
606
+ <docidentifier type='iso'>ISO 17301-1:2030/FDCor.3</docidentifier>
607
+ <docidentifier type='iso-with-lang'>ISO 17301-1:2030/FDCor.3(E)</docidentifier>
608
+ <docidentifier type='iso-reference'>ISO 17301-1:2030/FDCor.3(E)</docidentifier>
609
+ <docnumber>17301</docnumber>
610
+ <contributor>
611
+ <role type='author'/>
612
+ <organization>
613
+ <name>International Organization for Standardization</name>
614
+ <abbreviation>ISO</abbreviation>
615
+ </organization>
616
+ </contributor>
617
+ <contributor>
618
+ <role type='publisher'/>
619
+ <organization>
620
+ <name>International Organization for Standardization</name>
621
+ <abbreviation>ISO</abbreviation>
622
+ </organization>
623
+ </contributor>
624
+ <language>en</language>
625
+ <script>Latn</script>
626
+ <status>
627
+ <stage abbreviation='FD'>50</stage>
628
+ <substage>00</substage>
629
+ </status>
630
+ <copyright>
631
+ <from>2020</from>
632
+ <owner>
633
+ <organization>
634
+ <name>International Organization for Standardization</name>
635
+ <abbreviation>ISO</abbreviation>
636
+ </organization>
637
+ </owner>
638
+ </copyright>
639
+ <ext>
640
+ <doctype>technical-corrigendum</doctype>
641
+ <editorialgroup>
642
+ <technical-committee/>
643
+ <subcommittee/>
644
+ <workgroup/>
645
+ </editorialgroup>
646
+ <structuredidentifier>
647
+ <project-number part='1' corrigendum='3'>17301</project-number>
648
+ </structuredidentifier>
649
+ <stagename>Final draft</stagename>
650
+ </ext>
651
+ </bibdata>
652
+ <sections/>
653
+ </iso-standard>
654
+ OUTPUT
655
+ end
656
+
657
+ it "processes metadata, corrigendum" do
658
+ expect(xmlpp(Asciidoctor.convert(<<~"INPUT", backend: :iso, header_footer: true).sub(%r{<boilerplate>.*</boilerplate>}m, ""))).to be_equivalent_to xmlpp(<<~"OUTPUT")
659
+ = Document title
660
+ Author
661
+ :docfile: test.adoc
662
+ :nodoc:
663
+ :novalid:
664
+ :no-isobib:
665
+ :docnumber: 17301
666
+ :partnumber: 1
667
+ :doctype: technical-corrigendum
668
+ :updates: ISO 17301-1:2030
669
+ :corrigendum-number: 3
670
+ INPUT
671
+ <iso-standard xmlns='https://www.metanorma.org/ns/iso'>
672
+ <bibdata type='standard'>
673
+ <docidentifier type='iso'>ISO 17301-1:2030/Cor.3</docidentifier>
674
+ <docidentifier type='iso-with-lang'>ISO 17301-1:2030/Cor.3(E)</docidentifier>
675
+ <docidentifier type='iso-reference'>ISO 17301-1:2030/Cor.3(E)</docidentifier>
676
+ <docnumber>17301</docnumber>
677
+ <contributor>
678
+ <role type='author'/>
679
+ <organization>
680
+ <name>International Organization for Standardization</name>
681
+ <abbreviation>ISO</abbreviation>
682
+ </organization>
683
+ </contributor>
684
+ <contributor>
685
+ <role type='publisher'/>
686
+ <organization>
687
+ <name>International Organization for Standardization</name>
688
+ <abbreviation>ISO</abbreviation>
689
+ </organization>
690
+ </contributor>
691
+ <language>en</language>
692
+ <script>Latn</script>
693
+ <status>
694
+ <stage abbreviation='IS'>60</stage>
695
+ <substage>60</substage>
696
+ </status>
697
+ <copyright>
698
+ <from>2020</from>
699
+ <owner>
700
+ <organization>
701
+ <name>International Organization for Standardization</name>
702
+ <abbreviation>ISO</abbreviation>
703
+ </organization>
704
+ </owner>
705
+ </copyright>
706
+ <ext>
707
+ <doctype>technical-corrigendum</doctype>
708
+ <editorialgroup>
709
+ <technical-committee/>
710
+ <subcommittee/>
711
+ <workgroup/>
712
+ </editorialgroup>
713
+ <structuredidentifier>
714
+ <project-number part='1' corrigendum='3'>17301</project-number>
715
+ </structuredidentifier>
716
+ <stagename>International standard</stagename>
717
+ </ext>
718
+ </bibdata>
719
+ <sections/>
720
+ </iso-standard>
721
+ OUTPUT
722
+ end
723
+
724
+
725
+
726
+ end