mailparser 0.4.22a → 0.5.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +2 -6
- data/lib/mailparser/conv_charset.rb +40 -19
- data/lib/mailparser/error.rb +1 -0
- data/lib/mailparser/loose.rb +22 -20
- data/lib/mailparser/rfc2045/parser.rb +140 -140
- data/lib/mailparser/rfc2045/scanner.rb +15 -14
- data/lib/mailparser/rfc2045.rb +1 -0
- data/lib/mailparser/rfc2047.rb +26 -37
- data/lib/mailparser/rfc2183/parser.rb +2 -1
- data/lib/mailparser/rfc2183/scanner.rb +1 -0
- data/lib/mailparser/rfc2183.rb +1 -0
- data/lib/mailparser/rfc2231.rb +6 -5
- data/lib/mailparser/rfc2822/parser.rb +584 -544
- data/lib/mailparser/rfc2822/scanner.rb +21 -21
- data/lib/mailparser/rfc2822.rb +1 -0
- data/lib/mailparser.rb +83 -209
- data/test/test_loose.rb +17 -8
- data/test/test_mailparser.rb +88 -183
- data/test/test_rfc2045.rb +1 -1
- data/test/test_rfc2047.rb +35 -13
- data/test/test_rfc2183.rb +1 -1
- data/test/test_rfc2822.rb +6 -2
- metadata +22 -9
- data/HISTORY +0 -141
- data/lib/mailparser/obsolete.rb +0 -403
- data/test/test_obsolete.rb +0 -615
data/lib/mailparser/rfc2047.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
+
# coding: ascii-8bit
|
1
2
|
# Copyright (C) 2006-2010 TOMITA Masahiro
|
2
3
|
# mailto:tommy@tmtm.org
|
3
4
|
|
4
5
|
require "strscan"
|
5
|
-
require "iconv"
|
6
|
-
require "nkf"
|
7
6
|
require "mailparser/conv_charset"
|
8
7
|
|
9
8
|
module MailParser
|
@@ -11,26 +10,6 @@ end
|
|
11
10
|
|
12
11
|
module MailParser::RFC2047
|
13
12
|
|
14
|
-
class String < ::String
|
15
|
-
@@charset_converter = Proc.new{|f,t,s| MailParser::ConvCharset.conv_charset(f,t,s)}
|
16
|
-
def initialize(str, charset=nil, raw=nil, charset_converter=nil)
|
17
|
-
super(str)
|
18
|
-
@charset = charset
|
19
|
-
@raw = raw || str
|
20
|
-
@charset_converter = charset_converter || @@charset_converter
|
21
|
-
end
|
22
|
-
attr_reader :charset
|
23
|
-
attr_reader :raw
|
24
|
-
|
25
|
-
def conv_charset(to_charset)
|
26
|
-
if @charset and to_charset
|
27
|
-
@charset_converter.call @charset, to_charset, self
|
28
|
-
else
|
29
|
-
self
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
13
|
module_function
|
35
14
|
|
36
15
|
def decode(str, opt=nil)
|
@@ -40,35 +19,45 @@ module MailParser::RFC2047
|
|
40
19
|
else
|
41
20
|
charset = opt
|
42
21
|
end
|
22
|
+
charset_converter ||= MailParser::ConvCharset.method(:conv_charset)
|
43
23
|
last_charset = nil
|
44
24
|
ret = ""
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
25
|
+
ret.force_encoding(charset) if String.method_defined? :force_encoding and charset
|
26
|
+
split_decode(str) do |s, cs, raw|
|
27
|
+
if charset
|
28
|
+
begin
|
29
|
+
s = charset_converter.call(cs || charset, charset, s)
|
30
|
+
rescue
|
31
|
+
s = raw
|
32
|
+
cs = nil
|
33
|
+
end
|
52
34
|
end
|
53
35
|
ret << " " if last_charset.nil? or cs.nil?
|
54
|
-
ret <<
|
36
|
+
ret << s
|
55
37
|
last_charset = cs
|
56
38
|
end
|
57
39
|
return ret.strip
|
58
40
|
end
|
59
41
|
|
60
|
-
def split_decode(str
|
61
|
-
|
62
|
-
while str =~ /\=\?([^\(\)\<\>\@\,\;\:\"\/\[\]\?\.\=]+)\?([QB])\?([^\? ]+)\?\=/ni do
|
42
|
+
def split_decode(str)
|
43
|
+
while str =~ /\=\?([^\(\)\<\>\@\,\;\:\"\/\[\]\?\.\=]+)\?([QB])\?([^\? ]+)\?\=/i do
|
63
44
|
raw = $&
|
64
45
|
pre, charset, encoding, enc_text, after = $`, $1.downcase, $2.downcase, $3, $'
|
65
|
-
|
46
|
+
s = pre.strip
|
47
|
+
yield s, nil, raw unless s.empty?
|
66
48
|
s = encoding == "q" ? q_decode(enc_text) : b_decode(enc_text)
|
67
|
-
|
49
|
+
if String.method_defined? :force_encoding
|
50
|
+
begin
|
51
|
+
s.force_encoding(charset)
|
52
|
+
rescue
|
53
|
+
s.force_encoding('ascii-8bit')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
yield s, charset, raw
|
68
57
|
str = after
|
69
58
|
end
|
70
|
-
|
71
|
-
|
59
|
+
s = str.strip
|
60
|
+
yield s, nil, raw unless s.empty?
|
72
61
|
end
|
73
62
|
|
74
63
|
def q_decode(str)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: ascii-8bit
|
1
2
|
#
|
2
3
|
# DO NOT MODIFY!!!!
|
3
4
|
# This file is automatically generated by Racc 1.4.7
|
@@ -26,7 +27,7 @@ def parse(header_type, value)
|
|
26
27
|
end
|
27
28
|
|
28
29
|
def parse_sub(&block)
|
29
|
-
yield @header_type, nil
|
30
|
+
yield [@header_type, nil]
|
30
31
|
@scanner.scan(&block)
|
31
32
|
end
|
32
33
|
|
data/lib/mailparser/rfc2183.rb
CHANGED
data/lib/mailparser/rfc2231.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: ascii-8bit
|
1
2
|
# Copyright (C) 2006-2010 TOMITA Masahiro
|
2
3
|
# mailto:tommy@tmtm.org
|
3
4
|
|
@@ -12,7 +13,7 @@ module MailParser::RFC2231
|
|
12
13
|
char_lang = {}
|
13
14
|
params.each do |key, value|
|
14
15
|
case key
|
15
|
-
when /^([^\*]+)(\*0)?\*$/
|
16
|
+
when /^([^\*]+)(\*0)?\*$/
|
16
17
|
name, ord = $1, $2
|
17
18
|
char, lang, v = value.split(/\'/, 3)
|
18
19
|
char_lang[name] = [char, lang]
|
@@ -20,17 +21,17 @@ module MailParser::RFC2231
|
|
20
21
|
raise MailParser::ParseError, "#{key}=#{value}" if opt[:strict]
|
21
22
|
v = lang || char
|
22
23
|
end
|
23
|
-
v = v.gsub(/%([0-9A-F][0-9A-F])/
|
24
|
+
v = v.gsub(/%([0-9A-F][0-9A-F])/i){$1.hex.chr}
|
24
25
|
if ord then
|
25
26
|
h[name] << [0, v]
|
26
27
|
else
|
27
28
|
newparams[name] = v
|
28
29
|
end
|
29
|
-
when /^([^\*]+)\*([1-9]\d*)\*$/
|
30
|
+
when /^([^\*]+)\*([1-9]\d*)\*$/
|
30
31
|
name, ord = $1, $2.to_i
|
31
|
-
v = value.gsub(/%([0-9A-F][0-9A-F])/
|
32
|
+
v = value.gsub(/%([0-9A-F][0-9A-F])/i){$1.hex.chr}
|
32
33
|
h[name] << [ord, v]
|
33
|
-
when /^([^\*]+)\*([0-9]\d*)$/
|
34
|
+
when /^([^\*]+)\*([0-9]\d*)$/
|
34
35
|
name, ord = $1, $2.to_i
|
35
36
|
h[name] << [ord, value]
|
36
37
|
else
|