summaryrefslogtreecommitdiff
path: root/sample/from.rb
diff options
context:
space:
mode:
Diffstat (limited to 'sample/from.rb')
-rwxr-xr-xsample/from.rb102
1 files changed, 8 insertions, 94 deletions
diff --git a/sample/from.rb b/sample/from.rb
index f21b1d1..2f5fceb 100755
--- a/sample/from.rb
+++ b/sample/from.rb
@@ -1,97 +1,10 @@
#! /usr/local/bin/ruby
-module ParseDate
- MONTHS = {
- 'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4,
- 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8,
- 'sep' => 9, 'oct' =>10, 'nov' =>11, 'dec' =>12 }
- MONTHPAT = MONTHS.keys.join('|')
- DAYPAT = 'mon|tue|wed|thu|fri|sat|sun'
-
- def parsedate(date)
- if date.sub(/(#{DAYPAT})/i, ' ')
- dayofweek = $1
- end
- if date.sub(/\s+(\d+:\d+(:\d+)?)/, ' ')
- time = $1
- end
- if date =~ /19(\d\d)/
- year = $1
- end
- if date.sub(/\s*(\d+)\s+(#{MONTHPAT})\S*\s+/i, ' ')
- dayofmonth = $1
- monthname = $2
- elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\s+/i, ' ')
- monthname = $1
- dayofmonth = $2
- elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\D+/i, ' ')
- monthname = $1
- dayofmonth = $2
- elsif date.sub(/\s*(\d\d?)\/(\d\d?)/, ' ')
- month = $1
- dayofmonth = $2
- end
- if monthname
- month = MONTHS[monthname.tolower]
- end
- if ! year && date =~ /\d\d/
- year = $&
- end
- return year, month, dayofmonth
- end
-
-end
+require "parsedate"
+require "base64"
include ParseDate
-def decode64(str)
- e = -1;
- c = ","
- for line in str.split("\n")
- line.tr 'A-Za-z0-9+/', "\000-\377"
- line.each_byte { |ch|
- e+=1
- if e==0
- c = ch << 2
- elsif e==1
- c |= ch >>4
- string += [c].pack('c')
- c = ch << 4
- elsif e == 2
- c |= ch >> 2
- string += [c].pack('c');
- c = ch << 6
- elsif e==3
- c |= ch
- string += [c].pack('c')
- e = -1;
- end
- }
- end
- return string;
-end
-
-def j2e(str)
- while str =~ /\033\$B([^\033]*)\033\(B/
- s = $1
- pre, post = $`, $'
- s.gsub(/./) { |ch|
- (ch[0]|0x80).chr
- }
- str = pre + s + post
- end
- str
-end
-
-def decode_b(str)
- while str =~ /=\?ISO-2022-JP\?B\?(.*)=\?=/
- pre, post = $`, $'
- s = decode64($1)
- str = pre + s + post
- end
- j2e(str)
-end
-
if $ARGV[0] == '-w'
wait = TRUE
$ARGV.shift
@@ -100,7 +13,7 @@ end
class Mail
def Mail.new(f)
- if !f.is_kind_of(IO)
+ if !f.is_kind_of?(IO)
f = open(f, "r")
me = super
f.close
@@ -114,9 +27,9 @@ class Mail
@header = {}
@body = []
while f.gets()
- $_.chop
+ $_.chop!
continue if /^From / # skip From-line
- break if /^[ \t]*$/ # end of header
+ break if /^$/ # end of header
if /^(\S+):\s*(.*)/
@header[attr = $1.capitalize] = $2
elsif attr
@@ -149,17 +62,18 @@ $outcount = 0;
def fromout(date, from, subj)
return if !date
y = m = d = 0
+ esc = "\033\(B"
y, m, d = parsedate(date) if date
from = "sombody@somewhere" if ! from
subj = "(nil)" if ! subj
from = decode_b(from)
subj = decode_b(subj)
- printf "%-02d/%02d/%02d [%-28.28s] %-40.40s\n", y, m, d, from, subj
+ printf "%-02d/%02d/%02d [%-28.28s%s] %-40.40s%s\n",y,m,d,from,esc,subj,esc
$outcount += 1
end
for file in $ARGV
- continue if !File.exists(file)
+ continue if !File.exists?(file)
f = open(file, "r")
while !f.eof
mail = Mail.new(f)