relaton-ieee 1.19.0 → 1.19.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e671fb3b9fe9adc6d69c46f8d5757dd73e35dd324df9516eda63452ca5c3e8d
4
- data.tar.gz: aa265d86a448bfdd00b893f93b8008f3fb22794419f6ecf63bcf0932bb4af46e
3
+ metadata.gz: 295351404fc4f7272682fa1dff9dbfdaa43c9b0846e52f4891d5340136b92dda
4
+ data.tar.gz: b3d70bf86c583d09d000852c0669c74fb72c3b892553ab5d127f123ec37d8d5c
5
5
  SHA512:
6
- metadata.gz: 5f690ba8cc419d3065b62bc2a5cc3dfd195a3d892219a05bf644e5a5e6f7ad081ce4d5486e5e65ee872a3640e709c1c0f639d7abd604139af5f18fd715591e0f
7
- data.tar.gz: 5774082f3f48195883cdba7fa4d5cb9e092049405513f69c790db981ff159234827d16d698e4c57cc953eec0d4c15fe96359880e350eff21872f48af69768590
6
+ metadata.gz: ec9f90d5dcd6c4817222fd655de5fa6f05af253ef648cd25611458d8759dfb9a915fb84eb98d91bb43bbdde96944dfc23cd5221cf8af21940eb8c37527ad0f8c
7
+ data.tar.gz: d0f32bb45d68aa4410859c74468abf22e2604da838fc213beae327911e792c16b996f7f32ee7050b51a4655981e0bdde5fc80d317976d8121a1a59176cc518ca
data/.gitignore CHANGED
@@ -12,5 +12,5 @@
12
12
  .rspec_status
13
13
  .rubocop-https---raw-githubusercontent-com-riboseinc-oss-guides-master-ci-rubocop-yml
14
14
  .vscode/
15
- ieee-rawbib/
15
+ ieee-rawbib
16
16
  Gemfile.lock
@@ -1,5 +1,5 @@
1
1
  require "zip"
2
- require "relaton_ieee/data_parser"
2
+ require "relaton_ieee/idams_parser"
3
3
  require "relaton_ieee/rawbib_id_parser"
4
4
 
5
5
  module RelatonIeee
@@ -88,27 +88,25 @@ module RelatonIeee
88
88
  # @param [String] filename source file
89
89
  #
90
90
  def fetch_doc(xml, filename) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
91
- doc = Nokogiri::XML(xml).at("/publication")
92
- unless doc
91
+ begin
92
+ doc = Ieee::Idams::Publication.from_xml(xml)
93
+ rescue StandardError
93
94
  Util.warn "Empty file: `#{filename}`"
94
95
  return
95
96
  end
96
- stdid = doc.at("./publicationinfo/standard_id")&.text
97
- return if stdid == "0"
97
+ return if doc.publicationinfo&.standard_id == "0"
98
98
 
99
- fetcher = DataParser.new doc, self
100
- bib = fetcher.parse
99
+ bib = IdamsParser.new(doc, self).parse
101
100
  if bib.docnumber.nil?
102
- nt = doc&.at("./normtitle")&.text
103
- Util.warn "PubID parse error. Normtitle: `#{nt}`, file: `#{filename}`"
101
+ Util.warn "PubID parse error. Normtitle: `#{doc.normtitle}`, file: `#{filename}`"
104
102
  return
105
103
  end
106
- amsid = doc.at("./publicationinfo/amsid").text
104
+ amsid = doc.publicationinfo.amsid
107
105
  if backrefs.value?(bib.docidentifier[0].id) && /updates\.\d+/ !~ filename
108
106
  oamsid = backrefs.key bib.docidentifier[0].id
109
107
  Util.warn "Document exists ID: `#{bib.docidentifier[0].id}` AMSID: " \
110
108
  "`#{amsid}` source: `#{filename}`. Other AMSID: `#{oamsid}`"
