Class: Relaton::Bibcollection
- Inherits:
-
Object
- Object
- Relaton::Bibcollection
- Extended by:
- ElementFinder
- Defined in:
- lib/relaton/bibcollection.rb
Constant Summary collapse
- ATTRIBS =
i[title items doctype ].freeze
Instance Attribute Summary
Attributes included from ElementFinder
Class Method Summary collapse
Instance Method Summary collapse
-
#doc_number ⇒ Object
arbitrary number, must sort after all bib items.
-
#initialize(options) ⇒ Bibcollection
constructor
rubocop:disable Metrics/MethodLength.
- #items_flattened ⇒ Object
-
#new_bib_item_class(options) ⇒ Object
rubocop:enable Metrics/MethodLength.
- #to_h ⇒ Object
-
#to_xml(opts = {}) ⇒ String
XML.
-
#to_yaml ⇒ Object
rubocop:enable Metrics/AbcSize, Metrics/MethodLength.
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() self.items = [] ATTRIBS.each do |k| value = [k] || [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
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) = 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: , items: items) end |
Instance Method Details
#doc_number ⇒ Object
arbitrary number, must sort after all bib items
29 30 31 |
# File 'lib/relaton/bibcollection.rb', line 29 def doc_number 9999999 end |
#items_flattened ⇒ Object
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() if .is_a?(Hash) && ["items"] ::Relaton::Bibcollection.new() else ::Relaton::Bibdata.new() end end |
#to_h ⇒ Object
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.
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 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
rubocop:enable Metrics/AbcSize, Metrics/MethodLength
103 104 105 |
# File 'lib/relaton/bibcollection.rb', line 103 def to_yaml to_h.to_yaml end |