metanorma-ieee 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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