ruby/sample/cal.rb

120 строки
2.5 KiB
Ruby
Исходник Обычный вид История

#! /usr/local/bin/ruby
# cal.rb: Written by Tadayoshi Funaba 1998, 1999
# $Id: cal.rb,v 1.6 1999/09/15 05:35:25 tadf Exp $
require 'date2'
$tab =
{
'cn' => true, # China
'de' => 2342032, # Germany (protestant states)
'dk' => 2342032, # Denmark
'es' => 2299161, # Spain
'fi' => 2361390, # Finland
'fr' => 2299227, # France
'gb' => 2361222, # United Kingdom
'gr' => 2423868, # Greece
'hu' => 2301004, # Hungary
'it' => 2299161, # Italy
'jp' => true, # Japan
'no' => 2342032, # Norway
'pl' => 2299161, # Poland
'pt' => 2299161, # Portugal
'ru' => 2421639, # Russia
'se' => 2361390, # Sweden
'us' => 2361222, # United States
'os' => false, # (old style)
'ns' => true # (new style)
}
$cc = 'gb'
def usage
$stderr.puts 'usage: cal [-c iso3166] [-jy] [[month] year]'
exit 1
end
def cal(m, y, sg)
for d in 1..31
break if jd = Date.exist?(y, m, d, sg)
end
fst = cur = Date.new1(jd, sg)
ti = Date::MONTHNAMES[m]
ti << ' ' << y.to_s unless $yr
mo = ti.center((($w + 1) * 7) - 1) << "\n"
mo << ['S', 'M', 'Tu', 'W', 'Th', 'F', 'S'].
collect{|x| x.rjust($w)}.join(' ') << "\n"
mo << ' ' * (($w + 1) * fst.wday)
while cur.mon == fst.mon
mo << (if $jd then cur.yday else cur.mday end).to_s.rjust($w)
mo << (if (cur += 1).wday != 0 then "\s" else "\n" end)
end
mo << "\n" * (6 - ((fst.wday + (cur - fst)) / 7))
mo
end
def zip(xs)
yr = ''
until xs.empty?
ln = (if $jd then l, r, *xs = xs; [l, r]
else l, c, r, *xs = xs; [l, c, r] end).
collect{|x| x.split(/\n/no, -1)}
8.times do
yr << ln.collect{|x|
x.shift.ljust((($w + 1) * 7) - 1)}.join(' ') << "\n"
end
end
yr
end
while /^-([^-].*)$/no =~ $*[0]
a = $1
if /^c(.+)?$/no =~ a
if $1
$cc = $1.downcase
elsif $*.length >= 2
$cc = $*[1].downcase
$*.shift
else
usage
end
else
a.scan(/./no) do |c|
case c
when 'j'; $jd = true
when 'y'; $yr = true
else usage
end
end
end
$*.shift
end
$*.shift if /^--/no =~ $*[0]
usage if (sg = $tab[$cc]).nil?
case $*.length
when 0
td = Date.today
m = td.mon
y = td.year
when 1
y = $*[0].to_i
$yr = true
when 2
m = $*[0].to_i
y = $*[1].to_i
else
usage
end
usage unless m.nil? or (1..12) === m
usage unless y >= -4712
$w = if $jd then 3 else 2 end
unless $yr
print cal(m, y, sg)
else
print y.to_s.center(((($w + 1) * 7) - 1) *
(if $jd then 2 else 3 end) +
(if $jd then 2 else 4 end)), "\n\n",
zip((1..12).collect{|m| cal(m, y, sg)}), "\n"
end