relaton-bib 1.11.7 → 1.12.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/README.adoc +50 -221
- data/grammars/biblio.rng +134 -39
- data/grammars/isodoc.rng +77 -0
- data/lib/relaton_bib/bib_item_locality.rb +1 -1
- data/lib/relaton_bib/biblio_version.rb +12 -15
- data/lib/relaton_bib/bibliographic_date.rb +2 -1
- data/lib/relaton_bib/bibliographic_item.rb +54 -41
- data/lib/relaton_bib/bibxml_parser.rb +10 -0
- data/lib/relaton_bib/document_identifier.rb +21 -12
- data/lib/relaton_bib/edition.rb +55 -0
- data/lib/relaton_bib/hash_converter.rb +14 -16
- data/lib/relaton_bib/series.rb +16 -21
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib/xml_parser.rb +17 -10
- data/lib/relaton_bib.rb +16 -0
- metadata +3 -2
data/grammars/isodoc.rng
CHANGED
|
@@ -32,6 +32,43 @@
|
|
|
32
32
|
<ref name="DocumentType"/>
|
|
33
33
|
</element>
|
|
34
34
|
</define>
|
|
35
|
+
<define name="admonition">
|
|
36
|
+
<element name="admonition">
|
|
37
|
+
<attribute name="type">
|
|
38
|
+
<ref name="AdmonitionType"/>
|
|
39
|
+
</attribute>
|
|
40
|
+
<optional>
|
|
41
|
+
<attribute name="class"/>
|
|
42
|
+
</optional>
|
|
43
|
+
<attribute name="id">
|
|
44
|
+
<data type="ID"/>
|
|
45
|
+
</attribute>
|
|
46
|
+
<optional>
|
|
47
|
+
<attribute name="uri">
|
|
48
|
+
<data type="anyURI"/>
|
|
49
|
+
</attribute>
|
|
50
|
+
</optional>
|
|
51
|
+
<optional>
|
|
52
|
+
<attribute name="coverpage">
|
|
53
|
+
<data type="boolean"/>
|
|
54
|
+
</attribute>
|
|
55
|
+
</optional>
|
|
56
|
+
<optional>
|
|
57
|
+
<attribute name="notag">
|
|
58
|
+
<data type="boolean"/>
|
|
59
|
+
</attribute>
|
|
60
|
+
</optional>
|
|
61
|
+
<optional>
|
|
62
|
+
<ref name="tname"/>
|
|
63
|
+
</optional>
|
|
64
|
+
<zeroOrMore>
|
|
65
|
+
<ref name="paragraph-with-footnote"/>
|
|
66
|
+
</zeroOrMore>
|
|
67
|
+
<zeroOrMore>
|
|
68
|
+
<ref name="note"/>
|
|
69
|
+
</zeroOrMore>
|
|
70
|
+
</element>
|
|
71
|
+
</define>
|
|
35
72
|
<define name="index">
|
|
36
73
|
<element name="index">
|
|
37
74
|
<optional>
|
|
@@ -79,6 +116,11 @@
|
|
|
79
116
|
<data type="boolean"/>
|
|
80
117
|
</attribute>
|
|
81
118
|
</optional>
|
|
119
|
+
<optional>
|
|
120
|
+
<attribute name="suppress_identifier">
|
|
121
|
+
<data type="boolean"/>
|
|
122
|
+
</attribute>
|
|
123
|
+
</optional>
|
|
82
124
|
<ref name="BibliographicItem"/>
|
|
83
125
|
</element>
|
|
84
126
|
</define>
|
|
@@ -245,6 +287,9 @@
|
|
|
245
287
|
<ref name="MultilingualRenderingType"/>
|
|
246
288
|
</attribute>
|
|
247
289
|
</optional>
|
|
290
|
+
<optional>
|
|
291
|
+
<ref name="tname"/>
|
|
292
|
+
</optional>
|
|
248
293
|
<oneOrMore>
|
|
249
294
|
<ref name="ul_li"/>
|
|
250
295
|
</oneOrMore>
|
|
@@ -287,6 +332,9 @@
|
|
|
287
332
|
</choice>
|
|
288
333
|
</attribute>
|
|
289
334
|
</optional>
|
|
335
|
+
<optional>
|
|
336
|
+
<ref name="tname"/>
|
|
337
|
+
</optional>
|
|
290
338
|
<oneOrMore>
|
|
291
339
|
<ref name="li"/>
|
|
292
340
|
</oneOrMore>
|
|
@@ -323,6 +371,9 @@
|
|
|
323
371
|
<ref name="MultilingualRenderingType"/>
|
|
324
372
|
</attribute>
|
|
325
373
|
</optional>
|
|
374
|
+
<optional>
|
|
375
|
+
<ref name="tname"/>
|
|
376
|
+
</optional>
|
|
326
377
|
<oneOrMore>
|
|
327
378
|
<ref name="dt"/>
|
|
328
379
|
<ref name="dd"/>
|
|
@@ -657,6 +708,9 @@
|
|
|
657
708
|
<optional>
|
|
658
709
|
<attribute name="tag"/>
|
|
659
710
|
</optional>
|
|
711
|
+
<optional>
|
|
712
|
+
<attribute name="type"/>
|
|
713
|
+
</optional>
|
|
660
714
|
<optional>
|
|
661
715
|
<attribute name="multilingual-rendering">
|
|
662
716
|
<ref name="MultilingualRenderingType"/>
|
|
@@ -692,6 +746,9 @@
|
|
|
692
746
|
<optional>
|
|
693
747
|
<attribute name="tag"/>
|
|
694
748
|
</optional>
|
|
749
|
+
<optional>
|
|
750
|
+
<attribute name="type"/>
|
|
751
|
+
</optional>
|
|
695
752
|
<optional>
|
|
696
753
|
<attribute name="multilingual-rendering">
|
|
697
754
|
<ref name="MultilingualRenderingType"/>
|
|
@@ -851,6 +908,16 @@
|
|
|
851
908
|
<ref name="MultilingualRenderingType"/>
|
|
852
909
|
</attribute>
|
|
853
910
|
</optional>
|
|
911
|
+
<optional>
|
|
912
|
+
<attribute name="coverpage">
|
|
913
|
+
<data type="boolean"/>
|
|
914
|
+
</attribute>
|
|
915
|
+
</optional>
|
|
916
|
+
<optional>
|
|
917
|
+
<attribute name="notag">
|
|
918
|
+
<data type="boolean"/>
|
|
919
|
+
</attribute>
|
|
920
|
+
</optional>
|
|
854
921
|
<oneOrMore>
|
|
855
922
|
<choice>
|
|
856
923
|
<ref name="paragraph"/>
|
|
@@ -1178,6 +1245,7 @@
|
|
|
1178
1245
|
<ref name="concept"/>
|
|
1179
1246
|
<ref name="add"/>
|
|
1180
1247
|
<ref name="del"/>
|
|
1248
|
+
<ref name="span"/>
|
|
1181
1249
|
</choice>
|
|
1182
1250
|
</define>
|
|
1183
1251
|
<define name="add">
|
|
@@ -1204,6 +1272,14 @@
|
|
|
1204
1272
|
</choice>
|
|
1205
1273
|
</element>
|
|
1206
1274
|
</define>
|
|
1275
|
+
<define name="span">
|
|
1276
|
+
<element name="span">
|
|
1277
|
+
<attribute name="class"/>
|
|
1278
|
+
<oneOrMore>
|
|
1279
|
+
<ref name="TextElement"/>
|
|
1280
|
+
</oneOrMore>
|
|
1281
|
+
</element>
|
|
1282
|
+
</define>
|
|
1207
1283
|
<define name="concept">
|
|
1208
1284
|
<element name="concept">
|
|
1209
1285
|
<optional>
|
|
@@ -1994,6 +2070,7 @@
|
|
|
1994
2070
|
<value>compare</value>
|
|
1995
2071
|
<value>contrast</value>
|
|
1996
2072
|
<value>see</value>
|
|
2073
|
+
<value>seealso</value>
|
|
1997
2074
|
</choice>
|
|
1998
2075
|
</define>
|
|
1999
2076
|
<define name="deprecates">
|
|
@@ -17,7 +17,7 @@ module RelatonBib
|
|
|
17
17
|
type_ptrn = %r{section|clause|part|paragraph|chapter|page|whole|table|
|
|
18
18
|
annex|figure|note|list|example|volume|issue|time|
|
|
19
19
|
locality:[a-zA-Z0-9_]+}x
|
|
20
|
-
unless type
|
|
20
|
+
unless type&.match? type_ptrn
|
|
21
21
|
warn "[relaton-bib] WARNING: invalid locality type: #{type}"
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -4,15 +4,12 @@ module RelatonBib
|
|
|
4
4
|
class Version
|
|
5
5
|
include RelatonBib
|
|
6
6
|
|
|
7
|
-
# @return [String,
|
|
8
|
-
attr_reader :revision_date
|
|
7
|
+
# @return [String, nil]
|
|
8
|
+
attr_reader :revision_date, :draft
|
|
9
9
|
|
|
10
|
-
# @
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
# @param revision_date [String, NilClass]
|
|
14
|
-
# @param draft [Array<String>]
|
|
15
|
-
def initialize(revision_date = nil, draft = [])
|
|
10
|
+
# @param revision_date [String, nil]
|
|
11
|
+
# @param draft [String, nil]
|
|
12
|
+
def initialize(revision_date = nil, draft = nil)
|
|
16
13
|
@revision_date = revision_date
|
|
17
14
|
@draft = draft
|
|
18
15
|
end
|
|
@@ -20,8 +17,8 @@ module RelatonBib
|
|
|
20
17
|
# @param builder [Nokogiri::XML::Builder]
|
|
21
18
|
def to_xml(builder)
|
|
22
19
|
builder.version do
|
|
23
|
-
builder.send("revision-date", revision_date) if revision_date
|
|
24
|
-
draft
|
|
20
|
+
builder.send(:"revision-date", revision_date) if revision_date
|
|
21
|
+
builder.draft draft if draft
|
|
25
22
|
end
|
|
26
23
|
end
|
|
27
24
|
|
|
@@ -29,19 +26,19 @@ module RelatonBib
|
|
|
29
26
|
def to_hash
|
|
30
27
|
hash = {}
|
|
31
28
|
hash["revision_date"] = revision_date if revision_date
|
|
32
|
-
hash["draft"] =
|
|
29
|
+
hash["draft"] = draft if draft
|
|
33
30
|
hash
|
|
34
31
|
end
|
|
35
32
|
|
|
36
33
|
# @param prefix [String]
|
|
37
34
|
# @return [String]
|
|
38
|
-
def to_asciibib(prefix = "")
|
|
39
|
-
pref = prefix.empty? ? prefix : prefix
|
|
40
|
-
out = ""
|
|
35
|
+
def to_asciibib(prefix = "", count = 1)
|
|
36
|
+
pref = prefix.empty? ? prefix : "#{prefix}."
|
|
37
|
+
out = count > 1 ? "#{prefix}version::\n" : ""
|
|
41
38
|
if revision_date
|
|
42
39
|
out += "#{pref}version.revision_date:: #{revision_date}\n"
|
|
43
40
|
end
|
|
44
|
-
|
|
41
|
+
out += "#{pref}version.draft:: #{draft}\n" if draft
|
|
45
42
|
out
|
|
46
43
|
end
|
|
47
44
|
end
|
|
@@ -28,6 +28,7 @@ require "relaton_bib/structured_identifier"
|
|
|
28
28
|
require "relaton_bib/editorial_group"
|
|
29
29
|
require "relaton_bib/ics"
|
|
30
30
|
require "relaton_bib/bibliographic_size"
|
|
31
|
+
require "relaton_bib/edition"
|
|
31
32
|
|
|
32
33
|
module RelatonBib
|
|
33
34
|
# Bibliographic item
|
|
@@ -41,11 +42,14 @@ module RelatonBib
|
|
|
41
42
|
webresource dataset archival social_media alert message
|
|
42
43
|
conversation misc].freeze
|
|
43
44
|
|
|
44
|
-
# @return [
|
|
45
|
+
# @return [Boolean, nil]
|
|
45
46
|
attr_accessor :all_parts
|
|
46
47
|
|
|
47
|
-
# @return [String,
|
|
48
|
-
attr_reader :id, :type, :docnumber, :
|
|
48
|
+
# @return [String, nil]
|
|
49
|
+
attr_reader :id, :type, :docnumber, :doctype, :subdoctype
|
|
50
|
+
|
|
51
|
+
# @return [RelatonBib::Edition, nil] <description>
|
|
52
|
+
attr_reader :edition
|
|
49
53
|
|
|
50
54
|
# @!attribute [r] title
|
|
51
55
|
# @return [RelatonBib::TypedTitleStringCollection]
|
|
@@ -62,7 +66,7 @@ module RelatonBib
|
|
|
62
66
|
# @return [Array<RelatonBib::ContributionInfo>]
|
|
63
67
|
attr_reader :contributor
|
|
64
68
|
|
|
65
|
-
# @return [RelatonBib::BibliographicItem::Version
|
|
69
|
+
# @return [Array<RelatonBib::BibliographicItem::Version>]
|
|
66
70
|
attr_reader :version
|
|
67
71
|
|
|
68
72
|
# @return [RelatonBib::BiblioNoteCollection]
|
|
@@ -74,13 +78,13 @@ module RelatonBib
|
|
|
74
78
|
# @return [Array<String>] script Iso15924 code
|
|
75
79
|
attr_reader :script
|
|
76
80
|
|
|
77
|
-
# @return [RelatonBib::FormattedRef,
|
|
81
|
+
# @return [RelatonBib::FormattedRef, nil]
|
|
78
82
|
attr_reader :formattedref
|
|
79
83
|
|
|
80
84
|
# @!attribute [r] abstract
|
|
81
85
|
# @return [Array<RelatonBib::FormattedString>]
|
|
82
86
|
|
|
83
|
-
# @return [RelatonBib::DocumentStatus,
|
|
87
|
+
# @return [RelatonBib::DocumentStatus, nil]
|
|
84
88
|
attr_reader :status
|
|
85
89
|
|
|
86
90
|
# @return [Array<RelatonBib::CopyrightAssociation>]
|
|
@@ -92,7 +96,7 @@ module RelatonBib
|
|
|
92
96
|
# @return [Array<RelatonBib::Series>]
|
|
93
97
|
attr_reader :series
|
|
94
98
|
|
|
95
|
-
# @return [RelatonBib::Medium,
|
|
99
|
+
# @return [RelatonBib::Medium, nil]
|
|
96
100
|
attr_reader :medium
|
|
97
101
|
|
|
98
102
|
# @return [Array<RelatonBib::Place>]
|
|
@@ -107,7 +111,7 @@ module RelatonBib
|
|
|
107
111
|
# @return [Array<Relaton::Classification>]
|
|
108
112
|
attr_reader :classification
|
|
109
113
|
|
|
110
|
-
# @return [RelatonBib:Validity,
|
|
114
|
+
# @return [RelatonBib:Validity, nil]
|
|
111
115
|
attr_reader :validity
|
|
112
116
|
|
|
113
117
|
# @return [Date]
|
|
@@ -131,18 +135,18 @@ module RelatonBib
|
|
|
131
135
|
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
132
136
|
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
133
137
|
|
|
134
|
-
# @param id [String,
|
|
138
|
+
# @param id [String, nil]
|
|
135
139
|
# @param title [RelatonBib::TypedTitleStringCollection,
|
|
136
140
|
# Array<Hash, RelatonBib::TypedTitleString>]
|
|
137
|
-
# @param formattedref [RelatonBib::FormattedRef,
|
|
138
|
-
# @param type [String,
|
|
141
|
+
# @param formattedref [RelatonBib::FormattedRef, nil]
|
|
142
|
+
# @param type [String, nil]
|
|
139
143
|
# @param docid [Array<RelatonBib::DocumentIdentifier>]
|
|
140
|
-
# @param docnumber [String,
|
|
144
|
+
# @param docnumber [String, nil]
|
|
141
145
|
# @param language [Arra<String>]
|
|
142
146
|
# @param script [Array<String>]
|
|
143
|
-
# @param docstatus [RelatonBib::DocumentStatus,
|
|
144
|
-
# @param edition [
|
|
145
|
-
# @param version [RelatonBib::BibliographicItem::Version
|
|
147
|
+
# @param docstatus [RelatonBib::DocumentStatus, nil]
|
|
148
|
+
# @param edition [RelatonBib::Edition, nil]
|
|
149
|
+
# @param version [Array<RelatonBib::BibliographicItem::Version>]
|
|
146
150
|
# @param biblionote [RelatonBib::BiblioNoteCollection]
|
|
147
151
|
# @param series [Array<RelatonBib::Series>]
|
|
148
152
|
# @param medium [RelatonBib::Medium, NilClas]
|
|
@@ -150,8 +154,8 @@ module RelatonBib
|
|
|
150
154
|
# @param extent [Array<Relaton::Locality, RelatonBib::LocalityStack>]
|
|
151
155
|
# @param accesslocation [Array<String>]
|
|
152
156
|
# @param classification [Array<RelatonBib::Classification>]
|
|
153
|
-
# @param validity [RelatonBib:Validity,
|
|
154
|
-
# @param fetched [Date,
|
|
157
|
+
# @param validity [RelatonBib:Validity, nil]
|
|
158
|
+
# @param fetched [Date, nil] default nil
|
|
155
159
|
# @param keyword [Array<String>]
|
|
156
160
|
# @param doctype [String]
|
|
157
161
|
# @param subdoctype [String]
|
|
@@ -163,8 +167,8 @@ module RelatonBib
|
|
|
163
167
|
# @param copyright [Array<Hash, RelatonBib::CopyrightAssociation>]
|
|
164
168
|
# @option copyright [Array<Hash, RelatonBib::ContributionInfo>] :owner
|
|
165
169
|
# @option copyright [String] :from
|
|
166
|
-
# @option copyright [String,
|
|
167
|
-
# @option copyright [String,
|
|
170
|
+
# @option copyright [String, nil] :to
|
|
171
|
+
# @option copyright [String, nil] :scope
|
|
168
172
|
#
|
|
169
173
|
# @param date [Array<Hash, RelatonBib::BibliographicDate>]
|
|
170
174
|
# @option date [String] :type
|
|
@@ -230,8 +234,12 @@ module RelatonBib
|
|
|
230
234
|
@id = args[:id] || makeid(nil, false)
|
|
231
235
|
@type = args[:type]
|
|
232
236
|
@docnumber = args[:docnumber]
|
|
233
|
-
@edition = args[:edition]
|
|
234
|
-
|
|
237
|
+
@edition = case args[:edition]
|
|
238
|
+
when Hash then Edition.new(**args[:edition])
|
|
239
|
+
when String then Edition.new(content: args[:edition])
|
|
240
|
+
else args[:edition]
|
|
241
|
+
end
|
|
242
|
+
@version = args.fetch :version, []
|
|
235
243
|
@biblionote = args.fetch :biblionote, BiblioNoteCollection.new([])
|
|
236
244
|
@language = args.fetch :language, []
|
|
237
245
|
@script = args.fetch :script, []
|
|
@@ -321,7 +329,7 @@ module RelatonBib
|
|
|
321
329
|
# @param opts [Hash]
|
|
322
330
|
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
|
323
331
|
# @option opts [Boolean] :bibdata
|
|
324
|
-
# @option opts [Symbol,
|
|
332
|
+
# @option opts [Symbol, nil] :date_format (:short), :full
|
|
325
333
|
# @option opts [String, Symbol] :lang language
|
|
326
334
|
# @return [String] XML
|
|
327
335
|
def to_xml(**opts, &block)
|
|
@@ -365,8 +373,8 @@ module RelatonBib
|
|
|
365
373
|
if contributor&.any?
|
|
366
374
|
hash["contributor"] = single_element_array(contributor)
|
|
367
375
|
end
|
|
368
|
-
hash["edition"] = edition if edition
|
|
369
|
-
hash["version"] = version.to_hash if version
|
|
376
|
+
hash["edition"] = edition.to_hash if edition
|
|
377
|
+
hash["version"] = version.map &:to_hash if version.any?
|
|
370
378
|
hash["revdate"] = revdate if revdate
|
|
371
379
|
hash["biblionote"] = single_element_array(biblionote) if biblionote&.any?
|
|
372
380
|
hash["language"] = single_element_array(language) if language&.any?
|
|
@@ -493,10 +501,10 @@ module RelatonBib
|
|
|
493
501
|
end
|
|
494
502
|
|
|
495
503
|
# If revision_date exists then returns it else returns published date or nil
|
|
496
|
-
# @return [String,
|
|
504
|
+
# @return [String, nil]
|
|
497
505
|
def revdate # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
498
|
-
@revdate ||= if version
|
|
499
|
-
|
|
506
|
+
@revdate ||= if (v = version.detect &:revision_date)
|
|
507
|
+
v.revision_date
|
|
500
508
|
else
|
|
501
509
|
date.detect { |d| d.type == "published" }&.on&.to_s
|
|
502
510
|
end
|
|
@@ -515,10 +523,10 @@ module RelatonBib
|
|
|
515
523
|
out += di.to_asciibib prefix, docidentifier.size
|
|
516
524
|
end
|
|
517
525
|
out += "#{pref}docnumber:: #{docnumber}\n" if docnumber
|
|
518
|
-
out +=
|
|
526
|
+
out += edition.to_asciibib(prefix) if edition
|
|
519
527
|
language.each { |l| out += "#{pref}language:: #{l}\n" }
|
|
520
528
|
script.each { |s| out += "#{pref}script:: #{s}\n" }
|
|
521
|
-
out +=
|
|
529
|
+
version.each { |v| out += v.to_asciibib prefix, version.size }
|
|
522
530
|
biblionote&.each { |b| out += b.to_asciibib prefix, biblionote.size }
|
|
523
531
|
out += status.to_asciibib prefix if status
|
|
524
532
|
date.each { |d| out += d.to_asciibib prefix, date.size }
|
|
@@ -565,7 +573,7 @@ module RelatonBib
|
|
|
565
573
|
item.type = bibtex_type
|
|
566
574
|
item.key = id
|
|
567
575
|
title.to_bibtex item
|
|
568
|
-
item.edition = edition if edition
|
|
576
|
+
item.edition = edition.content if edition
|
|
569
577
|
bibtex_author item
|
|
570
578
|
bibtex_contributor item
|
|
571
579
|
item.address = place.first.name if place.any?
|
|
@@ -719,7 +727,7 @@ module RelatonBib
|
|
|
719
727
|
# @param opts [Hash]
|
|
720
728
|
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
|
721
729
|
# @option opts [Boolean] bibdata
|
|
722
|
-
# @option opts [Symbol,
|
|
730
|
+
# @option opts [Symbol, nil] :date_format (:short), :full
|
|
723
731
|
# @option opts [String] :lang language
|
|
724
732
|
def render_xml(**opts)
|
|
725
733
|
root = opts[:bibdata] ? :bibdata : :bibitem
|
|
@@ -737,8 +745,8 @@ module RelatonBib
|
|
|
737
745
|
c.to_xml(**opts)
|
|
738
746
|
end
|
|
739
747
|
end
|
|
740
|
-
|
|
741
|
-
version
|
|
748
|
+
edition&.to_xml builder
|
|
749
|
+
version.each { |v| v.to_xml builder }
|
|
742
750
|
biblionote.to_xml(**opts)
|
|
743
751
|
opts[:note]&.each do |n|
|
|
744
752
|
builder.note(n[:text], format: "text/plain", type: n[:type])
|
|
@@ -790,7 +798,8 @@ module RelatonBib
|
|
|
790
798
|
def render_bibxml(builder, include_keywords)
|
|
791
799
|
target = link.detect { |l| l.type.casecmp("src").zero? } ||
|
|
792
800
|
link.detect { |l| l.type.casecmp("doi").zero? }
|
|
793
|
-
bxml = if docnumber&.match(/^BCP/) || docidentifier
|
|
801
|
+
bxml = if docnumber&.match(/^BCP/) || (docidentifier.detect(&:primary)&.id ||
|
|
802
|
+
docidentifier[0].id).include?("BCP")
|
|
794
803
|
render_bibxml_refgroup(builder, include_keywords)
|
|
795
804
|
else
|
|
796
805
|
render_bibxml_ref(builder, include_keywords)
|
|
@@ -820,13 +829,17 @@ module RelatonBib
|
|
|
820
829
|
#
|
|
821
830
|
def render_bibxml_ref(builder, include_keywords)
|
|
822
831
|
builder.reference(**ref_attrs) do |xml|
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
832
|
+
if title.any? || contributor.any? || date.any? || abstract.any? ||
|
|
833
|
+
editorialgroup&.technical_committee&.any? ||
|
|
834
|
+
(include_keywords && keyword.any?)
|
|
835
|
+
xml.front do
|
|
836
|
+
xml.title title[0].title.content if title.any?
|
|
837
|
+
render_authors xml
|
|
838
|
+
render_date xml
|
|
839
|
+
render_workgroup xml
|
|
840
|
+
render_keyword xml if include_keywords
|
|
841
|
+
render_abstract xml
|
|
842
|
+
end
|
|
830
843
|
end
|
|
831
844
|
render_seriesinfo xml
|
|
832
845
|
render_format xml
|
|
@@ -12,6 +12,16 @@ module RelatonBib
|
|
|
12
12
|
"3GPP" => "3rd Generation Partnership Project",
|
|
13
13
|
}.freeze
|
|
14
14
|
|
|
15
|
+
#
|
|
16
|
+
# Parse BibXML content
|
|
17
|
+
#
|
|
18
|
+
# @param [String] bibxml content
|
|
19
|
+
# @param [String, nil] url source URL
|
|
20
|
+
# @param [Boolean] is_relation true if the content is relation item
|
|
21
|
+
# @param [String, nil] ver version
|
|
22
|
+
#
|
|
23
|
+
# @return [<Type>] <description>
|
|
24
|
+
#
|
|
15
25
|
def parse(bibxml, url: nil, is_relation: false, ver: nil)
|
|
16
26
|
doc = Nokogiri::XML bibxml
|
|
17
27
|
fetch_rfc doc.at("/referencegroup", "/reference"), url: url, is_relation: is_relation, ver: ver
|
|
@@ -4,21 +4,24 @@ module RelatonBib
|
|
|
4
4
|
# @return [String]
|
|
5
5
|
attr_reader :id
|
|
6
6
|
|
|
7
|
-
# @return [String,
|
|
8
|
-
attr_reader :type, :scope
|
|
7
|
+
# @return [String, nil]
|
|
8
|
+
attr_reader :type, :scope, :language, :script
|
|
9
9
|
|
|
10
10
|
# @param type [Boolean, nil]
|
|
11
11
|
attr_reader :primary
|
|
12
12
|
|
|
13
13
|
# @param id [String]
|
|
14
|
-
# @param type [String,
|
|
15
|
-
# @param scope [String,
|
|
16
|
-
# @param
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
@
|
|
20
|
-
@
|
|
21
|
-
@
|
|
14
|
+
# @param type [String, nil]
|
|
15
|
+
# @param scope [String, nil]
|
|
16
|
+
# @param primary [Bolean, nil]
|
|
17
|
+
# @param language [String, nil]
|
|
18
|
+
def initialize(**args)
|
|
19
|
+
@id = args[:id]
|
|
20
|
+
@type = args[:type]
|
|
21
|
+
@scope = args[:scope]
|
|
22
|
+
@primary = args[:primary]
|
|
23
|
+
@language = args[:language]
|
|
24
|
+
@script = args[:script]
|
|
22
25
|
end
|
|
23
26
|
|
|
24
27
|
# in docid manipulations, assume ISO as the default: id-part:year
|
|
@@ -53,7 +56,7 @@ module RelatonBib
|
|
|
53
56
|
# @param opts [Hash]
|
|
54
57
|
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
|
55
58
|
# @option opts [String] :lang language
|
|
56
|
-
def to_xml(**opts) # rubocop:disable Metrics/AbcSize
|
|
59
|
+
def to_xml(**opts) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
57
60
|
lid = if type == "URN" && opts[:lang]
|
|
58
61
|
id.sub %r{(?<=:)(?:\w{2},)*?(#{opts[:lang]})(?:,\w{2})*}, '\1'
|
|
59
62
|
else id
|
|
@@ -62,14 +65,18 @@ module RelatonBib
|
|
|
62
65
|
element[:type] = type if type
|
|
63
66
|
element[:scope] = scope if scope
|
|
64
67
|
element[:primary] = primary if primary
|
|
68
|
+
element[:language] = language if language
|
|
69
|
+
element[:script] = script if script
|
|
65
70
|
end
|
|
66
71
|
|
|
67
72
|
# @return [Hash]
|
|
68
|
-
def to_hash
|
|
73
|
+
def to_hash # rubocop:disable Metrics/AbcSize
|
|
69
74
|
hash = { "id" => id }
|
|
70
75
|
hash["type"] = type if type
|
|
71
76
|
hash["scope"] = scope if scope
|
|
72
77
|
hash["primary"] = primary if primary
|
|
78
|
+
hash["language"] = language if language
|
|
79
|
+
hash["script"] = script if script
|
|
73
80
|
hash
|
|
74
81
|
end
|
|
75
82
|
|
|
@@ -84,6 +91,8 @@ module RelatonBib
|
|
|
84
91
|
out += "#{pref}docid.type:: #{type}\n" if type
|
|
85
92
|
out += "#{pref}docid.scope:: #{scope}\n" if scope
|
|
86
93
|
out += "#{pref}docid.primary:: #{primary}\n" if primary
|
|
94
|
+
out += "#{pref}docid.language:: #{language}\n" if language
|
|
95
|
+
out += "#{pref}docid.script:: #{script}\n" if script
|
|
87
96
|
out + "#{pref}docid.id:: #{id}\n"
|
|
88
97
|
end
|
|
89
98
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module RelatonBib
|
|
2
|
+
class Edition
|
|
3
|
+
# @return [String] edition
|
|
4
|
+
attr_reader :content
|
|
5
|
+
|
|
6
|
+
# @return [String, nil] number
|
|
7
|
+
attr_reader :number
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Initialize edition.
|
|
11
|
+
#
|
|
12
|
+
# @param [String] content edition
|
|
13
|
+
# @param [String, nil] number number
|
|
14
|
+
#
|
|
15
|
+
def initialize(content:, number: nil)
|
|
16
|
+
@content = content
|
|
17
|
+
@number = number
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Render edition as XML.
|
|
22
|
+
#
|
|
23
|
+
# @param [Nokogiri::XML::Builder] builder XML builder
|
|
24
|
+
#
|
|
25
|
+
def to_xml(builder)
|
|
26
|
+
node = builder.edition(content)
|
|
27
|
+
node[:number] = number if number
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# Return edition as hash.
|
|
32
|
+
#
|
|
33
|
+
# @return [Hash] edition as hash.
|
|
34
|
+
#
|
|
35
|
+
def to_hash
|
|
36
|
+
hash = { "content" => content }
|
|
37
|
+
hash["number"] = number if number
|
|
38
|
+
hash
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# Render edition as AsciiBib.
|
|
43
|
+
#
|
|
44
|
+
# @param [String] prefix prefix
|
|
45
|
+
#
|
|
46
|
+
# @return [String] edition as AsciiBib.
|
|
47
|
+
#
|
|
48
|
+
def to_asciibib(prefix = "")
|
|
49
|
+
pref = prefix.empty? ? "edition" : "#{prefix}.edition"
|
|
50
|
+
out = "#{pref}.content:: #{content}\n"
|
|
51
|
+
out += "#{pref}.number:: #{number}\n" if number
|
|
52
|
+
out
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|