Class: Relaton::Bibcollection

Inherits:
Object
  • Object
show all
Extended by:
ElementFinder
Defined in:
lib/relaton/bibcollection.rb

Constant Summary collapse

ATTRIBS =
%i[
  title
  items
  doctype
  author
]

Instance Attribute Summary

Attributes included from ElementFinder

#document

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ElementFinder

apply_namespace, find, find_text, find_xpath

Constructor Details

#initialize(options) ⇒ Bibcollection

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_numberObject

arbitrary number, must sort after all bib items



34
35
36
# File 'lib/relaton/bibcollection.rb', line 34

def doc_number
  9999999
end

#items_flattenedObject



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_hObject



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_yamlObject



99
100
101
# File 'lib/relaton/bibcollection.rb', line 99

def to_yaml
  to_h.to_yaml
end