kbaum-mail 2.1.2.1

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.
Files changed (114) hide show
  1. data/CHANGELOG.rdoc +289 -0
  2. data/README.rdoc +575 -0
  3. data/Rakefile +72 -0
  4. data/TODO.rdoc +19 -0
  5. data/lib/mail.rb +113 -0
  6. data/lib/mail/attachments_list.rb +76 -0
  7. data/lib/mail/body.rb +243 -0
  8. data/lib/mail/configuration.rb +69 -0
  9. data/lib/mail/core_extensions/nil.rb +11 -0
  10. data/lib/mail/core_extensions/string.rb +19 -0
  11. data/lib/mail/elements/address.rb +306 -0
  12. data/lib/mail/elements/address_list.rb +74 -0
  13. data/lib/mail/elements/content_disposition_element.rb +30 -0
  14. data/lib/mail/elements/content_location_element.rb +25 -0
  15. data/lib/mail/elements/content_transfer_encoding_element.rb +21 -0
  16. data/lib/mail/elements/content_type_element.rb +35 -0
  17. data/lib/mail/elements/date_time_element.rb +26 -0
  18. data/lib/mail/elements/envelope_from_element.rb +34 -0
  19. data/lib/mail/elements/message_ids_element.rb +29 -0
  20. data/lib/mail/elements/mime_version_element.rb +26 -0
  21. data/lib/mail/elements/phrase_list.rb +21 -0
  22. data/lib/mail/elements/received_element.rb +30 -0
  23. data/lib/mail/encodings/base64.rb +18 -0
  24. data/lib/mail/encodings/encodings.rb +201 -0
  25. data/lib/mail/encodings/quoted_printable.rb +26 -0
  26. data/lib/mail/envelope.rb +35 -0
  27. data/lib/mail/field.rb +219 -0
  28. data/lib/mail/field_list.rb +33 -0
  29. data/lib/mail/fields/bcc_field.rb +53 -0
  30. data/lib/mail/fields/cc_field.rb +52 -0
  31. data/lib/mail/fields/comments_field.rb +41 -0
  32. data/lib/mail/fields/common/address_container.rb +16 -0
  33. data/lib/mail/fields/common/common_address.rb +128 -0
  34. data/lib/mail/fields/common/common_date.rb +51 -0
  35. data/lib/mail/fields/common/common_field.rb +64 -0
  36. data/lib/mail/fields/common/common_message_id.rb +57 -0
  37. data/lib/mail/fields/common/parameter_hash.rb +39 -0
  38. data/lib/mail/fields/content_description_field.rb +19 -0
  39. data/lib/mail/fields/content_disposition_field.rb +60 -0
  40. data/lib/mail/fields/content_id_field.rb +63 -0
  41. data/lib/mail/fields/content_location_field.rb +42 -0
  42. data/lib/mail/fields/content_transfer_encoding_field.rb +45 -0
  43. data/lib/mail/fields/content_type_field.rb +175 -0
  44. data/lib/mail/fields/date_field.rb +53 -0
  45. data/lib/mail/fields/from_field.rb +53 -0
  46. data/lib/mail/fields/in_reply_to_field.rb +52 -0
  47. data/lib/mail/fields/keywords_field.rb +43 -0
  48. data/lib/mail/fields/message_id_field.rb +80 -0
  49. data/lib/mail/fields/mime_version_field.rb +54 -0
  50. data/lib/mail/fields/optional_field.rb +11 -0
  51. data/lib/mail/fields/received_field.rb +62 -0
  52. data/lib/mail/fields/references_field.rb +53 -0
  53. data/lib/mail/fields/reply_to_field.rb +53 -0
  54. data/lib/mail/fields/resent_bcc_field.rb +53 -0
  55. data/lib/mail/fields/resent_cc_field.rb +53 -0
  56. data/lib/mail/fields/resent_date_field.rb +33 -0
  57. data/lib/mail/fields/resent_from_field.rb +53 -0
  58. data/lib/mail/fields/resent_message_id_field.rb +32 -0
  59. data/lib/mail/fields/resent_sender_field.rb +60 -0
  60. data/lib/mail/fields/resent_to_field.rb +53 -0
  61. data/lib/mail/fields/return_path_field.rb +62 -0
  62. data/lib/mail/fields/sender_field.rb +65 -0
  63. data/lib/mail/fields/structured_field.rb +36 -0
  64. data/lib/mail/fields/subject_field.rb +15 -0
  65. data/lib/mail/fields/to_field.rb +53 -0
  66. data/lib/mail/fields/unstructured_field.rb +117 -0
  67. data/lib/mail/header.rb +235 -0
  68. data/lib/mail/mail.rb +194 -0
  69. data/lib/mail/message.rb +1780 -0
  70. data/lib/mail/network/delivery_methods/file_delivery.rb +40 -0
  71. data/lib/mail/network/delivery_methods/sendmail.rb +62 -0
  72. data/lib/mail/network/delivery_methods/smtp.rb +110 -0
  73. data/lib/mail/network/delivery_methods/test_mailer.rb +40 -0
  74. data/lib/mail/network/retriever_methods/imap.rb +31 -0
  75. data/lib/mail/network/retriever_methods/pop3.rb +149 -0
  76. data/lib/mail/parsers/address_lists.rb +61 -0
  77. data/lib/mail/parsers/address_lists.treetop +19 -0
  78. data/lib/mail/parsers/content_disposition.rb +369 -0
  79. data/lib/mail/parsers/content_disposition.treetop +46 -0
  80. data/lib/mail/parsers/content_location.rb +133 -0
  81. data/lib/mail/parsers/content_location.treetop +20 -0
  82. data/lib/mail/parsers/content_transfer_encoding.rb +179 -0
  83. data/lib/mail/parsers/content_transfer_encoding.treetop +25 -0
  84. data/lib/mail/parsers/content_type.rb +512 -0
  85. data/lib/mail/parsers/content_type.treetop +58 -0
  86. data/lib/mail/parsers/date_time.rb +111 -0
  87. data/lib/mail/parsers/date_time.treetop +11 -0
  88. data/lib/mail/parsers/envelope_from.rb +188 -0
  89. data/lib/mail/parsers/envelope_from.treetop +32 -0
  90. data/lib/mail/parsers/message_ids.rb +42 -0
  91. data/lib/mail/parsers/message_ids.treetop +15 -0
  92. data/lib/mail/parsers/mime_version.rb +141 -0
  93. data/lib/mail/parsers/mime_version.treetop +19 -0
  94. data/lib/mail/parsers/phrase_lists.rb +42 -0
  95. data/lib/mail/parsers/phrase_lists.treetop +15 -0
  96. data/lib/mail/parsers/received.rb +68 -0
  97. data/lib/mail/parsers/received.treetop +11 -0
  98. data/lib/mail/parsers/rfc2045.rb +406 -0
  99. data/lib/mail/parsers/rfc2045.treetop +35 -0
  100. data/lib/mail/parsers/rfc2822.rb +5081 -0
  101. data/lib/mail/parsers/rfc2822.treetop +410 -0
  102. data/lib/mail/parsers/rfc2822_obsolete.rb +3607 -0
  103. data/lib/mail/parsers/rfc2822_obsolete.treetop +241 -0
  104. data/lib/mail/part.rb +82 -0
  105. data/lib/mail/parts_list.rb +34 -0
  106. data/lib/mail/patterns.rb +43 -0
  107. data/lib/mail/utilities.rb +163 -0
  108. data/lib/mail/vendor/treetop.rb +4 -0
  109. data/lib/mail/version.rb +10 -0
  110. data/lib/mail/version_specific/ruby_1_8.rb +84 -0
  111. data/lib/mail/version_specific/ruby_1_9.rb +77 -0
  112. data/lib/tasks/corpus.rake +125 -0
  113. data/lib/tasks/treetop.rake +10 -0
  114. metadata +188 -0
