snbhsmt_log

ネットワークとコンピュータ、その他いろいろ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

iCalendar の繰り返し予定を作成

iCalendar の繰り返し予定を作成してみた。

Ruby の icalendar モジュールで、 RRULE は ical_multi_property (icalendar/component/event.rb) として 定義されているので add_rrule で指定する。 しかし、なぜ multi property なのか。 ical_multi_property は add_* で複数回指定でき、 追加された順にカンマで区切られて出力される。 BYDAY=MO,TU とか、カンマで区切られるから それらを別々に add しろって事なのか?

実際 add_rrule してみるとセミコロンとカンマがエスケープされてしまって具合が悪い。 だから Icalendar::Component#escape_chars() を定義し直して、 値が :FREQ で始まってたら RRULE の指定だと判断してカンマとセミコロンの エスケープをしない様にしてしまった。 行き当たりばったりな対応だけど、とりあえず動けばいい。

#!/usr/bin/ruby
# vi: ts=2

# iCalendar の繰り返し予定を 1 件作成

$KCODE = 'u'
require 'rubygems'
require 'icalendar'
require 'date'
require 'kconv'

module Icalendar
  class Component < Icalendar::Base
    # rrule の value のカンマ、セミコロンのエスケープを抑止する。
    # 注意: rrule の value かどうかを :FREQ で始まるかどうかで判定している。
    def escape_chars(value)
      if value =~ /^:FREQ/
        value.gsub("\\", "\\\\").gsub("\n", "\\n")
      else
        value.gsub("\\", "\\\\").gsub("\n", "\\n").gsub(",", "\\,").gsub(";", "\\;")
      end
    end
  end
end

cal = Icalendar::Calendar.new

# タイムゾーン (VTIMEZONE) を作成
cal.timezone do
  tzid 'Asia/Tokyo'
  standard do
    tzoffsetfrom '+0900'
    tzoffsetto   '+0900'
    dtstart      '19700101T000000'
    tzname       'JST'
  end
end

# 予定 (VEVENT) を作成
cal.event do
  # 日時
  dtstart     DateTime.new(2009,  4,  5, 23,  0)
  dtend       DateTime.new(2009,  4,  6,  0,  0)

  summary     "NHK総合「MUSIC JAPAN」".toutf8
  #description "".toutf8
  #klass       "PRIVATE"

  # 繰り返し
  add_rrule 'FREQ=WEEKLY;BYDAY=SU'      # 毎週日曜日
  #add_rrule 'FREQ=DAILY'                   # 毎日
  #add_rrule 'FREQ=DAILY;INTERVAL=2'        # 2日毎
  #add_rrule 'FREQ=DAILY;UNTIL=20090827'    # 2009/08/27 まで
  #add_rrule 'FREQ=WEEKLY;BYDAY=MO,TH'      # 毎週月曜と木曜
  #add_rrule 'FREQ=MONTHLY;BYDAY=2FR'       # 毎月第二金曜日
  #add_rrule 'FREQ=MONTHLY;BYMONTHDAY=10'   # 毎月10日
end

puts cal.to_ical

結果。
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
PRODID:iCalendar-Ruby
BEGIN:VEVENT
SEQUENCE:0
RRULE:FREQ=WEEKLY;BYDAY=SU
DTEND;TZID=Asia/Tokyo:20090406T000000
UID:2009-08-22T20:01:23+0900_349965836@localhost.localdomain
SUMMARY:NHK総合「MUSIC JAPAN」
DTSTART;TZID=Asia/Tokyo:20090405T230000
DTSTAMP:20090822T200123
END:VEVENT
BEGIN:VTIMEZONE
TZID:Asia/Tokyo
BEGIN:STANDARD
TZOFFSETTO:+0900
TZOFFSETFROM:+0900
DTSTART:19700101T000000
TZNAME:JST
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
スポンサーサイト

« Google カレンダでウェブから作成できない予定をインポート|Top|iCalendar のアラームの指定 »

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://snbhsmt.blog110.fc2.com/tb.php/117-53cce22f

Top

HOME

Author:snbhsmt
Google Profiles

http://www.ksky.ne.jp/~snbhsmt/

全ての記事を表示する

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。