relaton-bib 0.9.2 → 1.0.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/.hound.yml +2 -0
- data/README.adoc +14 -7
- data/docs/hash.adoc +53 -53
- data/lib/relaton_bib/bib_item_locality.rb +59 -16
- data/lib/relaton_bib/bibliographic_item.rb +6 -2
- data/lib/relaton_bib/document_relation.rb +19 -12
- data/lib/relaton_bib/document_relation_collection.rb +15 -5
- data/lib/relaton_bib/hash_converter.rb +38 -18
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib/xml_parser.rb +59 -12
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cf0aacc339840ecc4607d6b87e625eaef60ba12ab0fbeffba5876898518f138
|
4
|
+
data.tar.gz: e41a599b99baaa6d1002cd3ad13803bcffeaa6949840a8cd757db3689716f06b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f8e1bfe3c6ca8d2ec19733f7ea0f018bae2a102ad92d05bb0983ddf9b7e8715c86c56980ffa106500c2a6971a625143cb6bec2ae9b9a2dd0190fc8b605539c1
|
7
|
+
data.tar.gz: 721ba6235c7cabc380825ce184f0b2874f1ba519b2f6b9dc44fea52ae061b3bdd18ab56c5db94698535b8db10fe365a88aaf23bcd32a25fa5ce7de96bb8a93b6
|
data/.hound.yml
ADDED
data/README.adoc
CHANGED
@@ -155,8 +155,16 @@ item = RelatonBib::BibliographicItem.new(
|
|
155
155
|
bibitem: RelatonBib::BibliographicItem.new(
|
156
156
|
formattedref: RelatonBib::FormattedRef.new(content: "ISO 19115:2003"),
|
157
157
|
),
|
158
|
-
|
159
|
-
RelatonBib::
|
158
|
+
locality: [
|
159
|
+
RelatonBib::LocalityStack.new([
|
160
|
+
RelatonBib::Locality.new("volume", "1"),
|
161
|
+
RelatonBib::Locality.new("section", "2"),
|
162
|
+
]),
|
163
|
+
],
|
164
|
+
source_locality: [
|
165
|
+
RelatonBib::SourceLocalityStack.new([
|
166
|
+
RelatonBib::SourceLocality.new("chapter", "4"),
|
167
|
+
]),
|
160
168
|
],
|
161
169
|
},
|
162
170
|
{
|
@@ -249,7 +257,6 @@ item.abstract
|
|
249
257
|
|
250
258
|
item.abstract(lang: "en").to_s
|
251
259
|
=> "ISO 19115-1:2014 defines the schema required for ..."
|
252
|
-
"
|
253
260
|
----
|
254
261
|
|
255
262
|
=== BibliographicItem references
|
@@ -274,11 +281,11 @@ item.to_xml
|
|
274
281
|
----
|
275
282
|
|
276
283
|
Default root element is `bibitem`. With argument `bibdata: true` the XML wrapped with `bibdata` element.
|
277
|
-
[source,ruby]
|
278
284
|
|
285
|
+
[source,ruby]
|
279
286
|
----
|
280
|
-
item.to_xml
|
281
|
-
=> "<
|
287
|
+
item.to_xml bibdata: true
|
288
|
+
=> "<bibdata type=\"standard\">
|
282
289
|
<fetched>2019-04-30</fetched>
|
283
290
|
<title type=\"main\" language=\"en\" script=\"Latn\">Geographic information</title>
|
284
291
|
...
|
@@ -288,8 +295,8 @@ item.to_xml
|
|
288
295
|
==== Date format
|
289
296
|
|
290
297
|
By default date elements are formatted as year (yyyy). Option `:date_format` allows to output date elements in `:short` (yyyy-mm) and `:full` (yyyy-mm-dd) additiona formats.
|
291
|
-
[surce,ruby]
|
292
298
|
|
299
|
+
[surce,ruby]
|
293
300
|
----
|
294
301
|
item.to_xml date_format: :short
|
295
302
|
=> "<bibitem id=\"ISO/TC211\" type=\"standard\">
|
data/docs/hash.adoc
CHANGED
@@ -2,24 +2,24 @@
|
|
2
2
|
|
3
3
|
== YAML
|
4
4
|
|
5
|
-
The following structure is in place for encoding bibitem as YAML objects, and is also used
|
6
|
-
to represent bibliographic entries in Metanorma
|
5
|
+
The following structure is in place for encoding bibitem as YAML objects, and is also used
|
6
|
+
to represent bibliographic entries in Metanorma AsciiDoc. The structure has not yet been
|
7
7
|
generalised to `bibdata/ext`, the flavour-specific extensions of relaton.
|
8
8
|
|
9
9
|
If an element in Relaton XML has attributes, the content of the element is represented in YAML
|
10
10
|
with a `content` key:
|
11
11
|
|
12
12
|
[source,xml]
|
13
|
-
|
13
|
+
----
|
14
14
|
<title type="main">Geographic information</title>
|
15
|
-
|
15
|
+
----
|
16
16
|
|
17
17
|
[source,yaml]
|
18
|
-
|
18
|
+
----
|
19
19
|
title:
|
20
20
|
type: main
|
21
21
|
content: Geographic information
|
22
|
-
|
22
|
+
----
|
23
23
|
|
24
24
|
Any elements with a cardinality of many can be represented as arrays, but
|
25
25
|
they can also be populated by a hash or single element. For example,
|
@@ -27,7 +27,7 @@ a Relaton title can have multiple titles, and multiple scripts; so
|
|
27
27
|
the following are equivalent:
|
28
28
|
|
29
29
|
[source,yaml]
|
30
|
-
|
30
|
+
----
|
31
31
|
title:
|
32
32
|
- type: main
|
33
33
|
content: Geographic information
|
@@ -37,7 +37,7 @@ title:
|
|
37
37
|
script:
|
38
38
|
- Latn
|
39
39
|
script: Latn
|
40
|
-
|
40
|
+
----
|
41
41
|
|
42
42
|
In YAML, "on" is a reserved word, and thus cannot be used as a key. "value" is used as a synonym for
|
43
43
|
"on" in dates.
|
@@ -45,7 +45,7 @@ In YAML, "on" is a reserved word, and thus cannot be used as a key. "value" is u
|
|
45
45
|
The structure below is given in YAML format:
|
46
46
|
|
47
47
|
[source,yaml]
|
48
|
-
|
48
|
+
----
|
49
49
|
# bibliographic item anchor, used to crossreference within document
|
50
50
|
id: ISO/TC211
|
51
51
|
# date record was created
|
@@ -118,11 +118,11 @@ abstract:
|
|
118
118
|
# Initials, forename, additions, prefixes are arrays.
|
119
119
|
# Name field values are either strings, or hashes, with content and language and script attributes.
|
120
120
|
# The language and script attribute can also be given on the name.
|
121
|
-
# Contacts are an array, containing either addresses, or other fields.
|
122
|
-
# Addresses are identified as hashes containing a city attribute; they can also contain a street
|
121
|
+
# Contacts are an array, containing either addresses, or other fields.
|
122
|
+
# Addresses are identified as hashes containing a city attribute; they can also contain a street
|
123
123
|
# (which is an array), a postcode, a state, and a country. The other contact fields
|
124
124
|
# are phones, emails, uris; they contain a type giving the field name, and a value.
|
125
|
-
# Affiliations are an array, and they contains an organization, and an optional description.
|
125
|
+
# Affiliations are an array, and they contains an organization, and an optional description.
|
126
126
|
# The affiliation description can be a single string, or a hash of content, language, script, and format.
|
127
127
|
contributor:
|
128
128
|
- organization:
|
@@ -130,7 +130,7 @@ contributor:
|
|
130
130
|
url: www.iso.org
|
131
131
|
abbreviation: ISO
|
132
132
|
subdivision: division
|
133
|
-
role:
|
133
|
+
role:
|
134
134
|
type: publisher
|
135
135
|
description: Publisher role
|
136
136
|
- person:
|
@@ -142,7 +142,7 @@ contributor:
|
|
142
142
|
- organization:
|
143
143
|
name: IETF
|
144
144
|
abbreviation: IETF
|
145
|
-
identifier:
|
145
|
+
identifier:
|
146
146
|
- type: uri
|
147
147
|
id: www.ietf.org
|
148
148
|
description: Affiliation description
|
@@ -181,7 +181,7 @@ contributor:
|
|
181
181
|
identifier:
|
182
182
|
- type: uri
|
183
183
|
id: www.person.com
|
184
|
-
role:
|
184
|
+
role:
|
185
185
|
author
|
186
186
|
# copyright consists of an owner (a hash containing the fields of an organisation),
|
187
187
|
# a "from" date, and an optional "to" date
|
@@ -220,7 +220,7 @@ relation:
|
|
220
220
|
# an abbreviation, a from, a to, a number, and a partnumber.
|
221
221
|
# The series title, like the titles of bibliographic items, contains a type,
|
222
222
|
# content, and optional language, script, and format attributes.
|
223
|
-
# The abbreviation and formattedref are either a string,
|
223
|
+
# The abbreviation and formattedref are either a string,
|
224
224
|
# or a hash containing content, language, and script.
|
225
225
|
series:
|
226
226
|
- type: main
|
@@ -241,7 +241,7 @@ series:
|
|
241
241
|
number: serie1234
|
242
242
|
partnumber: part5678
|
243
243
|
- type: alt
|
244
|
-
formattedref:
|
244
|
+
formattedref:
|
245
245
|
content: serieref
|
246
246
|
language: en
|
247
247
|
script: Latn
|
@@ -269,30 +269,30 @@ validity:
|
|
269
269
|
begins: 2010-10-10 12:21
|
270
270
|
ends: 2011-02-03 18:30
|
271
271
|
revision: 2011-03-04 09:00
|
272
|
-
|
272
|
+
----
|
273
273
|
|
274
274
|
== Metanorma structure (AsciiBib): nested definition list
|
275
275
|
|
276
|
-
The Metanorma
|
276
|
+
The Metanorma AsciiDoc representation of the Relaton hash structure
|
277
277
|
in a bibliography
|
278
278
|
is as a definition list of element name and element contents,
|
279
279
|
with nested definition lists for nested structures. If a nested
|
280
280
|
definition is given for an element, the element itself has a blank definition.
|
281
281
|
|
282
|
-
As with the YAML representation, if an element in Relaton XML has attributes,
|
282
|
+
As with the YAML representation, if an element in Relaton XML has attributes,
|
283
283
|
the content of the element is represented in YAML with a `content` key:
|
284
284
|
|
285
285
|
[source,xml]
|
286
|
-
|
286
|
+
----
|
287
287
|
<title type="main">Geographic information</title>
|
288
|
-
|
288
|
+
----
|
289
289
|
|
290
290
|
[source,asciidoc]
|
291
|
-
|
291
|
+
----
|
292
292
|
title::
|
293
293
|
type::: main
|
294
294
|
content::: Geographic information
|
295
|
-
|
295
|
+
----
|
296
296
|
|
297
297
|
Likewise, as with the YAML representation,
|
298
298
|
Repeating elements in a hash can be realised as ordered or unordered lists.
|
@@ -304,9 +304,9 @@ language::
|
|
304
304
|
. fr
|
305
305
|
----
|
306
306
|
|
307
|
-
Metanorma
|
307
|
+
Metanorma AsciiDoc also supports representing repeating elements
|
308
308
|
by repeating the key for that entry. This will almost always be more
|
309
|
-
straightforward to use in
|
309
|
+
straightforward to use in AsciiDoc:
|
310
310
|
|
311
311
|
[source,asciidoc]
|
312
312
|
----
|
@@ -314,19 +314,19 @@ language:: en
|
|
314
314
|
language:: fr
|
315
315
|
----
|
316
316
|
|
317
|
-
Each Relaton entry in a bibliography is represented in Metanorma
|
317
|
+
Each Relaton entry in a bibliography is represented in Metanorma AsciiDoc
|
318
318
|
through a subclause with option attribute `[%bibitem]`. Any title given to the
|
319
319
|
subclause is treated as the title for the bibliographic entry, with language `en`,
|
320
|
-
script `Latn`, format `text/plain`, and type `main`.
|
320
|
+
script `Latn`, format `text/plain`, and type `main`.
|
321
321
|
|
322
|
-
So the following is a very simple reference in Metanorma
|
322
|
+
So the following is a very simple reference in Metanorma AsciiDoc:
|
323
323
|
|
324
324
|
[source,asciidoc]
|
325
325
|
----
|
326
326
|
[%bibitem]
|
327
327
|
=== Rubber latex -- Sampling
|
328
328
|
id:: iso123
|
329
|
-
docid::
|
329
|
+
docid::
|
330
330
|
type::: ISO
|
331
331
|
id::: ISO 123
|
332
332
|
docid::
|
@@ -355,7 +355,7 @@ content::: Latex de caoutchouc -- Échantillonnage
|
|
355
355
|
Note the use of `content` as a key to represent the contents of the `title` tag.
|
356
356
|
|
357
357
|
The anchor crossreference for the bibliographic entry may be encoded as either the
|
358
|
-
`id` entry in the definition list, or as the normal
|
358
|
+
`id` entry in the definition list, or as the normal AsciiDoc anchor on the
|
359
359
|
subclause, which takes priority:
|
360
360
|
|
361
361
|
[source,asciidoc]
|
@@ -363,7 +363,7 @@ subclause, which takes priority:
|
|
363
363
|
[[iso123]]
|
364
364
|
[%bibitem]
|
365
365
|
=== Rubber latex -- Sampling
|
366
|
-
docid::
|
366
|
+
docid::
|
367
367
|
type::: ISO
|
368
368
|
id::: ISO 123
|
369
369
|
type:: standard
|
@@ -376,7 +376,7 @@ Repeating elements in a hash can be realised as ordered or unordered lists.
|
|
376
376
|
[[iso123]]
|
377
377
|
[%bibitem]
|
378
378
|
=== Rubber latex -- Sampling
|
379
|
-
docid::
|
379
|
+
docid::
|
380
380
|
type::: ISO
|
381
381
|
id::: ISO 123
|
382
382
|
language::
|
@@ -384,23 +384,23 @@ language::
|
|
384
384
|
. fr
|
385
385
|
----
|
386
386
|
|
387
|
-
Metanorma
|
387
|
+
Metanorma AsciiDoc also supports representing repeating elements
|
388
388
|
by repeating the key for that entry. This will almost always be more
|
389
|
-
straightforward to use in
|
389
|
+
straightforward to use in AsciiDoc:
|
390
390
|
|
391
391
|
[source,asciidoc]
|
392
392
|
----
|
393
393
|
[[iso123]]
|
394
394
|
[%bibitem]
|
395
395
|
=== Rubber latex -- Sampling
|
396
|
-
docid::
|
396
|
+
docid::
|
397
397
|
type::: ISO
|
398
398
|
id::: ISO 123
|
399
399
|
language:: en
|
400
400
|
language:: fr
|
401
401
|
----
|
402
402
|
|
403
|
-
|
403
|
+
AsciiDoc does not recognise definition lists more than four levels
|
404
404
|
deep. If deeper nesting is needed, you will need to attach a new definition
|
405
405
|
list with a list continuation, with the definition list depth reset back to one:
|
406
406
|
|
@@ -409,7 +409,7 @@ list with a list continuation, with the definition list depth reset back to one:
|
|
409
409
|
[[iso123]]
|
410
410
|
[%bibitem]
|
411
411
|
=== Rubber latex -- Sampling
|
412
|
-
docid::
|
412
|
+
docid::
|
413
413
|
type::: ISO
|
414
414
|
id::: ISO 123
|
415
415
|
type:: standard
|
@@ -428,25 +428,25 @@ completename::
|
|
428
428
|
(This is very awkward, and <<JSONPath>> provides a workaround.)
|
429
429
|
|
430
430
|
The most heavily nested parts of a Relaton entry are the contributors,
|
431
|
-
series, and relations.
|
431
|
+
series, and relations.
|
432
432
|
Each of these can be marked up as subclauses within the entry, with the clause
|
433
433
|
titles "contributor", "series", and "relation". Each subclause contains
|
434
434
|
a new definition list, with its definition list reset to zero depth;
|
435
435
|
the subclauses can be repeated for multiple instances of the same subentity.
|
436
436
|
|
437
|
-
AsciiBib citations can be combined with other
|
438
|
-
same Metanorma document; but any
|
437
|
+
AsciiBib citations can be combined with other AsciiDoc citations in the
|
438
|
+
same Metanorma document; but any AsciiDoc citations need be precede
|
439
439
|
AsciiBib citations. Each AsciiBib citations constitutes a subclause of its own,
|
440
440
|
and Metanorma will (unsuccessfully) attempt to incorporate any trailing material
|
441
|
-
in the subclause, including
|
441
|
+
in the subclause, including AsciiDoc citations, into the current AsciiBib
|
442
442
|
citation.
|
443
443
|
|
444
|
-
The following is Metanorma
|
444
|
+
The following is Metanorma AsciiDoc markup corresponding to the YAML
|
445
445
|
given above:
|
446
446
|
|
447
447
|
|
448
448
|
[source,asciidoc]
|
449
|
-
|
449
|
+
----
|
450
450
|
[[ISO/TC211]]
|
451
451
|
[%bibitem]
|
452
452
|
=== {blank}
|
@@ -547,7 +547,7 @@ organization::
|
|
547
547
|
url::: www.iso.org
|
548
548
|
abbreviation::: ISO
|
549
549
|
subdivision::: division
|
550
|
-
role::
|
550
|
+
role::
|
551
551
|
type::: publisher
|
552
552
|
description::: Publisher role
|
553
553
|
|
@@ -654,15 +654,15 @@ formattedref::
|
|
654
654
|
content::: serieref
|
655
655
|
language::: en
|
656
656
|
script::: Latn
|
657
|
-
|
657
|
+
----
|
658
658
|
|
659
659
|
[[JSONPath]]
|
660
660
|
== JSON Path style definition lists
|
661
661
|
|
662
662
|
The foregoing structure requires frequent breakouts into open blocks, to deal
|
663
|
-
with the limitation on
|
664
|
-
represent the nested structure of Relaton records in a simple, one-level definition list,
|
665
|
-
and to use the key for each key-value pair to represent the hierarchical nesting of entries,
|
663
|
+
with the limitation on AsciiDoc nested definition lists. An alternative is to
|
664
|
+
represent the nested structure of Relaton records in a simple, one-level definition list,
|
665
|
+
and to use the key for each key-value pair to represent the hierarchical nesting of entries,
|
666
666
|
as a dot-delimited path of keys. For example,
|
667
667
|
|
668
668
|
[source,asciidoc]
|
@@ -670,7 +670,7 @@ as a dot-delimited path of keys. For example,
|
|
670
670
|
[%bibitem]
|
671
671
|
=== Rubber latex -- Sampling
|
672
672
|
id:: iso123
|
673
|
-
docid::
|
673
|
+
docid::
|
674
674
|
type::: ISO
|
675
675
|
id::: ISO 123
|
676
676
|
----
|
@@ -693,7 +693,7 @@ Whenever part of the key is repeated between entries, the entries are assumed to
|
|
693
693
|
[%bibitem]
|
694
694
|
=== Rubber latex -- Sampling
|
695
695
|
id:: iso123
|
696
|
-
docid::
|
696
|
+
docid::
|
697
697
|
type::: ISO
|
698
698
|
id::: ISO 123
|
699
699
|
docid::
|
@@ -754,11 +754,11 @@ contributor.person.contact.type:: phone
|
|
754
754
|
contributor.person.contact.value:: 223322
|
755
755
|
----
|
756
756
|
|
757
|
-
The following is Metanorma
|
757
|
+
The following is Metanorma AsciiDoc markup corresponding to the YAML
|
758
758
|
given above, using JSON Path style definition lists instead of nested definition lists:
|
759
759
|
|
760
760
|
[source,asciidoc]
|
761
|
-
|
761
|
+
----
|
762
762
|
[[ISO/TC211]]
|
763
763
|
[%bibitem]
|
764
764
|
=== {blank}
|
@@ -1,20 +1,4 @@
|
|
1
1
|
module RelatonBib
|
2
|
-
# class SpecificLocalityType
|
3
|
-
# SECTION = 'section'
|
4
|
-
# CLAUSE = 'clause'
|
5
|
-
# PART = 'part'
|
6
|
-
# PARAGRAPH = 'paragraph'
|
7
|
-
# CHAPTER = 'chapter'
|
8
|
-
# PAGE = 'page'
|
9
|
-
# WHOLE = 'whole'
|
10
|
-
# TABLE = 'table'
|
11
|
-
# ANNEX = 'annex'
|
12
|
-
# FIGURE = 'figure'
|
13
|
-
# NOTE = 'note'
|
14
|
-
# EXAMPLE = 'example'
|
15
|
-
# # generic String is allowed
|
16
|
-
# end
|
17
|
-
|
18
2
|
# Bibliographic item locality.
|
19
3
|
class BibItemLocality
|
20
4
|
# @return [String]
|
@@ -30,6 +14,13 @@ module RelatonBib
|
|
30
14
|
# @param referenceFrom [String]
|
31
15
|
# @param referenceTo [String, NilClass]
|
32
16
|
def initialize(type, reference_from, reference_to = nil)
|
17
|
+
type_ptrn = %r{section|clause|part|paragraph|chapter|page|whole|table|
|
18
|
+
annex|figure|note|list|example|volume|issue|time|
|
19
|
+
locality:[a-zA-Z0-9_]+}x
|
20
|
+
unless type =~ type_ptrn
|
21
|
+
warn "[relaton-bib] WARNING: invalid locality type: #{type}"
|
22
|
+
end
|
23
|
+
|
33
24
|
@type = type
|
34
25
|
@reference_from = reference_from
|
35
26
|
@reference_to = reference_to
|
@@ -49,4 +40,56 @@ module RelatonBib
|
|
49
40
|
hash
|
50
41
|
end
|
51
42
|
end
|
43
|
+
|
44
|
+
class Locality < BibItemLocality
|
45
|
+
# @param builder [Nokogiri::XML::Builder]
|
46
|
+
def to_xml(builder)
|
47
|
+
builder.locality { |b| super(b) }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class LocalityStack
|
52
|
+
include RelatonBib
|
53
|
+
|
54
|
+
# @return [Array<RelatonBib::Locality>]
|
55
|
+
attr_reader :locality
|
56
|
+
|
57
|
+
# @param locality [Array<RelatonBib::Locality>]
|
58
|
+
def initialize(locality)
|
59
|
+
@locality = locality
|
60
|
+
end
|
61
|
+
|
62
|
+
# @param builder [Nokogiri::XML::Builder]
|
63
|
+
def to_xml(builder)
|
64
|
+
builder.localityStack do |b|
|
65
|
+
locality.each { |l| l.to_xml(b) }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# @returnt [Hash]
|
70
|
+
def to_hash
|
71
|
+
{ "locality_stack" => single_element_array(locality) }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class SourceLocality < BibItemLocality
|
76
|
+
# @param builder [Nokogiri::XML::Builder]
|
77
|
+
def to_xml(builder)
|
78
|
+
builder.sourceLocality { |b| super(b) }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class SourceLocalityStack < LocalityStack
|
83
|
+
# @param builder [Nokogiri::XML::Builder]
|
84
|
+
def to_xml(builder)
|
85
|
+
builder.sourceLocalityStack do |b|
|
86
|
+
locality.each { |l| l.to_xml(b) }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# @returnt [Hash]
|
91
|
+
def to_hash
|
92
|
+
{ "source_locality_stack" => single_element_array(locality) }
|
93
|
+
end
|
94
|
+
end
|
52
95
|
end
|
@@ -167,8 +167,12 @@ module RelatonBib
|
|
167
167
|
#
|
168
168
|
# @param relation [Array<Hash>]
|
169
169
|
# @option relation [String] :type
|
170
|
-
# @option relation [RelatonBib::BibliographicItem,
|
171
|
-
#
|
170
|
+
# @option relation [RelatonBib::BibliographicItem,
|
171
|
+
# RelatonIso::IsoBibliographicItem] :bibitem
|
172
|
+
# @option relation [Array<RelatonBib::Locality,
|
173
|
+
# RelatonBib::LocalityStack>] :locality
|
174
|
+
# @option relation [Array<RelatonBib::SourceLocality,
|
175
|
+
# RelatonBib::SourceLocalityStack>] :source_locality
|
172
176
|
#
|
173
177
|
# @param link [Array<Hash, RelatonBib::TypedUri>]
|
174
178
|
# @option link [String] :type
|
@@ -25,17 +25,22 @@ module RelatonBib
|
|
25
25
|
# @return [RelatonBib::BibliographicItem]
|
26
26
|
attr_reader :bibitem
|
27
27
|
|
28
|
-
# @return [Array<RelatonBib::
|
29
|
-
attr_reader :
|
28
|
+
# @return [Array<RelatonBib::Locality, RelatonBib::LocalityStack>]
|
29
|
+
attr_reader :locality
|
30
|
+
|
31
|
+
# @return [Array<RelatonBib::SourceLocality, RelatonBib::SourceLocalityStack>]
|
32
|
+
attr_reader :source_locality
|
30
33
|
|
31
34
|
# @param type [String]
|
32
35
|
# @param bibitem [RelatonBib::BibliographicItem, RelatonIso::IsoBibliographicItem]
|
33
|
-
# @param
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
@
|
38
|
-
@
|
36
|
+
# @param locality [Array<RelatonBib::Locality, RelatonBib::LocalityStack>]
|
37
|
+
# @param source_locality [Array<RelatonBib::SourceLocality, RelatonBib::SourceLocalityStack>]
|
38
|
+
def initialize(type:, bibitem:, locality: [], source_locality: [])
|
39
|
+
type = "obsoletes" if type == "Now withdrawn"
|
40
|
+
@type = type
|
41
|
+
@locality = locality
|
42
|
+
@source_locality = source_locality
|
43
|
+
@bibitem = bibitem
|
39
44
|
end
|
40
45
|
|
41
46
|
# @param builder [Nokogiri::XML::Builder]
|
@@ -44,16 +49,18 @@ module RelatonBib
|
|
44
49
|
opts.delete :note
|
45
50
|
builder.relation(type: type) do
|
46
51
|
bibitem.to_xml(builder, **opts.merge(embedded: true))
|
47
|
-
|
48
|
-
|
49
|
-
end
|
52
|
+
locality.each { |l| l.to_xml builder }
|
53
|
+
source_locality.each { |l| l.to_xml builder }
|
50
54
|
end
|
51
55
|
end
|
52
56
|
|
53
57
|
# @return [Hash]
|
54
58
|
def to_hash
|
55
59
|
hash = { "type" => type, "bibitem" => bibitem.to_hash }
|
56
|
-
hash["
|
60
|
+
hash["locality"] = single_element_array(locality) if locality&.any?
|
61
|
+
if source_locality&.any?
|
62
|
+
hash["source_locality"] = single_element_array(source_locality)
|
63
|
+
end
|
57
64
|
hash
|
58
65
|
end
|
59
66
|
end
|
@@ -1,21 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "forwardable"
|
4
|
+
|
3
5
|
module RelatonBib
|
4
6
|
# Document relation collection
|
5
|
-
class DocRelationCollection
|
7
|
+
class DocRelationCollection
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
def_delegators :@array, :<<, :[], :first, :last, :empty?, :any?, :size,
|
11
|
+
:each, :detect, :map, :length
|
12
|
+
|
6
13
|
# @param relation [Array<RelatonBib::DocumentRelation, Hash>]
|
7
14
|
# @option relation [String] :type
|
8
15
|
# @option relation [String] :identifier
|
9
16
|
# @option relation [String, NIllClass] :url (nil)
|
10
|
-
# @option relation [Array<RelatonBib::
|
17
|
+
# @option relation [Array<RelatonBib::Locality,
|
18
|
+
# RelatonBib::LocalityStack>] :locality
|
19
|
+
# @option relation [Array<RelatonBib::SourceLocality,
|
20
|
+
# RelatonBib::SourceLocalityStack>] :source_locality
|
11
21
|
# @option relation [RelatonBib::BibliographicItem, NillClass] :bibitem (nil)
|
12
22
|
def initialize(relation)
|
13
|
-
|
23
|
+
@array = relation.map { |r| r.is_a?(Hash) ? DocumentRelation.new(r) : r }
|
14
24
|
end
|
15
25
|
|
16
|
-
# @return [
|
26
|
+
# @return [RelatonBib::DocRelationCollection]
|
17
27
|
def replaces
|
18
|
-
select { |r| r.type == "replace" }
|
28
|
+
DocRelationCollection.new @array.select { |r| r.type == "replace" }
|
19
29
|
end
|
20
30
|
end
|
21
31
|
end
|
@@ -252,40 +252,60 @@ module RelatonBib
|
|
252
252
|
end
|
253
253
|
end
|
254
254
|
|
255
|
+
# @param ret [Hash]
|
255
256
|
def relations_hash_to_bib(ret)
|
256
257
|
return unless ret[:relation]
|
257
258
|
|
258
259
|
ret[:relation] = array(ret[:relation])
|
259
|
-
ret[:relation]&.
|
260
|
-
relation_bibitem_hash_to_bib(
|
261
|
-
|
260
|
+
ret[:relation]&.each do |r|
|
261
|
+
relation_bibitem_hash_to_bib(r)
|
262
|
+
relation_locality_hash_to_bib(r)
|
263
|
+
relation_source_locality_hash_to_bib(r)
|
262
264
|
end
|
263
265
|
end
|
264
266
|
|
265
|
-
# @param ret [Hash]
|
266
267
|
# @param rel [Hash] relation
|
267
|
-
|
268
|
-
def relation_bibitem_hash_to_bib(ret, rel, idx)
|
268
|
+
def relation_bibitem_hash_to_bib(rel)
|
269
269
|
if rel[:bibitem]
|
270
|
-
|
270
|
+
rel[:bibitem] = bib_item hash_to_bib(rel[:bibitem], true)
|
271
271
|
else
|
272
272
|
warn "[relaton-bib] bibitem missing: #{rel}"
|
273
|
-
|
273
|
+
rel[:bibitem] = nil
|
274
274
|
end
|
275
275
|
end
|
276
276
|
|
277
|
-
# @param
|
278
|
-
# @
|
279
|
-
def bib_item(
|
280
|
-
BibliographicItem.new
|
277
|
+
# @param item_hash [Hash]
|
278
|
+
# @return [RelatonBib::BibliographicItem]
|
279
|
+
def bib_item(item_hash)
|
280
|
+
BibliographicItem.new item_hash
|
281
281
|
end
|
282
282
|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
283
|
+
# @param rel [Hash] relation
|
284
|
+
def relation_locality_hash_to_bib(rel)
|
285
|
+
rel[:locality] = array(rel[:locality])&.map do |bl|
|
286
|
+
ls = if bl[:locality_stack]
|
287
|
+
array(bl[:locality_stack]).map do |l|
|
288
|
+
Locality.new(l[:type], l[:reference_from], l[:reference_to])
|
289
|
+
end
|
290
|
+
else
|
291
|
+
[Locality.new(bl[:type], bl[:reference_from], bl[:reference_to])]
|
292
|
+
end
|
293
|
+
LocalityStack.new ls
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
# @param rel [Hash] relation
|
298
|
+
def relation_source_locality_hash_to_bib(rel)
|
299
|
+
rel[:source_locality] = array(rel[:source_locality])&.map do |sl|
|
300
|
+
sls = if sl[:source_locality_stack]
|
301
|
+
array(sl[:source_locality_stack]).map do |l|
|
302
|
+
SourceLocality.new(l[:type], l[:reference_from], l[:reference_to])
|
303
|
+
end
|
304
|
+
else
|
305
|
+
[SourceLocality.new(sl[:type], sl[:reference_from], sl[:reference_to])]
|
306
|
+
end
|
307
|
+
SourceLocalityStack.new sls
|
308
|
+
end
|
289
309
|
end
|
290
310
|
|
291
311
|
def series_hash_to_bib(ret)
|
data/lib/relaton_bib/version.rb
CHANGED
@@ -8,9 +8,9 @@ module RelatonBib
|
|
8
8
|
doc.remove_namespaces!
|
9
9
|
bibitem = doc.at "/bibitem|/bibdata"
|
10
10
|
if bibitem
|
11
|
-
|
11
|
+
bib_item item_data(bibitem)
|
12
12
|
else
|
13
|
-
warn "[
|
13
|
+
warn "[relaton-bib] WARNING: can't find bibitem or bibdata element in the XML"
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -257,6 +257,8 @@ module RelatonBib
|
|
257
257
|
end
|
258
258
|
end
|
259
259
|
|
260
|
+
# @param item [Nokogiri::XML::Element]
|
261
|
+
# @return [Array<RelatonBib::ContributionInfo>]
|
260
262
|
def fetch_contributors(item)
|
261
263
|
item.xpath("./contributor").map do |c|
|
262
264
|
entity = if (org = c.at "./organization") then get_org(org)
|
@@ -269,6 +271,8 @@ module RelatonBib
|
|
269
271
|
end
|
270
272
|
end
|
271
273
|
|
274
|
+
# @param item [Nokogiri::XML::Element]
|
275
|
+
# @return [Array<RelatonBib::FormattedString>]
|
272
276
|
def fetch_abstract(item)
|
273
277
|
item.xpath("./abstract").map do |a|
|
274
278
|
FormattedString.new(
|
@@ -277,6 +281,8 @@ module RelatonBib
|
|
277
281
|
end
|
278
282
|
end
|
279
283
|
|
284
|
+
# @param item [Nokogiri::XML::Element]
|
285
|
+
# @return [RelatonBib::CopyrightAssociation]
|
280
286
|
def fetch_copyright(item)
|
281
287
|
cp = item.at("./copyright") || return
|
282
288
|
org = cp&.at("owner/organization")
|
@@ -290,30 +296,71 @@ module RelatonBib
|
|
290
296
|
CopyrightAssociation.new(owner: owner, from: from, to: to)
|
291
297
|
end
|
292
298
|
|
299
|
+
# @param item [Nokogiri::XML::Element]
|
300
|
+
# @return [Arra<RelatonBib::TypedUri>]
|
293
301
|
def fetch_link(item)
|
294
302
|
item.xpath("./uri").map do |l|
|
295
303
|
TypedUri.new type: l[:type], content: l.text
|
296
304
|
end
|
297
305
|
end
|
298
306
|
|
307
|
+
# @param item [Nokogiri::XML::Element]
|
308
|
+
# @return [Array<RelatonBib::DocumentRelation>]
|
299
309
|
def fetch_relations(item)
|
300
310
|
item.xpath("./relation").map do |rel|
|
301
|
-
localities = rel.xpath("./locality").map do |l|
|
302
|
-
ref_to = (rt = l.at("./referenceTo")) ? LocalizedString.new(rt.text) : nil
|
303
|
-
BibItemLocality.new(
|
304
|
-
l[:type],
|
305
|
-
LocalizedString.new(l.at("./referenceFrom").text),
|
306
|
-
ref_to,
|
307
|
-
)
|
308
|
-
end
|
309
311
|
DocumentRelation.new(
|
310
312
|
type: rel[:type]&.empty? ? nil : rel[:type],
|
311
|
-
bibitem:
|
312
|
-
|
313
|
+
bibitem: bib_item(item_data(rel.at("./bibitem"))),
|
314
|
+
locality: localities(rel),
|
315
|
+
source_locality: source_localities(rel),
|
313
316
|
)
|
314
317
|
end
|
315
318
|
end
|
316
319
|
|
320
|
+
# @param item_hash [Hash]
|
321
|
+
# @return [RelatonBib::BibliographicItem]
|
322
|
+
def bib_item(item_hash)
|
323
|
+
BibliographicItem.new item_hash
|
324
|
+
end
|
325
|
+
|
326
|
+
# @param rel [Nokogiri::XML::Element]
|
327
|
+
# @return [Array<RelatonBib::Locality, RelatonBib::LocalityStack>]
|
328
|
+
def localities(rel)
|
329
|
+
rel.xpath("./locality|./localityStack").map do |lc|
|
330
|
+
if lc[:type]
|
331
|
+
LocalityStack.new [locality(lc)]
|
332
|
+
else
|
333
|
+
LocalityStack.new lc.xpath("./locality").map { |l| locality l }
|
334
|
+
end
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
# @param loc [Nokogiri::XML::Element]
|
339
|
+
# @return [RelatonBib::Locality]
|
340
|
+
def locality(loc, klass = Locality)
|
341
|
+
ref_to = (rt = loc.at("./referenceTo")) ? LocalizedString.new(rt.text) : nil
|
342
|
+
klass.new(
|
343
|
+
loc[:type],
|
344
|
+
LocalizedString.new(loc.at("./referenceFrom").text),
|
345
|
+
ref_to,
|
346
|
+
)
|
347
|
+
end
|
348
|
+
|
349
|
+
# @param rel [Nokogiri::XML::Element]
|
350
|
+
# @return [Array<RelatonBib::SourceLocality, RelatonBib::SourceLocalityStack>]
|
351
|
+
def source_localities(rel)
|
352
|
+
rel.xpath("./sourceLocality|./sourceLocalityStack").map do |lc|
|
353
|
+
if lc[:type]
|
354
|
+
SourceLocalityStack.new [locality(lc, SourceLocality)]
|
355
|
+
else
|
356
|
+
sls = lc.xpath("./sourceLocality").map { |l| locality l, SourceLocality }
|
357
|
+
SourceLocalityStack.new sls
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
# @param item [Nokogiri::XML::Element]
|
363
|
+
# @return [RelatonBib::FormattedRef, NilClass]
|
317
364
|
def fref(item)
|
318
365
|
ident = item&.at("./formattedref")
|
319
366
|
return unless ident
|
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: 0.
|
4
|
+
version: 1.0.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: 2020-04-
|
11
|
+
date: 2020-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: debase
|
@@ -190,6 +190,7 @@ files:
|
|
190
190
|
- ".github/workflows/windows.yml"
|
191
191
|
- ".gitignore"
|
192
192
|
- ".gitmodules"
|
193
|
+
- ".hound.yml"
|
193
194
|
- ".rspec"
|
194
195
|
- ".rubocop.yml"
|
195
196
|
- Gemfile
|