Mercurial > hg > rc1
comparison vendor/sabre/vobject/lib/Parameter.php @ 7:430dbd5346f7
vendor sabre as distributed
| author | Charlie Root |
|---|---|
| date | Sat, 13 Jan 2018 09:06:10 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 6:cec75ba50afc | 7:430dbd5346f7 |
|---|---|
| 1 <?php | |
| 2 | |
| 3 namespace Sabre\VObject; | |
| 4 | |
| 5 use | |
| 6 ArrayObject; | |
| 7 | |
| 8 /** | |
| 9 * VObject Parameter | |
| 10 * | |
| 11 * This class represents a parameter. A parameter is always tied to a property. | |
| 12 * In the case of: | |
| 13 * DTSTART;VALUE=DATE:20101108 | |
| 14 * VALUE=DATE would be the parameter name and value. | |
| 15 * | |
| 16 * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/). | |
| 17 * @author Evert Pot (http://evertpot.com/) | |
| 18 * @license http://sabre.io/license/ Modified BSD License | |
| 19 */ | |
| 20 class Parameter extends Node { | |
| 21 | |
| 22 /** | |
| 23 * Parameter name | |
| 24 * | |
| 25 * @var string | |
| 26 */ | |
| 27 public $name; | |
| 28 | |
| 29 /** | |
| 30 * vCard 2.1 allows parameters to be encoded without a name. | |
| 31 * | |
| 32 * We can deduce the parameter name based on it's value. | |
| 33 * | |
| 34 * @var bool | |
| 35 */ | |
| 36 public $noName = false; | |
| 37 | |
| 38 /** | |
| 39 * Parameter value | |
| 40 * | |
| 41 * @var string | |
| 42 */ | |
| 43 protected $value; | |
| 44 | |
| 45 /** | |
| 46 * Sets up the object. | |
| 47 * | |
| 48 * It's recommended to use the create:: factory method instead. | |
| 49 * | |
| 50 * @param string $name | |
| 51 * @param string $value | |
| 52 */ | |
| 53 public function __construct(Document $root, $name, $value = null) { | |
| 54 | |
| 55 $this->name = strtoupper($name); | |
| 56 $this->root = $root; | |
| 57 if (is_null($name)) { | |
| 58 $this->noName = true; | |
| 59 $this->name = static::guessParameterNameByValue($value); | |
| 60 } | |
| 61 | |
| 62 // If guessParameterNameByValue() returns an empty string | |
| 63 // above, we're actually dealing with a parameter that has no value. | |
| 64 // In that case we have to move the value to the name. | |
| 65 if ($this->name === '') { | |
| 66 $this->noName = false; | |
| 67 $this->name = strtoupper($value); | |
| 68 } else { | |
| 69 $this->setValue($value); | |
| 70 } | |
| 71 | |
| 72 } | |
| 73 | |
| 74 /** | |
| 75 * Try to guess property name by value, can be used for vCard 2.1 nameless parameters. | |
| 76 * | |
| 77 * Figuring out what the name should have been. Note that a ton of | |
| 78 * these are rather silly in 2014 and would probably rarely be | |
| 79 * used, but we like to be complete. | |
| 80 * | |
| 81 * @param string $value | |
| 82 * @return string | |
| 83 */ | |
| 84 public static function guessParameterNameByValue($value) { | |
| 85 switch(strtoupper($value)) { | |
| 86 | |
| 87 // Encodings | |
| 88 case '7-BIT' : | |
| 89 case 'QUOTED-PRINTABLE' : | |
| 90 case 'BASE64' : | |
| 91 $name = 'ENCODING'; | |
| 92 break; | |
| 93 | |
| 94 // Common types | |
| 95 case 'WORK' : | |
| 96 case 'HOME' : | |
| 97 case 'PREF' : | |
| 98 | |
| 99 // Delivery Label Type | |
| 100 case 'DOM' : | |
| 101 case 'INTL' : | |
| 102 case 'POSTAL' : | |
| 103 case 'PARCEL' : | |
| 104 | |
| 105 // Telephone types | |
| 106 case 'VOICE' : | |
| 107 case 'FAX' : | |
| 108 case 'MSG' : | |
| 109 case 'CELL' : | |
| 110 case 'PAGER' : | |
| 111 case 'BBS' : | |
| 112 case 'MODEM' : | |
| 113 case 'CAR' : | |
| 114 case 'ISDN' : | |
| 115 case 'VIDEO' : | |
| 116 | |
| 117 // EMAIL types (lol) | |
| 118 case 'AOL' : | |
| 119 case 'APPLELINK' : | |
| 120 case 'ATTMAIL' : | |
| 121 case 'CIS' : | |
| 122 case 'EWORLD' : | |
| 123 case 'INTERNET' : | |
| 124 case 'IBMMAIL' : | |
| 125 case 'MCIMAIL' : | |
| 126 case 'POWERSHARE' : | |
| 127 case 'PRODIGY' : | |
| 128 case 'TLX' : | |
| 129 case 'X400' : | |
| 130 | |
| 131 // Photo / Logo format types | |
| 132 case 'GIF' : | |
| 133 case 'CGM' : | |
| 134 case 'WMF' : | |
| 135 case 'BMP' : | |
| 136 case 'DIB' : | |
| 137 case 'PICT' : | |
| 138 case 'TIFF' : | |
| 139 case 'PDF ': | |
| 140 case 'PS' : | |
| 141 case 'JPEG' : | |
| 142 case 'MPEG' : | |
| 143 case 'MPEG2' : | |
| 144 case 'AVI' : | |
| 145 case 'QTIME' : | |
| 146 | |
| 147 // Sound Digital Audio Type | |
| 148 case 'WAVE' : | |
| 149 case 'PCM' : | |
| 150 case 'AIFF' : | |
| 151 | |
| 152 // Key types | |
| 153 case 'X509' : | |
| 154 case 'PGP' : | |
| 155 $name = 'TYPE'; | |
| 156 break; | |
| 157 | |
| 158 // Value types | |
| 159 case 'INLINE' : | |
| 160 case 'URL' : | |
| 161 case 'CONTENT-ID' : | |
| 162 case 'CID' : | |
| 163 $name = 'VALUE'; | |
| 164 break; | |
| 165 | |
| 166 default: | |
| 167 $name = ''; | |
| 168 } | |
| 169 | |
| 170 return $name; | |
| 171 } | |
| 172 | |
| 173 /** | |
| 174 * Updates the current value. | |
| 175 * | |
| 176 * This may be either a single, or multiple strings in an array. | |
| 177 * | |
| 178 * @param string|array $value | |
| 179 * @return void | |
| 180 */ | |
| 181 public function setValue($value) { | |
| 182 | |
| 183 $this->value = $value; | |
| 184 | |
| 185 } | |
| 186 | |
| 187 /** | |
| 188 * Returns the current value | |
| 189 * | |
| 190 * This method will always return a string, or null. If there were multiple | |
| 191 * values, it will automatically concatinate them (separated by comma). | |
| 192 * | |
| 193 * @return string|null | |
| 194 */ | |
| 195 public function getValue() { | |
| 196 | |
| 197 if (is_array($this->value)) { | |
| 198 return implode(',' , $this->value); | |
| 199 } else { | |
| 200 return $this->value; | |
| 201 } | |
| 202 | |
| 203 } | |
| 204 | |
| 205 /** | |
| 206 * Sets multiple values for this parameter. | |
| 207 * | |
| 208 * @param array $value | |
| 209 * @return void | |
| 210 */ | |
| 211 public function setParts(array $value) { | |
| 212 | |
| 213 $this->value = $value; | |
| 214 | |
| 215 } | |
| 216 | |
| 217 /** | |
| 218 * Returns all values for this parameter. | |
| 219 * | |
| 220 * If there were no values, an empty array will be returned. | |
| 221 * | |
| 222 * @return array | |
| 223 */ | |
| 224 public function getParts() { | |
| 225 | |
| 226 if (is_array($this->value)) { | |
| 227 return $this->value; | |
| 228 } elseif (is_null($this->value)) { | |
| 229 return array(); | |
| 230 } else { | |
| 231 return array($this->value); | |
| 232 } | |
| 233 | |
| 234 } | |
| 235 | |
| 236 /** | |
| 237 * Adds a value to this parameter | |
| 238 * | |
| 239 * If the argument is specified as an array, all items will be added to the | |
| 240 * parameter value list. | |
| 241 * | |
| 242 * @param string|array $part | |
| 243 * @return void | |
| 244 */ | |
| 245 public function addValue($part) { | |
| 246 | |
| 247 if (is_null($this->value)) { | |
| 248 $this->value = $part; | |
| 249 } else { | |
| 250 $this->value = array_merge((array)$this->value, (array)$part); | |
| 251 } | |
| 252 | |
| 253 } | |
| 254 | |
| 255 /** | |
| 256 * Checks if this parameter contains the specified value. | |
| 257 * | |
| 258 * This is a case-insensitive match. It makes sense to call this for for | |
| 259 * instance the TYPE parameter, to see if it contains a keyword such as | |
| 260 * 'WORK' or 'FAX'. | |
| 261 * | |
| 262 * @param string $value | |
| 263 * @return bool | |
| 264 */ | |
| 265 public function has($value) { | |
| 266 | |
| 267 return in_array( | |
| 268 strtolower($value), | |
| 269 array_map('strtolower', (array)$this->value) | |
| 270 ); | |
| 271 | |
| 272 } | |
| 273 | |
| 274 /** | |
| 275 * Turns the object back into a serialized blob. | |
| 276 * | |
| 277 * @return string | |
| 278 */ | |
| 279 public function serialize() { | |
| 280 | |
| 281 $value = $this->getParts(); | |
| 282 | |
| 283 if (count($value)===0) { | |
| 284 return $this->name . '='; | |
| 285 } | |
| 286 | |
| 287 if ($this->root->getDocumentType() === Document::VCARD21 && $this->noName) { | |
| 288 | |
| 289 return implode(';', $value); | |
| 290 | |
| 291 } | |
| 292 | |
| 293 return $this->name . '=' . array_reduce( | |
| 294 $value, | |
| 295 function($out, $item) { | |
| 296 | |
| 297 if (!is_null($out)) $out.=','; | |
| 298 | |
| 299 // If there's no special characters in the string, we'll use the simple | |
| 300 // format. | |
| 301 // | |
| 302 // The list of special characters is defined as: | |
| 303 // | |
| 304 // Any character except CONTROL, DQUOTE, ";", ":", "," | |
| 305 // | |
| 306 // by the iCalendar spec: | |
| 307 // https://tools.ietf.org/html/rfc5545#section-3.1 | |
| 308 // | |
| 309 // And we add ^ to that because of: | |
| 310 // https://tools.ietf.org/html/rfc6868 | |
| 311 // | |
| 312 // But we've found that iCal (7.0, shipped with OSX 10.9) | |
| 313 // severaly trips on + characters not being quoted, so we | |
| 314 // added + as well. | |
| 315 if (!preg_match('#(?: [\n":;\^,\+] )#x', $item)) { | |
| 316 return $out.$item; | |
| 317 } else { | |
| 318 // Enclosing in double-quotes, and using RFC6868 for encoding any | |
| 319 // special characters | |
| 320 $out.='"' . strtr( | |
| 321 $item, | |
| 322 array( | |
| 323 '^' => '^^', | |
| 324 "\n" => '^n', | |
| 325 '"' => '^\'', | |
| 326 ) | |
| 327 ) . '"'; | |
| 328 return $out; | |
| 329 } | |
| 330 | |
| 331 } | |
| 332 ); | |
| 333 | |
| 334 } | |
| 335 | |
| 336 /** | |
| 337 * This method returns an array, with the representation as it should be | |
| 338 * encoded in json. This is used to create jCard or jCal documents. | |
| 339 * | |
| 340 * @return array | |
| 341 */ | |
| 342 public function jsonSerialize() { | |
| 343 | |
| 344 return $this->value; | |
| 345 | |
| 346 } | |
| 347 | |
| 348 /** | |
| 349 * Called when this object is being cast to a string | |
| 350 * | |
| 351 * @return string | |
| 352 */ | |
| 353 public function __toString() { | |
| 354 | |
| 355 return (string)$this->getValue(); | |
| 356 | |
| 357 } | |
| 358 | |
| 359 /** | |
| 360 * Returns the iterator for this object | |
| 361 * | |
| 362 * @return ElementList | |
| 363 */ | |
| 364 public function getIterator() { | |
| 365 | |
| 366 if (!is_null($this->iterator)) | |
| 367 return $this->iterator; | |
| 368 | |
| 369 return $this->iterator = new ArrayObject((array)$this->value); | |
| 370 | |
| 371 } | |
| 372 | |
| 373 } |
