eml_to_pdf 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.codeclimate.yml +5 -0
- data/.ruby-version +1 -1
- data/.travis.yml +2 -1
- data/README.md +3 -2
- data/eml_to_pdf.gemspec +2 -2
- data/exe/eml_to_pdf +0 -9
- data/lib/eml_to_pdf.rb +2 -0
- data/lib/eml_to_pdf/email.rb +4 -61
- data/lib/eml_to_pdf/extraction_step.rb +30 -24
- data/lib/eml_to_pdf/extraction_step_list.rb +24 -0
- data/lib/eml_to_pdf/metadata_context.rb +2 -7
- data/lib/eml_to_pdf/templates/heading.html.erb +6 -6
- data/lib/eml_to_pdf/version.rb +1 -1
- metadata +9 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3937b46f020a4ba5bbac39fdfd2c80beaf47f92b
|
4
|
+
data.tar.gz: 58105137f1f5b3de7afd8e7560c141d67f230f36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 933861a07fe0aa3e26dd57f70e3f1f1a1e36b9f58260fd6890b62d90ac2a5873d6211131195f3aa12da86bbc035a8f60809efd42cc2643a1c0dbeedb2503e2e9
|
7
|
+
data.tar.gz: de3fdd4b821015d8d13dc2da849501ae0d5209d2fcfb959a15cc20a92167f88afb8eab715f399f0c04fcef4c3da731d7e861f5ddbaf3c242976f7052a57f8406
|
data/.codeclimate.yml
ADDED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.4.1
|
data/.travis.yml
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
3
|
- 2.2.2
|
4
|
+
- 2.4.1
|
4
5
|
before_install:
|
5
|
-
- gem install bundler -v 1.
|
6
|
+
- gem install bundler -v 1.14.6
|
6
7
|
- wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
|
7
8
|
- tar -xvf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
|
8
9
|
- export PATH=$PATH:$PWD/wkhtmltox/bin/
|
data/README.md
CHANGED
@@ -4,7 +4,8 @@ Welcome to EmlToPdf.
|
|
4
4
|
A small converter to convert an eml file to a pdf.
|
5
5
|
This gem uses `wkhtmltopdf`. You can get the installer from [here](http://wkhtmltopdf.org/downloads.html)
|
6
6
|
|
7
|
-
[](https://travis-ci.org/siegy22/eml_to_pdf)
|
8
|
+
[](https://codeclimate.com/github/siegy22/eml_to_pdf)
|
8
9
|
|
9
10
|
## Installation
|
10
11
|
|
@@ -58,7 +59,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
58
59
|
|
59
60
|
## Contributing
|
60
61
|
|
61
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
62
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/siegy22/eml_to_pdf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
62
63
|
|
63
64
|
|
64
65
|
## License
|
data/eml_to_pdf.gemspec
CHANGED
@@ -22,10 +22,10 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.required_ruby_version = ">= 2.2.0"
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.10"
|
25
|
-
spec.add_development_dependency "rake", "~>
|
25
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
26
26
|
spec.add_development_dependency 'minitest', '~> 5.9'
|
27
27
|
|
28
28
|
spec.add_runtime_dependency 'filesize', '~> 0.1.1'
|
29
29
|
spec.add_runtime_dependency 'mail', '~> 2.5', '>= 2.5.4'
|
30
|
-
spec.add_runtime_dependency 'nokogiri', '~> 1.
|
30
|
+
spec.add_runtime_dependency 'nokogiri', '~> 1.7'
|
31
31
|
end
|
data/exe/eml_to_pdf
CHANGED
@@ -1,13 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# TODO: use this to convert whole folders
|
3
|
-
# Dir["test/fixtures/emails/*.eml"].each do |test_file|
|
4
|
-
# puts "> converting #{test_file}"
|
5
|
-
# begin
|
6
|
-
# EmlToPdf.convert(test_file, "#{test_file[0..-5]}_output.pdf")
|
7
|
-
# rescue NoMethodError => e
|
8
|
-
# puts e.message
|
9
|
-
# end
|
10
|
-
# end
|
11
2
|
|
12
3
|
if ARGV[0] && ARGV[1]
|
13
4
|
require "bundler/setup"
|
data/lib/eml_to_pdf.rb
CHANGED
@@ -5,6 +5,8 @@ require "eml_to_pdf/converter"
|
|
5
5
|
require "eml_to_pdf/email"
|
6
6
|
require "eml_to_pdf/wkhtmltopdf"
|
7
7
|
require "eml_to_pdf/metadata_context"
|
8
|
+
require "eml_to_pdf/extraction_step"
|
9
|
+
require "eml_to_pdf/extraction_step_list"
|
8
10
|
|
9
11
|
module EmlToPdf
|
10
12
|
def self.convert(input, output)
|
data/lib/eml_to_pdf/email.rb
CHANGED
@@ -5,12 +5,6 @@ require "erb"
|
|
5
5
|
|
6
6
|
module EmlToPdf
|
7
7
|
class Email
|
8
|
-
MIME_TYPES = {
|
9
|
-
plain_text: "text/plain",
|
10
|
-
html: "text/html",
|
11
|
-
multipart_alternative: "multipart/alternative"
|
12
|
-
}
|
13
|
-
|
14
8
|
TEMPLATES_PATH = Pathname.new(File.expand_path(__dir__)) + "templates"
|
15
9
|
|
16
10
|
def initialize(input_path)
|
@@ -19,26 +13,15 @@ module EmlToPdf
|
|
19
13
|
end
|
20
14
|
|
21
15
|
def to_html
|
22
|
-
|
16
|
+
extraction = ExtractionStep.new(@mail)
|
17
|
+
extraction = extraction.next until extraction.finished?
|
18
|
+
html = extraction.to_html
|
23
19
|
html = resolve_cids_from_attachments(html, @mail.all_parts)
|
24
20
|
html = add_mail_metadata_to_html(@mail, html)
|
25
21
|
html
|
26
22
|
end
|
27
23
|
|
28
24
|
private
|
29
|
-
def text_parts(mail_or_part)
|
30
|
-
if mail_or_part.multipart? && multipart_alternative?(mail_or_part)
|
31
|
-
best_part = extract_best_part(mail_or_part.parts)
|
32
|
-
text_parts(best_part)
|
33
|
-
elsif mail_or_part.multipart?
|
34
|
-
mail_or_part.parts.map do |part|
|
35
|
-
text_parts(part)
|
36
|
-
end
|
37
|
-
else
|
38
|
-
[text_body(mail_or_part)]
|
39
|
-
end.flatten
|
40
|
-
end
|
41
|
-
|
42
25
|
def visible_attachments(mail)
|
43
26
|
mail.attachments.select do |attachment|
|
44
27
|
!attachment.inline?
|
@@ -64,42 +47,6 @@ module EmlToPdf
|
|
64
47
|
end
|
65
48
|
end
|
66
49
|
|
67
|
-
def extract_best_part(parts)
|
68
|
-
if multipart_part = parts.detect(&:multipart?)
|
69
|
-
multipart_part
|
70
|
-
elsif html_part = find_body_with_type(parts, :html)
|
71
|
-
html_part
|
72
|
-
elsif text_part = find_body_with_type(parts, :plain_text)
|
73
|
-
text_part
|
74
|
-
else
|
75
|
-
"can't find useable part"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def find_body_with_type(parts, type)
|
80
|
-
parts.detect do |part|
|
81
|
-
part.mime_type == MIME_TYPES[type]
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def multipart_alternative?(part)
|
86
|
-
part.mime_type == MIME_TYPES[:multipart_alternative]
|
87
|
-
end
|
88
|
-
|
89
|
-
def text_body(mail_or_part)
|
90
|
-
if mail_or_part.mime_type == MIME_TYPES[:html] && !mail_or_part.attachment?
|
91
|
-
mail_or_part.decoded
|
92
|
-
elsif mail_or_part.mime_type == MIME_TYPES[:plain_text] && !mail_or_part.attachment?
|
93
|
-
wrap_text_in_pre_tag(mail_or_part.decoded)
|
94
|
-
else
|
95
|
-
""
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def wrap_text_in_pre_tag(text)
|
100
|
-
"<pre>#{text}</pre>"
|
101
|
-
end
|
102
|
-
|
103
50
|
def add_mail_metadata_to_html(mail, html)
|
104
51
|
context = MetadataContext.new(from: save_extract_header(mail, :from),
|
105
52
|
to: save_extract_header(mail, :to),
|
@@ -123,11 +70,7 @@ module EmlToPdf
|
|
123
70
|
end
|
124
71
|
|
125
72
|
def save_extract_header(mail, header)
|
126
|
-
|
127
|
-
header.decoded
|
128
|
-
else
|
129
|
-
""
|
130
|
-
end
|
73
|
+
(mail.header[header] && mail.header[header].decoded) || ""
|
131
74
|
end
|
132
75
|
end
|
133
76
|
end
|
@@ -1,54 +1,60 @@
|
|
1
1
|
module EmlToPdf
|
2
|
-
|
3
|
-
# TODO: in email#to_html remove recursive function with this class
|
4
|
-
# for a better control and to be able to make more unit tests.
|
5
2
|
class ExtractionStep
|
3
|
+
MIME_TYPES = {
|
4
|
+
plain_text: "text/plain",
|
5
|
+
html: "text/html",
|
6
|
+
multipart_alternative: "multipart/alternative"
|
7
|
+
}
|
8
|
+
|
6
9
|
def initialize(mail_or_part)
|
7
10
|
@mail_or_part = mail_or_part
|
8
11
|
end
|
9
12
|
|
10
|
-
# extraction = ExtractionStep.new(@mail)
|
11
|
-
# extraction = extraction.next until extraction.finished?
|
12
|
-
|
13
13
|
def next
|
14
14
|
if multipart_alternative?(@mail_or_part)
|
15
15
|
best_part = extract_best_part(@mail_or_part.parts)
|
16
16
|
ExtractionStep.new(best_part)
|
17
17
|
elsif @mail_or_part.multipart?
|
18
|
-
|
18
|
+
ExtractionStepList.new(@mail_or_part.parts.map { |part| ExtractionStep.new(part) })
|
19
19
|
else
|
20
|
-
|
20
|
+
self
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
def finished?
|
25
|
-
|
25
|
+
!@mail_or_part.multipart?
|
26
26
|
end
|
27
27
|
|
28
28
|
def to_html
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
text_body(@mail_or_part)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def multipart_alternative?(part)
|
34
|
+
part.mime_type == MIME_TYPES[:multipart_alternative]
|
35
|
+
end
|
36
|
+
|
37
|
+
def text_body(mail_or_part)
|
38
|
+
if mail_or_part.mime_type == MIME_TYPES[:html] && !mail_or_part.attachment?
|
39
|
+
mail_or_part.decoded
|
40
|
+
elsif mail_or_part.mime_type == MIME_TYPES[:plain_text] && !mail_or_part.attachment?
|
41
|
+
wrap_text_in_pre_tag(mail_or_part.decoded)
|
33
42
|
else
|
34
43
|
""
|
35
44
|
end
|
36
45
|
end
|
37
46
|
|
38
47
|
def extract_best_part(parts)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
elsif text_part = find_body_with_type(parts, :plain_text)
|
44
|
-
text_part
|
45
|
-
else
|
46
|
-
"can't find useable part"
|
47
|
-
end
|
48
|
+
parts.detect(&:multipart?) ||
|
49
|
+
find_body_with_type(parts, :html) ||
|
50
|
+
find_body_with_type(parts, :plain_text) ||
|
51
|
+
EmptyPart.new
|
48
52
|
end
|
49
53
|
|
50
|
-
def
|
51
|
-
|
54
|
+
def find_body_with_type(parts, type)
|
55
|
+
parts.detect do |part|
|
56
|
+
part.mime_type == MIME_TYPES[type]
|
57
|
+
end
|
52
58
|
end
|
53
59
|
|
54
60
|
def wrap_text_in_pre_tag(text)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module EmlToPdf
|
2
|
+
class ExtractionStepList
|
3
|
+
def initialize(steps)
|
4
|
+
@steps = steps
|
5
|
+
end
|
6
|
+
|
7
|
+
def next
|
8
|
+
self.class.new(@steps.map(&:next))
|
9
|
+
end
|
10
|
+
|
11
|
+
def finished?
|
12
|
+
@steps.all?(&:finished?)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_html
|
16
|
+
@steps.flatten.map(&:to_html).join
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def multipart_alternative?(part)
|
21
|
+
part.mime_type == MIME_TYPES[:multipart_alternative]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,14 +1,9 @@
|
|
1
1
|
require "filesize"
|
2
2
|
require "cgi"
|
3
|
+
require "ostruct"
|
3
4
|
|
4
5
|
module EmlToPdf
|
5
|
-
class MetadataContext
|
6
|
-
def initialize(metadata)
|
7
|
-
metadata.each do |k, v|
|
8
|
-
eval("@#{k}=v")
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
6
|
+
class MetadataContext < OpenStruct
|
12
7
|
def config
|
13
8
|
EmlToPdf.configuration
|
14
9
|
end
|
@@ -3,25 +3,25 @@
|
|
3
3
|
<table>
|
4
4
|
<tr>
|
5
5
|
<td><strong><%= config.from_label %></strong></td>
|
6
|
-
<td><%= html_escape(
|
6
|
+
<td><%= html_escape(from) %></td>
|
7
7
|
</tr>
|
8
8
|
<tr>
|
9
9
|
<td><strong><%= config.to_label %></strong></td>
|
10
|
-
<td><%= html_escape(
|
10
|
+
<td><%= html_escape(to) %></td>
|
11
11
|
</tr>
|
12
12
|
<tr>
|
13
13
|
<td><strong><%= config.cc_label %></strong></td>
|
14
|
-
<td><%= html_escape(
|
14
|
+
<td><%= html_escape(cc) %></td>
|
15
15
|
</tr>
|
16
16
|
<tr>
|
17
17
|
<td><strong><%= config.date_label %></strong></td>
|
18
|
-
<td><%= format_date(
|
18
|
+
<td><%= format_date(date) if date %></td>
|
19
19
|
</tr>
|
20
20
|
</table>
|
21
|
-
<h3><%=
|
21
|
+
<h3><%= subject %></h3>
|
22
22
|
<hr>
|
23
23
|
<ul class="email-attachments">
|
24
|
-
<%
|
24
|
+
<% attachments.each do |att| %>
|
25
25
|
<li class="attachement">
|
26
26
|
<span class="filename"><%= att.filename %></span>
|
27
27
|
<span class="file-size"><%= format_attachment_size(att) %></span>
|
data/lib/eml_to_pdf/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eml_to_pdf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yves Siegrist
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,20 +92,14 @@ dependencies:
|
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: '1.
|
96
|
-
- - ">="
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version: 1.6.7.2
|
95
|
+
version: '1.7'
|
99
96
|
type: :runtime
|
100
97
|
prerelease: false
|
101
98
|
version_requirements: !ruby/object:Gem::Requirement
|
102
99
|
requirements:
|
103
100
|
- - "~>"
|
104
101
|
- !ruby/object:Gem::Version
|
105
|
-
version: '1.
|
106
|
-
- - ">="
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version: 1.6.7.2
|
102
|
+
version: '1.7'
|
109
103
|
description: This gem uses wkhtmltopdf to convert an eml to a pdf. (eml -> html ->
|
110
104
|
pdf)
|
111
105
|
email:
|
@@ -115,6 +109,7 @@ executables:
|
|
115
109
|
extensions: []
|
116
110
|
extra_rdoc_files: []
|
117
111
|
files:
|
112
|
+
- ".codeclimate.yml"
|
118
113
|
- ".gitignore"
|
119
114
|
- ".ruby-version"
|
120
115
|
- ".travis.yml"
|
@@ -133,6 +128,7 @@ files:
|
|
133
128
|
- lib/eml_to_pdf/email.rb
|
134
129
|
- lib/eml_to_pdf/empty_part.rb
|
135
130
|
- lib/eml_to_pdf/extraction_step.rb
|
131
|
+
- lib/eml_to_pdf/extraction_step_list.rb
|
136
132
|
- lib/eml_to_pdf/metadata_context.rb
|
137
133
|
- lib/eml_to_pdf/templates/heading.html.erb
|
138
134
|
- lib/eml_to_pdf/templates/style.html
|
@@ -159,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
155
|
version: '0'
|
160
156
|
requirements: []
|
161
157
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.
|
158
|
+
rubygems_version: 2.6.11
|
163
159
|
signing_key:
|
164
160
|
specification_version: 4
|
165
161
|
summary: This gem allows you to convert an eml (email) into a pdf.
|