metanorma-iso 1.7.2 → 1.8.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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +11 -41
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +7 -1
  5. data/lib/asciidoctor/iso/base.rb +14 -11
  6. data/lib/asciidoctor/iso/biblio.rng +4 -6
  7. data/lib/asciidoctor/iso/cleanup.rb +40 -24
  8. data/lib/asciidoctor/iso/front.rb +29 -17
  9. data/lib/asciidoctor/iso/front_id.rb +81 -60
  10. data/lib/asciidoctor/iso/isodoc.rng +327 -2
  11. data/lib/asciidoctor/iso/isostandard.rng +12 -97
  12. data/lib/asciidoctor/iso/section.rb +2 -1
  13. data/lib/asciidoctor/iso/validate.rb +22 -109
  14. data/lib/asciidoctor/iso/validate_image.rb +97 -0
  15. data/lib/asciidoctor/iso/validate_requirements.rb +26 -20
  16. data/lib/asciidoctor/iso/validate_section.rb +39 -20
  17. data/lib/asciidoctor/iso/validate_style.rb +36 -24
  18. data/lib/asciidoctor/iso/validate_title.rb +23 -17
  19. data/lib/isodoc/iso/base_convert.rb +19 -2
  20. data/lib/isodoc/iso/html/style-human.css +7 -0
  21. data/lib/isodoc/iso/html/style-iso.css +7 -0
  22. data/lib/isodoc/iso/html_convert.rb +0 -1
  23. data/lib/isodoc/iso/i18n-en.yaml +4 -0
  24. data/lib/isodoc/iso/i18n-fr.yaml +4 -0
  25. data/lib/isodoc/iso/i18n-zh-Hans.yaml +4 -0
  26. data/lib/isodoc/iso/index.rb +140 -0
  27. data/lib/isodoc/iso/iso.amendment.xsl +1157 -208
  28. data/lib/isodoc/iso/iso.international-standard.xsl +1157 -208
  29. data/lib/isodoc/iso/metadata.rb +1 -0
  30. data/lib/isodoc/iso/presentation_xml_convert.rb +45 -37
  31. data/lib/isodoc/iso/sts_convert.rb +10 -13
  32. data/lib/isodoc/iso/word_convert.rb +0 -1
  33. data/lib/isodoc/iso/xref.rb +46 -25
  34. data/lib/metanorma/iso/processor.rb +1 -0
  35. data/lib/metanorma/iso/version.rb +1 -1
  36. data/metanorma-iso.gemspec +8 -8
  37. data/spec/{asciidoctor-iso → asciidoctor}/amd_spec.rb +5 -5
  38. data/spec/asciidoctor/base_spec.rb +825 -0
  39. data/spec/{asciidoctor-iso → asciidoctor}/blocks_spec.rb +0 -0
  40. data/spec/{asciidoctor-iso → asciidoctor}/cleanup_spec.rb +383 -25
  41. data/spec/{asciidoctor-iso → asciidoctor}/inline_spec.rb +0 -0
  42. data/spec/{asciidoctor-iso → asciidoctor}/lists_spec.rb +0 -0
  43. data/spec/{asciidoctor-iso → asciidoctor}/refs_spec.rb +0 -0
  44. data/spec/{asciidoctor-iso → asciidoctor}/section_spec.rb +0 -14
  45. data/spec/{asciidoctor-iso → asciidoctor}/table_spec.rb +0 -0
  46. data/spec/{asciidoctor-iso → asciidoctor}/validate_spec.rb +188 -83
  47. data/spec/isodoc/postproc_spec.rb +481 -438
  48. data/spec/isodoc/section_spec.rb +219 -0
  49. data/spec/spec_helper.rb +2 -0
  50. metadata +65 -64
  51. data/lib/isodoc/iso/html/scripts.html +0 -178
  52. data/spec/asciidoctor-iso/base_spec.rb +0 -704
@@ -16,6 +16,7 @@ module IsoDoc
16
16
 
17
17
  def status_abbrev(stage, substage, iter, draft, doctype)
18
18
  return "" unless stage
19
+
19
20
  if %w(technical-report technical-specification).include?(doctype)
20
21
  stage = "DTS" if stage == "DIS"
21
22
  stage = "FDTS" if stage == "FDIS"
@@ -1,17 +1,10 @@
1
1
  require_relative "init"
2
2
  require "isodoc"
3
+ require_relative "index"
3
4
 
4
5
  module IsoDoc
5
6
  module Iso
6
-
7
- # A {Converter} implementation that generates HTML output, and a document
8
- # schema encapsulation of the document for validation
9
- #
10
7
  class PresentationXMLConvert < IsoDoc::PresentationXMLConvert
11
- def initialize(options)
12
- super
13
- end
14
-
15
8
  def convert1(docxml, filename, dir)
16
9
  if amd(docxml)
17
10
  @oldsuppressheadingnumbers = @suppressheadingnumbers
@@ -33,43 +26,57 @@ module IsoDoc
33
26
  @xrefs = Xref.new(lang, script, klass, labels, options)
34
27
  end
35
28
 
36
- def figure1(f)
37
- return if labelled_ancestor(f) && f.ancestors("figure").empty?
38
- lbl = @xrefs.anchor(f['id'], :label, false) or return
39
- figname = f.parent.name == "figure" ? "" : "#{@i18n.figure} "
40
- connective = f.parent.name == "figure" ? "&nbsp; " : "&nbsp;&mdash; "
41
- prefix_name(f, connective, l10n("#{figname}#{lbl}"), "name")
29
+ def figure1(node)
30
+ return if labelled_ancestor(node) && node.ancestors("figure").empty?
31
+
32
+ lbl = @xrefs.anchor(node["id"], :label, false) or return
33
+ figname = node.parent.name == "figure" ? "" : "#{@i18n.figure} "
34
+ connective = node.parent.name == "figure" ? "&nbsp; " : "&nbsp;&mdash; "
35
+ prefix_name(node, connective, l10n("#{figname}#{lbl}"), "name")
42
36
  end
43
37
 
44
- def example1(f)
45
- n = @xrefs.get[f["id"]]
46
- lbl = (n.nil? || n[:label].nil? || n[:label].empty?) ? @i18n.example :
47
- l10n("#{@i18n.example} #{n[:label]}")
48
- prefix_name(f, "&nbsp;&mdash; ", lbl, "name")
38
+ def example1(node)
39
+ n = @xrefs.get[node["id"]]
40
+ lbl = if n.nil? || n[:label].nil? || n[:label].empty?
41
+ @i18n.example
42
+ else
43
+ l10n("#{@i18n.example} #{n[:label]}")
44
+ end
45
+ prefix_name(node, "&nbsp;&mdash; ", lbl, "name")
49
46
  end
50
47
 
51
- def eref_localities1_zh(target, type, from, to, delim)
48
+ def eref_localities1_zh(target, type, from, to, n, delim)
52
49
  subsection = from&.text&.match(/\./)
53
- ret = (delim == ";") ? ";" : (type == "list") ? "" : delim
50
+ ret = if delim == ";"
51
+ ";"
52
+ else
53
+ type == "list" ? "" : delim
54
+ end
54
55
  ret += " 第#{from.text}" if from
55
56
  ret += "&ndash;#{to.text}" if to
56
- loc = (@i18n.locality[type] || type.sub(/^locality:/, "").capitalize )
57
+ loc = (@i18n.locality[type] || type.sub(/^locality:/, "").capitalize)
57
58
  ret += " #{loc}" unless subsection && type == "clause" ||
58
- type == "list" || target.match(/^IEV$|^IEC 60050-/)
59
+ type == "list" || target.match(/^IEV$|^IEC 60050-/) ||
60
+ n["droploc"] == "true"
59
61
  ret += ")" if type == "list"
60
62
  ret
61
63
  end
62
64
 
63
- def eref_localities1(target, type, from, to, delim, lang = "en")
65
+ def eref_localities1(target, type, from, to, delim, n, lang = "en")
64
66
  return "" if type == "anchor"
67
+
65
68
  subsection = from&.text&.match(/\./)
66
69
  type = type.downcase
67
70
  lang == "zh" and
68
- return l10n(eref_localities1_zh(target, type, from, to, delim))
69
- ret = (delim == ";") ? ";" : (type == "list") ? "" : delim
70
- loc = @i18n.locality[type] || type.sub(/^locality:/, "").capitalize
71
- ret += " #{loc}" unless subsection && type == "clause" ||
72
- type == "list" || target.match(/^IEV$|^IEC 60050-/)
71
+ return l10n(eref_localities1_zh(target, type, from, to, n, delim))
72
+ ret = if delim == ";"
73
+ ";"
74
+ else
75
+ type == "list" ? "" : delim
76
+ end
77
+ ret += eref_locality_populate(type, n) unless subsection &&
78
+ type == "clause" || type == "list" ||
79
+ target.match(/^IEV$|^IEC 60050-/)
73
80
  ret += " #{from.text}" if from
74
81
  ret += "&ndash;#{to.text}" if to
75
82
  ret += ")" if type == "list"
@@ -81,17 +88,18 @@ module IsoDoc
81
88
  l10n(@xrefs.anchor(container, :xref) + delim + linkend)
82
89
  end
83
90
 
84
- def example_span_label(node, div, name)
91
+ def example_span_label(_node, div, name)
85
92
  return if name.nil?
86
- div.span **{ class: "example_label" } do |p|
93
+
94
+ div.span **{ class: "example_label" } do |_p|
87
95
  name.children.each { |n| parse(n, div) }
88
96
  end
89
97
  end
90
98
 
91
- def clause1(f)
92
- if !f.at(ns("./title")) &&
93
- !%w(sections preface bibliography).include?(f.parent.name)
94
- f["inline-header"] = "true"
99
+ def clause1(node)
100
+ if !node.at(ns("./title")) &&
101
+ !%w(sections preface bibliography).include?(node.parent.name)
102
+ node["inline-header"] = "true"
95
103
  end
96
104
  super
97
105
  end
@@ -99,8 +107,8 @@ module IsoDoc
99
107
  def clause(docxml)
100
108
  docxml.xpath(ns("//clause[not(ancestor::annex)] | "\
101
109
  "//terms | //definitions | //references | "\
102
- "//preface/introduction[clause]")).
103
- each do |f|
110
+ "//preface/introduction[clause]"))
111
+ .each do |f|
104
112
  clause1(f)
105
113
  end
106
114
  end
@@ -4,28 +4,25 @@ require "mn2sts"
4
4
  module IsoDoc
5
5
  module Iso
6
6
 
7
- # A {Converter} implementation that generates HTML output, and a document
8
- # schema encapsulation of the document for validation
9
- #
10
7
  class StsConvert < IsoDoc::XslfoPdfConvert
11
- def initialize(options)
8
+ def initialize(_options) # rubocop:disable Lint/MissingSuper
12
9
  @libdir = File.dirname(__FILE__)
13
10
  @format = :sts
14
11
  @suffix = "sts.xml"
15
12
  end
16
13
 
17
- def convert(input_filename, file = nil, debug = false, output_filename = nil)
18
- file = File.read(input_filename, encoding: "utf-8") if file.nil?
19
- docxml, filename, dir = convert_init(file, input_filename, debug)
20
- /\.xml$/.match(input_filename) or
21
- input_filename = Tempfile.open([filename, ".xml"], encoding: "utf-8") do |f|
22
- f.write file
23
- f.path
14
+ def convert(in_fname, file = nil, debug = false, out_fname = nil)
15
+ file = File.read(in_fname, encoding: "utf-8") if file.nil?
16
+ _docxml, filename, dir = convert_init(file, in_fname, debug)
17
+ unless /\.xml$/.match?(in_fname)
18
+ in_fname = Tempfile.open([filename, ".xml"], encoding: "utf-8") do |f|
19
+ f.write file
20
+ f.path
21
+ end
24
22
  end
25
23
  FileUtils.rm_rf dir
26
- Mn2sts.convert(input_filename, output_filename || "#{filename}.#{@suffix}")
24
+ Mn2sts.convert(in_fname, out_fname || "#{filename}.#{@suffix}")
27
25
  end
28
26
  end
29
27
  end
30
28
  end
31
-
@@ -34,7 +34,6 @@ module IsoDoc
34
34
  html_doc_path("style-iso.scss")),
35
35
  htmlcoverpage: html_doc_path("html_iso_titlepage.html"),
36
36
  htmlintropage: html_doc_path("html_iso_intro.html"),
37
- scripts: html_doc_path("scripts.html"),
38
37
  wordstylesheet: html_doc_path("wordstyle.scss"),
39
38
  standardstylesheet: html_doc_path("isodoc.scss"),
40
39
  header: html_doc_path("header.html"),
@@ -4,24 +4,33 @@ module IsoDoc
4
4
  end
5
5
 
6
6
  class Xref < IsoDoc::Xref
7
- def initial_anchor_names(d)
8
- if @klass.amd(d)
9
- d.xpath(ns("//preface/*")).each { |c| c.element? and preface_names(c) }
10
- sequential_asset_names(d.xpath(ns("//preface/*")))
11
- d.xpath(ns("//sections/clause")).each { |c| c.element? and preface_names(c) }
12
- middle_section_asset_names(d)
13
- termnote_anchor_names(d)
14
- termexample_anchor_names(d)
7
+ def initial_anchor_names(doc)
8
+ if @klass.amd(doc)
9
+ initial_anchor_names_amd(doc)
15
10
  else
16
11
  super
17
12
  end
18
- introduction_names(d.at(ns("//introduction")))
13
+ introduction_names(doc.at(ns("//introduction")))
14
+ end
15
+
16
+ def initial_anchor_names_amd(doc)
17
+ doc.xpath(ns("//preface/*")).each do |c|
18
+ c.element? and preface_names(c)
19
+ end
20
+ sequential_asset_names(doc.xpath(ns("//preface/*")))
21
+ doc.xpath(ns("//sections/clause")).each do |c|
22
+ c.element? and preface_names(c)
23
+ end
24
+ middle_section_asset_names(doc)
25
+ termnote_anchor_names(doc)
26
+ termexample_anchor_names(doc)
19
27
  end
