tmail 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. data/CHANGES +50 -5
  2. data/MANIFEST +188 -0
  3. data/NOTES +1 -1
  4. data/README +10 -4
  5. data/Rakefile +1 -10
  6. data/lib/tmail.rb +1 -0
  7. data/lib/tmail/Makefile +0 -1
  8. data/lib/tmail/address.rb +190 -17
  9. data/lib/tmail/attachments.rb +1 -1
  10. data/lib/tmail/base64.rb +4 -10
  11. data/lib/tmail/compat.rb +8 -6
  12. data/lib/tmail/config.rb +2 -6
  13. data/lib/tmail/core_extensions.rb +14 -18
  14. data/lib/tmail/encode.rb +47 -12
  15. data/lib/tmail/header.rb +7 -10
  16. data/lib/tmail/index.rb +2 -1
  17. data/lib/tmail/interface.rb +14 -12
  18. data/lib/tmail/loader.rb +2 -0
  19. data/lib/tmail/mail.rb +83 -24
  20. data/lib/tmail/mailbox.rb +70 -10
  21. data/lib/tmail/main.rb +2 -0
  22. data/lib/tmail/mbox.rb +2 -0
  23. data/lib/tmail/net.rb +16 -15
  24. data/lib/tmail/obsolete.rb +7 -12
  25. data/lib/tmail/parser.rb +1 -0
  26. data/lib/tmail/require_arch.rb +2 -0
  27. data/lib/tmail/scanner.rb +2 -1
  28. data/lib/tmail/scanner_r.rb +11 -10
  29. data/lib/tmail/utils.rb +83 -26
  30. data/lib/tmail/version.rb +3 -2
  31. data/log/BugTrackingLog.txt +1208 -0
  32. data/log/{ChangeLog.txt → Changelog-0.txt} +36 -0
  33. data/log/Changelog.txt +534 -0
  34. data/log/Testlog.txt +114 -0
  35. data/log/Todo.txt +0 -2
  36. data/meta/VERSION +1 -0
  37. data/meta/project.yaml +8 -5
  38. data/meta/unixname +1 -0
  39. data/setup.rb +1481 -0
  40. data/site/contributing/index.html +183 -0
  41. data/site/css/clean.css +27 -0
  42. data/site/css/layout.css +31 -0
  43. data/site/css/style.css +60 -0
  44. data/site/download/index.html +61 -0
  45. data/site/img/envelope.jpg +0 -0
  46. data/site/img/mailman.gif +0 -0
  47. data/site/img/stamp-sm.jpg +0 -0
  48. data/site/img/stamp.jpg +0 -0
  49. data/site/img/stampborder.jpg +0 -0
  50. data/site/img/tfire.jpg +0 -0
  51. data/site/img/tmail.png +0 -0
  52. data/site/index.html +270 -0
  53. data/site/js/jquery.js +31 -0
  54. data/site/log/Changelog.xsl +33 -0
  55. data/site/log/changelog.xml +1677 -0
  56. data/site/outdated/BUGS +3 -0
  57. data/site/outdated/DEPENDS +1 -0
  58. data/site/outdated/Incompatibilities +89 -0
  59. data/site/outdated/Incompatibilities.ja +102 -0
  60. data/site/outdated/NEWS +9 -0
  61. data/site/outdated/README.ja +73 -0
  62. data/site/outdated/doc.ja/address.html +275 -0
  63. data/site/outdated/doc.ja/basics.html +405 -0
  64. data/site/outdated/doc.ja/config.html +49 -0
  65. data/site/outdated/doc.ja/details.html +146 -0
  66. data/site/outdated/doc.ja/index.html +39 -0
  67. data/site/outdated/doc.ja/mail.html +793 -0
  68. data/site/outdated/doc.ja/mailbox.html +265 -0
  69. data/site/outdated/doc.ja/port.html +95 -0
  70. data/site/outdated/doc.ja/tmail.html +58 -0
  71. data/site/outdated/doc.ja/usage.html +202 -0
  72. data/site/outdated/rdd/address.rrd.m +229 -0
  73. data/site/outdated/rdd/basics.rd.m +275 -0
  74. data/site/outdated/rdd/config.rrd.m +26 -0
  75. data/site/outdated/rdd/details.rd.m +117 -0
  76. data/site/outdated/rdd/index.rhtml.m +54 -0
  77. data/site/outdated/rdd/mail.rrd.m +701 -0
  78. data/site/outdated/rdd/mailbox.rrd.m +228 -0
  79. data/site/outdated/rdd/port.rrd.m +69 -0
  80. data/site/outdated/rdd/tmail.rrd.m +33 -0
  81. data/site/outdated/rdd/usage.rd.m +247 -0
  82. data/site/quickstart/index.html +69 -0
  83. data/site/quickstart/quickstart.html +52 -0
  84. data/site/quickstart/usage.html +193 -0
  85. data/site/reference/address.html +247 -0
  86. data/site/reference/config.html +30 -0
  87. data/site/reference/index.html +101 -0
  88. data/site/reference/mail.html +726 -0
  89. data/site/reference/mailbox.html +245 -0
  90. data/site/reference/port.html +75 -0
  91. data/site/reference/tmail.html +35 -0
  92. data/test/fixtures/mailbox +405 -4
  93. data/test/fixtures/raw_email_multiple_from +30 -0
  94. data/test/kcode.rb +2 -2
  95. data/test/temp_test_one.rb +46 -0
  96. data/test/test_address.rb +77 -38
  97. data/test/test_encode.rb +0 -2
  98. data/test/test_header.rb +47 -24
  99. data/test/test_mail.rb +52 -9
  100. data/test/test_mbox.rb +28 -0
  101. data/test/test_port.rb +33 -27
  102. data/test/test_quote.rb +35 -8
  103. data/work/script/make +26 -0
  104. data/work/script/rdoc +39 -0
  105. data/{script → work/script}/setup +0 -0
  106. data/work/script/test +30 -0
  107. metadata +249 -184
  108. data/log/History.txt +0 -40
  109. data/meta/config.yaml +0 -8
  110. data/meta/icli.yaml +0 -16
  111. data/meta/tmail.roll +0 -3
  112. data/script/changelog +0 -19
  113. data/script/clobber/distclean +0 -8
  114. data/script/clobber/package +0 -10
  115. data/script/compile +0 -32
  116. data/script/pack/gem +0 -93
  117. data/script/pack/tgz +0 -41
  118. data/script/pack/zip +0 -41
  119. data/script/prepare +0 -15
  120. data/script/publish +0 -51
  121. data/script/rdoc +0 -42
  122. data/script/release +0 -10
  123. data/script/stamp +0 -33
  124. data/script/stats +0 -138
  125. data/script/tag +0 -25
  126. data/script/test +0 -36
