relaton-bib 1.3.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.adoc +44 -18
- data/grammars/isodoc.rng +136 -21
- data/grammars/reqt.rng +2 -8
- data/lib/relaton_bib.rb +3 -1
- data/lib/relaton_bib/biblio_note.rb +27 -0
- data/lib/relaton_bib/bibliographic_date.rb +2 -1
- data/lib/relaton_bib/bibliographic_item.rb +60 -40
- data/lib/relaton_bib/bibtex_parser.rb +16 -15
- data/lib/relaton_bib/contribution_info.rb +14 -8
- data/lib/relaton_bib/contributor.rb +10 -6
- data/lib/relaton_bib/copyright_association.rb +7 -5
- data/lib/relaton_bib/document_identifier.rb +38 -9
- data/lib/relaton_bib/document_relation.rb +2 -2
- data/lib/relaton_bib/document_relation_collection.rb +0 -2
- data/lib/relaton_bib/document_status.rb +0 -3
- data/lib/relaton_bib/editorial_group.rb +5 -0
- data/lib/relaton_bib/hash_converter.rb +11 -13
- data/lib/relaton_bib/hit.rb +10 -6
- data/lib/relaton_bib/hit_collection.rb +8 -3
- data/lib/relaton_bib/localized_string.rb +3 -3
- data/lib/relaton_bib/organization.rb +26 -15
- data/lib/relaton_bib/person.rb +26 -14
- data/lib/relaton_bib/place.rb +1 -1
- data/lib/relaton_bib/typed_title_string.rb +67 -0
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib/xml_parser.rb +16 -7
- metadata +2 -2
| @@ -38,19 +38,21 @@ module RelatonBib | |
| 38 38 | 
             
                  @scope = scope
         | 
| 39 39 | 
             
                end
         | 
| 40 40 |  | 
| 41 | 
            -
                # @param  | 
| 42 | 
            -
                 | 
| 43 | 
            -
             | 
| 41 | 
            +
                # @param opts [Hash]
         | 
| 42 | 
            +
                # @option opts [Nokogiri::XML::Builder] :builder XML builder
         | 
| 43 | 
            +
                # @option opts [String, Symbol] :lang language
         | 
| 44 | 
            +
                def to_xml(**opts)
         | 
| 45 | 
            +
                  opts[:builder].copyright do |builder|
         | 
| 44 46 | 
             
                    builder.from from ? from.year : "unknown"
         | 
| 45 47 | 
             
                    builder.to to.year if to
         | 
