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/README.txt
CHANGED
@@ -87,9 +87,6 @@ opt は Hash オブジェクトで次の値を指定できる。
|
|
87
87
|
:strict => true
|
88
88
|
RFC違反時に ParseError 例外を発生する。デフォルトは false。
|
89
89
|
|
90
|
-
:keep_raw => true
|
91
|
-
生メッセージ文字列を保持する。デフォルトは false。
|
92
|
-
|
93
90
|
:use_file => bytes
|
94
91
|
raw が指定したサイズを超えたら、メモリではなくファイルを使う。nil 指定時は無制限にメモリを使う。デフォルトは nil。
|
95
92
|
|
@@ -307,10 +304,9 @@ m.rawheader # => "From: TOMITA Masahiro <tommy@tmtm.org>\nTo: foo@example.com\n
|
|
307
304
|
|
308
305
|
=== raw ===
|
309
306
|
|
310
|
-
|
311
|
-
:keep_raw=>false の場合は空文字列が返る。
|
307
|
+
生メッセージ文字列を返す。
|
312
308
|
{{{
|
313
|
-
m = MailParser::Message.new(StringIO.new(<<EOS)
|
309
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
314
310
|
From: TOMITA Masahiro <tommy@tmtm.org>
|
315
311
|
To: foo@example.com
|
316
312
|
Subject: subject
|
@@ -1,27 +1,48 @@
|
|
1
|
-
#
|
1
|
+
# coding: ascii-8bit
|
2
|
+
# Copyright (C) 2007-2011 TOMITA Masahiro
|
2
3
|
# mailto:tommy@tmtm.org
|
3
4
|
|
4
|
-
|
5
|
-
|
5
|
+
module MailParser
|
6
|
+
end
|
6
7
|
|
7
8
|
class MailParser::ConvCharset
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
from
|
9
|
+
if String.method_defined? :encode
|
10
|
+
CHARSET = {
|
11
|
+
"sjis" => "cp932",
|
12
|
+
"x-sjis" => "cp932",
|
13
|
+
"shift_jis" => "cp932",
|
14
|
+
"shift-jis" => "cp932",
|
15
|
+
"iso-2022-jp" => "cp50221",
|
16
|
+
}
|
17
|
+
|
18
|
+
def self.conv_charset(from, to, str)
|
19
|
+
from = CHARSET[from.downcase] || from.downcase
|
20
|
+
to = CHARSET[to.downcase] || to.downcase
|
21
|
+
str.encode(to, from, :invalid=>:replace, :undef=>:replace, :replace=>'?')
|
21
22
|
end
|
22
|
-
|
23
|
-
|
23
|
+
else
|
24
|
+
require "iconv"
|
25
|
+
require "nkf"
|
26
|
+
|
27
|
+
CHARSET = {
|
28
|
+
"sjis" => "cp932",
|
29
|
+
"x-sjis" => "cp932",
|
30
|
+
"shift_jis" => "cp932",
|
31
|
+
"shift-jis" => "cp932",
|
32
|
+
}
|
33
|
+
|
34
|
+
def self.conv_charset(from, to, str)
|
35
|
+
from = CHARSET[from.downcase] || from.downcase
|
36
|
+
to = CHARSET[to.downcase] || to.downcase
|
37
|
+
s = str
|
38
|
+
if from == "iso-2022-jp" then
|
39
|
+
s = NKF.nkf("-m0Jxs", str)
|
40
|
+
from = "cp932"
|
41
|
+
end
|
42
|
+
if to == "iso-2022-jp" then
|
43
|
+
return NKF.nkf("-m0Sxj", Iconv.iconv("cp932", from, s)[0])
|
44
|
+
end
|
45
|
+
return Iconv.iconv(to, from, s)[0]
|
24
46
|
end
|
25
|
-
return Iconv.iconv(to, from, s)[0]
|
26
47
|
end
|
27
48
|
end
|
data/lib/mailparser/error.rb
CHANGED
data/lib/mailparser/loose.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# coding: ascii-8bit
|
2
2
|
# Copyright (C) 2007-2010 TOMITA Masahiro
|
3
3
|
# mailto:tommy@tmtm.org
|
4
4
|
|
@@ -6,6 +6,8 @@ require "time"
|
|
6
6
|
require "strscan"
|
7
7
|
require "mailparser/rfc2822"
|
8
8
|
require "mailparser/rfc2045"
|
9
|
+
require "mailparser/rfc2047"
|
10
|
+
require "mailparser/rfc2183"
|
9
11
|
|
10
12
|
module MailParser
|
11
13
|
module Loose
|
@@ -109,7 +111,7 @@ module MailParser
|
|
109
111
|
v = ""
|
110
112
|
unless a.empty?
|
111
113
|
while i < a[0].length do
|
112
|
-
if a[0][i] =~ /\A[a-z0-9]+\z/
|
114
|
+
if a[0][i] =~ /\A[a-z0-9]+\z/i then
|
113
115
|
v = a[0][i+1]
|
114
116
|
name_val[a[0][i].downcase] = v
|
115
117
|
i += 1
|
@@ -125,10 +127,10 @@ module MailParser
|
|
125
127
|
# Content-Type ヘッダをパースして RFC2045::ContentType を返す
|
126
128
|
def parse_content_type(str, opt={})
|
127
129
|
token = split_by(Tokenizer.token(str), ";")
|
128
|
-
type, subtype = token.shift.
|
130
|
+
type, subtype = token.empty? ? nil : token.shift.join.split("/", 2)
|
129
131
|
params = {}
|
130
|
-
token.
|
131
|
-
pn, pv = param.
|
132
|
+
token.each do |param|
|
133
|
+
pn, pv = param.join.split(/=/, 2)
|
132
134
|
params[pn.to_s] = pv.to_s.gsub(/\A"|"\z/,"")
|
133
135
|
end
|
134
136
|
type = "text" if type.nil? or type.empty?
|
@@ -151,10 +153,10 @@ module MailParser
|
|
151
153
|
# Content-Disposition ヘッダをパースして RFC2183::ContentDisposition を返す
|
152
154
|
def parse_content_disposition(str, opt={})
|
153
155
|
token = split_by(Tokenizer.token(str), ";")
|
154
|
-
type = token.shift.
|
156
|
+
type = token.empty? ? '' : token.shift.join
|
155
157
|
params = {}
|
156
|
-
token.
|
157
|
-
pn, pv = param.
|
158
|
+
token.each do |param|
|
159
|
+
pn, pv = param.join.split(/=/, 2)
|
158
160
|
params[pn.to_s] = pv.to_s.gsub(/\A"|"\z/,"")
|
159
161
|
end
|
160
162
|
RFC2183::ContentDisposition.new(type, params)
|
@@ -185,11 +187,11 @@ module MailParser
|
|
185
187
|
if opt[:decode_mime_header] then
|
186
188
|
display_name = RFC2047.decode(display_name, opt)
|
187
189
|
end
|
188
|
-
mailaddr = m[a1+1..a2-1].
|
190
|
+
mailaddr = m[a1+1..a2-1].join
|
189
191
|
local_part, domain = mailaddr.split(/@/, 2)
|
190
192
|
ret << RFC2822::Mailbox.new(RFC2822::AddrSpec.new(local_part, domain), display_name)
|
191
193
|
else
|
192
|
-
local_part, domain = m.
|
194
|
+
local_part, domain = m.join.split(/@/, 2)
|
193
195
|
ret << RFC2822::Mailbox.new(RFC2822::AddrSpec.new(local_part, domain))
|
194
196
|
end
|
195
197
|
end
|
@@ -233,9 +235,9 @@ module MailParser
|
|
233
235
|
def token()
|
234
236
|
token = []
|
235
237
|
while @ss.rest? do
|
236
|
-
if s = @ss.scan(/\s+/
|
238
|
+
if s = @ss.scan(/\s+/) then
|
237
239
|
# ignore
|
238
|
-
elsif s = @ss.scan(/\(/
|
240
|
+
elsif s = @ss.scan(/\(/) then
|
239
241
|
begin
|
240
242
|
pos = @ss.pos
|
241
243
|
cfws(@ss)
|
@@ -243,12 +245,12 @@ module MailParser
|
|
243
245
|
@ss.pos = pos
|
244
246
|
token << s
|
245
247
|
end
|
246
|
-
elsif s = @ss.scan(/\"(\s*(\\[#{TEXT_RE}]|[#{QTEXT_RE}]))*\s*\"/
|
247
|
-
@ss.scan(/\[(\s*(\\[#{TEXT_RE}]|[#{DTEXT_RE}]))*\s*\]/
|
248
|
-
@ss.scan(/[#{ATEXT_RE}]+/
|
248
|
+
elsif s = @ss.scan(/\"(\s*(\\[#{TEXT_RE}]|[#{QTEXT_RE}]))*\s*\"/o) ||
|
249
|
+
@ss.scan(/\[(\s*(\\[#{TEXT_RE}]|[#{DTEXT_RE}]))*\s*\]/o) ||
|
250
|
+
@ss.scan(/[#{ATEXT_RE}]+/o)
|
249
251
|
token << s
|
250
252
|
else
|
251
|
-
token << @ss.scan(/./
|
253
|
+
token << @ss.scan(/./)
|
252
254
|
end
|
253
255
|
end
|
254
256
|
return token
|
@@ -258,9 +260,9 @@ module MailParser
|
|
258
260
|
def token_received()
|
259
261
|
ret = []
|
260
262
|
while @ss.rest? do
|
261
|
-
if s = @ss.scan(/[\s]+/
|
263
|
+
if s = @ss.scan(/[\s]+/) then
|
262
264
|
# ignore blank
|
263
|
-
elsif s = @ss.scan(/\(/
|
265
|
+
elsif s = @ss.scan(/\(/) then
|
264
266
|
begin
|
265
267
|
pos = @ss.pos
|
266
268
|
cfws(@ss)
|
@@ -268,12 +270,12 @@ module MailParser
|
|
268
270
|
@ss.pos = pos
|
269
271
|
ret.last << s unless ret.empty?
|
270
272
|
end
|
271
|
-
elsif s = @ss.scan(/\"([\s]*(\\[#{TEXT_RE}]|[#{QTEXT_RE}]))*[\s]*\"/
|
273
|
+
elsif s = @ss.scan(/\"([\s]*(\\[#{TEXT_RE}]|[#{QTEXT_RE}]))*[\s]*\"/o)
|
272
274
|
ret << s
|
273
275
|
elsif s = @ss.scan(/;/)
|
274
276
|
ret << s
|
275
277
|
else
|
276
|
-
ret << @ss.scan(/[^\s\(\;]+/
|
278
|
+
ret << @ss.scan(/[^\s\(\;]+/o)
|
277
279
|
end
|
278
280
|
end
|
279
281
|
return ret
|
@@ -1,19 +1,16 @@
|
|
1
|
+
# coding: ascii-8bit
|
1
2
|
#
|
2
3
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by
|
4
|
-
# from
|
4
|
+
# This file is automatically generated by Racc 1.4.7
|
5
|
+
# from Racc grammer file "".
|
5
6
|
#
|
6
7
|
|
7
|
-
require 'racc/parser'
|
8
|
-
|
9
|
-
|
8
|
+
require 'racc/parser.rb'
|
10
9
|
module MailParser
|
11
|
-
|
12
10
|
module RFC2045
|
13
|
-
|
14
11
|
class Parser < Racc::Parser
|
15
12
|
|
16
|
-
module_eval
|
13
|
+
module_eval(<<'...end parser.y/module_eval...', 'parser.y', 62)
|
17
14
|
|
18
15
|
require "mailparser/rfc2045/scanner"
|
19
16
|
|
@@ -30,7 +27,7 @@ def parse(header_type, value)
|
|
30
27
|
end
|
31
28
|
|
32
29
|
def parse_sub(&block)
|
33
|
-
yield @header_type, nil
|
30
|
+
yield [@header_type, nil]
|
34
31
|
@scanner.scan(&block)
|
35
32
|
end
|
36
33
|
|
@@ -39,207 +36,210 @@ def on_error(t, val, vstack)
|
|
39
36
|
# p racc_token2str(t)
|
40
37
|
raise MailParser::ParseError, val+@scanner.rest
|
41
38
|
end
|
42
|
-
|
43
|
-
|
44
|
-
##### racc 1.4.5 generates ###
|
45
|
-
|
46
|
-
racc_reduce_table = [
|
47
|
-
0, 0, :racc_error,
|
48
|
-
2, 13, :_reduce_1,
|
49
|
-
2, 13, :_reduce_2,
|
50
|
-
2, 13, :_reduce_3,
|
51
|
-
4, 14, :_reduce_4,
|
52
|
-
1, 15, :_reduce_5,
|
53
|
-
3, 16, :_reduce_6,
|
54
|
-
1, 20, :_reduce_none,
|
55
|
-
1, 17, :_reduce_none,
|
56
|
-
1, 18, :_reduce_none,
|
57
|
-
0, 19, :_reduce_10,
|
58
|
-
3, 19, :_reduce_11,
|
59
|
-
3, 21, :_reduce_12,
|
60
|
-
1, 22, :_reduce_none,
|
61
|
-
1, 23, :_reduce_none,
|
62
|
-
1, 23, :_reduce_none ]
|
63
|
-
|
64
|
-
racc_reduce_n = 16
|
65
|
-
|
66
|
-
racc_shift_n = 29
|
39
|
+
...end parser.y/module_eval...
|
40
|
+
##### State transition tables begin ###
|
67
41
|
|
68
42
|
racc_action_table = [
|
69
|
-
|
70
|
-
|
43
|
+
27, 8, 11, 28, 2, 3, 4, 13, 14, 15,
|
44
|
+
5, 18, 19, 21, 24, 25, 16 ]
|
71
45
|
|
72
46
|
racc_action_check = [
|
73
|
-
25, 2, 3, 25, 0, 0, 0, 4,
|
74
|
-
1,
|
47
|
+
25, 2, 3, 25, 0, 0, 0, 4, 5, 7,
|
48
|
+
1, 15, 16, 20, 21, 23, 13 ]
|
75
49
|
|
76
50
|
racc_action_pointer = [
|
77
|
-
2,
|
78
|
-
nil, nil, nil, 9,
|
79
|
-
4, 6, 5, nil,
|
51
|
+
2, 10, -7, -6, 1, 8, nil, 4, nil, nil,
|
52
|
+
nil, nil, nil, 9, nil, 3, 6, nil, nil, nil,
|
53
|
+
4, 6, nil, 5, nil, -8, nil, nil, nil ]
|
80
54
|
|
81
55
|
racc_action_default = [
|
82
|
-
-16, -16, -16, -16, -16, -1, -16, -8,
|
83
|
-
-
|
84
|
-
-4, -16, -
|
56
|
+
-16, -16, -16, -16, -16, -16, -1, -16, -8, -2,
|
57
|
+
-5, -7, -3, -16, 29, -16, -16, -10, -9, -6,
|
58
|
+
-4, -16, -11, -16, -13, -16, -12, -14, -15 ]
|
85
59
|
|
86
60
|
racc_goto_table = [
|
87
|
-
|
88
|
-
|
61
|
+
1, 6, 9, 12, 7, 17, 20, 10, 22, 23,
|
62
|
+
26 ]
|
89
63
|
|
90
64
|
racc_goto_check = [
|
91
65
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
92
66
|
11 ]
|
93
67
|
|
94
68
|
racc_goto_pointer = [
|
95
|
-
nil, 0,
|
69
|
+
nil, 0, -1, -1, -1, 2, -10, -11, 4, -13,
|
96
70
|
-12, -15 ]
|
97
71
|
|
98
72
|
racc_goto_default = [
|
99
73
|
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
100
74
|
nil, nil ]
|
101
75
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
:
|
106
|
-
:
|
107
|
-
:
|
108
|
-
|
109
|
-
:
|
110
|
-
|
111
|
-
:
|
112
|
-
|
113
|
-
|
114
|
-
:
|
76
|
+
racc_reduce_table = [
|
77
|
+
0, 0, :racc_error,
|
78
|
+
2, 13, :_reduce_1,
|
79
|
+
2, 13, :_reduce_2,
|
80
|
+
2, 13, :_reduce_3,
|
81
|
+
4, 14, :_reduce_4,
|
82
|
+
1, 15, :_reduce_5,
|
83
|
+
3, 16, :_reduce_6,
|
84
|
+
1, 20, :_reduce_none,
|
85
|
+
1, 17, :_reduce_none,
|
86
|
+
1, 18, :_reduce_none,
|
87
|
+
0, 19, :_reduce_10,
|
88
|
+
3, 19, :_reduce_11,
|
89
|
+
3, 21, :_reduce_12,
|
90
|
+
1, 22, :_reduce_none,
|
91
|
+
1, 23, :_reduce_none,
|
92
|
+
1, 23, :_reduce_none ]
|
115
93
|
|
116
|
-
|
94
|
+
racc_reduce_n = 16
|
95
|
+
|
96
|
+
racc_shift_n = 29
|
97
|
+
|
98
|
+
racc_token_table = {
|
99
|
+
false => 0,
|
100
|
+
:error => 1,
|
101
|
+
:CONTENT_TYPE => 2,
|
102
|
+
:CONTENT_TRANSFER_ENCODING => 3,
|
103
|
+
:MIME_VERSION => 4,
|
104
|
+
"/" => 5,
|
105
|
+
:DIGIT => 6,
|
106
|
+
"." => 7,
|
107
|
+
:TOKEN => 8,
|
108
|
+
";" => 9,
|
109
|
+
"=" => 10,
|
110
|
+
:QUOTED_STRING => 11 }
|
117
111
|
|
118
112
|
racc_nt_base = 12
|
119
113
|
|
114
|
+
racc_use_result_var = false
|
115
|
+
|
120
116
|
Racc_arg = [
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
117
|
+
racc_action_table,
|
118
|
+
racc_action_check,
|
119
|
+
racc_action_default,
|
120
|
+
racc_action_pointer,
|
121
|
+
racc_goto_table,
|
122
|
+
racc_goto_check,
|
123
|
+
racc_goto_default,
|
124
|
+
racc_goto_pointer,
|
125
|
+
racc_nt_base,
|
126
|
+
racc_reduce_table,
|
127
|
+
racc_token_table,
|
128
|
+
racc_shift_n,
|
129
|
+
racc_reduce_n,
|
130
|
+
racc_use_result_var ]
|
135
131
|
|
136
132
|
Racc_token_to_s_table = [
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
133
|
+
"$end",
|
134
|
+
"error",
|
135
|
+
"CONTENT_TYPE",
|
136
|
+
"CONTENT_TRANSFER_ENCODING",
|
137
|
+
"MIME_VERSION",
|
138
|
+
"\"/\"",
|
139
|
+
"DIGIT",
|
140
|
+
"\".\"",
|
141
|
+
"TOKEN",
|
142
|
+
"\";\"",
|
143
|
+
"\"=\"",
|
144
|
+
"QUOTED_STRING",
|
145
|
+
"$start",
|
146
|
+
"all",
|
147
|
+
"content_type",
|
148
|
+
"content_transfer_encoding",
|
149
|
+
"mime_version",
|
150
|
+
"type",
|
151
|
+
"subtype",
|
152
|
+
"parameter_list",
|
153
|
+
"mechanism",
|
154
|
+
"parameter",
|
155
|
+
"attribute",
|
156
|
+
"value" ]
|
161
157
|
|
162
158
|
Racc_debug_parser = false
|
163
159
|
|
164
|
-
#####
|
160
|
+
##### State transition tables end #####
|
165
161
|
|
166
|
-
|
162
|
+
# reduce 0 omitted
|
167
163
|
|
168
|
-
module_eval
|
169
|
-
def _reduce_1(
|
170
|
-
val[1]
|
164
|
+
module_eval(<<'.,.,', 'parser.y', 9)
|
165
|
+
def _reduce_1(val, _values)
|
166
|
+
val[1]
|
171
167
|
end
|
172
168
|
.,.,
|
173
169
|
|
174
|
-
module_eval
|
175
|
-
def _reduce_2(
|
176
|
-
val[1]
|
170
|
+
module_eval(<<'.,.,', 'parser.y', 11)
|
171
|
+
def _reduce_2(val, _values)
|
172
|
+
val[1]
|
177
173
|
end
|
178
174
|
.,.,
|
179
175
|
|
180
|
-
module_eval
|
181
|
-
def _reduce_3(
|
182
|
-
val[1]
|
176
|
+
module_eval(<<'.,.,', 'parser.y', 13)
|
177
|
+
def _reduce_3(val, _values)
|
178
|
+
val[1]
|
183
179
|
end
|
184
180
|
.,.,
|
185
181
|
|
186
|
-
module_eval
|
187
|
-
def _reduce_4(
|
188
|
-
|
182
|
+
module_eval(<<'.,.,', 'parser.y', 17)
|
183
|
+
def _reduce_4(val, _values)
|
184
|
+
ContentType.new(val[0], val[2], val[3])
|
185
|
+
|
189
186
|
end
|
190
187
|
.,.,
|
191
188
|
|
192
|
-
module_eval
|
193
|
-
def _reduce_5(
|
194
|
-
|
189
|
+
module_eval(<<'.,.,', 'parser.y', 22)
|
190
|
+
def _reduce_5(val, _values)
|
191
|
+
ContentTransferEncoding.new(val[0])
|
192
|
+
|
195
193
|
end
|
196
194
|
.,.,
|
197
195
|
|
198
|
-
module_eval
|
199
|
-
def _reduce_6(
|
200
|
-
|
196
|
+
module_eval(<<'.,.,', 'parser.y', 29)
|
197
|
+
def _reduce_6(val, _values)
|
198
|
+
val.join
|
199
|
+
|
201
200
|
end
|
202
201
|
.,.,
|
203
202
|
|
204
|
-
|
203
|
+
# reduce 7 omitted
|
205
204
|
|
206
|
-
|
205
|
+
# reduce 8 omitted
|
207
206
|
|
208
|
-
|
207
|
+
# reduce 9 omitted
|
209
208
|
|
210
|
-
module_eval
|
211
|
-
def _reduce_10(
|
212
|
-
|
209
|
+
module_eval(<<'.,.,', 'parser.y', 40)
|
210
|
+
def _reduce_10(val, _values)
|
211
|
+
{}
|
212
|
+
|
213
213
|
end
|
214
214
|
.,.,
|
215
215
|
|
216
|
-
module_eval
|
217
|
-
def _reduce_11(
|
218
|
-
|
216
|
+
module_eval(<<'.,.,', 'parser.y', 44)
|
217
|
+
def _reduce_11(val, _values)
|
218
|
+
pn, pv = val[2]
|
219
219
|
pv = $1 if pv =~ /\A\"(.*)\"\Z/m
|
220
220
|
val[0][pn] = pv.gsub(/\s*\n\s*/, " ")
|
221
221
|
val[0]
|
222
|
+
|
222
223
|
end
|
223
224
|
.,.,
|
224
225
|
|
225
|
-
module_eval
|
226
|
-
def _reduce_12(
|
227
|
-
|
226
|
+
module_eval(<<'.,.,', 'parser.y', 52)
|
227
|
+
def _reduce_12(val, _values)
|
228
|
+
[val[0].downcase, val[2]]
|
229
|
+
|
228
230
|
end
|
229
231
|
.,.,
|
230
232
|
|
231
|
-
|
233
|
+
# reduce 13 omitted
|
232
234
|
|
233
|
-
|
235
|
+
# reduce 14 omitted
|
234
236
|
|
235
|
-
|
237
|
+
# reduce 15 omitted
|
236
238
|
|
237
|
-
|
239
|
+
def _reduce_none(val, _values)
|
238
240
|
val[0]
|
239
|
-
|
241
|
+
end
|
240
242
|
|
241
243
|
end # class Parser
|
242
|
-
|
243
|
-
end # module
|
244
|
-
|
245
|
-
end # module MailParser
|
244
|
+
end # module RFC2045
|
245
|
+
end # module MailParser
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: ascii-8bit
|
1
2
|
# Copyright (C) 2006-2010 TOMITA Masahiro
|
2
3
|
# mailto:tommy@tmtm.org
|
3
4
|
|
@@ -18,17 +19,17 @@ class MailParser::RFC2045::Scanner < MailParser::RFC2822::Scanner
|
|
18
19
|
def scan_structured()
|
19
20
|
until @ss.eos?
|
20
21
|
case
|
21
|
-
when s = @ss.scan(/\s*\(/
|
22
|
+
when s = @ss.scan(/\s*\(/)
|
22
23
|
s << cfws(@ss)
|
23
24
|
next
|
24
|
-
when s = @ss.scan(/\s+/
|
25
|
+
when s = @ss.scan(/\s+/)
|
25
26
|
next
|
26
|
-
when s = @ss.scan(/\"(\s*(\\[#{TEXT_RE}]|[#{QTEXT_RE}]))*\s*\"/
|
27
|
-
yield :QUOTED_STRING, s
|
28
|
-
when s = @ss.scan(/[#{TOKEN_RE}]+/
|
29
|
-
yield :TOKEN, s
|
30
|
-
when s = @ss.scan(/./
|
31
|
-
yield s, s
|
27
|
+
when s = @ss.scan(/\"(\s*(\\[#{TEXT_RE}]|[#{QTEXT_RE}]))*\s*\"/o)
|
28
|
+
yield [:QUOTED_STRING, s]
|
29
|
+
when s = @ss.scan(/[#{TOKEN_RE}]+/o)
|
30
|
+
yield [:TOKEN, s]
|
31
|
+
when s = @ss.scan(/./)
|
32
|
+
yield [s, s]
|
32
33
|
end
|
33
34
|
end
|
34
35
|
yield nil
|
@@ -37,15 +38,15 @@ class MailParser::RFC2045::Scanner < MailParser::RFC2822::Scanner
|
|
37
38
|
def scan_mime_version()
|
38
39
|
until @ss.eos?
|
39
40
|
case
|
40
|
-
when s = @ss.scan(/\s*\(/
|
41
|
+
when s = @ss.scan(/\s*\(/)
|
41
42
|
s << cfws(@ss)
|
42
43
|
next
|
43
|
-
when s = @ss.scan(/\s+/
|
44
|
+
when s = @ss.scan(/\s+/)
|
44
45
|
next
|
45
|
-
when s = @ss.scan(/\d+/
|
46
|
-
yield :DIGIT, s
|
47
|
-
when s = @ss.scan(/./
|
48
|
-
yield s, s
|
46
|
+
when s = @ss.scan(/\d+/)
|
47
|
+
yield [:DIGIT, s]
|
48
|
+
when s = @ss.scan(/./)
|
49
|
+
yield [s, s]
|
49
50
|
end
|
50
51
|
end
|
51
52
|
yield nil
|
data/lib/mailparser/rfc2045.rb
CHANGED