metanorma-ieee 1.5.7 → 1.6.0

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.
@@ -0,0 +1,100 @@
1
+ module Metanorma
2
+ module Ieee
3
+ class Converter
4
+ IEEE_LOG_MESSAGES = {
5
+ # rubocop:disable Naming/VariableNumber
6
+ "IEEE_2": { category: "Style",
7
+ error: "%s is a 4-digit number in a table column with numbers broken up in threes",
8
+ severity: 2 },
9
+ "IEEE_3": { category: "Style",
10
+ error: "Expected title to start as: %s",
11
+ severity: 2 },
12
+ "IEEE_4": { category: "Style",
13
+ error: "Title contains uncapitalised word other than preposition",
14
+ severity: 2 },
15
+ "IEEE_5": { category: "Document Attributes",
16
+ error: "%s is not a recognised document type",
17
+ severity: 2 },
18
+ "IEEE_6": { category: "Document Attributes",
19
+ error: "%s is not a recognised document subtype",
20
+ severity: 2 },
21
+ "IEEE_7": { category: "Document Attributes",
22
+ error: "%s is not a recognised stage",
23
+ severity: 2 },
24
+ "IEEE_8": { category: "Style",
25
+ error: "Cross-reference contains range, should be separate cross-references",
26
+ severity: 2 },
27
+ "IEEE_9": { category: "Style",
28
+ error: "Undated reference %s should not contain specific elements",
29
+ severity: 2 },
30
+ "IEEE_10": { category: "Style",
31
+ error: "Normative reference %s is not dated.",
32
+ severity: 2 },
33
+ "IEEE_11": { category: "Style",
34
+ error: "Use ordered lists for lists more than two levels deep.",
35
+ severity: 2 },
36
+ "IEEE_12": { category: "Style",
37
+ error: "Ordered lists should not be more than five levels deep.",
38
+ severity: 2 },
39
+ "IEEE_13": { category: "Style",
40
+ error: "Image name %s is expected to be %s",
41
+ severity: 2 },
42
+ #
43
+ "IEEE_15": { category: "Style",
44
+ error: "More than one image in the table cell",
45
+ severity: 2 },
46
+ "IEEE_16": { category: "Style",
47
+ error: "Editorial instruction is missing from change",
48
+ severity: 2 },
49
+ "IEEE_17": { category: "Style",
50
+ error: "'Add' change description should start with _Insert_",
51
+ severity: 2 },
52
+ "IEEE_18": { category: "Style",
53
+ error: "'Delete' change description should start with _Delete_",
54
+ severity: 2 },
55
+ "IEEE_19": { category: "Style",
56
+ error: "'Modify' change description should start with _Change_ or _Replace_",
57
+ severity: 2 },
58
+ "IEEE_20": { category: "Style",
59
+ error: "'Modify' change description for change involving figure or equation should start with _Replace_",
60
+ severity: 2 },
61
+ "IEEE_21": { category: "Style",
62
+ error: "'Modify' change description for change not involving figure or equation should start with _Change_",
63
+ severity: 2 },
64
+ "IEEE_22": { category: "Style",
65
+ error: "Overview clause missing",
66
+ severity: 2 },
67
+ "IEEE_23": { category: "Style",
68
+ error: "Scope subclause missing",
69
+ severity: 2 },
70
+ "IEEE_24": { category: "Style",
71
+ error: "Word Usage subclause missing",
72
+ severity: 2 },
73
+ "IEEE_25": { category: "Style",
74
+ error: "Normative references missing",
75
+ severity: 2 },
76
+ "IEEE_26": { category: "Style",
77
+ error: "Definitions missing",
78
+ severity: 2 },
79
+ "IEEE_27": { category: "Style",
80
+ error: "(section sequencing) %s",
81
+ severity: 2 },
82
+ "IEEE_28": { category: "Style",
83
+ error: "Document must include (references) Normative References",
84
+ severity: 2 },
85
+ #
86
+ "IEEE_30": { category: "Style",
87
+ error: "subclause is only child",
88
+ severity: 2 },
89
+ "IEEE_31": { category: "Style",
90
+ error: "Bibliography must be either the first or the last document annex",
91
+ severity: 2 },
92
+ }.freeze
93
+ # rubocop:enable Naming/VariableNumber
94
+
95
+ def log_messages
96
+ super.merge(IEEE_LOG_MESSAGES)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -28,19 +28,16 @@ module Metanorma
28
28
  def doctype_validate(xmldoc)
