relaton-bib 1.12.7 → 1.13.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +1 -1
- data/.github/workflows/release.yml +22 -0
- data/docs/hash.adoc +69 -52
- data/grammars/biblio.rng +8 -5
- data/grammars/isodoc.rng +27 -1
- data/lib/relaton_bib/bibliographic_item.rb +13 -7
- data/lib/relaton_bib/bibtex_parser.rb +2 -2
- data/lib/relaton_bib/bibxml_parser.rb +19 -2
- 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 +17 -6
- 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 +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61c7501f15c50370c99043dafc2950b2bb5314725abae9e2c58fc4c2959ee5ac
|
4
|
+
data.tar.gz: b9bc6f11bd966f6155145cb9f9cc22a9ce1873b549ace92b356c29566ab02139
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8f4bdccc1d8d2de570471187b5484d49f18b4b58b1f3c87b91dc97ffbe69a277ed890261ca6cbbe298fb2f61f56ca827cb814e70a18015943e63e6d23209305
|
7
|
+
data.tar.gz: d343cbca3b0c3c22e3775c13573c0e06b553f557aa03b592cb249c863f23ecde405c794f0cdd594bdc292e9639d56a21a28ffdec50ee9d1c8a3b6a430056274a
|
data/.github/workflows/rake.yml
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Auto-generated by Cimas: Do not edit it manually!
|
2
|
+
# See https://github.com/metanorma/cimas
|
3
|
+
name: release
|
4
|
+
|
5
|
+
on:
|
6
|
+
workflow_dispatch:
|
7
|
+
inputs:
|
8
|
+
next_version:
|
9
|
+
description: |
|
10
|
+
Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
|
11
|
+
required: true
|
12
|
+
default: 'skip'
|
13
|
+
push:
|
14
|
+
tags: [ v* ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
release:
|
18
|
+
uses: relaton/support/.github/workflows/release.yml@master
|
19
|
+
with:
|
20
|
+
next_version: ${{ github.event.inputs.next_version }}
|
21
|
+
secrets:
|
22
|
+
rubygems-api-key: ${{ secrets.RELATON_CI_RUBYGEMS_API_KEY }}
|
data/docs/hash.adoc
CHANGED
@@ -49,7 +49,7 @@ The structure below is given in YAML format:
|
|
49
49
|
# bibliographic item anchor, used to crossreference within document
|
50
50
|
id: ISO/TC211
|
51
51
|
# date record was created
|
52
|
-
fetched: 2019-06-30
|
52
|
+
fetched: '2019-06-30'
|
53
53
|
# titles are an array, with a mandatory type and content, and optional format, language and script
|
54
54
|
title:
|
55
55
|
- type: main
|
@@ -66,9 +66,9 @@ docid:
|
|
66
66
|
type: ISO
|
67
67
|
id: TC211
|
68
68
|
# document number
|
69
|
-
docnumber: 211
|
69
|
+
docnumber: '211'
|
70
70
|
# edition
|
71
|
-
edition: 1
|
71
|
+
edition: '1'
|
72
72
|
# language is an array
|
73
73
|
language:
|
74
74
|
- en
|
@@ -78,7 +78,7 @@ script:
|
|
78
78
|
Latn
|
79
79
|
# version contains revision date and draft (as array)
|
80
80
|
version:
|
81
|
-
revision_date: 2019-04-01
|
81
|
+
revision_date: '2019-04-01'
|
82
82
|
draft: draft
|
83
83
|
# note is an array of type and content
|
84
84
|
biblionote:
|
@@ -94,12 +94,12 @@ docstatus:
|
|
94
94
|
# date is an array, with mandatory type, and either an "on" value or a "from" and optional "to" value
|
95
95
|
date:
|
96
96
|
- type: issued
|
97
|
-
value: 2014
|
97
|
+
value: '2014'
|
98
98
|
- type: published
|
99
|
-
from: 2014-04
|
100
|
-
to: 2014-05
|
99
|
+
from: '2014-04'
|
100
|
+
to: '2014-05'
|
101
101
|
- type: accessed
|
102
|
-
value: 2015-05-20
|
102
|
+
value: '2015-05-20'
|
103
103
|
# abstract is an array, with content, and optional language, script, format
|
104
104
|
abstract:
|
105
105
|
- content: >
|
@@ -114,7 +114,8 @@ abstract:
|
|
114
114
|
# as the type.
|
115
115
|
# Organisations have attributes name, url, abbreviation, subdivision, contacts, identifiers
|
116
116
|
# Persons have attributes name, affiliation, contacts
|
117
|
-
# Person names have attributes
|
117
|
+
# Person names have attributes, given, surname, additions, prefixes or completename.
|
118
|
+
# Given has formatted_initials or forename.
|
118
119
|
# Initials, forename, additions, prefixes are arrays.
|
119
120
|
# Name field values are either strings, or hashes, with content and language and script attributes.
|
120
121
|
# The language and script attribute can also be given on the name.
|
@@ -126,9 +127,11 @@ abstract:
|
|
126
127
|
# The affiliation description can be a single string, or a hash of content, language, script, and format.
|
127
128
|
contributor:
|
128
129
|
- organization:
|
129
|
-
name:
|
130
|
+
name:
|
131
|
+
content: International Organization for Standardization
|
130
132
|
url: www.iso.org
|
131
|
-
abbreviation:
|
133
|
+
abbreviation:
|
134
|
+
content: ISO
|
132
135
|
subdivision: division
|
133
136
|
role:
|
134
137
|
type: publisher
|
@@ -140,25 +143,29 @@ contributor:
|
|
140
143
|
language: en
|
141
144
|
affiliation:
|
142
145
|
- organization:
|
143
|
-
name:
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
146
|
+
name:
|
147
|
+
content: IETF
|
148
|
+
abbreviation:
|
149
|
+
content: IETF
|
150
|
+
identifier:
|
151
|
+
- type: uri
|
152
|
+
id: www.ietf.org
|
148
153
|
description: Affiliation description
|
149
154
|
contact:
|
150
|
-
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
155
|
+
- address:
|
156
|
+
street:
|
157
|
+
- 8 Street St
|
158
|
+
city: City
|
159
|
+
postcode: '123456'
|
160
|
+
country: Country
|
161
|
+
state: State
|
162
|
+
- phone: '223322'
|
158
163
|
role: author
|
159
|
-
-
|
160
|
-
name:
|
161
|
-
|
164
|
+
- organization:
|
165
|
+
name:
|
166
|
+
content: Internet Engineering Task Force
|
167
|
+
abbreviation:
|
168
|
+
content: IETF
|
162
169
|
identifier:
|
163
170
|
- type: uri
|
164
171
|
id: www.ietf.org
|
@@ -166,18 +173,24 @@ contributor:
|
|
166
173
|
publisher
|
167
174
|
- person:
|
168
175
|
name:
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
176
|
+
given:
|
177
|
+
forename:
|
178
|
+
initial: A
|
179
|
+
language: en
|
180
|
+
formatted_initials:
|
181
|
+
content: A.
|
182
|
+
surname:
|
183
|
+
content: Bierman
|
173
184
|
affiliation:
|
174
|
-
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
185
|
+
- organization:
|
186
|
+
name:
|
187
|
+
content: IETF
|
188
|
+
abbreviation:
|
189
|
+
content: IETF
|
190
|
+
description:
|
191
|
+
content: Affiliation description
|
192
|
+
language: en
|
193
|
+
script: Latn
|
181
194
|
identifier:
|
182
195
|
- type: uri
|
183
196
|
id: www.person.com
|
@@ -187,11 +200,13 @@ contributor:
|
|
187
200
|
# a "from" date, and an optional "to" date
|
188
201
|
copyright:
|
189
202
|
owner:
|
190
|
-
name:
|
191
|
-
|
203
|
+
name:
|
204
|
+
content: International Organization for Standardization
|
205
|
+
abbreviation:
|
206
|
+
content: ISO
|
192
207
|
url: www.iso.org
|
193
|
-
from: 2014
|
194
|
-
to: 2020
|
208
|
+
from: '2014'
|
209
|
+
to: '2020'
|
195
210
|
# link is an array of URIs, with a type and content
|
196
211
|
link:
|
197
212
|
- type: src
|
@@ -206,15 +221,17 @@ link:
|
|
206
221
|
relation:
|
207
222
|
- type: updates
|
208
223
|
bibitem:
|
209
|
-
formattedref:
|
224
|
+
formattedref:
|
225
|
+
content: ISO 19115:2003
|
210
226
|
bib_locality:
|
211
227
|
type: page
|
212
|
-
reference_from: 7
|
213
|
-
reference_to: 10
|
228
|
+
reference_from: '7'
|
229
|
+
reference_to: '10'
|
214
230
|
- type: updates
|
215
231
|
bibitem:
|
216
232
|
type: standard
|
217
|
-
formattedref:
|
233
|
+
formattedref:
|
234
|
+
content: ISO 19115:2003/Cor 1:2006
|
218
235
|
# series are an array, containing a type, and either a formattedref, or:
|
219
236
|
# a title, a place, an organization (string),
|
220
237
|
# an abbreviation, a from, a to, a number, and a partnumber.
|
@@ -236,8 +253,8 @@ series:
|
|
236
253
|
content: ABVR
|
237
254
|
language: en
|
238
255
|
script: Latn
|
239
|
-
from: 2009-02-01
|
240
|
-
to: 2010-12-20
|
256
|
+
from: '2009-02-01'
|
257
|
+
to: '2010-12-20'
|
241
258
|
number: serie1234
|
242
259
|
partnumber: part5678
|
243
260
|
- type: alt
|
@@ -255,7 +272,7 @@ place: bib place
|
|
255
272
|
# extent is an array, containing type, a reference_from, and an optional reference_to
|
256
273
|
extent:
|
257
274
|
type: section
|
258
|
-
reference_from: 7
|
275
|
+
reference_from: '7'
|
259
276
|
# accesslocation is an array of strings
|
260
277
|
accesslocation:
|
261
278
|
- accesslocation1
|
@@ -266,9 +283,9 @@ classification:
|
|
266
283
|
value: value
|
267
284
|
# validity contains a begins date, an ends date, and a revision date
|
268
285
|
validity:
|
269
|
-
begins: 2010-10-10 12:21
|
270
|
-
ends: 2011-02-03 18:30
|
271
|
-
revision: 2011-03-04 09:00
|
286
|
+
begins: '2010-10-10 12:21'
|
287
|
+
ends: '2011-02-03 18:30'
|
288
|
+
revision: '2011-03-04 09:00'
|
272
289
|
----
|
273
290
|
|
274
291
|
== Metanorma structure (AsciiBib): nested definition list
|
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/>
|
@@ -115,7 +115,7 @@ module RelatonBib
|
|
115
115
|
attr_reader :validity
|
116
116
|
|
117
117
|
# @return [Date]
|
118
|
-
|
118
|
+
attr_accessor :fetched
|
119
119
|
|
120
120
|
# @return [Array<RelatonBib::LocalizedString>]
|
121
121
|
attr_reader :keyword
|
@@ -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]
|
@@ -1013,17 +1017,19 @@ module RelatonBib
|
|
1013
1017
|
if person.name.completename
|
1014
1018
|
builder.parent[:fullname] = person.name.completename.content
|
1015
1019
|
elsif person.name.forename.any?
|
1016
|
-
builder.parent[:fullname] = person.name.forename.map
|
1020
|
+
builder.parent[:fullname] = person.name.forename.map do |n|
|
1021
|
+
n.content || n.initial
|
1022
|
+
end.join " "
|
1017
1023
|
end
|
1018
|
-
if person.name.
|
1019
|
-
builder.parent[:initials] = person.name.
|
1024
|
+
if person.name.initials
|
1025
|
+
builder.parent[:initials] = person.name.initials.content
|
1020
1026
|
elsif person.name.forename.any?
|
1021
1027
|
builder.parent[:initials] = person.name.forename.map do |f|
|
1022
|
-
"#{f.content[0]}."
|
1028
|
+
"#{f.initial || f.content[0]}."
|
1023
1029
|
end.join
|
1024
1030
|
end
|
1025
1031
|
if person.name.surname
|
1026
|
-
if person.name.forename.any?
|
1032
|
+
if !person.name.completename && person.name.forename.any? && person.name.surname
|
1027
1033
|
builder.parent[:fullname] += " #{person.name.surname}"
|
1028
1034
|
end
|
1029
1035
|
builder.parent[:surname] = person.name.surname.content
|
@@ -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,13 +264,30 @@ 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
|
-
surname: localized_string(author[:surname], lang)
|
270
|
+
initials: initials, forename: forename(author[:initials], lang),
|
271
|
+
surname: localized_string(author[:surname], lang)
|
271
272
|
)
|
272
273
|
end
|
273
274
|
|
275
|
+
#
|
276
|
+
# Create forenames with initials
|
277
|
+
#
|
278
|
+
# @param [String] initials initials
|
279
|
+
# @param [String] lang language
|
280
|
+
#
|
281
|
+
# @return [Array<RelatonBib::Forename>] forenames
|
282
|
+
#
|
283
|
+
def forename(initials, lang)
|
284
|
+
return [] unless initials
|
285
|
+
|
286
|
+
initials.split(/\.-?\s?|\s/).map do |i|
|
287
|
+
Forename.new(initial: i, language: lang)
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
274
291
|
# @param author [Nokogiri::XML::Element]
|
275
292
|
# @return [Array<RelatonBib::Affiliation>]
|
276
293
|
def affiliation(author)
|
@@ -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
|
@@ -124,10 +132,11 @@ module RelatonBib
|
|
124
132
|
|
125
133
|
# @return [Hash]
|
126
134
|
def to_hash # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
127
|
-
if content.is_a?
|
128
|
-
return content unless language || script
|
135
|
+
if content.nil? || content.is_a?(String)
|
136
|
+
# return content unless language || script
|
129
137
|
|
130
|
-
hash = {
|
138
|
+
hash = {}
|
139
|
+
hash["content"] = content unless content.nil? || content.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.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: 2022-
|
11
|
+
date: 2022-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: byebug
|
@@ -214,6 +214,7 @@ extensions: []
|
|
214
214
|
extra_rdoc_files: []
|
215
215
|
files:
|
216
216
|
- ".github/workflows/rake.yml"
|
217
|
+
- ".github/workflows/release.yml"
|
217
218
|
- ".gitignore"
|
218
219
|
- ".gitmodules"
|
219
220
|
- ".hound.yml"
|
@@ -251,8 +252,10 @@ files:
|
|
251
252
|
- lib/relaton_bib/document_status.rb
|
252
253
|
- lib/relaton_bib/edition.rb
|
253
254
|
- lib/relaton_bib/editorial_group.rb
|
255
|
+
- lib/relaton_bib/forename.rb
|
254
256
|
- lib/relaton_bib/formatted_ref.rb
|
255
257
|
- lib/relaton_bib/formatted_string.rb
|
258
|
+
- lib/relaton_bib/full_name.rb
|
256
259
|
- lib/relaton_bib/hash_converter.rb
|
257
260
|
- lib/relaton_bib/hit.rb
|
258
261
|
- lib/relaton_bib/hit_collection.rb
|