Class: Metanorma::Standoc::Cleanup::MergeBibitems
- Inherits:
-
Object
- Object
- Metanorma::Standoc::Cleanup::MergeBibitems
- Defined in:
- lib/metanorma/cleanup/merge_bibitems.rb
Instance Method Summary collapse
- #array_to_hash(array, attributes) ⇒ Object
-
#initialize(old, new) ⇒ MergeBibitems
constructor
A new instance of MergeBibitems.
- #load_bibitem(item) ⇒ Object
- #merge ⇒ Object
- #merge1(old, new) ⇒ Object
- #merge_by_type(old, new, field, attributes, opt = {}) ⇒ Object
- #merge_by_type1(old, new, field, attributes, opt) ⇒ Object
- #merge_contributor(old, new) ⇒ Object
-
#merge_extent(old, new) ⇒ Object
ensure return value goes into extent.
- #merge_relations(old, new) ⇒ Object
- #merge_simple(old, new, field) ⇒ Object
- #to_noko ⇒ Object
Constructor Details
#initialize(old, new) ⇒ MergeBibitems
Returns a new instance of MergeBibitems.
35 36 37 38 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 35 def initialize(old, new) @old = load_bibitem(old) @new = load_bibitem(new) end |
Instance Method Details
#array_to_hash(array, attributes) ⇒ Object
121 122 123 124 125 126 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 121 def array_to_hash(array, attributes) array.each_with_object({}) do |k, m| m[k.dig(*Array(attributes))] ||= [] m[k.dig(*Array(attributes))] << k end end |
#load_bibitem(item) ⇒ Object
40 41 42 43 44 45 46 47 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 40 def load_bibitem(item) xml = Nokogiri::XML(item) klass = xml.root&.name == "bibdata" ? Relaton::Bib::Bibdata : Relaton::Bib::Bibitem bib = klass.from_xml(item) YAML.safe_load(bib.to_yaml, permitted_classes: [Date, Symbol], symbolize_names: true) end |
#merge ⇒ Object
54 55 56 57 58 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 54 def merge @old.delete(:formattedref) merge1(@old, @new) self end |
#merge1(old, new) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 60 def merge1(old, new) %i(uri docidentifier date title series note).each do |k| merge_by_type(old, new, k, :type) end merge_extent(old, new) merge_contributor(old, new) %i(place version edition).each do |k| merge_simple(old, new, k) end merge_relations(old, new) end |
#merge_by_type(old, new, field, attributes, opt = {}) ⇒ Object
104 105 106 107 108 109 110 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 104 def merge_by_type(old, new, field, attributes, opt = {}) new.nil? || new[field].nil? || new[field].empty? and return old.nil? and return new[field] !old[field].is_a?(::Array) || old[field].empty? and return old[field] = new[field] old[field] = merge_by_type1(old, new, field, attributes, opt) end |
#merge_by_type1(old, new, field, attributes, opt) ⇒ Object
112 113 114 115 116 117 118 119 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 112 def merge_by_type1(old, new, field, attributes, opt) old1 = array_to_hash(old[field], attributes) new1 = array_to_hash(new[field], attributes) out = opt[:recurse] ? old1.deep_merge(new1) : old1.merge(new1) out.each_value.with_object([]) do |v, m| v.each { |v1| m << v1 } end end |
#merge_contributor(old, new) ⇒ Object
94 95 96 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 94 def merge_contributor(old, new) merge_by_type(old, new, :contributor, [:role, 0, :type]) end |
#merge_extent(old, new) ⇒ Object
ensure return value goes into extent
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 78 def merge_extent(old, new) old.dig(:extent, 0, :locality) and old[:extent] = [{ locality_stack: old[:extent] }] new.dig(:extent, 0, :locality) and new[:extent] = [{ locality_stack: new[:extent] }] ret = merge_by_type(old.dig(:extent, 0), new.dig(:extent, 0), :locality_stack, [:locality, 0, :type]) or return ret = ret.each_with_object([{ locality: [] }]) do |r, m| m[0][:locality] += r[:locality] end old[:extent] ||= [] old[:extent][0] ||= {} old[:extent][0][:locality_stack] = ret end |
#merge_relations(old, new) ⇒ Object
98 99 100 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 98 def merge_relations(old, new) merge_by_type(old, new, :relation, :type, recurse: true) end |
#merge_simple(old, new, field) ⇒ Object
72 73 74 75 |
# File 'lib/metanorma/cleanup/merge_bibitems.rb', line 72 def merge_simple(old, new, field) (new[field].nil? || new[field].empty?) and return old[field] = new[field] end |