20
28
 
21
29
  # we can reference 0-number clauses in introduction
22
30
  def introduction_names(clause)
23
31
  return if clause.nil?
24
- clause.at(ns("./clause")) and @anchors[clause["id"]] =
32
+
33
+ clause.at(ns("./clause")) and @anchors[clause["id"]] =
25
34
  { label: "0", level: 1, xref: clause.at(ns("./title"))&.text, type: "clause" }
26
35
  i = Counter.new
27
36
  clause.xpath(ns("./clause")).each do |c|
@@ -35,17 +44,19 @@ module IsoDoc
35
44
  super
36
45
  end
37
46
 
38
- def appendix_names(clause, num)
47
+ def appendix_names(clause, _num)
39
48
  i = Counter.new
40
49
  clause.xpath(ns("./appendix")).each do |c|
41
50
  i.increment(c)
42
- @anchors[c["id"]] = anchor_struct(i.print, nil, @labels["appendix"], "clause")
51
+ @anchors[c["id"]] = anchor_struct(i.print, nil, @labels["appendix"],
52
+ "clause")
43
53
  @anchors[c["id"]][:level] = 2
44
54
  @anchors[c["id"]][:container] = clause["id"]
45
55
  j = Counter.new
46
56
  c.xpath(ns("./clause | ./references")).each do |c1|
47
57
  j.increment(c1)
48
- appendix_names1(c1, l10n("#{@labels["appendix"]} #{i.print}.#{j.print}"), 3, clause["id"])
58
+ lbl = "#{@labels['appendix']} #{i.print}.#{j.print}"
59
+ appendix_names1(c1, l10n(lbl), 3, clause["id"])
49
60
  end
50
61
  end
51
62
  end
@@ -56,8 +67,8 @@ module IsoDoc
56
67
  # subclauses are not prefixed with "Clause"
57
68
  i = Counter.new
58
69
  clause.xpath(ns("./clause | ./terms | ./term | ./definitions | "\
59
- "./references")).
60
- each do |c|
70
+ "./references"))
71
+ .each do |c|
61
72
  i.increment(c)
62
73
  section_names1(c, "#{num}.#{i.print}", level + 1)
63
74
  end
@@ -73,7 +84,8 @@ module IsoDoc
73
84
  end
74
85
 
75
86
  def appendix_names1(clause, num, level, container)
76
- @anchors[clause["id"]] = { label: num, xref: num, level: level, container: container }
87
+ @anchors[clause["id"]] = { label: num, xref: num, level: level,
88
+ container: container }
77
89
  i = Counter.new
78
90
  clause.xpath(ns("./clause | ./references")).each do |c|
79
91
  i.increment(c)
@@ -85,6 +97,7 @@ module IsoDoc
85
97
  c = IsoDoc::XrefGen::Counter.new
86
98
  clause.xpath(ns(".//formula")).each do |t|
87
99
  next if t["id"].nil? || t["id"].empty?
100
+
88
101
  @anchors[t["id"]] =
89
102
  anchor_struct("#{num}#{hiersep}#{c.increment(t).print}", t,
90
103
  t["inequality"] ? @labels["inequality"] : @labels["formula"],
@@ -95,7 +108,8 @@ module IsoDoc
95
108
  def figure_anchor(t, sublabel, label)
96
109
  @anchors[t["id"]] = anchor_struct(
97
110
  (sublabel ? "#{label} #{sublabel}" : label),
98
- nil, @labels["figure"], "figure", t["unnumbered"])
111
+ nil, @labels["figure"], "figure", t["unnumbered"]
112
+ )
99
113
  sublabel && t["unnumbered"] != "true" and
100
114
  @anchors[t["id"]][:label] = sublabel
101
115
  end
@@ -103,11 +117,12 @@ module IsoDoc
103
117
  def sequential_figure_names(clause)
104
118
  c = IsoDoc::XrefGen::Counter.new
105
119
  j = 0
106
- clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]")).
107
- each do |t|
120
+ clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]"))
121
+ .each do |t|
108
122
  j = subfigure_increment(j, c, t)
109
- sublabel = j.zero? ? nil : "#{(j+96).chr})"
123
+ sublabel = j.zero? ? nil : "#{(j + 96).chr})"
110
124
  next if t["id"].nil? || t["id"].empty?
125
+
111
126
  figure_anchor(t, sublabel, c.print)
112
127
  end
113
128
  end
@@ -115,20 +130,26 @@ module IsoDoc
115
130
  def hierarchical_figure_names(clause, num)
116
131
  c = IsoDoc::XrefGen::Counter.new
117
132
  j = 0
118
- clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]")).
119
- each do |t|
133
+ clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]"))
134
+ .each do |t|
120
135
  j = subfigure_increment(j, c, t)
121
136
  label = "#{num}#{hiersep}#{c.print}"
122
- sublabel = j.zero? ? nil : "#{(j+96).chr})"
137
+ sublabel = j.zero? ? nil : "#{(j + 96).chr})"
123
138
  next if t["id"].nil? || t["id"].empty?
139
+
124
140
  figure_anchor(t, sublabel, label)
125
141
  end
126
142
  end
127
143
 
128
144
  def reference_names(ref)
129
145
  super
130
- @anchors[ref["id"]] = { xref: @anchors[ref["id"]][:xref].
131
- sub(/ \(All Parts\)/i, "") }
146
+ @anchors[ref["id"]] = { xref: @anchors[ref["id"]][:xref]
147
+ .sub(/ \(All Parts\)/i, "") }
148
+ end
149
+
150
+ def back_anchor_names(docxml)
151
+ super
152
+ docxml.xpath(ns("//indexsect")).each { |b| preface_names(b) }
132
153
  end
133
154
  end
134
155
  end
@@ -38,6 +38,7 @@ module Metanorma
38
38
 
39
39
  def use_presentation_xml(ext)
40
40
  return true if ext == :html_alt
41
+
41
42
  super
42
43
  end
43
44
 
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module ISO
3
- VERSION = "1.7.2".freeze
3
+ VERSION = "1.8.2".freeze
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
 
3
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require "metanorma/iso/version"
6
6
 
@@ -29,22 +29,22 @@ 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.4.0")
31
31
 
32
+ spec.add_dependency "isodoc", "~> 1.6.2"
33
+ spec.add_dependency "metanorma-standoc", "~> 1.9.0"
34
+ spec.add_dependency "mn2sts", "~> 1.5.0"
32
35
  spec.add_dependency "ruby-jing"
33
- spec.add_dependency "isodoc", "~> 1.5.0"
34
- spec.add_dependency "metanorma-standoc", "~> 1.8.0"
35
36
  spec.add_dependency "tokenizer", "~> 0.3.0"
36
37
  spec.add_dependency "twitter_cldr"
37
- spec.add_dependency "mn2sts", "~> 1.5.0"
38
38
 
39
39
  spec.add_development_dependency "byebug"
40
- spec.add_development_dependency "sassc", "2.4.0"
41
40
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
42
41
  spec.add_development_dependency "guard", "~> 2.14"
