class ModsDisplay::Name < ModsDisplay::Field
def fields
return_fields = @values.map do |value|
role = nil
person = nil
if value.role.length > 0 and value.role.roleTerm.length > 0
role = value.role.roleTerm.find do |term|
term.attributes["type"].respond_to?(:value) and
term.attributes["type"].value == "text"
end
end
if value.displayForm.length > 0
person = ModsDisplay::Name::Person.new(:name => value.displayForm.text, :role => role)
else
name_parts = value.namePart.map do |name_part|
name_part.text
end.join(", ")
person = ModsDisplay::Name::Person.new(:name => name_parts, :role => role) unless name_parts.empty?
end
ModsDisplay::Values.new(:label => displayLabel(value) || name_label(value), :values => [person]) if person
end.compact
collapse_fields(return_fields)
end
def to_html
return nil if fields.empty? or @config.ignore?
output = ""
fields.each do |field|
output << "
#{field.label}:"
output << ""
output << field.values.map do |val|
if @config.link
txt = link_to_value(val.name)
txt << " (#{val.role})" if val.role
txt
else
val.to_s
end
end.join(@config.delimiter)
output << ""
end
output
end
private
def name_label(element)
if name_is_main_author?(element)
if element.attributes.has_key?("type") && name_labels.has_key?(element.attributes["type"].value)
return name_labels[element.attributes["type"].value]
end
"Author/Creator"
else
"Contributor"
end
end
def name_is_main_author?(element)
begin
["author", "aut", "creator", "cre", ""].include?(element.role.roleTerm.text.downcase)
rescue
false
end
end
def name_labels
{"personal" => "Author/Creator",
"corporate" => "Corporate author",
"conference" => "Meeting",
"family" => "Family author"}
end
class Person
attr_accessor :name, :role
def initialize(data)
@name = data[:name]
@role = data[:role] ? data[:role].text : nil
end
def to_s
text = @name.dup
text << " (#{@role})" if @role
text
end
end
end