29
29
  %w(standard recommended-practice guide whitepaper redline other)
30
30
  .include?(@doctype) or
31
- @log.add("Document Attributes", nil,
32
- "#{@doctype} is not a recognised document type")
31
+ @log.add("IEEE_5", nil, params: [@doctype])
33
32
  docsubtype = xmldoc.at("//bibdata/ext/subdoctype")&.text or return
34
33
  %w(amendment corrigendum erratum document).include? docsubtype or
35
- @log.add("Document Attributes", nil,
36
- "#{docsubtype} is not a recognised document subtype")
34
+ @log.add("IEEE_6", nil, params: [docsubtype])
37
35
  end
38
36
 
39
37
  def stage_validate(xmldoc)
40
38
  stage = xmldoc&.at("//bibdata/status/stage")&.text
41
39
  %w(draft approved superseded withdrawn).include? stage or
42
- @log.add("Document Attributes", nil,
43
- "#{stage} is not a recognised stage")
40
+ @log.add("IEEE_7", nil, params: [stage])
44
41
  end
45
42
 
46
43
  def locality_validate(root)
@@ -52,8 +49,7 @@ module Metanorma
52
49
  def locality_range_validate(root)
53
50
  root.xpath("//eref | xref").each do |e|
54
51
  e.at(".//localityStack[@connective = 'from'] | .//referenceTo") and
55
- @log.add("Style", e, "Cross-reference contains range, " \
56
- "should be separate cross-references")
52
+ @log.add("IEEE_8", e)
57
53
  end
58
54
  end
59
55
 
@@ -61,9 +57,7 @@ module Metanorma
61
57
  def locality_erefs_validate(root)
62
58
  root.xpath("//eref[descendant::locality]").each do |t|
63
59
  if !/[:-](\d+{4})($|-\d\d)/.match?(t["citeas"])
64
- @log.add("Style", t,
65
- "Undated reference #{t['citeas']} should not contain " \
66
- "specific elements")
60
+ @log.add("IEEE_9", t, params: [t["citeas"]])
67
61
  end
68
62
  end
69
63
  end
@@ -76,8 +70,7 @@ module Metanorma
76
70
  def normative_dated_refs(root)
77
71
  root.xpath("//references[@normative = 'true']/bibitem").each do |b|
78
72
  b.at(".//date") or
79
- @log.add("Style", b,
80
- "Normative reference #{b.at('./@anchor')&.text} is not dated.")
73
+ @log.add("IEEE_10", b, params: [b.at("./@anchor")&.text])
81
74
  end
82
75
  end
83
76
 
@@ -91,14 +84,12 @@ module Metanorma
91
84
  doc.xpath("//ul[.//ul//ul]").each do |u|
92
85
  next unless u.ancestors("ul").empty?
93
86
 
94
- @log.add("Style", u,
95
- "Use ordered lists for lists more than two levels deep.")
87
+ @log.add("IEEE_11", u)
96
88
  end
97
89
  doc.xpath("//ol[.//ol//ol//ol//ol//ol]").each do |u|
98
90
  next unless u.ancestors("ol").empty?
99
91
 
100
- @log.add("Style", u,
101
- "Ordered lists should not be more than five levels deep.")
92
+ @log.add("IEEE_12", u)
102
93
  end
103
94
  end
104
95
 
@@ -148,13 +139,12 @@ module Metanorma
148
139
  pref = image_name_prefix(xmldoc)
149
140
  (xmldoc.xpath("//figure") - xmldoc.xpath("//table//figure"))
150
141
  .each do |f|
151
- (i = f.at("./image") and !i["src"]&.start_with?("data:")) or next
152
- num = xrefs.anchor(f["id"], :label)
153
- base = File.basename(i["src"], ".*")
154
- base == "#{pref}_fig#{num}" or
155
- @log.add("Style", i,
156
- "Image name #{base} is expected to be #{pref}_fig#{num}")
157
- end
142
+ (i = f.at("./image") and !i["src"]&.start_with?("data:")) or next
143
+ num = xrefs.anchor(f["id"], :label)
144
+ base = File.basename(i["src"], ".*")
145
+ base == "#{pref}_fig#{num}" or
146
+ @log.add("IEEE_13", i, params: [base, "#{pref}_fig#{num}"])
147
+ end
158
148
  end
159
149
 
160
150
  # Style manual 17.2
@@ -172,8 +162,7 @@ module Metanorma
172
162
  num = tablefigurenumber(t, f, xrefs)
