Blame view

sources/3rdparty/Sabre/VObject/Property/Compound.php 3.28 KB
03e52840d   Kload   Init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  <?php
  
  namespace Sabre\VObject\Property;
  
  use Sabre\VObject;
  
  /**
  * Compound property.
  *
  * This class adds (de)serialization of compound properties to/from arrays.
  *
  * Currently the following properties from RFC 6350 are mapped to use this
  * class:
  *
  *  N:          Section 6.2.2
  *  ADR:        Section 6.3.1
  *  ORG:        Section 6.6.4
  *  CATEGORIES: Section 6.7.1
  *
  * In order to use this correctly, you must call setParts and getParts to
  * retrieve and modify dates respectively.
  *
  * @author Thomas Tanghus (http://tanghus.net/)
  * @author Lars Kneschke
  * @author Evert Pot (http://www.rooftopsolutions.nl/)
  * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved.
  * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
  */
  
  /**
  * This class represents a compound property in a vCard.
  */
  class Compound extends VObject\Property {
  
      /**
      * If property names are added to this map, they will be (de)serialised as arrays
      * using the getParts() and setParts() methods.
      * The keys are the property names, values are delimiter chars.
      *
      * @var array
      */
      static public $delimiterMap = array(
          'N'				=>	';',
          'ADR'			=>	';',
          'ORG'			=>	';',
          'CATEGORIES'	=>	',',
      );
  
      /**
       * The currently used delimiter.
       *
       * @var string
       */
      protected $delimiter = null;
  
      /**
      * Get a compound value as an array.
      *
      * @param $name string
      * @return array
      */
      public function getParts() {
  
          if (is_null($this->value)) {
              return array();
          }
  
          $delimiter = $this->getDelimiter();
  
          // split by any $delimiter which is NOT prefixed by a slash.
          // Note that this is not a a perfect solution. If a value is prefixed
          // by two slashes, it should actually be split anyway.
          //
          // Hopefully we can fix this better in a future version, where we can
          // break compatibility a bit.
          $compoundValues = preg_split("/(?<!\\\)$delimiter/", $this->value);
  
          // remove slashes from any semicolon and comma left escaped in the single values
          $compoundValues = array_map(
              function($val) {
                  return strtr($val, array('\,' => ',', '\;' => ';'));
          }, $compoundValues);
  
          return $compoundValues;
  
      }
  
      /**
       * Returns the delimiter for this property.
       *
       * @return string
       */
      public function getDelimiter() {
  
          if (!$this->delimiter) {
              if (isset(self::$delimiterMap[$this->name])) {
                  $this->delimiter = self::$delimiterMap[$this->name];
              } else {
                  // To be a bit future proof, we are going to default the
                  // delimiter to ;
                  $this->delimiter = ';';
              }
          }
          return $this->delimiter;
  
      }
  
      /**
       * Set a compound value as an array.
       *
      *
      * @param $name string
      * @return array
      */
      public function setParts(array $values) {
  
          // add slashes to all semicolons and commas in the single values
          $values = array_map(
              function($val) {
                  return strtr($val, array(',' => '\,', ';' => '\;'));
              }, $values);
  
          $this->setValue(
              implode($this->getDelimiter(), $values)
          );
  
      }
  
  }