@@ -1,6 +1,6 @@
1
1
  =begin rdoc
2
2
 
3
- = Attachment handling class
3
+ = Attachment handling file
4
4
 
5
5
  =end
6
6
 
@@ -1,9 +1,4 @@
1
- # = TITLE:
2
- #
3
- # Base64
4
- #
5
- # = COPYRIGHT:
6
- #
1
+ #--
7
2
  # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
8
3
  #
9
4
  # Permission is hereby granted, free of charge, to any person obtaining
@@ -27,10 +22,9 @@
27
22
  #
28
23
  # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
24
  # with permission of Minero Aoki.
30
-
31
- #
25
+ #++
26
+ #:stopdoc:
32
27
  module TMail
33
-
34
28
  module Base64
35
29
 
36
30
  module_function
@@ -48,5 +42,5 @@ module TMail
48
42
  end
49
43
 
50
44
  end
51
-
52
45
  end
46
+ #:startdoc:
@@ -1,17 +1,18 @@
1
- unless Enumerable.method_defined?(:map)
2
- module Enumerable
1
+ #:stopdoc:
2
+ unless Enumerable.method_defined?(:map)
3
+ module Enumerable #:nodoc:
3
4
  alias map collect
4
5
  end
5
6
  end
6
7
 
7
8
  unless Enumerable.method_defined?(:select)
8
- module Enumerable
9
+ module Enumerable #:nodoc:
9
10
  alias select find_all
10
11
  end
11
12
  end
12
13
 
13
14
  unless Enumerable.method_defined?(:reject)
14
- module Enumerable
15
+ module Enumerable #:nodoc:
15
16
  def reject
16
17
  result = []
