From d654286f5bc99a6170d27b91cfda683f1f8f5b02 Mon Sep 17 00:00:00 2001 From: Kouhei Sutou Date: Wed, 1 Mar 2017 23:35:43 +0900 Subject: [PATCH] Support nested message/rfc822 case --- lib/chupa-text/decomposers/mail.rb | 8 ++++++- test/fixture/nested-rfc822.eml | 34 ++++++++++++++++++++++++++++++ test/test-mail.rb | 29 ++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 test/fixture/nested-rfc822.eml diff --git a/lib/chupa-text/decomposers/mail.rb b/lib/chupa-text/decomposers/mail.rb index c47896d..ef547ba 100644 --- a/lib/chupa-text/decomposers/mail.rb +++ b/lib/chupa-text/decomposers/mail.rb @@ -46,7 +46,13 @@ def decompose(data) body.force_encoding(part.charset) if part.charset part_data = TextData.new(body, :source_data => data) - part_data.uri = "#{data.uri}\##{i}" + uri = data.uri.dup + if uri.fragment + uri.fragment += "-#{i}" + else + uri.fragment = i.to_s + end + part_data.uri = uri part_data.mime_type = part.mime_type if part.mime_type part_data[:encoding] = body.encoding.to_s yield(part_data) diff --git a/test/fixture/nested-rfc822.eml b/test/fixture/nested-rfc822.eml new file mode 100644 index 0000000..f9618a4 --- /dev/null +++ b/test/fixture/nested-rfc822.eml @@ -0,0 +1,34 @@ +Mime-Version: 1.0 +Subject: Hello +From: Sender +To: Recipient +Date: Sun, 19 Feb 2017 00:27:55 +0900 (JST) +Content-Type: multipart/alternative; + boundary="++++"; + charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--++++ +Content-Type: message/rfc822; + charset=UTF-8 +Content-Transfer-Encoding: 8bit +Mime-Version: 1.0 + +Content-Type: multipart/alternative; + boundary="===="; + charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--==== +Content-Type: message/rfc822; + charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Mime-Version: 1.0 +Content-Type: text/plain +Subject: Sub Hello + +Sub World +--==== + +--++++ diff --git a/test/test-mail.rb b/test/test-mail.rb index 6bbdbf4..8cab4ee 100644 --- a/test/test-mail.rb +++ b/test/test-mail.rb @@ -84,12 +84,22 @@ def decompose(path) data.mime_type = "message/rfc822" decomposed = [] - decomposer.decompose(data) do |decomposed_data| + decompose_data(data) do |decomposed_data| decomposed << decomposed_data end decomposed end + def decompose_data(data, &block) + decomposer.decompose(data) do |decomposed_data| + if decomposer.target?(decomposed_data) + decompose_data(decomposed_data, &block) + else + yield(decomposed_data) + end + end + end + sub_test_case("attributes") do def test_subject assert_equal(["Hello"], decompose("subject")) @@ -163,5 +173,22 @@ def decompose super(fixture_path("no-mime.eml")) end end + + sub_test_case("nested message/rfc822") do + def test_body + assert_equal([ + [ + fixture_path("nested-rfc822.eml") + "#0-0-0", + "Sub World", + ], + ], + decompose.collect {|data| [data.uri.to_s, data.body]}) + end + + private + def decompose + super(fixture_path("nested-rfc822.eml")) + end + end end end