Class: Relaton::Bibcollection
- Inherits:
-
Object
- Object
- Relaton::Bibcollection
show all
- Extended by:
- ElementFinder
- Defined in:
- lib/relaton/bibcollection.rb
Constant Summary
collapse
- ATTRIBS =
%i[
title
items
doctype
author
]
Instance Attribute Summary
#document
Class Method Summary
collapse
Instance Method Summary
collapse
apply_namespace, find, find_text, find_xpath
Constructor Details
Returns a new instance of Bibcollection.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# File 'lib/relaton/bibcollection.rb', line 16
def initialize(options)
self.items = []
ATTRIBS.each do |k|
value = options[k] || options[k.to_s]
self.send("#{k}=", value)
end
self.items = (self.items || []).inject([]) do |acc,item|
acc << if item.is_a?(::Relaton::Bibcollection) ||
item.is_a?(::Relaton::Bibdata)
item
else
new_bib_item_class(item)
end
end
self
end
|
Class Method Details
.from_xml(source) ⇒ Object
38
39
40
41
42
43
44
45
46
47
48
49
|
# File 'lib/relaton/bibcollection.rb', line 38
def self.from_xml(source)
title = find_text("./relaton-collection/title", source)
author = find_text("./relaton-collection/contributor[role/@type = 'author']/organization/name", source)
items = find_xpath("./relaton-collection/relation", source)&.map do |item|
bibdata = find("./bibdata | ./bibitem", item)
klass = bibdata ? Bibdata : Bibcollection
klass.from_xml(bibdata || item)
end
new(title: title, author: author, items: items)
end
|
Instance Method Details
#doc_number ⇒ Object
arbitrary number, must sort after all bib items
34
35
36
|
# File 'lib/relaton/bibcollection.rb', line 34
def doc_number
9999999
end
|
#items_flattened ⇒ Object
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# File 'lib/relaton/bibcollection.rb', line 59
def items_flattened
items.sort_by! do |b|
b.doc_number
end
items.inject([]) do |acc,item|
if item.is_a? ::Relaton::Bibcollection
acc << item.items_flattened
else
acc << item
end
end
end
|
#new_bib_item_class(options) ⇒ Object
51
52
53
54
55
56
57
|
# File 'lib/relaton/bibcollection.rb', line 51
def new_bib_item_class(options)
if options["items"]
::Relaton::Bibcollection.new(options)
else
::Relaton::Bibdata.new(options)
end
end
|
#to_h ⇒ Object
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
# File 'lib/relaton/bibcollection.rb', line 103
def to_h
items.sort_by! do |b|
b.doc_number
end
a = ATTRIBS.inject({}) do |acc, k|
acc[k.to_s] = send(k)
acc
end
a["items"] = a["items"].map(&:to_h)
{ "root" => a }
end
|
#to_xml(opts = {}) ⇒ Object
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# File 'lib/relaton/bibcollection.rb', line 73
def to_xml(opts = {})
items.sort_by! do |b|
b.doc_number
end
collection_type = if doctype
"type=\"#{doctype}\""
else
'xmlns="https://open.ribose.com/relaton-xml"'
end
ret = "<relaton-collection #{collection_type}>"
ret += "<title>#{title}</title>" if title
if author
ret += "<contributor><role type='author'/><organization><name>#{author}</name></organization></contributor>"
end
unless items.empty?
items.each do |item|
ret += "<relation type='partOf'>"
ret += item.to_xml(opts)
ret += "</relation>\n"
end
end
ret += "</relaton-collection>\n"
end
|
#to_yaml ⇒ Object
99
100
101
|
# File 'lib/relaton/bibcollection.rb', line 99
def to_yaml
to_h.to_yaml
end
|