relaton-bib 1.9.18 → 1.9.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/relaton_bib/bibliographic_date.rb +13 -5
- data/lib/relaton_bib/bibliographic_item.rb +19 -12
- data/lib/relaton_bib/bibxml_parser.rb +21 -11
- data/lib/relaton_bib/contributor.rb +6 -6
- data/lib/relaton_bib/organization.rb +6 -5
- data/lib/relaton_bib/series.rb +4 -4
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib/xml_parser.rb +24 -20
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d003dbfecade683b1474dfc3923c2210997574d956f3c96ef0b7b0f113100d66
|
4
|
+
data.tar.gz: 6829735611e2ad3807ecb8014b6dddc115f8a2b8799328a11a7b7a229174a49c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbb7e6611505b14b7b321893dd4c1941e91b0d52cd2de4ea4f6fe083e1e2378c6f8c34a6fe3c39bb9d028ee81e5548ba435a893483c6e42e16f01030dd230eaa
|
7
|
+
data.tar.gz: 01aef015aefc3a321442118ccafd9ae310e9fccab9f57bce7d4e3e2c8c0abf70b9b5d4a1ad3877866daabc2054f572fec72be93311e7d66446c77f119b4ce781
|
@@ -29,14 +29,22 @@ module RelatonBib
|
|
29
29
|
|
30
30
|
# @param part [Symbol] :year, :month, :day, :date
|
31
31
|
# @return [String, Date, nil]
|
32
|
-
def from(part = nil)
|
32
|
+
def from(part = nil) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
33
33
|
d = instance_variable_get "@#{__callee__}".to_sym
|
34
34
|
return d unless part && d
|
35
35
|
|
36
|
-
date = parse_date(d)
|
37
|
-
return date if part == :date
|
36
|
+
# date = parse_date(d)
|
37
|
+
# return date if part == :date
|
38
38
|
|
39
|
-
|
39
|
+
parts = d.split "-"
|
40
|
+
case part
|
41
|
+
when :year then parts[0]&.to_i
|
42
|
+
when :month then parts[1]&.to_i
|
43
|
+
when :day then parts[2]&.to_i
|
44
|
+
else parse_date(d)
|
45
|
+
end
|
46
|
+
|
47
|
+
# date.is_a?(Date) ? date.send(part) : date
|
40
48
|
end
|
41
49
|
|
42
50
|
alias_method :to, :from
|
@@ -71,7 +79,7 @@ module RelatonBib
|
|
71
79
|
# @param count [Integer] number of dates
|
72
80
|
# @return [String]
|
73
81
|
def to_asciibib(prefix = "", count = 1)
|
74
|
-
pref = prefix.empty? ? prefix : prefix
|
82
|
+
pref = prefix.empty? ? prefix : "#{prefix}."
|
75
83
|
out = count > 1 ? "#{pref}date::\n" : ""
|
76
84
|
out += "#{pref}date.type:: #{type}\n"
|
77
85
|
out += "#{pref}date.on:: #{on}\n" if on
|
@@ -165,8 +165,8 @@ module RelatonBib
|
|
165
165
|
# @option date [String, nil] :to
|
166
166
|
# @option date [String, nil] :on required if :from is nil
|
167
167
|
#
|
168
|
-
# @param contributor [Array<Hash>]
|
169
|
-
# @option contributor [RealtonBib::Organization, RelatonBib::Person]
|
168
|
+
# @param contributor [Array<Hash, RelatonBib::ContributionInfo>]
|
169
|
+
# @option contributor [RealtonBib::Organization, RelatonBib::Person] :entity
|
170
170
|
# @option contributor [String] :type
|
171
171
|
# @option contributor [String] :from
|
172
172
|
# @option contributor [String] :to
|
@@ -766,8 +766,8 @@ module RelatonBib
|
|
766
766
|
# @param [Nokogiri::XML::Builder] builder
|
767
767
|
#
|
768
768
|
def render_bibxml(builder)
|
769
|
-
target = link.detect { |l| l.type
|
770
|
-
link.detect { |l| l.type
|
769
|
+
target = link.detect { |l| l.type.casecmp("src").zero? } ||
|
770
|
+
link.detect { |l| l.type.casecmp("doi").zero? }
|
771
771
|
bxml = if docnumber&.match(/^BCP/) || docidentifier[0].id.include?("BCP")
|
772
772
|
render_bibxml_refgroup(builder)
|
773
773
|
else
|
@@ -860,9 +860,9 @@ module RelatonBib
|
|
860
860
|
builder.seriesInfo(name: di.type, value: di.id)
|
861
861
|
end
|
862
862
|
end
|
863
|
-
di_types = docidentifier.map(&:type)
|
863
|
+
# di_types = docidentifier.map(&:type)
|
864
864
|
series.select do |s|
|
865
|
-
s.title && !di_types.include?(s.title.title.to_s) &&
|
865
|
+
s.title && # !di_types.include?(s.title.title.to_s) &&
|
866
866
|
!BibXMLParser::SERIESINFONAMES.include?(s.title.title.to_s)
|
867
867
|
end.uniq { |s| s.title.title.to_s }.each do |s|
|
868
868
|
si = builder.seriesInfo(name: s.title.title.to_s)
|
@@ -920,13 +920,22 @@ module RelatonBib
|
|
920
920
|
def render_person(builder, person)
|
921
921
|
render_organization builder, person.affiliation.first&.organization
|
922
922
|
if person.name.completename
|
923
|
-
builder.parent[:fullname] = person.name.completename
|
923
|
+
builder.parent[:fullname] = person.name.completename.content
|
924
|
+
elsif person.name.forename.any?
|
925
|
+
builder.parent[:fullname] = person.name.forename.map(&:content).join
|
924
926
|
end
|
925
927
|
if person.name.initial.any?
|
926
928
|
builder.parent[:initials] = person.name.initial.map(&:content).join
|
929
|
+
elsif person.name.forename.any?
|
930
|
+
builder.parent[:initials] = person.name.forename.map do |f|
|
931
|
+
"#{f.content[0]}."
|
932
|
+
end.join
|
927
933
|
end
|
928
934
|
if person.name.surname
|
929
|
-
|
935
|
+
if person.name.forename.any?
|
936
|
+
builder.parent[:fullname] += " #{person.name.surname}"
|
937
|
+
end
|
938
|
+
builder.parent[:surname] = person.name.surname.content
|
930
939
|
end
|
931
940
|
end
|
932
941
|
|
@@ -937,10 +946,8 @@ module RelatonBib
|
|
937
946
|
|
938
947
|
ab = org.abbreviation&.content
|
939
948
|
on = org.name.first&.content
|
940
|
-
orgname = if ab
|
941
|
-
|
942
|
-
elsif ab == "W3C" || on == "World Wide Web Consortium" then "W3C"
|
943
|
-
else on || ab
|
949
|
+
orgname = if BibXMLParser::ORGNAMES.key?(ab) then ab
|
950
|
+
else BibXMLParser::ORGNAMES.key(on) || on || ab
|
944
951
|
end
|
945
952
|
o = builder.organization orgname
|
946
953
|
o[:abbrev] = ab if ab
|
@@ -1,8 +1,15 @@
|
|
1
1
|
module RelatonBib
|
2
2
|
module BibXMLParser
|
3
|
+
# SeriesInfo what should be saved as docidentifiers in the Relaton model.
|
3
4
|
SERIESINFONAMES = ["DOI", "Internet-Draft"].freeze
|
5
|
+
|
4
6
|
FLAVOR = nil
|
5
7
|
|
8
|
+
ORGNAMES = {
|
9
|
+
"IEEE" => "Istitute of Electrical and Electronics Engineers",
|
10
|
+
"W3C" => "World Wide Web Consortium",
|
11
|
+
}.freeze
|
12
|
+
|
6
13
|
def parse(bibxml, url: nil, is_relation: false, ver: nil)
|
7
14
|
doc = Nokogiri::XML bibxml
|
8
15
|
fetch_rfc doc.at("/referencegroup", "/reference"), url: url, is_relation: is_relation, ver: ver
|
@@ -209,7 +216,8 @@ module RelatonBib
|
|
209
216
|
# "front/author[not(@surname)][not(@fullname)]/organization",
|
210
217
|
# ).map do |org|
|
211
218
|
org = contrib.at("./organization")
|
212
|
-
|
219
|
+
name = ORGNAMES[org.text] || org.text
|
220
|
+
{ entity: new_org(name, org[:abbrev]), role: [contributor_role(contrib)] }
|
213
221
|
# end
|
214
222
|
end
|
215
223
|
|
@@ -307,13 +315,15 @@ module RelatonBib
|
|
307
315
|
# @return [Array<RelatonBib::BibliographicDate>] published data.
|
308
316
|
#
|
309
317
|
def dates(reference)
|
310
|
-
return unless (date = reference.at "./front/date")
|
311
|
-
|
312
|
-
d =
|
313
|
-
|
314
|
-
[
|
315
|
-
|
316
|
-
[]
|
318
|
+
return [] unless (date = reference.at "./front/date")
|
319
|
+
|
320
|
+
d = date[:year]
|
321
|
+
d += "-#{month(date[:month])}" if date[:month] && !date[:month].empty?
|
322
|
+
d += "-#{date[:day]}" if date[:day]
|
323
|
+
# date = Time.parse(d).strftime "%Y-%m-%d"
|
324
|
+
[BibliographicDate.new(type: "published", on: d)]
|
325
|
+
# rescue ArgumentError
|
326
|
+
# []
|
317
327
|
end
|
318
328
|
|
319
329
|
# @param reference [Nokogiri::XML::Element]
|
@@ -333,10 +343,10 @@ module RelatonBib
|
|
333
343
|
end
|
334
344
|
|
335
345
|
def month(mon)
|
336
|
-
return 1 if !mon || mon.empty?
|
346
|
+
# return 1 if !mon || mon.empty?
|
337
347
|
return mon if /^\d+$/.match? mon
|
338
348
|
|
339
|
-
Date::MONTHNAMES.index(mon)
|
349
|
+
Date::MONTHNAMES.index(mon).to_s.rjust 2, "0"
|
340
350
|
end
|
341
351
|
|
342
352
|
#
|
@@ -347,7 +357,7 @@ module RelatonBib
|
|
347
357
|
#
|
348
358
|
def series(reference)
|
349
359
|
reference.xpath("./seriesInfo", "./front/seriesInfo").map do |si|
|
350
|
-
next if si[:name]
|
360
|
+
next if SERIESINFONAMES.include?(si[:name]) || si[:stream] || si[:status]
|
351
361
|
|
352
362
|
t = TypedTitleString.new(
|
353
363
|
content: si[:name], language: language(reference), script: "Latn",
|
@@ -25,7 +25,7 @@ module RelatonBib
|
|
25
25
|
# @param state [String]
|
26
26
|
# @param country [String]
|
27
27
|
# @param postcode [String]
|
28
|
-
def initialize(street:, city:, state: nil,
|
28
|
+
def initialize(street:, city:, country:, state: nil, postcode: nil)
|
29
29
|
@street = street
|
30
30
|
@city = city
|
31
31
|
@state = state
|
@@ -45,7 +45,7 @@ module RelatonBib
|
|
45
45
|
end
|
46
46
|
|
47
47
|
# @return [Hash]
|
48
|
-
def to_hash
|
48
|
+
def to_hash # rubocop:disable Metrics/AbcSize
|
49
49
|
hash = {}
|
50
50
|
hash["street"] = street if street&.any?
|
51
51
|
hash["city"] = city
|
@@ -59,7 +59,7 @@ module RelatonBib
|
|
59
59
|
# @param count [Integer] number of addresses
|
60
60
|
# @return [String]
|
61
61
|
def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize
|
62
|
-
pref = prefix.empty? ? "address" : prefix
|
62
|
+
pref = prefix.empty? ? "address" : "#{prefix}.address"
|
63
63
|
out = count > 1 ? "#{pref}::\n" : ""
|
64
64
|
street.each { |st| out += "#{pref}.street:: #{st}\n" }
|
65
65
|
out += "#{pref}.city:: #{city}\n"
|
@@ -99,7 +99,7 @@ module RelatonBib
|
|
99
99
|
# @param count [Integer] number of contacts
|
100
100
|
# @return [string]
|
101
101
|
def to_asciibib(prefix = "", count = 1)
|
102
|
-
pref = prefix.empty? ? prefix : prefix
|
102
|
+
pref = prefix.empty? ? prefix : "#{prefix}."
|
103
103
|
out = count > 1 ? "#{pref}contact::\n" : ""
|
104
104
|
out += "#{pref}contact.type:: #{type}\n"
|
105
105
|
out += "#{pref}contact.value:: #{value}\n"
|
@@ -156,7 +156,7 @@ module RelatonBib
|
|
156
156
|
# @param count [Integer]
|
157
157
|
# @return [String]
|
158
158
|
def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize
|
159
|
-
pref = prefix.empty? ? prefix : prefix
|
159
|
+
pref = prefix.empty? ? prefix : "#{prefix}."
|
160
160
|
out = count > 1 ? "#{pref}affiliation::\n" : ""
|
161
161
|
out += name.to_asciibib "#{pref}affiliation.name" if name
|
162
162
|
description.each do |d|
|
@@ -206,7 +206,7 @@ module RelatonBib
|
|
206
206
|
# @param prefix [String]
|
207
207
|
# @return [String]
|
208
208
|
def to_asciibib(prefix = "") # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
209
|
-
pref = prefix.empty? ? prefix : prefix
|
209
|
+
pref = prefix.empty? ? prefix : "#{prefix}."
|
210
210
|
out = ""
|
211
211
|
out += "#{pref}url:: #{uri}\n" if uri
|
212
212
|
addr = contact.select { |c| c.is_a? RelatonBib::Address }
|
@@ -39,7 +39,7 @@ module RelatonBib
|
|
39
39
|
# @param count [Integer]
|
40
40
|
# @return [String]
|
41
41
|
def to_asciibib(prefix = "", count = 1)
|
42
|
-
pref = prefix.empty? ? prefix : prefix
|
42
|
+
pref = prefix.empty? ? prefix : "#{prefix}."
|
43
43
|
out = count > 1 ? "#{pref}identifier::\n" : ""
|
44
44
|
out += "#{pref}identifier.type:: #{type}\n"
|
45
45
|
out += "#{pref}identifier.value:: #{value}\n"
|
@@ -118,7 +118,7 @@ module RelatonBib
|
|
118
118
|
# @param count [Integer]
|
119
119
|
# @return [String]
|
120
120
|
def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
|
121
|
-
pref = prefix.sub
|
121
|
+
pref = prefix.sub(/\*$/, "organization")
|
122
122
|
out = count > 1 ? "#{pref}::\n" : ""
|
123
123
|
name.each { |n| out += n.to_asciibib "#{pref}.name", name.size }
|
124
124
|
out += abbreviation.to_asciibib "#{pref}.abbreviation" if abbreviation
|
@@ -136,10 +136,11 @@ module RelatonBib
|
|
136
136
|
# @param arg [String, Hash, RelatoBib::LocalizedString]
|
137
137
|
# @return [RelatoBib::LocalizedString]
|
138
138
|
def localized_string(arg)
|
139
|
-
|
140
|
-
|
139
|
+
case arg
|
140
|
+
when String then LocalizedString.new(arg)
|
141
|
+
when Hash
|
141
142
|
LocalizedString.new(arg[:content], arg[:language], arg[:script])
|
142
|
-
|
143
|
+
when LocalizedString then arg
|
143
144
|
end
|
144
145
|
end
|
145
146
|
end
|
data/lib/relaton_bib/series.rb
CHANGED
@@ -13,7 +13,7 @@ module RelatonBib
|
|
13
13
|
# @return [RelatonBib::FormattedRef, NilClass]
|
14
14
|
attr_reader :formattedref
|
15
15
|
|
16
|
-
# @return [RelatonBib::
|
16
|
+
# @return [RelatonBib::TypedTitleString, NilClass] title
|
17
17
|
attr_reader :title
|
18
18
|
|
19
19
|
# @return [String, NilClass]
|
@@ -39,10 +39,10 @@ module RelatonBib
|
|
39
39
|
|
40
40
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
41
41
|
|
42
|
-
# @param type [String, NilClass]
|
43
|
-
# passed
|
42
|
+
# @param type [String, NilClass]
|
44
43
|
# @param formattedref [RelatonBib::FormattedRef, NilClass]
|
45
|
-
# @param title [RelatonBib::TypedTitleString, NilClass]
|
44
|
+
# @param title [RelatonBib::TypedTitleString, NilClass] title or
|
45
|
+
# formattedref argument should be passed
|
46
46
|
# @param place [String, NilClass]
|
47
47
|
# @param orgaization [String, NilClass]
|
48
48
|
# @param abbreviation [RelatonBib::LocalizedString, NilClass]
|
data/lib/relaton_bib/version.rb
CHANGED
@@ -238,11 +238,12 @@ module RelatonBib
|
|
238
238
|
OrgIdentifier.new(i[:type], i.text)
|
239
239
|
end
|
240
240
|
subdiv = org.xpath("subdivision").map &:text
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
241
|
+
contact = parse_contact org
|
242
|
+
Organization.new(
|
243
|
+
name: names, abbreviation: org.at("abbreviation")&.text,
|
244
|
+
subdivision: subdiv, # url: org.at("uri")&.text,
|
245
|
+
identifier: identifier, contact: contact
|
246
|
+
)
|
246
247
|
end
|
247
248
|
|
248
249
|
def get_person(person) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
@@ -255,21 +256,7 @@ module RelatonBib
|
|
255
256
|
Affiliation.new organization: get_org(org), description: desc
|
256
257
|
end
|
257
258
|
|
258
|
-
contact = person
|
259
|
-
if c.name == "address"
|
260
|
-
streets = c.xpath("./street").map(&:text)
|
261
|
-
Address.new(
|
262
|
-
street: streets,
|
263
|
-
city: c.at("./city")&.text,
|
264
|
-
state: c.at("./state")&.text,
|
265
|
-
country: c.at("./country")&.text,
|
266
|
-
postcode: c.at("./postcode")&.text,
|
267
|
-
)
|
268
|
-
else
|
269
|
-
Contact.new(type: c.name, value: c.text)
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
259
|
+
contact = parse_contact person
|
273
260
|
identifier = person.xpath("./identifier").map do |pi|
|
274
261
|
PersonIdentifier.new pi[:type], pi.text
|
275
262
|
end
|
@@ -295,6 +282,23 @@ module RelatonBib
|
|
295
282
|
)
|
296
283
|
end
|
297
284
|
|
285
|
+
def parse_contact(contrib) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/MethodLength,Metrics/AbcSize
|
286
|
+
contrib.xpath("./address|./phone|./email|./uri").map do |c|
|
287
|
+
if c.name == "address"
|
288
|
+
streets = c.xpath("./street").map(&:text)
|
289
|
+
Address.new(
|
290
|
+
street: streets,
|
291
|
+
city: c.at("./city")&.text,
|
292
|
+
state: c.at("./state")&.text,
|
293
|
+
country: c.at("./country")&.text,
|
294
|
+
postcode: c.at("./postcode")&.text,
|
295
|
+
)
|
296
|
+
else
|
297
|
+
Contact.new(type: c.name, value: c.text)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
298
302
|
def name_part(person, part)
|
299
303
|
person.xpath("./name/#{part}").map do |np|
|
300
304
|
LocalizedString.new np.text, np[:language], np[:script]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relaton-bib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.22
|
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-01-
|
11
|
+
date: 2022-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|