diff options
Diffstat (limited to 'vendor/sabre/vobject/lib/Parser')
-rw-r--r-- | vendor/sabre/vobject/lib/Parser/Json.php | 63 | ||||
-rw-r--r-- | vendor/sabre/vobject/lib/Parser/MimeDir.php | 187 | ||||
-rw-r--r-- | vendor/sabre/vobject/lib/Parser/Parser.php | 21 | ||||
-rw-r--r-- | vendor/sabre/vobject/lib/Parser/XML.php | 137 | ||||
-rw-r--r-- | vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php | 19 |
5 files changed, 257 insertions, 170 deletions
diff --git a/vendor/sabre/vobject/lib/Parser/Json.php b/vendor/sabre/vobject/lib/Parser/Json.php index 3fd307e97..a77258a2e 100644 --- a/vendor/sabre/vobject/lib/Parser/Json.php +++ b/vendor/sabre/vobject/lib/Parser/Json.php @@ -4,7 +4,6 @@ namespace Sabre\VObject\Parser; use Sabre\VObject\Component\VCalendar; use Sabre\VObject\Component\VCard; -use Sabre\VObject\Document; use Sabre\VObject\EofException; use Sabre\VObject\ParseException; @@ -17,8 +16,8 @@ use Sabre\VObject\ParseException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class Json extends Parser -{ +class Json extends Parser { + /** * The input data. * @@ -42,12 +41,12 @@ class Json extends Parser * If either input or options are not supplied, the defaults will be used. * * @param resource|string|array|null $input - * @param int $options + * @param int $options * - * @return \Sabre\VObject\Document + * @return Sabre\VObject\Document */ - public function parse($input = null, $options = 0) - { + function parse($input = null, $options = 0) { + if (!is_null($input)) { $this->setInput($input); } @@ -60,28 +59,28 @@ class Json extends Parser } switch ($this->input[0]) { - case 'vcalendar': + case 'vcalendar' : $this->root = new VCalendar([], false); break; - case 'vcard': + case 'vcard' : $this->root = new VCard([], false); break; - default: + default : throw new ParseException('The root component must either be a vcalendar, or a vcard'); + } foreach ($this->input[1] as $prop) { $this->root->add($this->parseProperty($prop)); } - if (isset($this->input[2])) { - foreach ($this->input[2] as $comp) { - $this->root->add($this->parseComponent($comp)); - } + if (isset($this->input[2])) foreach ($this->input[2] as $comp) { + $this->root->add($this->parseComponent($comp)); } // Resetting the input so we can throw an feof exception the next time. $this->input = null; return $this->root; + } /** @@ -91,34 +90,35 @@ class Json extends Parser * * @return \Sabre\VObject\Component */ - public function parseComponent(array $jComp) - { + function parseComponent(array $jComp) { + // We can remove $self from PHP 5.4 onward. $self = $this; $properties = array_map( - function ($jProp) use ($self) { + function($jProp) use ($self) { return $self->parseProperty($jProp); }, $jComp[1] ); if (isset($jComp[2])) { + $components = array_map( - function ($jComp) use ($self) { + function($jComp) use ($self) { return $self->parseComponent($jComp); }, $jComp[2] ); - } else { - $components = []; - } + + } else $components = []; return $this->root->createComponent( $jComp[0], array_merge($properties, $components), $defaults = false ); + } /** @@ -128,8 +128,8 @@ class Json extends Parser * * @return \Sabre\VObject\Property */ - public function parseProperty(array $jProp) - { + function parseProperty(array $jProp) { + list( $propertyName, $parameters, @@ -142,14 +142,14 @@ class Json extends Parser // value type. We're using this value later in this function. $defaultPropertyClass = $this->root->getClassNameForPropertyName($propertyName); - $parameters = (array) $parameters; + $parameters = (array)$parameters; $value = array_slice($jProp, 3); $valueType = strtoupper($valueType); if (isset($parameters['group'])) { - $propertyName = $parameters['group'].'.'.$propertyName; + $propertyName = $parameters['group'] . '.' . $propertyName; unset($parameters['group']); } @@ -160,7 +160,7 @@ class Json extends Parser // represents TEXT values. We have to normalize these here. In the // future we can get rid of FlatText once we're allowed to break BC // again. - if ('Sabre\VObject\Property\FlatText' === $defaultPropertyClass) { + if ($defaultPropertyClass === 'Sabre\VObject\Property\FlatText') { $defaultPropertyClass = 'Sabre\VObject\Property\Text'; } @@ -168,19 +168,22 @@ class Json extends Parser // type for the given property (e.g.: BDAY), we need to add a VALUE= // parameter. if ($defaultPropertyClass !== get_class($prop)) { - $prop['VALUE'] = $valueType; + $prop["VALUE"] = $valueType; } return $prop; + } /** * Sets the input data. * * @param resource|string|array $input + * + * @return void */ - public function setInput($input) - { + function setInput($input) { + if (is_resource($input)) { $input = stream_get_contents($input); } @@ -188,5 +191,7 @@ class Json extends Parser $input = json_decode($input); } $this->input = $input; + } + } diff --git a/vendor/sabre/vobject/lib/Parser/MimeDir.php b/vendor/sabre/vobject/lib/Parser/MimeDir.php index 10dcec89c..742641236 100644 --- a/vendor/sabre/vobject/lib/Parser/MimeDir.php +++ b/vendor/sabre/vobject/lib/Parser/MimeDir.php @@ -7,7 +7,6 @@ use Sabre\VObject\Component\VCalendar; use Sabre\VObject\Component\VCard; use Sabre\VObject\Document; use Sabre\VObject\EofException; -use Sabre\VObject\Node; use Sabre\VObject\ParseException; /** @@ -23,8 +22,8 @@ use Sabre\VObject\ParseException; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -class MimeDir extends Parser -{ +class MimeDir extends Parser { + /** * The input stream. * @@ -71,12 +70,12 @@ class MimeDir extends Parser * used. * * @param string|resource|null $input - * @param int $options + * @param int $options * - * @return \Sabre\VObject\Document + * @return Sabre\VObject\Document */ - public function parse($input = null, $options = 0) - { + function parse($input = null, $options = 0) { + $this->root = null; if (!is_null($input)) { @@ -90,6 +89,7 @@ class MimeDir extends Parser $this->parseDocument(); return $this->root; + } /** @@ -104,21 +104,24 @@ class MimeDir extends Parser * * @param string $charset */ - public function setCharset($charset) - { + function setCharset($charset) { + if (!in_array($charset, self::$SUPPORTED_CHARSETS)) { - throw new \InvalidArgumentException('Unsupported encoding. (Supported encodings: '.implode(', ', self::$SUPPORTED_CHARSETS).')'); + throw new \InvalidArgumentException('Unsupported encoding. (Supported encodings: ' . implode(', ', self::$SUPPORTED_CHARSETS) . ')'); } $this->charset = $charset; + } /** * Sets the input buffer. Must be a string or stream. * * @param resource|string $input + * + * @return void */ - public function setInput($input) - { + function setInput($input) { + // Resetting the parser $this->lineIndex = 0; $this->startLine = 0; @@ -134,53 +137,59 @@ class MimeDir extends Parser } else { throw new \InvalidArgumentException('This parser can only read from strings or streams.'); } + } /** * Parses an entire document. + * + * @return void */ - protected function parseDocument() - { + protected function parseDocument() { + $line = $this->readLine(); // BOM is ZERO WIDTH NO-BREAK SPACE (U+FEFF). // It's 0xEF 0xBB 0xBF in UTF-8 hex. if (3 <= strlen($line) - && 0xef === ord($line[0]) - && 0xbb === ord($line[1]) - && 0xbf === ord($line[2])) { + && ord($line[0]) === 0xef + && ord($line[1]) === 0xbb + && ord($line[2]) === 0xbf) { $line = substr($line, 3); } switch (strtoupper($line)) { - case 'BEGIN:VCALENDAR': + case 'BEGIN:VCALENDAR' : $class = VCalendar::$componentMap['VCALENDAR']; break; - case 'BEGIN:VCARD': + case 'BEGIN:VCARD' : $class = VCard::$componentMap['VCARD']; break; - default: + default : throw new ParseException('This parser only supports VCARD and VCALENDAR files'); } $this->root = new $class([], false); while (true) { + // Reading until we hit END: $line = $this->readLine(); - if ('END:' === strtoupper(substr($line, 0, 4))) { + if (strtoupper(substr($line, 0, 4)) === 'END:') { break; } $result = $this->parseLine($line); if ($result) { $this->root->add($result); } + } $name = strtoupper(substr($line, 4)); if ($name !== $this->root->name) { - throw new ParseException('Invalid MimeDir file. expected: "END:'.$this->root->name.'" got: "END:'.$name.'"'); + throw new ParseException('Invalid MimeDir file. expected: "END:' . $this->root->name . '" got: "END:' . $name . '"'); } + } /** @@ -191,40 +200,46 @@ class MimeDir extends Parser * * @return Node */ - protected function parseLine($line) - { + protected function parseLine($line) { + // Start of a new component - if ('BEGIN:' === strtoupper(substr($line, 0, 6))) { + if (strtoupper(substr($line, 0, 6)) === 'BEGIN:') { + $component = $this->root->createComponent(substr($line, 6), [], false); while (true) { + // Reading until we hit END: $line = $this->readLine(); - if ('END:' === strtoupper(substr($line, 0, 4))) { + if (strtoupper(substr($line, 0, 4)) === 'END:') { break; } $result = $this->parseLine($line); if ($result) { $component->add($result); } + } $name = strtoupper(substr($line, 4)); if ($name !== $component->name) { - throw new ParseException('Invalid MimeDir file. expected: "END:'.$component->name.'" got: "END:'.$name.'"'); + throw new ParseException('Invalid MimeDir file. expected: "END:' . $component->name . '" got: "END:' . $name . '"'); } return $component; + } else { + // Property reader $property = $this->readProperty($line); if (!$property) { // Ignored line return false; } - return $property; + } + } /** @@ -233,7 +248,7 @@ class MimeDir extends Parser * * If that was not the case, we store it here. * - * @var string|null + * @var null|string */ protected $lineBuffer; @@ -266,8 +281,8 @@ class MimeDir extends Parser * * @return string */ - protected function readLine() - { + protected function readLine() { + if (!\is_null($this->lineBuffer)) { $rawLine = $this->lineBuffer; $this->lineBuffer = null; @@ -277,15 +292,15 @@ class MimeDir extends Parser $rawLine = \fgets($this->input); - if ($eof || (\feof($this->input) && false === $rawLine)) { + if ($eof || (\feof($this->input) && $rawLine === false)) { throw new EofException('End of document reached prematurely'); } - if (false === $rawLine) { + if ($rawLine === false) { throw new ParseException('Error reading from input stream'); } $rawLine = \rtrim($rawLine, "\r\n"); - } while ('' === $rawLine); // Skipping empty lines - ++$this->lineIndex; + } while ($rawLine === ''); // Skipping empty lines + $this->lineIndex++; } $line = $rawLine; @@ -293,30 +308,34 @@ class MimeDir extends Parser // Looking ahead for folded lines. while (true) { + $nextLine = \rtrim(\fgets($this->input), "\r\n"); - ++$this->lineIndex; + $this->lineIndex++; if (!$nextLine) { break; } - if ("\t" === $nextLine[0] || ' ' === $nextLine[0]) { + if ($nextLine[0] === "\t" || $nextLine[0] === " ") { $curLine = \substr($nextLine, 1); $line .= $curLine; - $rawLine .= "\n ".$curLine; + $rawLine .= "\n " . $curLine; } else { $this->lineBuffer = $nextLine; break; } + } $this->rawLine = $rawLine; - return $line; + } /** * Reads a property or component from a line. + * + * @return void */ - protected function readProperty($line) - { + protected function readProperty($line) { + if ($this->options & self::OPTION_FORGIVING) { $propNameToken = 'A-Z0-9\-\._\\/'; } else { @@ -341,17 +360,17 @@ class MimeDir extends Parser /xi"; //echo $regex, "\n"; die(); - preg_match_all($regex, $line, $matches, PREG_SET_ORDER); + preg_match_all($regex, $line, $matches, PREG_SET_ORDER); $property = [ - 'name' => null, + 'name' => null, 'parameters' => [], - 'value' => null, + 'value' => null ]; $lastParam = null; - /* + /** * Looping through all the tokens. * * Note that we are looping through them in reverse order, because if a @@ -359,8 +378,9 @@ class MimeDir extends Parser * in the result. */ foreach ($matches as $match) { + if (isset($match['paramValue'])) { - if ($match['paramValue'] && '"' === $match['paramValue'][0]) { + if ($match['paramValue'] && $match['paramValue'][0] === '"') { $value = substr($match['paramValue'], 1, -1); } else { $value = $match['paramValue']; @@ -369,7 +389,7 @@ class MimeDir extends Parser $value = $this->unescapeParam($value); if (is_null($lastParam)) { - throw new ParseException('Invalid Mimedir file. Line starting at '.$this->startLine.' did not follow iCalendar/vCard conventions'); + throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions'); } if (is_null($property['parameters'][$lastParam])) { $property['parameters'][$lastParam] = $value; @@ -378,7 +398,7 @@ class MimeDir extends Parser } else { $property['parameters'][$lastParam] = [ $property['parameters'][$lastParam], - $value, + $value ]; } continue; @@ -402,6 +422,7 @@ class MimeDir extends Parser // @codeCoverageIgnoreStart throw new \LogicException('This code should not be reachable'); // @codeCoverageIgnoreEnd + } if (is_null($property['value'])) { @@ -411,11 +432,11 @@ class MimeDir extends Parser if ($this->options & self::OPTION_IGNORE_INVALID_LINES) { return false; } - throw new ParseException('Invalid Mimedir file. Line starting at '.$this->startLine.' did not follow iCalendar/vCard conventions'); + throw new ParseException('Invalid Mimedir file. Line starting at ' . $this->startLine . ' did not follow iCalendar/vCard conventions'); } // vCard 2.1 states that parameters may appear without a name, and only - // a value. We can deduce the value based on its name. + // a value. We can deduce the value based on it's name. // // Our parser will get those as parameters without a value instead, so // we're filtering these parameters out first. @@ -436,30 +457,31 @@ class MimeDir extends Parser $propObj->add(null, $namelessParameter); } - if ('QUOTED-PRINTABLE' === strtoupper($propObj['ENCODING'])) { + if (strtoupper($propObj['ENCODING']) === 'QUOTED-PRINTABLE') { $propObj->setQuotedPrintableValue($this->extractQuotedPrintableValue()); } else { $charset = $this->charset; - if (Document::VCARD21 === $this->root->getDocumentType() && isset($propObj['CHARSET'])) { + if ($this->root->getDocumentType() === Document::VCARD21 && isset($propObj['CHARSET'])) { // vCard 2.1 allows the character set to be specified per property. - $charset = (string) $propObj['CHARSET']; + $charset = (string)$propObj['CHARSET']; } switch (strtolower($charset)) { - case 'utf-8': + case 'utf-8' : break; - case 'iso-8859-1': + case 'iso-8859-1' : $property['value'] = utf8_encode($property['value']); break; - case 'windows-1252': + case 'windows-1252' : $property['value'] = mb_convert_encoding($property['value'], 'UTF-8', $charset); break; - default: - throw new ParseException('Unsupported CHARSET: '.$propObj['CHARSET']); + default : + throw new ParseException('Unsupported CHARSET: ' . $propObj['CHARSET']); } $propObj->setRawMimeDirValue($property['value']); } return $propObj; + } /** @@ -524,11 +546,11 @@ class MimeDir extends Parser * * @return string|string[] */ - public static function unescapeValue($input, $delimiter = ';') - { + static function unescapeValue($input, $delimiter = ';') { + $regex = '# (?: (\\\\ (?: \\\\ | N | n | ; | , ) )'; if ($delimiter) { - $regex .= ' | ('.$delimiter.')'; + $regex .= ' | (' . $delimiter . ')'; } $regex .= ') #x'; @@ -538,33 +560,36 @@ class MimeDir extends Parser $result = ''; foreach ($matches as $match) { + switch ($match) { - case '\\\\': + case '\\\\' : $result .= '\\'; break; - case '\N': - case '\n': + case '\N' : + case '\n' : $result .= "\n"; break; - case '\;': + case '\;' : $result .= ';'; break; - case '\,': + case '\,' : $result .= ','; break; - case $delimiter: + case $delimiter : $resultArray[] = $result; $result = ''; break; - default: + default : $result .= $match; break; + } + } $resultArray[] = $result; - return $delimiter ? $resultArray : $result; + } /** @@ -598,19 +623,21 @@ class MimeDir extends Parser * * " is encoded as ^' * * @param string $input + * + * @return void */ - private function unescapeParam($input) - { + private function unescapeParam($input) { + return preg_replace_callback( '#(\^(\^|n|\'))#', - function ($matches) { + function($matches) { switch ($matches[2]) { - case 'n': + case 'n' : return "\n"; - case '^': + case '^' : return '^'; - case '\'': + case '\'' : return '"'; // @codeCoverageIgnoreStart @@ -631,8 +658,8 @@ class MimeDir extends Parser * * @return string */ - private function extractQuotedPrintableValue() - { + private function extractQuotedPrintableValue() { + // We need to parse the raw line again to get the start of the value. // // We are basically looking for the first colon (:), but we need to @@ -655,14 +682,16 @@ class MimeDir extends Parser // missing a whitespace. So if 'forgiving' is turned on, we will take // those as well. if ($this->options & self::OPTION_FORGIVING) { - while ('=' === substr($value, -1)) { + while (substr($value, -1) === '=') { // Reading the line $this->readLine(); // Grabbing the raw form - $value .= "\n".$this->rawLine; + $value .= "\n" . $this->rawLine; } } return $value; + } + } diff --git a/vendor/sabre/vobject/lib/Parser/Parser.php b/vendor/sabre/vobject/lib/Parser/Parser.php index b7b611430..ca8bc0add 100644 --- a/vendor/sabre/vobject/lib/Parser/Parser.php +++ b/vendor/sabre/vobject/lib/Parser/Parser.php @@ -11,8 +11,8 @@ namespace Sabre\VObject\Parser; * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License */ -abstract class Parser -{ +abstract class Parser { + /** * Turning on this option makes the parser more forgiving. * @@ -41,10 +41,12 @@ abstract class Parser * Optionally, it's possible to parse the input stream here. * * @param mixed $input - * @param int $options any parser options (OPTION constants) + * @param int $options Any parser options (OPTION constants). + * + * @return void */ - public function __construct($input = null, $options = 0) - { + function __construct($input = null, $options = 0) { + if (!is_null($input)) { $this->setInput($input); } @@ -60,16 +62,19 @@ abstract class Parser * If either input or options are not supplied, the defaults will be used. * * @param mixed $input - * @param int $options + * @param int $options * * @return array */ - abstract public function parse($input = null, $options = 0); + abstract function parse($input = null, $options = 0); /** * Sets the input data. * * @param mixed $input + * + * @return void */ - abstract public function setInput($input); + abstract function setInput($input); + } diff --git a/vendor/sabre/vobject/lib/Parser/XML.php b/vendor/sabre/vobject/lib/Parser/XML.php index 90f262d9e..5ac423984 100644 --- a/vendor/sabre/vobject/lib/Parser/XML.php +++ b/vendor/sabre/vobject/lib/Parser/XML.php @@ -18,8 +18,8 @@ use Sabre\Xml as SabreXml; * @author Ivan Enderlin * @license http://sabre.io/license/ Modified BSD License */ -class XML extends Parser -{ +class XML extends Parser { + const XCAL_NAMESPACE = 'urn:ietf:params:xml:ns:icalendar-2.0'; const XCARD_NAMESPACE = 'urn:ietf:params:xml:ns:vcard-4.0'; @@ -40,7 +40,7 @@ class XML extends Parser /** * Document, root component. * - * @var \Sabre\VObject\Document + * @var Sabre\VObject\Document */ protected $root; @@ -50,29 +50,32 @@ class XML extends Parser * Optionally, it's possible to parse the input stream here. * * @param mixed $input - * @param int $options any parser options (OPTION constants) + * @param int $options Any parser options (OPTION constants). + * + * @return void */ - public function __construct($input = null, $options = 0) - { + function __construct($input = null, $options = 0) { + if (0 === $options) { $options = parent::OPTION_FORGIVING; } parent::__construct($input, $options); + } /** * Parse xCal or xCard. * * @param resource|string $input - * @param int $options + * @param int $options * * @throws \Exception * - * @return \Sabre\VObject\Document + * @return Sabre\VObject\Document */ - public function parse($input = null, $options = 0) - { + function parse($input = null, $options = 0) { + if (!is_null($input)) { $this->setInput($input); } @@ -86,25 +89,29 @@ class XML extends Parser } switch ($this->input['name']) { - case '{'.self::XCAL_NAMESPACE.'}icalendar': + + case '{' . self::XCAL_NAMESPACE . '}icalendar': $this->root = new VCalendar([], false); $this->pointer = &$this->input['value'][0]; $this->parseVCalendarComponents($this->root); break; - case '{'.self::XCARD_NAMESPACE.'}vcards': + case '{' . self::XCARD_NAMESPACE . '}vcards': foreach ($this->input['value'] as &$vCard) { + $this->root = new VCard(['version' => '4.0'], false); $this->pointer = &$vCard; $this->parseVCardComponents($this->root); // We just parse the first <vcard /> element. break; + } break; default: throw new ParseException('Unsupported XML standard'); + } return $this->root; @@ -114,11 +121,15 @@ class XML extends Parser * Parse a xCalendar component. * * @param Component $parentComponent + * + * @return void */ - protected function parseVCalendarComponents(Component $parentComponent) - { + protected function parseVCalendarComponents(Component $parentComponent) { + foreach ($this->pointer['value'] ?: [] as $children) { + switch (static::getTagName($children['name'])) { + case 'properties': $this->pointer = &$children['value']; $this->parseProperties($parentComponent); @@ -130,28 +141,35 @@ class XML extends Parser break; } } + } /** * Parse a xCard component. * * @param Component $parentComponent + * + * @return void */ - protected function parseVCardComponents(Component $parentComponent) - { + protected function parseVCardComponents(Component $parentComponent) { + $this->pointer = &$this->pointer['value']; $this->parseProperties($parentComponent); + } /** * Parse xCalendar and xCard properties. * * @param Component $parentComponent - * @param string $propertyNamePrefix + * @param string $propertyNamePrefix + * + * @return void */ - protected function parseProperties(Component $parentComponent, $propertyNamePrefix = '') - { + protected function parseProperties(Component $parentComponent, $propertyNamePrefix = '') { + foreach ($this->pointer ?: [] as $xmlProperty) { + list($namespace, $tagName) = SabreXml\Service::parseClarkNotation($xmlProperty['name']); $propertyName = $tagName; @@ -160,16 +178,17 @@ class XML extends Parser $propertyType = 'text'; // A property which is not part of the standard. - if (self::XCAL_NAMESPACE !== $namespace - && self::XCARD_NAMESPACE !== $namespace) { + if ($namespace !== self::XCAL_NAMESPACE + && $namespace !== self::XCARD_NAMESPACE) { + $propertyName = 'xml'; - $value = '<'.$tagName.' xmlns="'.$namespace.'"'; + $value = '<' . $tagName . ' xmlns="' . $namespace . '"'; foreach ($xmlProperty['attributes'] as $attributeName => $attributeValue) { - $value .= ' '.$attributeName.'="'.str_replace('"', '\"', $attributeValue).'"'; + $value .= ' ' . $attributeName . '="' . str_replace('"', '\"', $attributeValue) . '"'; } - $value .= '>'.$xmlProperty['value'].'</'.$tagName.'>'; + $value .= '>' . $xmlProperty['value'] . '</' . $tagName . '>'; $propertyValue = [$value]; @@ -185,7 +204,8 @@ class XML extends Parser } // xCard group. - if ('group' === $propertyName) { + if ($propertyName === 'group') { + if (!isset($xmlProperty['attributes']['name'])) { continue; } @@ -193,22 +213,24 @@ class XML extends Parser $this->pointer = &$xmlProperty['value']; $this->parseProperties( $parentComponent, - strtoupper($xmlProperty['attributes']['name']).'.' + strtoupper($xmlProperty['attributes']['name']) . '.' ); continue; + } // Collect parameters. foreach ($xmlProperty['value'] as $i => $xmlPropertyChild) { + if (!is_array($xmlPropertyChild) - || 'parameters' !== static::getTagName($xmlPropertyChild['name'])) { + || 'parameters' !== static::getTagName($xmlPropertyChild['name'])) continue; - } $xmlParameters = $xmlPropertyChild['value']; foreach ($xmlParameters as $xmlParameter) { + $propertyParameterValues = []; foreach ($xmlParameter['value'] as $xmlParameterValues) { @@ -217,16 +239,19 @@ class XML extends Parser $propertyParameters[static::getTagName($xmlParameter['name'])] = implode(',', $propertyParameterValues); + } array_splice($xmlProperty['value'], $i, 1); + } $propertyNameExtended = ($this->root instanceof VCalendar ? 'xcal' - : 'xcard').':'.$propertyName; + : 'xcard') . ':' . $propertyName; switch ($propertyNameExtended) { + case 'xcal:geo': $propertyType = 'float'; $propertyValue['latitude'] = 0; @@ -252,7 +277,6 @@ class XML extends Parser // We don't break because we only want to set // another property type. - // no break case 'xcal:categories': case 'xcal:resources': case 'xcal:exdate': @@ -266,12 +290,16 @@ class XML extends Parser $propertyType = 'date-time'; foreach ($xmlProperty['value'] as $specialChild) { + $tagName = static::getTagName($specialChild['name']); if ('period' === $tagName) { + $propertyParameters['value'] = 'PERIOD'; $propertyValue[] = implode('/', $specialChild['value']); - } else { + + } + else { $propertyValue[] = $specialChild['value']; } } @@ -292,24 +320,29 @@ class XML extends Parser $this->createProperty( $parentComponent, - $propertyNamePrefix.$propertyName, + $propertyNamePrefix . $propertyName, $propertyParameters, $propertyType, $propertyValue ); + } + } /** * Parse a component. * * @param Component $parentComponent + * + * @return void */ - protected function parseComponent(Component $parentComponent) - { + protected function parseComponent(Component $parentComponent) { + $components = $this->pointer['value'] ?: []; foreach ($components as $component) { + $componentName = static::getTagName($component['name']); $currentComponent = $this->root->createComponent( $componentName, @@ -321,20 +354,24 @@ class XML extends Parser $this->parseVCalendarComponents($currentComponent); $parentComponent->add($currentComponent); + } + } /** * Create a property. * * @param Component $parentComponent - * @param string $name - * @param array $parameters - * @param string $type - * @param mixed $value + * @param string $name + * @param array $parameters + * @param string $type + * @param mixed $value + * + * @return void */ - protected function createProperty(Component $parentComponent, $name, $parameters, $type, $value) - { + protected function createProperty(Component $parentComponent, $name, $parameters, $type, $value) { + $property = $this->root->createProperty( $name, null, @@ -343,30 +380,36 @@ class XML extends Parser ); $parentComponent->add($property); $property->setXmlValue($value); + } /** * Sets the input data. * * @param resource|string $input + * + * @return void */ - public function setInput($input) - { + function setInput($input) { + if (is_resource($input)) { $input = stream_get_contents($input); } if (is_string($input)) { + $reader = new SabreXml\Reader(); - $reader->elementMap['{'.self::XCAL_NAMESPACE.'}period'] + $reader->elementMap['{' . self::XCAL_NAMESPACE . '}period'] = 'Sabre\VObject\Parser\XML\Element\KeyValue'; - $reader->elementMap['{'.self::XCAL_NAMESPACE.'}recur'] + $reader->elementMap['{' . self::XCAL_NAMESPACE . '}recur'] = 'Sabre\VObject\Parser\XML\Element\KeyValue'; $reader->xml($input); $input = $reader->parse(); + } $this->input = $input; + } /** @@ -376,10 +419,10 @@ class XML extends Parser * * @return string */ - protected static function getTagName($clarkedTagName) - { - list(, $tagName) = SabreXml\Service::parseClarkNotation($clarkedTagName); + protected static function getTagName($clarkedTagName) { + list(, $tagName) = SabreXml\Service::parseClarkNotation($clarkedTagName); return $tagName; + } } diff --git a/vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php b/vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php index e26540036..14d798433 100644 --- a/vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php +++ b/vendor/sabre/vobject/lib/Parser/XML/Element/KeyValue.php @@ -13,8 +13,8 @@ use Sabre\Xml as SabreXml; * @author Ivan Enderlin * @license http://sabre.io/license/ Modified BSD License */ -class KeyValue extends SabreXml\Element\KeyValue -{ +class KeyValue extends SabreXml\Element\KeyValue { + /** * The deserialize method is called during xml parsing. * @@ -37,12 +37,11 @@ class KeyValue extends SabreXml\Element\KeyValue * * @return mixed */ - public static function xmlDeserialize(SabreXml\Reader $reader) - { + static function xmlDeserialize(SabreXml\Reader $reader) { + // If there's no children, we don't do anything. if ($reader->isEmptyElement) { $reader->next(); - return []; } @@ -50,16 +49,22 @@ class KeyValue extends SabreXml\Element\KeyValue $reader->read(); do { - if (SabreXml\Reader::ELEMENT === $reader->nodeType) { + + if ($reader->nodeType === SabreXml\Reader::ELEMENT) { + $name = $reader->localName; $values[$name] = $reader->parseCurrentElement()['value']; + } else { $reader->read(); } - } while (SabreXml\Reader::END_ELEMENT !== $reader->nodeType); + + } while ($reader->nodeType !== SabreXml\Reader::END_ELEMENT); $reader->read(); return $values; + } + } |