17
18
  each do |i|
@@ -23,7 +24,7 @@ unless Enumerable.method_defined?(:reject)
23
24
  end
24
25
 
25
26
  unless Enumerable.method_defined?(:sort_by)
26
- module Enumerable
27
+ module Enumerable #:nodoc:
27
28
  def sort_by
28
29
  map {|i| [yield(i), i] }.sort.map {|val, i| i }
29
30
  end
@@ -31,9 +32,10 @@ unless Enumerable.method_defined?(:sort_by)
31
32
  end
32
33
 
33
34
  unless File.respond_to?(:read)
34
- def File.read(fname)
35
+ def File.read(fname) #:nodoc:
35
36
  File.open(fname) {|f|
36
37
  return f.read
37
38
  }
38
39
  end
39
40
  end
41
+ #:startdoc:
@@ -1,8 +1,3 @@
1
- =begin rdoc
2
-
3
- = Configuration Class
4
-
5
- =end
6
1
  #--
7
2
  # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
8
3
  #
@@ -28,7 +23,7 @@
28
23
  # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
24
  # with permission of Minero Aoki.
30
25
  #++
31
-
26
+ #:stopdoc:
32
27
  module TMail
33
28
 
34
29
  class Config
@@ -69,3 +64,4 @@ module TMail
69
64
  end
70
65
 
71
66
  end
67
+ #:startdoc:
@@ -1,14 +1,9 @@
1
- =begin rdoc
2
-
3
- = Ruby on Rails Core Extensions
4
-
5
- provides .blank?
6
-
7
- =end
8
- unless Object.respond_to?(:blank?) #:nodoc:
9
- # Check first to see if we are in a Rails environment, no need to
10
- # define these methods if we are
1
+ #:stopdoc:
2
+ unless Object.respond_to?(:blank?)
11
3
  class Object
4
+ # Check first to see if we are in a Rails environment, no need to
5
+ # define these methods if we are
6
+
12
7
  # An object is blank if it's nil, empty, or a whitespace string.
13
8
  # For example, "", " ", nil, [], and {} are blank.
14
9
  #
@@ -27,41 +22,42 @@ unless Object.respond_to?(:blank?) #:nodoc:
27
22
  end
28
23
  end
29
24
 
30
- class NilClass #:nodoc:
25
+ class NilClass
31
26
  def blank?
32
27
  true
33
28
  end
34
29
  end
35
30
 
36
- class FalseClass #:nodoc:
31
+ class FalseClass
37
32
  def blank?
38
33
  true
39
34
  end
40
35
  end
41
36
 
42
- class TrueClass #:nodoc:
37
+ class TrueClass
43
38
  def blank?
44
39
  false
45
40
  end
46
41
  end
47
42
 
48
- class Array #:nodoc:
43
+ class Array
49
44
  alias_method :blank?, :empty?
50
45
  end
51
46
 
52
- class Hash #:nodoc:
47
+ class Hash
53
48
  alias_method :blank?, :empty?
54
49
  end
55
50
 
56
- class String #:nodoc:
51
+ class String
57
52
  def blank?
58
53
  empty? || strip.empty?
59
54
  end
60
55
  end
61
56
 
62
- class Numeric #:nodoc:
57
+ class Numeric
63
58
  def blank?
64
59
  false
65
60
  end
66
61
  end
67
- end
62
+ end
63
+ #:startdoc:
@@ -1,7 +1,4 @@
1
- # = TITLE:
2
- #
3
- # Text Encoding class
4
- #
1
+ #--
5
2
  # = COPYRIGHT:
6
3
  #
7
4
  # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
@@ -27,14 +24,22 @@
27
24
  #
28
25
  # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
26
  # with permission of Minero Aoki.
30
-
27
+ #++
28
+ #:stopdoc:
31
29
  require 'nkf'
32
30
  require 'tmail/base64'
33
31
  require 'tmail/stringio'
34
32
  require 'tmail/utils'
33
+ #:startdoc:
35
34
 
36
35
 
37
36
  module TMail
37
+
38
+ #:stopdoc:
39
+ class << self
40
+ attr_accessor :KCODE
41
+ end
42
+ self.KCODE = 'NONE'
38
43
 
39
44
  module StrategyInterface
