changeset 10:1a68139a269f

*** empty log message ***
author kono
date Wed, 22 Mar 2006 22:12:25 +0900
parents 798ba47e8046
children d8035079fa42
files Calcon.pm README calcon.pl pool.pl
diffstat 4 files changed, 246 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/Calcon.pm	Sun Oct 16 15:42:04 2005 +0900
+++ b/Calcon.pm	Wed Mar 22 22:12:25 2006 +0900
@@ -3231,6 +3231,241 @@
     $self->print("\n");
 }
 
+package Calcon::Vcard_N702iD_write;
+use strict;
+# use warnings;
+use NKF;
+
+# VCARD 形式
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+@ISA = ( 'Calcon::Vcard_write' );
+
+# Q encoded Shift_JIS
+#
+
+sub initialize {
+    my ($self) = @_;
+    $self->SUPER::initialize();
+    $self->{'vcs_count'} = "PIM00001";
+#    open(OUTPUT,"| nkf -w16") or die("nkf required.");
+#    select OUTPUT;
+}
+
+sub print {
+    my ($self,@data) = @_;
+    foreach (@data) {
+	chop;
+	print "$_\r\n";
+    }
+}
+
+sub vcard {
+    my ($self,$keys,$record) = @_;
+    my (%record) = %{$record};
+    my $data;
+    $self->{'item'} = 1;
+    $self->{'vcs_count'}++;
+    open(OUTPUT,"| nkf -s >".$self->{'vcs_count'}.".VCF");
+    select OUTPUT;
+
+    if(defined($record{'office'})) {
+	$record{'office'} = 'etc' if(! $record{'office'}) ;
+    }
+    if(defined($record{'name-yomi'})) {
+	$record{'name-yomi'} =~ s/^ *//;
+    }
+    if(defined($record{'office-yomi'})) {
+	$record{'office-yomi'} =~ s/^ *//;
+    }
+    $self->print("BEGIN:VCARD\n");
+    $self->print("VERSION:2.1\n");
+    if(defined $record{'name'}) {
+	$data =  $record{'name'};
+	$self->print("N;CHARSET=SHIFT_JIS:$data;;;;\n") if($data);
+	if(defined $record{'name-yomi'}) {
+	    $self->print("SOUND;X-IRMC-N;CHARSET=SHIFT_JIS:$record{'name-yomi'};;;;\n");
+	}
+
+	# print "fn:$data\n" if($data);
+	# if(defined $record{'office'}) {
+	#     $data = $data.";".$record{'office'};
+	# }
+	# print "n:$data\n" if($data);
+    }
+#    my $cat = 0;
+#    if(defined $record{'group'}) {
+#	 $data = "$record{'group'}";
+#	$self->print("CATEGORIES:$data\n") if($data);
+#    }
+#    if(defined $record{'office'}) {
+#	 $data = "$record{'office'}";
+#	$self->print("ORG:$data;\n") if($data);
+#	if ($cat==0) {
+#	    $self->print("CATEGORIES:$data\n") if($data);
+#	}
+#    }
+#    my $title;
+#    if(defined $record{'section'}) {
+#	$title = $record{'section'};
+#    }
+#    if(defined $record{'title'}) {
+#	 $title .= ($title?'\n':'')."$record{'title'}";
+#	$self->print("title:$data\n") if($data);
+#    }
+    if(defined $record{'address'}) {
+	my $i = $self->{'item'}++;
+	my ($adr1 , $adr2 , $adr_state , $adr_zip , $adr_country ); 
+	$adr1 = $adr2 = $adr_state = $adr_zip = $adr_country = '';
+	$data =  $record{'address'};
+	$adr1 =  $record{'address'};
+# ADD:番地;;町村;沖縄;903-0213;日本
+	if(defined $record{'zip'}) {
+	    $adr_zip = $record{'zip'};
+	}
+$self->print("ADR;CHARSET=SHIFT_JIS;HOME:;adr1;$adr2;$adr_state;;$adr_zip;");
+
+    }
+    if(defined $record{'tel'}) {
+	# my $i = $self->{'item'}++;
+	$data =  $record{'tel'};
+	$self->print("TEL;VOICE:$data\n") if($data);
+    } elsif(defined $record{'mobile-tel'}) {
+	# my $i = $self->{'item'}++;
+	$data =  $record{'mobile-tel'};
+	$self->print("TEL;VOICE:$data\n") if($data);
+    } elsif(defined $record{'home-tel'}) {
+	# my $i = $self->{'item'}++;
+	$data =  $record{'tel'};
+	$self->print("TEL;VOICE:$data\n") if($data);
+    } elsif(defined $record{'tel2'}) {
+	# my $i = $self->{'item'}++;
+	$data =  $record{'tel2'};
+	$self->print("TEL;VOICE:$data\n") if($data);
+    }
+#    if(defined $record{'fax'}) {
+#	# my $i = $self->{'item'}++;
+#	$data =  $record{'fax'};
+#	$self->print( "TEL;type=FAX:$data\n") if($data);
+#    }
+#    if(defined $record{'home-address'}) {
+#	my $i = $self->{'item'}++;
+#	my ($adr1 , $adr2 , $adr_state , $adr_zip , $adr_country ); 
+#	$adr1 = $adr2 = $adr_state = $adr_zip = $adr_country = '';
+#	$data =  $record{'home-address'};
+#	$adr1 =  $record{'home-address'};
+# ADD:番地;;町村;沖縄;903-0213;日本
+#	if(defined $record{'home-zip'}) {
+#	    $adr_zip = $record{'home-zip'};
+#	}
+#$self->print("item$i.ADR;type=home;type=pref:;;$adr1;$adr2;$adr_state;$adr_zip;$adr_country\n") if ($data);
+	# $self->print("item$1.X-ABADR:ja\n") if ($data);
+#    }
+    if(defined $record{'mail2'}) {
+	# my $i = $self->{'item'}++;
+	$data =  $record{'mail2'};
+	$self->print("EMAIL;INTERNET:$data\n") if($data);
+    } elsif(defined $record{'mail'}) {
+	# my $i = $self->{'item'}++;
+	$data =  $record{'mail'};
+	$self->print("EMAIL;INTERNET:$data\n") if($data);
+    } 
+    if(defined $record{'birth'}) {
+	$data =  $record{'birth'};
+	$self->print("BDAY:".$data->date()."\n") if($data);
+    }
+    if(defined $record{'memo'}) {
+	$data =  $record{'memo'};
+	$self->print("NOTE;CHARSET=SHIFT_JIS::$data\n") if($data);
+    }
+#    if(defined $record{'name-yomi'}) {
+#	$data =  $record{'name-yomi'};
+#	$self->print "x-custom1:$data\n" if($data);
+#    }
+#    if(defined $record{'office-yomi'}) {
+#	$data =  $record{'office-yomi'};
+#	$self->print "x-custom2:$data\n" if($data);
+#    }
+    $self->print("END:VCARD\n");
+    $self->print("\n");
+}
+
+sub vcal {
+    my ($self,$keys,$record) = @_;
+    my (%record) = %{$record};
+    my $data;
+
+    my $timezone = "Asia/Tokyo";
+    $self->{'vcs_count'}++;
+    open(OUTPUT,"|nkf -s >".$self->{'vcs_count'}.".VCS");
+    select OUTPUT;
+
+    if (! $self->{'-vcal-opening'}) {
+    print(<<"EOFEOF");
+BEGIN:VCALENDAR
+VERSION:1.0
+EOFEOF
+	$self->{'-vcal-opening'} = 1;
+    }
+
+    if ($record{'date'}->is_allday() && $self->{'-fake-allday'}) {
+	$record{'date'}=$record{'date'}->add($self->{'-time-for-allday'});
+    }
+    my $dtstart = "\nDTSTART:".$self->date($record{'date'});
+    my $dtend = '';
+    my $dtstamp = '';
+
+    if (! defined( $record{'end-date'}) || $record{'end-date'} == $record{'date'} ) {
+	# $dtend = "\nDURATION:PT2H";  this is useless for iCal
+	$record{'end-date'} = $record{'date'}->add(
+	    $self->{'-add-time-for-allday'});
+	$dtend = "\nDTEND:".$self->date($record{'end-date'});
+    } else {
+	$dtend = "\nDTEND:".$self->date($record{'end-date'});
+    }
+    if (defined( $record{'modify-date'})) {
+	$dtstamp = "\nDTSTAMP:".$self->date($record{'modify-date'});
+    }
+
+    my $summary = '';
+    my $description = '';
+    if (defined($record{'memo'})) {
+	$summary = $record{'memo'};
+	$summary =~ s/[\r\n].*$//; $description = $&;
+
+	$description =~ s/[\n\r]/\n /mg; 
+	$description =~ s/\s*$//;  
+	$summary =~ s/[\n\r]/ /mg; 
+	$summary =~ s/\s*$//;  
+    }
+
+    if ($description eq $summary) {
+	$description = "";
+    } else {
+	if ($description) {
+	    $description = "\nDESCRIPTION;CHARSET=SHIFT_JIS: $description";
+	}
+    }
+    return if (! $description && ! $summary );
+
+#     DURATION:PT1H = "DURATION:PT1H";
+#     X-WR-CALNAME;VALUE=TEXT:ホーム
+#     X-WR-TIMEZONE;VALUE=TEXT:Asia/Tokyo
+# SEQUENCE:$i
+
+# SUMMARY;CHARSET=SHIFT_JIS;ENCODING=QUOTED-PRINTABLE:=82=A9=82=A4
+    $self->print(<<"EOFEOF");
+BEGIN:VEVENT
+SUMMARY;CHARSET=SHIFT_JIS:$summary$dtstart$dtend$description$dtstamp
+CLASS:PUBLIC
+CATEGORIES:PERSONAL
+RRULE:
+END:VEVENT
+END:VCALENDAR
+EOFEOF
+#    print "\n";
+}
+
 #######################################################################/
 
 package Calcon::File_read;
--- a/README	Sun Oct 16 15:42:04 2005 +0900
+++ b/README	Wed Mar 22 22:12:25 2006 +0900
@@ -38,6 +38,7 @@
            VCARD 
     'SLA300'	=> 'Calcon::Sla300_write',
            リナックスザウルス
+  'Address Book'=> 'Calcon::Vcard_Apple_write',
   'AppleScript'	=> 'Calcon::iApp_write',
     'iApp' 	=> 'Calcon::iApp_write',
            Mac OS X のiCal, Address Book, Applescript 経由です
@@ -59,15 +60,18 @@
 
 例題
     Xcalendar から iCal にアップルスクリプト経由でデータを移動
-	perl -f x -t i ~/Calendar
+	perl calcon.pl -f x -t i ~/Calendar
     Zaurus CFカードから、vcard format を生成
-	perl -f z -t v /Voluemes/NO_NAME/__zaurus/S*.BOX > all.vcs
-	perl -f z -t v /Voluemes/NO_NAME/__zaurus/A*.BOX > all.vcf
+	perl calcon.pl -f z -t v /Voluemes/NO_NAME/__zaurus/S*.BOX > all.vcs
+	perl calcon.pl -f z -t v /Voluemes/NO_NAME/__zaurus/A*.BOX > all.vcf
+    自分のテキスト形式のアドレス帳からMac OS X の Address Book へ
+	perl calcon.pl  -t Add > all.vcf
+	open all.vcf
 
 tips
 
