PIM VCard converter vcard2om.pl

From Openmoko

(Difference between revisions)
Jump to: navigation, search
m (Start the Script)
m (Copy the Script in Edit Mode of this Page)
Line 58: Line 58:
 
   print "\n Output file:  ".$options{"outfile"}." \n";
 
   print "\n Output file:  ".$options{"outfile"}." \n";
 
} else {
 
} else {
&usage("ERROR: You must define an -outfile=myoutfilename.csv");
+
&usage("ERROR: You must define an -outfile=myoutfilename.$outformat");
 
};
 
};
 
#######################################################################
 
#######################################################################
Line 76: Line 76:
 
   } elsif ( $line =~ /^END\:VCARD/ ) {
 
   } elsif ( $line =~ /^END\:VCARD/ ) {
 
       print "\ndone";
 
       print "\ndone";
      #&show_hash(\%AdressHash,"Record $count");
 
 
       my $vID = $AdressHash{LastName}." ".$AdressHash{FirstName};
 
       my $vID = $AdressHash{LastName}." ".$AdressHash{FirstName};
 
       $OutFileHash{$vID} = &create_string_from_hash(\%AdressHash);
 
       $OutFileHash{$vID} = &create_string_from_hash(\%AdressHash);
Line 83: Line 82:
 
     @SplitArray = split(/\:/,$line);
 
     @SplitArray = split(/\:/,$line);
 
     ## SplitArray[0]= EMAIL;INTERNET;WORK
 
     ## SplitArray[0]= EMAIL;INTERNET;WORK
     ## SplitArray[0]= themail@example.net
+
     ## SplitArray[1]= themail@example.net
 
     ## Convert to HTML
 
     ## Convert to HTML
 
     @SplitArrayID = split(/;/,$SplitArray[0]);
 
     @SplitArrayID = split(/;/,$SplitArray[0]);
Line 89: Line 88:
 
     ## SplitArray2[1]= INTERNET
 
     ## SplitArray2[1]= INTERNET
 
     ## SplitArray2[2]= WORKFile
 
     ## SplitArray2[2]= WORKFile
 +
    ## The Values could also be separated by ";" so split them into array of values
 
     @SplitArrayValue = split(/;/,$SplitArray[1]);
 
     @SplitArrayValue = split(/;/,$SplitArray[1]);
 
     $SplitArray[1] = &modify_fileline($SplitArray[1]);
 
     $SplitArray[1] = &modify_fileline($SplitArray[1]);
Line 96: Line 96:
 
       $i+=1;
 
       $i+=1;
 
     };
 
     };
    ## The Values could also be separated by ";"
 
 
     &append_ID(\@IDarray,$SplitArray[0]);
 
     &append_ID(\@IDarray,$SplitArray[0]);
 
     print "\n$count: $line";
 
     print "\n$count: $line";
 
   ##################################################
 
   ##################################################
 
   # Now we decide what to do with the vCard Content  
 
   # Now we decide what to do with the vCard Content  
   # everything is stored in the hash AdressHash
+
   # everything is stored in the hash AdressHash e.g.
 +
  # $AdressHash{LastName}  = "Miller";
 +
  # $AdressHash{FirstName} = "Paul";
 
   ##################################################
 
   ##################################################
 
   # e-Mail
 
   # e-Mail
Line 117: Line 118:
 
   # Adress
 
   # Adress
 
     if ( $SplitArray[0] =~ /^ADR[;]*/ ) {
 
     if ( $SplitArray[0] =~ /^ADR[;]*/ ) {
        $SplitArray[1] =~ s/\\n/$newline/g;
+
  $AdressHash{Adress}    = &convert_adress($SplitArray[1]);
$SplitArray[1] =~ s/\\,/,/g;
+
        $SplitArray[1] =~ s/\\//g;
+
        $SplitArray[1] =~ s/\/$//g;
+
$SplitArray[1] =~ s/ $//g;
+
$SplitArray[1] =~ s/,$//g;
+
$AdressHash{Adress}    = $SplitArray[1];
+
 
     };
 
     };
 
   # Fax and Phone
 
   # Fax and Phone
Line 142: Line 137:
 
","\n<title>Contacts</title>\n</head>\n<body>","$table_begin");
 
","\n<title>Contacts</title>\n</head>\n<body>","$table_begin");
 
my @OutFileIDs = keys(%OutFileHash);
 
my @OutFileIDs = keys(%OutFileHash);
 +
### $OutFileHash("Miller Paul") contain the converted vCard record of e.g. Paul Miller
 +
### Sort the hash IDs (i.e. Names) in alphabetical order
 
foreach my $vID (sort @OutFileIDs) {
 
foreach my $vID (sort @OutFileIDs) {
 
     push(@OutFileArray,$OutFileHash{$vID});
 
     push(@OutFileArray,$OutFileHash{$vID});
 
};
 
};
 +
