diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/libcalendaring/lib/Sabre/VObject/Property/Compound.php	Sat Jan 13 08:57:56 2018 -0500
@@ -0,0 +1,125 @@
+<?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://evertpot.com/)
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+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)
+        );
+
+    }
+
+}