From 05f57305af9bcb10b57750f556d223cb44242645 Mon Sep 17 00:00:00 2001 From: atsushikanazawa Date: Fri, 1 Mar 2019 16:09:40 +0900 Subject: [PATCH 1/8] fix a bug that image indices are messed up if there is a sheet without any images attached in-between --- lib/roo/excelx.rb | 24 ++++++++++++++++++++++-- test/image_order/kangaroos.xlsx | Bin 0 -> 26988 bytes test/image_order/test_image_order.rb | 12 ++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 test/image_order/kangaroos.xlsx create mode 100644 test/image_order/test_image_order.rb diff --git a/lib/roo/excelx.rb b/lib/roo/excelx.rb index f9f0ee26..df29c092 100755 --- a/lib/roo/excelx.rb +++ b/lib/roo/excelx.rb @@ -425,6 +425,8 @@ def process_zipfile_entries(entries) extract_sheets_in_order(entries, sheet_ids, sheets, @tmpdir) extract_images(entries, @tmpdir) + # + drawings_indices = {} entries.each do |entry| path = case entry.name.downcase @@ -448,14 +450,32 @@ def process_zipfile_entries(entries) # FIXME: Roo seems to use sheet[\d].xml.rels for hyperlinks only, but # it also stores the location for sharedStrings, comments, # drawings, etc. + # nr = Regexp.last_match[1].to_i + + entry.get_input_stream.readlines.drop(1).each { |line| + match = /Target="..\/drawings\/(drawing[0-9]+.xml)"/.match(line) + if match + drawing_name = match[1] + ".rels" + drawings_indices[drawing_name] = nr - 1 + end + } rels_files[nr - 1] = "#{@tmpdir}/roo_rels#{nr}" + end + + entry.extract(path) if path + end + + # had to make sure all the indices for images are set by now + entries.each do |entry| + path = + case entry.name.downcase when /drawing([0-9]+).xml.rels$/ # Extracting drawing relationships to make images lists for each sheet nr = Regexp.last_match[1].to_i - image_rels[nr - 1] = "#{@tmpdir}/roo_image_rels#{nr}" + index = drawings_indices[Regexp.last_match[0]] + image_rels[index] = "#{@tmpdir}/roo_image_rels#{nr}" end - entry.extract(path) if path end end diff --git a/test/image_order/kangaroos.xlsx b/test/image_order/kangaroos.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..014384536ebf8b7f8a5feea87c4a7598fd77e63c GIT binary patch literal 26988 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 literal 0 HcmV?d00001 diff --git a/test/image_order/test_image_order.rb b/test/image_order/test_image_order.rb new file mode 100644 index 00000000..ae96ae31 --- /dev/null +++ b/test/image_order/test_image_order.rb @@ -0,0 +1,12 @@ +require "test_helper" +require 'pry' + +class TestRooCSV < Minitest::Test + def test_sheets + ex = Roo::Excelx.new(File.expand_path("../kangaroos.xlsx", __FILE__).to_s) + binding.pry + assert_equal 1, ex.sheet_for(0).images.size + assert_equal 0, ex.sheet_for(1).images.size + assert_equal 1, ex.sheet_for(2).images.size + end +end From 0d8d777834bad8ef6c4d3db8539dfee97afbf930 Mon Sep 17 00:00:00 2001 From: atsushikanazawa Date: Fri, 1 Mar 2019 16:11:14 +0900 Subject: [PATCH 2/8] fuck me --- test/image_order/test_image_order.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/image_order/test_image_order.rb b/test/image_order/test_image_order.rb index ae96ae31..5c939d8c 100644 --- a/test/image_order/test_image_order.rb +++ b/test/image_order/test_image_order.rb @@ -4,7 +4,6 @@ class TestRooCSV < Minitest::Test def test_sheets ex = Roo::Excelx.new(File.expand_path("../kangaroos.xlsx", __FILE__).to_s) - binding.pry assert_equal 1, ex.sheet_for(0).images.size assert_equal 0, ex.sheet_for(1).images.size assert_equal 1, ex.sheet_for(2).images.size From 5fc479a4caabb343ae71314e5cc67beb2dadfeec Mon Sep 17 00:00:00 2001 From: atsushikanazawa Date: Fri, 1 Mar 2019 16:12:39 +0900 Subject: [PATCH 3/8] fuck me --- lib/roo/excelx.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/roo/excelx.rb b/lib/roo/excelx.rb index df29c092..cfa76e33 100755 --- a/lib/roo/excelx.rb +++ b/lib/roo/excelx.rb @@ -425,7 +425,6 @@ def process_zipfile_entries(entries) extract_sheets_in_order(entries, sheet_ids, sheets, @tmpdir) extract_images(entries, @tmpdir) - # drawings_indices = {} entries.each do |entry| path = From e0f8bf968160a391de88d83a46a0eab3bdc563e4 Mon Sep 17 00:00:00 2001 From: atsushikanazawa Date: Fri, 1 Mar 2019 16:14:15 +0900 Subject: [PATCH 4/8] fuck me --- lib/roo/excelx.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/roo/excelx.rb b/lib/roo/excelx.rb index cfa76e33..9d9c694c 100755 --- a/lib/roo/excelx.rb +++ b/lib/roo/excelx.rb @@ -449,7 +449,6 @@ def process_zipfile_entries(entries) # FIXME: Roo seems to use sheet[\d].xml.rels for hyperlinks only, but # it also stores the location for sharedStrings, comments, # drawings, etc. - # nr = Regexp.last_match[1].to_i entry.get_input_stream.readlines.drop(1).each { |line| From 964e26db7d4550ada8d682dddeb396cddf244b7c Mon Sep 17 00:00:00 2001 From: atsushikanazawa Date: Sat, 2 Mar 2019 03:53:11 +0900 Subject: [PATCH 5/8] reflected code_review - created a method that returns "Target" attribute based on passed type - created "images" method on sheet class, that resolves the correct index by said "Target" attribute and regex - moved excel file to test/files - changed test file name because this is about indices of images, not ordering --- lib/roo/excelx.rb | 21 +-------------------- lib/roo/excelx/relationships.rb | 6 ++++++ lib/roo/excelx/sheet.rb | 13 ++++++++++--- test/excelx/test_image_index.rb | 11 +++++++++++ test/{image_order => files}/kangaroos.xlsx | Bin test/image_order/test_image_order.rb | 11 ----------- 6 files changed, 28 insertions(+), 34 deletions(-) create mode 100644 test/excelx/test_image_index.rb rename test/{image_order => files}/kangaroos.xlsx (100%) delete mode 100644 test/image_order/test_image_order.rb diff --git a/lib/roo/excelx.rb b/lib/roo/excelx.rb index 9d9c694c..26ff9476 100755 --- a/lib/roo/excelx.rb +++ b/lib/roo/excelx.rb @@ -425,7 +425,6 @@ def process_zipfile_entries(entries) extract_sheets_in_order(entries, sheet_ids, sheets, @tmpdir) extract_images(entries, @tmpdir) - drawings_indices = {} entries.each do |entry| path = case entry.name.downcase @@ -450,29 +449,11 @@ def process_zipfile_entries(entries) # it also stores the location for sharedStrings, comments, # drawings, etc. nr = Regexp.last_match[1].to_i - - entry.get_input_stream.readlines.drop(1).each { |line| - match = /Target="..\/drawings\/(drawing[0-9]+.xml)"/.match(line) - if match - drawing_name = match[1] + ".rels" - drawings_indices[drawing_name] = nr - 1 - end - } rels_files[nr - 1] = "#{@tmpdir}/roo_rels#{nr}" - end - - entry.extract(path) if path - end - - # had to make sure all the indices for images are set by now - entries.each do |entry| - path = - case entry.name.downcase when /drawing([0-9]+).xml.rels$/ # Extracting drawing relationships to make images lists for each sheet nr = Regexp.last_match[1].to_i - index = drawings_indices[Regexp.last_match[0]] - image_rels[index] = "#{@tmpdir}/roo_image_rels#{nr}" + image_rels[nr - 1] = "#{@tmpdir}/roo_image_rels#{nr}" end entry.extract(path) if path end diff --git a/lib/roo/excelx/relationships.rb b/lib/roo/excelx/relationships.rb index 754775d4..f86e1296 100644 --- a/lib/roo/excelx/relationships.rb +++ b/lib/roo/excelx/relationships.rb @@ -19,6 +19,12 @@ def include_type?(type) end end + def target(type) + to_a.map do |_, rel| + rel["Target"] if rel["Type"]&.include? type + end.compact.first + end + private def extract_relationships diff --git a/lib/roo/excelx/sheet.rb b/lib/roo/excelx/sheet.rb index 840a0533..1db882ec 100644 --- a/lib/roo/excelx/sheet.rb +++ b/lib/roo/excelx/sheet.rb @@ -6,13 +6,10 @@ class Sheet delegate [:styles, :workbook, :shared_strings, :rels_files, :sheet_files, :comments_files, :image_rels] => :@shared - attr_reader :images - def initialize(name, shared, sheet_index, options = {}) @name = name @shared = shared @sheet_index = sheet_index - @images = Images.new(image_rels[sheet_index]).list @rels = Relationships.new(rels_files[sheet_index]) @comments = Comments.new(comments_files[sheet_index]) @sheet = SheetDoc.new(sheet_files[sheet_index], @rels, shared, options) @@ -96,6 +93,16 @@ def dimensions @sheet.dimensions end + def images + target = @rels.target("drawing") + match = /[a-zA-Z]+([0-9]+).xml/.match target + if match + Images.new(image_rels[match[1].to_i - 1]).list + else + [] + end + end + private # Take an xml row and return an array of Excelx::Cell objects diff --git a/test/excelx/test_image_index.rb b/test/excelx/test_image_index.rb new file mode 100644 index 00000000..192a6dcc --- /dev/null +++ b/test/excelx/test_image_index.rb @@ -0,0 +1,11 @@ +require "test_helper" + +class TestImageIndex < Minitest::Test + def test_sheets + with_each_spreadsheet(name: "kangaroos", format: [:excelx]) do |oo| + assert_equal 1, oo.sheet_for(0).images.size + assert_equal 0, oo.sheet_for(1).images.size + assert_equal 1, oo.sheet_for(2).images.size + end + end +end diff --git a/test/image_order/kangaroos.xlsx b/test/files/kangaroos.xlsx similarity index 100% rename from test/image_order/kangaroos.xlsx rename to test/files/kangaroos.xlsx diff --git a/test/image_order/test_image_order.rb b/test/image_order/test_image_order.rb deleted file mode 100644 index 5c939d8c..00000000 --- a/test/image_order/test_image_order.rb +++ /dev/null @@ -1,11 +0,0 @@ -require "test_helper" -require 'pry' - -class TestRooCSV < Minitest::Test - def test_sheets - ex = Roo::Excelx.new(File.expand_path("../kangaroos.xlsx", __FILE__).to_s) - assert_equal 1, ex.sheet_for(0).images.size - assert_equal 0, ex.sheet_for(1).images.size - assert_equal 1, ex.sheet_for(2).images.size - end -end From 9aa08af8a5e6a9bfe4f2ab8a3fc99b07345a5489 Mon Sep 17 00:00:00 2001 From: atsushikanazawa Date: Thu, 14 Mar 2019 17:14:29 +0900 Subject: [PATCH 6/8] code review --- lib/roo/excelx.rb | 1 + lib/roo/excelx/relationships.rb | 10 ++++++---- lib/roo/excelx/sheet.rb | 11 +++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/roo/excelx.rb b/lib/roo/excelx.rb index 26ff9476..f9f0ee26 100755 --- a/lib/roo/excelx.rb +++ b/lib/roo/excelx.rb @@ -455,6 +455,7 @@ def process_zipfile_entries(entries) nr = Regexp.last_match[1].to_i image_rels[nr - 1] = "#{@tmpdir}/roo_image_rels#{nr}" end + entry.extract(path) if path end end diff --git a/lib/roo/excelx/relationships.rb b/lib/roo/excelx/relationships.rb index f86e1296..4236a84f 100644 --- a/lib/roo/excelx/relationships.rb +++ b/lib/roo/excelx/relationships.rb @@ -19,10 +19,12 @@ def include_type?(type) end end - def target(type) - to_a.map do |_, rel| - rel["Target"] if rel["Type"]&.include? type - end.compact.first + def targets(type: "") + return to_enum(__method__, type: type) unless block_given? + + to_a.each do |_, rel| + yield rel["Target"] if rel["Type"]&.include? type + end end private diff --git a/lib/roo/excelx/sheet.rb b/lib/roo/excelx/sheet.rb index 1db882ec..46b4073d 100644 --- a/lib/roo/excelx/sheet.rb +++ b/lib/roo/excelx/sheet.rb @@ -94,12 +94,11 @@ def dimensions end def images - target = @rels.target("drawing") - match = /[a-zA-Z]+([0-9]+).xml/.match target - if match - Images.new(image_rels[match[1].to_i - 1]).list - else - [] + @images ||= begin + @rels.targets(type: "drawing").map do |target| + match = /[a-zA-Z]+([0-9]+).xml/.match target + Images.new(image_rels[match[1].to_i - 1]).list + end.flatten end end From 46a428063ce95bcc87c6beaa39d5cfe4ab835192 Mon Sep 17 00:00:00 2001 From: atsushikanazawa Date: Thu, 14 Mar 2019 17:48:18 +0900 Subject: [PATCH 7/8] - I had to reduce the array of hashes - sort the images hash because its order was messed up too - added new test case which tests the said order --- lib/roo/excelx/sheet.rb | 2 +- test/excelx/test_image_index.rb | 13 +++++++++++-- test/files/kangaroos.xlsx | Bin 26988 -> 58522 bytes 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/roo/excelx/sheet.rb b/lib/roo/excelx/sheet.rb index 46b4073d..48f994f5 100644 --- a/lib/roo/excelx/sheet.rb +++ b/lib/roo/excelx/sheet.rb @@ -98,7 +98,7 @@ def images @rels.targets(type: "drawing").map do |target| match = /[a-zA-Z]+([0-9]+).xml/.match target Images.new(image_rels[match[1].to_i - 1]).list - end.flatten + end.reduce({}, :merge).sort.to_h end end diff --git a/test/excelx/test_image_index.rb b/test/excelx/test_image_index.rb index 192a6dcc..89fae37e 100644 --- a/test/excelx/test_image_index.rb +++ b/test/excelx/test_image_index.rb @@ -1,11 +1,20 @@ require "test_helper" class TestImageIndex < Minitest::Test - def test_sheets + def test_number_of_images with_each_spreadsheet(name: "kangaroos", format: [:excelx]) do |oo| - assert_equal 1, oo.sheet_for(0).images.size + assert_equal 4, oo.sheet_for(0).images.size assert_equal 0, oo.sheet_for(1).images.size assert_equal 1, oo.sheet_for(2).images.size end end + + def test_order_of_images + with_each_spreadsheet(name: "kangaroos", format: [:excelx]) do |oo| + expected = {"rId1"=>"roo_media_image1.jpeg", "rId2"=>"roo_media_image2.jpeg", "rId3"=>"roo_media_image3.jpeg", "rId4"=>"roo_media_image4.jpeg"} + + assert_equal expected.keys, oo.sheet_for(0).images.keys + assert_equal expected.values, oo.sheet_for(0).images.values + end + end end diff --git a/test/files/kangaroos.xlsx b/test/files/kangaroos.xlsx index 014384536ebf8b7f8a5feea87c4a7598fd77e63c..f75e567506ad9fad4eb575210fbd1ac983e4bf98 100644 GIT binary patch delta 35236 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 delta 3637 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 z Date: Thu, 14 Mar 2019 18:31:13 +0900 Subject: [PATCH 8/8] changed method name --- lib/roo/excelx/relationships.rb | 2 +- lib/roo/excelx/sheet.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/roo/excelx/relationships.rb b/lib/roo/excelx/relationships.rb index 4236a84f..f4ce7b0e 100644 --- a/lib/roo/excelx/relationships.rb +++ b/lib/roo/excelx/relationships.rb @@ -19,7 +19,7 @@ def include_type?(type) end end - def targets(type: "") + def filter_by_type(type: "") return to_enum(__method__, type: type) unless block_given? to_a.each do |_, rel| diff --git a/lib/roo/excelx/sheet.rb b/lib/roo/excelx/sheet.rb index 48f994f5..f209b296 100644 --- a/lib/roo/excelx/sheet.rb +++ b/lib/roo/excelx/sheet.rb @@ -95,7 +95,7 @@ def dimensions def images @images ||= begin - @rels.targets(type: "drawing").map do |target| + @rels.filter_by_type(type: "drawing").map do |target| match = /[a-zA-Z]+([0-9]+).xml/.match target Images.new(image_rels[match[1].to_i - 1]).list end.reduce({}, :merge).sort.to_h