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].freeze

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

rubocop:disable Metrics/MethodLength



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/relaton/bibcollection.rb', line 13

def initialize(options)
  self.items = []
  ATTRIBS.each do |k|
    value = options[k] || options[k.to_s]
    send("#{k}=", value)
  end
  self.items = (items || []).reduce([]) do |acc, item|
    acc << if item.is_a?(Bibcollection) || item.is_a?(Bibdata)
             item
           else new_bib_item_class(item)
           end
  end
end

Class Method Details

.from_xml(source) ⇒ Object

Parameters:

  • source (Nokogiri::XML::Element)


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/relaton/bibcollection.rb', line 36

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", 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



29
30
31
# File 'lib/relaton/bibcollection.rb', line 29

def doc_number
  9999999
end

#items_flattenedObject



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/relaton/bibcollection.rb', line 61

def items_flattened
  items.sort_by! &:docnumber

  items.reduce([]) do |acc,item|
    acc << if item.is_a? ::Relaton::Bibcollection
             item.items_flattened
           else
             item
           end
  end
end

#new_bib_item_class(options) ⇒ Object

rubocop:enable Metrics/MethodLength



53
54
55
56
57
58
59
# File 'lib/relaton/bibcollection.rb', line 53

def new_bib_item_class(options)
  if options.is_a?(Hash) && options["items"]
    ::Relaton::Bibcollection.new(options)
  else
    ::Relaton::Bibdata.new(options)
  end
end

#to_hObject



107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/relaton/bibcollection.rb', line 107

def to_h
  items.sort_by! &:doc_number

  a = ATTRIBS.reduce({}) do |acc, k|
    acc[k.to_s] = send(k)
    acc
  end

  a["items"] = a["items"].map(&:to_h)

  { "root" => a }
end

#to_xml(opts = {}) ⇒ String

Returns XML.

Parameters:

  • opts (Hash) (defaults to: {})

Returns:

  • (String)

    XML



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/relaton/bibcollection.rb', line 77

def to_xml(opts = {})
  items.sort_by! &:doc_number

  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

rubocop:enable Metrics/AbcSize, Metrics/MethodLength



103
104
105
# File 'lib/relaton/bibcollection.rb', line 103

def to_yaml
  to_h.to_yaml
end