home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 April / CMCD0404.ISO / Software / Freeware / Programare / dotproject / lib / PEAR / Contact_Vcard_Parse.php < prev    next >
PHP Script  |  2003-09-18  |  25KB  |  818 lines

  1. <?php
  2. /* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */ 
  3. // +----------------------------------------------------------------------+ 
  4. // | PHP version 4                                                        | 
  5. // +----------------------------------------------------------------------+ 
  6. // | Copyright (c) 1997-2002 The PHP Group                                | 
  7. // +----------------------------------------------------------------------+ 
  8. // | This source file is subject to version 2.0 of the PHP license,       | 
  9. // | that is bundled with this package in the file LICENSE, and is        | 
  10. // | available at through the world-wide-web at                           | 
  11. // | http://www.php.net/license/2_02.txt.                                 | 
  12. // | If you did not receive a copy of the PHP license and are unable to   | 
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               | 
  15. // +----------------------------------------------------------------------+ 
  16. // | Authors: Paul M. Jones <pjones@ciaweb.net>                           | 
  17. // +----------------------------------------------------------------------+ 
  18. // 
  19. // $Id: Contact_Vcard_Parse.php,v 1.1 2003/09/17 19:05:51 gregorerhardt Exp $ 
  20.  
  21.  
  22. //dP dotproject | gregorerhardt 20030914:
  23. //dP commented out some lines for running without PEAR base class
  24. //dP all these commented lines begin with //dP
  25. //dP this is not the original Contact_Vcard_Build.php file.
  26. //dP to get the original file:     check pear.php.net or
  27. //dP                contact the author mentioned above
  28.  
  29.  
  30. /**
  31. *
  32. * Parser for vCards.
  33. *
  34. * This class parses vCard 2.1 and 3.0 sources from file or text into a
  35. * structured array.
  36. * Usage:
  37. * <code>
  38. *     // include this class file
  39. *     require_once 'Contact_Vcard_Parse.php';
  40. *     
  41. *     // instantiate a parser object
  42. *     $parse = new Contact_Vcard_Parse();
  43. *     
  44. *     // parse a vCard file and store the data
  45. *     // in $cardinfo
  46. *     $cardinfo = $parse->fromFile('sample.vcf');
  47. *     
  48. *     // view the card info array
  49. *     echo '<pre>';
  50. *     print_r($cardinfo);
  51. *     echo '</pre>';
  52. * </code>
  53. *
  54. * @author Paul M. Jones <pjones@ciaweb.net>
  55. * @package Contact_Vcard_Parse
  56. * @version $Revision: 1.1 $
  57. */
  58.  
  59. //dP require_once 'PEAR.php';
  60.  
  61. //dP class Contact_Vcard_Parse extends PEAR {
  62. class Contact_Vcard_Parse {
  63.     
  64.     /**
  65.     *
  66.     * Constructor.
  67.     *
  68.     * @access public
  69.     * @return void
  70.     *
  71.     */
  72.     
  73.     function Contact_Vcard_Parse()
  74.     {
  75.         //$this->PEAR();
  76.     }
  77.     
  78.  
  79.     /**
  80.     * 
  81.     * Reads a file for parsing, then sends it to $this->fromText()
  82.     * and returns the results.
  83.     * 
  84.     * @access public
  85.     * 
  86.     * @param array $filename The filename to read for vCard information.
  87.     *
  88.     * @return array An array of of vCard information extracted from the
  89.     * file.
  90.     * 
  91.     * @see Contact_Vcard_Parse::_fromText()
  92.     * @see Contact_Vcard_Parse::_fromArray()
  93.     * 
  94.     */
  95.     
  96.     function fromFile($filename, $decode_qp = true)
  97.     {
  98.         // get the file data
  99.         $text = implode('', file($filename));
  100.         
  101.         // dump to, and get return from, the fromText() method.
  102.         return $this->fromText($text, $decode_qp);
  103.     }
  104.     
  105.     
  106.     /**
  107.     * 
  108.     * Prepares a block of text for parsing, then sends it through and
  109.     * returns the results from $this->fromArray().
  110.     * 
  111.     * @access public
  112.     * 
  113.     * @param array $text A block of text to read for vCard information.
  114.     * 
  115.     * @return array An array of vCard information extracted from the
  116.     * source text.
  117.     * 
  118.     * @see Contact_Vcard_Parse::_fromArray()
  119.     * 
  120.     */
  121.     
  122.     function fromText($text, $decode_qp = true)
  123.     {
  124.         // convert all kinds of line endings to Unix-standard and get
  125.         // rid of double blank lines.
  126.         $this->convertLineEndings($text);
  127.         
  128.         // unfold lines.  concat two lines where line 1 ends in \n and
  129.         // line 2 starts with any amount of whitespace.  only removes
  130.         // the first whitespace character, leaves others in place.
  131.         $fold_regex = '(\n)([ |\t])';
  132.         $text = preg_replace("/$fold_regex/i", "", $text);
  133.         
  134.         // convert the resulting text to an array of lines
  135.         $lines = explode("\n", $text);
  136.         
  137.         // parse the array of lines and return vCard info
  138.         return $this->_fromArray($lines, $decode_qp);
  139.     }
  140.     
  141.     
  142.     /**
  143.     * 
  144.     * Converts line endings in text.
  145.     * 
  146.     * Takes any text block and converts all line endings to UNIX
  147.     * standard. DOS line endings are \r\n, Mac are \r, and UNIX is \n.
  148.     * As a side-effect, all double-newlines (\n\n) are converted to a
  149.     * single-newline.
  150.     *
  151.     * NOTE: Acts on the text block in-place; does not return a value.
  152.     * 
  153.     * @access public
  154.     * 
  155.     * @param string $text The string on which to convert line endings.
  156.     *
  157.     * @return void
  158.     * 
  159.     */
  160.     
  161.     function convertLineEndings(&$text)
  162.     {
  163.         // first, replace \r with \n to fix up from DOS and Mac
  164.         $text = str_replace("\r", "\n", $text);
  165.         
  166.         // now eliminate all instances of double-newlines that result
  167.         // from having converted \r\n to \n\n (from DOS).  note that
  168.         // this removes newlines in general, not only if they resulted
  169.         // from the earlier conversion of \r.
  170.         $text = str_replace("\n\n", "\n", $text);
  171.     }
  172.     
  173.     
  174.     /**
  175.     * 
  176.     * Splits a string into an array at semicolons.  Honors backslash-
  177.     * escaped semicolons (i.e., splits at ';' not '\;').
  178.     * 
  179.     * @access public
  180.     * 
  181.     * @param string $text The string to split into an array.
  182.     * 
  183.     * @param bool $convertSingle If splitting the string results in a
  184.     * single array element, return a string instead of a one-element
  185.     * array.
  186.     * 
  187.     * @return mixed An array of values, or a single string.
  188.     * 
  189.     */
  190.     
  191.     function splitBySemi($text, $convertSingle = false)
  192.     {
  193.         // we use these double-backs (\\) because they get get converted
  194.         // to single-backs (\) by preg_split.  the quad-backs (\\\\) end
  195.         // up as as double-backs (\\), which is what preg_split requires
  196.         // to indicate a single backslash (\). what a mess.
  197.         $regex = '(?<!\\\\)(\;)';
  198.         $tmp = preg_split("/$regex/i", $text);
  199.         
  200.         // if there is only one array-element and $convertSingle is
  201.         // true, then return only the value of that one array element
  202.         // (instead of returning the array).
  203.         if ($convertSingle && count($tmp) == 1) {
  204.             return $tmp[0];
  205.         } else {
  206.             return $tmp;
  207.         }
  208.     }
  209.     
  210.     
  211.     /**
  212.     * 
  213.     * Splits a string into an array at commas.  Honors backslash-
  214.     * escaped commas (i.e., splits at ',' not '\,').
  215.     * 
  216.     * @access public
  217.     * 
  218.     * @param string $text The string to split into an array.
  219.     * 
  220.     * @param bool $convertSingle If splitting the string results in a
  221.     * single array element, return a string instead of a one-element
  222.     * array.
  223.     * 
  224.     * @return mixed An array of values, or a single string.
  225.     *
  226.     */
  227.     
  228.     function splitByComma($text, $convertSingle = false)
  229.     {
  230.         // we use these double-backs (\\) because they get get converted
  231.         // to single-backs (\) by preg_split.  the quad-backs (\\\\) end
  232.         // up as as double-backs (\\), which is what preg_split requires
  233.         // to indicate a single backslash (\). ye gods, how ugly.
  234.         $regex = '(?<!\\\\)(\,)';
  235.         $tmp = preg_split("/$regex/i", $text);
  236.         
  237.         // if there is only one array-element and $convertSingle is
  238.         // true, then return only the value of that one array element
  239.         // (instead of returning the array).
  240.         if ($convertSingle && count($tmp) == 1) {
  241.             return $tmp[0];
  242.         } else {
  243.             return $tmp;
  244.         }
  245.     }
  246.     
  247.     
  248.     /**
  249.     * 
  250.     * Used to make string human-readable after being a vCard value.
  251.     * 
  252.     * Converts...
  253.     *     \; => ;
  254.     *     \, => ,
  255.     *     literal \n => newline
  256.     * 
  257.     * @access public
  258.     * 
  259.     * @param mixed $text The text to unescape.
  260.     * 
  261.     * @return void
  262.     *
  263.     */
  264.     
  265.     function unescape(&$text)
  266.     {
  267.         if (is_array($text)) {
  268.             foreach ($text as $key => $val) {
  269.                 $this->unescape($val);
  270.                 $text[$key] = $val;
  271.             }
  272.         } else {
  273.             $text = str_replace('\;', ';', $text);
  274.             $text = str_replace('\,', ',', $text);
  275.             $text = str_replace('\n', "\n", $text);
  276.         }
  277.     }
  278.     
  279.     
  280.     /**
  281.     *
  282.     * Emulated destructor.
  283.     *
  284.     * @access private
  285.     * @return boolean true
  286.     *
  287.     */
  288.     
  289.     function _Contact_Vcard_Parse()
  290.     {
  291.         return true;
  292.     }
  293.     
  294.  
  295.     /**
  296.     * 
  297.     * Parses an array of source lines and returns an array of vCards.
  298.     * Each element of the array is itself an array expressing the types,
  299.     * parameters, and values of each part of the vCard. Processes both
  300.     * 2.1 and 3.0 vCard sources.
  301.     *
  302.     * @access private
  303.     * 
  304.     * @param array $source An array of lines to be read for vCard
  305.     * information.
  306.     * 
  307.     * @return array An array of of vCard information extracted from the
  308.     * source array.
  309.     * 
  310.     */
  311.     
  312.     function _fromArray($source, $decode_qp = true)
  313.     {
  314.         // the info array will hold all resulting vCard information.
  315.         $info = array();
  316.         
  317.         // tells us whether the source text indicates the beginning of a
  318.         // new vCard with a BEGIN:VCARD tag.
  319.         $begin = false;
  320.         
  321.         // holds information about the current vCard being read from the
  322.         // source text.
  323.         $card = array();
  324.         
  325.         // loop through each line in the source array
  326.         foreach ($source as $line) {
  327.             
  328.             // if the line is blank, skip it.
  329.             if (trim($line) == '') {
  330.                 continue;
  331.             }
  332.             
  333.             // find the first instance of ':' on the line.  The part
  334.             // to the left of the colon is the type and parameters;
  335.             // the part to the right of the colon is the value data.
  336.             $pos = strpos($line, ':');
  337.             
  338.             // if there is no colon, skip the line.
  339.             if ($pos === false) {
  340.                 continue;
  341.             }
  342.             
  343.             // get the left and right portions
  344.             $left = trim(substr($line, 0, $pos));
  345.             $right = trim(substr($line, $pos+1, strlen($line)));
  346.             
  347.             // have we started yet?
  348.             if (! $begin) {
  349.                 
  350.                 // nope.  does this line indicate the beginning of
  351.                 // a new vCard?
  352.                 if (strtoupper($left) == 'BEGIN' &&
  353.                     strtoupper($right) == 'VCARD') {
  354.                     
  355.                     // tell the loop that we've begun a new card
  356.                     $begin = true;
  357.                 }
  358.                 
  359.                 // regardless, loop to the next line of source. if begin
  360.                 // is still false, the next loop will check the line. if
  361.                 // begin has now been set to true, the loop will start
  362.                 // collecting card info.
  363.                 continue;
  364.                 
  365.             } else {
  366.                 
  367.                 // yep, we've started, but we don't know how far along
  368.                 // we are in the card. is this the ending line of the
  369.                 // current vCard?
  370.                 if (strtoupper($left) == 'END' &&
  371.                     strtoupper($right) == 'VCARD') {
  372.                     
  373.                     // yep, we're done. keep the info from the current
  374.                     // card...
  375.                     $info[] = $card;
  376.                     
  377.                     // ...and reset to grab a new card if one exists in
  378.                     // the source array.
  379.                     $begin = false;
  380.                     $card = array();
  381.                     
  382.                 } else {
  383.                     
  384.                     // we're not on an ending line, so collect info from
  385.                     // this line into the current card. split the
  386.                     // left-portion of the line into a type-definition
  387.                     // (the kind of information) and parameters for the
  388.                     // type.
  389.                     $typedef = $this->_getTypeDef($left);
  390.                     $params = $this->_getParams($left);
  391.                     
  392.                     // if we are decoding quoted-printable, do so now.
  393.                     // QUOTED-PRINTABLE is not allowed in version 3.0,
  394.                     // but we don't check for versioning, so we do it
  395.                     // regardless.  ;-)
  396.                     $this->_decode_qp($params, $right);
  397.                     
  398.                     // now get the value-data from the line, based on
  399.                     // the typedef
  400.                     switch ($typedef) {
  401.                         
  402.                     case 'N':
  403.                         // structured name of the person
  404.                         $value = $this->_parseN($right);
  405.                         break;
  406.                         
  407.                     case 'ADR':
  408.                         // structured address of the person
  409.                         $value = $this->_parseADR($right);
  410.                         break;
  411.                         
  412.                     case 'NICKNAME':
  413.                         // nicknames
  414.                         $value = $this->_parseNICKNAME($right);
  415.                         break;
  416.                         
  417.                     case 'ORG':
  418.                         // organizations the person belongs to
  419.                         $value = $this->_parseORG($right);
  420.                         break;
  421.                         
  422.                     case 'CATEGORIES':
  423.                         // categories to which this card is assigned
  424.                         $value = $this->_parseCATEGORIES($right);
  425.                         break;
  426.                         
  427.                     case 'GEO':
  428.                         // geographic coordinates
  429.                         $value = $this->_parseGEO($right);
  430.                         break;
  431.                         
  432.                     default:
  433.                         // by default, just grab the plain value. keep
  434.                         // as an array to make sure *all* values are
  435.                         // arrays.  for consistency. ;-)
  436.                         $value = array(array($right));
  437.                         break;
  438.                     }
  439.                     
  440.                     // add the type, parameters, and value to the
  441.                     // current card array.  note that we allow multiple
  442.                     // instances of the same type, which might be dumb
  443.                     // in some cases (e.g., N).
  444.                     $card[$typedef][] = array(
  445.                         'param' => $params,
  446.                         'value' => $value
  447.                     );
  448.                 }
  449.             }
  450.         }
  451.         
  452.         $this->unescape($info);
  453.         return $info;
  454.     }
  455.     
  456.     
  457.     /**
  458.     *
  459.     * Takes a vCard line and extracts the Type-Definition for the line.
  460.     * 
  461.     * @access private
  462.     *
  463.     * @param string $text A left-part (before-the-colon part) from a
  464.     * vCard line.
  465.     * 
  466.     * @return string The type definition for the line.
  467.     * 
  468.     */
  469.  
  470.     function _getTypeDef($text)
  471.     {
  472.         // split the text by semicolons
  473.         $split = $this->splitBySemi($text);
  474.         
  475.         // only return first element (the typedef)
  476.         return $split[0];
  477.     }
  478.     
  479.     
  480.     /**
  481.     *
  482.     * Finds the Type-Definition parameters for a vCard line.
  483.     * 
  484.     * @access private
  485.     * 
  486.     * @param string $text A left-part (before-the-colon part) from a
  487.     * vCard line.
  488.     * 
  489.     * @return mixed An array of parameters.
  490.     * 
  491.     */
  492.     
  493.     function _getParams($text)
  494.     {
  495.         // split the text by semicolons into an array
  496.         $split = $this->splitBySemi($text);
  497.         
  498.         // drop the first element of the array (the type-definition)
  499.         array_shift($split);
  500.         
  501.         // set up an array to retain the parameters, if any
  502.         $params = array();
  503.         
  504.         // loop through each parameter.  the params may be in the format...
  505.         // "TYPE=type1,type2,type3"
  506.         //    ...or...
  507.         // "TYPE=type1;TYPE=type2;TYPE=type3"
  508.         foreach ($split as $full) {
  509.             
  510.             // split the full parameter at the equal sign so we can tell
  511.             // the parameter name from the parameter value
  512.             $tmp = explode("=", $full);
  513.             
  514.             // the key is the left portion of the parameter (before
  515.             // '='). if in 2.1 format, the key may in fact be the
  516.             // parameter value, not the parameter name.
  517.             $key = strtoupper(trim($tmp[0]));
  518.             
  519.             // get the parameter name by checking to see if it's in
  520.             // vCard 2.1 or 3.0 format.
  521.             $name = $this->_getParamName($key);
  522.             
  523.             // list of all parameter values
  524.             $listall = trim($tmp[1]);
  525.             
  526.             // if there is a value-list for this parameter, they are
  527.             // separated by commas, so split them out too.
  528.             $list = $this->splitByComma($listall);
  529.             
  530.             // now loop through each value in the parameter and retain
  531.             // it.  if the value is blank, that means it's a 2.1-style
  532.             // param, and the key itself is the value.
  533.             foreach ($list as $val) {
  534.                 if (trim($val) != '') {
  535.                     // 3.0 formatted parameter
  536.                     $params[$name][] = trim($val);
  537.                 } else {
  538.                     // 2.1 formatted parameter
  539.                     $params[$name][] = $key;
  540.                 }
  541.             }
  542.             
  543.             // if, after all this, there are no parameter values for the
  544.             // parameter name, retain no info about the parameter (saves
  545.             // ram and checking-time later).
  546.             if (count($params[$name]) == 0) {
  547.                 unset($params[$name]);
  548.             }
  549.         }
  550.         
  551.         // return the parameters array.
  552.         return $params;
  553.     }
  554.     
  555.     
  556.     /**
  557.     *
  558.     * Looks at the parameters of a vCard line; if one of them is
  559.     * ENCODING[] => QUOTED-PRINTABLE then decode the text in-place.
  560.     * 
  561.     * @access private
  562.     * 
  563.     * @param array $params A parameter array from a vCard line.
  564.     * 
  565.     * @param string $text A right-part (after-the-colon part) from a
  566.     * vCard line.
  567.     *
  568.     * @return void
  569.     * 
  570.     */
  571.     
  572.     function _decode_qp(&$params, &$text)
  573.     {
  574.         // loop through each parameter
  575.         foreach ($params as $param_key => $param_val) {
  576.             
  577.             // check to see if it's an encoding param
  578.             if (trim(strtoupper($param_key)) == 'ENCODING') {
  579.             
  580.                 // loop through each encoding param value
  581.                 foreach ($param_val as $enc_key => $enc_val) {
  582.                 
  583.                     // if any of the values are QP, decode the text
  584.                     // in-place and return
  585.                     if (trim(strtoupper($enc_val)) == 'QUOTED-PRINTABLE') {
  586.                         $text = quoted_printable_decode($text);
  587.                         return;
  588.                     }
  589.                 }
  590.             }
  591.         }
  592.     }
  593.     
  594.     
  595.     /**
  596.     * 
  597.     * Returns parameter names from 2.1-formatted vCards.
  598.     *
  599.     * The vCard 2.1 specification allows parameter values without a
  600.     * name. The parameter name is then determined from the unique
  601.     * parameter value.
  602.     * 
  603.     * Shamelessly lifted from Frank Hellwig <frank@hellwig.org> and his
  604.     * vCard PHP project <http://vcardphp.sourceforge.net>.
  605.     * 
  606.     * @access private
  607.     *
  608.     * @param string $value The first element in a parameter name-value
  609.     * pair.
  610.     * 
  611.     * @return string The proper parameter name (TYPE, ENCODING, or
  612.     * VALUE).
  613.     * 
  614.     */
  615.      
  616.     function _getParamName($value)
  617.     {
  618.         static $types = array (
  619.             'DOM', 'INTL', 'POSTAL', 'PARCEL','HOME', 'WORK',
  620.             'PREF', 'VOICE', 'FAX', 'MSG', 'CELL', 'PAGER',
  621.             'BBS', 'MODEM', 'CAR', 'ISDN', 'VIDEO',
  622.             'AOL', 'APPLELINK', 'ATTMAIL', 'CIS', 'EWORLD',
  623.             'INTERNET', 'IBMMAIL', 'MCIMAIL',
  624.             'POWERSHARE', 'PRODIGY', 'TLX', 'X400',
  625.             'GIF', 'CGM', 'WMF', 'BMP', 'MET', 'PMB', 'DIB',
  626.             'PICT', 'TIFF', 'PDF', 'PS', 'JPEG', 'QTIME',
  627.             'MPEG', 'MPEG2', 'AVI',
  628.             'WAVE', 'AIFF', 'PCM',
  629.             'X509', 'PGP'
  630.         );
  631.         
  632.         // CONTENT-ID added by pmj
  633.         static $values = array (
  634.             'INLINE', 'URL', 'CID', 'CONTENT-ID'
  635.         );
  636.         
  637.         // 8BIT added by pmj
  638.         static $encodings = array (
  639.             '7BIT', '8BIT', 'QUOTED-PRINTABLE', 'BASE64'
  640.         );
  641.         
  642.         // changed by pmj to the following so that the name defaults to
  643.         // whatever the original value was.  Frank Hellwig's original
  644.         // code was "$name = 'UNKNOWN'".
  645.         $name = $value;
  646.         
  647.         if (in_array($value, $types)) {
  648.             $name = 'TYPE';
  649.         } elseif (in_array($value, $values)) {
  650.             $name = 'VALUE';
  651.         } elseif (in_array($value, $encodings)) {
  652.             $name = 'ENCODING';
  653.         }
  654.         
  655.         return $name;
  656.     }
  657.     
  658.     
  659.     /**
  660.     *
  661.     * Parses a vCard line value identified as being of the "N"
  662.     * (structured name) type-defintion.
  663.     *
  664.     * @access private
  665.     *
  666.     * @param string $text The right-part (after-the-colon part) of a
  667.     * vCard line.
  668.     * 
  669.     * @return array An array of key-value pairs where the key is the
  670.     * portion-name and the value is the portion-value.  The value itself
  671.     * may be an array as well if multiple comma-separated values were
  672.     * indicated in the vCard source.
  673.     *
  674.     */
  675.     
  676.     function _parseN($text)
  677.     {
  678.         $tmp = $this->splitBySemi($text);
  679.         return array(
  680.             $this->splitByComma($tmp[0]), // family (last)
  681.             $this->splitByComma($tmp[1]), // given (first)
  682.             $this->splitByComma($tmp[2]), // addl (middle)
  683.             $this->splitByComma($tmp[3]), // prefix
  684.             $this->splitByComma($tmp[4])  // suffix
  685.         );
  686.     }
  687.     
  688.     
  689.     /**
  690.     *
  691.     * Parses a vCard line value identified as being of the "ADR"
  692.     * (structured address) type-defintion.
  693.     *
  694.     * @access private
  695.     *
  696.     * @param string $text The right-part (after-the-colon part) of a
  697.     * vCard line.
  698.     * 
  699.     * @return array An array of key-value pairs where the key is the
  700.     * portion-name and the value is the portion-value.  The value itself
  701.     * may be an array as well if multiple comma-separated values were
  702.     * indicated in the vCard source.
  703.     *
  704.     */
  705.     
  706.     function _parseADR($text)
  707.     {
  708.         $tmp = $this->splitBySemi($text);
  709.         return array(
  710.             $this->splitByComma($tmp[0]), // pob
  711.             $this->splitByComma($tmp[1]), // extend
  712.             $this->splitByComma($tmp[2]), // street
  713.             $this->splitByComma($tmp[3]), // locality (city)
  714.             $this->splitByComma($tmp[4]), // region (state)
  715.             $this->splitByComma($tmp[5]), // postcode (ZIP)
  716.             $this->splitByComma($tmp[6])  // country
  717.         );
  718.     }
  719.     
  720.     
  721.     /**
  722.     * 
  723.     * Parses a vCard line value identified as being of the "NICKNAME"
  724.     * (informal or descriptive name) type-defintion.
  725.     *
  726.     * @access private
  727.     * 
  728.     * @param string $text The right-part (after-the-colon part) of a
  729.     * vCard line.
  730.     * 
  731.     * @return array An array of nicknames.
  732.     *
  733.     */
  734.     
  735.     function _parseNICKNAME($text)
  736.     {
  737.         return array($this->splitByComma($text));
  738.     }
  739.     
  740.     
  741.     /**
  742.     * 
  743.     * Parses a vCard line value identified as being of the "ORG"
  744.     * (organizational info) type-defintion.
  745.     *
  746.     * @access private
  747.     *
  748.     * @param string $text The right-part (after-the-colon part) of a
  749.     * vCard line.
  750.     * 
  751.     * @return array An array of organizations; each element of the array
  752.     * is itself an array, which indicates primary organization and
  753.     * sub-organizations.
  754.     *
  755.     */
  756.     
  757.     function _parseORG($text)
  758.     {
  759.         $tmp = $this->splitbySemi($text);
  760.         $list = array();
  761.         foreach ($tmp as $val) {
  762.             $list[] = array($val);
  763.         }
  764.         
  765.         return $list;
  766.     }
  767.     
  768.     
  769.     /**
  770.     * 
  771.     * Parses a vCard line value identified as being of the "CATEGORIES"
  772.     * (card-category) type-defintion.
  773.     *
  774.     * @access private
  775.     * 
  776.     * @param string $text The right-part (after-the-colon part) of a
  777.     * vCard line.
  778.     * 
  779.     * @return mixed An array of categories.
  780.     *
  781.     */
  782.     
  783.     function _parseCATEGORIES($text)
  784.     {
  785.         return array($this->splitByComma($text));
  786.     }
  787.     
  788.     
  789.     /**
  790.     * 
  791.     * Parses a vCard line value identified as being of the "GEO"
  792.     * (geographic coordinate) type-defintion.
  793.     *
  794.     * @access private
  795.     *
  796.     * @param string $text The right-part (after-the-colon part) of a
  797.     * vCard line.
  798.     * 
  799.     * @return mixed An array of lat-lon geocoords.
  800.     *
  801.     */
  802.     
  803.     function _parseGEO($text)
  804.     {
  805.         $tmp = $this->splitBySemi($text);
  806.         return array(
  807.             array($tmp[0]), // lat
  808.             array($tmp[1])  // lon
  809.         );
  810.     }
  811. }
  812.  
  813. ?>
  814.