-    iCal に移す時には vcard 経由の方が高速です。
-    Address Book に移すときには、読みがなの関係でアップルスクリプトを使うべし。
+    Address Book, iCal に移す時には vcard 経由の方が高速です。
+    (旧)Address Book に移すときには、読みがなの関係でアップルスクリプトを使うべし。
 
     iCalは変な漢字コードに敏感で読み落すのではなくて読み落ちるようです。
     とりあえずは読んで欲しいよね。
--- a/calcon.pl	Sun Oct 16 15:42:04 2005 +0900
+++ b/calcon.pl	Wed Mar 22 22:12:25 2006 +0900
@@ -28,6 +28,7 @@
   'Entourage'	=> 'Calcon::Entourage_write',
     'Print'     => 'Calcon::Print_write',
     'File' 	=> 'Calcon::File_write',
+    'N702' 	=> 'Calcon::Vcard_N702iD_write',
 );
 
 use Getopt::Std;
--- a/pool.pl	Sun Oct 16 15:42:04 2005 +0900
+++ b/pool.pl	Wed Mar 22 22:12:25 2006 +0900
@@ -26,6 +26,7 @@
  'Address Book' => 'Calcon::Vcard_Apple_write',
   'Entourage'	=> 'Calcon::Entourage_write',
     'Print' 	=> 'Calcon::Print_write',
+    'N702' 	=> 'Calcon::Vcard_N702iD_write',
     'File' 	=> 'Calcon::File_write',
 );