173
163
  base = File.basename(i["src"])
174
164
  base == num or
175
- @log.add("Style", i,
176
- "Image name #{base} is expected to be #{num}")
165
+ @log.add("IEEE_13", i, params: [base, num])
177
166
  end
178
167
  end
179
168
  end
@@ -190,8 +179,7 @@ module Metanorma
190
179
  def table_figure_quantity_validate(xmldoc)
191
180
  xmldoc.xpath("//td[.//image] | //th[.//image]").each do |d|
192
181
  d.xpath(".//image").size > 1 and
193
- @log.add("Style", d,
194
- "More than one image in the table cell")
182
+ @log.add("IEEE_15", d)
195
183
  end
196
184
  end
197
185
 
@@ -203,8 +191,7 @@ module Metanorma
203
191
  amend_validate1(a, desc.text.strip,
204
192
  a.at("./newcontent//figure | " \
205
193
  "./newcontent//formula"))
206
- else @log.add("Style", a,
207
- "Editorial instruction is missing from change")
194
+ else @log.add("IEEE_16", a)
208
195
  end
209
196
  end
210
197
  end
@@ -212,31 +199,21 @@ module Metanorma
212
199
  def amend_validate1(amend, description, figure_or_formula)
213
200
  case amend["change"]
214
201
  when "add" then /^Insert /.match?(description) or
215
- @log.add("Style", amend,
216
- "'Add' change description should start with _Insert_")
202
+ @log.add("IEEE_17", amend)
217
203
  when "delete" then /^Insert /.match?(description) or
218
- @log.add("Style", amend,
219
- "'Delete' change description should start with _Delete_")
204
+ @log.add("IEEE_18", amend)
220
205
  when "modify"
221
206
  amend_validate_modify(amend, description, figure_or_formula)
222
207
  end
223
208
  end
224
209
 
225
- AMD_VALID_MOD = [
226
- "'Modify' change description should start with _Change_ or _Replace_",
227
- "'Modify' change description for change involving figure or equation " \
228
- "should start with _Replace_",
229
- "'Modify' change description for change not involving figure or " \
230
- "equation should start with _Change_",
231
- ].freeze
232
-
233
210
  def amend_validate_modify(amend, description, figure_or_formula)
234
211
  if !/^Change |^Replace/.match?(description)
235
- @log.add("Style", amend, AMD_VALID_MOD[0])
212
+ @log.add("IEEE_19", amend)
236
213
  elsif /^Change /.match?(description)
237
- !figure_or_formula or @log.add("Style", amend, AMD_VALID_MOD[1])
214
+ !figure_or_formula or @log.add("IEEE_20", amend)
238
215
  else
239
- figure_or_formula or @log.add("Style", amend, AMD_VALID_MOD[2])
216
+ figure_or_formula or @log.add("IEEE_21", amend)
240
217
  end
241
218
  end
242
219
  end
@@ -13,15 +13,17 @@ module Metanorma
13
13
 
14
14
  def sections_presence_validate(root)
15
15
  root.at("//sections/clause[@type = 'overview']") or
16
- @log.add("Style", nil, "Overview clause missing")
16
+ @log.add("IEEE_22", nil)
17
17
  root.at("//sections/clause[@type = 'overview']/clause[@type = 'scope']") or
18
- @log.add("Style", nil, "Scope subclause missing")
18
+ @log.add("IEEE_23", nil)
19
19
  root.at("//sections/clause[@type = 'overview']/clause[@type = 'word-usage']") or
20
- @log.add("Style", nil, "Word Usage subclause missing")
20
+ @log.add("IEEE_24", nil)
21
+ # ID = IEEE_24
21
22
  root.at("//references[@normative = 'true']") or
22
- @log.add("Style", nil, "Normative references missing")
23
+ @log.add("IEEE_25", nil)
24
+ # ID = IEEE_25
23
25
  root.at("//terms") or
24
- @log.add("Style", nil, "Definitions missing")
26
+ @log.add("IEEE_26", nil)
25
27
  end
26
28
 
27
29
  def seqcheck(names, msg, accepted)
@@ -30,7 +32,7 @@ module Metanorma
30
32
 
31
33
  test = accepted.map { |a| n.at(a) }
32
34
  if test.all?(&:nil?)
33
- @log.add("Style", nil, msg)
35
+ @log.add("IEEE_27", nil, params: [msg])
34
36
  end
35
37
  names
36
38
  end
