def self.process_authors author_line, names_only = false, multiple = true
author_metadata = {}
keys = ['author', 'authorinitials', 'firstname', 'middlename', 'lastname', 'email']
author_entries = multiple ? (author_line.split ';').map {|it| it.strip } : Array(author_line)
author_entries.each_with_index do |author_entry, idx|
next if author_entry.empty?
key_map = {}
if idx == 0
keys.each do |key|
key_map[key.to_sym] = key
end
else
keys.each do |key|
key_map[key.to_sym] = %(#{key}_#{idx + 1})
end
end
segments = nil
if names_only
if author_entry.include? '<'
author_metadata[key_map[:author]] = author_entry.tr('_', ' ')
author_entry = author_entry.gsub XmlSanitizeRx, ''
end
if (segments = author_entry.split nil, 3).size == 3
segments << (segments.pop.squeeze ' ')
end
elsif (match = AuthorInfoLineRx.match(author_entry))
(segments = match.to_a).shift
end
if segments
author = author_metadata[key_map[:firstname]] = fname = segments[0].tr('_', ' ')
author_metadata[key_map[:authorinitials]] = fname.chr
if segments[1]
if segments[2]
author_metadata[key_map[:middlename]] = mname = segments[1].tr('_', ' ')
author_metadata[key_map[:lastname]] = lname = segments[2].tr('_', ' ')
author = fname + ' ' + mname + ' ' + lname
author_metadata[key_map[:authorinitials]] = %(#{fname.chr}#{mname.chr}#{lname.chr})
else
author_metadata[key_map[:lastname]] = lname = segments[1].tr('_', ' ')
author = fname + ' ' + lname
author_metadata[key_map[:authorinitials]] = %(#{fname.chr}#{lname.chr})
end
end
author_metadata[key_map[:author]] ||= author
author_metadata[key_map[:email]] = segments[3] unless names_only || !segments[3]
else
author_metadata[key_map[:author]] = author_metadata[key_map[:firstname]] = fname = author_entry.squeeze(' ').strip
author_metadata[key_map[:authorinitials]] = fname.chr
end
author_metadata['authorcount'] = idx + 1
if idx == 1
keys.each do |key|
author_metadata[%(#{key}_1)] = author_metadata[key] if author_metadata.key? key
end
end
if idx == 0
author_metadata['authors'] = author_metadata[key_map[:author]]
else
author_metadata['authors'] = %(#{author_metadata['authors']}, #{author_metadata[key_map[:author]]})
end
end
author_metadata
end