class Relaton::Bibcollection

Constants

ATTRIBS

Public Class Methods

from_xml(source) click to toggle source

@param source [Nokogiri::XML::Element]

# File lib/relaton/bibcollection.rb, line 34
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
new(options) click to toggle source

@param options [Hash]

# File lib/relaton/bibcollection.rb, line 12
def initialize(options)
  ATTRIBS.each do |k|
    value = options[k] || options[k.to_s]
    send("#{k}=", value)
  end
  reduce_items
end

Public Instance Methods

<<(item) click to toggle source

Add a dcoument to the collection @param item [RelatonBib::BibliographicItem]

# File lib/relaton/bibcollection.rb, line 27
def <<(item)
  items << new_bib_item_class(item)
end
doc_number() click to toggle source

arbitrary number, must sort after all bib items

# File lib/relaton/bibcollection.rb, line 21
def doc_number
  9999999
end
items_flattened() click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/relaton/bibcollection.rb, line 98
def items_flattened
  items.sort_by! &:doc_number

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

@param item [Hash, RelatonBib::BibliographicItem, Relatin::Bibdata,

Relaton::Bibcollection]

@return [Relaton::Bibdata, Relaton::Bibcollection]

# File lib/relaton/bibcollection.rb, line 83
def new_bib_item_class(item)
  if item.is_a?(Hash)
    if item["items"]
      ::Relaton::Bibcollection.new(item)
    else
      bibitem = ::Relaton::Cli::YAMLConvertor.convert_single_file item
      ::Relaton::Bibdata.new bibitem
    end
  elsif item.is_a?(Relaton::Bibdata) || item.is_a?(Relaton::Bibcollection)
    item
  else ::Relaton::Bibdata.new(item)
  end
end
to_h() click to toggle source
# File lib/relaton/bibcollection.rb, line 114
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 = {}) click to toggle source

@param opts [Hash] @return [String] XML

# File lib/relaton/bibcollection.rb, line 54
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_yaml() click to toggle source
# File lib/relaton/bibcollection.rb, line 110
def to_yaml
  to_h.to_yaml
end

Private Instance Methods

reduce_items() click to toggle source
# File lib/relaton/bibcollection.rb, line 129
def reduce_items
  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