First commit
This commit is contained in:
		
						commit
						c6e2478c40
					
				
					 13918 changed files with 2303184 additions and 0 deletions
				
			
		
							
								
								
									
										2225
									
								
								sites/all/modules/civicrm/packages/Contact/Vcard/Build.php
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2225
									
								
								sites/all/modules/civicrm/packages/Contact/Vcard/Build.php
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										768
									
								
								sites/all/modules/civicrm/packages/Contact/Vcard/Parse.php
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										768
									
								
								sites/all/modules/civicrm/packages/Contact/Vcard/Parse.php
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,768 @@ | |||
| <?php | ||||
| /** | ||||
|  * Parse vCard 2.1 and 3.0 text blocks. | ||||
|  * | ||||
|  * PHP versions 4 and 5 | ||||
|  * | ||||
|  * LICENSE: This source file is subject to version 2.0 of the PHP license | ||||
|  * that is available through the world-wide-web at the following URI: | ||||
|  * http://www.php.net/license/2_02.txt.  If you did not receive a copy of | ||||
|  * the PHP License and are unable to obtain it through the world-wide-web, please | ||||
|  * send a note to license@php.net so we can mail you a copy immediately. | ||||
|  * | ||||
|  * @category  File_Formats | ||||
|  * @package   Contact_Vcard_Parse | ||||
|  * @author    Paul M. Jones <pjones@ciaweb.net> | ||||
|  * @copyright 1997-2007 The PHP Group | ||||
|  * @license   http://www.php.net/license/2_02.txt  PHP License 2.0 | ||||
|  * @version   CVS: $Id: Parse.php 288533 2009-09-21 15:04:29Z till $ | ||||
|  * @link      http://pear.php.net/package/Contact_Vcard_Parse | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * Parser for vCards. | ||||
|  * | ||||
|  * This class parses vCard 2.1 and 3.0 sources from file or text into a | ||||
|  * structured array. | ||||
|  * | ||||
|  * Usage: | ||||
|  * | ||||
|  * <code> | ||||
|  *     // include this class file
 | ||||
|  *     require_once 'Contact_Vcard_Parse.php'; | ||||
|  * | ||||
|  *     // instantiate a parser object
 | ||||
|  *     $parse = new Contact_Vcard_Parse(); | ||||
|  * | ||||
|  *     // parse a vCard file and store the data
 | ||||
|  *     // in $cardinfo
 | ||||
|  *     $cardinfo = $parse->fromFile('sample.vcf'); | ||||
|  * | ||||
|  *     // view the card info array
 | ||||
|  *     echo '<pre>'; | ||||
|  *     print_r($cardinfo); | ||||
|  *     echo '</pre>'; | ||||
|  * </code> | ||||
|  * | ||||
|  * @category  File_Formats | ||||
|  * @package   Contact_Vcard_Parse | ||||
|  * @author    Paul M. Jones <pmjones@php.net> | ||||
|  * @copyright 1997-2007 The PHP Group | ||||
|  * @license   http://www.php.net/license/3_0.txt  PHP License 3.0 | ||||
|  * @version   Release: 1.31.0 | ||||
|  * @link      http://pear.php.net/package/Contact_Vcard_Parse | ||||
|  */ | ||||
| class Contact_Vcard_Parse | ||||
| { | ||||
|     /** | ||||
|      * Reads a file for parsing, then sends it to $this->fromText() | ||||
|      * and returns the results. | ||||
|      * | ||||
|      * @param array   $filename  The filename to read for vCard information. | ||||
|      * @param boolean $decode_qp Optional; Decode quoted printable if true. This | ||||
|      *        is the default. | ||||
|      * | ||||
|      * @return array An array of of vCard information extracted from the | ||||
|      *         file. | ||||
|      * @access public | ||||
|      * @see    self::fromText() | ||||
|      * @see    self::_fromArray() | ||||
|      */ | ||||
|     function fromFile($filename, $decode_qp = true) | ||||
|     { | ||||
|         $text = $this->fileGetContents($filename); | ||||
| 
 | ||||
|         if ($text === false) { | ||||
|             return false; | ||||
|         } | ||||
|         // dump to, and get return from, the fromText() method.
 | ||||
|         return $this->fromText($text, $decode_qp); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Reads the contents of a file.  Included for users whose PHP < 4.3.0. | ||||
|      * | ||||
|      * @param array $filename The filename to read for vCard information. | ||||
|      * | ||||
|      * @access public | ||||
|      * @return string|bool The contents of the file if it exists and is | ||||
|      *         readable, or boolean false if not. | ||||
|      * @see self::fromFile() | ||||
|      */ | ||||
|     function fileGetContents($filename) | ||||
|     { | ||||
|         if (file_exists($filename) && is_readable($filename)) { | ||||
| 
 | ||||
|             $text = ''; | ||||
|             $len  = filesize($filename); | ||||
| 
 | ||||
|             $fp = fopen($filename, 'r'); | ||||
|             while ($line = fread($fp, filesize($filename))) { | ||||
|                 $text .= $line; | ||||
|             } | ||||
|             fclose($fp); | ||||
| 
 | ||||
|             return $text; | ||||
| 
 | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prepares a block of text for parsing, then sends it through and | ||||
|      * returns the results from $this->fromArray(). | ||||
|      * | ||||
|      * @param array   $text      A block of text to read for vCard information. | ||||
|      * @param boolean $decode_qp Optional; Decode quoted printable if true. This | ||||
|      *        is the default. | ||||
|      * | ||||
|      * @access public | ||||
|      * @return array An array of vCard information extracted from the | ||||
|      *         source text. | ||||
|      * @see self::_fromArray() | ||||
|      */ | ||||
|     function fromText($text, $decode_qp = true) | ||||
|     { | ||||
|         // convert all kinds of line endings to Unix-standard and get
 | ||||
|         // rid of double blank lines.
 | ||||
|         $this->convertLineEndings($text); | ||||
| 
 | ||||
|         // unfold lines.  concat two lines where line 1 ends in \n and
 | ||||
|         // line 2 starts with a whitespace character.  only removes
 | ||||
|         // the first whitespace character, leaves others in place.
 | ||||
|         $fold_regex = '(\n)([ |\t])'; | ||||
|         $text       = preg_replace("/$fold_regex/i", "", $text); | ||||
| 
 | ||||
|         // massage for Macintosh OS X Address Book (remove nulls that
 | ||||
|         // Address Book puts in for unicode chars)
 | ||||
|         $text = str_replace("\x00", '', $text); | ||||
| 
 | ||||
|         // convert the resulting text to an array of lines
 | ||||
|         $lines = explode("\n", $text); | ||||
| 
 | ||||
|         // parse the array of lines and return vCard info
 | ||||
|         return $this->_fromArray($lines, $decode_qp); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Converts line endings in text. | ||||
|      * | ||||
|      * Takes any text block and converts all line endings to UNIX | ||||
|      * standard. DOS line endings are \r\n, Mac are \r, and UNIX is \n. | ||||
|      * | ||||
|      * NOTE: Acts on the text block in-place; does not return a value. | ||||
|      * | ||||
|      * @param string &$text The string on which to convert line endings. | ||||
|      * | ||||
|      * @access public | ||||
|      * @return void | ||||
|      */ | ||||
|     function convertLineEndings(&$text) | ||||
|     { | ||||
|         // DOS
 | ||||
|         $text = str_replace("\r\n", "\n", $text); | ||||
| 
 | ||||
|         // Mac
 | ||||
|         $text = str_replace("\r", "\n", $text); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Splits a string into an array at semicolons.  Honors backslash- | ||||
|      * escaped semicolons (i.e., splits at ';' not '\;'). | ||||
|      * | ||||
|      * @param string  $text          The string to split into an array. | ||||
|      * @param boolean $convertSingle If splitting the string results in a | ||||
|      *        single array element, return a string instead of a one- | ||||
|      *        element array. Optional - defaults to false | ||||
|      * | ||||
|      * @access public | ||||
|      * @return mixed An array of values, or a single string. | ||||
|      */ | ||||
|     function splitBySemi($text, $convertSingle = false) | ||||
|     { | ||||
|         // we use these double-backs (\\) because they get get converted
 | ||||
|         // to single-backs (\) by preg_split.  the quad-backs (\\\\) end
 | ||||
|         // up as as double-backs (\\), which is what preg_split requires
 | ||||
|         // to indicate a single backslash (\). what a mess.
 | ||||
|         $regex = '(?<!\\\\)(\;)'; | ||||
|         $tmp   = preg_split("/$regex/i", $text); | ||||
| 
 | ||||
|         // if there is only one array-element and $convertSingle is
 | ||||
|         // true, then return only the value of that one array element
 | ||||
|         // (instead of returning the array).
 | ||||
|         if ($convertSingle && count($tmp) == 1) { | ||||
|             return $tmp[0]; | ||||
|         } | ||||
|         return $tmp; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Splits a string into an array at commas.  Honors backslash- | ||||
|      * escaped commas (i.e., splits at ',' not '\,'). | ||||
|      * | ||||
|      * @param string  $text          The string to split into an array. | ||||
|      * @param boolean $convertSingle If splitting the string results in a | ||||
|      *        single array element, return a string instead of a one- | ||||
|      *        element array. Optional - defaults to false. | ||||
|      * | ||||
|      * @access public | ||||
|      * @return mixed An array of values, or a single string. | ||||
|      */ | ||||
|     function splitByComma($text, $convertSingle = false) | ||||
|     { | ||||
|         // we use these double-backs (\\) because they get get converted
 | ||||
|         // to single-backs (\) by preg_split.  the quad-backs (\\\\) end
 | ||||
|         // up as as double-backs (\\), which is what preg_split requires
 | ||||
|         // to indicate a single backslash (\). ye gods, how ugly.
 | ||||
|         $regex = '(?<!\\\\)(\,)'; | ||||
|         $tmp   = preg_split("/$regex/i", $text); | ||||
| 
 | ||||
|         // if there is only one array-element and $convertSingle is
 | ||||
|         // true, then return only the value of that one array element
 | ||||
|         // (instead of returning the array).
 | ||||
|         if ($convertSingle && count($tmp) == 1) { | ||||
|             return $tmp[0]; | ||||
|         } | ||||
|         return $tmp; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Used to make string human-readable after being a vCard value. | ||||
|      * | ||||
|      * Converts... | ||||
|      *     \: => : | ||||
|      *     \; => ; | ||||
|      *     \, => , | ||||
|      *     literal \n => newline | ||||
|      * | ||||
|      * @param mixed &$text The text to unescape. | ||||
|      * | ||||
|      * @access public | ||||
|      * @return void | ||||
|      */ | ||||
|     function unescape(&$text) | ||||
|     { | ||||
|         if (is_array($text)) { | ||||
|             foreach ($text as $key => $val) { | ||||
|                 $this->unescape($val); | ||||
|                 $text[$key] = $val; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|         /* | ||||
|         $text = str_replace('\:', ':', $text); | ||||
|         $text = str_replace('\;', ';', $text); | ||||
|         $text = str_replace('\,', ',', $text); | ||||
|         $text = str_replace('\n', "\n", $text); | ||||
|         */ | ||||
|         // combined
 | ||||
|         $find    = array('\:', '\;', '\,', '\n'); | ||||
|         $replace = array(':',  ';',  ',',  "\n"); | ||||
|         $text    = str_replace($find, $replace, $text); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Emulated destructor. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return boolean true | ||||
|      */ | ||||
|     function _Contact_Vcard_Parse() | ||||
|     { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Parses an array of source lines and returns an array of vCards. | ||||
|      * Each element of the array is itself an array expressing the types, | ||||
|      * parameters, and values of each part of the vCard. Processes both | ||||
|      * 2.1 and 3.0 vCard sources. | ||||
|      * | ||||
|      * @param array   $source    An array of lines to be read for vCard | ||||
|      *        information. | ||||
|      * @param boolean $decode_qp Optional; Decode quoted printable if true. | ||||
|      *        This is the default. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return array An array of of vCard information extracted from the | ||||
|      *         source array. | ||||
|      */ | ||||
|     function _fromArray($source, $decode_qp = true) | ||||
|     { | ||||
|         // the info array will hold all resulting vCard information.
 | ||||
|         $info = array(); | ||||
| 
 | ||||
|         // tells us whether the source text indicates the beginning of a
 | ||||
|         // new vCard with a BEGIN:VCARD tag.
 | ||||
|         $begin = false; | ||||
| 
 | ||||
|         // holds information about the current vCard being read from the
 | ||||
|         // source text.
 | ||||
|         $card = array(); | ||||
| 
 | ||||
|         // loop through each line in the source array
 | ||||
|         foreach ($source as $line) { | ||||
| 
 | ||||
|             // if the line is blank, skip it.
 | ||||
|             if (trim($line) == '') { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             // find the first instance of ':' on the line.  The part
 | ||||
|             // to the left of the colon is the type and parameters;
 | ||||
|             // the part to the right of the colon is the value data.
 | ||||
|             $pos = strpos($line, ':'); | ||||
| 
 | ||||
|             // if there is no colon, skip the line.
 | ||||
|             if ($pos === false) { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             // get the left and right portions
 | ||||
|             $left  = trim(substr($line, 0, $pos)); | ||||
|             $right = trim(substr($line, $pos+1, strlen($line))); | ||||
| 
 | ||||
|             // have we started yet?
 | ||||
|             if (! $begin) { | ||||
| 
 | ||||
|                 // nope.  does this line indicate the beginning of
 | ||||
|                 // a new vCard?
 | ||||
|                 if (strtoupper($left) == 'BEGIN' && strtoupper($right) == 'VCARD') { | ||||
| 
 | ||||
|                     // tell the loop that we've begun a new card
 | ||||
|                     $begin = true; | ||||
|                 } | ||||
| 
 | ||||
|                 // regardless, loop to the next line of source. if begin
 | ||||
|                 // is still false, the next loop will check the line. if
 | ||||
|                 // begin has now been set to true, the loop will start
 | ||||
|                 // collecting card info.
 | ||||
|                 continue; | ||||
| 
 | ||||
|             } else { | ||||
| 
 | ||||
|                 // yep, we've started, but we don't know how far along
 | ||||
|                 // we are in the card. is this the ending line of the
 | ||||
|                 // current vCard?
 | ||||
|                 if (strtoupper($left) == 'END' && strtoupper($right) == 'VCARD') { | ||||
| 
 | ||||
|                     // yep, we're done. keep the info from the current
 | ||||
|                     // card...
 | ||||
|                     $info[] = $card; | ||||
| 
 | ||||
|                     // ...and reset to grab a new card if one exists in
 | ||||
|                     // the source array.
 | ||||
|                     $begin = false; | ||||
|                     $card  = array(); | ||||
| 
 | ||||
|                 } else { | ||||
| 
 | ||||
|                     // we're not on an ending line, so collect info from
 | ||||
|                     // this line into the current card. split the
 | ||||
|                     // left-portion of the line into a type-definition
 | ||||
|                     // (the kind of information) and parameters for the
 | ||||
|                     // type.
 | ||||
|                     $typedef = $this->_getTypeDef($left); | ||||
|                     $params  = $this->_getParams($left); | ||||
| 
 | ||||
|                     // if we are decoding quoted-printable, do so now.
 | ||||
|                     // QUOTED-PRINTABLE is not allowed in version 3.0,
 | ||||
|                     // but we don't check for versioning, so we do it
 | ||||
|                     // regardless.  ;-)
 | ||||
|                     $this->_decodeQp($params, $right); | ||||
| 
 | ||||
|                     // now get the value-data from the line, based on
 | ||||
|                     // the typedef
 | ||||
|                     switch ($typedef) { | ||||
| 
 | ||||
|                     case 'N': | ||||
|                         // structured name of the person
 | ||||
|                         $value = $this->_parseN($right); | ||||
|                         break; | ||||
| 
 | ||||
|                     case 'ADR': | ||||
|                         // structured address of the person
 | ||||
|                         $value = $this->_parseADR($right); | ||||
|                         break; | ||||
| 
 | ||||
|                     case 'NICKNAME': | ||||
|                         // nicknames
 | ||||
|                         $value = $this->_parseNICKNAME($right); | ||||
|                         break; | ||||
| 
 | ||||
|                     case 'ORG': | ||||
|                         // organizations the person belongs to
 | ||||
|                         $value = $this->_parseORG($right); | ||||
|                         break; | ||||
| 
 | ||||
|                     case 'CATEGORIES': | ||||
|                         // categories to which this card is assigned
 | ||||
|                         $value = $this->_parseCATEGORIES($right); | ||||
|                         break; | ||||
| 
 | ||||
|                     case 'GEO': | ||||
|                         // geographic coordinates
 | ||||
|                         $value = $this->_parseGEO($right); | ||||
|                         break; | ||||
| 
 | ||||
|                     default: | ||||
|                         // by default, just grab the plain value. keep
 | ||||
|                         // as an array to make sure *all* values are
 | ||||
|                         // arrays.  for consistency. ;-)
 | ||||
|                         if (preg_match('/ITEM[0-9]*\.ADR/', $typedef)) { | ||||
|                             $value = $this->_parseADR($right); | ||||
|                         } else { | ||||
|                             $value = array(array($right)); | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
| 
 | ||||
|                     // add the type, parameters, and value to the
 | ||||
|                     // current card array.  note that we allow multiple
 | ||||
|                     // instances of the same type, which might be dumb
 | ||||
|                     // in some cases (e.g., N).
 | ||||
|                     $card[$typedef][] = array( | ||||
|                         'param' => $params, | ||||
|                         'value' => $value | ||||
|                     ); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         $this->unescape($info); | ||||
|         return $info; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Takes a vCard line and extracts the Type-Definition for the line. | ||||
|      * | ||||
|      * @param string $text A left-part (before-the-colon part) from a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return string The type definition for the line. | ||||
|      * | ||||
|      */ | ||||
|     function _getTypeDef($text) | ||||
|     { | ||||
|         // split the text by semicolons
 | ||||
|         $split = $this->splitBySemi($text); | ||||
| 
 | ||||
|         // only return first element (the typedef)
 | ||||
|         return strtoupper($split[0]); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Finds the Type-Definition parameters for a vCard line. | ||||
|      * | ||||
|      * @param string $text A left-part (before-the-colon part) from a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return mixed An array of parameters. | ||||
|      */ | ||||
|     function _getParams($text) | ||||
|     { | ||||
|         // split the text by semicolons into an array
 | ||||
|         $split = $this->splitBySemi($text); | ||||
| 
 | ||||
|         // drop the first element of the array (the type-definition)
 | ||||
|         array_shift($split); | ||||
| 
 | ||||
|         // set up an array to retain the parameters, if any
 | ||||
|         $params = array(); | ||||
| 
 | ||||
|         // loop through each parameter.  the params may be in the format...
 | ||||
|         // "TYPE=type1,type2,type3"
 | ||||
|         //    ...or...
 | ||||
|         // "TYPE=type1;TYPE=type2;TYPE=type3"
 | ||||
|         foreach ($split as $full) { | ||||
| 
 | ||||
|             // split the full parameter at the equal sign so we can tell
 | ||||
|             // the parameter name from the parameter value
 | ||||
|             $tmp = explode("=", $full); | ||||
| 
 | ||||
|             // the key is the left portion of the parameter (before
 | ||||
|             // '='). if in 2.1 format, the key may in fact be the
 | ||||
|             // parameter value, not the parameter name.
 | ||||
|             $key = strtoupper(trim($tmp[0])); | ||||
| 
 | ||||
|             // list of all parameter values
 | ||||
|             if (!isset($tmp[1])) { | ||||
| 
 | ||||
|                 // Parameter value without key - default to 'TYPE=<value>'
 | ||||
|                 $list = array($key); | ||||
|                 $name = 'TYPE'; | ||||
| 
 | ||||
|             } else { | ||||
| 
 | ||||
|                 // get the parameter name by checking to see if it's in
 | ||||
|                 // vCard 2.1 or 3.0 format.
 | ||||
|                 $name = $this->_getParamName($key); | ||||
| 
 | ||||
|                 // list of all parameter values
 | ||||
|                 if (isset($tmp[1])) { | ||||
|                     $listall = trim($tmp[1]); | ||||
|                 } else { | ||||
|                     $listall = ''; | ||||
|                 } | ||||
| 
 | ||||
|                 // if there is a value-list for this parameter, they are
 | ||||
|                 // separated by commas, so split them out too.
 | ||||
|                 $list = $this->splitByComma($listall); | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|             // now loop through each value in the parameter and retain
 | ||||
|             // it.  if the value is blank, that means it's a 2.1-style
 | ||||
|             // param, and the key itself is the value.
 | ||||
|             foreach ($list as $val) { | ||||
|                 if (trim($val) != '') { | ||||
|                     // 3.0 formatted parameter
 | ||||
|                     $params[$name][] = trim($val); | ||||
|                 } else { | ||||
|                     // 2.1 formatted parameter
 | ||||
|                     $params[$name][] = $key; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // if, after all this, there are no parameter values for the
 | ||||
|             // parameter name, retain no info about the parameter (saves
 | ||||
|             // ram and checking-time later).
 | ||||
|             if (count($params[$name]) == 0) { | ||||
|                 unset($params[$name]); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // return the parameters array.
 | ||||
|         return $params; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Looks at the parameters of a vCard line; if one of them is | ||||
|      * ENCODING[] => QUOTED-PRINTABLE then decode the text in-place. | ||||
|      * | ||||
|      * @param array  &$params A parameter array from a vCard line. | ||||
|      * @param string &$text   A right-part (after-the-colon part) from a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return void | ||||
|      */ | ||||
|     function _decodeQp(&$params, &$text) | ||||
|     { | ||||
|         // loop through each parameter
 | ||||
|         foreach ($params as $param_key => $param_val) { | ||||
| 
 | ||||
|             // check to see if it's an encoding param
 | ||||
|             if (trim(strtoupper($param_key)) != 'ENCODING') { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
|             // loop through each encoding param value
 | ||||
|             foreach ($param_val as $enc_key => $enc_val) { | ||||
| 
 | ||||
|                 // if any of the values are QP, decode the text
 | ||||
|                 // in-place and return
 | ||||
|                 $enc_val = trim(strtoupper($enc_val)); | ||||
|                 if ($enc_val == 'QUOTED-PRINTABLE') { | ||||
|                     $text = quoted_printable_decode($text); | ||||
|                     return; | ||||
|                 } | ||||
|                 if ($enc_val == 'BASE64') { | ||||
|                     $text = base64_decode($text); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns parameter names from 2.1-formatted vCards. | ||||
|      * | ||||
|      * The vCard 2.1 specification allows parameter values without a | ||||
|      * name. The parameter name is then determined from the unique | ||||
|      * parameter value. | ||||
|      * | ||||
|      * Shamelessly lifted from Frank Hellwig <frank@hellwig.org> and his | ||||
|      * vCard PHP project <http://vcardphp.sourceforge.net>. | ||||
|      * | ||||
|      * @param string $value The first element in a parameter name-value | ||||
|      *        pair. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return string The proper parameter name (TYPE, ENCODING, or | ||||
|      *         VALUE). | ||||
|      */ | ||||
|     function _getParamName($value) | ||||
|     { | ||||
|         static $types = array ( | ||||
|             'DOM', 'INTL', 'POSTAL', 'PARCEL','HOME', 'WORK', | ||||
|             'PREF', 'VOICE', 'FAX', 'MSG', 'CELL', 'PAGER', | ||||
|             'BBS', 'MODEM', 'CAR', 'ISDN', 'VIDEO', | ||||
|             'AOL', 'APPLELINK', 'ATTMAIL', 'CIS', 'EWORLD', | ||||
|             'INTERNET', 'IBMMAIL', 'MCIMAIL', | ||||
|             'POWERSHARE', 'PRODIGY', 'TLX', 'X400', | ||||
|             'GIF', 'CGM', 'WMF', 'BMP', 'MET', 'PMB', 'DIB', | ||||
|             'PICT', 'TIFF', 'PDF', 'PS', 'JPEG', 'QTIME', | ||||
|             'MPEG', 'MPEG2', 'AVI', | ||||
|             'WAVE', 'AIFF', 'PCM', | ||||
|             'X509', 'PGP' | ||||
|         ); | ||||
| 
 | ||||
|         // CONTENT-ID added by pmj
 | ||||
|         static $values = array ( | ||||
|             'INLINE', 'URL', 'CID', 'CONTENT-ID' | ||||
|         ); | ||||
| 
 | ||||
|         // 8BIT added by pmj
 | ||||
|         static $encodings = array ( | ||||
|             '7BIT', '8BIT', 'QUOTED-PRINTABLE', 'BASE64' | ||||
|         ); | ||||
| 
 | ||||
|         // changed by pmj to the following so that the name defaults to
 | ||||
|         // whatever the original value was.  Frank Hellwig's original
 | ||||
|         // code was "$name = 'UNKNOWN'".
 | ||||
|         $name = $value; | ||||
| 
 | ||||
|         if (in_array($value, $types)) { | ||||
|             $name = 'TYPE'; | ||||
|         } elseif (in_array($value, $values)) { | ||||
|             $name = 'VALUE'; | ||||
|         } elseif (in_array($value, $encodings)) { | ||||
|             $name = 'ENCODING'; | ||||
|         } | ||||
|         return $name; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Parses a vCard line value identified as being of the "N" | ||||
|      * (structured name) type-defintion. | ||||
|      * | ||||
|      * @param string $text The right-part (after-the-colon part) of a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return array An array of key-value pairs where the key is the | ||||
|      *         portion-name and the value is the portion-value. The value | ||||
|      *         itself may be an array as well if multiple comma-separated | ||||
|      *         values were indicated in the vCard source. | ||||
|      */ | ||||
|     function _parseN($text) | ||||
|     { | ||||
|         // make sure there are always at least 5 elements
 | ||||
|         $tmp = array_pad($this->splitBySemi($text), 5, ''); | ||||
|         return array( | ||||
|             $this->splitByComma($tmp[0]), // family (last)
 | ||||
|             $this->splitByComma($tmp[1]), // given (first)
 | ||||
|             $this->splitByComma($tmp[2]), // addl (middle)
 | ||||
|             $this->splitByComma($tmp[3]), // prefix
 | ||||
|             $this->splitByComma($tmp[4])  // suffix
 | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Parses a vCard line value identified as being of the "ADR" | ||||
|      * (structured address) type-defintion. | ||||
|      * | ||||
|      * @param string $text The right-part (after-the-colon part) of a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return array An array of key-value pairs where the key is the | ||||
|      *         portion-name and the value is the portion-value. The  | ||||
|      *         value itself may be an array as well if multiple comma- | ||||
|      *         separated values were indicated in the vCard source. | ||||
|      */ | ||||
|     function _parseADR($text) | ||||
|     { | ||||
|         // make sure there are always at least 7 elements
 | ||||
|         $tmp = array_pad($this->splitBySemi($text), 7, ''); | ||||
|         return array( | ||||
|             $this->splitByComma($tmp[0]), // pob
 | ||||
|             $this->splitByComma($tmp[1]), // extend
 | ||||
|             $this->splitByComma($tmp[2]), // street
 | ||||
|             $this->splitByComma($tmp[3]), // locality (city)
 | ||||
|             $this->splitByComma($tmp[4]), // region (state)
 | ||||
|             $this->splitByComma($tmp[5]), // postcode (ZIP)
 | ||||
|             $this->splitByComma($tmp[6])  // country
 | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Parses a vCard line value identified as being of the "NICKNAME" | ||||
|      * (informal or descriptive name) type-defintion. | ||||
|      * | ||||
|      * @param string $text The right-part (after-the-colon part) of a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return array An array of nicknames. | ||||
|      */ | ||||
|     function _parseNICKNAME($text) | ||||
|     { | ||||
|         return array($this->splitByComma($text)); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Parses a vCard line value identified as being of the "ORG" | ||||
|      * (organizational info) type-defintion. | ||||
|      * | ||||
|      * @param string $text The right-part (after-the-colon part) of a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return array An array of organizations; each element of the array | ||||
|      *         is itself an array, which indicates primary organization and | ||||
|      *         sub-organizations. | ||||
|      */ | ||||
|     function _parseORG($text) | ||||
|     { | ||||
|         $tmp  = $this->splitbySemi($text); | ||||
|         $list = array(); | ||||
|         foreach ($tmp as $val) { | ||||
|             $list[] = array($val); | ||||
|         } | ||||
| 
 | ||||
|         return $list; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Parses a vCard line value identified as being of the "CATEGORIES" | ||||
|      * (card-category) type-defintion. | ||||
|      * | ||||
|      * @param string $text The right-part (after-the-colon part) of a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return array An array of categories. | ||||
|      */ | ||||
|     function _parseCATEGORIES($text) | ||||
|     { | ||||
|         return array($this->splitByComma($text)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Parses a vCard line value identified as being of the "GEO" | ||||
|      * (geographic coordinate) type-defintion. | ||||
|      * | ||||
|      * @param string $text The right-part (after-the-colon part) of a | ||||
|      *        vCard line. | ||||
|      * | ||||
|      * @access private | ||||
|      * @return array An array of lat-lon geocoords. | ||||
|      */ | ||||
|     function _parseGEO($text) | ||||
|     { | ||||
|         // make sure there are always at least 2 elements
 | ||||
|         $tmp = array_pad($this->splitBySemi($text), 2, ''); | ||||
|         return array( | ||||
|             array($tmp[0]), // lat
 | ||||
|             array($tmp[1])  // lon
 | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| ?>
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue