# HG changeset patch # User kono # Date 1143033145 -32400 # Node ID 1a68139a269fde403892ba0e3d0d18773fbf63ce # Parent 798ba47e8046c7745042f5abb9bf88a562ca1465 *** empty log message *** diff -r 798ba47e8046 -r 1a68139a269f Calcon.pm --- 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; diff -r 798ba47e8046 -r 1a68139a269f README --- 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は変な漢字コードに敏感で読み落すのではなくて読み落ちるようです。 とりあえずは読んで欲しいよね。 diff -r 798ba47e8046 -r 1a68139a269f calcon.pl --- 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; diff -r 798ba47e8046 -r 1a68139a269f pool.pl --- 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', );