comparison plugins/libcalendaring/lib/Sabre/VObject/Property/Compound.php @ 4:888e774ee983

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