様々なカレンダーでの共通形式でもある iCalendar 形式のデータを、
携帯のスケジュールとして送る時に vCalendar 形式に変換する必要がある。
以前は、シコシコと変換してたけど、改めて iCalendar 関連の perl モジュールを
見ていたら、最近は完成度の高いモジュールが揃っている。
改めて書き直したら、実質20行未満になった。
#!/usr/bin/perl
use Jcode ;
use Text::vFile::asData ;
use MIME::QuotedPrint ;
$eol = "\r\n" ;
sub ical2vcal( $ ) {
my $fh = shift ;
my $data = Text::vFile::asData->new->parse( $fh ) ;
foreach $line ( Text::vFile::asData->generate_lines( $data ) ) {
# 必要に応じて文字列をQuotedPrintableに変換
if ( $line =~ /^(SUMMARY|LOCATION):(.*)$/ ) {
($key,$value) = ($1,$2) ;
## 無駄なコード変換だったので削除
# $line = "$key;ENCODING=QUOTED-PRINTABLE:"
# .encode_qp( Jcode->new( $value )->sjis , $eol ) ; $line = "$key;ENCODING=QUOTED-PRINTABLE:" .encode_qp( $value , $eol ) ; } elsif ( $line =~ /^(CATEGORIES):(.*)$/ ) { $line = "CATEGORIES:MISCELLANEOUS" ; } elsif ( $line =~ /^(SEQUENCE|CLASS|STATUS|TRANSP):(.*)$/ ) { $line = "" ; } print "$line$eol" if ( $line ne "" ) ; } } if ( @ARGV > 0 ) { foreach $file ( @ARGV ) { open my $fh , $file or die "Can't open file:$!" ; ical2vcal( $fh ) ; close $fh ; } } else { ical2vcal( STDIN ) ; }
追記:携帯に送ると、CATEGORIES,SEQUENCEなどが問題となったので処理を追加。