@@ -0,0 +1,20 @@
1
+ module Mail
2
+ grammar ContentLocation
3
+
4
+ include RFC2822
5
+ include RFC2045
6
+
7
+ rule primary
8
+ CFWS location CFWS
9
+ end
10
+
11
+ rule location
12
+ quoted_string {
13
+ def text_value
14
+ quoted_content.text_value
15
+ end
16
+ } / (token / [\x3d])+
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,179 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Mail
5
+ module ContentTransferEncoding
6
+ include Treetop::Runtime
7
+
8
+ def root
9
+ @root ||= :primary
10
+ end
11
+
12
+ include RFC2822
13
+
14
+ include RFC2045
15
+
16
+ module Primary0
17
+ def CFWS1
18
+ elements[0]
19
+ end
20
+
21
+ def encoding
22
+ elements[1]
23
+ end
24
+
25
+ def CFWS2
26
+ elements[2]
27
+ end
28
+ end
29
+
30
+ def _nt_primary
31
+ start_index = index
32
+ if node_cache[:primary].has_key?(index)
33
+ cached = node_cache[:primary][index]
34
+ @index = cached.interval.end if cached
35
+ return cached
36
+ end
37
+
38
+ i0, s0 = index, []
39
+ r1 = _nt_CFWS
40
+ s0 << r1
41
+ if r1
42
+ r2 = _nt_encoding
43
+ s0 << r2
44
+ if r2
45
+ r3 = _nt_CFWS
46
+ s0 << r3
47
+ end
48
+ end
49
+ if s0.last
50
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
51
+ r0.extend(Primary0)
52
+ else
53
+ @index = i0
54
+ r0 = nil
55
+ end
56
+
57
+ node_cache[:primary][start_index] = r0
58
+
59
+ r0
60
+ end
61
+
62
+ module Encoding0
63
+ def encoding
64
+ known_tokens.text_value || ietf_token.text_value || x_token.text_value
65
+ end
66
+ end
67
+
68
+ def _nt_encoding
69
+ start_index = index
70
+ if node_cache[:encoding].has_key?(index)
71
+ cached = node_cache[:encoding][index]
72
+ @index = cached.interval.end if cached
73
+ return cached
74
+ end
75
+
76
+ i0 = index
77
+ r1 = _nt_known_tokens
78
+ if r1
79
+ r0 = r1
80
+ else
81
+ r2 = _nt_ietf_token
82
+ if r2
83
+ r0 = r2
84
+ else
85
+ r3 = _nt_x_token
86
+ r3.extend(Encoding0)
87
+ if r3
88
+ r0 = r3
89
+ else
90
+ @index = i0
91
+ r0 = nil
92
+ end
93
+ end
94
+ end
95
+
96
+ node_cache[:encoding][start_index] = r0
97
+
98
+ r0
99
+ end
100
+
101
+ def _nt_known_tokens
102
+ start_index = index
103
+ if node_cache[:known_tokens].has_key?(index)
104
+ cached = node_cache[:known_tokens][index]
105
+ @index = cached.interval.end if cached
106
+ return cached
107
+ end
108
+
109
+ i0 = index
110
+ if has_terminal?("7bit", false, index)
111
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
112
+ @index += 4
113
+ else
114
+ terminal_parse_failure("7bit")
115
+ r1 = nil
116
+ end
117
+ if r1
118
+ r0 = r1
119
+ else
120
+ if has_terminal?("8bit", false, index)
121
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 4))
122
+ @index += 4
123
+ else
124
+ terminal_parse_failure("8bit")
125
+ r2 = nil
126
+ end
127
+ if r2
128
+ r0 = r2
129
+ else
130
+ if has_terminal?("binary", false, index)
131
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 6))
132
+ @index += 6
133
+ else
134
+ terminal_parse_failure("binary")
135
+ r3 = nil
136
+ end
137
+ if r3
138
+ r0 = r3
139
+ else
140
+ if has_terminal?("quoted-printable", false, index)
141
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 16))
142
+ @index += 16
143
+ else
144
+ terminal_parse_failure("quoted-printable")
145
+ r4 = nil
146
+ end
147
+ if r4
148
+ r0 = r4
149
+ else
150
+ if has_terminal?("base64", false, index)
151
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 6))
152
+ @index += 6
153
+ else
154
+ terminal_parse_failure("base64")
155
+ r5 = nil
156
+ end
157
+ if r5
158
+ r0 = r5
159
+ else
160
+ @index = i0
161
+ r0 = nil
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ node_cache[:known_tokens][start_index] = r0
169
+
170
+ r0
171
+ end
172
+
173
+ end
174
+
175
+ class ContentTransferEncodingParser < Treetop::Runtime::CompiledParser
176
+ include ContentTransferEncoding
177
+ end
178
+
179
+ end
@@ -0,0 +1,25 @@
1
+ module Mail
2
+ grammar ContentTransferEncoding
3
+
4
+ include RFC2822
5
+ include RFC2045
6
+
7
+ rule primary
8
+ CFWS encoding CFWS
9
+ end
10
+
11
+ rule encoding
12
+ known_tokens / ietf_token / x_token {
13
+ def encoding
14
+ known_tokens.text_value || ietf_token.text_value || x_token.text_value
15
+ end
16
+ }
17
+ end
18
+
19
+ rule known_tokens
20
+ "7bit" / "8bit" / "binary" /
21
+ "quoted-printable" / "base64"
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,512 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
4
+ module Mail
5
+ module ContentType
6
+ include Treetop::Runtime
7
+
8
+ def root
9
+ @root ||= :content_type
10
+ end
11
+
12
+ include RFC2822
13
+
14
+ include RFC2045
15
+
16
+ module ContentType0
17
+ def CFWS1
18
+ elements[0]
19
+ end
20
+
21
+ def parameter
22
+ elements[2]
23
+ end
24
+
25
+ def CFWS2
26
+ elements[3]
27
+ end
28
+ end
29
+
30
+ module ContentType1
31
+ def main_type
32
+ elements[0]
33
+ end
34
+
35
+ def sub_type
36
+ elements[2]
37
+ end
38
+
39
+ def param_hashes
40
+ elements[3]
41
+ end
42
+ end
43
+
44
+ module ContentType2
45
+ def parameters
46
+ param_hashes.elements.map do |param|
47
+ param.parameter.param_hash
48
+ end
49
+ end
50
+ end
51
+
52
+ def _nt_content_type
53
+ start_index = index
54
+ if node_cache[:content_type].has_key?(index)
55
+ cached = node_cache[:content_type][index]
56
+ @index = cached.interval.end if cached
57
+ return cached
58
+ end
59
+
60
+ i0, s0 = index, []
61
+ r1 = _nt_main_type
62
+ s0 << r1
63
+ if r1
64
+ if has_terminal?("/", false, index)
65
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
66
+ @index += 1
67
+ else
68
+ terminal_parse_failure("/")
69
+ r2 = nil
70
+ end
71
+ s0 << r2
72
+ if r2
73
+ r3 = _nt_sub_type
74
+ s0 << r3
75
+ if r3
76
+ s4, i4 = [], index
77
+ loop do
78
+ i5, s5 = index, []
79
+ r6 = _nt_CFWS
80
+ s5 << r6
81
+ if r6
82
+ if has_terminal?(";", false, index)
83
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
84
+ @index += 1
85
+ else
86
+ terminal_parse_failure(";")
87
+ r8 = nil
88
+ end
89
+ if r8
90
+ r7 = r8
91
+ else
92
+ r7 = instantiate_node(SyntaxNode,input, index...index)
93
+ end
94
+ s5 << r7
95
+ if r7
96
+ r9 = _nt_parameter
97
+ s5 << r9
98
+ if r9
99
+ r10 = _nt_CFWS
100
+ s5 << r10
101
+ end
102
+ end
103
+ end
104
+ if s5.last
105
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
106
+ r5.extend(ContentType0)
107
+ else
108
+ @index = i5
109
+ r5 = nil
110
+ end
111
+ if r5
112
+ s4 << r5
113
+ else
114
+ break
115
+ end
116
+ end
117
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
118
+ s0 << r4
119
+ end
120
+ end
121
+ end
122
+ if s0.last
123
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
124
+ r0.extend(ContentType1)
125
+ r0.extend(ContentType2)
126
+ else
127
+ @index = i0
128
+ r0 = nil
129
+ end
130
+
131
+ node_cache[:content_type][start_index] = r0
132
+
133
+ r0
134
+ end
135
+
136
+ def _nt_main_type
137
+ start_index = index
138
+ if node_cache[:main_type].has_key?(index)
139
+ cached = node_cache[:main_type][index]
140
+ @index = cached.interval.end if cached
141
+ return cached
142
+ end
143
+
144
+ i0 = index
145
+ r1 = _nt_discrete_type
146
+ if r1
147
+ r0 = r1
148
+ else
149
+ r2 = _nt_composite_type
150
+ if r2
151
+ r0 = r2
152
+ else
153
+ @index = i0
154
+ r0 = nil
155
+ end
156
+ end
157
+
158
+ node_cache[:main_type][start_index] = r0
159
+
160
+ r0
161
+ end
162
+
163
+ def _nt_discrete_type
164
+ start_index = index
165
+ if node_cache[:discrete_type].has_key?(index)
166
+ cached = node_cache[:discrete_type][index]
167
+ @index = cached.interval.end if cached
168
+ return cached
169
+ end
170
+
171
+ i0 = index
172
+ if has_terminal?("text", false, index)
173
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
174
+ @index += 4
175
+ else
176
+ terminal_parse_failure("text")
177
+ r1 = nil
178
+ end
179
+ if r1
180
+ r0 = r1
181
+ else
182
+ if has_terminal?("image", false, index)
183
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 5))
184
+ @index += 5
185
+ else
186
+ terminal_parse_failure("image")
187
+ r2 = nil
188
+ end
189
+ if r2
190
+ r0 = r2
191
+ else
192
+ if has_terminal?("audio", false, index)
193
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 5))
194
+ @index += 5
195
+ else
196
+ terminal_parse_failure("audio")
197
+ r3 = nil
198
+ end
199
+ if r3
200
+ r0 = r3
201
+ else
202
+ if has_terminal?("video", false, index)
203
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 5))
204
+ @index += 5
205
+ else
206
+ terminal_parse_failure("video")
207
+ r4 = nil
208
+ end
209
+ if r4
210
+ r0 = r4
211
+ else
212
+ if has_terminal?("application", false, index)
213
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 11))
214
+ @index += 11
215
+ else
216
+ terminal_parse_failure("application")
217
+ r5 = nil
218
+ end
219
+ if r5
220
+ r0 = r5
221
+ else
222
+ r6 = _nt_extension_token
223
+ if r6
224
+ r0 = r6
225
+ else
226
+ @index = i0
227
+ r0 = nil
228
+ end
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end
234
+
235
+ node_cache[:discrete_type][start_index] = r0
236
+
237
+ r0
238
+ end
239
+
240
+ def _nt_composite_type
241
+ start_index = index
242
+ if node_cache[:composite_type].has_key?(index)
243
+ cached = node_cache[:composite_type][index]
244
+ @index = cached.interval.end if cached
245
+ return cached
246
+ end
247
+
248
+ i0 = index
249
+ if has_terminal?("message", false, index)
250
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
251
+ @index += 7
252
+ else
253
+ terminal_parse_failure("message")
254
+ r1 = nil
255
+ end
256
+ if r1
257
+ r0 = r1
258
+ else
259
+ if has_terminal?("multipart", false, index)
260
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 9))
261
+ @index += 9
262
+ else
263
+ terminal_parse_failure("multipart")
264
+ r2 = nil
265
+ end
266
+ if r2
267
+ r0 = r2
268
+ else
269
+ r3 = _nt_extension_token
270
+ if r3
271
+ r0 = r3
272
+ else
273
+ @index = i0
274
+ r0 = nil
275
+ end
276
+ end
277
+ end
278
+
279
+ node_cache[:composite_type][start_index] = r0
280
+
281
+ r0
282
+ end
283
+
284
+ def _nt_extension_token
285
+ start_index = index
286
+ if node_cache[:extension_token].has_key?(index)
287
+ cached = node_cache[:extension_token][index]
288
+ @index = cached.interval.end if cached
289
+ return cached
290
+ end
291
+
292
+ i0 = index
293
+ r1 = _nt_ietf_token
294
+ if r1
295
+ r0 = r1
296
+ else
297
+ r2 = _nt_x_token
298
+ if r2
299
+ r0 = r2
300
+ else
301
+ @index = i0
302
+ r0 = nil
303
+ end
304
+ end
305
+
306
+ node_cache[:extension_token][start_index] = r0
307
+
308
+ r0
309
+ end
310
+
311
+ def _nt_sub_type
312
+ start_index = index
313
+ if node_cache[:sub_type].has_key?(index)
314
+ cached = node_cache[:sub_type][index]
315
+ @index = cached.interval.end if cached
316
+ return cached
317
+ end
318
+
319
+ i0 = index
320
+ r1 = _nt_extension_token
321
+ if r1
322
+ r0 = r1
323
+ else
324
+ r2 = _nt_iana_token
325
+ if r2
326
+ r0 = r2
327
+ else
328
+ @index = i0
329
+ r0 = nil
330
+ end
331
+ end
332
+
333
+ node_cache[:sub_type][start_index] = r0
334
+
335
+ r0
336
+ end
337
+
338
+ module Parameter0
339
+ def attr
340
+ elements[1]
341
+ end
342
+
343
+ def val
344
+ elements[3]
345
+ end
346
+
347
+ end
348
+
349
+ module Parameter1
350
+ def param_hash
351
+ {attr.text_value => val.text_value}
352
+ end
353
+ end
354
+
355
+ def _nt_parameter
356
+ start_index = index
357
+ if node_cache[:parameter].has_key?(index)
358
+ cached = node_cache[:parameter][index]
359
+ @index = cached.interval.end if cached
360
+ return cached
361
+ end
362
+
363
+ i0, s0 = index, []
364
+ r2 = _nt_CFWS
365
+ if r2
366
+ r1 = r2
367
+ else
368
+ r1 = instantiate_node(SyntaxNode,input, index...index)
369
+ end
370
+ s0 << r1
371
+ if r1
372
+ r3 = _nt_attribute
373
+ s0 << r3
374
+ if r3
375
+ if has_terminal?("=", false, index)
376
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
377
+ @index += 1
378
+ else
379
+ terminal_parse_failure("=")
380
+ r4 = nil
381
+ end
382
+ s0 << r4
383
+ if r4
384
+ r5 = _nt_value
385
+ s0 << r5
386
+ if r5
387
+ r7 = _nt_CFWS
388
+ if r7
389
+ r6 = r7
390
+ else
391
+ r6 = instantiate_node(SyntaxNode,input, index...index)
392
+ end
393
+ s0 << r6
394
+ end
395
+ end
396
+ end
397
+ end
398
+ if s0.last
399
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
400
+ r0.extend(Parameter0)
401
+ r0.extend(Parameter1)
402
+ else
403
+ @index = i0
404
+ r0 = nil
405
+ end
406
+
407
+ node_cache[:parameter][start_index] = r0
408
+
409
+ r0
410
+ end
411
+
412
+ def _nt_attribute
413
+ start_index = index
414
+ if node_cache[:attribute].has_key?(index)
415
+ cached = node_cache[:attribute][index]
416
+ @index = cached.interval.end if cached
417
+ return cached
418
+ end
419
+
420
+ s0, i0 = [], index
421
+ loop do
422
+ r1 = _nt_token
423
+ if r1
424
+ s0 << r1
425
+ else
426
+ break
427
+ end
428
+ end
429
+ if s0.empty?
430
+ @index = i0
431
+ r0 = nil
432
+ else
433
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
434
+ end
435
+
436
+ node_cache[:attribute][start_index] = r0
437
+
438
+ r0
439
+ end
440
+
441
+ module Value0
442
+ def text_value
443
+ quoted_content.text_value
444
+ end
445
+ end
446
+
447
+ def _nt_value
448
+ start_index = index
449
+ if node_cache[:value].has_key?(index)
450
+ cached = node_cache[:value][index]
451
+ @index = cached.interval.end if cached
452
+ return cached
453
+ end
454
+
455
+ i0 = index
456
+ r1 = _nt_quoted_string
457
+ r1.extend(Value0)
458
+ if r1
459
+ r0 = r1
460
+ else
461
+ s2, i2 = [], index
462
+ loop do
463
+ i3 = index
464
+ r4 = _nt_token
465
+ if r4
466
+ r3 = r4
467
+ else
468
+ if has_terminal?('\G[\\x3d]', true, index)
469
+ r5 = true
470
+ @index += 1
471
+ else
472
+ r5 = nil
473
+ end
474
+ if r5
475
+ r3 = r5
476
+ else
477
+ @index = i3
478
+ r3 = nil
479
+ end
480
+ end
481
+ if r3
482
+ s2 << r3
483
+ else
484
+ break
485
+ end
486
+ end
487
+ if s2.empty?
488
+ @index = i2
489
+ r2 = nil
490
+ else
491
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
492
+ end
493
+ if r2
494
+ r0 = r2
495
+ else
496
+ @index = i0
497
+ r0 = nil
498
+ end
499
+ end
500
+
501
+ node_cache[:value][start_index] = r0
502
+
503
+ r0
504
+ end
505
+
506
+ end
507
+
508
+ class ContentTypeParser < Treetop::Runtime::CompiledParser
509
+ include ContentType
510
+ end
511
+
512
+ end