relaton-bib 1.12.7 → 1.13.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.
- checksums.yaml +4 -4
- data/grammars/biblio.rng +8 -5
- data/grammars/isodoc.rng +27 -1
- data/lib/relaton_bib/bibliographic_item.rb +8 -4
- data/lib/relaton_bib/bibtex_parser.rb +2 -2
- data/lib/relaton_bib/bibxml_parser.rb +2 -1
- data/lib/relaton_bib/forename.rb +65 -0
- data/lib/relaton_bib/full_name.rb +103 -0
- data/lib/relaton_bib/hash_converter.rb +37 -32
- data/lib/relaton_bib/localized_string.rb +16 -5
- data/lib/relaton_bib/person.rb +0 -98
- data/lib/relaton_bib/typed_title_string.rb +8 -7
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib/xml_parser.rb +17 -2
- data/lib/relaton_bib.rb +3 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99408aa20e1cd2228d00656949182896e8acaf845e5e223024b262b915636b8f
|
4
|
+
data.tar.gz: 3fb73b6ee0381499a955f7b9c082c1a49aa9c1944d22c26ca8064ff008608bb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e04458e0ab8bbe38e464f84a0c3de36e4db43361efeec0246a09b476171eeb8050283b7d8ef18eeb1432505985879c30d6d9202f27f6536cd65195a4e6d9938
|
7
|
+
data.tar.gz: 25241fe59416e9dad9af8b1c11579cf309194acfcbce167d603105c7264d67a744f452a0f3ee9f8fad9fa23e857d282b2ad79e17e67372f8940e21021594fb44
|
data/grammars/biblio.rng
CHANGED
@@ -225,9 +225,9 @@
|
|
225
225
|
<zeroOrMore>
|
226
226
|
<ref name="forename"/>
|
227
227
|
</zeroOrMore>
|
228
|
-
<
|
229
|
-
<ref name="
|
230
|
-
</
|
228
|
+
<optional>
|
229
|
+
<ref name="formatted-initials"/>
|
230
|
+
</optional>
|
231
231
|
<ref name="surname"/>
|
232
232
|
<zeroOrMore>
|
233
233
|
<ref name="addition"/>
|
@@ -247,8 +247,8 @@
|
|
247
247
|
<ref name="LocalizedString"/>
|
248
248
|
</element>
|
249
249
|
</define>
|
250
|
-
<define name="
|
251
|
-
<element name="
|
250
|
+
<define name="formatted-initials">
|
251
|
+
<element name="formatted-initials">
|
252
252
|
<ref name="LocalizedString"/>
|
253
253
|
</element>
|
254
254
|
</define>
|
@@ -264,6 +264,9 @@
|
|
264
264
|
</define>
|
265
265
|
<define name="forename">
|
266
266
|
<element name="forename">
|
267
|
+
<optional>
|
268
|
+
<attribute name="initial"/>
|
269
|
+
</optional>
|
267
270
|
<ref name="LocalizedString"/>
|
268
271
|
</element>
|
269
272
|
</define>
|
data/grammars/isodoc.rng
CHANGED
@@ -69,6 +69,17 @@
|
|
69
69
|
</zeroOrMore>
|
70
70
|
</element>
|
71
71
|
</define>
|
72
|
+
<define name="AdmonitionType">
|
73
|
+
<choice>
|
74
|
+
<value>warning</value>
|
75
|
+
<value>note</value>
|
76
|
+
<value>tip</value>
|
77
|
+
<value>important</value>
|
78
|
+
<value>caution</value>
|
79
|
+
<value>statement</value>
|
80
|
+
<value>editorial</value>
|
81
|
+
</choice>
|
82
|
+
</define>
|
72
83
|
<define name="index">
|
73
84
|
<element name="index">
|
74
85
|
<optional>
|
@@ -1274,7 +1285,12 @@
|
|
1274
1285
|
</define>
|
1275
1286
|
<define name="span">
|
1276
1287
|
<element name="span">
|
1277
|
-
<
|
1288
|
+
<optional>
|
1289
|
+
<attribute name="class"/>
|
1290
|
+
</optional>
|
1291
|
+
<optional>
|
1292
|
+
<attribute name="style"/>
|
1293
|
+
</optional>
|
1278
1294
|
<oneOrMore>
|
1279
1295
|
<ref name="TextElement"/>
|
1280
1296
|
</oneOrMore>
|
@@ -2493,6 +2509,16 @@
|
|
2493
2509
|
<text/>
|
2494
2510
|
</element>
|
2495
2511
|
</optional>
|
2512
|
+
<optional>
|
2513
|
+
<element name="amendment">
|
2514
|
+
<text/>
|
2515
|
+
</element>
|
2516
|
+
</optional>
|
2517
|
+
<optional>
|
2518
|
+
<element name="corrigendum">
|
2519
|
+
<text/>
|
2520
|
+
</element>
|
2521
|
+
</optional>
|
2496
2522
|
<optional>
|
2497
2523
|
<element name="language">
|
2498
2524
|
<text/>
|
@@ -265,7 +265,11 @@ module RelatonBib
|
|
265
265
|
# we should pass the fetched arg from scrappers
|
266
266
|
@fetched = args.fetch :fetched, nil
|
267
267
|
@keyword = (args[:keyword] || []).map do |kw|
|
268
|
-
|
268
|
+
case kw
|
269
|
+
when Hash then LocalizedString.new(kw[:content], kw[:language], kw[:script])
|
270
|
+
when String then LocalizedString.new(kw)
|
271
|
+
else kw
|
272
|
+
end
|
269
273
|
end
|
270
274
|
@license = args.fetch :license, []
|
271
275
|
@doctype = args[:doctype]
|
@@ -1015,11 +1019,11 @@ module RelatonBib
|
|
1015
1019
|
elsif person.name.forename.any?
|
1016
1020
|
builder.parent[:fullname] = person.name.forename.map(&:content).join
|
1017
1021
|
end
|
1018
|
-
if person.name.
|
1019
|
-
builder.parent[:initials] = person.name.
|
1022
|
+
if person.name.initials
|
1023
|
+
builder.parent[:initials] = person.name.initials.content
|
1020
1024
|
elsif person.name.forename.any?
|
1021
1025
|
builder.parent[:initials] = person.name.forename.map do |f|
|
1022
|
-
"#{f.content[0]}."
|
1026
|
+
"#{f.initial || f.content[0]}."
|
1023
1027
|
end.join
|
1024
1028
|
end
|
1025
1029
|
if person.name.surname
|
@@ -25,7 +25,7 @@ module RelatonBib
|
|
25
25
|
link: fetch_link(bt),
|
26
26
|
language: fetch_language(bt),
|
27
27
|
classification: fetch_classification(bt),
|
28
|
-
keyword: fetch_keyword(bt)
|
28
|
+
keyword: fetch_keyword(bt),
|
29
29
|
)
|
30
30
|
h
|
31
31
|
end
|
@@ -123,7 +123,7 @@ module RelatonBib
|
|
123
123
|
parts = name.split ", "
|
124
124
|
surname = LocalizedString.new parts.first
|
125
125
|
fname = parts.size > 1 ? parts[1].split : []
|
126
|
-
forename = fname.map { |fn|
|
126
|
+
forename = fname.map { |fn| Forename.new content: fn }
|
127
127
|
Person.new name: FullName.new(surname: surname, forename: forename)
|
128
128
|
end
|
129
129
|
end
|
@@ -264,9 +264,10 @@ module RelatonBib
|
|
264
264
|
# @return [RelatonBib::FullName]
|
265
265
|
def full_name(author, reference)
|
266
266
|
lang = language reference
|
267
|
+
initials = localized_string(author[:initials], lang) if author[:initials]
|
267
268
|
FullName.new(
|
268
269
|
completename: localized_string(author[:fullname], lang),
|
269
|
-
|
270
|
+
initials: initials,
|
270
271
|
surname: localized_string(author[:surname], lang),
|
271
272
|
)
|
272
273
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module RelatonBib
|
2
|
+
class Forename < LocalizedString
|
3
|
+
# @return [RelatonBib::Forename] forename
|
4
|
+
attr_accessor :initial
|
5
|
+
|
6
|
+
#
|
7
|
+
# Initialize Forename instance
|
8
|
+
#
|
9
|
+
# @param [String] content content of forename, can be empty
|
10
|
+
# @param [Array<String>] language languages, `en`, `fr`, `de` etc.
|
11
|
+
# @param [Array<String>] script scripts `Latn`, `Cyrl` etc.
|
12
|
+
# @param [String, nil] initial initial of forename
|
13
|
+
#
|
14
|
+
def initialize(content: nil, language: [], script: [], initial: nil)
|
15
|
+
@initial = initial
|
16
|
+
super content, language, script
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
content.nil? ? initial : super
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# Render forename to XML
|
25
|
+
#
|
26
|
+
# @param [Nokogiri::XML::Builder] builder XML builder
|
27
|
+
#
|
28
|
+
def to_xml(builder)
|
29
|
+
node = builder.forename { super }
|
30
|
+
node[:initial] = initial if initial
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Render forename to hash
|
35
|
+
#
|
36
|
+
# @return [Hash, String] forename hash or string representation
|
37
|
+
#
|
38
|
+
def to_hash
|
39
|
+
ls = super
|
40
|
+
# if initial
|
41
|
+
hash = ls.is_a?(Hash) ? ls : { "content" => ls }
|
42
|
+
hash["initial"] = initial if initial
|
43
|
+
hash
|
44
|
+
# else
|
45
|
+
# ls
|
46
|
+
# end
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Render forename to asciibib
|
51
|
+
#
|
52
|
+
# @param [String] pref prefix
|
53
|
+
# @param [Integer] count size of array
|
54
|
+
#
|
55
|
+
# @return [String] asciibib string
|
56
|
+
#
|
57
|
+
def to_asciibib(pref, count = 1)
|
58
|
+
prf = pref.empty? ? pref : "#{pref}."
|
59
|
+
prf += "forename"
|
60
|
+
out = super prf, count
|
61
|
+
out += "#{prf}.initial:: #{initial}\n" if initial
|
62
|
+
out
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module RelatonBib
|
2
|
+
# Person's full name
|
3
|
+
class FullName
|
4
|
+
include RelatonBib
|
5
|
+
|
6
|
+
# @return [Array<RelatonBib::Forename>]
|
7
|
+
attr_accessor :forename
|
8
|
+
|
9
|
+
# @return [Array<RelatonBib::LocalizedString>]
|
10
|
+
attr_accessor :initials
|
11
|
+
|
12
|
+
# @return [RelatonBib::LocalizedString, nil]
|
13
|
+
attr_accessor :surname, :completename
|
14
|
+
|
15
|
+
# @return [Array<RelatonBib::LocalizedString>]
|
16
|
+
attr_accessor :addition
|
17
|
+
|
18
|
+
# @return [Array<RelatonBib::LocalizedString>]
|
19
|
+
attr_accessor :prefix
|
20
|
+
|
21
|
+
#
|
22
|
+
# Initialize FullName instance
|
23
|
+
#
|
24
|
+
# @param surname [RelatonBib::LocalizedString, nil] surname or completename
|
25
|
+
# should be present
|
26
|
+
# @param forename [Array<RelatonBib::Forename>] forename
|
27
|
+
# @param initials [RelatonBib::LocalizedString, String, nil] string of initials
|
28
|
+
# @param addition [Array<RelatonBib::LocalizedString>] array of additions
|
29
|
+
# @param prefix [Array<RelatonBib::LocalizedString>] array of prefixes
|
30
|
+
# @param completename [RelatonBib::LocalizedString, nil] completename or
|
31
|
+
# surname should be present
|
32
|
+
#
|
33
|
+
def initialize(**args)
|
34
|
+
unless args[:surname] || args[:completename]
|
35
|
+
raise ArgumentError, "Should be given :surname or :completename"
|
36
|
+
end
|
37
|
+
|
38
|
+
@surname = args[:surname]
|
39
|
+
@forename = args.fetch :forename, []
|
40
|
+
@initials = args[:initials].is_a?(String) ? LocalizedString.new(args[:initials]) : args[:initials]
|
41
|
+
@addition = args.fetch :addition, []
|
42
|
+
@prefix = args.fetch :prefix, []
|
43
|
+
@completename = args[:completename]
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param opts [Hash]
|
47
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
48
|
+
# @option opts [String] :lang language
|
49
|
+
def to_xml(**opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
50
|
+
opts[:builder].name do |builder|
|
51
|
+
if completename
|
52
|
+
builder.completename { completename.to_xml builder }
|
53
|
+
else
|
54
|
+
pref = prefix.select { |p| p.language&.include? opts[:lang] }
|
55
|
+
pref = prefix unless pref.any?
|
56
|
+
pref.each { |p| builder.prefix { p.to_xml builder } }
|
57
|
+
frnm = forename.select { |f| f.language&.include? opts[:lang] }
|
58
|
+
frnm = forename unless frnm.any?
|
59
|
+
frnm.each { |f| f.to_xml builder }
|
60
|
+
builder.send(:"formatted-initials") { initials.to_xml builder } if initials
|
61
|
+
builder.surname { surname.to_xml builder }
|
62
|
+
addn = addition.select { |a| a.language&.include? opts[:lang] }
|
63
|
+
addn = addition unless addn.any?
|
64
|
+
addn.each { |a| builder.addition { a.to_xml builder } }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# @return [Hash]
|
70
|
+
def to_hash # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/MethodLength
|
71
|
+
hash = {}
|
72
|
+
if forename.any? || initials
|
73
|
+
hash["given"] = {}
|
74
|
+
hash["given"]["forename"] = single_element_array(forename) if forename&.any?
|
75
|
+
hash["given"]["formatted_initials"] = initials.to_hash if initials
|
76
|
+
end
|
77
|
+
hash["surname"] = surname.to_hash if surname
|
78
|
+
hash["addition"] = single_element_array(addition) if addition&.any?
|
79
|
+
hash["prefix"] = single_element_array(prefix) if prefix&.any?
|
80
|
+
hash["completename"] = completename.to_hash if completename
|
81
|
+
hash
|
82
|
+
end
|
83
|
+
|
84
|
+
# @param pref [String]
|
85
|
+
# @return [String]
|
86
|
+
def to_asciibib(pref) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
87
|
+
prf = pref.empty? ? pref : "#{pref}."
|
88
|
+
prf += "name"
|
89
|
+
given = "#{pref}.given"
|
90
|
+
out = forename.map do |fn|
|
91
|
+
fn.to_asciibib given, forename.size
|
92
|
+
end.join
|
93
|
+
out += initials.to_asciibib "#{given}.formatted-initials" if initials
|
94
|
+
out += surname.to_asciibib "#{prf}.surname" if surname
|
95
|
+
addition.each do |ad|
|
96
|
+
out += ad.to_asciibib "#{prf}.addition", addition.size
|
97
|
+
end
|
98
|
+
prefix.each { |pr| out += pr.to_asciibib "#{prf}.prefix", prefix.size }
|
99
|
+
out += completename.to_asciibib "#{prf}.completename" if completename
|
100
|
+
out
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -33,7 +33,8 @@ module RelatonBib
|
|
33
33
|
accesslocation_hash_to_bib(ret)
|
34
34
|
classification_hash_to_bib(ret)
|
35
35
|
validity_hash_to_bib(ret)
|
36
|
-
|
36
|
+
keyword_hash_to_bib(ret)
|
37
|
+
# ret[:keyword] = RelatonBib.array(ret[:keyword])
|
37
38
|
ret[:license] = RelatonBib.array(ret[:license])
|
38
39
|
editorialgroup_hash_to_bib ret
|
39
40
|
ics_hash_to_bib ret
|
@@ -42,9 +43,11 @@ module RelatonBib
|
|
42
43
|
end
|
43
44
|
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
def keyword_hash_to_bib(ret)
|
47
|
+
ret[:keyword] = RelatonBib.array(ret[:keyword]).map do |keyword|
|
48
|
+
localizedstring keyword
|
49
|
+
end
|
50
|
+
end
|
48
51
|
|
49
52
|
def extent_hash_to_bib(ret)
|
50
53
|
return unless ret[:extent]
|
@@ -198,7 +201,8 @@ module RelatonBib
|
|
198
201
|
ret[:contributor]&.each_with_index do |c, i|
|
199
202
|
roles = RelatonBib.array(ret[:contributor][i][:role]).map do |r|
|
200
203
|
if r.is_a? Hash
|
201
|
-
|
204
|
+
desc = RelatonBib.array(r[:description]).map { |d| d.is_a?(String) ? d : d[:content] }
|
205
|
+
{ type: r[:type], description: desc }
|
202
206
|
# elsif r.is_a? Array
|
203
207
|
# { type: r[0], description: r.fetch(1) }
|
204
208
|
else
|
@@ -238,18 +242,33 @@ module RelatonBib
|
|
238
242
|
)
|
239
243
|
end
|
240
244
|
|
241
|
-
def fullname_hash_to_bib(person) # rubocop:disable Metrics/AbcSize
|
245
|
+
def fullname_hash_to_bib(person) # rubocop:disable Metrics/AbcSize
|
242
246
|
n = person[:name]
|
247
|
+
fname, inits = given_hash_to_bib n[:given] || n # `n` is for backward compatibility
|
243
248
|
FullName.new(
|
244
|
-
forename:
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
completename: localname(n[:completename], person),
|
249
|
+
forename: fname, initials: inits,
|
250
|
+
addition: RelatonBib.array(n[:addition])&.map { |f| localizedstring(f) },
|
251
|
+
prefix: RelatonBib.array(n[:prefix])&.map { |f| localizedstring(f) },
|
252
|
+
surname: localizedstring(n[:surname]),
|
253
|
+
completename: localizedstring(n[:completename])
|
250
254
|
)
|
251
255
|
end
|
252
256
|
|
257
|
+
def given_hash_to_bib(given)
|
258
|
+
return [[], nil] unless given
|
259
|
+
|
260
|
+
fname = RelatonBib.array(given[:forename])&.map { |f| forename_hash_to_bib(f) }
|
261
|
+
inits = localizedstring(given[:formatted_initials])
|
262
|
+
[fname, inits]
|
263
|
+
end
|
264
|
+
|
265
|
+
def forename_hash_to_bib(fname)
|
266
|
+
case fname
|
267
|
+
when Hash then Forename.new(**fname)
|
268
|
+
when String then Forename.new(content: fname)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
253
272
|
def person_identifiers_hash_to_bib(person)
|
254
273
|
RelatonBib.array(person[:identifier])&.map do |a|
|
255
274
|
PersonIdentifier.new(a[:type], a[:id])
|
@@ -275,7 +294,7 @@ module RelatonBib
|
|
275
294
|
end
|
276
295
|
end
|
277
296
|
|
278
|
-
def contacts_hash_to_bib(entity) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
297
|
+
def contacts_hash_to_bib(entity) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength,Metrics/PerceivedComplexity,Metrics/CyclomaticComplexity
|
279
298
|
return [] unless entity[:contact]
|
280
299
|
|
281
300
|
RelatonBib.array(entity[:contact]).map do |a|
|
@@ -473,28 +492,14 @@ module RelatonBib
|
|
473
492
|
end
|
474
493
|
end
|
475
494
|
|
476
|
-
# @param
|
477
|
-
# @param person [Hash]
|
478
|
-
# @return [RelatonBib::LocalizedString]
|
479
|
-
def localname(name, person) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/AbcSize
|
480
|
-
return nil if name.nil?
|
481
|
-
|
482
|
-
lang = name[:language] if name.is_a?(Hash)
|
483
|
-
lang ||= person[:name][:language]
|
484
|
-
script = name[:script] if name.is_a?(Hash)
|
485
|
-
script ||= person[:name][:script]
|
486
|
-
n = name.is_a?(Hash) ? name[:content] : name
|
487
|
-
RelatonBib::LocalizedString.new(n, lang, script)
|
488
|
-
end
|
489
|
-
|
490
|
-
# @param lst [Hash, Array<RelatonBib::LocalizedString>]
|
495
|
+
# @param lst [Hash, Array<RelatonBib::LocalizedString>, String]
|
491
496
|
# @return [RelatonBib::LocalizedString]
|
492
497
|
def localizedstring(lst)
|
498
|
+
return unless lst
|
499
|
+
|
493
500
|
if lst.is_a?(Hash)
|
494
|
-
|
495
|
-
|
496
|
-
else
|
497
|
-
RelatonBib::LocalizedString.new(lst)
|
501
|
+
LocalizedString.new(lst[:content], lst[:language], lst[:script])
|
502
|
+
else LocalizedString.new(lst)
|
498
503
|
end
|
499
504
|
end
|
500
505
|
|
@@ -37,12 +37,20 @@ module RelatonBib
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
#
|
41
|
+
# String representation.
|
42
|
+
#
|
40
43
|
# @return [String]
|
44
|
+
#
|
41
45
|
def to_s
|
42
46
|
content.is_a?(Array) ? content.first.to_s : content.to_s
|
43
47
|
end
|
44
48
|
|
45
|
-
#
|
49
|
+
#
|
50
|
+
# Returns true if content is empty.
|
51
|
+
#
|
52
|
+
# @return [Boolean]
|
53
|
+
#
|
46
54
|
def empty?
|
47
55
|
content.empty?
|
48
56
|
end
|
@@ -125,9 +133,10 @@ module RelatonBib
|
|
125
133
|
# @return [Hash]
|
126
134
|
def to_hash # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
127
135
|
if content.is_a? String
|
128
|
-
return content unless language || script
|
136
|
+
# return content unless language || script
|
129
137
|
|
130
|
-
hash = {
|
138
|
+
hash = {}
|
139
|
+
hash["content"] = content unless empty?
|
131
140
|
hash["language"] = single_element_array(language) if language&.any?
|
132
141
|
hash["script"] = single_element_array(script) if script&.any?
|
133
142
|
hash
|
@@ -140,7 +149,8 @@ module RelatonBib
|
|
140
149
|
# @return [String]
|
141
150
|
def to_asciibib(prefix = "", count = 1, has_attrs = false) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/MethodLength
|
142
151
|
pref = prefix.empty? ? prefix : "#{prefix}."
|
143
|
-
|
152
|
+
case content
|
153
|
+
when String
|
144
154
|
unless language&.any? || script&.any? || has_attrs
|
145
155
|
return "#{prefix}:: #{content}\n"
|
146
156
|
end
|
@@ -150,8 +160,9 @@ module RelatonBib
|
|
150
160
|
language&.each { |l| out += "#{pref}language:: #{l}\n" }
|
151
161
|
script&.each { |s| out += "#{pref}script:: #{s}\n" }
|
152
162
|
out
|
153
|
-
|
163
|
+
when Array
|
154
164
|
content.map { |c| c.to_asciibib "#{pref}variant", content.size }.join
|
165
|
+
else count > 1 ? "#{prefix}::\n" : ""
|
155
166
|
end
|
156
167
|
end
|
157
168
|
end
|
data/lib/relaton_bib/person.rb
CHANGED
@@ -1,104 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "relaton_bib/contributor"
|
4
|
-
|
5
3
|
module RelatonBib
|
6
|
-
# Person's full name
|
7
|
-
class FullName
|
8
|
-
include RelatonBib
|
9
|
-
|
10
|
-
# @return [Array<RelatonBib::LocalizedString>]
|
11
|
-
attr_accessor :forename
|
12
|
-
|
13
|
-
# @return [Array<RelatonBib::LocalizedString>]
|
14
|
-
attr_accessor :initial
|
15
|
-
|
16
|
-
# @return [RelatonBib::LocalizedString, nil]
|
17
|
-
attr_accessor :surname, :completename
|
18
|
-
|
19
|
-
# @return [Array<RelatonBib::LocalizedString>]
|
20
|
-
attr_accessor :addition
|
21
|
-
|
22
|
-
# @return [Array<RelatonBib::LocalizedString>]
|
23
|
-
attr_accessor :prefix
|
24
|
-
|
25
|
-
# @param surname [RelatonBib::LocalizedString, nil] surname or completename
|
26
|
-
# should be present
|
27
|
-
# @param forename [Array<RelatonBib::LocalizedString>]
|
28
|
-
# @param initial [Array<RelatonBib::LocalizedString>]
|
29
|
-
# @param addition [Array<RelatonBib::LocalizedString>]
|
30
|
-
# @param prefix [Array<RelatonBib::LocalizedString>]
|
31
|
-
# @param completename [RelatonBib::LocalizedString, nil] completename or
|
32
|
-
# surname should be present
|
33
|
-
def initialize(**args)
|
34
|
-
unless args[:surname] || args[:completename]
|
35
|
-
raise ArgumentError, "Should be given :surname or :completename"
|
36
|
-
end
|
37
|
-
|
38
|
-
@surname = args[:surname]
|
39
|
-
@forename = args.fetch :forename, []
|
40
|
-
@initial = args.fetch :initial, []
|
41
|
-
@addition = args.fetch :addition, []
|
42
|
-
@prefix = args.fetch :prefix, []
|
43
|
-
@completename = args[:completename]
|
44
|
-
end
|
45
|
-
|
46
|
-
# @param opts [Hash]
|
47
|
-
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
48
|
-
# @option opts [String] :lang language
|
49
|
-
def to_xml(**opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
50
|
-
opts[:builder].name do |builder|
|
51
|
-
if completename
|
52
|
-
builder.completename { completename.to_xml builder }
|
53
|
-
else
|
54
|
-
pref = prefix.select { |p| p.language&.include? opts[:lang] }
|
55
|
-
pref = prefix unless pref.any?
|
56
|
-
pref.each { |p| builder.prefix { p.to_xml builder } }
|
57
|
-
frnm = forename.select { |f| f.language&.include? opts[:lang] }
|
58
|
-
frnm = forename unless frnm.any?
|
59
|
-
frnm.each { |f| builder.forename { f.to_xml builder } }
|
60
|
-
init = initial.select { |i| i.language&.include? opts[:lang] }
|
61
|
-
init = initial unless init.any?
|
62
|
-
init.each { |i| builder.initial { i.to_xml builder } }
|
63
|
-
builder.surname { surname.to_xml builder }
|
64
|
-
addn = addition.select { |a| a.language&.include? opts[:lang] }
|
65
|
-
addn = addition unless addn.any?
|
66
|
-
addn.each { |a| builder.addition { a.to_xml builder } }
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# @return [Hash]
|
72
|
-
def to_hash # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
73
|
-
hash = {}
|
74
|
-
hash["forename"] = single_element_array(forename) if forename&.any?
|
75
|
-
hash["initial"] = single_element_array(initial) if initial&.any?
|
76
|
-
hash["surname"] = surname.to_hash if surname
|
77
|
-
hash["addition"] = single_element_array(addition) if addition&.any?
|
78
|
-
hash["prefix"] = single_element_array(prefix) if prefix&.any?
|
79
|
-
hash["completename"] = completename.to_hash if completename
|
80
|
-
hash
|
81
|
-
end
|
82
|
-
|
83
|
-
# @param pref [String]
|
84
|
-
# @return [String]
|
85
|
-
def to_asciibib(pref) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
86
|
-
prf = pref.empty? ? pref : pref + "."
|
87
|
-
prf += "name."
|
88
|
-
out = forename.map do |fn|
|
89
|
-
fn.to_asciibib "#{prf}forename", forename.size
|
90
|
-
end.join
|
91
|
-
initial.each { |i| out += i.to_asciibib "#{prf}initial", initial.size }
|
92
|
-
out += surname.to_asciibib "#{prf}surname" if surname
|
93
|
-
addition.each do |ad|
|
94
|
-
out += ad.to_asciibib "#{prf}addition", addition.size
|
95
|
-
end
|
96
|
-
prefix.each { |pr| out += pr.to_asciibib "#{prf}prefix", prefix.size }
|
97
|
-
out += completename.to_asciibib "#{prf}completename" if completename
|
98
|
-
out
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
4
|
# Person identifier type.
|
103
5
|
module PersonIdentifierType
|
104
6
|
ISNI = "isni"
|
@@ -158,13 +158,14 @@ module RelatonBib
|
|
158
158
|
th = title.to_hash
|
159
159
|
return th unless type
|
160
160
|
|
161
|
-
hash = { "type" => type }
|
162
|
-
if th.is_a? String
|
163
|
-
|
164
|
-
else
|
165
|
-
|
166
|
-
end
|
167
|
-
hash
|
161
|
+
# hash = { "type" => type }
|
162
|
+
# if th.is_a? String
|
163
|
+
# hash["content"] = th
|
164
|
+
# else
|
165
|
+
# hash.merge! th
|
166
|
+
# end
|
167
|
+
# hash
|
168
|
+
th.merge "type" => type
|
168
169
|
end
|
169
170
|
|
170
171
|
# @param prefix [String]
|
data/lib/relaton_bib/version.rb
CHANGED
@@ -305,8 +305,8 @@ module RelatonBib
|
|
305
305
|
|
306
306
|
name = FullName.new(
|
307
307
|
completename: cname, surname: sname,
|
308
|
-
|
309
|
-
forename:
|
308
|
+
initials: parse_initials(person),
|
309
|
+
forename: parse_forename(person),
|
310
310
|
addition: name_part(person, "addition"),
|
311
311
|
prefix: name_part(person, "prefix")
|
312
312
|
)
|
@@ -336,6 +336,21 @@ module RelatonBib
|
|
336
336
|
end
|
337
337
|
end
|
338
338
|
|
339
|
+
def parse_initials(person)
|
340
|
+
inits = person.at "./name/formatted-initials"
|
341
|
+
return unless inits
|
342
|
+
|
343
|
+
LocalizedString.new(inits.text, inits[:language], inits[:script])
|
344
|
+
end
|
345
|
+
|
346
|
+
def parse_forename(person)
|
347
|
+
person.xpath("./name/forename").map do |np|
|
348
|
+
args = np.attributes.each_with_object({}) { |(k, v), h| h[k.to_sym] = v.to_s }
|
349
|
+
args[:content] = np.text
|
350
|
+
Forename.new(**args)
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
339
354
|
def name_part(person, part)
|
340
355
|
person.xpath("./name/#{part}").map do |np|
|
341
356
|
LocalizedString.new np.text, np[:language], np[:script]
|
data/lib/relaton_bib.rb
CHANGED
@@ -4,6 +4,9 @@ require "htmlentities"
|
|
4
4
|
require "relaton_bib/version"
|
5
5
|
require "relaton_bib/deep_dup"
|
6
6
|
require "relaton_bib/localized_string"
|
7
|
+
require "relaton_bib/forename"
|
8
|
+
require "relaton_bib/full_name"
|
9
|
+
require "relaton_bib/contributor"
|
7
10
|
require "relaton_bib/bibliographic_item"
|
8
11
|
require "relaton_bib/hit_collection"
|
9
12
|
require "relaton_bib/hit"
|
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.
|
4
|
+
version: 1.13.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: 2022-08-
|
11
|
+
date: 2022-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|
@@ -251,8 +251,10 @@ files:
|
|
251
251
|
- lib/relaton_bib/document_status.rb
|
252
252
|
- lib/relaton_bib/edition.rb
|
253
253
|
- lib/relaton_bib/editorial_group.rb
|
254
|
+
- lib/relaton_bib/forename.rb
|
254
255
|
- lib/relaton_bib/formatted_ref.rb
|
255
256
|
- lib/relaton_bib/formatted_string.rb
|
257
|
+
- lib/relaton_bib/full_name.rb
|
256
258
|
- lib/relaton_bib/hash_converter.rb
|
257
259
|
- lib/relaton_bib/hit.rb
|
258
260
|
- lib/relaton_bib/hit_collection.rb
|