ruby-changes:3157
From: ko1@a...
Date: 25 Dec 2007 12:23:31 +0900
Subject: [ruby-changes:3157] naruse - Ruby:r14649 (trunk): * sample/from.rb: follow Ruby 1.9 libraries.
naruse 2007-12-25 12:23:15 +0900 (Tue, 25 Dec 2007) New Revision: 14649 Modified files: trunk/ChangeLog trunk/sample/from.rb Log: * sample/from.rb: follow Ruby 1.9 libraries. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14649&r2=14648 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/sample/from.rb?r1=14649&r2=14648 Index: ChangeLog =================================================================== --- ChangeLog (revision 14648) +++ ChangeLog (revision 14649) @@ -1,3 +1,7 @@ +Tue Dec 25 12:22:17 2007 NARUSE, Yui <naruse@r...> + + * sample/from.rb: follow Ruby 1.9 libraries. + Tue Dec 25 12:07:52 2007 Nobuyoshi Nakada <nobu@r...> * configure.in (BASERUBY): delayed error until BASERUBY is used. Index: sample/from.rb =================================================================== --- sample/from.rb (revision 14648) +++ sample/from.rb (revision 14649) @@ -1,98 +1,113 @@ #! /usr/local/bin/ruby -require "parsedate" +require "time" require "kconv" -require "mailread" -include ParseDate -include Kconv - class String - - def kconv(code = Kconv::EUC) - Kconv.kconv(self, code, Kconv::AUTO) - end - def kjust(len) - len += 1 - me = self[0, len].ljust(len) - if me =~ /.$/ and $&.size == 2 - me[-2..-1] = ' ' - me[-2, 2] = ' ' + res = '' + rlen = 0 + self.each_char do |char| + delta = char.bytesize > 1 ? 2 : 1 + break if rlen + delta > len + rlen += delta + res += char end - me.chop! + res += ' ' * (len - rlen) if rlen < len + res end - end -if ARGV[0] == '-w' - wait = true - ARGV.shift +def fromout(date, from, subj) + return 0 if !date + y, m, d = Time.parse(date).to_a.reverse[4, 3] if date + y ||= 0; m ||= 0; d ||= 0 + from ||= "sombody@somewhere" + from.delete!("\r\n") + from = from.kconv(Encoding.default_external).kjust(28) + subj ||= "(nil)" + subj.delete!("\r\n") + subj = subj.kconv(Encoding.default_external).kjust(40) + printf "%02d/%02d/%02d [%s] %s\n", y%100, m, d, from, subj + return 1 end -if ARGV.length == 0 - file = ENV['MAIL'] - user = ENV['USER'] || ENV['USERNAME'] || ENV['LOGNAME'] -else - file = user = ARGV[0] - ARGV.clear -end +def get_mailfile(user) + file = user + unless user + file = ENV['MAIL'] + user = ENV['USER'] || ENV['USERNAME'] || ENV['LOGNAME'] + end -if file == nil or !File.exist? file - [ENV['SPOOLDIR'], '/usr/spool', '/var/spool', '/usr', '/var'].each do |m| - if File.exist? f = "#{m}/mail/#{user}" - file = f - break + if file == nil or !File.exist?(file) + [ENV['SPOOLDIR'], '/usr/spool', '/var/spool', '/usr', '/var'].each do |m| + path = "#{m}/mail/#{user}" + if File.exist?(path) + file = path + break + end end end + file end -$outcount = 0; -def fromout(date, from, subj) - return if !date - y, m, d = parsedate(date) if date - y ||= 0; m ||= 0; d ||= 0 - if from - from.gsub! /\n/, "" - else - from = "sombody@somewhere" +def from_main + if ARGV[0] == '-w' + wait = true + ARGV.shift end - if subj - subj.gsub! /\n/, "" - else - subj = "(nil)" - end - if ENV['LANG'] =~ /sjis/i - lang = Kconv::SJIS - else - lang = Kconv::EUC - end - from = from.kconv(lang).kjust(28) - subj = subj.kconv(lang).kjust(40) - printf "%02d/%02d/%02d [%s] %s\n",y%100,m,d,from,subj - $outcount += 1 -end + file = get_mailfile(ARGV[0]) -if File.exist?(file) - atime = File.atime(file) - mtime = File.mtime(file) - f = open(file, "r") - begin - until f.eof? - mail = Mail.new(f) - fromout mail.header['Date'],mail.header['From'],mail.header['Subject'] + outcount = 0 + if File.exist?(file) + atime = File.atime(file) + mtime = File.mtime(file) + open(file, "r") do |f| + until f.eof? + header = {} + f.each_line do |line| + next if /^From / =~ line # skip From-line + break if /^$/ =~ line # end of header + + if /^(?<attr>\S+?):\s*(?<value>.*)/ =~ line + attr.capitalize! + header[attr] = value + elsif attr + header[attr] += "\n" + line.lstrip + end + end + + f.each_line do |line| + break if /^From / =~ line + end + outcount += fromout(header['Date'], header['From'], header['Subject']) + end end - ensure - f.close File.utime(atime, mtime, file) end + + if outcount == 0 + print "You have no mail.\n" + sleep 2 if wait + elsif wait + system "stty cbreak -echo" + $stdin.getc + system "stty cooked echo" + end end -if $outcount == 0 - print "You have no mail.\n" - sleep 2 if wait -elsif wait - system "stty cbreak -echo" - getc() - system "stty cooked echo" +if __FILE__ == $0 + from_main end + +__END__ + +=begin + += from.rb + +== USAGE + +ruby from.rb [-w] [username_or_filename] + +=end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml