eml_to_pdf 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3911a7809cb69bc0204d23de4f040070628b93f8
4
- data.tar.gz: 1f699d54673e9c659a2678f01a45312baa6ba000
3
+ metadata.gz: e81efeb010801805fe22e63ff844e4a3f400955c
4
+ data.tar.gz: 1a02a94a289f960e79827c5f63d927d6d37a2888
5
5
  SHA512:
6
- metadata.gz: 6b314e084e442475832f8249f76c6cbf9966787d259c93c5f66d05f6f9735f3f24dbddeac0ddc7dad8b56ee6181b944589e37b55817672d7266f3025b0f42837
7
- data.tar.gz: 5cdd6459df4fd50190d9d863a6d9d6a720a52f212ef0e319c2ffa62f0ceea7b092d2dda87fab54eebbd7a5a5e9706db788ed971abc1f6b56badabf117565d95f
6
+ metadata.gz: b613139c02acf27408c43fad2114e34db2321ea9fa2b3709923f4dbc610d15f62751bce105a06e046b7d7246487b6e46d59a785fbe0afc84efe47decb1b70e8c
7
+ data.tar.gz: 43e6e8b27008a6482229fa8077af78bcc245b0987d905c3fb7636b3de4f387308a9a459aa6413f05bd3df2df000580fa26583622a195808dc7f74a558bdc76cc
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.2
data/README.md CHANGED
@@ -24,6 +24,20 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
+ #### Basic Setup
28
+
29
+ Use the `configure` method to configure your labels
30
+
31
+ ```ruby
32
+ EmlToPdf.configure do |config|
33
+ config.from_label = "From =>"
34
+ config.to_label = "To =>"
35
+ config.cc_label = "Cc =>"
36
+ config.date_label = "Date =>"
37
+ config.date_format = "%d.%m.%Y" # see Date#strftime
38
+ end
39
+ ```
40
+
27
41
  Use the `convert` method to covert an eml to a pdf
28
42
 