40
45
 
@@ -52,10 +57,34 @@ module TMail
52
57
  end
53
58
  module_function :create_dest
54
59
 
60
+ #:startdoc:
61
+ # Returns the TMail object encoded and ready to be sent via SMTP etc.
62
+ # You should call this before you are packaging up your email to
63
+ # correctly escape all the values that need escaping in the email, line
64
+ # wrap the email etc.
65
+ #
66
+ # It is also a good idea to call this before you marshal or serialize
67
+ # a TMail object.
68
+ #
69
+ # For Example:
70
+ #
71
+ # email = TMail::Load(my_email_file)
72
+ # email_to_send = email.encoded
55
73
  def encoded( eol = "\r\n", charset = 'j', dest = nil )
56
74
  accept_strategy Encoder, eol, charset, dest
57
75
  end
58
76
 
77
+ # Returns the TMail object decoded and ready to be used by you, your
78
+ # program etc.
79
+ #
80
+ # You should call this before you are packaging up your email to
81
+ # correctly escape all the values that need escaping in the email, line
82
+ # wrap the email etc.
83
+ #
84
+ # For Example:
85
+ #
86
+ # email = TMail::Load(my_email_file)
87
+ # email_to_send = email.encoded
59
88
  def decoded( eol = "\n", charset = 'e', dest = nil )
60
89
  # Turn the E-Mail into a string and return it with all
61
90
  # encoded characters decoded. alias for to_s
@@ -64,7 +93,7 @@ module TMail
64
93
 
65
94
  alias to_s decoded
66
95
 
67
- def accept_strategy( klass, eol, charset, dest = nil )
96
+ def accept_strategy( klass, eol, charset, dest = nil ) #:nodoc:
68
97
  dest ||= ''
69
98
  accept klass.new( create_dest(dest), charset, eol )
70
99
  dest
@@ -72,6 +101,7 @@ module TMail
72
101
 
73
102
  end
74
103
 
104
+ #:stopdoc:
75
105
 
76
106
  ###
77
107
  ### MIME B encoding decoder
@@ -90,8 +120,8 @@ module TMail
90
120
  }
91
121
 
92
122
  def self.decode( str, encoding = nil )
93
- encoding ||= (OUTPUT_ENCODING[$KCODE] || 'j')
94
- opt = '-m' + encoding
123
+ encoding ||= (OUTPUT_ENCODING[TMail.KCODE] || 'j')
124
+ opt = '-mS' + encoding
95
125
  str.gsub(ENCODED_WORDS) {|s| NKF.nkf(opt, s) }
96
126
  end
97
127
 
@@ -193,7 +223,7 @@ module TMail
193
223
 
194
224
  def initialize( dest = nil, encoding = nil, eol = "\r\n", limit = nil )
195
225
  @f = StrategyInterface.create_dest(dest)
196
- @opt = OPTIONS[$KCODE]
226
+ @opt = OPTIONS[TMail.KCODE]
197
227
  @eol = eol
198
228
  @folded = false
199
229
  @preserve_quotes = true
@@ -368,11 +398,16 @@ module TMail
368
398
  end
369
399
 
370
400
  def concat_A_S( types, strs )
401
+ if RUBY_VERSION < '1.9'
402
+ a = ?a; s = ?s
403
+ else
404
+ a = 'a'.ord; s = 's'.ord
405
+ end
371
406
  i = 0
372
407
  types.each_byte do |t|
373
408
  case t
374
- when ?a then add_text strs[i]
375
- when ?s then add_lwsp strs[i]
409
+ when a then add_text strs[i]
410
+ when s then add_lwsp strs[i]
376
411
  else
377
412
  raise "TMail FATAL: unknown flag: #{t.chr}"
378
413
  end
@@ -520,5 +555,5 @@ module TMail
520
555
  end
521
556
 
522
557
  end
523
-
558
+ #:startdoc:
524
559
  end # module TMail
@@ -1,11 +1,3 @@
1
- =begin rdoc
2
-
3
- = Header handling class
4
-
5
- =end
6
- # RFC #822 ftp://ftp.isi.edu/in-notes/rfc822.txt
7
- #
8
- #
9
1
  #--
10
2
  # Copyright (c) 1998-2003 Minero Aoki <aamine@loveruby.net>
