metanorma-ieee 0.0.3 → 0.0.4

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.
@@ -93,6 +93,8 @@ module IsoDoc
93
93
  doctype(isoxml, _out)
94
94
  set(:full_doctitle, fulltitle(@metadata[:doctype], draft))
95
95
  set(:abbrev_doctitle, fulltitle(@metadata[:doctype_abbrev], draft))
96
+ prov = isoxml&.at(ns("//bibdata/title[@type='provenance']")) and
97
+ set(:provenance_doctitle, prov.children.to_xml)
96
98
  end
97
99
 
98
100
  def fulltitle(type, draft)
@@ -101,23 +103,6 @@ module IsoDoc
101
103
  title
102
104
  end
103
105
 
104
- def relations(isoxml, _out)
105
- super
106
- relations_get(isoxml, "updates")
107
- relations_get(isoxml, "merges")
108
- end
109
-
110
- def relations_get(isoxml, type)
111
- std = isoxml.xpath(ns("//bibdata/relation[@type = '#{type}']"))
112
- return if std.empty?
113
-
114
- ret = std.map do |x|
115
- x.at(ns(".//docidentifier[@primary = 'true']"))&.text ||
116
- x.at(ns(".//docidentifier"))&.text
117
- end
118
- set(type.to_sym, ret)
119
- end
120
-
121
106
  def ddMMMyyyy(isodate)
122
107
  return nil if isodate.nil?
123
108
 
@@ -23,8 +23,8 @@ module IsoDoc
23
23
  .each_with_object({}) do |b, m|
24
24
  m[b["id"]] =
25
25
  { docid: pref_ref_code(b), type: b["type"],
26
- title: b.at(ns("./title"))&.text ||
27
- b.at(ns("./formattedref"))&.text,
26
+ title: (b.at(ns("./title")) ||
27
+ b.at(ns("./formattedref")))&.text,
28
28
  ord: b.at(ns("./docidentifier[@type = 'metanorma' or "\
29
29
  "@type = 'metanorma-ordinal']")).text }
30
30
  end
@@ -26,25 +26,24 @@ module IsoDoc
26
26
 
27
27
  def unwrap_multidef(coll)
28
28
  if coll.all? do |c|
29
- c.elements.size == 1 && c.elements.first.name == "p"
30
- end
29
+ c.elements.size == 1 && c.elements.first.name == "p"
30
+ end
31
31
  ret = coll.map do |c|
32
32
  c.elements.first.children.to_xml
33
33
  end
34
- "<p>#{ret.join}</p>"
35
- else
36
- coll.map { |c| c.children.to_xml }.join
34
+ return "<p>#{ret.join}</p>"
37
35
  end
36
+ coll.map { |c| c.children.to_xml }.join
38
37
  end
39
38
 
40
39
  def unwrap_definition(docxml)
41
40
  docxml.xpath(ns("//definition/verbal-definition")).each do |v|
42
41
  next unless v.elements.all? { |e| %w(termsource p).include?(e.name) }
43
42
 
44
- s = v.xpath(ns("./termsource"))
45
43
  p = v.xpath(ns("./p"))
46
44
  v.children =
47
- "<p>#{p.map(&:children).map(&:to_xml).join("\n")}</p>#{s.to_xml}"
45
+ "<p>#{p.map(&:children).map(&:to_xml).join("\n")}</p>"\
46
+ "#{v.xpath(ns('./termsource')).to_xml}"
48
47
  end
49
48
  super
50
49
  end
@@ -61,12 +60,13 @@ module IsoDoc
61
60
  def term_related_collapse(coll)
62
61
  prev = 0
63
62
  coll[1..-1].each_with_index do |r, i|
64
- if coll[prev]["type"] == r["type"]
65
- coll[prev].at(ns("./preferred")) << "; #{r.at(ns('./preferred'))
66
- .children.to_xml}"
67
- r.remove
68
- else prev = i
63
+ if coll[prev]["type"] != r["type"]
64
+ prev = i
65
+ next
69
66
  end