### push the last HTML line
 
push(@OutFileArray,"$table_end\n</body></html>");
 
push(@OutFileArray,"$table_end\n</body></html>");
 
&save_textfile($options{"outfile"},\@OutFileArray);
 
&save_textfile($options{"outfile"},\@OutFileArray);
 +
### print all tags used in the vCard file
 
print "\n Output file:  ".$options{"outfile"}." saved\n";
 
print "\n Output file:  ".$options{"outfile"}." saved\n";
 
print "\nUsed ID in vCard file ".$options{infile};
 
print "\nUsed ID in vCard file ".$options{infile};
#@IDarray = ("ID1","ID2","ID3");
 
 
print "\n".&create_array_line("",\@IDarray," ");
 
print "\n".&create_array_line("",\@IDarray," ");
 
print "\n";
 
print "\n";
Line 155: Line 153:
 
   
 
   
 
#######################################################################
 
#######################################################################
# show the content of an array as one line splitted in table elements
+
# create a string from the content the hash of on VCard record
 
#######################################################################
 
#######################################################################
 
sub create_string_from_hash {
 
sub create_string_from_hash {
Line 213: Line 211:
  
 
##############################################################################
 
##############################################################################
# void* load_textfile ($dateiname, \@zeilen_rueckgabewert)
+
# void* load_textfile ($pFilename, \@Pointer_to_Array_of_Strings)
#
+
# Der Inhalt von $dateiname wird zeilenweise nach @{\@zeilen_rueckgabewert}
+
# gepumpt. Scheint dazu gedacht zu sein, Datenbankinhalte in den Speicher
+
# zu holen; wird kaum verwendet.
+
 
##############################################################################
 
##############################################################################
 
#
 
#
Line 240: Line 234:
  
 
##############################################################################
 
##############################################################################
# void* save_textfile ($dateiname, \@dateiinhalt);
+
# void* save_textfile ($pFilename, \@Pointer_to_Array_of_Strings)
#
+
# Schreibt die Daten aus @{\@dateiinhalt} nach $dateiname;
+
 
##############################################################################
 
##############################################################################
 
#
 
#
Line 262: Line 254:
 
}
 
}
  
 +
#################################################
 +
# convert the content of addresses in the vCard record
 +
#################################################
  
#######################################################################
+
sub modify_fileline {
# show the content of an array as one line splitted in table elements
+
      my $pAddress = $_[0];
#######################################################################
+
      $pAddress =~ s/\\n/$newline/g;
sub show_hash {
+
      $pAddress =~ s/\\,/,/g;
my $ppHash        = @_[0]; ## p=Parameter,p=Pointer
+
      $pAddress =~ s/\\//g;
my $pTitle        = @_[1]; ## p=Parameter
+
      $pAddress =~ s/\/$//g;  
print "\nShow Hash:  $pTitle $table_begin";
+
      $pAddress =~ s/ $//g;  
        &show_hash_header($ppHash);
+
      $pAddress =~ s/,$//g;
        &show_hash_line($ppHash);
+
      return $pAddress;  
print "$table_end\n";
+
 
}
 
}
 
sub show_hash_header {
 
my $ppHash        =  @_[0]; ## p=Parameter,p=Pointer
 
my @lvArrayKeys  = keys(%{$ppHash});
 
print $row_head_begin;
 
foreach my $item(@lvArrayKeys) {
 
print "$col_begin$item$col_end";
 
};
 
print $row_head_end;
 
}
 
 
 
sub show_hash_line {
 
my $ppHash        =  @_[0]; ## p=Parameter,p=Pointer
 
my @lvArrayValues = values(%{$ppHash});
 
print $row_begin;
 
foreach my $item(@lvArrayValues) {
 
print "$col_begin$item$col_end";
 
};
 
print $row_end;
 
}
 
#######################################################################
 
#### show the content of an array as a table with one column and
 
#### as many lines as the length of the array
 
#######################################################################
 
sub show_array {
 
my $ppArray      =  @_[0]; ## p=Parameter,p=Pointer
 
my $pTitle        =  @_[1]; ## p=Parameter
 
print "Show Array $pTitle $table_begin";
 
        print $row_begin;
 
foreach my $item(@{$ppArray}) {
 
print "$col_begin$item$col_end";
 
};
 
print $row_end;
 
print $table_end;
 
 
}
 
#######################################################################
 
#### show the content of an array as a table with one column and
 
#### as many lines as the length of the array
 
#######################################################################
 
sub create_array_line {
 
my $pPreSeparator  =  $_[0]; ## p=Parameter,p=Pointer
 
my $ppArray        =  $_[1]; ## p=Parameter,p=Pointer
 
my $pPostSeparator =  $_[2]; ## p=Parameter,p=Pointer
 
my $ReturnString = "";
 
foreach my $item(@{$ppArray}) {
 
$ReturnString .= "$pPreSeparator$item$pPostSeparator";
 
};
 
        return $ReturnString;
 
}
 
 
  
 
#################################################
 
