mailparser 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: acab11e0f5b50260e17f32e1fea879d8505fff45
4
+ data.tar.gz: f0ce38c8bb40d11a3332515b4aabb7d835cb692f
5
+ !binary "U0hBNTEy":
6
+ metadata.gz: 4edf18f3211be9fb2d2114db16265fd728a4f5a69eb1d96ab9a7fc430e0cdcc740f1d3b00ae04290a6203b611cfcd0b22531ac8c5962d7a513798bbdda57c53d
7
+ data.tar.gz: ee05e15d52db8517094e5c9189787c7e3f557a5c17c9d2dd8a8d3868111e671e086121296b1d13493e9ee6d43fc0ab6576fcd35bd3dda4b39dbfb91451904a95
@@ -20,53 +20,32 @@ module MailParser::RFC2047
20
20
  charset = opt
21
21
  end
22
22
  charset_converter ||= MailParser::ConvCharset.method(:conv_charset)
23
- last_charset = nil
24
23
  words = []
25
24
  mime_word = false
26
- str.gsub(/\r?\n/, '').split(/(\s+)/).each do |s|
27
- s, cs, raw, pre, post = decode_word(s)
28
- if charset
25
+ ss = StringScanner.new(str.gsub(/\r?\n/, ''))
26
+ until ss.eos?
27
+ if s = ss.scan(/\=\?[^\(\)\<\>\@\,\;\:\"\/\[\]\?\.\=]+\?[QB]\?[^\? ]+\?\=/i)
29
28
  begin
30
- s = charset_converter.call(cs || charset, charset, s)
29
+ s = Encoded.new s, charset, charset_converter
30
+ words.pop if words.length >= 2 and words[-1].is_a? Space and words[-2].is_a? Encoded
31
31
  rescue
32
- s = raw
33
- cs = nil
32
+ # ignore
34
33
  end
34
+ words.push s
35
+ elsif s = ss.scan(/\s+/)
36
+ words.push Space.new(s)
37
+ elsif s = ss.scan(/[^\s=]+/)
38
+ words.push s
39
+ else
40
+ words.push ss.scan(/./)
35
41
  end
36
- if cs
37
- words.pop if mime_word and words.last =~ /\A\s*\z/
38
- mime_word = true
39
- elsif s !~ /\A\s*\z/
40
- mime_word = false
41
- end
42
- words.push pre if pre
43
- words.push s
44
- words.push post if post
45
42
  end
46
43
  begin
47
44
  ret = words.join
48
45
  rescue
49
- ret = words.map{|s| s.force_encoding('binary')}.join
50
- end
51
- ret
52
- end
53
-
54
- def decode_word(str)
55
- charset = nil
56
- if str =~ /\=\?([^\(\)\<\>\@\,\;\:\"\/\[\]\?\.\=]+)\?([QB])\?([^\? ]+)\?\=/i
57
- pre, post = $`, $'
58
- charset, encoding, enc_text = $1.downcase, $2.downcase, $3
59
- raw = str
60
- str = encoding == "q" ? q_decode(enc_text) : b_decode(enc_text)
61
- if String.method_defined? :force_encoding
62
- begin
63
- str.force_encoding(charset)
64
- rescue
65
- str.force_encoding('ascii-8bit')
66
- end
67
- end
46
+ ret = words.map{|s| s.to_s.force_encoding('binary')}.join
68
47
  end
69
- [str, charset, raw, pre, post]
48
+ charset ? charset_converter.call(charset, charset, ret) : ret
70
49
  end
71
50
 
72
51
  def q_decode(str)
@@ -77,4 +56,18 @@ module MailParser::RFC2047
77
56
  return str.gsub(/[^A-Z0-9\+\/=]/i,"").unpack("m")[0]
78
57
  end
79
58
 
59
+ class Space < String
60
+ end
61
+
62
+ class Encoded
63
+ def initialize(str, charset, converter)
64
+ _, cs, encoding, enc_text, = str.split(/\?/)
65
+ str = encoding.downcase == 'q' ? MailParser::RFC2047.q_decode(enc_text) : MailParser::RFC2047.b_decode(enc_text)
66
+ @decoded = converter.call(cs, charset||cs, str)
67
+ end
68
+
69
+ def to_s
70
+ @decoded
71
+ end
72
+ end
80
73
  end
data/test/test_rfc2047.rb CHANGED
@@ -23,7 +23,7 @@ class TC_RFC2047 < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  def test_q_decode_end_equal()
26
- assert_equal("abc", MailParser::RFC2047.q_decode("abc="))
26
+ assert_match(/\Aabc=?\z/, MailParser::RFC2047.q_decode("abc="))
27
27
  end
28
28
 
29
29
  def test_b_decode_ascii()
@@ -38,20 +38,6 @@ class TC_RFC2047 < Test::Unit::TestCase
38
38
  assert_equal("とみた", MailParser::RFC2047.b_decode("44Go 44 G/4 4Gf"))
39
39
  end
40
40
 
41
- def test_decode_word()
42
- s, cs, raw = MailParser::RFC2047.decode_word("=?us-ascii?q?hoge?=")
43
- assert_equal 'hoge', s
44
- assert_equal 'us-ascii', cs
45
- assert_equal '=?us-ascii?q?hoge?=', raw
46
- end
47
-
48
- def test_decode_word_upcase()
49
- s, cs, raw = MailParser::RFC2047.decode_word("=?US-ASCII?Q?hoge?=")
50
- assert_equal 'hoge', s
51
- assert_equal 'us-ascii', cs
52
- assert_equal '=?US-ASCII?Q?hoge?=', raw
53
- end
54
-
55
41
  def test_decode_q_ascii()
56
42
  s = MailParser::RFC2047.decode("=?us-ascii?q?hoge?=")
57
43
  assert_equal("hoge", s)
@@ -154,4 +140,9 @@ class TC_RFC2047 < Test::Unit::TestCase
154
140
  assert_equal "abc defghijkl mno", s
155
141
  end
156
142
 
143
+ def test_decode_invalid_from_docomo
144
+ s = MailParser::RFC2047.decode("=?us-ascii?q?a?=(=?us-ascii?q?b?=)")
145
+ assert_equal "a(b)", s
146
+ end
147
+
157
148
  end
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
5
- prerelease:
4
+ version: 0.5.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - TOMITA Masahiro
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-05 00:00:00.000000000 Z
11
+ date: 2013-01-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: mmapscanner
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  description: MailParser is a parser for mail message
@@ -60,27 +57,26 @@ files:
60
57
  homepage: http://github.com/tmtm/mailparser
61
58
  licenses:
62
59
  - Ruby's
60
+ metadata: {}
63
61
  post_install_message:
64
62
  rdoc_options: []
65
63
  require_paths:
66
64
  - lib
67
65
  required_ruby_version: !ruby/object:Gem::Requirement
68
- none: false
69
66
  requirements:
70
- - - ! '>='
67
+ - - ">="
71
68
  - !ruby/object:Gem::Version
72
69
  version: '0'
73
70
  required_rubygems_version: !ruby/object:Gem::Requirement
74
- none: false
75
71
  requirements:
76
- - - ! '>='
72
+ - - ">="
77
73
  - !ruby/object:Gem::Version
78
74
  version: '0'
79
75
  requirements: []
80
76
  rubyforge_project:
81
- rubygems_version: 1.8.23
77
+ rubygems_version: 2.0.0.preview3.1
82
78
  signing_key:
83
- specification_version: 3
79
+ specification_version: 4
84
80
  summary: Mail Parser
85
81
  test_files:
86
82
  - test.rb
@@ -91,4 +87,3 @@ test_files:
91
87
  - test/test_rfc2822.rb
92
88
  - test/test_mailparser.rb
93
89
  - test/test_rfc2045.rb
94
- has_rdoc: