You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.0 KiB
Bash

#!/usr/bin/env php -qC
<?php
/*
+-----------------------------------------------------------------------+
| Commandline vCard converter |
| Version 0.9.0 |
| |
| Copyright (C) 2006-2013, Thomas Bruederli - Switzerland |
| Licensed under the GNU GPL |
| |
| Type './vcfconvert.sh help' for usage information |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <thomas@brotherli.ch> |
+-----------------------------------------------------------------------+
*/
@ini_set('error_reporting', E_ALL &~ E_NOTICE);
require_once('vcard_convert.php');
require_once('utils.php');
/**
* Parse commandline arguments into a hash array
*/
function get_args()
{
$args = array();
for ($i=1; $i<count($_SERVER['argv']); $i++)
{
$arg = $_SERVER['argv'][$i];
if ($arg[0] == '-' && $arg[1] != '-')
{
for ($j=1; $j < strlen($arg); $j++)
{
$key = $arg[$j];
$value = $_SERVER['argv'][$i+1]{0} != '-' ? preg_replace(array('/^["\']/', '/["\']$/'), '', $_SERVER['argv'][++$i]) : true;
$args[$key] = $value;
}
}
else
$args[] = $arg;
}
return $args;
}
// read commandline arguments
$opt = get_args();
$usage = <<<EOF
Usage: vcfconvert.sh [-hilmpv] [-d delimiter] [-c utf-8] [-b identifier] [-o output_file] -f format <file>
-f Target format (ldif,ldap,csv,gmail,libdlusb,fritzbox,img)
-b LDAP identifier added to dn:
-l Generate just a list of DN objects (only works with -b)
-o Output file (write to stdout by default)
-d CSV col delimiter
-h Include header line in CSV output
-i Convert CSV output to ISO-8859-1 encoding (deprecated, use -c instead)
-c Character encoding for CSV output
-n Line endings for CSV output: 'n', 'r' or 'rn'
-m Only convert cards with an e-mail address
-p Only convert cards with phone numbers
-v Verbose output
EOF;
// show help
if ($opt[0] == 'help')
die($usage);
// read arguments
$file = array_pop($opt);
$format = $opt['f'] ? $opt['f'] : 'ldif';
if (empty($file))
die("Not enough arguments!\n$usage");
// instantiate a parser object
$conv = new vcard_convert(array('mailonly' => isset($opt['m']), 'phoneonly' => isset($opt['p'])));
// parse a vCard file
if ($conv->fromFile($file))
{
if (isset($opt['v']))
echo "Detected $conv->file_charset encoding\n";
if (isset($opt['v']) && isset($opt['m']))
echo "Only convert vCards with an e-mail address\n";
if ($format == 'ldif')
$out = $conv->toLdif();
else if ($format == 'ldap')
$out = $conv->toLdif($opt['b'], isset($opt['l']) ? 'dn' : null);
else if ($format == 'gmail')
$out = $conv->toGmail();
else if ($format == 'libdlusb')
$out = $conv->toLibdlusb();
else if ($format == 'fritzbox')
$out = $conv->toFritzBox();
else if ($format == 'csv')
{
if (!isset($opt['c']) && isset($opt['i']))
$opt['c'] = 'ISO-8859-1';
$delimiter = isset($opt['d']) ? ($opt['d']=='\t' || $opt['d']=='tab' ? "\t" : $opt['d']) : ";";
$out = $conv->toCSV($delimiter, isset($opt['h']), isset($opt['c']) ? strtoupper($opt['c']) : null, $opt['n']);
if (isset($opt['v']) && isset($opt['c']))
echo "Converting output to " . strtoupper($opt['c']) . PHP_EOL;
}
else if ($format == 'img')
$out = $conv->toImages('tmp');
else
die("Unknown output format\n");
// write to output file
if ($opt['o'])
{
if ($fp = @fopen($opt['o'], 'w'))
{
fwrite($fp, $out);
fclose($fp);
echo "Wrote ".$conv->export_count." cards to $opt[o]\n";
}
else
die("Cannot write to $opt[o]; permission denied\n");
}
else
echo $out;
}
else
echo "Cannot parse $file\n";
?>