calendarimporter/php/ical/lib/iCal.vCard.inc.php

167 lines
5.5 KiB
PHP

<?php
/*********************************************************************************/
/**
*
* iCalcreator, a PHP rfc2445/rfc5545 solution.
*
* @copyright Copyright (c) 2007-2015 Kjell-Inge Gustafsson, kigkonsult, All rights reserved
* @link http://kigkonsult.se/iCalcreator/index.php
* @license http://kigkonsult.se/downloads/dl.php?f=LGPL
* @package iCalcreator
* @version 2.22
*/
/**
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*********************************************************************************/
/* iCalcreator vCard helper functions */
/*********************************************************************************/
/**
* convert single ATTENDEE, CONTACT or ORGANIZER (in email format) to vCard
* returns vCard/TRUE or if directory (if set) or file write is unvalid, FALSE
*
* @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
* @since 2.12.2 - 2012-07-11
* @param string $email
* @param string $version vCard version (default 2.1)
* @param string $directory where to save vCards (default FALSE)
* @param string $ext vCard file extension (default 'vcf')
* @uses ICALCREATOR_VERSION
* @return mixed
*/
function iCal2vCard( $email, $version='2.1', $directory=FALSE, $ext='vcf' ) {
if( FALSE === ( $pos = strpos( $email, '@' )))
return FALSE;
if( $directory ) {
if( DIRECTORY_SEPARATOR != substr( $directory, ( 0 - strlen( DIRECTORY_SEPARATOR ))))
$directory .= DIRECTORY_SEPARATOR;
if( !is_dir( $directory ) || !is_writable( $directory ))
return FALSE;
}
/* prepare vCard */
$email = str_replace( 'MAILTO:', '', $email );
$name = $person = substr( $email, 0, $pos );
if( ctype_upper( $name ) || ctype_lower( $name ))
$name = array( $name );
else {
if( FALSE !== ( $pos = strpos( $name, '.' ))) {
$name = explode( '.', $name );
foreach( $name as $k => $part )
$name[$k] = ucfirst( $part );
}
else { // split camelCase
$chars = $name;
$name = array( $chars[0] );
$k = 0;
$x = 1;
while( FALSE !== ( $char = substr( $chars, $x, 1 ))) {
if( ctype_upper( $char )) {
$k += 1;
$name[$k] = '';
}
$name[$k] .= $char;
$x++;
}
}
}
$nl = "\r\n";
$FN = 'FN:'.implode( ' ', $name ).$nl;
$name = array_reverse( $name );
$N = 'N:'.array_shift( $name );
$scCnt = 0;
while( NULL != ( $part = array_shift( $name ))) {
if(( '4.0' != $version ) || ( 4 > $scCnt ))
$scCnt += 1;
$N .= ';'.$part;
}
while(( '4.0' == $version ) && ( 4 > $scCnt )) {
$N .= ';';
$scCnt += 1;
}
$N .= $nl;
$EMAIL = 'EMAIL:'.$email.$nl;
/* create vCard */
$vCard = 'BEGIN:VCARD'.$nl;
$vCard .= "VERSION:$version$nl";
$vCard .= 'PRODID:-//kigkonsult.se '.ICALCREATOR_VERSION."//$nl";
$vCard .= $N;
$vCard .= $FN;
$vCard .= $EMAIL;
$vCard .= 'REV:'.gmdate( 'Ymd\THis\Z' ).$nl;
$vCard .= 'END:VCARD'.$nl;
/* save each vCard as (unique) single file */
if( $directory ) {
$fname = $directory.preg_replace( '/[^a-z0-9.]/i', '', $email );
$cnt = 1;
$dbl = '';
while( is_file ( $fname.$dbl.'.'.$ext )) {
$cnt += 1;
$dbl = "_$cnt";
}
if( FALSE === file_put_contents( $fname, $fname.$dbl.'.'.$ext ))
return FALSE;
return TRUE;
}
/* return vCard */
else
return $vCard;
}
/**
* convert ATTENDEEs, CONTACTs and ORGANIZERs (in email format) to vCards
*
* @author Kjell-Inge Gustafsson, kigkonsult <ical@kigkonsult.se>
* @since 2.12.2 - 2012-05-07
* @param object $calendar iCalcreator vcalendar instance reference
* @param string $version vCard version (default 2.1)
* @param string $directory where to save vCards (default FALSE)
* @param string $ext vCard file extension (default 'vcf')
* @uses vcalendar::getProperty()
* @return mixed
*/
function iCal2vCards( & $calendar, $version='2.1', $directory=FALSE, $ext='vcf' ) {
$hits = array();
$vCardP = array( 'ATTENDEE', 'CONTACT', 'ORGANIZER' );
foreach( $vCardP as $prop ) {
$hits2 = $calendar->getProperty( $prop );
foreach( $hits2 as $propValue => $occCnt ) {
if( FALSE === ( $pos = strpos( $propValue, '@' )))
continue;
$propValue = str_replace( 'MAILTO:', '', $propValue );
if( isset( $hits[$propValue] ))
$hits[$propValue] += $occCnt;
else
$hits[$propValue] = $occCnt;
}
}
if( empty( $hits ))
return FALSE;
ksort( $hits );
$output = '';
foreach( $hits as $email => $skip ) {
$res = iCal2vCard( $email, $version, $directory, $ext );
if( $directory && !$res )
return FALSE;
elseif( !$res )
return $res;
else
$output .= $res;
}
if( $directory )
return TRUE;
if( !empty( $output ))
return $output;
return FALSE;
}