67
+ coll[prev].at(ns("./preferred")) << "; #{r.at(ns('./preferred'))
68
+ .children.to_xml}"
69
+ r.remove
70
70
  end
71
71
  end
72
72
 
@@ -74,8 +74,14 @@ module IsoDoc
74
74
  d = term.at(ns("./preferred/expression/name | "\
75
75
  "./preferred/letter-symbol/name | "\
76
76
  "./preferred/graphical-symbol/figure/name | "\
77
- "./preferred/graphical-symbol/figure/@id"))
78
- HTMLEntities.new.decode(d&.text&.strip&.downcase) || "ZZZ"
77
+ "./preferred/graphical-symbol/figure/@id | "\
78
+ "./preferred"))
79
+ f = term.at(ns("./field-of-application")) || term.at(ns("./domain"))
80
+ HTMLEntities.new.decode("#{sort_terms_key1(d)} :: #{sort_terms_key1(f)}")
81
+ end
82
+
83
+ def sort_terms_key1(elem)
84
+ elem&.text&.strip&.downcase || "zzzz"
79
85
  end
80
86
 
81
87
  def term_related_reorder(coll)
@@ -110,8 +116,12 @@ module IsoDoc
110
116
  end
111
117
 
112
118
  def admitted_to_related(docxml)
113
- docxml.xpath(ns("//term/admitted")).each do |a|
114
- admitted_to_related1(a, a.parent.at(ns("./preferred")))
119
+ docxml.xpath(ns("//term")).each do |t|
120
+ t.xpath(ns("./admitted | ./preferred")).each_with_index do |a, i|
121
+ (i.zero? ||
122
+ a.at(ns("./abbreviation-type | ./graphical-symbol"))) and next
123
+ admitted_to_related1(a, t.at(ns("./preferred")))
124
+ end
115
125
  end
116
126
  term_reorder(docxml)
117
127
  end
@@ -217,12 +227,15 @@ module IsoDoc
217
227
  end
218
228
 
219
229
  def merge_second_preferred(term)
220
- prefs = term.xpath(ns("./preferred[expression/name]"))
221
- prefs.size > 1 or return
222
- alts = prefs[1..-1].map do |p|
230
+ pref =
231
+ term.at(ns("./preferred[not(abbreviation-type)]/expression/name"))
232
+ x = term.xpath(ns("./preferred[expression/name][abbreviation-type] | "\
233
+ "./admitted[expression/name][abbreviation-type]"))
234
+ (pref && !x.empty?) or return
235
+ tail = x.map do |p|
223
236
  p.remove.at(ns("./expression/name")).children.to_xml.strip
224
- end
225
- prefs.first.at(ns("./expression/name")) << " (#{alts.join(', ')})"
237
+ end.join(", ")
238
+ pref << " (#{tail})"
226
239
  end
227
240
 
228
241
  def termnote1(elem)
@@ -166,13 +166,26 @@ module IsoDoc
166
166
  ulist.xpath(ns("./li")).each { |list| participants1(list, idx) }
167
167
  ulist.replace(ulist.children)
168
168
  end
169
+ affiliation_header(clause)
170
+ end
171
+
172
+ def affiliation_header(clause)
173
+ clause.xpath(ns(".//p[@type = 'officeorgrepmember']")).each do |p|
174
+ prev = p.previous_element
175
+ prev && prev.name == "p" &&
176
+ prev["type"] == "officeorgrepmember" and next
177
+ p.previous = <<~HDR
178
+ <p type='officeorgrepmemberhdr'><em>Organization
179
+ Represented</em><tab/><em>Name of Representative</em></p>
180
+ HDR
181
+ end
169
182
  end
170
183
 
171
184
  def participants1(list, idx)
172
185
  key = ""
173
186
  map = list.xpath(ns(".//dt | .//dd")).each_with_object({}) do |dtd, m|