| 46 | 
            -
                    owner.each { |o| builder.owner { o.to_xml  | 
| 48 | 
            +
                    owner.each { |o| builder.owner { o.to_xml **opts } }
         | 
| 47 49 | 
             
                    builder.scope scope if scope
         | 
| 48 50 | 
             
                  end
         | 
| 49 51 | 
             
                end
         | 
| 50 52 | 
             
                # rubocop:enable Metrics/AbcSize
         | 
| 51 53 |  | 
| 52 54 | 
             
                # @return [Hash]
         | 
| 53 | 
            -
                def to_hash
         | 
| 55 | 
            +
                def to_hash # rubocop:disable Metrics/AbcSize
         | 
| 54 56 | 
             
                  owners = single_element_array(owner.map { |o| o.to_hash["organization"] })
         | 
| 55 57 | 
             
                  hash = {
         | 
| 56 58 | 
             
                    "owner" => owners,
         | 
| @@ -20,30 +20,40 @@ module RelatonBib | |
| 20 20 | 
             
                def remove_part
         | 
| 21 21 | 
             
                  case @type
         | 
| 22 22 | 
             
                  when "Chinese Standard" then @id.sub!(/\.\d+/, "")
         | 
| 23 | 
            -
                   | 
| 24 | 
            -
             | 
| 23 | 
            +
                  when "ISO", "IEC" then @id.sub!(/-[^:]+/, "")
         | 
| 24 | 
            +
                  when "URN" then remove_urn_part
         | 
| 25 25 | 
             
                  end
         | 
| 26 26 | 
             
                end
         | 
| 27 27 |  | 
| 28 28 | 
             
                def remove_date
         | 
| 29 29 | 
             
                  case @type
         | 
| 30 30 | 
             
                  when "Chinese Standard" then @id.sub!(/-[12]\d\d\d/, "")
         | 
| 31 | 
            -
                   | 
| 32 | 
            -
             | 
| 31 | 
            +
                  when "ISO", "IEC" then @id.sub!(/:[12]\d\d\d/, "")
         | 
| 32 | 
            +
                  when "URN"
         | 
| 33 | 
            +
                    @id.sub!(/^(urn:iec:std:[^:]+:[^:]+:)[^:]*/, '\1')
         | 
| 33 34 | 
             
                  end
         | 
| 34 35 | 
             
                end
         | 
| 35 36 |  | 
| 36 37 | 
             
                def all_parts
         | 
| 37 | 
            -
                   | 
| 38 | 
            +
                  if type == "URN"
         | 
| 39 | 
            +
                    @id.sub!(%r{^(urn:iec:std(?::[^:]*){4}).*}, '\1:ser')
         | 
| 40 | 
            +
                  else
         | 
| 41 | 
            +
                    @id += " (all parts)"
         | 
| 42 | 
            +
                  end
         | 
| 38 43 | 
             
                end
         | 
| 39 44 |  | 
| 40 45 | 
             
                #
         | 
| 41 46 | 
             
                # Add docidentifier xml element
         | 
| 42 47 | 
             
                #
         | 
| 43 | 
            -
                # @param [ | 
| 44 | 
            -
                #
         | 
| 45 | 
            -
                 | 
| 46 | 
            -
             | 
| 48 | 
            +
                # @param opts [Hash]
         | 
| 49 | 
            +
                # @option opts [Nokogiri::XML::Builder] :builder XML builder
         | 
| 50 | 
            +
                # @option opts [String] :lang language
         | 
| 51 | 
            +
                def to_xml(**opts) # rubocop:disable Metrics/AbcSize
         | 
| 52 | 
            +
                  lid = if type == "URN" && opts[:lang]
         | 
| 53 | 
            +
                          id.sub %r{(?<=:)(?:\w{2},)*?(#{opts[:lang]})(?:,\w{2})*}, '\1'
         | 
| 54 | 
            +
                        else id
         | 
| 55 | 
            +
                        end
         | 
| 56 | 
            +
                  element = opts[:builder].docidentifier lid
         | 
| 47 57 | 
             
                  element[:type] = type if type
         | 
| 48 58 | 
             
                  element[:scope] = scope if scope
         | 
| 49 59 | 
             
                end
         | 
| @@ -67,5 +77,24 @@ module RelatonBib | |
| 67 77 | 
             
                  out += "#{pref}docid.id:: #{id}\n"
         | 
| 68 78 | 
             
                  out
         | 
| 69 79 | 
             
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                private
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                def remove_urn_part # rubocop:disable Metrics/MethodLength
         | 
| 84 | 
            +
                  @id.sub!(%r{^
         | 
| 85 | 
            +
                    (urn:iso:std:[^:]+ # ISO prefix and originator
         | 
| 86 | 
            +
                      (?::(?:data|guide|isp|iwa|pas|r|tr|ts|tta)) # type
         | 
| 87 | 
            +
                      ?:\d+) # docnumber
         | 
| 88 | 
            +
                    (?::-[^:]+)? # partnumber
         | 
| 89 | 
            +
                    (?::(draft|cancelled|stage-[^:]+))? # status
         | 
| 90 | 
            +
                    (?::ed-\d+)?(?::v[^:]+)? # edition and version
         | 
| 91 | 
            +
                    (?::\w{2}(?:,\w{2})*)? # langauge
         | 
| 92 | 
            +
                  }x, '\1') # remove partnumber, status, version, and language
         | 
| 93 | 
            +
                  @id.sub!(%r{^
         | 
| 94 | 
            +
                    (urn:iec:std:[^:]+ # IEC prefix and originator
         | 
| 95 | 
            +
                      :\d+) # docnumber
         | 
| 96 | 
            +
                    (?:-[^:]+)? # partnumber
         | 
| 97 | 
            +
                  }x, '\1') # remove partnumber
         | 
| 98 | 
            +
                end
         | 
| 70 99 | 
             
              end
         | 
| 71 100 | 
             
            end
         | 
| @@ -63,7 +63,7 @@ module RelatonBib | |
| 63 63 | 
             
                  opts.delete :note
         | 
| 64 64 | 
             
                  builder.relation(type: type) do
         | 
| 65 65 | 
             
                    builder.description { description.to_xml builder } if description
         | 
| 66 | 
            -
                    bibitem.to_xml( | 
| 66 | 
            +
                    bibitem.to_xml(**opts.merge(builder: builder, embedded: true))
         | 
| 67 67 | 
             
                    locality.each { |l| l.to_xml builder }
         | 
| 68 68 | 
             
                    source_locality.each { |l| l.to_xml builder }
         | 
| 69 69 | 
             
                  end
         | 
| @@ -71,7 +71,7 @@ module RelatonBib | |
| 71 71 | 
             
                # rubocop:enable Metrics/AbcSize
         | 
| 72 72 |  | 
| 73 73 | 
             
                # @return [Hash]
         | 
| 74 | 
            -
                def to_hash
         | 
| 74 | 
            +
                def to_hash # rubocop:disable Metrics/AbcSize
         | 
| 75 75 | 
             
                  hash = { "type" => type, "bibitem" => bibitem.to_hash }
         | 
| 76 76 | 
             
                  hash["description"] = description.to_hash if description
         | 
| 77 77 | 
             
                  hash["locality"] = single_element_array(locality) if locality&.any?
         | 
| @@ -58,7 +58,8 @@ module RelatonBib | |
| 58 58 | 
             
                  def title_hash_to_bib(ret)
         | 
| 59 59 | 
             
                    return unless ret[:title]
         | 
| 60 60 |  | 
| 61 | 
            -
                    ret[:title] = array(ret[:title]) | 
| 61 | 
            +
                    ret[:title] = array(ret[:title])
         | 
| 62 | 
            +
                      .reduce(TypedTitleStringCollection.new) do |m, t|
         | 
| 62 63 | 
             
                      if t.is_a?(Hash) then m << t
         | 
| 63 64 | 
             
                      else
         | 
| 64 65 | 
             
                        m + TypedTitleString.from_string(t)
         | 
| @@ -139,20 +140,14 @@ module RelatonBib | |
| 139 140 | 
             
                    )
         | 
| 140 141 | 
             
                  end
         | 
| 141 142 |  | 
| 142 | 
            -
                  def biblionote_hash_to_bib(ret) # rubocop:disable Metrics/MethodLength
         | 
| 143 | 
            +
                  def biblionote_hash_to_bib(ret) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
         | 
| 143 144 | 
             
                    return unless ret[:biblionote]
         | 
| 144 145 |  | 
| 145 146 | 
             
                    ret[:biblionote] = array(ret[:biblionote])
         | 
| 146 | 
            -
             | 
| 147 | 
            -
                       | 
| 148 | 
            -
             | 
| 149 | 
            -
             | 
| 150 | 
            -
                                              BiblioNote.new(
         | 
| 151 | 
            -
                                                content: n[:content], type: n[:type],
         | 
| 152 | 
            -
                                                language: n[:language], script: n[:script],
         | 
| 153 | 
            -
                                                format: n[:format]
         | 
| 154 | 
            -
                                              )
         | 
| 155 | 
            -
                                            end
         | 
| 147 | 
            +
                      .reduce(BiblioNoteCollection.new([])) do |mem, n|
         | 
| 148 | 
            +
                      mem << if n.is_a?(String) then BiblioNote.new content: n
         | 
| 149 | 
            +
                             else BiblioNote.new(n)
         | 
| 150 | 
            +
                             end
         | 
| 156 151 | 
             
                    end
         | 
| 157 152 | 
             
                  end
         | 
| 158 153 |  | 
| @@ -178,7 +173,7 @@ module RelatonBib | |
| 178 173 | 
             
                    DocumentStatus::Stage.new(**args)
         | 
| 179 174 | 
             
                  end
         | 
| 180 175 |  | 
| 181 | 
            -
                  def contributors_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
         | 
| 176 | 
            +
                  def contributors_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength,Metrics/PerceivedComplexity
         | 
| 182 177 | 
             
                    return unless ret[:contributor]
         | 
| 183 178 |  | 
| 184 179 | 
             
                    ret[:contributor] = array(ret[:contributor])
         | 
| @@ -209,6 +204,9 @@ module RelatonBib | |
| 209 204 | 
             
                    org[:identifier] = array(org[:identifier])&.map do |a|
         | 
| 210 205 | 
             
                      OrgIdentifier.new(a[:type], a[:id])
         | 
| 211 206 | 
             
                    end
         | 
| 207 | 
            +
                    org[:subdivision] = array(org[:subdivision]).map do |sd|
         | 
| 208 | 
            +
                      LocalizedString.new sd
         | 
| 209 | 
            +
                    end
         | 
| 212 210 | 
             
                    org
         | 
| 213 211 | 
             
                  end
         | 
| 214 212 |  | 
    
        data/lib/relaton_bib/hit.rb
    CHANGED
    
    | @@ -20,7 +20,7 @@ module RelatonBib | |
| 20 20 |  | 
| 21 21 | 
             
                # @return [String]
         | 
| 22 22 | 
             
                def inspect
         | 
| 23 | 
            -
                  "<#{self.class}:#{format(' | 
| 23 | 
            +
                  "<#{self.class}:#{format('%<id>#.14x', id: object_id << 1)} "\
         | 
| 24 24 | 
             
                  "@text=\"#{@hit_collection&.text}\" "\
         | 
| 25 25 | 
             
                  "@fetched=\"#{!@fetch.nil?}\" "\
         | 
| 26 26 | 
             
                  "@fullIdentifier=\"#{@fetch&.shortref(nil)}\" "\
         | 
| @@ -31,13 +31,17 @@ module RelatonBib | |
| 31 31 | 
             
                  raise "Not implemented"
         | 
| 32 32 | 
             
                end
         | 
| 33 33 |  | 
| 34 | 
            -
                # @param  | 
| 35 | 
            -
                 | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 34 | 
            +
                # @param opts [Hash]
         | 
| 35 | 
            +
                # @option opts [Nokogiri::XML::Builder] :builder XML builder
         | 
| 36 | 
            +
                # @option opts [Boolean] :bibdata
         | 
| 37 | 
            +
                # @option opts [String, Symbol] :lang language
         | 
| 38 | 
            +
                # @return [String] XML
         | 
| 39 | 
            +
                def to_xml(**opts)
         | 
| 40 | 
            +
                  if opts[:builder]
         | 
| 41 | 
            +
                    fetch.to_xml **opts
         | 
| 38 42 | 
             
                  else
         | 
| 39 43 | 
             
                    builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
         | 
| 40 | 
            -
                      fetch.to_xml  | 
| 44 | 
            +
                      fetch.to_xml **opts.merge(builder: xml)
         | 
| 41 45 | 
             
                    end
         | 
| 42 46 | 
             
                    builder.doc.root.to_xml
         | 
| 43 47 | 
             
                  end
         | 
| @@ -36,12 +36,17 @@ module RelatonBib | |
| 36 36 | 
             
                  self
         | 
| 37 37 | 
             
                end
         | 
| 38 38 |  | 
| 39 | 
            +
                # @param opts [Hash]
         | 
| 40 | 
            +
                # @option opts [Nokogiri::XML::Builder] :builder XML builder
         | 
| 41 | 
            +
                # @option opts [Boolean] :bibdata
         | 
| 42 | 
            +
                # @option opts [String, Symbol] :lang language
         | 
| 43 | 
            +
                # @return [String] XML
         | 
| 39 44 | 
             
                def to_xml(**opts)
         | 
| 40 45 | 
             
                  builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
         | 
| 41 46 | 
             
                    xml.documents do
         | 
| 42 47 | 
             
                      @array.each do |hit|
         | 
| 43 48 | 
             
                        hit.fetch
         | 
| 44 | 
            -
                        hit.to_xml  | 
| 49 | 
            +
                        hit.to_xml **opts.merge(builder: xml)
         | 
| 45 50 | 
             
                      end
         | 
| 46 51 | 
             
                    end
         | 
| 47 52 | 
             
                  end
         | 
| @@ -49,8 +54,8 @@ module RelatonBib | |
| 49 54 | 
             
                end
         | 
| 50 55 |  | 
| 51 56 | 
             
                def select(&block)
         | 
| 52 | 
            -
                  me =  | 
| 53 | 
            -
                  array_dup =  | 
| 57 | 
            +
                  me = deep_dup
         | 
| 58 | 
            +
                  array_dup = instance_variable_get(:@array).deep_dup
         | 
| 54 59 | 
             
                  me.instance_variable_set(:@array, array_dup)
         | 
| 55 60 | 
             
                  array_dup.select!(&block)
         | 
| 56 61 | 
             
                  me
         | 
| @@ -49,7 +49,7 @@ module RelatonBib | |
| 49 49 | 
             
                end
         | 
| 50 50 |  | 
| 51 51 | 
             
                # @param builder [Nokogiri::XML::Builder]
         | 
| 52 | 
            -
                def to_xml(builder) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
         | 
| 52 | 
            +
                def to_xml(builder) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
         | 
| 53 53 | 
             
                  return unless content
         | 
| 54 54 |  | 
| 55 55 | 
             
                  if content.is_a?(Array)
         | 
| @@ -62,7 +62,7 @@ module RelatonBib | |
| 62 62 | 
             
                end
         | 
| 63 63 |  | 
| 64 64 | 
             
                # @return [Hash]
         | 
| 65 | 
            -
                def to_hash # rubocop:disable Metrics/AbcSize, | 
| 65 | 
            +
                def to_hash # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
         | 
| 66 66 | 
             
                  if content.is_a? String
         | 
| 67 67 | 
             
                    return content unless language || script
         | 
| 68 68 |  | 
| @@ -77,7 +77,7 @@ module RelatonBib | |
| 77 77 | 
             
                # @param prefix [String]
         | 
| 78 78 | 
             
                # @param count [Integer] number of elements
         | 
| 79 79 | 
             
                # @return [String]
         | 
| 80 | 
            -
                def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize, | 
| 80 | 
            +
                def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
         | 
| 81 81 | 
             
                  pref = prefix.empty? ? prefix : prefix + "."
         | 
| 82 82 | 
             
                  if content.is_a? String
         | 
| 83 83 | 
             
                    out = count > 1 ? "#{prefix}::\n" : ""
         | 
| @@ -55,7 +55,7 @@ module RelatonBib | |
| 55 55 | 
             
                # @return [RelatonBib::LocalizedString, NilClass]
         | 
| 56 56 | 
             
                attr_reader :abbreviation
         | 
| 57 57 |  | 
| 58 | 
            -
                # @return [RelatonBib::LocalizedString | 
| 58 | 
            +
                # @return [Array<RelatonBib::LocalizedString>]
         | 
| 59 59 | 
             
                attr_reader :subdivision
         | 
| 60 60 |  | 
| 61 61 | 
             
                # @return [Array<RelatonBib::OrgIdentifier>]
         | 
| @@ -63,11 +63,11 @@ module RelatonBib | |
| 63 63 |  | 
| 64 64 | 
             
                # @param name [String, Hash, Array<String, Hash>]
         | 
| 65 65 | 
             
                # @param abbreviation [RelatoBib::LocalizedString, String]
         | 
| 66 | 
            -
                # @param subdivision [RelatoBib::LocalizedString | 
| 66 | 
            +
                # @param subdivision [Array<RelatoBib::LocalizedString>]
         | 
| 67 67 | 
             
                # @param url [String]
         | 
| 68 68 | 
             
                # @param identifier [Array<RelatonBib::OrgIdentifier>]
         | 
| 69 69 | 
             
                # @param contact [Array<RelatonBib::Address, RelatonBib::Contact>]
         | 
| 70 | 
            -
                def initialize(**args) # rubocop:disable Metrics/AbcSize
         | 
| 70 | 
            +
                def initialize(**args) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
         | 
| 71 71 | 
             
                  raise ArgumentError, "missing keyword: name" unless args[:name]
         | 
| 72 72 |  | 
| 73 73 | 
             
                  super(url: args[:url], contact: args.fetch(:contact, []))
         | 
| @@ -79,17 +79,23 @@ module RelatonBib | |
| 79 79 | 
             
                          end
         | 
| 80 80 |  | 
| 81 81 | 
             
                  @abbreviation = localized_string args[:abbreviation]
         | 
| 82 | 
            -
                  @subdivision  =  | 
| 82 | 
            +
                  @subdivision  = (args[:subdivision] || []).map do |sd|
         | 
| 83 | 
            +
                    localized_string sd
         | 
| 84 | 
            +
                  end
         | 
| 83 85 | 
             
                  @identifier   = args.fetch(:identifier, [])
         | 
| 84 86 | 
             
                end
         | 
| 85 87 |  | 
| 86 | 
            -
                # @param  | 
| 87 | 
            -
                 | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
                     | 
| 92 | 
            -
                     | 
| 88 | 
            +
                # @param opts [Hash]
         | 
| 89 | 
            +
                # @option opts [Nokogiri::XML::Builder] :builder XML builder
         | 
| 90 | 
            +
                # @option opts [String] :lang language
         | 
| 91 | 
            +
                def to_xml(**opts) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/MethodLength
         | 
| 92 | 
            +
                  opts[:builder].organization do |builder|
         | 
| 93 | 
            +
                    nm = name.select { |n| n.language&.include? opts[:lang] }
         | 
| 94 | 
            +
                    nm = name unless nm.any?
         | 
| 95 | 
            +
                    nm.each { |n| builder.name { |b| n.to_xml b } }
         | 
| 96 | 
            +
                    sbdv = subdivision.select { |sd| sd.language&.include? opts[:lang] }
         | 
| 97 | 
            +
                    sbdv = subdivision unless sbdv.any?
         | 
| 98 | 
            +
                    sbdv.each { |sd| builder.subdivision { sd.to_xml builder } }
         | 
| 93 99 | 
             
                    builder.abbreviation { |a| abbreviation.to_xml a } if abbreviation
         | 
| 94 100 | 
             
                    builder.uri url if uri
         | 
| 95 101 | 
             
                    identifier.each { |identifier| identifier.to_xml builder }
         | 
| @@ -98,23 +104,28 @@ module RelatonBib | |
| 98 104 | 
             
                end
         | 
| 99 105 |  | 
| 100 106 | 
             
                # @return [Hash]
         | 
| 101 | 
            -
                def to_hash
         | 
| 107 | 
            +
                def to_hash # rubocop:disable Metrics/AbcSize
         | 
| 102 108 | 
             
                  hash = { "name" => single_element_array(name) }
         | 
| 103 109 | 
             
                  hash["abbreviation"] = abbreviation.to_hash if abbreviation
         | 
| 104 110 | 
             
                  hash["identifier"] = single_element_array(identifier) if identifier&.any?
         | 
| 105 | 
            -
                   | 
| 111 | 
            +
                  if subdivision&.any?
         | 
| 112 | 
            +
                    hash["subdivision"] = single_element_array(subdivision)
         | 
| 113 | 
            +
                  end
         | 
| 106 114 | 
             
                  { "organization" => hash.merge(super) }
         | 
| 107 115 | 
             
                end
         | 
| 108 116 |  | 
| 109 117 | 
             
                # @param prefix [String]
         | 
| 110 118 | 
             
                # @param count [Integer]
         | 
| 111 119 | 
             
                # @return [String]
         | 
| 112 | 
            -
                def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize, | 
| 120 | 
            +
                def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
         | 
| 113 121 | 
             
                  pref = prefix.sub /\*$/, "organization"
         | 
| 114 122 | 
             
                  out = count > 1 ? "#{pref}::\m" : ""
         | 
| 115 123 | 
             
                  name.each { |n| out += n.to_asciibib "#{pref}.name", name.size }
         | 
| 116 124 | 
             
                  out += abbreviation.to_asciibib "#{pref}.abbreviation" if abbreviation
         | 
| 117 | 
            -
                   | 
| 125 | 
            +
                  subdivision.each do |sd|
         | 
| 126 | 
            +
                    out += "#{pref}.subdivision::" if subdivision.size > 1
         | 
| 127 | 
            +
                    out += sd.to_asciibib "#{pref}.subdivision"
         | 
| 128 | 
            +
                  end
         | 
| 118 129 | 
             
                  identifier.each { |n| out += n.to_asciibib pref, identifier.size }
         | 
| 119 130 | 
             
                  out += super pref
         | 
| 120 131 | 
             
                  out
         | 
    
        data/lib/relaton_bib/person.rb
    CHANGED
    
    | @@ -44,23 +44,33 @@ module RelatonBib | |
| 44 44 | 
             
                  @completename = args[:completename]
         | 
| 45 45 | 
             
                end
         | 
| 46 46 |  | 
| 47 | 
            -
                # @param  | 
| 48 | 
            -
                 | 
| 49 | 
            -
             | 
| 47 | 
            +
                # @param opts [Hash]
         | 
| 48 | 
            +
                # @option opts [Nokogiri::XML::Builder] :builder XML builder
         | 
| 49 | 
            +
                # @option opts [String] :lang language
         | 
| 50 | 
            +
                def to_xml(**opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
         | 
| 51 | 
            +
                  opts[:builder].name do |builder|
         | 
| 50 52 | 
             
                    if completename
         | 
| 51 53 | 
             
                      builder.completename { completename.to_xml builder }
         | 
| 52 54 | 
             
                    else
         | 
| 53 | 
            -
                      prefix. | 
| 54 | 
            -
                       | 
| 55 | 
            -
                       | 
| 55 | 
            +
                      pref = prefix.select { |p| p.language&.include? opts[:lang] }
         | 
| 56 | 
            +
                      pref = prefix unless pref.any?
         | 
| 57 | 
            +
                      pref.each { |p| builder.prefix { p.to_xml builder } }
         | 
| 58 | 
            +
                      frnm = forename.select { |f| f.language&.include? opts[:lang] }
         | 
| 59 | 
            +
                      frnm = forename unless frnm.any?
         | 
| 60 | 
            +
                      frnm.each { |f| builder.forename { f.to_xml builder } }
         | 
| 61 | 
            +
                      init = initial.select { |i| i.language&.include? opts[:lang] }
         | 
| 62 | 
            +
                      init = initial unless init.any?
         | 
| 63 | 
            +
                      init.each { |i| builder.initial { i.to_xml builder } }
         | 
| 56 64 | 
             
                      builder.surname { surname.to_xml builder }
         | 
| 57 | 
            -
                      addition. | 
| 65 | 
            +
                      addn = addition.select { |a| a.language&.include? opts[:lang] }
         | 
| 66 | 
            +
                      addn = addition unless addn.any?
         | 
| 67 | 
            +
                      addn.each { |a| builder.addition { a.to_xml builder } }
         | 
| 58 68 | 
             
                    end
         | 
| 59 69 | 
             
                  end
         | 
| 60 70 | 
             
                end
         | 
| 61 71 |  | 
| 62 72 | 
             
                # @return [Hash]
         | 
| 63 | 
            -
                def to_hash # rubocop:disable Metrics/AbcSize, | 
| 73 | 
            +
                def to_hash # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
         | 
| 64 74 | 
             
                  hash = {}
         | 
| 65 75 | 
             
                  hash["forename"] = single_element_array(forename) if forename&.any?
         | 
| 66 76 | 
             
                  hash["initial"] = single_element_array(initial) if initial&.any?
         | 
| @@ -73,7 +83,7 @@ module RelatonBib | |
| 73 83 |  | 
| 74 84 | 
             
                # @param pref [String]
         | 
| 75 85 | 
             
                # @return [String]
         | 
| 76 | 
            -
                def to_asciibib(pref) # rubocop:disable Metrics/AbcSize, | 
| 86 | 
            +
                def to_asciibib(pref) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
         | 
| 77 87 | 
             
                  prf = pref.empty? ? pref : pref + "."
         | 
| 78 88 | 
             
                  prf += "name."
         | 
| 79 89 | 
             
                  out = forename.map do |fn|
         | 
| @@ -170,11 +180,13 @@ module RelatonBib | |
| 170 180 | 
             
                  @identifier = identifier
         | 
| 171 181 | 
             
                end
         | 
| 172 182 |  | 
| 173 | 
            -
                # @param  | 
| 174 | 
            -
                 | 
| 175 | 
            -
             | 
| 176 | 
            -
             | 
| 177 | 
            -
             | 
| 183 | 
            +
                # @param opts [Hash]
         | 
| 184 | 
            +
                # @option opts [Nokogiri::XML::Builder] :builder XML builder
         | 
| 185 | 
            +
                # @option opts [String, Symbol] :lang language
         | 
| 186 | 
            +
                def to_xml(**opts)
         | 
| 187 | 
            +
                  opts[:builder].person do |builder|
         | 
| 188 | 
            +
                    name.to_xml **opts
         | 
| 189 | 
            +
                    affiliation.each { |a| a.to_xml **opts }
         | 
| 178 190 | 
             
                    identifier.each { |id| id.to_xml builder }
         | 
| 179 191 | 
             
                    contact.each { |contact| contact.to_xml builder }
         | 
| 180 192 | 
             
                  end
         |