111
- if bib.docidentifier[0].id.include?(doc.at("./publicationinfo/stdnumber").text)
109
+ if bib.docidentifier.find(&:primary).id.include?(doc.publicationinfo.stdnumber)
112
110
  save_doc bib # rewrite file if the PubID matches to the stdnumber
113
111
  backrefs[amsid] = bib.docidentifier[0].id
114
112
  end
@@ -125,9 +123,9 @@ module RelatonIeee
125
123
  # @param [Nokogiri::XML::Element] amsid relation data
126
124
  #
127
125
  def add_crossref(docnumber, amsid)
128
- return if RELATION_TYPES[amsid[:type]] == false
126
+ return if RELATION_TYPES[amsid.type] == false
129
127
 
130
- ref = { amsid: amsid.text, type: amsid[:type] }
128
+ ref = { amsid: amsid.date_string, type: amsid.type }
131
129
  if @crossrefs[docnumber]
132
130
  @crossrefs[docnumber] << ref
133
131
  else @crossrefs[docnumber] = [ref]
@@ -0,0 +1,252 @@
1
+ require "ieee-idams"
2
+
3
+ module RelatonIeee
4
+ class IdamsParser
5
+ ATTRS = %i[
6
+ docnumber title date docid contributor abstract copyright docstatus
7
+ relation link keyword ics editorialgroup standard_status standard_modified
8
+ pubstatus holdstatus doctype
9
+ ].freeze
10
+
11
+ def initialize(doc, fetcher)
12
+ @doc = doc
13
+ @fetcher = fetcher
14
+ end
15
+
16
+ #
17
+ # Parse IEEE document
18
+ #
19
+ # @return [RelatonIeee::IeeeBibliographicItem]
20
+ #
21
+ def parse
22
+ args = { type: "standard", language: ["en"], script: ["Latn"] }
23
+ ATTRS.each { |attr| args[attr] = send("parse_#{attr}") }
24
+ IeeeBibliographicItem.new(**args)
25
+ end
26
+
27
+ def parse_docnumber
28
+ docnumber
29
+ end
30
+
31
+ #
32
+ # Parse docnumber
33
+ #
34
+ # @return [String] PubID
35
+ #
36
+ def docnumber
37
+ @docnumber ||= pubid&.to_id
38
+ end
39
+
40
+ #
41
+ # Create PubID
42
+ #
43
+ # @return [RelatonIeee::RawbibIdParser] PubID
44
+ #
45
+ def pubid
46
+ @pubid ||= begin
47
+ normtitle = @doc.normtitle
48
+ stdnumber = @doc.publicationinfo.stdnumber
49
+ RawbibIdParser.parse(normtitle, stdnumber)
50
+ end
51
+ end
52
+
53
+ #
54
+ # Parse title
55
+ #
56
+ # @return [Array<RelatonBib::TypedTitleString>]
57
+ #
58
+ def parse_title
59
+ @doc.btitle.map { |args| RelatonBib::TypedTitleString.new(**args) }
60
+ end
61
+
62
+ #
63
+ # Parse date
64
+ #
65
+ # @return [Array<RelatonBib::BibliographicDate>]
66
+ #
67
+ def parse_date
68
+ @doc.bdate.map { |args| RelatonBib::BibliographicDate.new(**args) }
69
+ end
70
+
71
+ #
72
+ # Parse identifiers
73
+ #
74
+ # @return [Array<RelatonBib::DocumentIdentifier>]
75
+ #
76
+ def parse_docid # rubocop:disable Metrics/MethodLength
77
+ ids = @doc.isbn_doi
78
+
79
+ ids.unshift(id: pubid.to_s(trademark: true), scope: "trademark", type: "IEEE", primary: true)
80
+ ids.unshift(id: pubid.to_s, type: "IEEE", primary: true)
81
+
82
+ ids.map { |dcid| RelatonBib::DocumentIdentifier.new(**dcid) }
83
+ end
84
+
85
+ #
86
+ # Parse contributors
87
+ #
88
+ # @return [Array<RelatonBib::ContributionInfo>]
89
+ #
90
+ def parse_contributor
91
+ name, addr = @doc.contrib_name_addr { |args| RelatonBib::Address.new(**args) }
92
+
93
+ entity = create_org name, addr
94
+ [RelatonBib::ContributionInfo.new(entity: entity, role: [type: "publisher"])]
95
+ end
96
+
97
+ #
98
+ # Parse abstract
99
+ #
100
+ # @return [Array<RelatonBib::FormattedString>]
101
+ #
102
+ def parse_abstract
103
+ @doc.volume.article.articleinfo.abstract.map do |abs|
104
+ RelatonBib::FormattedString.new(content: abs.value, language: "en", script: "Latn")
105
+ end
106
+ end
107
+
108
+ #
109
+ # Parse copyright
110
+ #
111
+ # @return [Array<RelatonBib::CopyrightAssociation>]
112
+ #
113
+ def parse_copyright
114
+ @doc.copyright.map do |owner, year|
115
+ contrib = owner.map { |own| RelatonBib::ContributionInfo.new entity: create_org(own) }
116
+ RelatonBib::CopyrightAssociation.new(owner: contrib, from: year)
117
+ end
118
+ end
119
+
120
+ #
121
+ # Parse status
122
+ #
123
+ # @return [RelatonIee::DocumentStatus, nil]
124
+ #
125
+ def parse_docstatus
126
+ @doc.docstatus { |args| DocumentStatus.new(**args) }
127
+ end
128
+
129
+ #
130
+ # Parse relation
131
+ #
132
+ # @return [RelatonBib::DocRelationCollection]
133
+ #
134
+ def parse_relation # rubocop:disable Metrics/AbcSize
135
+ rels = []
136
+ @doc.publicationinfo.standard_relationship&.each do |relation|
137
+ if (ref = @fetcher.backrefs[relation.date_string])
138
+ rel = @fetcher.create_relation(relation.type, ref)
139
+ rels << rel if rel
140
+ elsif !relation.date_string.include?("Inactive Date") && docnumber
141
+ @fetcher.add_crossref(docnumber, relation)
142
+ end
143
+ end
144
+ RelatonBib::DocRelationCollection.new rels
145
+ end
146
+
147
+ #
148
+ # Parce link
149
+ #
150
+ # @return [Array<RelatonBib::TypedUri>]
151
+ #
152
+ def parse_link
153
+ @doc.link { |url| RelatonBib::TypedUri.new(content: url, type: "src") }
154
+ end
155
+
156
+ #
157
+ # Parse keyword
158
+ #
159
+ # @return [Array<Strign>]
160
+ #
161
+ def parse_keyword
162
+ @doc.keyword
163
+ end
164
+
165
+ #
166
+ # Parse ICS
167
+ #
168
+ # @return [Array<RelatonBib::ICS>]
169
+ #
170
+ def parse_ics
171
+ @doc.ics { |ics| RelatonBib::ICS.new(**ics) }
172
+ end
173
+
174
+ #
175
+ # Parse editorialgroup
176
+ #
177
+ # @return [RelatonIeee::EditorialGroup, nil] editorialgroup or nil
178
+ #
179
+ def parse_editorialgroup
180
+ @doc.editorialgroup { |committee| EditorialGroup.new committee: committee }
181
+ end
182
+
183
+ #
184
+ # Parse standard status
185
+ #
186
+ # @return [String, nil] standard status or nil
187
+ #
188
+ def parse_standard_status
189
+ @doc.publicationinfo.standard_status
190
+ end
191
+
192
+ #
193
+ # Parse standard modifier
194
+ #
195
+ # @return [String, nil] standard modifier or nil
196
+ #
197
+ def parse_standard_modified
198
+ @doc.standard_modifier
199
+ end
200
+
201
+ #
202
+ # Parse pubstatus
203
+ #
204
+ # @return [String, nil] pubstatus or nil
205
+ #
206
+ def parse_pubstatus
207
+ @doc.publicationinfo.pubstatus
208
+ end
209
+
210
+ #
211
+ # Pasrse holdstatus
212
+ #
213
+ # @return [String, nil] holdstatus or nil
214
+ #
215
+ def parse_holdstatus
216
+ @doc.publicationinfo.holdstatus
217
+ end
218
+
219
+ #
220
+ # Parse doctype
221
+ #
222
+ # @return [String] doctype
223
+ #
224
+ def parse_doctype
225
+ DocumentType.new type: @doc.doctype
226
+ end
227
+
228
+ private
229
+
230
+ #
231
+ # Create organization
232
+ #
233
+ # @param [String] name organization's name
234
+ # @param [Array<Hash>] addr address
235
+ #
236
+ # @return [RelatonBib::Organization]
237
+ def create_org(name, addr = []) # rubocop:disable Metrics/MethodLength
238
+ case name
239
+ when "IEEE"
240
+ abbr = name
241
+ n = "Institute of Electrical and Electronics Engineers"
242
+ url = "http://www.ieee.org"
243
+ when "ANSI"
244
+ abbr = name
245
+ n = "American National Standards Institute"
246
+ url = "https://www.ansi.org"
247
+ else n = name
248
+ end
249
+ RelatonBib::Organization.new(name: n, abbreviation: abbr, url: url, contact: addr)
250
+ end
251
+ end
252
+ end
@@ -456,7 +456,7 @@ module RelatonIeee
456
456
  PubId.new(publisher: $1, number: $2)
