mournmail 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mournmail/message_mode.rb +8 -4
- data/lib/mournmail/message_rendering.rb +26 -14
- data/lib/mournmail/version.rb +1 -1
- data/mournmail.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55cea609c299af267b279b8434b661ec471776fe26c5175fdc363a527cc3cc7e
|
4
|
+
data.tar.gz: b77b32b8fb3923a8e545cd1cd5084dab346974a4f9aa210ae353f76e17839370
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a891f54dc0e39e09d72a5a8eb9e0272560226fe417eb809462f245bf77e535a9dcaacdf34600e45933723dd0b81378d64e73f1538dcb8c5f2e7c4ffea370078a
|
7
|
+
data.tar.gz: f0bee693b1b02a51449e38ca5d001a085f999040be22dcb5d29e1782dffd3dd31698312b9abde9f1fbc57528a72e031df05fa75ed4a6ee2c7535cd318063991e
|
@@ -13,7 +13,7 @@ module Mournmail
|
|
13
13
|
# See http://nihongo.jp/support/mail_guide/dev_guide.txt
|
14
14
|
MAILTO_REGEXP = URI.regexp("mailto")
|
15
15
|
URI_REGEXP = /(https?|ftp):\/\/[^ \t\n>)"]*[^] \t\n>.,:)"]+|#{MAILTO_REGEXP}/
|
16
|
-
MIME_REGEXP = /^\[(([
|
16
|
+
MIME_REGEXP = /^\[(([0-9.]+) [A-Za-z._\-]+\/[A-Za-z._\-]+.*|PGP\/MIME .*)\]$/
|
17
17
|
URI_OR_MIME_REGEXP = /#{URI_REGEXP}|#{MIME_REGEXP}/
|
18
18
|
|
19
19
|
define_syntax :field_name, /^[A-Za-z\-]+: /
|
@@ -64,7 +64,7 @@ module Mournmail
|
|
64
64
|
def current_part
|
65
65
|
@buffer.save_excursion do
|
66
66
|
@buffer.beginning_of_line
|
67
|
-
if @buffer.looking_at?(/\[([
|
67
|
+
if @buffer.looking_at?(/\[([0-9.]+) .*\]/)
|
68
68
|
index = match_string(1)
|
69
69
|
indices = index.split(".").map(&:to_i)
|
70
70
|
@buffer[:mournmail_mail].dig_part(*indices)
|
@@ -130,8 +130,12 @@ module Mournmail
|
|
130
130
|
else
|
131
131
|
file_name = "mournmail"
|
132
132
|
end
|
133
|
-
f = Tempfile.open(file_name)
|
134
|
-
|
133
|
+
f = Tempfile.open(file_name, binmode: true)
|
134
|
+
s = part.decoded
|
135
|
+
if part.charset
|
136
|
+
s = s.encode(part.charset)
|
137
|
+
end
|
138
|
+
f.write(s)
|
135
139
|
f.close
|
136
140
|
if ext == "txt"
|
137
141
|
find_file(f.path)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "mail"
|
2
|
+
require "html2text"
|
2
3
|
|
3
4
|
module Mournmail
|
4
5
|
module MessageRendering
|
@@ -27,16 +28,21 @@ module Mournmail
|
|
27
28
|
end
|
28
29
|
if multipart?
|
29
30
|
parts.each_with_index.map { |part, i|
|
30
|
-
|
31
|
+
no_content = sub_type == "alternative" && i > 0
|
32
|
+
part.render([*indices, i], no_content)
|
31
33
|
}.join
|
32
|
-
elsif main_type.nil? ||
|
33
|
-
s = body.decoded
|
34
|
-
|
34
|
+
elsif main_type.nil? || main_type == "text"
|
35
|
+
s = Mournmail.to_utf8(body.decoded, charset)
|
36
|
+
if sub_type == "html"
|
37
|
+
"[0 text/html]\n" + Html2Text.convert(s)
|
38
|
+
else
|
39
|
+
s
|
40
|
+
end
|
35
41
|
else
|
36
42
|
type = Mail::Encodings.decode_encode(self["content-type"].to_s,
|
37
43
|
:decode) rescue
|
38
44
|
"broken/type; error=\"#{$!} (#{$!.class})\""
|
39
|
-
"[
|
45
|
+
"[0 #{type}]\n"
|
40
46
|
end + pgp_signature
|
41
47
|
end
|
42
48
|
|
@@ -45,10 +51,10 @@ module Mournmail
|
|
45
51
|
mail = decrypt(verify: true)
|
46
52
|
return mail.dig_part(i, *rest_indices)
|
47
53
|
end
|
48
|
-
if i ==
|
54
|
+
if i == 0
|
49
55
|
return self
|
50
56
|
end
|
51
|
-
part = parts[i]
|
57
|
+
part = parts[i - 1]
|
52
58
|
if rest_indices.empty?
|
53
59
|
part
|
54
60
|
else
|
@@ -79,12 +85,13 @@ module Mournmail
|
|
79
85
|
end
|
80
86
|
|
81
87
|
refine ::Mail::Part do
|
82
|
-
def render(indices)
|
83
|
-
index = indices.join(".")
|
88
|
+
def render(indices, no_content = false)
|
89
|
+
index = indices.map { |i| i + 1 }.join(".")
|
84
90
|
type = Mail::Encodings.decode_encode(self["content-type"].to_s,
|
85
91
|
:decode) rescue
|
86
92
|
"broken/type; error=\"#{$!} (#{$!.class})\""
|
87
|
-
"[#{index} #{type}]\n" +
|
93
|
+
"[#{index} #{type}]\n" +
|
94
|
+
(no_content ? "" : render_content(indices))
|
88
95
|
end
|
89
96
|
|
90
97
|
def dig_part(i, *rest_indices)
|
@@ -92,7 +99,7 @@ module Mournmail
|
|
92
99
|
mail = Mail.new(body.to_s)
|
93
100
|
mail.dig_part(i, *rest_indices)
|
94
101
|
else
|
95
|
-
part = parts[i]
|
102
|
+
part = parts[i - 1]
|
96
103
|
if rest_indices.empty?
|
97
104
|
part
|
98
105
|
else
|
@@ -106,7 +113,8 @@ module Mournmail
|
|
106
113
|
def render_content(indices)
|
107
114
|
if multipart?
|
108
115
|
parts.each_with_index.map { |part, i|
|
109
|
-
|
116
|
+
no_content = sub_type == "alternative" && i > 0
|
117
|
+
part.render([*indices, i], no_content)
|
110
118
|
}.join
|
111
119
|
elsif main_type == "message" && sub_type == "rfc822"
|
112
120
|
mail = Mail.new(body.raw_source)
|
@@ -114,8 +122,12 @@ module Mournmail
|
|
114
122
|
elsif attachment?
|
115
123
|
""
|
116
124
|
else
|
117
|
-
if main_type == "text"
|
118
|
-
|
125
|
+
if main_type == "text"
|
126
|
+
if sub_type == "html"
|
127
|
+
Html2Text.convert(decoded).sub(/(?<!\n)\z/, "\n")
|
128
|
+
else
|
129
|
+
decoded.sub(/(?<!\n)\z/, "\n").gsub(/\r\n/, "\n")
|
130
|
+
end
|
119
131
|
else
|
120
132
|
""
|
121
133
|
end
|
data/lib/mournmail/version.rb
CHANGED
data/mournmail.gemspec
CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_runtime_dependency "rroonga"
|
28
28
|
spec.add_runtime_dependency "google-api-client"
|
29
29
|
spec.add_runtime_dependency "launchy"
|
30
|
+
spec.add_runtime_dependency "html2text"
|
30
31
|
|
31
32
|
spec.add_development_dependency "bundler"
|
32
33
|
spec.add_development_dependency "rake", "~> 12.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mournmail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shugo Maeda
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: textbringer
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: html2text
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: bundler
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -172,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
186
|
- !ruby/object:Gem::Version
|
173
187
|
version: '0'
|
174
188
|
requirements: []
|
175
|
-
rubygems_version: 3.
|
189
|
+
rubygems_version: 3.3.0.dev
|
176
190
|
signing_key:
|
177
191
|
specification_version: 4
|
178
192
|
summary: A message user agent for Textbringer.
|