43
42
  spec.add_development_dependency "guard-rspec", "~> 4.7"
44
- spec.add_development_dependency "rake" #, "~> 12.0"
43
+ spec.add_development_dependency "iev", "~> 0.2.0"
44
+ spec.add_development_dependency "rake", "~> 13.0"
45
45
  spec.add_development_dependency "rspec", "~> 3.6"
46
- spec.add_development_dependency "rubocop", "= 0.54.0"
46
+ spec.add_development_dependency "rubocop", "~> 1.5.2"
47
+ spec.add_development_dependency "sassc", "2.4.0"
47
48
  spec.add_development_dependency "simplecov", "~> 0.15"
48
49
  spec.add_development_dependency "timecop", "~> 0.9"
49
- spec.add_development_dependency "iev", "~> 0.2.0"
50
50
  end
@@ -235,7 +235,7 @@ RSpec.describe Asciidoctor::ISO do
235
235
  <language>en</language>
236
236
  <script>Latn</script>
237
237
  <status>
238
- <stage abbreviation="NP">10</stage>
238
+ <stage abbreviation="NP Amd">10</stage>
239
239
  <substage>20</substage>
240
240
  <iteration>3</iteration>
241
241
  </status>
@@ -320,7 +320,7 @@ RSpec.describe Asciidoctor::ISO do
320
320
  <language>en</language>
321
321
  <script>Latn</script>
322
322
  <status>
323
- <stage abbreviation="CD">30</stage>
323
+ <stage abbreviation="CD Amd">30</stage>
324
324
  <substage>00</substage>
325
325
  </status>
326
326
  <copyright>
@@ -389,7 +389,7 @@ RSpec.describe Asciidoctor::ISO do
389
389
  <language>en</language>
390
390
  <script>Latn</script>
391
391
  <status>
392
- <stage abbreviation="D">40</stage>
392
+ <stage abbreviation="DAmd">40</stage>
393
393
  <substage>00</substage>
394
394
  </status>
395
395
  <copyright>
@@ -527,7 +527,7 @@ RSpec.describe Asciidoctor::ISO do
527
527
  <language>en</language>
528
528
  <script>Latn</script>
529
529
  <status>
530
- <stage abbreviation="CD">30</stage>
530
+ <stage abbreviation="CD Cor">30</stage>
531
531
  <substage>00</substage>
532
532
  </status>
533
533
  <copyright>
@@ -596,7 +596,7 @@ RSpec.describe Asciidoctor::ISO do
596
596
  <language>en</language>
597
597
  <script>Latn</script>
598
598
  <status>
599
- <stage abbreviation='FD'>50</stage>
599
+ <stage abbreviation='FDCor'>50</stage>
600
600
  <substage>00</substage>
601
601
  </status>
602
602
  <copyright>