457
457
 
458
458
  else
459
- Util.warn %{Use stdnumber "#{stdnumber}" for nortitle "#{normtitle}"}
459
+ Util.warn %{Use stdnumber "#{stdnumber}" for normtitle "#{normtitle}"}
460
460
  PubId.new(publisher: "IEEE", number: stdnumber)
461
461
  end
462
462
  rescue ArgumentError => e
@@ -1,3 +1,3 @@
1
1
  module RelatonIeee
2
- VERSION = "1.19.0".freeze
2
+ VERSION = "1.19.2".freeze
3
3
  end
data/relaton_ieee.gemspec CHANGED
@@ -32,6 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.require_paths = ["lib"]
33
33
 
34
34
  spec.add_dependency "faraday", "~> 2.7.0"
35
+ spec.add_dependency "ieee-idams", "~> 0.2.10"
35
36
  spec.add_dependency "mini_portile2", "~> 2.8.0"
36
37
  spec.add_dependency "relaton-bib", "~> 1.19.0"
37
38
  spec.add_dependency "relaton-index", "~> 0.2.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relaton-ieee
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.0
4
+ version: 1.19.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-03 00:00:00.000000000 Z
11
+ date: 2024-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.7.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: ieee-idams
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.10
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.10
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: mini_portile2
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -93,7 +107,6 @@ files:
93
107
  - ".gitignore"
