home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ruby164.zip / rbemx164.zip / ruby / share / doc / ruby-1.6.4 / sample / cal.rb < prev    next >
Text File  |  2001-06-18  |  2KB  |  112 lines

  1. #! /usr/bin/env ruby
  2.  
  3. # cal.rb: Written by Tadayoshi Funaba 1998-2000
  4. # $Id: cal.rb,v 1.11 2000-07-16 10:28:50+09 tadf Exp $
  5.  
  6. require 'date2'
  7. require 'getopts'
  8.  
  9. $tab =
  10. {
  11.   'cn' => true,    # China
  12.   'de' => 2342032, # Germany (protestant states)
  13.   'dk' => 2342032, # Denmark
  14.   'es' => 2299161, # Spain
  15.   'fi' => 2361390, # Finland
  16.   'fr' => 2299227, # France
  17.   'gb' => 2361222, # United Kingdom
  18.   'gr' => 2423868, # Greece
  19.   'hu' => 2301004, # Hungary
  20.   'it' => 2299161, # Italy
  21.   'jp' => true,    # Japan
  22.   'no' => 2342032, # Norway
  23.   'pl' => 2299161, # Poland
  24.   'pt' => 2299161, # Portugal
  25.   'ru' => 2421639, # Russia
  26.   'se' => 2361390, # Sweden
  27.   'us' => 2361222, # United States
  28.   'os' => false,   # (old style)
  29.   'ns' => true     # (new style)
  30. }
  31.  
  32. $cc = 'gb'
  33.  
  34. def usage
  35.   $stderr.puts 'usage: cal [-c iso3166] [-jmty] [[month] year]'
  36.   exit 1
  37. end
  38.  
  39. def pict(y, m, sg)
  40.   d = (1..31).detect{|d| Date.exist?(y, m, d, sg)}
  41.   fi = Date.new(y, m, d, sg)
  42.   fi -= (fi.jd - $k + 1) % 7
  43.  
  44.   ve  = (fi..fi +  6).collect{|cu|
  45.     %w(S M Tu W Th F S)[cu.wday]
  46.   }
  47.   ve += (fi..fi + 41).collect{|cu|
  48.     if cu.mon == m then cu.send($da) end.to_s
  49.   }
  50.  
  51.   ve = ve.collect{|e| e.rjust($dw)}
  52.  
  53.   gr = group(ve, 7)
  54.   gr = trans(gr) if $OPT_t
  55.   ta = gr.collect{|xs| xs.join(' ')}
  56.  
  57.   ca = %w(January February March April May June July
  58.       August September October November December)[m - 1]
  59.   ca = ca + ' ' + y.to_s if not $OPT_y
  60.   ca = ca.center($mw)
  61.  
  62.   ta.unshift(ca)
  63. end
  64.  
  65. def group(xs, n)
  66.   (0..xs.size / n - 1).collect{|i| xs[i * n, n]}
  67. end
  68.  
  69. def trans(xs)
  70.   (0..xs[0].size - 1).collect{|i| xs.collect{|x| x[i]}}
  71. end
  72.  
  73. def unite(xs)
  74.   if xs.empty? then [] else xs[0] + unite(xs[1..-1]) end
  75. end
  76.  
  77. def block(xs, n)
  78.   unite(group(xs, n).collect{|ys| trans(ys).collect{|zs| zs.join('  ')}})
  79. end
  80.  
  81. def unlines(xs)
  82.   xs.collect{|x| x + "\n"}.join
  83. end
  84.  
  85. usage unless getopts('jmty', "c:#{$cc}")
  86.  
  87. y, m = ARGV.indexes(1, 0).compact.collect{|x| x.to_i}
  88. $OPT_y ||= (y and not m)
  89.  
  90. to = Date.today
  91. y ||= to.year
  92. m ||= to.mon
  93.  
  94. usage unless m >= 1 and m <= 12
  95. usage unless y >= -4712
  96. usage unless sg = $tab[$OPT_c]
  97.  
  98. $dw = if $OPT_j then 3 else 2 end
  99. $mw = ($dw + 1) * 7 - 1
  100. $mn = if $OPT_j then 2 else 3 end
  101. $tw = ($mw + 2) * $mn - 2
  102.  
  103. $k  = if $OPT_m then 1 else 0 end
  104. $da = if $OPT_j then :yday else :mday end
  105.  
  106. print (if not $OPT_y
  107.      unlines(pict(y, m, sg))
  108.        else
  109.      y.to_s.center($tw) + "\n\n" +
  110.        unlines(block((1..12).collect{|m| pict(y, m, sg)}, $mn)) + "\n"
  111.        end)
  112.