174
187
  (dtd.name == "dt" and key = dtd.text) or
175
- m[key] = dtd.text.strip
188
+ m[key] = @c.encode(dtd.text.strip, :hexadecimal)
176
189
  end
177
190
  list.replace(participant_para(map, idx))
178
191
  end
@@ -187,8 +200,12 @@ module IsoDoc
187
200
  end
188
201
 
189
202
  def participant_member_para(map, name, _idx)
190
- (map["company"] and "<p type='officeorgmember'>#{name}</p>") or
191
- "<p type='officemember'>#{name}</p>"
203
+ if map["company"] && (map["name"] || map["surname"])
204
+ pers = map["name"] || "#{map['given']} #{map['surname']}"
205
+ "<p type='officeorgrepmember'>#{name}<tab/>#{pers}</p>"
206
+ elsif map["company"] then "<p type='officeorgmember'>#{name}</p>"
207
+ else "<p type='officemember'>#{name}</p>"
208
+ end
192
209
  end
193
210
 
194
211
  def participant_officeholder_para(map, name, idx)
@@ -46,6 +46,7 @@ module IsoDoc
46
46
  officeholder_style(p)
47
47
  end
48
48
  officemember_style(docxml)
49
+ officeorgrep_style(docxml)
49
50
  three_column_officemembers(docxml
50
51
  .at("//div[@id = 'boilerplate-participants']"))
51
52
  end
@@ -77,6 +78,19 @@ module IsoDoc
77
78
  end
78
79
  end
79
80
 
81
+ def officeorgrep_style(docxml)
82
+ docxml.xpath("//p[@type = 'officeorgrepmemberhdr']").each do |p|
83
+ p["class"] = "IEEEStdsNamesList"
84
+ p["style"] =
85
+ "margin-bottom:6.0pt;tab-stops:right 432.0pt;"
86
+ end
87
+ docxml.xpath("//p[@type = 'officeorgrepmember']").each do |p|
88
+ p["class"] = "IEEEStdsNamesList"
89
+ p["style"] =
90
+ "margin-top:6.0pt;tab-stops:right dotted 432.0pt;"
91
+ end
92
+ end
93
+
80
94
  def three_column_officemembers(div)
81
95
  return unless div
82
96
 
@@ -6,7 +6,7 @@ module Metanorma
6
6
  class Converter < Standoc::Converter
7
7
  def initial_boilerplate(xml, isodoc)
8
8
  intro_boilerplate(xml, isodoc)
9
- super
9
+ super if @document_scheme == "ieee-sa-2021"
10
10
  initial_note(xml)
11
11
  word_usage(xml)
12
12
  participants(xml)
@@ -31,6 +31,8 @@ module Metanorma
31
31
  end
32
32
 
33
33
  def word_usage(xml)
34
+ return unless @document_scheme == "ieee-sa-2021"
35
+
34
36
  n = xml.at("//boilerplate//clause[@id = 'boilerplate_word_usage']")
35
37
  &.remove
36
38
  s = xml.at("//clause[@type = 'overview']")
@@ -122,12 +124,13 @@ module Metanorma
122
124
  end
123
125
 
124
126
  def participants(xml)
125
- populate_participants(xml, "boilerplate-participants-wg",
126
- "working group")
127
- populate_participants(xml, "boilerplate-participants-bg",
128
- "balloting group")
129
- populate_participants(xml, "boilerplate-participants-sb",
130
- "standards board")
127
+ return unless @document_scheme == "ieee-sa-2021"
128
+
129
+ { "boilerplate-participants-wg": "working group",
130
+ "boilerplate-participants-bg": "balloting group",
131
+ "boilerplate-participants-sb": "standards board" }.each do |k, v|
132
+ populate_participants(xml, k.to_s, v)
133
+ end
131
134
  p = xml.at(".//p[@type = 'emeritus_sign']")
132
135
  ul = xml.at("//clause[@id = 'boilerplate-participants-sb']//ul")