94
108
  - ".rspec"
95
109
  - ".rubocop.yml"
96
- - 3185.zip
97
110
  - Gemfile
98
111
  - LICENSE.txt
99
112
  - README.adoc
@@ -110,11 +123,11 @@ files:
110
123
  - lib/relaton_ieee/balloting_group.rb
111
124
  - lib/relaton_ieee/bibxml_parser.rb
112
125
  - lib/relaton_ieee/data_fetcher.rb
113
- - lib/relaton_ieee/data_parser.rb
114
126
  - lib/relaton_ieee/document_status.rb
115
127
  - lib/relaton_ieee/document_type.rb
116
128
  - lib/relaton_ieee/editorial_group.rb
117
129
  - lib/relaton_ieee/hash_converter.rb
130
+ - lib/relaton_ieee/idams_parser.rb
118
131
  - lib/relaton_ieee/ieee_bibliographic_item.rb
119
132
  - lib/relaton_ieee/ieee_bibliography.rb
120
133
  - lib/relaton_ieee/processor.rb
data/3185.zip DELETED
Binary file
@@ -1,350 +0,0 @@
1
- module RelatonIeee
2
- class DataParser
3
- DATETYPES = { "OriginalPub" => "created", "ePub" => "published",
4
- "LastInspecUpd" => "updated" }.freeze
5
- ATTRS = %i[
6
- docnumber title date docid contributor abstract copyright docstatus
7
- relation link keyword ics editorialgroup standard_status standard_modified
8
- pubstatus holdstatus doctype
9
- ].freeze
10
-
11
- attr_reader :doc, :fetcher
12
-
13
- #
14
- # Create RelatonIeee::DataParser instance
15
- #
16
- # @param [Nokogiri::XML::Element] doc document
17
- # @param [RelatonIeee::DataFetcher] fetcher
18
- #
19
- def initialize(doc, fetcher)
20
- @doc = doc
21
- @fetcher = fetcher
22
- end
23
-
24
- #
25
- # Parse IEEE document
26
- #
27
- # @param [Nokogiri::XML::Element] doc document
28
- # @param [RelatonIeee::DataFetcher] fetcher <description>
29
- #
30
- # @return [RelatonIeee::IeeeBibliographicItem]
31
- #
32
- def self.parse(doc, fetcher)
33
- new(doc, fetcher).parse
34
- end
35
-
36
- #
37
- # Parse IEEE document
38
- #
39
- # @return [RelatonIeee::IeeeBibliographicItem]
40
- #
41
- def parse
42
- args = { type: "standard", language: ["en"], script: ["Latn"] }
43
- ATTRS.each { |attr| args[attr] = send("parse_#{attr}") }
44
- IeeeBibliographicItem.new(**args)
45
- end
46
-
47
- #
48
- # Parse title
49
- #
50
- # @return [Array<RelatonBib::TypedTitleString>]
51
- #
52
- def parse_title
53
- t = []
54
- content = CGI.unescapeHTML doc.at("./volume/article/title").text
55
- if content =~ /\A(.+)\s[-\u2014]\sredline\z/i
56
- t << RelatonBib::TypedTitleString.new(content: $1, type: "title-main")
57
- end
58
- t << RelatonBib::TypedTitleString.new(content: content, type: "main")
59
- end
60
-
61
- #
62
- # Parse date
63
- #
64
- # @return [Array<RelatonBib::BibliographicDate>]
65
- #
66
- def parse_date # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
67
- dates = doc.xpath("./volume/article/articleinfo/date").map do |d|
68
- da = [d.at("./year").text]
69
- m = d.at("./month")&.text
70
- if m
71
- /^(?:(?<day>\d{1,2})\s)?(?<mon>\w+)/ =~ m
72
- month = Date::ABBR_MONTHNAMES.index(mon) || m
73
- da << month.to_s.rjust(2, "0")
74
- end
75
- day = d.at("./day")&.text || day
76
- da << day.rjust(2, "0") if day
77
- on = da.compact.join "-"
78
- RelatonBib::BibliographicDate.new type: DATETYPES[d[:datetype]], on: on
79
- end
80
- pad = doc.at("./publicationinfo/PubApprovalDate")
81
- if pad
82
- issued = parse_date_string pad.text
83
- dates << RelatonBib::BibliographicDate.new(type: "issued", on: issued)
84
- end
85
- dates
86
- end
87
-
88
- #
89
- # Convert date string with month name to numeric date
90
- #
91
- # @param [String] date source date
92
- #
93
- # @return [String] numeric date
94
- #
95
- def parse_date_string(date)
96
- case date
97
- when /^\d{4}$/ then date
98
- when /^\d{1,2}\s\w+\.?\s\d{4}/ then Date.parse(date).to_s
99
- end
100
- end
101
-
102
- #
103
- # Parse identifiers
104
- #
105
- # @return [Array<RelatonBib::DocumentIdentifier>]
106
- #
107
- def parse_docid # rubocop:disable Metrics/MethodLength
108
- ids = [
109
- { id: pubid.to_s, type: "IEEE", primary: true },
110
- { id: pubid.to_s(trademark: true), scope: "trademark", type: "IEEE", primary: true },
111
- ]
112
- isbn = doc.at("./publicationinfo/isbn")
113
- ids << { id: isbn.text, type: "ISBN" } if isbn
114
- doi = doc.at("./volume/article/articleinfo/articledoi")
115
- ids << { id: doi.text, type: "DOI" } if doi
116
- ids.map do |dcid|
117
- RelatonBib::DocumentIdentifier.new(**dcid)
118
- end
119
- end
120
-
121
- #
122
- # Create PubID
123
- #
124
- # @return [RelatonIeee::RawbibIdParser] PubID
125
- #
126
- def pubid
127
- @pubid ||= begin
128
- normtitle = doc.at("./normtitle").text
129
- stdnumber = doc.at("./publicationinfo/stdnumber")&.text
130
- RawbibIdParser.parse(normtitle, stdnumber)
131
- end
132
- end
133
-
134
- def parse_docnumber
135
- docnumber
136
- end
137
-
138
- #
139
- # Parse docnumber
140
- #
141
- # @return [String] PubID
142
- #
143
- def docnumber
144
- @docnumber ||= pubid&.to_id # doc.at("./publicationinfo/stdnumber").text
145
- end
146
-
147
- #
148
- # Parse contributors
149
- #
150
- # @return [Array<RelatonBib::ContributionInfo>]
151
- #
152
- def parse_contributor # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
153
- doc.xpath("./publicationinfo/publisher").map do |contrib|
154
- n = contrib.at("./publishername").text
155
- addr = contrib.xpath("./address").each_with_object([]) do |adr, ob|
156
- city, country, state = parse_country_city adr
157
- next unless city && country
158
-
159
- ob << RelatonBib::Address.new(street: [], city: city, state: state, country: country)
160
- end
161
- e = create_org n, addr
162
- RelatonBib::ContributionInfo.new entity: e, role: [type: "publisher"]
163
- end
164
- end
165
-
166
- def parse_country_city(address)
167
- city = address.at("./city")
168
- return unless city
169
-
170
- city, state = city.text.split(", ")
171
- country = address.at("./country")&.text || "USA"
172
- [city, country, state]
173
- end
174
-
175
- #
176
- # Create organization
177
- #
178
- # @param [String] name organization's name
179
- # @param [Array<Hash>] addr address
180
- #
181
- # @return [RelatonBib::Organization]
182
- def create_org(name, addr = []) # rubocop:disable Metrics/MethodLength
183
- case name
184
- when "IEEE"
185
- abbr = name
186
- n = "Institute of Electrical and Electronics Engineers"
187
- url = "http://www.ieee.org"
188
- when "ANSI"
189
- abbr = name
190
- n = "American National Standards Institute"
191
- url = "https://www.ansi.org"
192
- else n = name
193
- end
194
- RelatonBib::Organization.new(
195
- name: n, abbreviation: abbr, url: url, contact: addr,
196
- )
197
- end
198
-
199
- #
200
- # Parse abstract
201
- #
202
- # @return [Array<RelatonBib::FormattedString>]
203
- #
204
- def parse_abstract
205
- doc.xpath("./volume/article/articleinfo/abstract")[0...1].map do |a|
206
- RelatonBib::FormattedString.new(
207
- content: a.text, language: "en", script: "Latn",
208
- )
209
- end
210
- end
211
-
212
- #
213
- # Parse copyright
214
- #
215
- # @return [Array<RelatonBib::CopyrightAssociation>]
216
- #
217
- def parse_copyright
218
- doc.xpath("./publicationinfo/copyrightgroup/copyright").map do |c|
219
- owner = c.at("./holder").text.split("/").map do |own|
220
- RelatonBib::ContributionInfo.new entity: create_org(own)
221
- end
222
- RelatonBib::CopyrightAssociation.new(
223
- owner: owner, from: c.at("./year").text,
224
- )
225
- end
226
- end
227
-
228
- #
229
- # Parse status
230
- #
231
- # @return [RelatonIee::DocumentStatus, nil]
232
- #
233
- def parse_docstatus
234
- st = parse_standard_modified
235
- return unless %w[Draft Approved Superseded Withdrawn].include?(st)
236
-
237
- DocumentStatus.new stage: st.downcase
238
- end
239
-
240
- #
241
- # Parse relation
242
- #
243
- # @return [RelatonBib::DocRelationCollection]
244
- #
245
- def parse_relation # rubocop:disable Metrics/AbcSize
246
- rels = []
247
- doc.xpath("./publicationinfo/standard_relationship").each do |r|
248
- if (ref = fetcher.backrefs[r.text])
249
- rel = fetcher.create_relation(r[:type], ref)
250
- rels << rel if rel
251
- elsif !"Inactive Date".include?(r) && docnumber
252
- fetcher.add_crossref(docnumber, r)
253
- end
254
- end
255
- RelatonBib::DocRelationCollection.new rels
256
- end
257
-
258
- #
259
- # Parce link
260
- #
261
- # @return [Array<RelatonBib::TypedUri>]
262
- #
263
- def parse_link
264
- doc.xpath("./volume/article/articleinfo/amsid").map do |id|
265
- l = "https://ieeexplore.ieee.org/document/#{id.text}"
266
- RelatonBib::TypedUri.new content: l, type: "src"
267
- end
268
- end
269
-
270
- #
271
- # Parse keyword
272
- #
273
- # @return [Array<Strign>]
274
- #
275
- def parse_keyword
276
- doc.xpath(
277
- "./volume/article/articleinfo/keywordset/keyword/keywordterm",
278
- ).map &:text
279
- end
280
-
281
- #
282
- # Parse ICS
283
- #
284
- # @return [Array<RelatonBib::ICS>]
285
- #
286
- def parse_ics
287
- doc.xpath("./publicationinfo/icscodes/code_term").map do |ics|
288
- RelatonBib::ICS.new code: ics[:codenum], text: ics.text
289
- end
290
- end
291
-
292
- #
293
- # Parse editorialgroup
294
- #
295
- # @return [RelatonIeee::EditorialGroup, nil] editorialgroup or nil
296
- #
297
- def parse_editorialgroup
298
- committee = doc.xpath(
299
- "./publicationinfo/pubsponsoringcommitteeset/pubsponsoringcommittee",
300
- ).map &:text
301
- EditorialGroup.new committee: committee if committee.any?
302
- end
303
-
304
- #
305
- # Parse standard status
306
- #
307
- # @return [String, nil] standard status or nil
308
- #
309
- def parse_standard_status
310
- doc.at("./publicationinfo/standard_status")&.text
311
- end
312
-
313
- #
314
- # Parse standard modifier
315
- #
316
- # @return [String, nil] standard modifier or nil
317
- #
318
- def parse_standard_modified
319
- doc.at("./publicationinfo/standardmodifierset/standard_modifier")&.text
320
- end
321
-
322
- #
323
- # Parse pubstatus
324
- #
325
- # @return [String, nil] pubstatus or nil
326
- #
327
- def parse_pubstatus
328
- doc.at("./publicationinfo/pubstatus")&.text
329
- end
330
-
331
- #
332
- # Pasrse holdstatus
333
- #
334
- # @return [String, nil] holdstatus or nil
335
- #
336
- def parse_holdstatus
337
- doc.at("./publicationinfo/holdstatus")&.text
338
- end
339
-
340
- #
341
- # Parse doctype
342
- #
343
- # @return [String] doctype
344
- #
345
- def parse_doctype
346
- type = parse_standard_modified == "Redline" ? "redline" : "standard"
347
- DocumentType.new type: type
348
- end
349
- end
350
- end