actionmailer-text 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3ddc55262abf2f426d3eec82eeb5744a8ee9e88e
4
- data.tar.gz: 79bfe536b8778822c2b7f7283e352e86c4d46432
3
+ metadata.gz: fb51e8701b903d56ac693f378e34d38039b1cb09
4
+ data.tar.gz: 3a9f8751dc64409876f495f453f2af443d8cb096
5
5
  SHA512:
6
- metadata.gz: 9209f5852e814dda8519470ffce74ea094786703dc279e81d510dbc25ea63a1a795085dcb264ed5b2f7253f0159f6b3fcbfef41d3ef56125271c5b6cc10ed6e2
7
- data.tar.gz: 8eb68179d47ae461e0adde2f047a5c044f86f09f3b2f1899c39373f153d338c0dc0ae827cdc9ac2a0dcd83713550c1451cd6d6c263bcaf0d049d439cb20af6af
6
+ metadata.gz: 6e31e763f210563c237399ea3dc4a4ef7d928c977111dbd27ff2dc1fa4cc48987f3ab1c1085320d6b550a940fe293f28e206ccd144917d1801cad345fa6304ad
7
+ data.tar.gz: 316873f7a5805e270ffc9bea597af3e60d54f62d04842947df66066b831dee11b5266ab113ea5899a925489ef5491aae44a0aee7ec98d3053b936d42b7f1212d
@@ -1,3 +1,8 @@
1
+ ### 0.1.1 (Next)
2
+
3
+ * Your contribution here.
4
+ * [#1](https://github.com/dblock/actionmailer-text/pull/1) Ignore elements outside the body - [@woahdae](https://github.com/woahdae).
5
+
1
6
  ### 0.1.0 (2015-04-07)
2
7
 
3
8
  * Initial public release - [@dblock](https://github.com/dblock).
@@ -84,7 +84,7 @@ git push origin my-feature-branch
84
84
 
85
85
  ## Make a Pull Request
86
86
 
87
- Go to https://github.com/contributor/grape and select your feature branch.
87
+ Go to https://github.com/contributor/actionmailer-text and select your feature branch.
88
88
  Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days.
89
89
 
90
90
  ## Rebase
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- actionmailer-text (0.1.0)
4
+ actionmailer-text (0.1.1)
5
5
  actionmailer
6
6
  htmlentities
7
7
 
@@ -44,24 +44,24 @@ GEM
44
44
  email-example-spec (0.1.0)
45
45
  actionmailer
46
46
  erubis (2.7.0)
47
- globalid (0.3.3)
47
+ globalid (0.3.5)
48
48
  activesupport (>= 4.1.0)
49
- htmlentities (4.3.1)
49
+ htmlentities (4.3.3)
50
50
  i18n (0.7.0)
51
51
  json (1.8.2)
52
- loofah (2.0.1)
52
+ loofah (2.0.2)
53
53
  nokogiri (>= 1.5.9)
54
54
  mail (2.6.3)
55
55
  mime-types (>= 1.16, < 3)
56
- mime-types (2.4.3)
56
+ mime-types (2.5)
57
57
  mini_portile (0.6.2)
58
- minitest (5.5.1)
58
+ minitest (5.6.1)
59
59
  nokogiri (1.6.6.2)
60
60
  mini_portile (~> 0.6.0)
61
- parser (2.2.0.3)
61
+ parser (2.2.2.2)
62
62
  ast (>= 1.1, < 3.0)
63
- powerpack (0.1.0)
64
- rack (1.6.0)
63
+ powerpack (0.1.1)
64
+ rack (1.6.1)
65
65
  rack-test (0.6.3)
66
66
  rack (>= 1.0)
67
67
  rails-deprecated_sanitizer (1.0.3)
@@ -78,9 +78,9 @@ GEM
78
78
  rspec-core (~> 3.2.0)
79
79
  rspec-expectations (~> 3.2.0)
80
80
  rspec-mocks (~> 3.2.0)
81
- rspec-core (3.2.2)
81
+ rspec-core (3.2.3)
82
82
  rspec-support (~> 3.2.0)
83
- rspec-expectations (3.2.0)
83
+ rspec-expectations (3.2.1)
84
84
  diff-lcs (>= 1.2.0, < 2.0)
85
85
  rspec-support (~> 3.2.0)
86
86
  rspec-mocks (3.2.1)
@@ -24,6 +24,9 @@ module ActionMailer
24
24
  he = HTMLEntities.new
25
25
  txt = he.decode(txt)
26
26
 
27
+ # Ignore things that come outside the body
28
+ txt.gsub!(/.*?(<body.+?\/body>).*?/im, '\1')
29
+
27
30
  # replace image by their alt attribute
28
31
  txt.gsub!(/<img.+?alt=\"([^\"]*)\"[^>]*\/>/i, '\1')
29
32
  txt.gsub!(/<img.+?alt='([^\']*)\'[^>]*\/>/i, '\1')
@@ -1,5 +1,5 @@
1
1
  module ActionMailer
2
2
  module Text
3
- VERSION = '0.1.0'
3
+ VERSION = '0.1.1'
4
4
  end
5
5
  end
@@ -0,0 +1,183 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe ActionMailer::Text::HtmlToPlainText do
5
+ it 'converts a fragment' do
6
+ expect(subject.convert_to_text('<p>Test</p>')).to match(/Test/)
7
+ end
8
+
9
+ it 'converts a body' do
10
+ expect(subject.convert_to_text('
11
+ <html>
12
+ <title>Ignore me</title>
13
+ <body>
14
+ <p>Test</p>
15
+ </body>
16
+ </html>
17
+ ')).to match(/Test/)
18
+ end
19
+
20
+ it 'ignores titles' do
21
+ expect(subject.convert_to_text('
22
+ <html>
23
+ <title>Ignore me</title>
24
+ <body>
25
+ <p>Test</p>
26
+ </body>
27
+ </html>
28
+ ')).not_to match(/Ignore me/)
29
+ end
30
+
31
+ it 'ignores header links' do
32
+ expect(subject.convert_to_text('
33
+ <html>
34
+ <head>
35
+ <link href="http://example.com/should/be/ignored.css" rel="stylesheet" />
36
+ </head>
37
+ <body>
38
+ <p>Test</p>
39
+ </body>
40
+ </html>
41
+ ')).not_to match(/\*/)
42
+ end
43
+
44
+ it 'ignores header titles' do
45
+ expect(subject.convert_to_text('
46
+ <html>
47
+ <head>
48
+ <title>Ignore me</title>
49
+ </head>
50
+ <body>
51
+ <p>Test</p>
52
+ </body>
53
+ </html>
54
+ ')).not_to match(/Ignore me/)
55
+ end
56
+
57
+ it 'converts a malformed body' do
58
+ expect(subject.convert_to_text('
59
+ <html>
60
+ <title>Ignore me</title>
61
+ <body>
62
+ <p>Test
63
+ ')).to match(/Test/)
64
+ end
65
+
66
+ it 'dencodes html entities' do
67
+ expect(subject.convert_to_text('
68
+ c&eacute;dille gar&#231;on &amp; &agrave; &ntilde;
69
+ ')).to eq('cédille garçon & à ñ')
70
+ end
71
+
72
+ it 'strips whitespace' do
73
+ expect(subject.convert_to_text(" \ttext\ntext\n")).to eq("text\ntext")
74
+ expect(subject.convert_to_text(" \na \n a \t")).to eq("a\na")
75
+ expect(subject.convert_to_text(" \na \n\t \n \n a \t")).to eq("a\n\na")
76
+ expect(subject.convert_to_text('test text&nbsp;')).to eq('test text')
77
+ expect(subject.convert_to_text('test text')).to eq('test text')
78
+ end
79
+
80
+ it 'leaves spaces for spans' do
81
+ expect(subject.convert_to_text('
82
+ <html>
83
+ <body>
84
+ <p><span>Test</span>
85
+ <span>line 2</span>
86
+ </p>
87
+ ')).to match(/Test line 2/)
88
+ end
89
+
90
+ it 'normalizes line breaks' do
91
+ expect(subject.convert_to_text("Test text\r\nTest text")).to eq("Test text\nTest text")
92
+ expect(subject.convert_to_text("Test text\nTest text")).to eq("Test text\nTest text")
93
+ end
94
+
95
+ it 'formats lists' do
96
+ expect(subject.convert_to_text("<li class='123'>item 1</li> <li>item 2</li>\n")).to eq("* item 1\n* item 2")
97
+ expect(subject.convert_to_text("<li>item 1</li> \t\n <li>item 2</li> <li> item 3</li>\n")).to eq("* item 1\n* item 2\n* item 3")
98
+ end
99
+
100
+ it 'strips html' do
101
+ expect(subject.convert_to_text("<p class=\"123'45 , att\" att=tester>test <span class='te\"st'>text</span>\n")).to eq('test text')
102
+ end
103
+
104
+ it 'creates line breaks for p and br tags' do
105
+ expect(subject.convert_to_text('<p>Test text</p><p>Test text</p>')).to eq("Test text\n\nTest text")
106
+ expect(subject.convert_to_text("\n<p>Test text</p>\n\n\n\t<p>Test text</p>\n")).to eq("Test text\n\nTest text")
107
+ expect(subject.convert_to_text("\n<p>Test text<br/>Test text</p>\n")).to eq("Test text\nTest text")
108
+ expect(subject.convert_to_text("\n<p>Test text<br> \tTest text<br></p>\n")).to eq("Test text\nTest text")
109
+ expect(subject.convert_to_text('Test text<br><BR />Test text')).to eq("Test text\n\nTest text")
110
+ end
111
+
112
+ it 'converts headings' do
113
+ expect(subject.convert_to_text('<h1>Test</h1>')).to eq("****\nTest\n****")
114
+ expect(subject.convert_to_text("\t<h1>\nTest</h1> ")).to eq("****\nTest\n****")
115
+ expect(subject.convert_to_text("\t<h1>\nTest line 1<br>Test 2</h1> ")).to eq("***********\nTest line 1\nTest 2\n***********")
116
+ expect(subject.convert_to_text('<h1>Test</h1> <h1>Test</h1>')).to eq("****\nTest\n****\n\n****\nTest\n****")
117
+ expect(subject.convert_to_text('<h2>Test</h2>')).to eq("----\nTest\n----")
118
+ expect(subject.convert_to_text("<h3> <span class='a'>Test </span></h3>")).to eq("Test\n----")
119
+ end
120
+
121
+ it 'wraps lines' do
122
+ raw = ''
123
+ 100.times { raw += 'test ' }
124
+
125
+ txt = subject.convert_to_text(raw, 20)
126
+
127
+ lens = []
128
+ txt.each_line { |l| lens << l.length }
129
+ expect(lens.max).to be <= 20
130
+ end
131
+
132
+ it 'converts links' do
133
+ # basic
134
+ expect(subject.convert_to_text('<a href="http://example.com/">Link</a>')).to eq('Link ( http://example.com/ )')
135
+
136
+ # nested html
137
+ expect(subject
138
+ .convert_to_text('<a href="http://example.com/"><span class="a">Link</span></a>'))
139
+ .to eq('Link ( http://example.com/ )')
140
+
141
+ # complex link
142
+ expect(subject
143
+ .convert_to_text('<a href="http://example.com:80/~user?aaa=bb&amp;c=d,e,f#foo">Link</a>'))
144
+ .to eq('Link ( http://example.com:80/~user?aaa=bb&c=d,e,f#foo )')
145
+
146
+ # attributes
147
+ expect(subject
148
+ .convert_to_text('<a title=\'title\' href="http://example.com/">Link</a>'))
149
+ .to eq('Link ( http://example.com/ )')
150
+
151
+ # spacing
152
+ expect(subject
153
+ .convert_to_text('<a href=" http://example.com/ "> Link </a>'))
154
+ .to eq('Link ( http://example.com/ )')
155
+
156
+ # multiple
157
+ expect(subject
158
+ .convert_to_text('<a href="http://example.com/a/">Link A</a> <a href="http://example.com/b/">Link B</a>'))
159
+ .to eq('Link A ( http://example.com/a/ ) Link B ( http://example.com/b/ )')
160
+
161
+ # merge links
162
+ expect(subject.convert_to_text('<a href="%%LINK%%">Link</a>')).to eq('Link ( %%LINK%% )')
163
+ expect(subject.convert_to_text('<a href="[LINK]">Link</a>')).to eq('Link ( [LINK] )')
164
+ expect(subject.convert_to_text('<a href="{LINK}">Link</a>')).to eq('Link ( {LINK} )')
165
+
166
+ # unsubscribe
167
+ expect(subject.convert_to_text('<a href="[[!unsubscribe]]">Link</a>')).to eq('Link ( [[!unsubscribe]] )')
168
+ end
169
+
170
+ # see https://github.com/alexdunae/premailer/issues/72
171
+ it 'converts multiple links per line' do
172
+ expect(subject
173
+ .convert_to_text('<p>This is <a href="http://www.google.com" >link1</a> and <a href="http://www.google.com" >link2 </a> is next.</p>', nil, 10_000))
174
+ .to eq('This is link1 ( http://www.google.com ) and link2 ( http://www.google.com ) is next.')
175
+ end
176
+
177
+ # see https://github.com/alexdunae/premailer/issues/72
178
+ it 'converts links within headings' do
179
+ expect(subject
180
+ .convert_to_text("<h1><a href='http://example.com/'>Test</a></h1>"))
181
+ .to eq("****************************\nTest ( http://example.com/ )\n****************************")
182
+ end
183
+ end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: actionmailer-text
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Doubrovkine
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-07 00:00:00.000000000 Z
11
+ date: 2015-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionmailer
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: htmlentities
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description:
@@ -57,7 +57,8 @@ files:
57
57
  - lib/actionmailer-text/text.rb
58
58
  - lib/actionmailer-text/version.rb
59
59
  - lib/actionmailer_text.rb
60
- - pkg/actionmailer-text-0.1.0.gem
60
+ - pkg/actionmailer-text-0.1.1.gem
61
+ - spec/actionmailer-text/html_to_plain_text_spec.rb
61
62
  - spec/actionmailer-text/multipart_spec.rb
62
63
  - spec/actionmailer-text/version_spec.rb
63
64
  - spec/spec_helper.rb
@@ -73,17 +74,17 @@ require_paths:
73
74
  - lib
74
75
  required_ruby_version: !ruby/object:Gem::Requirement
75
76
  requirements:
76
- - - '>='
77
+ - - ">="
77
78
  - !ruby/object:Gem::Version
78
79
  version: '0'
79
80
  required_rubygems_version: !ruby/object:Gem::Requirement
80
81
  requirements:
81
- - - '>='
82
+ - - ">="
82
83
  - !ruby/object:Gem::Version
83
84
  version: 1.3.6
84
85
  requirements: []
85
86
  rubyforge_project:
86
- rubygems_version: 2.4.5
87
+ rubygems_version: 2.2.2
87
88
  signing_key:
88
89
  specification_version: 4
89
90
  summary: Automatically insert a text/plain part into your HTML multipart e-mails.