133
136
  p && ul and ul.next = p
@@ -153,7 +156,9 @@ module Metanorma
153
156
  end
154
157
 
155
158
  def participants_dl_to_ul(clause)
156
- clause.xpath(".//dl[.//dl]").each do |dl|
159
+ clause.xpath(".//dl").each do |dl|
160
+ next unless dl.ancestors("dl, ul, ol").empty?
161
+
157
162
  dl.name = "ul"
158
163
  dl.xpath("./dt").each(&:remove)
159
164
  dl.xpath("./dd").each { |li| li.name = "li" }
@@ -161,11 +166,10 @@ module Metanorma
161
166
  end
162
167
 
163
168
  def populate_participants2(list)
164
- c = HTMLEntities.new
165
169
  if dl = list.at("./dl")
166
170
  ret = extract_participants(dl)
167
171
  dl.children = ret.keys.map do |k|
168
- "<dt>#{k}</dt><dd>#{c.encode(ret[k], :hexadecimal)}</dd>"
172
+ "<dt>#{k}</dt><dd>#{ret[k]}</dd>"
169
173
  end.join
170
174
  else
171
175
  list.children = "<dl><dt>name</dt><dd>#{list.children.to_xml}</dd>"\
@@ -177,11 +181,45 @@ module Metanorma
177
181
  key = ""
178
182
  map = dlist.xpath("./dt | ./dd").each_with_object({}) do |dtd, m|
179
183
  (dtd.name == "dt" and key = dtd.text.sub(/:+$/, "")) or
180
- m[key.strip.downcase] = dtd.text.strip
184
+ m[key.strip.downcase] =
185
+ @c.encode(@c.decode(dtd.text.strip), :hexadecimal)
181
186
  end
182
187
  map["role"] ||= "member"
183
188
  map
184
189
  end
190
+
191
+ def bibdata_cleanup(xmldoc)
192
+ super
193
+ provenance_title(xmldoc)
194
+ end
195
+
196
+ def provenance_title(xmldoc)
197
+ u = xmldoc.xpath("//bibdata/relation[@type = 'updates']")
198
+ m = xmldoc.xpath("//bibdata/relation[@type = 'merges']")
199
+ u.empty? and m.empty? and return
200
+ ins = xmldoc.at("//bibdata/title")
201
+ t = provenance_title1(u, m)
202
+ ins.next = "<title type='provenance' language='en' "\
203
+ "format='application/xml'>#{t}</title>"
204
+ end
205
+
206
+ def provenance_title1(updates, merges)
207
+ ret = ""
208
+ u = @isodoc.i18n.boolean_conj(tm_id_extract(updates), "and")
209
+ m = @isodoc.i18n.boolean_conj(tm_id_extract(merges), "and")
210
+ u.empty? or ret += "Revision of #{u}"
211
+ !u.empty? && !m.empty? and ret += "<br/>"
212
+ m.empty? or ret += "Incorporates #{m}"
213
+ ret
214
+ end
215
+
216
+ def tm_id_extract(relations)
217
+ relations.map do |u|
218
+ u.at("./bibitem/docidentifier[@scope = 'trademark']") ||
219
+ u.at("./bibitem/docidentifier[@primary = 'true']") ||
220
+ u.at("./bibitem/docidentifier")
221
+ end.map(&:text)
222
+ end
185
223
  end
186
224
  end
187
225
  end
@@ -77,7 +77,7 @@ module Metanorma
77
77
  .each_with_object({}) do |b, m|
78
78
  n = b.at("./contributor[role/@type = 'publisher']/organization/name")
79
79
  n&.text == "Institute of Electrical and Electronics Engineers" and
80
- m[b["id"]] = true
80
+ m[b["id"]] = b.at("./docidentifier[@scope = 'trademark']")&.text
81
81
  end
82
82
  trademark_ieee_erefs1(xmldoc, "//preface//eref", ieee)
83
83
  trademark_ieee_erefs1(xmldoc, "//sections//eref | //annex//eref", ieee)
