Skip to content

Commit

Permalink
Merge pull request #7 from sul-dlss/subject_display_label
Browse files Browse the repository at this point in the history
Allow for Subject fields to provide their own display label.
  • Loading branch information
Jessie Keck committed Oct 16, 2013
2 parents 1033d73 + b8058eb commit 6393959
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 6 deletions.
42 changes: 38 additions & 4 deletions lib/mods_display/fields/subject.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
class ModsDisplay::Subject < ModsDisplay::Field

def fields
return_values = []
return_fields = []
@values.each do |value|
return_values = []
label = displayLabel(value) || "Subject"
return_text = []
selected_subjects(value).each do |child|
if self.respond_to?(:"process_#{child.name}")
Expand All @@ -18,9 +20,11 @@ def fields
unless return_text.empty?
return_values << return_text.flatten
end
unless return_values.empty?
return_fields << ModsDisplay::Values.new(:label => label, :values => return_values)
end
end
return [] if return_values.empty?
[ModsDisplay::Values.new(:label => "Subject", :values => return_values)]
collapse_subjects return_fields
end

# Would really like to clean this up, but it works and is tested for now.
Expand Down Expand Up @@ -99,5 +103,35 @@ def selected_subjects(element=@value)
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 and (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
18 changes: 17 additions & 1 deletion spec/fields/subject_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ def mods_display_hierarchical_subject(mods_record)
@geo_subject = Stanford::Mods::Record.new.from_str(hierarchical_geo_subjects, false).subject
@name_subject = Stanford::Mods::Record.new.from_str(name_subjects, false).subject
@complex_subject = Stanford::Mods::Record.new.from_str(complex_subjects, false).subject
@display_label = Stanford::Mods::Record.new.from_str(display_label_subjects, false).subject
end

describe "fields" do
it "should split individual child elments of subject into separate parts" do
fields = mods_display_subject(@subject).fields
Expand All @@ -43,6 +43,16 @@ def mods_display_hierarchical_subject(mods_record)
fields.length.should == 1
fields.first.values.should == [["United States", "California", "Stanford"]]
end
it "should handle display labels properly" do
fields = mods_display_subject(@display_label).fields
fields.length.should == 3
fields.first.label.should == "Subject"
fields.first.values.should == [["A Subject", "Another Subject"], ["B Subject", "Another B Subject"]]
fields[1].label.should == "Subject Heading"
fields[1].values.should == [["Jazz", "Japan", "History and criticism"]]
fields.last.label.should == "Subject"
fields.last.values.should == [["Bay Area", "Stanford"]]
end
it "should handle blank subjects properly" do
mods_display_subject(@blank_subject).fields.should == []
end
Expand Down Expand Up @@ -88,6 +98,12 @@ def mods_display_hierarchical_subject(mods_record)
html.scan(/<br\/>/).length.should == 1
html.scan(/ &gt; /).length.should == 3
end
it "should handle complex display labels" do
html = mods_display_subject(@display_label).to_html
html.scan(/<dt title='Subject'>Subject:<\/dt>/).length.should eq 2
html.scan(/<dt title='Subject Heading'>Subject Heading:<\/dt>/).length.should eq 1
html.scan(/<dd>/).length.should == 3
end
end

end
24 changes: 23 additions & 1 deletion spec/fixtures/subjects_fixtures.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,27 @@ def complex_subjects
</mods>
XML
end

def display_label_subjects
<<-XML
<mods>
<subject>
<topic>A Subject</topic>
<geographical>Another Subject</geographical>
</subject>
<subject>
<topic>B Subject</topic>
<geographical>Another B Subject</geographical>
</subject>
<subject displayLabel="Subject Heading">
<topic>Jazz</topic>
<geographical>Japan</geographical>
<topic>History and criticism</topic>
</subject>
<subject>
<topic>Bay Area</topic>
<geographical>Stanford</geographical>
</subject>
</mods>
XML
end
end

0 comments on commit 6393959

Please sign in to comment.