<?xml version="1.0" encoding="EUC-JP" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>ruby-src:sample/cal.rb</title> <meta http-equiv="Content-type" content="text/html; charset=EUC-JP" /> <link href="default.css" type="text/css" rel="stylesheet" /> <link href="refm472.html" rel="next" /> <link href="refm470.html" rel="prev" /> <link href="index.html" rel="start" /> </head> <body> <div class="navigator"><span class="navigator">[<a href="index.html">MAIN</a>][<a href="refm482.html">INDEX</a>][<a href="refm483.html">KEYWORD</a>][<a href="refm594.html">METHOD</a>(<a href="refm633.html">NC</a>)] [<a href="index.html">TOP</a>][<a href="index.html">UP</a>][<a href="refm470.html"><-PREV</a>][<a href="refm472.html">NEXT-></a>]</span></div> <hr /> <h1>ruby-src:sample/cal.rb</h1> #!/usr/bin/env ruby<br /> <br /> # cal.rb: Written by Tadayoshi Funaba 1998-2004<br /> # $Id: cal.rb,v 2.7 2004-01-10 23:52:51+09 tadf Exp $<br /> <br /> require 'date'<br /> <br /> class Cal<br /> <br /> START =<br /> {<br /> 'cn' => true, # China<br /> 'de' => 2342032, # Germany (protestant states)<br /> 'dk' => 2342032, # Denmark<br /> 'es' => 2299161, # Spain<br /> 'fi' => 2361390, # Finland<br /> 'fr' => 2299227, # France<br /> 'gb' => 2361222, # United Kingdom<br /> 'gr' => 2423868, # Greece<br /> 'hu' => 2301004, # Hungary<br /> 'it' => 2299161, # Italy<br /> 'jp' => true, # Japan<br /> 'no' => 2342032, # Norway<br /> 'pl' => 2299161, # Poland<br /> 'pt' => 2299161, # Portugal<br /> 'ru' => 2421639, # Russia<br /> 'se' => 2361390, # Sweden<br /> 'us' => 2361222, # United States<br /> 'os' => false, # (old style)<br /> 'ns' => true # (new style)<br /> }<br /> <br /> DEFAULT_START = 'gb'<br /> <br /> def initialize<br /> opt_j; opt_m; opt_t; opt_y; opt_c<br /> end<br /> <br /> def opt_j(flag=false) @opt_j = flag end<br /> def opt_m(flag=false) @opt_m = flag end<br /> def opt_t(flag=false) @opt_t = flag end<br /> def opt_y(flag=false) @opt_y = flag end<br /> <br /> def opt_c(arg=DEFAULT_START) @start = START[arg] end<br /> <br /> def set_params<br /> @dw = if @opt_j then 3 else 2 end<br /> @mw = (@dw + 1) * 7 - 1<br /> @mn = if @opt_j then 2 else 3 end<br /> @tw = (@mw + 2) * @mn - 2<br /> @k = if @opt_m then 1 else 0 end<br /> @da = if @opt_j then :yday else :mday end<br /> end<br /> <br /> def pict(y, m)<br /> d = (1..31).detect{|d| Date.valid_date?(y, m, d, @start)}<br /> fi = Date.new(y, m, d, @start)<br /> fi -= (fi.jd - @k + 1) % 7<br /> <br /> ve = (fi..fi + 6).collect{|cu|<br /> %w(S M Tu W Th F S)[cu.wday]<br /> }<br /> ve += (fi..fi + 41).collect{|cu|<br /> if cu.mon == m then cu.send(@da) end.to_s<br /> }<br /> <br /> ve = ve.collect{|e| e.rjust(@dw)}<br /> <br /> gr = group(ve, 7)<br /> gr = trans(gr) if @opt_t<br /> ta = gr.collect{|xs| xs.join(' ')}<br /> <br /> ca = %w(January February March April May June July<br /> August September October November December)[m - 1]<br /> ca = ca + ' ' + y.to_s if not @opt_y<br /> ca = ca.center(@mw)<br /> <br /> ta.unshift(ca)<br /> end<br /> <br /> def group(xs, n)<br /> (0..xs.size / n - 1).collect{|i| xs[i * n, n]}<br /> end<br /> <br /> def trans(xs)<br /> (0..xs[0].size - 1).collect{|i| xs.collect{|x| x[i]}}<br /> end<br /> <br /> def stack(xs)<br /> if xs.empty? then [] else xs[0] + stack(xs[1..-1]) end<br /> end<br /> <br /> def block(xs, n)<br /> stack(group(xs, n).collect{|ys| trans(ys).collect{|zs| zs.join(' ')}})<br /> end<br /> <br /> def unlines(xs)<br /> xs.collect{|x| x + "\n"}.join<br /> end<br /> <br /> def monthly(y, m)<br /> unlines(pict(y, m))<br /> end<br /> <br /> def addmon(y, m, n)<br /> y, m = (y * 12 + (m - 1) + n).divmod(12)<br /> return y, m + 1<br /> end<br /> <br /> def yearly(y)<br /> y.to_s.center(@tw) + "\n\n" +<br /> unlines(block((0..11).collect{|n| pict(*addmon(y, 1, n))}, @mn)) + "\n"<br /> end<br /> <br /> def print(y, m)<br /> set_params<br /> if @opt_y then yearly(y) else monthly(y, m) end<br /> end<br /> <br /> end<br /> <br /> if __FILE__ == $0<br /> <br /> require 'getopts'<br /> <br /> def usage<br /> warn 'usage: cal [-c iso3166] [-jmty] [[month] year]'<br /> exit 1<br /> end<br /> <br /> usage unless getopts('jmty', "c:#{Cal::DEFAULT_START}")<br /> <br /> y, m = ARGV.values_at(1, 0).compact.collect{|x| x.to_i}<br /> $OPT_y ||= (y and not m)<br /> <br /> to = Date.today<br /> y ||= to.year<br /> m ||= to.mon<br /> <br /> usage unless m >= 1 and m <= 12<br /> usage unless y >= -4712<br /> usage if Cal::START[$OPT_c].nil?<br /> <br /> cal = Cal.new<br /> <br /> cal.opt_j($OPT_j)<br /> cal.opt_m($OPT_m)<br /> cal.opt_t($OPT_t)<br /> cal.opt_y($OPT_y)<br /> cal.opt_c($OPT_c)<br /> <br /> print cal.print(y, m)<br /> <br /> end<br /> <hr /> <div class="navigator"><span class="navigator">[<a href="index.html">MAIN</a>][<a href="refm482.html">INDEX</a>][<a href="refm483.html">KEYWORD</a>][<a href="refm594.html">METHOD</a>(<a href="refm633.html">NC</a>)] [<a href="index.html">TOP</a>][<a href="index.html">UP</a>][<a href="refm470.html"><-PREV</a>][<a href="refm472.html">NEXT-></a>]</span></div> </body> </html>