[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mhc:01627] Re: カレンダのフォーマット



From: Takashi Hiromatsu <takashi-hiromatsu@xxxxxxxxxxx> さん曰く
Subject: [mhc:01626] カレンダのフォーマット
Message-ID: <200209182319.g8INJJN07164@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 19 Sep 2002 08:17:36 +0900

こんにちは白井です。

広松> さて、本題ですが、カレンダのフォーマットについて2点お願いが有ります。
広松> 何れも、emacs上の、mhc-calendar 上での話です。
広松> 
広松> 1. 月曜日を週頭に持って来たい。
広松> 
広松>     仕事柄、ヨーロッパの方と付き合う事が多く、彼の地のデフォルトである、月
広松>     曜を週頭に持ってこれないでしょうか?

# 世の中そういうものなのですね。

広松>     emacs 付属の calendar では設定できる事を発見しました。Mhc-calendar も同
広松>     様かと思って、探したのですが、私の知識では無理でした。

そういう設定はないので作りました。CVS には commit しましたが、
diff をつけておきます。デフォルトは日曜日 = 0 からですが、
~/.emacs で

    (setq mhc-calendar-start-day-of-week 1)

とすれば月曜日からの表示になります。

# 意味があるかはわかりませんが、0〜6 の設定ができます。
# 初めて知ったのですが、西暦1年1月1日は月曜日なのですね。だから
# 月曜日からなんだろうなぁ。きっと。

広松> 2. CW を表示したい
広松> 
広松>     CW (Calendar week number) とは年初からの通算の週の番号で、ヨーロッパで
広松>     は、仕事のDue Date等を決めるときに良く使っています。一般的にカレンダに
広松>     も表示されています。慣れると、非常に便利なもので、ぜひ同じように表示さ
広松>     せたいのですが可能でしょうか。
広松> 
広松>     Emacs 付属のCalendarでは、8-column 表示は出来ないようですが、menu から 
広松>     goto ISO-date が選べるので、関数は持っているようです。

ISO っていうぐらいなのでちゃっと決まっているのだろうと調べたとこ
ろ、

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/35088

で以下の文章を見つけました。

ruby> (1)ISO 8601 規格では,週の最初の曜日が月曜とされています。
ruby> 
ruby> (2)「年の最初の週」は「少なくとも 4 日以上ある最初の週として定義され
ruby> る」。つまり「年の最初の日が金曜,土曜,または日曜である場合,その年の最
ruby> 初の 3 日,2 日,または 1 日に関しては,WeekOfTheYear は前年の最後の週を
ruby> 返します」。「年の最後の日が月曜,火曜,または水曜である場合,その年の最
ruby> 後の 1 日,2 日,または 3 日に関しては,WeekOfTheYear は 1(翌年の最初の
ruby> 週)を返します」。
ruby> 
ruby> --
ruby> 【ISO 8601 規格の「年の最初の週」】
ruby> N:\>ruby -rdate -e 'puts Date::new(2000,01,2).cweek'
ruby> 52
ruby> 
ruby> N:\>ruby -rdate -e 'puts Date::new(2002,12,30).cweek'
ruby> 1

ふむふむ。でもう少し調べたところ、

JISX> JIS X 0301
JISX> 
JISX> 日本工業規格 JIS X 0301-1992. 「日付及び時刻の表記」.
JISX> 
JISX> ISO 8601:1988 (Data elements and interchange formats --- Information interchange ---
JISX> Representation of dates and times) の翻訳.

ですって。今度読もう。ということは、01/01/1995 は日曜日だから、

[shirai@pepper:~/]% ruby -rdate -e 'puts Date::new(1995,01,01).cweek'
52
[shirai@pepper:~/]% ruby -rdate -e 'puts Date::new(1995,01,02).cweek'
1

世の中そんなものだったとは知りませんでした。なお、

広松>     因みに、表示は 8-column になり、
広松>         CW Mo Tu We Th Fr Sa Su
広松>     となります。

この形式で表示できるかどうかは、ちょっと不明(良く覚えていない)な
ので、最悪、

       August 2002 (30-35) <= ここのところ
      日 月 火 水 木 金 土
                   1  2  3
       4  5  6  7  8  9 10
      11 12 13 14 15 16 17
      18 19 20 21 22 23 24
      25 26 27 28 29 30 31

みたいになるかもしれませんが、少々(気長に?)お待ち下さい。

> 我侭ばかりで、申し訳ありませんが、よろしくお願いいたします。

## お客様は神様です。:-)

-- 
白井秀行 (mailto:shirai@xxxxxxxxxxxxx)
? cal.diff
Index: mhc-calendar.el
===================================================================
RCS file: /cvsroot/mhc/emacs/mhc-calendar.el,v
retrieving revision 1.29
diff -u -r1.29 mhc-calendar.el
--- mhc-calendar.el	2002/09/05 04:28:23	1.29
+++ mhc-calendar.el	2002/09/19 03:24:14
@@ -14,7 +14,33 @@
   :group 'mhc
   :type 'character)
 
-(defcustom mhc-calendar-day-strings ["Su" "Mo" "Tu" "We" "Th" "Fr" "Sa"]
+(defcustom mhc-calendar-start-day-of-week 0
+  "*Day of the week as the start of the week."
+  :group 'mhc
+  :type '(choice (const :tag "Sunday" 0)
+		 (const :tag "Monday" 1)
+		 (const :tag "Tuesday" 2)
+		 (const :tag "Wednesday" 3)
+		 (const :tag "Thursday" 4)
+		 (const :tag "Friday" 5)
+		 (const :tag "Saturday" 6)))
+
+(defcustom mhc-calendar-day-strings
+  (cond
+   ((= mhc-calendar-start-day-of-week 0)
+    ["Su" "Mo" "Tu" "We" "Th" "Fr" "Sa"])
+   ((= mhc-calendar-start-day-of-week 1)
+    ["Mo" "Tu" "We" "Th" "Fr" "Sa" "Su"])
+   ((= mhc-calendar-start-day-of-week 2)
+    ["Tu" "We" "Th" "Fr" "Sa" "Su" "Mo"])
+   ((= mhc-calendar-start-day-of-week 3)
+    ["We" "Th" "Fr" "Sa" "Su" "Mo" "Tu"])
+   ((= mhc-calendar-start-day-of-week 4)
+    ["Th" "Fr" "Sa" "Su" "Mo" "Tu" "We"])
+   ((= mhc-calendar-start-day-of-week 5)
+    ["Fr" "Sa" "Su" "Mo" "Tu" "We" "Th"])
+   (t
+    ["Sa" "Su" "Mo" "Tu" "We" "Th" "Fr"]))
   "*Vector of \"day of week\" for 3-month calendar header.
 This vector must have seven elements
 and each element must have \"strings of two columns\".
@@ -357,9 +383,14 @@
       (mhc-misc-insert-rectangle rect))))
 
 (defun mhc-calendar-make-header (date)
-  (mhc-date-format date "   %s %04d"
-		   (mhc-date-digit-to-mm-string mm t) yy))
-
+  (let ((ret (mhc-date-format date "%s %04d"
+			      (mhc-date-digit-to-mm-string mm t) yy)))
+    (if (mhc-date-yymm= (mhc-date-now) date)
+	(mhc-face-put
+	 ret (mhc-face-get-today-face 'mhc-calendar-face-saturday))
+      (mhc-face-put ret 'mhc-calendar-face-saturday))
+    (concat "   " ret)))
+  
 (defun mhc-calendar-make-header-ja (date)
   (let ((ret (mhc-date-format date "%04d年%2d月" yy mm)))
     (if (mhc-date-yymm= (mhc-date-now) date)
@@ -377,11 +408,16 @@
 		      (concat separator " "
 			      (funcall mhc-calendar-header-function
 				       (or date today)))))
-	 (i (mhc-day-day-of-week (car days)))
-	 week color)
-    (while (> i 0)
-      (setq week (cons "  " week)
-	    i (1- i)))
+	 (endday (nth mhc-calendar-start-day-of-week '(6 0 1 2 3 4 5)))
+	 (start (mhc-day-day-of-week (car days)))
+	 (i 0) week color)
+    (unless (= endday 6)
+      (setq start (+ start 6))
+      (when (> start 6)
+	(setq start (- start 7))))
+    (while (< i start)
+      (setq week (cons "  " week))
+      (setq i (1+ i)))
     (while days
       (setq color
 	    (cond
@@ -398,7 +434,7 @@
 	(setq color (mhc-face-get-busy-face color)))
       (setq week (cons (format "%2d" (mhc-day-day-of-month (car days))) week))
       (when color (mhc-face-put (car week) color))
-      (when (= 6 (mhc-day-day-of-week (car days)))
+      (when (= endday (mhc-day-day-of-week (car days)))
 	(setq month (cons (mapconcat
 			   (function identity)
 			   (cons separator (nreverse week))