@@ -86,7 +86,7 @@ module Metanorma
86
86
  def trademark_ieee_erefs1(xmldoc, path, ieee)
87
87
  xmldoc.xpath(path).each_with_object({}) do |e, m|
88
88
  ieee[e["bibitemid"]] or next
89
- m[e["bibitemid"]] or e["citeas"] += "\u2122"
89
+ m[e["bibitemid"]] or e["citeas"] = ieee[e["bibitemid"]]
90
90
  m[e["bibitemid"]] = true
91
91
  end
92
92
  end
@@ -113,6 +113,14 @@ module Metanorma
113
113
  "<docidentifier type='metanorma-ordinal'>[B#{idx}]</docidentifier>"
114
114
  end
115
115
  end
116
+
117
+ def select_docid(ref)
118
+ ret = super
119
+ if %w(standard techreport).include?(ref["type"]) then ret
120
+ else
121
+ ref.at("./docidentifier[@type = 'metanorma-ordinal']") || ret
122
+ end
123
+ end
116
124
  end
117
125
  end
118
126
  end
@@ -16,6 +16,7 @@ module Metanorma
16
16
 
17
17
  def init(node)
18
18
  super
19
+ @document_scheme ||= "ieee-sa-2021"
19
20
  @hierarchical_assets = node.attr("hierarchical-object-numbering")
20
21
  end
21
22
 
@@ -27,9 +27,15 @@
27
27
  </define>
28
28
  <define name="editorialgroup">
29
29
  <element name="editorialgroup">
30
- <ref name="society"/>
31
- <ref name="balloting-group"/>
32
- <ref name="working-group"/>
30
+ <optional>
31
+ <ref name="society"/>
32
+ </optional>
33
+ <optional>
34
+ <ref name="balloting-group"/>
35
+ </optional>
36
+ <optional>
37
+ <ref name="working-group"/>
38
+ </optional>
33
39
  <oneOrMore>
34
40
  <ref name="committee"/>
35
41
  </oneOrMore>
@@ -52,7 +58,9 @@
52
58
  <optional>
53
59
  <ref name="trialuse"/>
54
60
  </optional>
55
- <ref name="editorialgroup"/>
61
+ <optional>
62
+ <ref name="editorialgroup"/>
63
+ </optional>
56
64
  <zeroOrMore>
57
65
  <ref name="ics"/>
58
66
  </zeroOrMore>
@@ -1285,7 +1285,12 @@
1285
1285
  </define>
1286
1286
  <define name="span">
1287
1287
  <element name="span">
1288
- <attribute name="class"/>
1288
+ <optional>
1289
+ <attribute name="class"/>
1290
+ </optional>
1291
+ <optional>
1292
+ <attribute name="style"/>
1293
+ </optional>
1289
1294
  <oneOrMore>
1290
1295
  <ref name="TextElement"/>
1291
1296
  </oneOrMore>
@@ -108,7 +108,7 @@
108
108
  </element>
109
109
  </define>
110
110
  <define name="label">
111
- <element name="label">
111
+ <element name="identifier">
112
112
  <oneOrMore>
113
113
  <ref name="TextElement"/>
114
114
  </oneOrMore>
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module IEEE
3
- VERSION = "0.0.3".freeze
3
+ VERSION = "0.0.4".freeze
4
4
  end
5
5
  end
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.require_paths = ["lib"]
25
25
  spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
26
26
 
27
- spec.add_dependency "metanorma-standoc", "~> 2.1.0"
27
+ spec.add_dependency "metanorma-standoc", "~> 2.2.0"
28
28
 
29
29
  spec.add_development_dependency "debug"
30
30
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
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: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-18 00:00:00.000000000 Z
11
+ date: 2022-08-08 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: 2.1.0
19
+ version: 2.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: 2.1.0
26
+ version: 2.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: debug
29
29
  requirement: !ruby/object:Gem::Requirement