mailparser 0.4.22a → 0.5.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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