今月のカレンダーを Squeak Smalltalk で


プログラム演習、カレンダーを作れますか? - @author pyridoxin に対する Squeak Smalltalk を使った解答例。

結果はクリップボードに入るので、コードを評価(選択して do it (alt + d))後、適当な場所でペースト操作を行なってください。ペースト先が Squeak 環境内の場合は、日曜は赤、土曜は青で、前後の月の日は灰色に、当日は太字になります。

May 2008
 Su Mo Tu We Th Fr Sa
 27 28 29 30  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
| textColor today thisMonth stream font text |
today := Date today.
thisMonth := today month.
textColor := [:colorSym | TextColor color: (Color perform: colorSym)].
stream := WriteStream with: thisMonth printString asText.
stream cr.
stream nextPutAll: (' Su' asText addAttribute: (textColor value: #red)).
stream nextPutAll: ' Mo Tu We Th Fr'.
stream nextPutAll: (' Sa' asText addAttribute: (textColor value: #blue)).
thisMonth weeksDo: [:week |
    stream cr.
    week datesDo: [:date |
        | dateText |
        dateText := (date dayOfMonth printString forceTo: 3 paddingStartWith: $ ) asText.
        date = today ifTrue: [dateText addAttribute: TextEmphasis bold].
        #(Sunday red Saturday blue) pairsDo: [:wday :color |
            date weekday = wday ifTrue: [dateText addAttribute: (textColor value: color)]].
        date month = thisMonth ifFalse: [dateText addAttribute: (textColor value: #gray)].
        stream nextPutAll: dateText]].
font := (TextStyle named: #BitstreamVeraSansMono) defaultFont.
text := stream contents addAttribute: (TextFontReference toFont: font).
Clipboard clipboardText: text