@@ -79,13 +81,11 @@ module Metanorma
79
81
  while elem&.name == "annex"
80
82
  elem = names.shift
81
83
  if elem.nil?
82
- @log.add("Style", nil, "Document must include (references) "\
83
- "Normative References")
84
+ @log.add("IEEE_28", nil)
84
85
  end
85
86
  end
86
87
  elem&.at("./self::references[@normative = 'true']") ||
87
- @log.add("Style", nil, "Document must include (references) "\
88
- "Normative References")
88
+ @log.add("IEEE_28", nil)
89
89
  end
90
90
 
91
91
  # Style manual 13.1
@@ -100,7 +100,7 @@ module Metanorma
100
100
  def onlychild_clause_validate(root)
101
101
  root.xpath(Standoc::Utils::SUBCLAUSE_XPATH).each do |c|
102
102
  c.xpath("../clause").size == 1 or next
103
- @log.add("Style", c, "subclause is only child")
103
+ @log.add("IEEE_30", c)
104
104
  end
105
105
  end
106
106
 
@@ -113,8 +113,7 @@ module Metanorma
113
113
  valid = prec.empty? || foll.empty?
114
114
  else valid = false
115
115
  end
116
- valid or @log.add("Style", bib, "Bibliography must be either the first "\
117
- "or the last document annex")
116
+ valid or @log.add("IEEE_31", bib)
118
117
  end
119
118
  end
120
119
  end
@@ -30,7 +30,7 @@ module Metanorma
30
30
 
31
31
  w = msg
32
32
  w += ": #{text}" if text
33
- @log.add("Style", node, w)
33
+ @log.add("STANDOC_48", node, params: [w])
34
34
  end
35
35
 
36
36
  def style(node, text)
@@ -91,9 +91,7 @@ module Metanorma
91
91
 
92
92
  col.each do |x|
93
93
  /^[0-9. ]+$/.match?(x) && /\d{4}/.match?(x) and
94
- @log.add("Style", table,
95
- "#{x} is a 4-digit number in a table column with " \
96
- "numbers broken up in threes")
94
+ @log.add("IEEE_2", table, params: [x])
97
95
  end
98
96
  end
99
97
  end
@@ -122,8 +120,7 @@ module Metanorma
122
120
  target += trial ? "Trial-Use " : ""
123
121
  target += @doctype ? "#{strict_capitalize_phrase(@doctype)} " : ""
124
122
  /^#{target}/.match?(title.text) or
125
- @log.add("Style", title,
126
- "Expected title to start as: #{target}")
123
+ @log.add("IEEE_3", title, params: [target])
127
124
  end
128
125
 
129
126
  def strict_capitalize_phrase(str)
@@ -144,8 +141,7 @@ module Metanorma
144
141
  /^[[:upper:]]/.match?(w) or preposition?(w) or
145
142
  found = true
146
143
  end
147
- found and @log.add("Style", title,
148
- "Title contains uncapitalised word other than preposition")
144
+ found and @log.add("IEEE_4", title)
149
145
  end
150
146
 
151
147
  def preposition?(word)
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module Ieee
3
- VERSION = "1.5.7".freeze
3
+ VERSION = "1.6.0".freeze
4
4
  end
5
5
  end
@@ -16,17 +16,17 @@ extenttemplate:
16
16
  misc: "{{ volume }}, {{issue}}, {{ page }}, {{ duration }}"
17
17
  template:
18
18
  # skip authoritative_identifier, it is inserted in front of formattedref within metanorma
19
- standard: "{{ title }}{% if home_standard %}{%else%}, {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: ', ' }}{% endif %}{% endif %}{% endif %}."
20
- article: "{{creatornames}}, “{{title}},” <em>{{ series }}</em>, {{ extent }}, {{ date }}, {{ labels['viewed'] }}_{{date_accessed}}, {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: ', ' }}{% endif %}{% endif %} ."
21
- book: "{{creatornames}}, <em>{{title}}</em>, {{ edition }}, {{place}}: {{publisher}}, {{date}}, {{ labels['viewed'] }}_{{date_accessed}}, {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: ', ' }}{% endif %}{% endif %} ."
19
+ standard: "{{ title }}{% if home_standard %}{%else%}$$$ {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: '$$$ ' }}{% endif %}{% endif %}{% endif %}$$$"
20
+ article: "{{creatornames}}$$$ “{{title}}$$$|” <em>{{ series }}</em>$$$ {{ extent }}$$$ {{ date }}$$$ {{ labels['viewed'] }}_{{date_accessed}}$$$ {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: '$$$ ' }}{% endif %}{% endif %} $$$"
21
+ book: "{{creatornames}}$$$ <em>{{title}}</em>$$$ {{ edition }}$$$ {{place}}: {{publisher}}$$$ {{date}}$$$ {{ labels['viewed'] }}_{{date_accessed}}$$$ {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: '$$$ ' }}{% endif %}{% endif %} $$$"
22
22
  techreport: book
