にへるつおるぐ | src | ブログ | コンタクト | 統計 |

ソースコード・スクリプト・パッチ置き場

Items that do not fit in other categories

2017-01-03 18:12:14 JST-9 | akebia | General | コメント | トラックバック | 履歴

sdl2ics.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";

Comments

No comments yet

Add Comment

Trackback

このトラックバックURL(右クリックして、リンクのURLをコピー)を使ってこの記事にトラックバックを送ることができます。もしあなたのブログがトラックバック送信に対応していない場合にはこちらのフォームからトラックバックを送信することができます。トラックバックの手動送信に失敗したり、拒否された場合には、あけび猫が入力しますので、こちらまでご連絡下さい。重複したトラックバックは、自動的に1つにまとめられるようなので、気軽に色々試してみて下さい。


http://2hz.org/src/