4.3. とりあえずカレンダー


今回はとりあえずカレンダーを作ってみました。
これだけだと余りにも味気ないのでまた後でいろいろと追加を行います。

-- プログラム 始まり -- test431.cgi

#!/usr/local/bin/ruby

print "Content-type: text/html\n\n"



print "<html><body>\n"



year = Time.now.year

month = Time.now.month



print "#{year}年 #{month}月<br>\n"

print "<table><tr>"



(1..31).each do |day|

  itsday = Time.local(year, month, day, 0, 0, 0)

  wday = itsday.wday



  if day == 1

    print"<td></td>" * wday

  elsif wday == 0

    print "<tr>"

  end



  if day > 28 && itsday.month != month

    break

  end



  print "<td>#{day}</td>"



  if wday == 6

    print "</tr>\n"

  end

end



print "</tr></table>\n"



print "</body></html>\n"

-- プログラム 終わり --

test431.cgiを作成して実行してみましょう。簡単なカレンダーが表示されますね。

このプログラムではHTMLのテーブルのタグを使って、カレンダーの表示を行います。1日から31日までをループさせて一日ずつ表示を行います。この際に曜日によってのテーブル内での場所の指定のようなことや、1日の前の部分の表示などを行っています。
それではプログラムを説明します。

1,2行目はお決まりです。
4行目はHTMLの先頭部分です。
6,7行目は現在の年と月をyear,monthという変数に代入しています。このようなTimeクラスの説明は組み込みクラスTimeを使うですでに説明しています。
9〜10行では現在の年、月の表示とカレンダーのテーブルのタグを表示しています。

12行目は1から31までのループを行っています。その際に1〜31の日付をdayという変数で扱います。このループの終わりは32行目のendです。ここではdoからendまでがループとなっています。これはそのまま{と}で置き返る事も可能です。
13行目はitsdayにdayでの日付のクラスを入れています。
14行目はwdayにdayの曜日を入れています。

16〜19行目ではもしdayは1(月の始め)だったらカレンダーの空きの部分を作成します。 17行目では""をwday個分表示しています。 18行目のelsifは16行目のifを満たしていなくてelsifの後を満たしていたら何々しろという命令です。ここではwdayが0(日曜日)だったら19行目(テーブルを次の列にしろという意味のタグ)を行います。

22〜24行目ではその月の終わりが31日より少ない場合の処理です。
dayが28より上でitsdayの月が今の月(month)と違ったらbreakでループを抜けています。
ここではTimeクラスがその月に存在しない日を使うとmonthが違う月を示すことを利用しています。 例えばTime.local(1999, 2, 30, 0, 0, 0).monthをするとその結果は3となります。

26行目ではdayを表示しています。

28〜30行目ではwdayが6(土曜日)だったら</tr>(テーブルの列を変えるタグ)を表示しています。

31行目は12行目のeachのループの終わりです。

33行目ではテーブルを閉じています。
34行目はHTMLの終了部分です。

とりあえずこれでカレンダーは出来たのですが次で別のアプローチでのカレンダーの作成を行ってみます。


今回始めて使った命令など

| | メニュー戻る | |

LinkExchange Japan
LinkExchange Japan Member