metanorma-iso 1.8.0 → 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e2e7e19a42e3aeb8a036946cd7a312df8887f9a68a9f0b159399c4a2285f636
4
- data.tar.gz: 229cbacc6397cdf692b6294d4f46b88a22ad39a18b80e29be3d85f37c1eeb203
3
+ metadata.gz: 9d170797212efc1050755714c1c875246a5b1b07ca8c4c1b6562b51ab2ee44a9
4
+ data.tar.gz: a6deb053bf737183c275a1f93a110d89f8fa42a093bafd514c7d672b5e16f427
5
5
  SHA512:
6
- metadata.gz: bcfbfd49e84b5127ccb0f4cca2777803ea5a560e60267ccd8e077c7a8b68052f38499a2662f3dfea06641f2a8f278525ebc0118ccef63715bf6e4e1f90badbde
7
- data.tar.gz: 003f5ae00770eeb488ca7adf2c13a611bb8a79425f223f07ed765fc5b2333e2700c7e27fa720ce8cfbcfd55750dd633f1f035f46026e792cab5d0fa0c83e7c72
6
+ metadata.gz: 63752e6b4a75cba612fca7cacf5c0ccd7a4553f51b9743e667d7a2891737dff68deace61efcab395be2f22e8b4d6559ee8eee6c50ad84e3f13e627af1ca98a68
7
+ data.tar.gz: 401f42f155a7424266d3bf62cb6fca9a67ad1adeddf01145c55de95397a91de22847b56fa92563d64045eb6dc2682511eab3925d60f74b1ca737f8ecefacee63
@@ -17,8 +17,8 @@ module Asciidoctor
17
17
  end
18
18
 
19
19
  def html_converter_alt(node)
20
- IsoDoc::Iso::HtmlConvert.new(html_extract_attributes(node).
21
- merge(alt: true))
20
+ IsoDoc::Iso::HtmlConvert.new(html_extract_attributes(node)
21
+ .merge(alt: true))
22
22
  end
23
23
 
24
24
  def doc_converter(node)
@@ -27,11 +27,13 @@ module Asciidoctor
27
27
 
28
28
  def pdf_converter(node)
29
29
  return nil if node.attr("no-pdf")
30
+
30
31
  IsoDoc::Iso::PdfConvert.new(doc_extract_attributes(node))
31
32
  end
32
33
 
33
34
  def sts_converter(node)
34
35
  return nil if node.attr("no-pdf")
36
+
35
37
  IsoDoc::Iso::StsConvert.new(html_extract_attributes(node))
36
38
  end
37
39
 
@@ -45,22 +47,22 @@ module Asciidoctor
45
47
  end
46
48
 
47
49
  def ol_attrs(node)
48
- attr_code(keep_attrs(node).
49
- merge(id: ::Metanorma::Utils::anchor_or_uuid(node)))
50
+ attr_code(keep_attrs(node)
51
+ .merge(id: ::Metanorma::Utils::anchor_or_uuid(node)))
50
52
  end
51
53
 
52
54
  def outputs(node, ret)
53
- File.open(@filename + ".xml", "w:UTF-8") { |f| f.write(ret) }
54
- presentation_xml_converter(node).convert(@filename + ".xml")
55
- html_converter_alt(node).convert(@filename + ".presentation.xml",
55
+ File.open("#{@filename}.xml", "w:UTF-8") { |f| f.write(ret) }
56
+ presentation_xml_converter(node).convert("#{@filename}.xml")
57
+ html_converter_alt(node).convert("#{@filename}.presentation.xml",
56
58
  nil, false, "#{@filename}_alt.html")
57
- html_converter(node).convert(@filename + ".presentation.xml",
59
+ html_converter(node).convert("#{@filename}.presentation.xml",
58
60
  nil, false, "#{@filename}.html")
59
- doc_converter(node).convert(@filename + ".presentation.xml",
61
+ doc_converter(node).convert("#{@filename}.presentation.xml",
60
62
  nil, false, "#{@filename}.doc")
61
- pdf_converter(node)&.convert(@filename + ".presentation.xml",
63
+ pdf_converter(node)&.convert("#{@filename}.presentation.xml",
62
64
  nil, false, "#{@filename}.pdf")
63
- #sts_converter(node)&.convert(@filename + ".xml")
65
+ # sts_converter(node)&.convert(@filename + ".xml")
64
66
  end
65
67
  end
66
68
  end
@@ -22,20 +22,19 @@ module Asciidoctor
22
22
  def other_footnote_renumber(xmldoc)
23
23
  seen = {}
24
24
  i = 0
25
- xmldoc.xpath(PRE_NORMREF_FOOTNOTES).each do |fn|
26
- i, seen = other_footnote_renumber1(fn, i, seen)
27
- end
28
- xmldoc.xpath(NORMREF_FOOTNOTES).each do |fn|
29
- i, seen = other_footnote_renumber1(fn, i, seen)
30
- end
31
- xmldoc.xpath(POST_NORMREF_FOOTNOTES).each do |fn|
32
- i, seen = other_footnote_renumber1(fn, i, seen)
25
+ [PRE_NORMREF_FOOTNOTES, NORMREF_FOOTNOTES,
26
+ POST_NORMREF_FOOTNOTES].each do |xpath|
27
+ xmldoc.xpath(xpath).each do |fn|
28
+ i, seen = other_footnote_renumber1(fn, i, seen)
29
+ end
33
30
  end
34
31
  end
35
32
 
36
33
  def id_prefix(prefix, id)
37
- return id.text if @amd # we're just inheriting the prefixes from parent doc
38
- prefix.join("/") + ( id.text.match(%{^/}) ? "" : " " ) + id.text
34
+ # we're just inheriting the prefixes from parent doc
35
+ return id.text if @amd
36
+
37
+ prefix.join("/") + (id.text.match?(%{^/}) ? "" : " ") + id.text
39
38
  end
40
39
 
41
40
  def get_id_prefix(xmldoc)
@@ -79,6 +78,7 @@ module Asciidoctor
79
78
  return 2 if bib.at("#{PUBLISHER}[name = 'International "\
80
79
  "Electrotechnical Commission']")
81
80
  return 3 if bib.at("./docidentifier[@type][not(#{OTHERIDS})]")
81
+
82
82
  4
83
83
  end
84
84
 
@@ -101,25 +101,26 @@ module Asciidoctor
101
101
  num = bib&.at("./docnumber")&.text
102
102
  id = bib&.at("./docidentifier[not(#{OTHERIDS})]")
103
103
  metaid = bib&.at("./docidentifier[@type = 'metanorma']")&.text
104
- abbrid = metaid unless /^\[\d+\]$/.match(metaid)
104
+ abbrid = metaid unless /^\[\d+\]$/.match?(metaid)
105
105
  /\d-(?<partid>\d+)/ =~ id&.text
106
- type = id['type'] if id
106
+ type = id["type"] if id
107
107
  title = bib&.at("./title[@type = 'main']")&.text ||
108
108
  bib&.at("./title")&.text || bib&.at("./formattedref")&.text
109
109
  "#{pubclass} :: #{type} :: "\
110
- "#{num.nil? ? abbrid : sprintf("%09d", num.to_i)} :: "\
110
+ "#{num.nil? ? abbrid : sprintf('%09d', num.to_i)} :: "\
111
111
  "#{partid} :: #{id&.text} :: #{title}"
112
112
  end
113
113
 
114
- def sections_cleanup(x)
114
+ def sections_cleanup(xml)
115
115
  super
116
116
  return unless @amd
117
- x.xpath("//*[@inline-header]").each do |h|
118
- h.delete('inline-header')
117
+
118
+ xml.xpath("//*[@inline-header]").each do |h|
119
+ h.delete("inline-header")
119
120
  end
120
121
  end
121
122
 
122
- def boilerplate_file(xmldoc)
123
+ def boilerplate_file(_xmldoc)
123
124
  file = @lang == "fr" ? "boilerplate-fr.xml" : "boilerplate.xml"
124
125
  File.join(@libdir, file)
125
126
  end
@@ -146,14 +147,17 @@ module Asciidoctor
146
147
  end
147
148
 
148
149
  def unpublished_note(xmldoc)
149
- xmldoc.xpath("//bibitem[not(note[@type = 'Unpublished-Status'])]").each do |b|
150
+ xmldoc.xpath("//bibitem[not(note[@type = 'Unpublished-Status'])]")
151
+ .each do |b|
150
152
  next if pub_class(b) > 2
151
- next unless s = b.at("./status/stage") and s.text.to_i < 60
153
+ next unless (s = b.at("./status/stage")) && (s.text.to_i < 60)
154
+
152
155
  id = b.at("docidentifier").text
153
- b.at("./language | ./script | ./abstract | ./status").previous = <<~NOTE
154
- <note type="Unpublished-Status">
155
- <p>#{@i18n.under_preparation.sub(/%/, id)}</p></note>
156
- NOTE
156
+ b.at("./language | ./script | ./abstract | ./status")
157
+ .previous = <<~NOTE
158
+ <note type="Unpublished-Status">
159
+ <p>#{@i18n.under_preparation.sub(/%/, id)}</p></note>
160
+ NOTE
157
161
  end
158
162
  end
159
163
  end
@@ -33,7 +33,9 @@ module Asciidoctor
33
33
  csv_split(publishers).each do |p|
34
34
  xml.contributor do |c|
35
35
  c.role **{ type: "author" }
36
- c.organization { |a| organization(a, p, node, !node.attr("publisher")) }
36
+ c.organization do |a|
37
+ organization(a, p, false, node, !node.attr("publisher"))
38
+ end
37
39
  end
38
40
  end
39
41
  end
@@ -43,20 +45,25 @@ module Asciidoctor
43
45
  csv_split(publishers).each do |p|
44
46
  xml.contributor do |c|
45
47
  c.role **{ type: "publisher" }
46
- c.organization { |a| organization(a, p, node, !node.attr("publisher")) }
48
+ c.organization do |a|
49
+ organization(a, p, true, node, !node.attr("publisher"))
50
+ end
47
51
  end
48
52
  end
49
53
  end
50
54
 
51
55
  def metadata_copyright(node, xml)
52
- publishers = node.attr("copyright-holder") || node.attr("publisher") || "ISO"
56
+ publishers = node.attr("copyright-holder") || node.attr("publisher") ||
57
+ "ISO"
53
58
  csv_split(publishers).each do |p|
54
59
  xml.copyright do |c|
55
60
  c.from (node.attr("copyright-year") || Date.today.year)
56
61
  c.owner do |owner|
57
62
  owner.organization do |o|
58
- organization(o, p, node,
59
- !(node.attr("copyright-holder") || node.attr("publisher")))
63
+ organization(
64
+ o, p, true, node,
65
+ !(node.attr("copyright-holder") || node.attr("publisher"))
66
+ )
60
67
  end
61
68
  end
62
69
  end
@@ -82,34 +89,37 @@ module Asciidoctor
82
89
  end
83
90
  end
84
91
 
85
- def title_intro(node, t, lang, at)
92
+ def title_intro(node, xml, lang, at)
86
93
  return unless node.attr("title-intro-#{lang}")
87
- t.title(**attr_code(at.merge(type: "title-intro"))) do |t1|
94
+
95
+ xml.title(**attr_code(at.merge(type: "title-intro"))) do |t1|
88
96
  t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-intro-#{lang}"))
89
97
  end
90
98
  end
91
99
 
92
- def title_main(node, t, lang, at)
93
- t.title **attr_code(at.merge(type: "title-main")) do |t1|
100
+ def title_main(node, xml, lang, at)
101
+ xml.title **attr_code(at.merge(type: "title-main")) do |t1|
94
102
  t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-main-#{lang}"))
95
103
  end
96
104
  end
97
105
 
98
- def title_part(node, t, lang, at)
106
+ def title_part(node, xml, lang, at)
99
107
  return unless node.attr("title-part-#{lang}")
100
- t.title(**attr_code(at.merge(type: "title-part"))) do |t1|
108
+
109
+ xml.title(**attr_code(at.merge(type: "title-part"))) do |t1|
101
110
  t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-part-#{lang}"))
102
111
  end
103
112
  end
104
113
 
105
- def title_amd(node, t, lang, at)
114
+ def title_amd(node, xml, lang, at)
106
115
  return unless node.attr("title-amendment-#{lang}")
107
- t.title(**attr_code(at.merge(type: "title-amd"))) do |t1|
116
+
117
+ xml.title(**attr_code(at.merge(type: "title-amd"))) do |t1|
108
118
  t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-amendment-#{lang}"))
109
119
  end
110
120
  end
111
121
 
112
- def title_full(node, t, lang, at)
122
+ def title_full(node, xml, lang, at)
113
123
  title = node.attr("title-main-#{lang}")
114
124
  intro = node.attr("title-intro-#{lang}")
115
125
  part = node.attr("title-part-#{lang}")
@@ -117,7 +127,7 @@ module Asciidoctor
117
127
  title = "#{intro} -- #{title}" if intro
118
128
  title = "#{title} -- #{part}" if part
119
129
  title = "#{title} -- #{amd}" if amd && @amd
120
- t.title **attr_code(at.merge(type: "main")) do |t1|
130
+ xml.title **attr_code(at.merge(type: "main")) do |t1|
121
131
  t1 << Metanorma::Utils::asciidoc_sub(title)
122
132
  end
123
133
  end
@@ -1,8 +1,9 @@
1
1
  require "metanorma-standoc"
2
- require_relative "./validate_style.rb"
3
- require_relative "./validate_requirements.rb"
4
- require_relative "./validate_section.rb"
5
- require_relative "./validate_title.rb"
2
+ require_relative "./validate_style"
3
+ require_relative "./validate_requirements"
4
+ require_relative "./validate_section"
5
+ require_relative "./validate_title"
6
+ require_relative "./validate_image"
6
7
  require "nokogiri"
7
8
  require "jing"
8
9
  require "iev"
@@ -10,17 +11,6 @@ require "iev"
10
11
  module Asciidoctor
11
12
  module ISO
12
13
  class Converter < Standoc::Converter
13
- # ISO/IEC DIR 2, 22.3.2
14
- def onlychild_clause_validate(root)
15
- root.xpath(Standoc::Utils::SUBCLAUSE_XPATH).each do |c|
16
- next unless c.xpath("../clause").size == 1
17
- title = c.at("./title")
18
- location = c["id"] || c.text[0..60] + "..."
19
- location += ":#{title.text}" if c["id"] && !title.nil?
20
- @log.add("Style", nil, "#{location}: subclause is only child")
21
- end
22
- end
23
-
24
14
  def isosubgroup_validate(root)
25
15
  root.xpath("//technical-committee/@type").each do |t|
26
16
  unless %w{TC PC JTC JPC}.include? t.text
@@ -37,12 +27,13 @@ module Asciidoctor
37
27
  end
38
28
 
39
29
  # ISO/IEC DIR 2, 15.5.3
30
+ # does not deal with preceding text marked up
40
31
  def see_xrefs_validate(root)
41
32
  root.xpath("//xref").each do |t|
42
- # does not deal with preceding text marked up
43
33
  preceding = t.at("./preceding-sibling::text()[last()]")
44
34
  next unless !preceding.nil? &&
45
35
  /\b(see| refer to)\s*$/mi.match(preceding)
36
+
46
37
  (target = root.at("//*[@id = '#{t['target']}']")) || next
47
38
  if target&.at("./ancestor-or-self::*[@obligation = 'normative']")
48
39
  @log.add("Style", t,
@@ -54,36 +45,34 @@ module Asciidoctor
54
45
  # ISO/IEC DIR 2, 15.5.3
55
46
  def see_erefs_validate(root)
56
47
  root.xpath("//eref").each do |t|
57
- preceding = t.at("./preceding-sibling::text()[last()]")
58
- next unless !preceding.nil? &&
59
- /\b(see|refer to)\s*$/mi.match(preceding)
48
+ prec = t.at("./preceding-sibling::text()[last()]")
49
+ next unless !prec.nil? && /\b(see|refer to)\s*$/mi.match(prec)
50
+
60
51
  unless target = root.at("//*[@id = '#{t['bibitemid']}']")
61
52
  @log.add("Bibliography", t,
62
53
  "'#{t} is not pointing to a real reference")
63
54
  next
64
55
  end
65
- if target.at("./ancestor::references[@normative = 'true']")
56
+ target.at("./ancestor::references[@normative = 'true']") and
66
57
  @log.add("Style", t,
67
58
  "'see #{t}' is pointing to a normative reference")
68
- end
69
59
  end
70
60
  end
71
61
 
72
62
  # ISO/IEC DIR 2, 10.4
73
63
  def locality_erefs_validate(root)
74
64
  root.xpath("//eref[descendant::locality]").each do |t|
75
- if /^(ISO|IEC)/.match t["citeas"]
76
- unless /:[ ]?(\d+{4}|–)$/.match t["citeas"]
77
- @log.add("Style", t,
78
- "undated reference #{t['citeas']} should not contain "\
79
- "specific elements")
80
- end
65
+ if /^(ISO|IEC)/.match?(t["citeas"]) &&
66
+ !(/: ?(\d+{4}|–)$/.match?(t["citeas"]))
67
+ @log.add("Style", t,
68
+ "undated reference #{t['citeas']} should not contain "\
69
+ "specific elements")
81
70
  end
82
71
  end
83
72
  end
84
73
 
85
- def termdef_warn(text, re, t, term, msg)
86
- re.match(text) && @log.add("Style", t, "#{term}: #{msg}")
74
+ def termdef_warn(text, regex, elem, term, msg)
75
+ regex.match(text) && @log.add("Style", elem, "#{term}: #{msg}")
87
76
  end
88
77
 
89
78
  # ISO/IEC DIR 2, 16.5.6
@@ -103,6 +92,7 @@ module Asciidoctor
103
92
  def cited_term_style(xmldoc)
104
93
  xmldoc.xpath("//term//xref").each do |x|
105
94
  next unless xmldoc.at("//term[@id = '#{x['target']}']")
95
+
106
96
  x&.previous&.text == " (" and x&.previous&.previous&.name == "em" or
107
97
  style_warning(x, "term citation not preceded with italicised term",
108
98
  x.parent.text)
@@ -111,8 +101,8 @@ module Asciidoctor
111
101
 
112
102
  def doctype_validate(xmldoc)
113
103
  doctype = xmldoc&.at("//bibdata/ext/doctype")&.text
114
- %w(international-standard technical-specification technical-report
115
- publicly-available-specification international-workshop-agreement
104
+ %w(international-standard technical-specification technical-report
105
+ publicly-available-specification international-workshop-agreement
116
106
  guide amendment technical-corrigendum).include? doctype or
117
107
  @log.add("Document Attributes", nil,
118
108
  "#{doctype} is not a recognised document type")
@@ -146,84 +136,6 @@ module Asciidoctor
146
136
  "#{iteration} is not a recognised iteration")
147
137
  end
148
138
 
149
- # DRG directives 3.7; but anticipated by standoc
150
- def subfigure_validate(xmldoc)
151
- xmldoc.xpath("//figure//figure").each do |f|
152
- { footnote: "fn", note: "note", key: "dl" }.each do |k, v|
153
- f.xpath(".//#{v}").each do |n|
154
- @log.add("Style", n, "#{k} is not permitted in a subfigure")
155
- end
156
- end
157
- end
158
- end
159
-
160
- def image_name_prefix(xmldoc)
161
- std = xmldoc&.at("//bibdata/ext/structuredidentifier/project-number") or return
162
- num = xmldoc&.at("//bibdata/docnumber")&.text or return
163
- ed = xmldoc&.at("//bibdata/edition")&.text || "1"
164
- prefix = num
165
- part = std["part"] and prefix += "-#{std['part']}"
166
- prefix += "_ed#{ed}"
167
- amd = std["amendment"] and prefix += "amd#{amd}"
168
- prefix
169
- end
170
-
171
- def image_name_suffix(xmldoc)
172
- case xmldoc&.at("//bibdata/language")&.text
173
- when "fr" then "_f"
174
- when "de" then "_d"
175
- when "ru" then "_r"
176
- when "es" then "_s"
177
- when "ar" then "_a"
178
- when "en" then "_e"
179
- else
180
- "_e"
181
- end
182
- end
183
-
184
- def disjunct_error(i, cond1, cond2, msg1, msg2)
185
- cond1 && !cond2 and @log.add("Style", i, "image name #{i['src']} #{msg1}")
186
- !cond1 && cond2 and @log.add("Style", i, "image name #{i['src']} #{msg2}")
187
- end
188
-
189
- def image_name_validate1(i, prefix)
190
- m = %r[(SL)?#{prefix}fig(?<tab>Tab)?(?<annex>[A-Z])?(Text)?(?<num>\d+)
191
- (?<subfig>[a-z])?(?<key>_key\d+)?(?<lang>_[a-z])?$]x.match(File.basename(i["src"], ".*"))
192
- if m.nil?
193
- @log.add("Style", i, "image name #{i['src']} does not match DRG requirements")
194
- return
195
- end
196
- warn i['src']
197
- disjunct_error(i, i.at("./ancestor::table"), !m[:tab].nil?,
198
- "is under a table but is not so labelled", "is labelled as under a table but is not")
199
- disjunct_error(i, i.at("./ancestor::annex"), !m[:annex].nil?,
200
- "is under an annex but is not so labelled", "is labelled as under an annex but is not")
201
- disjunct_error(i, i.xpath("./ancestor::figure").size > 1, !m[:subfig].nil?,
202
- "does not have a subfigure letter but is a subfigure",
203
- "has a subfigure letter but is not a subfigure")
204
- lang = image_name_suffix(i.document.root)
205
- (m[:lang] || "_e") == lang or @log.add("Style", i, "image name #{i['src']} expected to have suffix #{lang}")
206
- end
207
-
208
- # DRG directives 3.2
209
- def image_name_validate(xmldoc)
210
- prefix = image_name_prefix(xmldoc) or return
211
- xmldoc.xpath("//image").each do |i|
212
- next if i["src"].start_with?("data:")
213
- if /^ISO_\d+_/.match(File.basename(i["src"]))
214
- elsif /^(SL)?#{prefix}fig/.match(File.basename(i["src"]))
215
- image_name_validate1(i, prefix)
216
- else
217
- @log.add("Style", i, "image name #{i['src']} does not match DRG requirements: expect #{prefix}fig")
218
- end
219
- end
220
- end
221
-
222
- def figure_validate(xmldoc)
223
- image_name_validate(xmldoc)
224
- subfigure_validate(xmldoc)
225
- end
226
-
227
139
  def bibdata_validate(doc)
228
140
  doctype_validate(doc)
229
141
  script_validate(doc)
@@ -251,7 +163,7 @@ module Asciidoctor
251
163
  xmldoc.xpath("//bibitem[date/on = '–']").each do |b|
252
164
  b.at("./note[@type = 'Unpublished-Status']") or
253
165
  @log.add("Style", b,
254
- "Reference #{b&.at("./@id")&.text} does not have an "\
166
+ "Reference #{b&.at('./@id')&.text} does not have an "\
255
167
  "associated footnote indicating unpublished status")
256
168
  end
257
169
  end