View source for PIM VCard converter vcard2om.pl
From Openmoko
You do not have permission to edit this page, for the following reasons:
You can view and copy the source of this page:
Return to PIM VCard converter vcard2om.pl.
You do not have permission to edit this page, for the following reasons:
You can view and copy the source of this page:
Return to PIM VCard converter vcard2om.pl.
Tiis script comverts a VCard vcf-File from the SD card to an HTML-File visible with Midori.
input file; /media/card/pim/contacts.vcf outputfile: /home/root/.evolution/vCards.html
Change the filenames according to your location of VCF-files. The input file and the outputfile are defined in the first few lines of script mentioned below. The script converts the VCF into to a hash and with that you can export to any other file format (SQL command for importing in an sqllite database - this not implemented yet).
Create an icon by copying one midori.desktop to convertvcf.desktop and change the settings with nano editor. The Exec command is perl /home/root/bin/vcard2om.pl, if you store the script in your /home/root/bin/ directory (an other directory is possible too).
Install perl before with:
opkg install perl
Start the script with perl:
perl /home/root/bin/vcard2om.pl
If you want to copy the following script, go to edit of the page and copy the code of the script inbetween the PRE-Tags, because some characters are not shown as they should in the preview of this page. And now the script just for an overview:
#!/usr/bin/perl my %options = (); $options{infile} = "/media/card/pim/contacts.vcf"; $options{outfile} = "/home/root/.evolution/vCards.html"; my $outformat = "html"; #----------------------------------------------------------------- my $table_begin = "<table border='1'>"; my $table_end = "</table>"; my $row_head_begin = "<TR bgcolor=\"#C0C0C0\">"; my $row_head_end = "</TR>\n"; my $row_begin = "<tr>"; my $row_end = "</tr>"; my $col_begin = "<td><span style=\"font-size:0.3em\">"; my $col_end = "</span></td>"; my $newline = "<br>"; #----------------------------------------------------------------- my $flocking = 1; my @FileArray = (); my @OutFileArray = (); my %OutFileHash = (); my %OutNameHash = (); my $OUTFORMAT = uc($outformat); my @SplitArray = (); my @SplitArrayID = (); my @SplitArrayValue = (); my @IDarray = (); my %AdressHash = (); if( $options{"help"} ) { &usage("Parameter: --help"); } if( defined $options{"infile"} ) { &load_textfile($options{"infile"},\@FileArray); print "\n Input file: ".$options{"infile"}." loaded\n"; } else { &usage("ERROR: You must define an -infile=myfilename.vcf"); }; if( defined $options{"outfile"} ) { print "\n Output file: ".$options{"outfile"}." \n"; } else { &usage("ERROR: You must define an -outfile=myoutfilename.$outformat"); }; ####################################################################### print "\nStart parsing file...."; print "\n----------------------"; print "\n"; my $newID = ""; my $count = 0; foreach my $line (@FileArray) { if ( $line =~ /^BEGIN\:VCARD/ ) { $count = $count + 1; print "\nParse record $count " ; %AdressHash = (); } elsif ($line =~ /^VERSION\:/) { print "in $line"; } elsif ( $line =~ /^END\:VCARD/ ) { print "\ndone"; my $vID = $AdressHash{LastName}." ".$AdressHash{FirstName}; $OutFileHash{$vID} = &create_string_from_hash(\%AdressHash,$count); $OutNameHash{$vID} = &create_linklist_from_hash(\%AdressHash,$count); } else { ## EMAIL;INTERNET;WORK:themail@example.net @SplitArray = split(/\:/,$line); ## SplitArray[0]= EMAIL;INTERNET;WORK ## SplitArray[1]= themail@example.net ## Convert to HTML @SplitArrayID = split(/;/,$SplitArray[0]); ## SplitArray2[0]= EMAIL ## SplitArray2[1]= INTERNET ## SplitArray2[2]= WORKFile ## The Values could also be separated by ";" so split them into array of values @SplitArrayValue = split(/;/,$SplitArray[1]); $SplitArray[1] = &modify_fileline($SplitArray[1]); my $i = 0; foreach (@SplitArrayValue) { $SplitArrayValue[$i] = &modify_fileline($SplitArrayValue[$i]); $i+=1; }; &append_ID(\@IDarray,$SplitArray[0]); print "\n$count: $line"; ################################################## # Now we decide what to do with the vCard Content # everything is stored in the hash AdressHash e.g. # $AdressHash{LastName} = "Miller"; # $AdressHash{FirstName} = "Paul"; ################################################## #### e-Mail if ( $SplitArray[0] =~ /^EMAIL/ ) { $AdressHash{EMail} .= $SplitArray[1]; } elsif ($SplitArray[1] =~ /([a-zA_Z0-9\_\-\.]+@[a-zA_Z0-9\_\-\.]+)/) { $AdressHash{EMail} .= $1; $SplitArray[1] =~ s/[a-zA_Z0-9\_\-\.]+@[a-zA_Z0-9\_\-\.]+//g; }; #### LastName FirstName if ( $SplitArray[0] =~ /^N[;]*/ ) { $AdressHash{LastName} = $SplitArrayValue[0]; $AdressHash{FirstName} = $SplitArrayValue[1]; }; #### Adress if ( $SplitArray[0] =~ /^ADR[;]*/ ) { $AdressHash{Adress} = &convert_adress($SplitArray[1]); }; #### Fax and Phone if ( $SplitArray[0] =~ /FAX/ ) { $AdressHash{Fax} .= $SplitArrayValue[0]; } elsif ($SplitArray[0] =~ /TEL;WORK/) { $AdressHash{TelWork} .= $SplitArrayValue[0]; } elsif ( $SplitArray[0] =~ /TEL/ ) { if ($SplitArrayValue[0] =~ /^01/) { $AdressHash{Mobil} .= $SplitArrayValue[0]; } else { $AdressHash{Tel} .= $SplitArrayValue[0]; } }; ############################################################### }; ## main if-elsif-else }; ## end foreach @OutFileArray = ("<html>\n<head>\n","<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-1\"> ","\n<title>Contacts</title>\n</head>\n<body>","$table_begin"); my @OutFileIDs = keys(%OutFileHash); foreach my $vID (sort @OutFileIDs) { push(@OutFileArray,$OutNameHash{$vID}); }; push(@OutFileArray,"$table_end"); push(@OutFileArray,"<P></P>"); push(@OutFileArray,"$table_begin"); foreach my $vID (sort @OutFileIDs) { push(@OutFileArray,$OutFileHash{$vID}); }; push(@OutFileArray,"$table_end\n</body></html>"); &save_textfile($options{"outfile"},\@OutFileArray); ### print all tags used in the vCard file print "\n Output file: ".$options{"outfile"}." saved\n"; print "\nUsed ID in vCard file ".$options{infile}; print "\n".&create_array_line("",\@IDarray," "); print "\n"; #### END of Script ####################################################################### ####################################################################### # create a string from the content of the VCard hash record # this sub creates the HTML output of one VCard # modify this to create a SQL command or CSV from the hash ####################################################################### # sub create_string_from_hash { my ($ppHash,$pCount) = @_; ## p=Parameter,p=Pointer my $vReturnString = $row_head_begin; $vReturnString .= $col_begin."<A NAME=\"N$pCount\"><A HREF=\"#L$pCount\">".$ppHash->{LastName}. ", ".$ppHash->{FirstName}."</A>".$col_end; $vReturnString .= $row_head_end; if ($ppHash->{Tel} ne "") { $vReturnString .= $row_begin; $vReturnString .= $col_begin."Tel: ".$ppHash->{Tel}.$col_end; $vReturnString .= $row_end; }; if ($ppHash->{TelWork} ne "") { $vReturnString .= $row_begin; $vReturnString .= $col_begin."Work: ".$ppHash->{TelWork}.$col_end; $vReturnString .= $row_end; }; if ($ppHash->{Mobil} ne "") { $vReturnString .= $row_begin; $vReturnString .= $col_begin."Mobile: ".$ppHash->{Mobil}.$col_end; $vReturnString .= $row_end; }; if ($ppHash->{Fax} ne "") { $vReturnString .= $row_begin; $vReturnString .= $col_begin."Fax: ".$ppHash->{TelWork}.$col_end; }; if ($ppHash->{EMail} ne "") { $vReturnString .= $row_begin; $vReturnString .= $col_begin."e-Mail: ".$ppHash->{EMail}.$col_end; $vReturnString .= $row_end; }; if ($ppHash->{Adress} ne "") { $vReturnString .= $row_begin; $vReturnString .= $col_begin."Adr: ".$ppHash->{Adress}.$col_end; $vReturnString .= $row_end; }; return $vReturnString; } ####################################################################### # show the content of a hash as one line in a table ####################################################################### sub create_linklist_from_hash { my ($ppHash,$pCount) = @_; ## p=Parameter,p=Pointer my $vReturnString = $row_head_begin; $vReturnString .= $col_begin."<A NAME=\"L$pCount\"><A HREF=\"#N$pCount\">". $ppHash->{LastName}.", ".$ppHash->{FirstName}."</A>".$col_end; $vReturnString .= $row_head_end; return $vReturnString; } ################################################ ## usage is displayed, if no parameter inserted ################################################ sub usage { my $pOutput = ""; if (defined $_[0]) { $pOutput = $_[0]; }; select(STDERR); print <<EOUsage; $0 [options] Options: --help DFileisplay this help message --infile <filename> File that will be parsed in vCard format --outfile <filename> File that will be generated in $OUTFORMAT format $pOutput EOUsage exit(1); } ############################################################################## # void* load_textfile ($pFilename, \@Pointer_to_Array_of_Strings) ############################################################################## # sub load_textfile { my $pFilename = @_[0]; my $ppLines = @_[1]; if(!-e $pFilename) { print "\n ERROR\n$pFilename does not exist.\n"; exit(1); } else { open (LOADTEXTFILE, "<$pFilename") or print $!; if($flocking) {flock LOADTEXTFILE, 2;} @{$ppLines} = <LOADTEXTFILE>; if($flocking) {flock LOADTEXTFILE, 8;} close LOADTEXTFILE; foreach my $fileline(@{$ppLines}) { chop($fileline); chomp($fileline); } } } ############################################################################## # void* save_textfile ($pFilename, \@Pointer_to_Array_of_Strings) ############################################################################## # sub save_textfile { my $pFilename = $_[0]; my $ppLines = $_[1]; if ($pFilename eq "") { print "\n ERROR\nNo Filename specified in parameter (save_textfile():103.\n"; exit(1); } open (SAVETEXTFILE, ">$pFilename") or print $!; if($flocking) {flock SAVETEXTFILE, 2;} foreach my $fileline (@{$ppLines}) { print SAVETEXTFILE "$fileline\n"; }; if($flocking) {flock SAVETEXTFILE, 8;} close SAVETEXTFILE; } ################################################# # convert the content of addresses in the vCard record ################################################# sub convert_adress { my $pAddress = $_[0]; $pAddress =~ s/\\n/$newline/g; $pAddress =~ s/\\,/,/g; $pAddress =~ s/\\//g; $pAddress =~ s/\/$//g; $pAddress =~ s/ $//g; $pAddress =~ s/,$//g; return $pAddress; } ################################################# # Modify Fileline and return modified content # ################################################# sub modify_fileline { my $pFileLine = $_[0]; my $BakFileLine = $pFileLine; $pFileLine =~ s/^[ ;]+//g; $pFileLine =~ s/[;]+/, /g; $pFileLine =~ s/\\,$/,/g; $pFileLine =~ s/[ ,]+$//g; $pFileLine =~ s/[\\][n]$/$newline/g; #### CHANGE FILE ########################## $pFileLine =~ s/ä/ä/g; $pFileLine =~ s/ö/ö/g; $pFileLine =~ s/ü/ü/g; $pFileLine =~ s/Ä/Ä/g; $pFileLine =~ s/Ö/Ö/g; $pFileLine =~ s/Ü/Ü/g; $pFileLine =~ s/ß/ß/g; $pFileLine =~ s/´/'/g; ########################################### if ($BakFileLine ne $pFileLine) { print "\nCHANGES: ".$pFileLine."\n" }; return $pFileLine; } ####################################################################### #### append an ID to an array if the ID is not in the array ####################################################################### sub append_ID { my $ppArray = $_[0]; ## p=Parameter,p=Pointer my $pNewID = $_[1]; my $found = 0; #$pNewID =~ s/[^A-Za-z0-9 ]//g; foreach my $oldID (@{$ppArray}) { if ($pNewID eq $oldID) { $found = 1; } }; if ($found == 0) { push(@{$ppArray},$pNewID); } } #########################################################################