にへるつおるぐ | src | ブログ | コンタクト | 統計 | | Login |
|
|
ソースコード・スクリプト・パッチ置き場 |
GeneralItems that do not fit in other categories sdl2ics.plsdl2ics.pl #!/usr/bin/perl # sdl2ics.pl 2017-1-3 by akebia # Calender.sdl to iCal converter # http://2hz.org/akebia/item/1030 use utf8; use Encode; use Data::ICal; use Data::ICal::Entry::Event; use Data::ICal::Entry::Todo; my @a = (), $w, $event = 0, $todo = 0, $due = 0, $comp = 0; foreach $_ (@ARGV[1..$#ARGV]) { if($_ =~ /^\d+$/){push(@a, $_); next;} $w = lc($_); if($w eq 'event'){$event = 1; next;} if($w eq 'todo'){$todo = 1; next;} if($w eq 'due'){$due = 1; next;} if($w eq 'completed'){$comp = 1; next;} if($w ne ''){die "'$w' is unknown option";} } my $sd = $a[0] ? $a[0] : '00000000'; my $ed = $a[1] ? $a[1] : '99999999'; @a = (); my $b = []; my $i, $fh, $fn = $ARGV[0]; open($fh, $fn) or die "$!"; binmode($fh); while(read($fh, $_, 2) == 2){ for($i = unpack("S<", $_); $i && read($fh, $_, 1); $i--){ $_ = $_ ne "\xff" ? unpack("C", $_) : read($fh, $_, 2) == 2 ? unpack("S<", $_) : 0; unless(read($fh, $_, $_)){$_ = "";} push(@$b, $_); } push(@a, $b); $b = []; } close($fh); my $y = shift(@a); splice(@$y, 0, 100); my $m = shift(@a); splice(@$m, 0, 100); my $d = shift(@a); splice(@$d, 0, 100); $b = shift(@a); splice(@$b, 0, 100); my $ic = Data::ICal->new, $ie; my $ymd, $c = 0; for($i = @$y; $i; $i--){ $ymd = sprintf('%02d%02d%02d', shift(@$y), shift(@$m), shift(@$d)); if($ymd lt $sd or $ymd gt $ed){shift(@$b); next;} $_ = decode('cp932', shift(@$b)); $_ =~ s/\r//g; if($_ =~ /([^\s ][^\n]*)/){$w = $1; $w =~ s/[\s ]+$//;}else{$w = '';} if($event){ $ie = Data::ICal::Entry::Event->new; $ie->add_properties( "UID" => "e$ymd\@$fn", "DTSTART" => ["$ymd", {"VALUE" => "DATE"}], "SUMMARY" => $w, "DESCRIPTION" => $_); $ic->add_entry($ie); $c++; } if($todo){ $ie = Data::ICal::Entry::Todo->new; $ie->add_properties( "UID" => "t$ymd\@$fn", "DTSTART" => ["$ymd", {"VALUE" => "DATE"}], "SUMMARY" => $w, "DESCRIPTION" => $_); $due and $ie->add_property("DUE" => ["$ymd", {"VALUE" => "DATE"}]); $comp and $ie->add_property("STATUS" => "COMPLETED"); $ic->add_entry($ie); $c++; } } binmode(STDOUT); print Encode::encode('utf8', $ic->as_string); print STDERR "$c item(s)\n"; CommentsNo comments yet
Add CommentTrackbackこのトラックバックURL(右クリックして、リンクのURLをコピー)を使ってこの記事にトラックバックを送ることができます。もしあなたのブログがトラックバック送信に対応していない場合にはこちらのフォームからトラックバックを送信することができます。トラックバックの手動送信に失敗したり、拒否された場合には、あけび猫が入力しますので、こちらまでご連絡下さい。重複したトラックバックは、自動的に1つにまとめられるようなので、気軽に色々試してみて下さい。 |