module ModsDisplay
class Subject < Field
def fields
return_fields = []
@values.each do |value|
return_values = []
label = displayLabel(value) || I18n.t('mods_display.subject')
return_text = []
selected_subjects(value).each do |child|
if self.respond_to?(:"process_#{child.name}")
method_send = send(:"process_#{child.name}", child)
return_text << method_send unless method_send.to_s.empty?
else
if child.text.include?('--')
return_text << child.text.split('--').map(&:strip)
else
return_text << child.text unless child.text.empty?
end
end
end
return_values << return_text.flatten unless return_text.empty?
unless return_values.empty?
return_fields << ModsDisplay::Values.new(label: label, values: return_values)
end
end
collapse_subjects return_fields
end
# Would really like to clean this up, but it works and is tested for now.
def to_html
return nil if fields.empty? || @config.ignore?
output = ''
fields.each do |field|
output << "
#{field.label}"
output << ""
subs = []
field.values.each do |subjects|
buffer = []
sub_parts = []
subjects.each do |val|
if val.is_a?(ModsDisplay::Name::Person)
buffer << val.name
else
buffer << val
end
if @config.link && @config.hierarchical_link
if val.is_a?(ModsDisplay::Name::Person)
txt = link_to_value(val.name, buffer.join(' '))
txt << " (#{val.roles.join(', ')})" if val.roles
sub_parts << txt
else
sub_parts << link_to_value(val, buffer.join(' '))
end
elsif @config.link
if val.is_a?(ModsDisplay::Name::Person)
txt = link_to_value(val.name)
txt << " (#{val.roles.join(', ')})" if val.roles
sub_parts << txt
else
sub_parts << link_to_value(val.to_s)
end
else
sub_parts << val.to_s
end
end
subs << sub_parts.join(@config.delimiter)
end
output << subs.join('
')
output << ''
end
output
end
def process_hierarchicalGeographic(element)
values_from_subjects(element)
end
def process_name(element)
name = ModsDisplay::Name.new([element], @config, @klass).fields.first
name.values.first if name
end
private
def values_from_subjects(element)
return_values = []
selected_subjects(element).each do |child|
if child.text.include?('--')
return_values << child.text.split('--').map(&:strip)
else
return_values << child.text.strip
end
end
return_values
end
def selected_subjects(element = @value)
element.children.select do |child|
!omit_elements.include?(child.name.to_sym)
end
end
def omit_elements
[:cartographics, :geographicCode, :text]
end
# Providing subject specific collapsing method so we can
# collapse the labels w/o flattening all the subject fields.
def collapse_subjects(display_fields)
return_values = []
current_label = nil
prev_label = nil
buffer = []
display_fields.each_with_index do |field, index|
current_label = field.label
current_values = field.values
if display_fields.length == 1
return_values << ModsDisplay::Values.new(label: current_label, values: current_values)
elsif index == (display_fields.length - 1)
# need to deal w/ when we have a last element but we have separate labels in the buffer.
if current_label != prev_label
return_values << ModsDisplay::Values.new(label: prev_label, values: [buffer.flatten(1)])
return_values << ModsDisplay::Values.new(label: current_label, values: current_values)
else
buffer.concat(current_values)
return_values << ModsDisplay::Values.new(label: current_label, values: buffer.flatten(0))
end
elsif prev_label && (current_label != prev_label)
return_values << ModsDisplay::Values.new(label: prev_label, values: buffer.flatten(0))
buffer = []
end
buffer.concat(current_values)
prev_label = current_label
end
return_values
end
end
end