29
43
  ```ruby
data/lib/eml_to_pdf.rb CHANGED
@@ -1,9 +1,5 @@
1
- require "cgi"
2
- require "mail"
3
- require "erb"
4
- require "nokogiri"
5
- require "filesize"
6
1
  require "eml_to_pdf/version"
2
+ require "eml_to_pdf/configuration"
7
3
  require "eml_to_pdf/converter"
8
4
  require "eml_to_pdf/converter"
9
5
  require "eml_to_pdf/email"
@@ -14,4 +10,16 @@ module EmlToPdf
14
10
  def self.convert(input, output)
15
11
  Converter.new(input, output).convert
16
12
  end
13
+
14
+ def self.configure
15
+ yield configuration if block_given?
16
+ end
17
+
18
+ def self.configuration
19
+ @configuration ||= Configuration.new
20
+ end
21
+
22
+ def self.reset_configuration!
23
+ @configuration = Configuration.new
24
+ end
17
25
  end
@@ -0,0 +1,22 @@
1
+ module EmlToPdf
2
+ class Configuration
3
+ attr_accessor :from_label, :to_label, :cc_label, :date_label
4
+ attr_reader :date_format
5
+
6
+ def initialize
7
+ @from_label = "From"
8
+ @to_label = "To"
9
+ @cc_label = "Cc"
10
+ @date_label = "Date"
11
+ @date_format = "%Y-%m-%d %H:%M:%S %z"
12
+ end
13
+
14
+ def date_format=(value)
15
+ if value.is_a?(String)
16
+ @date_format = value
17
+ else
18
+ raise ArgumentError, "You can only use a String to format the date. (See Date#strftime)"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,11 +1,14 @@
1
- require 'pathname'
1
+ require "pathname"
2
+ require "nokogiri"
3
+ require "mail"
4
+ require "erb"
2
5
 
3
6
  module EmlToPdf
4
7
  class Email
5
8
  MIME_TYPES = {
6
9
  plain_text: "text/plain",
7
10
  html: "text/html",
8
- multipart_mixed: "multipart/mixed"
11
+ multipart_alternative: "multipart/alternative"
9
12
  }
10
13
 
11
14
  TEMPLATES_PATH = Pathname.new(File.expand_path(__dir__)) + "templates"
@@ -22,29 +25,20 @@ module EmlToPdf
22
25
  html
23
26
  end
24
27
 
28
+ private
25
29
  def text_parts(mail_or_part)
26
- if mail_or_part.multipart?
27
- parts = mail_or_part.parts
28
- if mail_or_part.mime_type == MIME_TYPES[:multipart_alternative]
29
- text_parts(extract_best_representation_from_parts(parts))
30
- else
31
- parts.map do |part|
32
- text_parts(part)
33
- end
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)
34
36
  end
35
37
  else
36
- best_part = if mail_or_part.mime_type == MIME_TYPES[:plain_text] && !mail_or_part.attachment?
37
- wrap_text_in_pre_tag(mail_or_part.decoded)
38
- elsif mail_or_part.mime_type == MIME_TYPES[:html] && !mail_or_part.attachment?
39
- mail_or_part.decoded
40
- else
41
- ""
42
- end
43
- [best_part]
38
+ [text_body(mail_or_part)]
44
39
  end.flatten
45
40
  end
46
41
 
47
- private
48
42
  def visible_attachments(mail)
49
43
  mail.attachments.select do |attachment|
50
44
  !attachment.inline?
@@ -52,10 +46,10 @@ module EmlToPdf
52
46
  end
53
47
 
54
48
  def resolve_cids_from_attachments(html, attachments)
55
- cid_list(attachments).inject(html) do |html, key_and_value|
49
+ cid_list(attachments).inject(html) do |html_text, key_and_value|
56
50
  k, v = key_and_value
57
- html.gsub!(k, v)
58
- html
51
+ html_text.gsub!(k, v)
52
+ html_text
59
53
  end
60
54
  end
61
55
 
@@ -70,19 +64,7 @@ module EmlToPdf
70
64
  end
71
65
  end
72
66
 
73
- def html_body(mail_or_part)
74
- if multipart_alternative?(mail_or_part)
75
- [extract_best_representation_from_parts(mail_or_part.parts)]
76
- elsif multipart_mixed?(mail_or_part)
77
- mail_or_part.parts.map do |part|
78
- html_body(part)
79
- end
80
- else
81
- [extract_best_representation_from_parts(Array(mail_or_part))]
82
- end.flatten
83
- end
84
-
85
- def extract_best_representation_from_parts(parts)
67
+ def extract_best_part(parts)
86
68
  if multipart_part = parts.detect(&:multipart?)
87
69
  multipart_part
88
70
  elsif html_part = find_body_with_type(parts, :html)
@@ -100,17 +82,18 @@ module EmlToPdf
100
82
  end
101
83
  end
102
84
 
103
- def multipart_mixed?(part)
104
- part.mime_type == MIME_TYPES[:multipart_mixed]
105
- end
106
-
107
85
  def multipart_alternative?(part)
108
- part.mime_type == MIME_TYPES[:multipart_alternative] || part.mime_type == MIME_TYPES[:multipart_related]
86
+ part.mime_type == MIME_TYPES[:multipart_alternative]
109
87
  end
110
88
 
111
-
112
- def wrap_text_in_html(text)
113
- "<!DOCTYPE html><html><head></head><body><pre>#{text}</pre></body></html>"
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
114
97
  end
115
98
 
116
99
  def wrap_text_in_pre_tag(text)
@@ -0,0 +1,19 @@
1
+ module EmlToPdf
2
+ class EmptyPart
3
+ def multipart?
4
+ false
5
+ end
6
+
7
+ def attachment?
8
+ false
9
+ end
10
+
11
+ def mime_type
12
+ "text/plain"
13
+ end
14
+
15
+ def decoded
16
+ "[Cannot create a preview of the mail]"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,58 @@
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
+ class ExtractionStep
6
+ def initialize(mail_or_part)
7
+ @mail_or_part = mail_or_part
8
+ end
9
+
10
+ # extraction = ExtractionStep.new(@mail)
11
+ # extraction = extraction.next until extraction.finished?
12
+
13
+ def next
14
+ if multipart_alternative?(@mail_or_part)
15
+ best_part = extract_best_part(@mail_or_part.parts)
16
+ ExtractionStep.new(best_part)
17
+ elsif @mail_or_part.multipart?
18
+
19
+ else
20
+
21
+ end
22
+ end
23
+
24
+ def finished?
25
+ @mail_or_part.parts.none?(&:multipart?)
26
+ end
27
+
28
+ def to_html
29
+ if html_part = @mail_or_part.html_part
30
+ html_part
31
+ elsif text_part = @mail_or_part.text_part
32
+ wrap_text_in_pre_tag(text_part)
33
+ else
34
+ ""
35
+ end
36
+ end
37
+
38
+ def extract_best_part(parts)
39
+ if multipart_part = parts.detect(&:multipart?)
40
+ multipart_part
41
+ elsif html_part = find_body_with_type(parts, :html)
42
+ html_part
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
+ end
49
+
50
+ def multipart_alternative?(part)
51
+ part.mime_type == MIME_TYPES[:multipart_alternative]
52
+ end
53
+
54
+ def wrap_text_in_pre_tag(text)
55
+ "<pre>#{text}</pre>"
56
+ end
57
+ end
58
+ end
@@ -1,3 +1,6 @@
1
+ require "filesize"
2
+ require "cgi"
3
+
1
4
  module EmlToPdf
2
5
  class MetadataContext
3
6
  def initialize(metadata)
@@ -6,12 +9,16 @@ module EmlToPdf
6
9
  end
7
10
  end
8
11
 
12
+ def config
13
+ EmlToPdf.configuration
14
+ end
15
+
9
16
  def format_attachment_size(attachment)
10
17
  Filesize.from("#{attachment.body.decoded.size} B").pretty
11
18
  end
12
19
 
13
20
  def format_date(date)
14
- date.strftime("%d.%m.%Y um %H:%M")
21
+ date.strftime(config.date_format)
15
22
  end
16
23
 
17
24
  def html_escape(str)
@@ -2,19 +2,19 @@
2
2
  <div class="email-metadata">
3
3
  <table>
4
4
  <tr>
5
- <td><strong>Von:</strong></td>
5
+ <td><strong><%= config.from_label %></strong></td>
6
6
  <td><%= html_escape(@from) %></td>
7
7
  </tr>
8
8
  <tr>
9
- <td><strong>An:</strong></td>
9
+ <td><strong><%= config.to_label %></strong></td>
10
10
  <td><%= html_escape(@to) %></td>
11
11
  </tr>
12
12
  <tr>
13
- <td><strong>Cc:</strong></td>
13
+ <td><strong><%= config.cc_label %></strong></td>
14
14
  <td><%= html_escape(@cc) %></td>
15
15
  </tr>
16
16
  <tr>
17
- <td><strong>Datum:</strong></td>
17
+ <td><strong><%= config.date_label %></strong></td>
18
18
  <td><%= format_date(@date) if @date %></td>
19
19
  </tr>
20
20
  </table>
@@ -1,3 +1,3 @@
1
1
  module EmlToPdf
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  module EmlToPdf
2
2
  class Wkhtmltopdf
3
3
  def self.convert(input, output_path)
4
- IO.popen("wkhtmltopdf --encoding utf-8 --footer-center [page] - #{output_path} 2>&1", "r+") do |pipe|
4
+ IO.popen("wkhtmltopdf --encoding utf-8 --footer-center [page] --footer-spacing 2.5 - #{output_path} 2>&1", "r+") do |pipe|
5
5
  pipe.puts(input)
6
6
  pipe.close_write
7
7
  pipe.readlines # TODO save output
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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yves Siegrist
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-07 00:00:00.000000000 Z
11
+ date: 2016-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -116,6 +116,7 @@ extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
118
  - ".gitignore"
119
+ - ".ruby-version"
119
120
  - ".travis.yml"
120
121
  - CODE_OF_CONDUCT.md
121
122
  - Gemfile
@@ -127,8 +128,11 @@ files:
127
128
  - eml_to_pdf.gemspec
128
129
  - exe/eml_to_pdf
129
130
  - lib/eml_to_pdf.rb
131
+ - lib/eml_to_pdf/configuration.rb
130
132
  - lib/eml_to_pdf/converter.rb
131
133
  - lib/eml_to_pdf/email.rb
134
+ - lib/eml_to_pdf/empty_part.rb
135
+ - lib/eml_to_pdf/extraction_step.rb
132
136
  - lib/eml_to_pdf/metadata_context.rb
133
137
  - lib/eml_to_pdf/templates/heading.html.erb
134
138
  - lib/eml_to_pdf/templates/style.html