diff --git a/app/models/iiif_canvas_presenter.rb b/app/models/iiif_canvas_presenter.rb
index 968761cfa6..247a6c41c2 100644
--- a/app/models/iiif_canvas_presenter.rb
+++ b/app/models/iiif_canvas_presenter.rb
@@ -124,7 +124,17 @@ def simple_iiif_range(label = stream_info[:embed_title])
end
def structure_to_iiif_range
- div_to_iiif_range(structure_ng_xml.root)
+ root_to_iiif_range(structure_ng_xml.root)
+ end
+
+ def root_to_iiif_range(root_node)
+ range = div_to_iiif_range(root_node)
+
+ if only_empty_descendants?(root_node)
+ range.items.prepend(IiifCanvasPresenter.new(master_file: master_file, stream_info: stream_info, media_fragment: "t=0,#{stream_info[:duration]}"))
+ end
+
+ return range
end
def div_to_iiif_range(div_node)
@@ -152,6 +162,10 @@ def span_to_iiif_range(span_node)
)
end
+ def only_empty_descendants?(node)
+ node.xpath('.//Span').empty?
+ end
+
FLOAT_PATTERN = Regexp.new(/^\d+([.]\d*)?$/).freeze
def parse_hour_min_sec(s)
diff --git a/spec/models/iiif_canvas_presenter_spec.rb b/spec/models/iiif_canvas_presenter_spec.rb
index 2c583bb043..ea9ac1e366 100644
--- a/spec/models/iiif_canvas_presenter_spec.rb
+++ b/spec/models/iiif_canvas_presenter_spec.rb
@@ -92,7 +92,45 @@
expect(subject.label.to_s).to eq "{\"none\"=>[\"#{master_file.embed_title}\"]}"
expect(subject.items.size).to eq 1
expect(subject.items.first).to be_a IiifCanvasPresenter
- expect(subject.items.first.media_fragment).to eq "t=0,#{(master_file.duration.to_f)/1000}"
+ expect(subject.items.first.media_fragment).to eq "t=0,#{master_file.duration.to_f/1000}"
+ end
+ end
+
+ context 'with childless divs' do
+ context 'without spans' do
+ let(:structure_xml) { ' ' }
+
+ it 'generates a canvas reference in the root range' do
+ expect(subject.label.to_s).to eq '{"none"=>["Test"]}'
+ expect(subject.items.size).to eq 2
+ expect(subject.items.first).to be_a IiifCanvasPresenter
+ expect(subject.items.first.media_fragment).to eq "t=0,#{master_file.duration.to_f/1000}"
+ expect(subject.items.second.label.to_s).to eq '{"none"=>["Div 1"]}'
+ expect(subject.items.second.items.size).to eq 1
+ expect(subject.items.second.items.first.label.to_s).to eq '{"none"=>["Div 2"]}'
+ expect(subject.items.second.items.first.items.size).to eq 1
+ expect(subject.items.second.items.first.items.first.label.to_s).to eq '{"none"=>["Div 3"]}'
+ expect(subject.items.second.items.first.items.first.items.size).to eq 0
+ end
+ end
+
+ context 'with spans' do
+ let(:structure_xml) { ' ' }
+
+ it 'does not generate a canvas reference in the root range' do
+ expect(subject.label.to_s).to eq '{"none"=>["Test"]}'
+ expect(subject.items.size).to eq 1
+ expect(subject.items.first.label.to_s).to eq '{"none"=>["Div 1"]}'
+ expect(subject.items.first.items.size).to eq 2
+ expect(subject.items.first.items.first.label.to_s).to eq '{"none"=>["Div 2"]}'
+ expect(subject.items.first.items.first.items.size).to eq 1
+ expect(subject.items.first.items.first.items.first.label.to_s).to eq '{"none"=>["Div 3"]}'
+ expect(subject.items.first.items.first.items.first.items.size).to eq 0
+ expect(subject.items.first.items.second.label.to_s).to eq '{"none"=>["Span 1"]}'
+ expect(subject.items.first.items.second.items.size).to eq 1
+ expect(subject.items.first.items.second.items.first).to be_a IiifCanvasPresenter
+ expect(subject.items.first.items.second.items.first.media_fragment).to eq 't=0.0,1.235'
+ end
end
end
end