#################################################

Revision as of 12:17, 21 August 2009

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 according to your VCF-files. 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).

Contents

Icon for the Converter

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

Install perl before with:

 opkg install perl

Start the Script

Start the script with perl:

  perl /home/root/bin/vcard2om.pl

Copy the Script in Edit Mode of this Page

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 $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);
  } 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;
    };
   # Name
    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);
### $OutFileHash("Miller Paul") contain the converted vCard record of e.g. Paul Miller
### Sort the hash IDs (i.e. Names) in alphabetical order 
foreach my $vID (sort @OutFileIDs) {
    push(@OutFileArray,$OutFileHash{$vID});
};
### push the last HTML line
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";
###########################################################################################
 
#######################################################################
# create a string from the content the hash of on VCard record
#######################################################################
sub create_string_from_hash {
	my $ppHash        =  @_[0]; ## p=Parameter,p=Pointer
        my $vReturnString = $row_head_begin;
        if ($ppHash->{Tel} eq "") {
            $ppHash->{Tel} = $ppHash->{Mobil};
        };
        if ($ppHash->{Tel} eq "") {
           $ppHash->{Tel} = "W: ".$ppHash->{TelWork};
        };
  	$vReturnString .= $col_begin.$ppHash->{LastName}.", ".$ppHash->{FirstName}.$col_end;
        $vReturnString .= $col_begin."W: ".$ppHash->{TelWork}.$col_end; 
        $vReturnString .= $row_head_end;
        $vReturnString .= $row_begin;
        $ppHash->{Tel} =~ s/[^ 0-9\-\/ W:]//g;
        $vReturnString .= $col_begin."T: ".$ppHash->{Tel}.$col_end;
        if ($ppHash->{Fax} eq "") {
             $vReturnString .= $col_begin."eM: ".$ppHash->{EMail}.$col_end; 
        } else { 
             $vReturnString .= $col_begin."Fax: ".$ppHash->{TelWork}.$col_end;
        }; 
        $vReturnString .= $row_end;
        $vReturnString .= $row_begin;
        $vReturnString .= $col_begin."Mob: ".$ppHash->{Mobil}.$col_end; 
        $vReturnString .= $col_begin."Adr: ".$ppHash->{Adress}.$col_end; 
        $vReturnString .= $row_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 modify_fileline {
      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);
     } 
}
#########################################################################

Personal tools

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 according to your VCF-files. 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).

Icon for the Converter

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

Install perl before with:

 opkg install perl

Start the Script

Start the script with perl:

  perl /home/root/bin/vcard2om.pl

Copy the Script in Edit Mode of this Page

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 $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);
  } 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;
    };
   # Name
    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);
### $OutFileHash("Miller Paul") contain the converted vCard record of e.g. Paul Miller
### Sort the hash IDs (i.e. Names) in alphabetical order 
foreach my $vID (sort @OutFileIDs) {
    push(@OutFileArray,$OutFileHash{$vID});
};
### push the last HTML line
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";
###########################################################################################
 
#######################################################################
# create a string from the content the hash of on VCard record
#######################################################################
sub create_string_from_hash {
	my $ppHash        =  @_[0]; ## p=Parameter,p=Pointer
        my $vReturnString = $row_head_begin;
        if ($ppHash->{Tel} eq "") {
            $ppHash->{Tel} = $ppHash->{Mobil};
        };
        if ($ppHash->{Tel} eq "") {
           $ppHash->{Tel} = "W: ".$ppHash->{TelWork};
        };
  	$vReturnString .= $col_begin.$ppHash->{LastName}.", ".$ppHash->{FirstName}.$col_end;
        $vReturnString .= $col_begin."W: ".$ppHash->{TelWork}.$col_end; 
        $vReturnString .= $row_head_end;
        $vReturnString .= $row_begin;
        $ppHash->{Tel} =~ s/[^ 0-9\-\/ W:]//g;
        $vReturnString .= $col_begin."T: ".$ppHash->{Tel}.$col_end;
        if ($ppHash->{Fax} eq "") {
             $vReturnString .= $col_begin."eM: ".$ppHash->{EMail}.$col_end; 
        } else { 
             $vReturnString .= $col_begin."Fax: ".$ppHash->{TelWork}.$col_end;
        }; 
        $vReturnString .= $row_end;
        $vReturnString .= $row_begin;
        $vReturnString .= $col_begin."Mob: ".$ppHash->{Mobil}.$col_end; 
        $vReturnString .= $col_begin."Adr: ".$ppHash->{Adress}.$col_end; 
        $vReturnString .= $row_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 modify_fileline {
      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);
     } 
}
#########################################################################