@@ -0,0 +1,825 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe Asciidoctor::ISO do
4
+ it "has a version number" do
5
+ expect(Metanorma::ISO::VERSION).not_to be nil
6
+ end
7
+
8
+ it "processes a blank document" do
9
+ input = <<~INPUT
10
+ #{ASCIIDOC_BLANK_HDR}
11
+ INPUT
12
+ output = <<~OUTPUT
13
+ #{BLANK_HDR}
14
+ <sections/>
15
+ </iso-standard>
16
+ OUTPUT
17
+ expect(xmlpp(Asciidoctor.convert(input, *OPTIONS)))
18
+ .to be_equivalent_to xmlpp(output)
19
+ end
20
+
21
+ it "converts a blank document" do
22
+ input = <<~INPUT
23
+ = Document title
24
+ Author
25
+ :docfile: test.adoc
26
+ :novalid:
27
+ :no-isobib:
28
+ INPUT
29
+ output = <<~OUTPUT
30
+ #{BLANK_HDR}
31
+ <sections/>
32
+ </iso-standard>
33
+ OUTPUT
34
+ expect(xmlpp(Asciidoctor.convert(input, *OPTIONS)))
35
+ .to be_equivalent_to xmlpp(output)
36
+ expect(File.exist?("test_alt.html")).to be true
37
+ expect(File.exist?("test.html")).to be true
38
+ expect(File.exist?("test.doc")).to be true
39
+ expect(File.exist?("test.pdf")).to be true
40
+ expect(File.exist?("htmlstyle.css")).to be false
41
+ end
42
+
43
+ it "converts a blank document in French" do
44
+ input = <<~INPUT
45
+ = Document title
46
+ Author
47
+ :docfile: test.adoc
48
+ :novalid:
49
+ :no-isobib:
50
+ :no-pdf:
51
+ :language: fr
52
+ INPUT
53
+ output = <<~OUTPUT
54
+ #{BLANK_HDR_FR}
55
+ <sections/>
56
+ </iso-standard>
57
+ OUTPUT
58
+ expect(xmlpp(Asciidoctor.convert(input, *OPTIONS)))
59
+ .to be_equivalent_to xmlpp(output)
60
+ end
61
+
62
+ it "processes default metadata" do
63
+ output = Asciidoctor.convert(<<~"INPUT", *OPTIONS)
64
+ = Document title
65
+ Author
66
+ :docfile: test.adoc
67
+ :nodoc:
68
+ :novalid:
69
+ :no-isobib:
70
+ :docnumber: 1000
71
+ :partnumber: 1
72
+ :edition: 2
73
+ :revdate: 2000-01-01
74
+ :draft: 0.3.4
75
+ :technical-committee: TC
76
+ :technical-committee-number: 1
77
+ :technical-committee-type: A
78
+ :subcommittee: SC
79
+ :subcommittee-number: 2
80
+ :subcommittee-type: B
81
+ :workgroup: WG
82
+ :workgroup-number: 3
83
+ :workgroup-type: C
84
+ :technical-committee_2: TC1
85
+ :technical-committee-number_2: 11
86
+ :technical-committee-type_2: A1
87
+ :subcommittee_2: SC1
88
+ :subcommittee-number_2: 21
89
+ :subcommittee-type_2: B1
90
+ :workgroup_2: WG1
91
+ :workgroup-number_2: 31
92
+ :workgroup-type_2: C1
93
+ :secretariat: SECRETARIAT
94
+ :docstage: 20
95
+ :docsubstage: 20
96
+ :iteration: 3
97
+ :language: en
98
+ :title-intro-en: Introduction
99
+ :title-main-en: Main Title -- Title
100
+ :title-part-en: Title Part
101
+ :title-intro-fr: Introduction Française
102
+ :title-main-fr: Titre Principal
103
+ :title-part-fr: Part du Titre
104
+ :library-ics: 1,2,3
105
+ :copyright-year: 2000
106
+ :horizontal: true
107
+ INPUT
108
+ expect(xmlpp(output.sub(%r{<boilerplate>.*</boilerplate>}m, "")))
109
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
110
+ <?xml version="1.0" encoding="UTF-8"?>
111
+ <iso-standard type="semantic" version="#{Metanorma::ISO::VERSION}" xmlns="https://www.metanorma.org/ns/iso">
112
+ <bibdata type="standard">
113
+ <title format="text/plain" language="en" type="main">Introduction — Main Title — Title — Title Part</title>
114
+ <title format="text/plain" language="en" type="title-intro">Introduction</title>
115
+ <title format="text/plain" language="en" type="title-main">Main Title — Title</title>
116
+ <title format="text/plain" language="en" type="title-part">Title Part</title>
117
+ <title format="text/plain" language="fr" type="main">Introduction Française — Titre Principal — Part du Titre</title>
118
+ <title format="text/plain" language="fr" type="title-intro">Introduction Française</title>
119
+ <title format="text/plain" language="fr" type="title-main">Titre Principal</title>
120
+ <title format="text/plain" language="fr" type="title-part">Part du Titre</title>
121
+ <docidentifier type="ISO">ISO/PreWD3 1000-1</docidentifier>
122
+ <docidentifier type="iso-with-lang">ISO/PreWD3 1000-1(E)</docidentifier>
123
+ <docidentifier type="iso-reference">ISO/PreWD3 1000-1:2000(E)</docidentifier>
124
+ <docnumber>1000</docnumber>
125
+ <contributor>
126
+ <role type="author"/>
127
+ <organization>
128
+ <name>International Organization for Standardization</name>
129
+ <abbreviation>ISO</abbreviation>
130
+ </organization>
131
+ </contributor>
132
+ <contributor>
133
+ <role type="publisher"/>
134
+ <organization>
135
+ <name>International Organization for Standardization</name>
136
+ <abbreviation>ISO</abbreviation>
137
+ </organization>
138
+ </contributor>
139
+ <edition>2</edition>
140
+ <version>
141
+ <revision-date>2000-01-01</revision-date>
142
+ <draft>0.3.4</draft>
143
+ </version>
144
+ <language>en</language>
145
+ <script>Latn</script>
146
+ <status>
147
+ <stage abbreviation="WD">20</stage>
148
+ <substage>20</substage>
149
+ <iteration>3</iteration>
150
+ </status>
151
+ <copyright>
152
+ <from>2000</from>
153
+ <owner>
154
+ <organization>
155
+ <name>International Organization for Standardization</name>
156
+ <abbreviation>ISO</abbreviation>
157
+ </organization>
158
+ </owner>
159
+ </copyright>
160
+ <ext>
161
+ <doctype>article</doctype>
162
+ <horizontal>true</horizontal>
163
+ <editorialgroup>
164
+ <technical-committee number="1" type="A">TC</technical-committee>
165
+ <technical-committee number="11" type="A1">TC1</technical-committee>
166
+ <subcommittee number="2" type="B">SC</subcommittee>
167
+ <subcommittee number="21" type="B1">SC1</subcommittee>
168
+ <workgroup number="3" type="C">WG</workgroup>
169
+ <workgroup number="31" type="C1">WG1</workgroup>
170
+ <secretariat>SECRETARIAT</secretariat>
171
+ </editorialgroup>
172
+ <ics>
173
+ <code>1</code>
174
+ </ics>
175
+ <ics>
176
+ <code>2</code>
177
+ </ics>
178
+ <ics>
179
+ <code>3</code>
180
+ </ics>
181
+ <structuredidentifier>
182
+ <project-number part="1">ISO 1000</project-number>
183
+ </structuredidentifier>
184
+ <stagename>Third working draft</stagename>
185
+ </ext>
186
+ </bibdata>
187
+ <sections/>
188
+ </iso-standard>
189
+ OUTPUT
190
+ end
191
+
192
+ it "processes complex metadata" do
193
+ output = Asciidoctor.convert(<<~"INPUT", *OPTIONS)
194
+ = Document title
195
+ Author
196
+ :docfile: test.adoc
197
+ :nodoc:
198
+ :novalid:
199
+ :no-isobib:
200
+ :docnumber: 1000
201
+ :partnumber: 1-1
202
+ :tc-docnumber: 2000, 2003
203
+ :language: el
204
+ :script: Grek
205
+ :publisher: IEC;IETF;ISO
206
+ :copyright-holder: ISO;IETF
207
+ :copyright-year: 2001
208
+ :doctype: technical-report
209
+ :pub-address: 1 Infinity Loop + \
210
+ California
211
+ :pub-phone: 3333333
212
+ :pub-fax: 4444444
213
+ :pub-email: x@example.com
214
+ :pub-uri: http://www.example.com
215
+ INPUT
216
+ expect(xmlpp(output.sub(%r{<boilerplate>.*</boilerplate>}m, "")))
217
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
218
+ <?xml version="1.0" encoding="UTF-8"?>
219
+ <iso-standard type="semantic" version="#{Metanorma::ISO::VERSION}" xmlns="https://www.metanorma.org/ns/iso">
220
+ <bibdata type="standard">
221
+ <docidentifier type="ISO">ISO/IEC/IETF/TR 1000-1-1:2001</docidentifier>
222
+ <docidentifier type="iso-with-lang">ISO/IEC/IETF/TR 1000-1-1:2001(X)</docidentifier>
223
+ <docidentifier type="iso-reference">ISO/IEC/IETF/TR 1000-1-1:2001(X)</docidentifier>
224
+ <docidentifier type="iso-tc">2000</docidentifier>
225
+ <docidentifier type="iso-tc">2003</docidentifier>
226
+ <docnumber>1000</docnumber>
227
+ <contributor>
228
+ <role type="author"/>
229
+ <organization>
230
+ <name>International Electrotechnical Commission</name>
231
+ <abbreviation>IEC</abbreviation>
232
+ </organization>
233
+ </contributor>
234
+ <contributor>
235
+ <role type="author"/>
236
+ <organization>
237
+ <name>IETF</name>
238
+ </organization>
239
+ </contributor>
240
+ <contributor>
241
+ <role type="author"/>
242
+ <organization>
243
+ <name>International Organization for Standardization</name>
244
+ <abbreviation>ISO</abbreviation>
245
+ </organization>
246
+ </contributor>
247
+ <contributor>
248
+ <role type="publisher"/>
249
+ <organization>
250
+ <name>International Electrotechnical Commission</name>
251
+ <abbreviation>IEC</abbreviation>
252
+ <address>
253
+ <formattedAddress>1 Infinity Loop + California</formattedAddress>
254
+ </address>
255
+ <phone>3333333</phone>
256
+ <phone type='fax'>4444444</phone>
257
+ <email>x@example.com</email>
258
+ <uri>http://www.example.com</uri>
259
+ </organization>
260
+ </contributor>
261
+ <contributor>
262
+ <role type="publisher"/>
263
+ <organization>
264
+ <name>IETF</name>
265
+ <address>
266
+ <formattedAddress>1 Infinity Loop + California</formattedAddress>
267
+ </address>
268
+ <phone>3333333</phone>
269
+ <phone type='fax'>4444444</phone>
270
+ <email>x@example.com</email>
271
+ <uri>http://www.example.com</uri>
272
+ </organization>
273
+ </contributor>
274
+ <contributor>
275
+ <role type="publisher"/>
276
+ <organization>
277
+ <name>International Organization for Standardization</name>
278
+ <abbreviation>ISO</abbreviation>
279
+ <address>
280
+ <formattedAddress>1 Infinity Loop + California</formattedAddress>
281
+ </address>
282
+ <phone>3333333</phone>
283
+ <phone type='fax'>4444444</phone>
284
+ <email>x@example.com</email>
285
+ <uri>http://www.example.com</uri>
286
+ </organization>
287
+ </contributor>
288
+ <language>el</language>
289
+ <script>Grek</script>
290
+ <status>
291
+ <stage abbreviation="IS">60</stage>
292
+ <substage>60</substage>
293
+ </status>
294
+ <copyright>
295
+ <from>2001</from>
296
+ <owner>
297
+ <organization>
298
+ <name>International Organization for Standardization</name>
299
+ <abbreviation>ISO</abbreviation>
300
+ <address>
301
+ <formattedAddress>1 Infinity Loop + California</formattedAddress>
302
+ </address>
303
+ <phone>3333333</phone>
304
+ <phone type='fax'>4444444</phone>
305
+ <email>x@example.com</email>
306
+ <uri>http://www.example.com</uri>
307
+ #{' '}
308
+ </organization>
309
+ </owner>
310
+ </copyright>
311
+ <copyright>
312
+ <from>2001</from>
313
+ <owner>
314
+ <organization>
315
+ <name>IETF</name>
316
+ <address>
317
+ <formattedAddress>1 Infinity Loop + California</formattedAddress>
318
+ </address>
319
+ <phone>3333333</phone>
320
+ <phone type='fax'>4444444</phone>
321
+ <email>x@example.com</email>
322
+ <uri>http://www.example.com</uri>
323
+ </organization>
324
+ </owner>
325
+ </copyright>
326
+ <ext>
327
+ <doctype>technical-report</doctype>
328
+ <editorialgroup>
329
+ <technical-committee/>
330
+ <subcommittee/>
331
+ <workgroup/>
332
+ </editorialgroup>
333
+ <structuredidentifier>
334
+ <project-number part="1" subpart="1">ISO/IEC/IETF 1000</project-number>
335
+ </structuredidentifier>
336
+ <stagename>International standard</stagename>
337
+ </ext>
338
+ </bibdata>
339
+ <sections/>
340
+ </iso-standard>
341
+ OUTPUT
342
+ end
343
+
344
+ it "processes subdivisions" do
345
+ output = Asciidoctor.convert(<<~"INPUT", *OPTIONS)
346
+ = Document title
347
+ Author
348
+ :docfile: test.adoc
349
+ :nodoc:
350
+ :novalid:
351
+ :revdate: 2000-01
352
+ :published-date: 1000-01
353
+ :docnumber: 1000
354
+ :partnumber: 1-1
355
+ :tc-docnumber: 2000
356
+ :language: el
357
+ :script: Grek
358
+ :subdivision: Subdivision
359
+ :subdivision-abbr: SD
360
+ :doctype: This is a DocType
361
+ :pub-address: 1 Infinity Loop + \\
362
+ California
363
+ :pub-phone: 3333333
364
+ :pub-fax: 4444444
365
+ :pub-email: x@example.com
366
+ :pub-uri: http://www.example.com
367
+ INPUT
368
+ expect(xmlpp(strip_guid(output
369
+ .sub(%r{<boilerplate>.*</boilerplate>}m, ""))))
370
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
371
+ <iso-standard xmlns="https://www.metanorma.org/ns/iso" type="semantic" version="#{Metanorma::ISO::VERSION}">
372
+ <bibdata type='standard'>
373
+ <docidentifier type='ISO'>SD 1000-1-1</docidentifier>
374
+ <docidentifier type='iso-with-lang'>SD 1000-1-1(X)</docidentifier>
375
+ <docidentifier type='iso-reference'>SD 1000-1-1(X)</docidentifier>
376
+ <docidentifier type='iso-tc'>2000</docidentifier>
377
+ <docnumber>1000</docnumber>
378
+ <date type='published'>
379
+ <on>1000-01</on>
380
+ </date>
381
+ <contributor>
382
+ <role type='author'/>
383
+ <organization>
384
+ <name>International Organization for Standardization</name>
385
+ <subdivision>Subdivision</subdivision>
386
+ <abbreviation>SD</abbreviation>
387
+ </organization>
388
+ </contributor>
389
+ <contributor>
390
+ <role type='publisher'/>
391
+ <organization>
392
+ <name>International Organization for Standardization</name>
393
+ <subdivision>Subdivision</subdivision>
394
+ <abbreviation>SD</abbreviation>
395
+ <address>
396
+ <formattedAddress>1 Infinity Loop <br/>California</formattedAddress>
397
+ </address>
398
+ <phone>3333333</phone>
399
+ <phone type='fax'>4444444</phone>
400
+ <email>x@example.com</email>
401
+ <uri>http://www.example.com</uri>
402
+ </organization>
403
+ </contributor>
404
+ <version>
405
+ <revision-date>2000-01</revision-date>
406
+ </version>
407
+ <language>el</language>
408
+ <script>Grek</script>
409
+ <status>
410
+ <stage abbreviation='IS'>60</stage>
411
+ <substage>60</substage>
412
+ </status>
413
+ <copyright>
414
+ <from>#{Time.now.year}</from>
415
+ <owner>
416
+ <organization>
417
+ <name>International Organization for Standardization</name>
418
+ <subdivision>Subdivision</subdivision>
419
+ <abbreviation>SD</abbreviation>
420
+ <address>
421
+ <formattedAddress>1 Infinity Loop
422
+ <br/>
423
+ California</formattedAddress>
424
+ </address>
425
+ <phone>3333333</phone>
426
+ <phone type="fax">4444444</phone>
427
+ <email>x@example.com</email>
428
+ <uri>http://www.example.com</uri>
429
+ </organization>
430
+ </owner>
431
+ </copyright>
432
+ <ext>
433
+ <doctype>this-is-a-doctype</doctype>
434
+ <editorialgroup>
435
+ <technical-committee/>
436
+ <subcommittee/>
437
+ <workgroup/>
438
+ </editorialgroup>
439
+ <structuredidentifier>
440
+ <project-number part="1" subpart="1">SD 1000</project-number>
441
+ </structuredidentifier>
442
+ <stagename>International standard</stagename>
443
+ </ext>
444
+ </bibdata>
445
+ <sections> </sections>
446
+ </iso-standard>
447
+ OUTPUT
448
+ end
449
+
450
+ it "defaults substage, defines iteration on stage 50" do
451
+ output = Asciidoctor.convert(<<~"INPUT", *OPTIONS)
452
+ = Document title
453
+ Author
454
+ :docfile: test.adoc
455
+ :nodoc:
456
+ :novalid:
457
+ :no-isobib:
458
+ :docnumber: 1000
459
+ :docstage: 50
460
+ :language: fr
461
+ :doctype: international-standard
462
+ :iteration: 2
463
+ INPUT
464
+ expect(xmlpp(output.sub(%r{<boilerplate>.*</boilerplate>}m, "")))
465
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
466
+ <iso-standard type="semantic" version="#{Metanorma::ISO::VERSION}" xmlns="https://www.metanorma.org/ns/iso">
467
+ <bibdata type="standard">
468
+ <docidentifier type='ISO'>ISO/FDIS 1000.2</docidentifier>
469
+ <docidentifier type='iso-with-lang'>ISO/FDIS 1000.2(F)</docidentifier>
470
+ <docidentifier type='iso-reference'>ISO/FDIS 1000.2(F)</docidentifier>
471
+ <docnumber>1000</docnumber>
472
+ <contributor>
473
+ <role type="author"/>
474
+ <organization>
475
+ <name>International Organization for Standardization</name>
476
+ <abbreviation>ISO</abbreviation>
477
+ </organization>
478
+ </contributor>
479
+ <contributor>
480
+ <role type="publisher"/>
481
+ <organization>
482
+ <name>International Organization for Standardization</name>
483
+ <abbreviation>ISO</abbreviation>
484
+ </organization>
485
+ </contributor>
486
+ <language>fr</language>
487
+ <script>Latn</script>
488
+ <status>
489
+ <stage abbreviation="FDIS">50</stage>
490
+ <substage>00</substage>
491
+ <iteration>2</iteration>
492
+ </status>
493
+ <copyright>
494
+ <from>#{Date.today.year}</from>
495
+ <owner>
496
+ <organization>
497
+ <name>International Organization for Standardization</name>
498
+ <abbreviation>ISO</abbreviation>
499
+ </organization>
500
+ </owner>
501
+ </copyright>
502
+ <ext>
503
+ <doctype>international-standard</doctype>
504
+ <editorialgroup>
505
+ <technical-committee/>
506
+ <subcommittee/>
507
+ <workgroup/>
508
+ </editorialgroup>
509
+ <structuredidentifier>
510
+ <project-number>ISO 1000</project-number>
511
+ </structuredidentifier>
512
+ <stagename>Final draft</stagename>
513
+ </ext>
514
+ </bibdata>
515
+ <sections/>
516
+ </iso-standard>
517
+ OUTPUT
518
+ end
519
+
520
+ it "defaults substage for stage 60" do
521
+ output = Asciidoctor.convert(<<~"INPUT", *OPTIONS)
522
+ = Document title
523
+ Author
524
+ :docfile: test.adoc
525
+ :nodoc:
526
+ :novalid:
527
+ :no-isobib:
528
+ :docnumber: 1000
529
+ :docstage: 60
530
+ INPUT
531
+
532
+ expect(xmlpp(output.sub(%r{<boilerplate>.*</boilerplate>}m, "")))
533
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
534
+ <iso-standard xmlns="https://www.metanorma.org/ns/iso" type="semantic" version="#{Metanorma::ISO::VERSION}">
535
+ <bibdata type="standard">
536
+ <docidentifier type="ISO">ISO 1000</docidentifier>
537
+ <docidentifier type='iso-with-lang'>ISO 1000(E)</docidentifier>
538
+ <docidentifier type='iso-reference'>ISO 1000(E)</docidentifier>
539
+ <docnumber>1000</docnumber>
540
+ <contributor>
541
+ <role type="author"/>
542
+ <organization>
543
+ <name>International Organization for Standardization</name>
544
+ <abbreviation>ISO</abbreviation>
545
+ </organization>
546
+ </contributor>
547
+ <contributor>
548
+ <role type="publisher"/>
549
+ <organization>
550
+ <name>International Organization for Standardization</name>
551
+ <abbreviation>ISO</abbreviation>
552
+ </organization>
553
+ </contributor>
554
+
555
+ <language>en</language>
556
+ <script>Latn</script>
557
+ <status>
558
+ <stage abbreviation="IS">60</stage>
559
+ <substage>60</substage>
560
+ </status>
561
+ <copyright>
562
+ <from>#{Date.today.year}</from>
563
+ <owner>
564
+ <organization>
565
+ <name>International Organization for Standardization</name>
566
+ <abbreviation>ISO</abbreviation>
567
+ </organization>
568
+ </owner>
569
+ </copyright>
570
+ <ext>
571
+ <doctype>article</doctype>
572
+ <editorialgroup>
573
+ <technical-committee/>
574
+ <subcommittee/>
575
+ <workgroup/>
576
+ </editorialgroup>
577
+ <structuredidentifier>
578
+ <project-number>ISO 1000</project-number>
579
+ </structuredidentifier>
580
+ <stagename>International standard</stagename>
581
+ </ext>
582
+ </bibdata>
583
+ <sections/>
584
+ </iso-standard>
585
+ OUTPUT
586
+ end
587
+
588
+ it "populates metadata for PRF" do
589
+ output = Asciidoctor.convert(<<~"INPUT", *OPTIONS)
590
+ = Document title
591
+ Author
592
+ :docfile: test.adoc
593
+ :nodoc:
594
+ :novalid:
595
+ :no-isobib:
596
+ :docnumber: 1000
597
+ :docstage: 60
598
+ :docsubstage: 00
599
+ INPUT
600
+ expect(xmlpp(output.sub(%r{<boilerplate>.*</boilerplate>}m, "")))
601
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
602
+ <iso-standard xmlns="https://www.metanorma.org/ns/iso" type="semantic" version="#{Metanorma::ISO::VERSION}">
603
+ <bibdata type="standard">
604
+ <docidentifier type="ISO">ISO 1000</docidentifier>
605
+ <docidentifier type='iso-with-lang'>ISO 1000(E)</docidentifier>
606
+ <docidentifier type='iso-reference'>ISO 1000(E)</docidentifier>
607
+ <docnumber>1000</docnumber>
608
+ <contributor>
609
+ <role type="author"/>
610
+ <organization>
611
+ <name>International Organization for Standardization</name>
612
+ <abbreviation>ISO</abbreviation>
613
+ </organization>
614
+ </contributor>
615
+ <contributor>
616
+ <role type="publisher"/>
617
+ <organization>
618
+ <name>International Organization for Standardization</name>
619
+ <abbreviation>ISO</abbreviation>
620
+ </organization>
621
+ </contributor>
622
+
623
+ <language>en</language>
624
+ <script>Latn</script>
625
+ <status>
626
+ <stage abbreviation="PRF">60</stage>
627
+ <substage>00</substage>
628
+ </status>
629
+ <copyright>
630
+ <from>#{Date.today.year}</from>
631
+ <owner>
632
+ <organization>
633
+ <name>International Organization for Standardization</name>
634
+ <abbreviation>ISO</abbreviation>
635
+ </organization>
636
+ </owner>
637
+ </copyright>
638
+ <ext>
639
+ <doctype>article</doctype>
640
+ <editorialgroup>
641
+ <technical-committee/>
642
+ <subcommittee/>
643
+ <workgroup/>
644
+ </editorialgroup>
645
+ <structuredidentifier>
646
+ <project-number>ISO 1000</project-number>
647
+ </structuredidentifier>
648
+ <stagename>Proof</stagename>
649
+ </ext>
650
+ </bibdata>
651
+ <sections/>
652
+ </iso-standard>
653
+ OUTPUT
654
+ end
655
+
656
+ it "defaults metadata for DIR" do
657
+ output = Asciidoctor.convert(<<~"INPUT", *OPTIONS)
658
+ = Document title
659
+ Author
660
+ :docfile: test.adoc
661
+ :nodoc:
662
+ :novalid:
663
+ :no-isobib:
664
+ :docnumber: 1000
665
+ :doctype: directive
666
+ INPUT
667
+
668
+ expect(xmlpp(output.sub(%r{<boilerplate>.*</boilerplate>}m, "")))
669
+ .to be_equivalent_to xmlpp(<<~"OUTPUT")
670
+ <iso-standard xmlns="https://www.metanorma.org/ns/iso" type="semantic" version="#{Metanorma::ISO::VERSION}">
671
+ <bibdata type='standard'>
672
+ <docidentifier type='ISO'>ISO DIR 1000</docidentifier>
673
+ <docidentifier type='iso-with-lang'>ISO DIR 1000(E)</docidentifier>
674
+ <docidentifier type='iso-reference'>ISO DIR 1000(E)</docidentifier>
675
+ <docnumber>1000</docnumber>
676
+ <contributor>
677
+ <role type='author'/>
678
+ <organization>
679
+ <name>International Organization for Standardization</name>
680
+ <abbreviation>ISO</abbreviation>
681
+ </organization>
682
+ </contributor>
683
+ <contributor>
684
+ <role type='publisher'/>
685
+ <organization>
686
+ <name>International Organization for Standardization</name>
687
+ <abbreviation>ISO</abbreviation>
688
+ </organization>
689
+ </contributor>
690
+ <language>en</language>
691
+ <script>Latn</script>
692
+ <status>
693
+ <stage abbreviation='IS'>60</stage>
694
+ <substage>60</substage>
695
+ </status>
696
+ <copyright>
697
+ <from>2021</from>
698
+ <owner>
699
+ <organization>
700
+ <name>International Organization for Standardization</name>
701
+ <abbreviation>ISO</abbreviation>
702
+ </organization>
703
+ </owner>
704
+ </copyright>
705
+ <ext>
706
+ <doctype>directive</doctype>
707
+ <editorialgroup>
708
+ <technical-committee/>
709
+ <subcommittee/>
710
+ <workgroup/>
711
+ </editorialgroup>
712
+ <structuredidentifier>
713
+ <project-number>ISO 1000</project-number>
714
+ </structuredidentifier>
715
+ <stagename>International standard</stagename>
716
+ </ext>
717
+ </bibdata>
718
+ <sections> </sections>
719
+ </iso-standard>
720
+ OUTPUT
721
+ end
722
+
723
+ it "reads scripts into blank HTML document" do
724
+ Asciidoctor.convert(<<~"INPUT", *OPTIONS)
725
+ = Document title
726
+ Author
727
+ :docfile: test.adoc
728
+ :novalid:
729
+ :no-isobib:
730
+ :no-pdf:
731
+ INPUT
732
+ html = File.read("test.html", encoding: "utf-8")
733
+ expect(html).to match(%r{<script>})
734
+ end
735
+
736
+ it "uses default fonts" do
737
+ Asciidoctor.convert(<<~"INPUT", *OPTIONS)
738
+ = Document title
739
+ Author
740
+ :docfile: test.adoc
741
+ :novalid:
742
+ :no-isobib:
743
+ :no-pdf:
744
+ INPUT
745
+ html = File.read("test.html", encoding: "utf-8")
746
+ expect(html)
747
+ .to match(%r[\bpre[^{]+\{[^{]+font-family: "Courier New", monospace;]m)
748
+ expect(html)
749
+ .to match(%r[blockquote[^{]+\{[^{]+font-family: "Cambria", serif;]m)
750
+ expect(html)
751
+ .to match(%r[\.h2Annex[^{]+\{[^{]+font-family: "Cambria", serif;]m)
752
+ end
753
+
754
+ it "uses default fonts for alt doc" do
755
+ Asciidoctor.convert(<<~"INPUT", *OPTIONS)
756
+ = Document title
757
+ Author
758
+ :docfile: test.adoc
759
+ :novalid:
760
+ :no-isobib:
761
+ :no-pdf:
762
+ INPUT
763
+ html = File.read("test_alt.html", encoding: "utf-8")
764
+ expect(html)
765
+ .to match(%r[\bpre[^{]+\{[^{]+font-family: "Space Mono", monospace;]m)
766
+ expect(html)
767
+ .to match(%r[blockquote[^{]+\{[^{]+font-family: "Lato", sans-serif;]m)
768
+ expect(html)
769
+ .to match(%r[\.h2Annex[^{]+\{[^{]+font-family: "Lato", sans-serif;]m)
770
+ end
771
+
772
+ it "uses Chinese fonts" do
773
+ Asciidoctor.convert(<<~"INPUT", *OPTIONS)
774
+ = Document title
775
+ Author
776
+ :docfile: test.adoc
777
+ :novalid:
778
+ :no-isobib:
779
+ :script: Hans
780
+ :no-pdf:
781
+ INPUT
782
+ html = File.read("test.html", encoding: "utf-8")
783
+ expect(html)
784
+ .to match(%r[\bpre[^{]+\{[^{]+font-family: "Courier New", monospace;]m)
785
+ expect(html)
786
+ .to match(%r[blockquote[^{]+\{[^{]+font-family: "Source Han Sans", serif;]m)
787
+ expect(html)
788
+ .to match(%r[\.h2Annex[^{]+\{[^{]+font-family: "Source Han Sans", sans-serif;]m)
789
+ end
790
+
791
+ it "uses specified fonts" do
792
+ Asciidoctor.convert(<<~"INPUT", *OPTIONS)
793
+ = Document title
794
+ Author
795
+ :docfile: test.adoc
796
+ :novalid:
797
+ :no-isobib:
798
+ :script: Hans
799
+ :body-font: Zapf Chancery
800
+ :header-font: Comic Sans
801
+ :monospace-font: Andale Mono
802
+ :no-pdf:
803
+ INPUT
804
+ html = File.read("test.html", encoding: "utf-8")
805
+ expect(html).to match(%r[\bpre[^{]+\{[^{]+font-family: Andale Mono;]m)
806
+ expect(html)
807
+ .to match(%r[blockquote[^{]+\{[^{]+font-family: Zapf Chancery;]m)
808
+ expect(html).to match(%r[\.h2Annex[^{]+\{[^{]+font-family: Comic Sans;]m)
809
+ end
810
+
811
+ it "strips MS-specific CSS" do
812
+ Asciidoctor.convert(<<~"INPUT", *OPTIONS)
813
+ = Document title
814
+ Author
815
+ :docfile: test.adoc
816
+ :novalid:
817
+ :no-isobib:
818
+ :no-pdf:
819
+ INPUT
820
+ word = File.read("test.doc", encoding: "utf-8")
821
+ html = File.read("test.html", encoding: "utf-8")
822
+ expect(word).to match(%r[mso-style-name: "Intro Title";]m)
823
+ expect(html).not_to match(%r[mso-style-name: "Intro Title";]m)
824
+ end
825
+ end