relaton-bib 1.0.1 → 1.1.1
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/.gitmodules +0 -3
- data/grammars/basicdoc.rng +986 -0
- data/grammars/biblio.rng +1237 -0
- data/grammars/isodoc.rng +1504 -0
- data/grammars/reqt.rng +171 -0
- data/lib/relaton_bib.rb +7 -4
- data/lib/relaton_bib/bibliographic_item.rb +128 -26
- data/lib/relaton_bib/bibtex_parser.rb +22 -20
- data/lib/relaton_bib/copyright_association.rb +28 -9
- data/lib/relaton_bib/document_relation.rb +22 -10
- data/lib/relaton_bib/document_relation_collection.rb +5 -5
- data/lib/relaton_bib/document_status.rb +49 -10
- data/lib/relaton_bib/editorial_group.rb +27 -0
- data/lib/relaton_bib/formatted_string.rb +3 -3
- data/lib/relaton_bib/hash_converter.rb +96 -26
- data/lib/relaton_bib/ics.rb +26 -0
- data/lib/relaton_bib/localized_string.rb +33 -12
- data/lib/relaton_bib/structured_identifier.rb +141 -0
- data/lib/relaton_bib/technical_committee.rb +25 -0
- data/lib/relaton_bib/typed_title_string.rb +39 -9
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib/workgroup.rb +36 -0
- data/lib/relaton_bib/xml_parser.rb +85 -27
- data/relaton-bib.gemspec +3 -3
- metadata +25 -16
data/grammars/reqt.rng
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
3
|
+
<!--
|
4
|
+
Presupposes isodoc.rnc, is included in it
|
5
|
+
include "isodoc.rnc" { }
|
6
|
+
-->
|
7
|
+
<define name="requirement">
|
8
|
+
<element name="requirement">
|
9
|
+
<ref name="RequirementType"/>
|
10
|
+
</element>
|
11
|
+
</define>
|
12
|
+
<define name="recommendation">
|
13
|
+
<element name="recommendation">
|
14
|
+
<ref name="RequirementType"/>
|
15
|
+
</element>
|
16
|
+
</define>
|
17
|
+
<define name="permission">
|
18
|
+
<element name="permission">
|
19
|
+
<ref name="RequirementType"/>
|
20
|
+
</element>
|
21
|
+
</define>
|
22
|
+
<define name="RequirementType">
|
23
|
+
<optional>
|
24
|
+
<attribute name="obligation">
|
25
|
+
<ref name="ObligationType"/>
|
26
|
+
</attribute>
|
27
|
+
</optional>
|
28
|
+
<optional>
|
29
|
+
<attribute name="unnumbered">
|
30
|
+
<data type="boolean"/>
|
31
|
+
</attribute>
|
32
|
+
</optional>
|
33
|
+
<optional>
|
34
|
+
<attribute name="subsequence"/>
|
35
|
+
</optional>
|
36
|
+
<attribute name="id">
|
37
|
+
<data type="ID"/>
|
38
|
+
</attribute>
|
39
|
+
<optional>
|
40
|
+
<attribute name="filename"/>
|
41
|
+
</optional>
|
42
|
+
<optional>
|
43
|
+
<attribute name="model"/>
|
44
|
+
</optional>
|
45
|
+
<optional>
|
46
|
+
<attribute name="type"/>
|
47
|
+
</optional>
|
48
|
+
<optional>
|
49
|
+
<ref name="reqtitle"/>
|
50
|
+
</optional>
|
51
|
+
<optional>
|
52
|
+
<ref name="label"/>
|
53
|
+
</optional>
|
54
|
+
<optional>
|
55
|
+
<ref name="subject"/>
|
56
|
+
</optional>
|
57
|
+
<zeroOrMore>
|
58
|
+
<ref name="reqinherit"/>
|
59
|
+
</zeroOrMore>
|
60
|
+
<zeroOrMore>
|
61
|
+
<ref name="classification"/>
|
62
|
+
</zeroOrMore>
|
63
|
+
<zeroOrMore>
|
64
|
+
<choice>
|
65
|
+
<ref name="measurementtarget"/>
|
66
|
+
<ref name="specification"/>
|
67
|
+
<ref name="verification"/>
|
68
|
+
<ref name="import"/>
|
69
|
+
<ref name="description"/>
|
70
|
+
</choice>
|
71
|
+
</zeroOrMore>
|
72
|
+
<optional>
|
73
|
+
<ref name="reqt_references"/>
|
74
|
+
</optional>
|
75
|
+
<zeroOrMore>
|
76
|
+
<choice>
|
77
|
+
<ref name="requirement"/>
|
78
|
+
<ref name="recommendation"/>
|
79
|
+
<ref name="permission"/>
|
80
|
+
</choice>
|
81
|
+
</zeroOrMore>
|
82
|
+
</define>
|
83
|
+
<define name="reqtitle">
|
84
|
+
<element name="title">
|
85
|
+
<ref name="FormattedString"/>
|
86
|
+
</element>
|
87
|
+
</define>
|
88
|
+
<define name="label">
|
89
|
+
<element name="label">
|
90
|
+
<text/>
|
91
|
+
</element>
|
92
|
+
</define>
|
93
|
+
<define name="subject">
|
94
|
+
<element name="subject">
|
95
|
+
<text/>
|
96
|
+
</element>
|
97
|
+
</define>
|
98
|
+
<define name="reqinherit">
|
99
|
+
<element name="inherit">
|
100
|
+
<text/>
|
101
|
+
</element>
|
102
|
+
</define>
|
103
|
+
<define name="measurementtarget">
|
104
|
+
<element name="measurement-target">
|
105
|
+
<ref name="RequirementSubpart"/>
|
106
|
+
</element>
|
107
|
+
</define>
|
108
|
+
<define name="specification">
|
109
|
+
<element name="specification">
|
110
|
+
<ref name="RequirementSubpart"/>
|
111
|
+
</element>
|
112
|
+
</define>
|
113
|
+
<define name="verification">
|
114
|
+
<element name="verification">
|
115
|
+
<ref name="RequirementSubpart"/>
|
116
|
+
</element>
|
117
|
+
</define>
|
118
|
+
<define name="import">
|
119
|
+
<element name="import">
|
120
|
+
<ref name="RequirementSubpart"/>
|
121
|
+
</element>
|
122
|
+
</define>
|
123
|
+
<define name="description">
|
124
|
+
<element name="description">
|
125
|
+
<ref name="RequirementSubpart"/>
|
126
|
+
</element>
|
127
|
+
</define>
|
128
|
+
<define name="reqt_references">
|
129
|
+
<element name="references">
|
130
|
+
<oneOrMore>
|
131
|
+
<ref name="bibitem"/>
|
132
|
+
</oneOrMore>
|
133
|
+
</element>
|
134
|
+
</define>
|
135
|
+
<define name="RequirementSubpart">
|
136
|
+
<optional>
|
137
|
+
<attribute name="type"/>
|
138
|
+
</optional>
|
139
|
+
<optional>
|
140
|
+
<attribute name="exclude">
|
141
|
+
<data type="boolean"/>
|
142
|
+
</attribute>
|
143
|
+
</optional>
|
144
|
+
<oneOrMore>
|
145
|
+
<ref name="BasicBlock"/>
|
146
|
+
</oneOrMore>
|
147
|
+
</define>
|
148
|
+
<define name="ObligationType">
|
149
|
+
<choice>
|
150
|
+
<value>requirement</value>
|
151
|
+
<value>recommendation</value>
|
152
|
+
<value>permission</value>
|
153
|
+
</choice>
|
154
|
+
</define>
|
155
|
+
<define name="classification">
|
156
|
+
<element name="classification">
|
157
|
+
<ref name="classification_tag"/>
|
158
|
+
<ref name="classification_value"/>
|
159
|
+
</element>
|
160
|
+
</define>
|
161
|
+
<define name="classification_tag">
|
162
|
+
<element name="tag">
|
163
|
+
<text/>
|
164
|
+
</element>
|
165
|
+
</define>
|
166
|
+
<define name="classification_value">
|
167
|
+
<element name="value">
|
168
|
+
<text/>
|
169
|
+
</element>
|
170
|
+
</define>
|
171
|
+
</grammar>
|
data/lib/relaton_bib.rb
CHANGED
@@ -10,10 +10,13 @@ module RelatonBib
|
|
10
10
|
class RequestError < StandardError; end
|
11
11
|
|
12
12
|
class << self
|
13
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
14
|
+
|
13
15
|
# @param date [String]
|
14
16
|
# @return [Date, NilClass]
|
15
17
|
def parse_date(sdate)
|
16
|
-
if
|
18
|
+
if sdate.is_a?(Date) then sdate
|
19
|
+
elsif /(?<date>\w+\s\d{4})/ =~ sdate # February 2012
|
17
20
|
Date.strptime(date, "%B %Y")
|
18
21
|
elsif /(?<date>\w+\s\d{1,2},\s\d{4})/ =~ sdate # February 11, 2012
|
19
22
|
Date.strptime(date, "%B %d, %Y")
|
@@ -21,10 +24,10 @@ module RelatonBib
|
|
21
24
|
Date.parse(date)
|
22
25
|
elsif /(?<date>\d{4}-\d{2})/ =~ sdate # 2012-02
|
23
26
|
Date.strptime date, "%Y-%m"
|
24
|
-
elsif /(?<date>\d{4})/ =~ sdate # 2012
|
25
|
-
Date.strptime date, "%Y"
|
27
|
+
elsif /(?<date>\d{4})/ =~ sdate then Date.strptime date, "%Y" # 2012
|
26
28
|
end
|
27
29
|
end
|
30
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
28
31
|
end
|
29
32
|
|
30
33
|
private
|
@@ -35,7 +38,7 @@ module RelatonBib
|
|
35
38
|
if array.size > 1
|
36
39
|
array.map { |e| e.is_a?(String) ? e : e.to_hash }
|
37
40
|
else
|
38
|
-
array
|
41
|
+
array.first&.is_a?(String) ? array[0] : array.first&.to_hash
|
39
42
|
end
|
40
43
|
end
|
41
44
|
end
|
@@ -24,6 +24,9 @@ require "relaton_bib/biblio_version"
|
|
24
24
|
require "relaton_bib/workers_pool"
|
25
25
|
require "relaton_bib/hash_converter"
|
26
26
|
require "relaton_bib/place"
|
27
|
+
require "relaton_bib/structured_identifier"
|
28
|
+
require "relaton_bib/editorial_group"
|
29
|
+
require "relaton_bib/ics"
|
27
30
|
|
28
31
|
module RelatonBib
|
29
32
|
# Bibliographic item
|
@@ -35,33 +38,27 @@ module RelatonBib
|
|
35
38
|
audiovisual film video broadcast graphic_work music patent
|
36
39
|
inbook incollection inproceedings journal].freeze
|
37
40
|
|
41
|
+
# @return [TrueClass, FalseClass, NilClass]
|
42
|
+
attr_accessor :all_parts
|
43
|
+
|
38
44
|
# @return [String, NilClass]
|
39
|
-
attr_reader :id
|
45
|
+
attr_reader :id, :type, :docnumber, :edition, :doctype
|
40
46
|
|
47
|
+
# @!attribute [r] title
|
41
48
|
# @return [Array<RelatonBib::TypedTitleString>]
|
42
|
-
attr_reader :title
|
43
49
|
|
44
50
|
# @return [Array<RelatonBib::TypedUri>]
|
45
51
|
attr_reader :link
|
46
52
|
|
47
|
-
# @return [String, NilClass]
|
48
|
-
attr_reader :type
|
49
|
-
|
50
53
|
# @return [Array<RelatonBib::DocumentIdentifier>]
|
51
54
|
attr_reader :docidentifier
|
52
55
|
|
53
|
-
# @return [String, NilClass] docnumber
|
54
|
-
attr_reader :docnumber
|
55
|
-
|
56
56
|
# @return [Array<RelatonBib::BibliographicDate>]
|
57
57
|
attr_accessor :date
|
58
58
|
|
59
59
|
# @return [Array<RelatonBib::ContributionInfo>]
|
60
60
|
attr_reader :contributor
|
61
61
|
|
62
|
-
# @return [String, NillClass]
|
63
|
-
attr_reader :edition
|
64
|
-
|
65
62
|
# @return [RelatonBib::BibliongraphicItem::Version, NilClass]
|
66
63
|
attr_reader :version
|
67
64
|
|
@@ -83,7 +80,7 @@ module RelatonBib
|
|
83
80
|
# @return [RelatonBib::DocumentStatus, NilClass]
|
84
81
|
attr_reader :status
|
85
82
|
|
86
|
-
# @return [RelatonBib::CopyrightAssociation
|
83
|
+
# @return [Array<RelatonBib::CopyrightAssociation>]
|
87
84
|
attr_reader :copyright
|
88
85
|
|
89
86
|
# @return [RelatonBib::DocRelationCollection]
|
@@ -116,6 +113,15 @@ module RelatonBib
|
|
116
113
|
# @return [Array<RelatonBib::LocalizedString>]
|
117
114
|
attr_reader :keyword
|
118
115
|
|
116
|
+
# @return [RelatonBib::EditorialGroup, nil]
|
117
|
+
attr_reader :editorialgroup
|
118
|
+
|
119
|
+
# @return [Array<RelatonBib:ICS>]
|
120
|
+
attr_reader :ics
|
121
|
+
|
122
|
+
# @return [RelatonBib::StructuredIdentifierCollection]
|
123
|
+
attr_reader :structuredidentifier
|
124
|
+
|
119
125
|
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
120
126
|
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
121
127
|
|
@@ -140,11 +146,16 @@ module RelatonBib
|
|
140
146
|
# @param validity [RelatonBib:Validity, NilClass]
|
141
147
|
# @param fetched [Date, NilClass] default nil
|
142
148
|
# @param keyword [Array<String>]
|
149
|
+
# @param doctype [String]
|
150
|
+
# @param editorialgroup [RelatonBib::EditorialGroup, nil]
|
151
|
+
# @param ics [Array<RelatonBib::ICS>]
|
152
|
+
# @param structuredidentifier [RelatonBib::StructuredIdentifierCollection]
|
143
153
|
#
|
144
|
-
# @param copyright [Hash, RelatonBib::CopyrightAssociation
|
145
|
-
# @option copyright [Hash, RelatonBib::ContributionInfo] :owner
|
146
|
-
# @option copyright [String] :
|
154
|
+
# @param copyright [Array<Hash, RelatonBib::CopyrightAssociation>]
|
155
|
+
# @option copyright [Array<Hash, RelatonBib::ContributionInfo>] :owner
|
156
|
+
# @option copyright [String] :from
|
147
157
|
# @option copyright [String, NilClass] :to
|
158
|
+
# @option copyright [String, NilClass] :scope
|
148
159
|
#
|
149
160
|
# @param date [Array<Hash>]
|
150
161
|
# @option date [String] :type
|
@@ -202,11 +213,8 @@ module RelatonBib
|
|
202
213
|
a.is_a?(Hash) ? FormattedString.new(a) : a
|
203
214
|
end
|
204
215
|
|
205
|
-
|
206
|
-
|
207
|
-
CopyrightAssociation.new args[:copyright]
|
208
|
-
else args[:copyright]
|
209
|
-
end
|
216
|
+
@copyright = args.fetch(:copyright, []).map do |c|
|
217
|
+
c.is_a?(Hash) ? CopyrightAssociation.new(c) : c
|
210
218
|
end
|
211
219
|
|
212
220
|
@docidentifier = args[:docid] || []
|
@@ -237,6 +245,10 @@ module RelatonBib
|
|
237
245
|
@fetched = args.fetch :fetched, nil # , Date.today # we should pass the fetched arg from scrappers
|
238
246
|
@keyword = (args[:keyword] || []).map { |kw| LocalizedString.new(kw) }
|
239
247
|
@license = args.fetch :license, []
|
248
|
+
@doctype = args[:doctype]
|
249
|
+
@editorialgroup = args[:editorialgroup]
|
250
|
+
@ics = args.fetch :ics, []
|
251
|
+
@structuredidentifier = args[:structuredidentifier]
|
240
252
|
end
|
241
253
|
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
242
254
|
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
@@ -288,6 +300,8 @@ module RelatonBib
|
|
288
300
|
end
|
289
301
|
end
|
290
302
|
|
303
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
304
|
+
|
291
305
|
# @return [Hash]
|
292
306
|
def to_hash
|
293
307
|
hash = {}
|
@@ -308,7 +322,7 @@ module RelatonBib
|
|
308
322
|
hash["formattedref"] = formattedref.to_hash if formattedref
|
309
323
|
hash["abstract"] = single_element_array(abstract) if abstract&.any?
|
310
324
|
hash["docstatus"] = status.to_hash if status
|
311
|
-
hash["copyright"] = copyright
|
325
|
+
hash["copyright"] = single_element_array(copyright) if copyright&.any?
|
312
326
|
hash["relation"] = single_element_array(relation) if relation&.any?
|
313
327
|
hash["series"] = single_element_array(series) if series&.any?
|
314
328
|
hash["medium"] = medium.to_hash if medium
|
@@ -320,8 +334,15 @@ module RelatonBib
|
|
320
334
|
hash["fetched"] = fetched.to_s if fetched
|
321
335
|
hash["keyword"] = single_element_array(keyword) if keyword&.any?
|
322
336
|
hash["license"] = single_element_array(license) if license&.any?
|
337
|
+
hash["doctype"] = doctype if doctype
|
338
|
+
hash["editorialgroup"] = editorialgroup.to_hash if editorialgroup
|
339
|
+
hash["ics"] = single_element_array ics if ics.any?
|
340
|
+
if structuredidentifier&.presence?
|
341
|
+
hash["structuredidentifier"] = structuredidentifier.to_hash
|
342
|
+
end
|
323
343
|
hash
|
324
344
|
end
|
345
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
325
346
|
|
326
347
|
# @param bibtex [BibTeX::Bibliography, NilClass]
|
327
348
|
# @return [String]
|
@@ -348,6 +369,74 @@ module RelatonBib
|
|
348
369
|
bibtex << item
|
349
370
|
bibtex.to_s
|
350
371
|
end
|
372
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
373
|
+
|
374
|
+
# @param lang [String] language code Iso639
|
375
|
+
# @return [Array<RelatonIsoBib::TypedTitleString>]
|
376
|
+
def title(lang: nil)
|
377
|
+
if lang then @title.select { |t| t.title.language&.include? lang }
|
378
|
+
else @title
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
# @param type [Symbol] type of url, can be :src/:obp/:rss
|
383
|
+
# @return [String]
|
384
|
+
def url(type = :src)
|
385
|
+
@link.detect { |s| s.type == type.to_s }.content.to_s
|
386
|
+
end
|
387
|
+
|
388
|
+
def abstract=(value)
|
389
|
+
@abstract = value
|
390
|
+
end
|
391
|
+
|
392
|
+
def deep_clone
|
393
|
+
dump = Marshal.dump self
|
394
|
+
Marshal.load dump
|
395
|
+
end
|
396
|
+
|
397
|
+
def disable_id_attribute
|
398
|
+
@id_attribute = false
|
399
|
+
end
|
400
|
+
|
401
|
+
# remove title part components and abstract
|
402
|
+
def to_all_parts
|
403
|
+
me = deep_clone
|
404
|
+
me.disable_id_attribute
|
405
|
+
me.relation << RelatonBib::DocumentRelation.new(
|
406
|
+
type: "instance", bibitem: self,
|
407
|
+
)
|
408
|
+
me.language.each do |l|
|
409
|
+
me.title.delete_if { |t| t.type == "title-part" }
|
410
|
+
ttl = me.title.select { |t| t.type != "main" && t.title.language&.include?(l) }
|
411
|
+
tm_en = ttl.map { |t| t.title.content }.join " – "
|
412
|
+
me.title.detect { |t| t.type == "main" && t.title.language&.include?(l) }&.title&.content = tm_en
|
413
|
+
end
|
414
|
+
me.abstract = []
|
415
|
+
me.docidentifier.each(&:remove_part)
|
416
|
+
me.docidentifier.each(&:all_parts)
|
417
|
+
me.structuredidentifier.remove_part
|
418
|
+
me.structuredidentifier.all_parts
|
419
|
+
me.docidentifier.each &:remove_date
|
420
|
+
me.structuredidentifier&.remove_date
|
421
|
+
me.all_parts = true
|
422
|
+
me
|
423
|
+
end
|
424
|
+
|
425
|
+
# convert ISO:yyyy reference to reference to most recent
|
426
|
+
# instance of reference, removing date-specific infomration:
|
427
|
+
# date of publication, abstracts. Make dated reference Instance relation
|
428
|
+
# of the redacated document
|
429
|
+
def to_most_recent_reference
|
430
|
+
me = deep_clone
|
431
|
+
disable_id_attribute
|
432
|
+
me.relation << DocumentRelation.new(type: "instance", bibitem: self)
|
433
|
+
me.abstract = []
|
434
|
+
me.date = []
|
435
|
+
me.docidentifier.each &:remove_date
|
436
|
+
me.structuredidentifier&.remove_date
|
437
|
+
me.id&.sub! /-[12]\d\d\d/, ""
|
438
|
+
me
|
439
|
+
end
|
351
440
|
|
352
441
|
# If revision_date exists then returns it else returns published date or nil
|
353
442
|
# @return [String, NilClass]
|
@@ -378,6 +467,8 @@ module RelatonBib
|
|
378
467
|
end
|
379
468
|
end
|
380
469
|
|
470
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
471
|
+
|
381
472
|
# @param [BibTeX::Entry]
|
382
473
|
def bibtex_author(item)
|
383
474
|
authors = contributor.select do |c|
|
@@ -388,7 +479,7 @@ module RelatonBib
|
|
388
479
|
|
389
480
|
item.author = authors.map do |a|
|
390
481
|
if a.name.surname
|
391
|
-
"#{a.name.surname}, #{a.name.forename.map(&:to_s).join(
|
482
|
+
"#{a.name.surname}, #{a.name.forename.map(&:to_s).join(' ')}"
|
392
483
|
else
|
393
484
|
a.name.completename.to_s
|
394
485
|
end
|
@@ -410,6 +501,7 @@ module RelatonBib
|
|
410
501
|
end
|
411
502
|
end
|
412
503
|
end
|
504
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
413
505
|
|
414
506
|
# @param [BibTeX::Entry]
|
415
507
|
def bibtex_note(item)
|
@@ -427,7 +519,10 @@ module RelatonBib
|
|
427
519
|
# @param [BibTeX::Entry]
|
428
520
|
def bibtex_relation(item)
|
429
521
|
rel = relation.detect { |r| r.type == "partOf" }
|
430
|
-
|
522
|
+
if rel
|
523
|
+
title_main = rel.bibitem.title.detect { |t| t.type == "main" }
|
524
|
+
item.booktitle = title_main.title.content
|
525
|
+
end
|
431
526
|
end
|
432
527
|
|
433
528
|
# @param [BibTeX::Entry]
|
@@ -530,7 +625,7 @@ module RelatonBib
|
|
530
625
|
script.each { |s| builder.script s }
|
531
626
|
abstract.each { |a| builder.abstract { a.to_xml(builder) } }
|
532
627
|
status&.to_xml builder
|
533
|
-
copyright&.to_xml builder
|
628
|
+
copyright&.each { |c| c.to_xml builder }
|
534
629
|
relation.each { |r| r.to_xml builder, **opts }
|
535
630
|
series.each { |s| s.to_xml builder }
|
536
631
|
medium&.to_xml builder
|
@@ -541,8 +636,15 @@ module RelatonBib
|
|
541
636
|
classification.each { |cls| cls.to_xml builder }
|
542
637
|
keyword.each { |kw| builder.keyword { kw.to_xml(builder) } }
|
543
638
|
validity&.to_xml builder
|
544
|
-
if block_given?
|
545
|
-
|
639
|
+
if block_given? then yield builder
|
640
|
+
elsif opts[:bibdata] && (doctype || editorialgroup || ics&.any? ||
|
641
|
+
structuredidentifier&.presence?)
|
642
|
+
builder.ext do |b|
|
643
|
+
b.doctype doctype if doctype
|
644
|
+
editorialgroup&.to_xml b
|
645
|
+
ics.each { |i| i.to_xml b }
|
646
|
+
structuredidentifier&.to_xml b
|
647
|
+
end
|
546
648
|
end
|
547
649
|
end
|
548
650
|
xml[:id] = id if id && !opts[:bibdata] && !opts[:embedded]
|