#!/usr/bin/env perl
#
#   vcf2csv by gall0ws <g4ll0ws@gmail.com>
#
# Time-stamp: <2008-05-03 04:18:04 CEST gallows>
#
# Convert Evolution's vcf contact list in gmail readable csv file.
#
# Tested with `list.vcf' generated by Novell Evolution 2.22 (VCARD 3.0)
#

use strict;

my @csv_fields = ('Name', 'E-mail', 'Phone', 'Notes');

my $fin = $ARGV[0];
my $fout = $ARGV[1];

sub push_field {
    my ($csv_ref, $vcard_ref, $re) = @_;
    my ($tmp) = grep(/$re/, @$vcard_ref);
    my ($key, $value) = split ':', $tmp, 2;
    chop $value;
    push @$csv_ref, $value;
}

BEGIN;

if (!defined $fin || !defined $fout) {
    print "usage: $0 [input.vcf] [output.csv|-]\n";
    exit 1;
}

$fout = '/dev/stdout' if $fout eq '-';

open(VCF, "< $fin") || die "$0: cannot open `$fin': $!";
open(CSV, "> $fout") || die "$0: cannot open `$fout': $!";

# print csv header on CSV handle:
foreach (@csv_fields) {
    print CSV $_ . ',';
}
print CSV "\n";

do {
    my @vcard = ();  # card in vcf format
    my @csv = ();
 
    # load @vcard from $fin:
    do {
	$_ = <VCF>;
	chomp;
	push @vcard, $_;
    } until /END:VCARD/;

    # put fields in @csv:
    push_field \@csv, \@vcard, "^FN:.*";                 # name
    push_field \@csv, \@vcard, '\w+@\w+\.[a-zA-z]{2,4}'; # email
    push_field \@csv, \@vcard, "^TEL;.*";                # phone
    push_field \@csv, \@vcard, "^NOTE:.*";               # notes

    # write csv entries on CSV handle:
    foreach (@csv) {
	print CSV;
	print CSV ',';
    }
    print CSV "\n";
} until eof VCF;

close VCF;
close CSV;

END;