11
3
  #
@@ -38,9 +30,10 @@ require 'tmail/parser'
38
30
  require 'tmail/config'
39
31
  require 'tmail/utils'
40
32
 
41
-
33
+ #:startdoc:
42
34
  module TMail
43
35
 
36
+ # Provides methods to handle and manipulate headers in the email
44
37
  class HeaderField
45
38
 
46
39
  include TextUtils
@@ -214,7 +207,11 @@ module TMail
214
207
 
215
208
  def comments
216
209
  ensure_parsed
217
- @comments
210
+ if @comments[0]
211
+ [Decoder.decode(@comments[0])]
212
+ else
213
+ @comments
214
+ end
218
215
  end
219
216
 
220
217
  private
@@ -1,3 +1,4 @@
1
+ #:stopdoc:
1
2
  # This is here for Rolls.
2
3
  # Rolls uses this instead of lib/tmail.rb.
3
4
 
@@ -5,4 +6,4 @@ require 'tmail/version'
5
6
  require 'tmail/mail'
6
7
  require 'tmail/mailbox'
7
8
  require 'tmail/core_extensions'
8
-
9
+ #:startdoc:
@@ -966,31 +966,33 @@ module TMail
966
966
  end
967
967
  end
968
968
 
969
- # Destructively convert the Mail object's body into a Base64 encoded email
969
+ # Convert the Mail object's body into a Base64 encoded email
970
970
  # returning the modified Mail object
971
971
  def base64_encode!
972
972
  store 'Content-Transfer-Encoding', 'Base64'
973
- self.body = Base64.folding_encode(self.body)
973
+ self.body = base64_encode
974
974
  end
975
975
 
976
- # ==Depreciation warning
977
- # base64_encode will return the body encoded, not modify the message body in
978
- # future versions of TMail
979
- alias :base64_encode :base64_encode!
976
+ # Return the result of encoding the TMail::Mail object body
977
+ # without altering the current body
978
+ def base64_encode
979
+ Base64.folding_encode(self.body)
980
+ end
980
981
 
981
- # Destructively convert the Mail object's body into a Base64 decoded email
982
+ # Convert the Mail object's body into a Base64 decoded email
982
983
  # returning the modified Mail object
983
984
  def base64_decode!
984
985
  if /base64/i === self.transfer_encoding('')
985
986
  store 'Content-Transfer-Encoding', '8bit'
986
- self.body = Base64.decode(self.body, @config.strict_base64decode?)
987
+ self.body = base64_decode
987
988
  end
988
989
  end
989
990
 
990
- # ==Depreciation warning
991
- # base64_decode will return the body decoded, not modify the message body in
992
- # future versions of TMail
993
- alias :base64_decode :base64_decode!
991
+ # Returns the result of decoding the TMail::Mail object body
992
+ # without altering the current body
993
+ def base64_decode
994
+ Base64.decode(self.body, @config.strict_base64decode?)
995
+ end
994
996
 
995
997
  # Returns an array of each destination in the email message including to: cc: or bcc:
996
998
  #
@@ -1 +1,3 @@
1
+ #:stopdoc:
1
2
  require 'tmail/mailbox'
3
+ #:startdoc:
@@ -28,22 +28,7 @@
28
28
  # Note: Originally licensed under LGPL v2+. Using MIT license for Rails
29
29
  # with permission of Minero Aoki.
30
30
  #++
31
- # == TMail::Mail
32
- # === Class Methods
33
- #
34
- #
35
- #
36
- #
37
- #
38
- #
39
- #
40
- #
41
- #
42
- #
43
- #
44
- #
45
- #
46
- #
31
+
47
32
 
48
33
 
49
34
  require 'tmail/interface'
@@ -58,23 +43,89 @@ require 'socket'
58
43
 
59
44
  module TMail
60
45
 
