diff options
-rw-r--r-- | lib/attachment_to_html/adapters/rtf.rb | 62 | ||||
-rw-r--r-- | spec/lib/attachment_to_html/adapters/rtf_spec.rb | 82 |
2 files changed, 38 insertions, 106 deletions
diff --git a/lib/attachment_to_html/adapters/rtf.rb b/lib/attachment_to_html/adapters/rtf.rb index 871ca2c60..859c0e541 100644 --- a/lib/attachment_to_html/adapters/rtf.rb +++ b/lib/attachment_to_html/adapters/rtf.rb @@ -3,27 +3,31 @@ module AttachmentToHTML # Convert application/rtf documents in to HTML class RTF - attr_reader :attachment, :wrapper, :tmpdir + attr_reader :attachment, :tmpdir # Public: Initialize a RTF converter # # attachment - the FoiAttachment to convert to HTML # opts - a Hash of options (default: {}): - # :wrapper - String id of the div that wraps the - # attachment body # :tmpdir - String name of directory to store the # converted document def initialize(attachment, opts = {}) @attachment = attachment - @wrapper = opts.fetch(:wrapper, 'wrapper') @tmpdir = opts.fetch(:tmpdir, ::Rails.root.join('tmp')) end - # Public: Convert the attachment to HTML + # Public: The title to use in the <title> tag # # Returns a String - def to_html - @html ||= generate_html + def title + @title ||= attachment.display_filename + end + + # Public: The contents of the extracted html <body> tag + # + # Returns a String + def body + @body ||= parse_body end # Public: Was the document conversion successful? @@ -35,51 +39,17 @@ module AttachmentToHTML private - def generate_html - html = "<!DOCTYPE html>" - html += "<html>" - html += "<head>" - html += "<title>#{ title }</title>" - html += "</head>" - html += "<body>" - html += "<div id=\"#{ wrapper }\">" - html += "<div id=\"view-html-content\">" - html += body - html += "</div>" - html += "</div>" - html += "</body>" - html += "</html>" - end - - def title - @title ||= attachment.display_filename + def parse_body + match = convert.match(/<body[^>]*>(.*?)<\/body>/mi) + match ? match[1] : '' end - def body - parsed_body - end - - # Parse the output of the converted attachment so that we can pluck - # the parts we need and insert in to our own sensible template - # - # Returns a Nokogiri::HTML::Document - def parsed - @parsed ||= Nokogiri::HTML.parse(convert) - end - - def parsed_body - parsed.css('body').inner_html - end - - # Does the body element have any content, excluding HTML tags? - # - # Returns a Boolean def has_content? - !parsed.css('body').inner_text.empty? + !body.gsub(/\s+/,"").gsub(/\<[^\>]*\>/, "").empty? end def contains_images? - parsed.css('body img').any? + body.match(/<img[^>]*>/mi) ? true : false end def convert diff --git a/spec/lib/attachment_to_html/adapters/rtf_spec.rb b/spec/lib/attachment_to_html/adapters/rtf_spec.rb index 75fd467f6..a3bf0e27e 100644 --- a/spec/lib/attachment_to_html/adapters/rtf_spec.rb +++ b/spec/lib/attachment_to_html/adapters/rtf_spec.rb @@ -3,70 +3,39 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper') describe AttachmentToHTML::Adapters::RTF do let(:attachment) { FactoryGirl.build(:rtf_attachment) } - let(:rtf_adapter) { AttachmentToHTML::Adapters::RTF.new(attachment) } - - describe :wrapper do - - it 'defaults to wrapper' do - rtf_adapter.wrapper.should == 'wrapper' - end - - it 'accepts a wrapper option' do - rtf_adapter = AttachmentToHTML::Adapters::RTF.new(attachment, :wrapper => 'wrap') - rtf_adapter.wrapper.should == 'wrap' - end - - end + let(:adapter) { AttachmentToHTML::Adapters::RTF.new(attachment) } describe :tmpdir do it 'defaults to the rails tmp directory' do - rtf_adapter.tmpdir.should == Rails.root.join('tmp') + adapter.tmpdir.should == Rails.root.join('tmp') end it 'allows a tmpdir to be specified to store the converted document' do - rtf_adapter = AttachmentToHTML::Adapters::RTF.new(attachment, :tmpdir => '/tmp') - rtf_adapter.tmpdir.should == '/tmp' + adapter = AttachmentToHTML::Adapters::RTF.new(attachment, :tmpdir => '/tmp') + adapter.tmpdir.should == '/tmp' end end - describe :to_html do + describe :title do - it 'should be a valid html document' do - parsed = Nokogiri::HTML.parse(rtf_adapter.to_html) do |config| - config.strict - end - parsed.errors.any?.should be_false - end - - it 'contains the attachment filename in the title tag' do - parsed = Nokogiri::HTML.parse(rtf_adapter.to_html) do |config| - config.strict - end - parsed.css('head title').inner_html.should == attachment.display_filename + it 'uses the attachment filename for the title' do + adapter.title.should == attachment.display_filename end + + end - it 'contains the wrapper div in the body tag' do - rtf_adapter = AttachmentToHTML::Adapters::RTF.new(attachment, :wrapper => 'wrap') - parsed = Nokogiri::HTML.parse(rtf_adapter.to_html) do |config| - config.strict - end - parsed.css('body div').first.attributes['id'].value.should == 'wrap' - end + describe :body do - it 'contains the attachment body in the wrapper div' do - rtf_adapter = AttachmentToHTML::Adapters::RTF.new(attachment, :wrapper => 'wrap') - parsed = Nokogiri::HTML.parse(rtf_adapter.to_html) do |config| - config.strict - end - parsed.css('div#wrap div#view-html-content').inner_text.should include('thisisthebody') + it 'extracts the body from the document' do + adapter.body.should include('thisisthebody') end it 'operates in the context of the supplied tmpdir' do - rtf_adapter = AttachmentToHTML::Adapters::RTF.new(attachment, :tmpdir => '/tmp') + adapter = AttachmentToHTML::Adapters::RTF.new(attachment, :tmpdir => '/tmp') Dir.should_receive(:chdir).with('/tmp').and_call_original - rtf_adapter.to_html + adapter.body end it 'does not result in incorrect conversion when unrtf returns an invalid doctype' do @@ -88,34 +57,27 @@ describe AttachmentToHTML::Adapters::RTF do DOC AlaveteliExternalCommand.stub(:run).and_return(invalid) - parsed = Nokogiri::HTML.parse(rtf_adapter.to_html) do |config| - config.strict - end - parsed.css('body').inner_text.should_not include('//W3C//DTD HTML 4.01 Transitional//EN') + adapter.body.should_not include('//W3C//DTD HTML 4.01 Transitional//EN') end end + describe :success? do it 'is successful if the body has content excluding the tags' do - rtf_adapter.to_html - rtf_adapter.success?.should be_true + adapter.stub(:body).and_return('<p>some content</p>') + adapter.success?.should be_true end it 'is successful if the body contains images' do - mocked_return = %Q(<!DOCTYPE html><html><head></head><body><img src="logo.png" /></body></html>) - rtf_adapter = AttachmentToHTML::Adapters::RTF.new(attachment) - rtf_adapter.stub(:to_html).and_return(mocked_return) - rtf_adapter.success?.should be_true + adapter.stub(:body).and_return(%Q(<img src="logo.png" />)) + adapter.success?.should be_true end it 'is not successful if the body has no content other than tags' do - empty_rtf = load_file_fixture('empty.rtf') - attachment = FactoryGirl.build(:rtf_attachment, :body => empty_rtf) - rtf_adapter = AttachmentToHTML::Adapters::RTF.new(attachment) - rtf_adapter.to_html - rtf_adapter.success?.should be_false + adapter.stub(:body).and_return('<p></p>') + adapter.success?.should be_false end end |