diff options
Diffstat (limited to 'vendor/sabre/vobject/lib/Component.php')
-rw-r--r-- | vendor/sabre/vobject/lib/Component.php | 236 |
1 files changed, 139 insertions, 97 deletions
diff --git a/vendor/sabre/vobject/lib/Component.php b/vendor/sabre/vobject/lib/Component.php index a33b7d577..ac87a10ec 100644 --- a/vendor/sabre/vobject/lib/Component.php +++ b/vendor/sabre/vobject/lib/Component.php @@ -14,8 +14,8 @@ use Sabre\Xml; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Component extends Node -{ +class Component extends Node { + /** * Component name. * @@ -44,12 +44,14 @@ class Component extends Node * ensure that this does not happen, set $defaults to false. * * @param Document $root - * @param string $name such as VCALENDAR, VEVENT - * @param array $children - * @param bool $defaults + * @param string $name such as VCALENDAR, VEVENT. + * @param array $children + * @param bool $defaults + * + * @return void */ - public function __construct(Document $root, $name, array $children = [], $defaults = true) - { + function __construct(Document $root, $name, array $children = [], $defaults = true) { + $this->name = strtoupper($name); $this->root = $root; @@ -82,11 +84,13 @@ class Component extends Node // Component or Property $this->add($child); } else { + // Property key=>value $this->add($k, $child); } } } + } /** @@ -102,8 +106,8 @@ class Component extends Node * * @return Node */ - public function add() - { + function add() { + $arguments = func_get_args(); if ($arguments[0] instanceof Node) { @@ -112,10 +116,15 @@ class Component extends Node } $arguments[0]->parent = $this; $newNode = $arguments[0]; + } elseif (is_string($arguments[0])) { + $newNode = call_user_func_array([$this->root, 'create'], $arguments); + } else { + throw new \InvalidArgumentException('The first argument must either be a \\Sabre\\VObject\\Node or a string'); + } $name = $newNode->name; @@ -124,8 +133,8 @@ class Component extends Node } else { $this->children[$name] = [$newNode]; } - return $newNode; + } /** @@ -137,34 +146,36 @@ class Component extends Node * exact item will be removed. * * @param string|Property|Component $item + * @return void */ - public function remove($item) - { + function remove($item) { + if (is_string($item)) { // If there's no dot in the name, it's an exact property name and // we can just wipe out all those properties. // - if (false === strpos($item, '.')) { + if (strpos($item, '.') === false) { unset($this->children[strtoupper($item)]); - return; } // If there was a dot, we need to ask select() to help us out and // then we just call remove recursively. foreach ($this->select($item) as $child) { + $this->remove($child); + } } else { foreach ($this->select($item->name) as $k => $child) { if ($child === $item) { unset($this->children[$item->name][$k]); - return; } } } throw new \InvalidArgumentException('The item you passed to remove() was not a child of this component'); + } /** @@ -173,14 +184,14 @@ class Component extends Node * * @return array */ - public function children() - { + function children() { + $result = []; foreach ($this->children as $childGroup) { $result = array_merge($result, $childGroup); } - return $result; + } /** @@ -189,8 +200,8 @@ class Component extends Node * * @return array */ - public function getComponents() - { + function getComponents() { + $result = []; foreach ($this->children as $childGroup) { @@ -200,8 +211,8 @@ class Component extends Node } } } - return $result; + } /** @@ -215,21 +226,19 @@ class Component extends Node * has not been assigned a group, specify ".EMAIL". * * @param string $name - * * @return array */ - public function select($name) - { + function select($name) { + $group = null; $name = strtoupper($name); - if (false !== strpos($name, '.')) { + if (strpos($name, '.') !== false) { list($group, $name) = explode('.', $name, 2); } - if ('' === $name) { - $name = null; - } + if ($name === '') $name = null; if (!is_null($name)) { + $result = isset($this->children[$name]) ? $this->children[$name] : []; if (is_null($group)) { @@ -239,25 +248,32 @@ class Component extends Node // more. return array_filter( $result, - function ($child) use ($group) { + function($child) use ($group) { + return $child instanceof Property && strtoupper($child->group) === $group; + } ); } + } // If we got to this point, it means there was no 'name' specified for // searching, implying that this is a group-only search. $result = []; foreach ($this->children as $childGroup) { + foreach ($childGroup as $child) { + if ($child instanceof Property && strtoupper($child->group) === $group) { $result[] = $child; } + } - } + } return $result; + } /** @@ -265,9 +281,9 @@ class Component extends Node * * @return string */ - public function serialize() - { - $str = 'BEGIN:'.$this->name."\r\n"; + function serialize() { + + $str = "BEGIN:" . $this->name . "\r\n"; /** * Gives a component a 'score' for sorting purposes. @@ -279,60 +295,60 @@ class Component extends Node * space to accomodate elements. The $key is added to the $score to * preserve the original relative order of elements. * - * @param int $key + * @param int $key * @param array $array * * @return int */ - $sortScore = function ($key, $array) { + $sortScore = function($key, $array) { + if ($array[$key] instanceof Component) { + // We want to encode VTIMEZONE first, this is a personal // preference. - if ('VTIMEZONE' === $array[$key]->name) { + if ($array[$key]->name === 'VTIMEZONE') { $score = 300000000; - return $score + $key; } else { $score = 400000000; - return $score + $key; } } else { // Properties get encoded first // VCARD version 4.0 wants the VERSION property to appear first if ($array[$key] instanceof Property) { - if ('VERSION' === $array[$key]->name) { + if ($array[$key]->name === 'VERSION') { $score = 100000000; - return $score + $key; } else { // All other properties $score = 200000000; - return $score + $key; } } } + }; $children = $this->children(); $tmp = $children; uksort( $children, - function ($a, $b) use ($sortScore, $tmp) { + function($a, $b) use ($sortScore, $tmp) { + $sA = $sortScore($a, $tmp); $sB = $sortScore($b, $tmp); return $sA - $sB; + } ); - foreach ($children as $child) { - $str .= $child->serialize(); - } - $str .= 'END:'.$this->name."\r\n"; + foreach ($children as $child) $str .= $child->serialize(); + $str .= "END:" . $this->name . "\r\n"; return $str; + } /** @@ -341,8 +357,8 @@ class Component extends Node * * @return array */ - public function jsonSerialize() - { + function jsonSerialize() { + $components = []; $properties = []; @@ -359,18 +375,21 @@ class Component extends Node return [ strtolower($this->name), $properties, - $components, + $components ]; + } /** * This method serializes the data into XML. This is used to create xCard or * xCal documents. * - * @param Xml\Writer $writer XML writer + * @param Xml\Writer $writer XML writer. + * + * @return void */ - public function xmlSerialize(Xml\Writer $writer) - { + function xmlSerialize(Xml\Writer $writer) { + $components = []; $properties = []; @@ -387,6 +406,7 @@ class Component extends Node $writer->startElement(strtolower($this->name)); if (!empty($properties)) { + $writer->startElement('properties'); foreach ($properties as $property) { @@ -394,9 +414,11 @@ class Component extends Node } $writer->endElement(); + } if (!empty($components)) { + $writer->startElement('components'); foreach ($components as $component) { @@ -407,6 +429,7 @@ class Component extends Node } $writer->endElement(); + } /** @@ -414,9 +437,10 @@ class Component extends Node * * @return array */ - protected function getDefaults() - { + protected function getDefaults() { + return []; + } /* Magic property accessors {{{ */ @@ -435,22 +459,24 @@ class Component extends Node * * @return Property */ - public function __get($name) - { - if ('children' === $name) { + function __get($name) { + + if ($name === 'children') { + throw new \RuntimeException('Starting sabre/vobject 4.0 the children property is now protected. You should use the children() method instead'); + } $matches = $this->select($name); - if (0 === count($matches)) { + if (count($matches) === 0) { return; } else { $firstMatch = current($matches); - /* @var $firstMatch Property */ + /** @var $firstMatch Property */ $firstMatch->setIterator(new ElementList(array_values($matches))); - return $firstMatch; } + } /** @@ -460,11 +486,11 @@ class Component extends Node * * @return bool */ - public function __isset($name) - { - $matches = $this->select($name); + function __isset($name) { + $matches = $this->select($name); return count($matches) > 0; + } /** @@ -477,10 +503,12 @@ class Component extends Node * a new item with the same name, always use the add() method. * * @param string $name - * @param mixed $value + * @param mixed $value + * + * @return void */ - public function __set($name, $value) - { + function __set($name, $value) { + $name = strtoupper($name); $this->remove($name); if ($value instanceof self || $value instanceof Property) { @@ -495,10 +523,13 @@ class Component extends Node * specified name. * * @param string $name + * + * @return void */ - public function __unset($name) - { + function __unset($name) { + $this->remove($name); + } /* }}} */ @@ -506,9 +537,11 @@ class Component extends Node /** * This method is automatically called when the object is cloned. * Specifically, this will ensure all child elements are also cloned. + * + * @return void */ - public function __clone() - { + function __clone() { + foreach ($this->children as $childName => $childGroup) { foreach ($childGroup as $key => $child) { $clonedChild = clone $child; @@ -517,6 +550,7 @@ class Component extends Node $this->children[$childName][$key] = $clonedChild; } } + } /** @@ -540,9 +574,10 @@ class Component extends Node * * @var array */ - public function getValidationRules() - { + function getValidationRules() { + return []; + } /** @@ -569,8 +604,8 @@ class Component extends Node * * @return array */ - public function validate($options = 0) - { + function validate($options = 0) { + $rules = $this->getValidationRules(); $defaults = $this->getDefaults(); @@ -583,48 +618,49 @@ class Component extends Node if (!isset($propertyCounters[$name])) { $propertyCounters[$name] = 1; } else { - ++$propertyCounters[$name]; + $propertyCounters[$name]++; } $messages = array_merge($messages, $child->validate($options)); } foreach ($rules as $propName => $rule) { + switch ($rule) { - case '0': + case '0' : if (isset($propertyCounters[$propName])) { $messages[] = [ - 'level' => 3, - 'message' => $propName.' MUST NOT appear in a '.$this->name.' component', - 'node' => $this, + 'level' => 3, + 'message' => $propName . ' MUST NOT appear in a ' . $this->name . ' component', + 'node' => $this, ]; } break; - case '1': - if (!isset($propertyCounters[$propName]) || 1 !== $propertyCounters[$propName]) { + case '1' : + if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName] !== 1) { $repaired = false; if ($options & self::REPAIR && isset($defaults[$propName])) { $this->add($propName, $defaults[$propName]); $repaired = true; } $messages[] = [ - 'level' => $repaired ? 1 : 3, - 'message' => $propName.' MUST appear exactly once in a '.$this->name.' component', - 'node' => $this, + 'level' => $repaired ? 1 : 3, + 'message' => $propName . ' MUST appear exactly once in a ' . $this->name . ' component', + 'node' => $this, ]; } break; - case '+': + case '+' : if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName] < 1) { $messages[] = [ - 'level' => 3, - 'message' => $propName.' MUST appear at least once in a '.$this->name.' component', - 'node' => $this, + 'level' => 3, + 'message' => $propName . ' MUST appear at least once in a ' . $this->name . ' component', + 'node' => $this, ]; } break; - case '*': + case '*' : break; - case '?': + case '?' : if (isset($propertyCounters[$propName]) && $propertyCounters[$propName] > 1) { $level = 3; @@ -633,7 +669,7 @@ class Component extends Node if ($options & self::REPAIR) { $properties = array_unique($this->select($propName), SORT_REGULAR); - if (1 === count($properties)) { + if (count($properties) === 1) { $this->remove($propName); $this->add($properties[0]); @@ -642,16 +678,18 @@ class Component extends Node } $messages[] = [ - 'level' => $level, - 'message' => $propName.' MUST NOT appear more than once in a '.$this->name.' component', - 'node' => $this, + 'level' => $level, + 'message' => $propName . ' MUST NOT appear more than once in a ' . $this->name . ' component', + 'node' => $this, ]; } break; + } - } + } return $messages; + } /** @@ -659,9 +697,11 @@ class Component extends Node * * It's intended to remove all circular references, so PHP can easily clean * it up. + * + * @return void */ - public function destroy() - { + function destroy() { + parent::destroy(); foreach ($this->children as $childGroup) { foreach ($childGroup as $child) { @@ -669,5 +709,7 @@ class Component extends Node } } $this->children = []; + } + } |