46
+ # == Mail Class
47
+ #
48
+ # Accessing a TMail object done via the TMail::Mail class. As email can be fairly complex
49
+ # creatures, you will find a large amount of accessor and setter methods in this class!
50
+ #
51
+ # Most of the below methods handle the header, in fact, what TMail does best is handle the
52
+ # header of the email object. There are only a few methods that deal directly with the body
53
+ # of the email, such as base64_encode and base64_decode.
54
+ #
55
+ # === Using TMail inside your code
56
+ #
57
+ # The usual way is to install the gem (see the {README}[link:/README] on how to do this) and
58
+ # then put at the top of your class:
59
+ #
60
+ # require 'tmail'
61
+ #
62
+ # You can then create a new TMail object in your code with:
63
+ #
64
+ # @email = TMail::Mail.new
65
+ #
66
+ # Or if you have an email as a string, you can initialize a new TMail::Mail object and get it
67
+ # to parse that string for you like so:
68
+ #
69
+ # @email = TMail::Mail.parse(email_text)
70
+ #
71
+ # You can also read a single email off the disk, for example:
72
+ #
73
+ # @email = TMail::Mail.load('filename.txt')
74
+ #
75
+ # Also, you can read a mailbox (usual unix mbox format) and end up with an array of TMail
76
+ # objects by doing something like this:
77
+ #
78
+ # # Note, we pass true as the last variable to open the mailbox read only
79
+ # mailbox = TMail::UNIXMbox.new("mailbox", nil, true)
80
+ # @emails = []
81
+ # mailbox.each_port { |m| @emails << TMail::Mail.new(m) }
82
+ #
61
83
  class Mail
62
84
 
63
85
  class << self
86
+
87
+ # Opens an email that has been saved out as a file by itself.
88
+ #
89
+ # This function will read a file non-destructively and then parse
90
+ # the contents and return a TMail::Mail object.
91
+ #
92
+ # Does not handle multiple email mailboxes (like a unix mbox) for that
93
+ # use the TMail::UNIXMbox class.
94
+ #
95
+ # Example:
96
+ # mail = TMail::Mail.load('filename')
97
+ #
64
98
  def load( fname )
65
99
  new(FilePort.new(fname))
66
100
  end
67
101
 
68
102
  alias load_from load
69
103
  alias loadfrom load
70
-
104
+
105
+ # Parses an email from the supplied string and returns a TMail::Mail
106
+ # object.
107
+ #
108
+ # Example:
109
+ # require 'rubygems'; require 'tmail'
110
+ # email_string =<<HEREDOC
111
+ # To: mikel@lindsaar.net
112
+ # From: mikel@me.com
113
+ # Subject: This is a short Email
114
+ #
115
+ # Hello there Mikel!
116
+ #
117
+ # HEREDOC
118
+ # mail = TMail::Mail.parse(email_string)
119
+ # #=> #<TMail::Mail port=#<TMail::StringPort:id=0xa30ac0> bodyport=nil>
120
+ # mail.body
121
+ # #=> "Hello there Mikel!\n\n"
71
122
  def parse( str )
72
123
  new(StringPort.new(str))
73
124
  end
74
125
 
75
126
  end
76
127
 
77
- def initialize( port = nil, conf = DEFAULT_CONFIG )
128
+ def initialize( port = nil, conf = DEFAULT_CONFIG ) #:nodoc:
78
129
  @port = port || StringPort.new
79
130
  @config = Config.to_config(conf)
80
131
 
@@ -90,6 +141,12 @@ module TMail
90
141
  }
91
142
  end
92
143
 
144
+ # Provides access to the port this email is using to hold it's data
145
+ #
146
+ # Example:
147
+ # mail = TMail::Mail.parse(email_string)
148
+ # mail.port
149
+ # #=> #<TMail::StringPort:id=0xa2c952>
93
150
  attr_reader :port
94
151
 
95
152
  def inspect
@@ -395,10 +452,12 @@ module TMail
395
452
  end
396
453
 
397
454
  def quoted_body
398
- parse_body
399
- @body_port.ropen {|f|
400
- return f.read
401
- }
455
+ body_port.ropen {|f| return f.read }
456
+ end
457
+
458
+ def quoted_body= str
459
+ body_port.wopen { |f| f.write str }
460
+ str
402
461
  end
403
462
 
404
463
  def body=( str )
@@ -420,8 +479,8 @@ module TMail
420
479
  str
421
480
  end
422
481
 
423
- alias preamble body
424
- alias preamble= body=
482
+ alias preamble quoted_body
483
+ alias preamble= quoted_body=
425
484
 
426
485
  def epilogue
427
486
  parse_body