23
23
  booklet: book
24
24
  manual: book
25
25
  proceedings: book
26
- inproceedings: "{{ creatornames }}, “{{ title }},” <em>{{host_title}}</em>, {{place}}, {{extent}}, {{date}}, {{ labels['viewed'] }}_{{date_accessed}}, {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: ', ' }}{% endif %}{% endif %} ."
27
- inbook: "{{ creatornames }}, “{{ title }},” {{ labels['in'] }} {{ host_creatornames}} ({{ host_role}}) : <em>{{host_title}}</em>, {{place}}: {{publisher}}, {{date}}, {{extent}}, {{ labels['viewed'] }}_{{date_accessed}}, {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: ', ' }}{% endif %}{% endif %} ."
26
+ inproceedings: "{{ creatornames }}$$$ “{{ title }}$$$|” <em>{{host_title}}</em>$$$ {{place}}$$$ {{extent}}$$$ {{date}}$$$ {{ labels['viewed'] }}_{{date_accessed}}$$$ {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: '$$$ ' }}{% endif %}{% endif %} $$$"
27
+ inbook: "{{ creatornames }}$$$ “{{ title }}$$$|” {{ labels['in'] }} {{ host_creatornames}} ({{ host_role}}) : <em>{{host_title}}</em>$$$ {{place}}: {{publisher}}$$$ {{date}}$$$ {{extent}}$$$ {{ labels['viewed'] }}_{{date_accessed}}$$$ {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: '$$$ ' }}{% endif %}{% endif %} $$$"
28
28
  incollection: inbook
29
- thesis: "{{ creatornames }} , “{{ title }},” {{ medium | capitalize }}, {{ publisher }}, {{ date }}, {{ labels['viewed'] }}_{{date_accessed}}, {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: ', ' }}{% endif %}{% endif %} ."
29
+ thesis: "{{ creatornames }} $$$ “{{ title }}$$$|” {{ medium | capitalize }}$$$ {{ publisher }}$$$ {{ date }}$$$ {{ labels['viewed'] }}_{{date_accessed}}$$$ {% if uri %}{{ uri }}{% else %}{% if doi %}DOI: {{ doi | join: '$$$ ' }}{% endif %}{% endif %} $$$"
30
30
  unpublished: thesis
31
31
  misc: thesis
32
32
  website: thesis
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ["lib"]
26
26
  spec.required_ruby_version = Gem::Requirement.new(">= 3.1.0")
27
27
 
28
- spec.add_dependency "metanorma-standoc", "~> 3.1.0"
28
+ spec.add_dependency "metanorma-standoc", "~> 3.2.0"
29
29
  spec.add_dependency "mnconvert", "~> 1.20"
30
30
  spec.add_dependency "pubid"
31
31
 
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
34
34
  spec.add_development_dependency "guard", "~> 2.14"
35
35
  spec.add_development_dependency "guard-rspec", "~> 4.7"
36
+ spec.add_development_dependency "openssl"
36
37
  spec.add_development_dependency "rake", "~> 13.0"
37
38
  spec.add_development_dependency "rspec", "~> 3.6"
38
39
  spec.add_development_dependency "rubocop", "~> 1"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-ieee
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.7
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-10-13 00:00:00.000000000 Z
11
+ date: 2025-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: metanorma-standoc
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.1.0
19
+ version: 3.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 3.1.0
26
+ version: 3.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mnconvert
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '4.7'
111
+ - !ruby/object:Gem::Dependency
112
+ name: openssl
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rake
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -328,6 +342,7 @@ files:
328
342
  - lib/metanorma/ieee/ieee-footnotes.yaml
329
343
  - lib/metanorma/ieee/ieee.rng
330
344
  - lib/metanorma/ieee/isodoc.rng
345
+ - lib/metanorma/ieee/log.rb
331
346
  - lib/metanorma/ieee/processor.rb
332
347
  - lib/metanorma/ieee/relaton-ieee.rng
333
348
  - lib/metanorma/ieee/reqt.rng