summaryrefslogtreecommitdiffstats
path: root/3rdparty/Sabre/VObject/Reader.php
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/Sabre/VObject/Reader.php')
-rw-r--r--3rdparty/Sabre/VObject/Reader.php195
1 files changed, 195 insertions, 0 deletions
diff --git a/3rdparty/Sabre/VObject/Reader.php b/3rdparty/Sabre/VObject/Reader.php
new file mode 100644
index 00000000000..9c20e33cea0
--- /dev/null
+++ b/3rdparty/Sabre/VObject/Reader.php
@@ -0,0 +1,195 @@
+<?php
+
+/**
+ * VCALENDAR/VCARD reader
+ *
+ * This class reads the vobject file, and returns a full element tree.
+ *
+ *
+ * TODO: this class currently completely works 'statically'. This is pointless,
+ * and defeats OOP principals. Needs refaxtoring in a future version.
+ *
+ * @package Sabre
+ * @subpackage VObject
+ * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Sabre_VObject_Reader {
+
+ /**
+ * This array contains a list of Property names that are automatically
+ * mapped to specific class names.
+ *
+ * Adding to this list allows you to specify custom property classes,
+ * adding extra functionality.
+ *
+ * @var array
+ */
+ static public $elementMap = array(
+ 'DTSTART' => 'Sabre_VObject_Element_DateTime',
+ 'DTEND' => 'Sabre_VObject_Element_DateTime',
+ 'COMPLETED' => 'Sabre_VObject_Element_DateTime',
+ 'DUE' => 'Sabre_VObject_Element_DateTime',
+ 'EXDATE' => 'Sabre_VObject_Element_MultiDateTime',
+ );
+
+ /**
+ * Parses the file and returns the top component
+ *
+ * @param string $data
+ * @return Sabre_VObject_Element
+ */
+ static function read($data) {
+
+ // Detecting line endings
+ if (strpos($data,"\r\n")!==false) {
+ $newLine = "\r\n";
+ } elseif (strpos($data,"\r")) {
+ $newLine = "\r";
+ } else {
+ $newLine = "\n";
+ }
+
+ $lines = explode($newLine, $data);
+
+ // Unfolding lines
+ $lines2 = array();
+ foreach($lines as $line) {
+
+ // Skipping empty lines
+ if (!$line) continue;
+
+ if ($line[0]===" " || $line[0]==="\t") {
+ $lines2[count($lines2)-1].=substr($line,1);
+ } else {
+ $lines2[] = $line;
+ }
+
+ }
+
+ unset($lines);
+
+ reset($lines2);
+
+ return self::readLine($lines2);
+
+ }
+
+ /**
+ * Reads and parses a single line.
+ *
+ * This method receives the full array of lines. The array pointer is used
+ * to traverse.
+ *
+ * @param array $lines
+ * @return Sabre_VObject_Element
+ */
+ static private function readLine(&$lines) {
+
+ $line = current($lines);
+ $lineNr = key($lines);
+ next($lines);
+
+ // Components
+ if (stripos($line,"BEGIN:")===0) {
+
+ // This is a component
+ $obj = new Sabre_VObject_Component(strtoupper(substr($line,6)));
+
+ $nextLine = current($lines);
+
+ while(stripos($nextLine,"END:")!==0) {
+
+ $obj->children[] = self::readLine($lines);
+ $nextLine = current($lines);
+
+ if ($nextLine===false)
+ throw new Sabre_VObject_ParseException('Invalid VObject. Document ended prematurely.');
+
+ }
+
+ // Checking component name of the 'END:' line.
+ if (substr($nextLine,4)!==$obj->name) {
+ throw new Sabre_VObject_ParseException('Invalid VObject, expected: "END:' . $obj->name . '" got: "' . $nextLine . '"');
+ }
+ next($lines);
+
+ return $obj;
+
+ }
+
+ // Properties
+ //$result = preg_match('/(?P<name>[A-Z0-9-]+)(?:;(?P<parameters>^(?<!:):))(.*)$/',$line,$matches);
+
+
+ $token = '[A-Z0-9-\.]+';
+ $parameters = "(?:;(?P<parameters>([^:^\"]|\"([^\"]*)\")*))?";
+ $regex = "/^(?P<name>$token)$parameters:(?P<value>.*)$/i";
+
+ $result = preg_match($regex,$line,$matches);
+
+ if (!$result) {
+ throw new Sabre_VObject_ParseException('Invalid VObject, line ' . ($lineNr+1) . ' did not follow the icalendar/vcard format');
+ }
+
+ $propertyName = strtoupper($matches['name']);
+ $propertyValue = stripcslashes($matches['value']);
+
+ if (isset(self::$elementMap[$propertyName])) {
+ $className = self::$elementMap[$propertyName];
+ } else {
+ $className = 'Sabre_VObject_Property';
+ }
+
+ $obj = new $className($propertyName, $propertyValue);
+
+ if ($matches['parameters']) {
+
+ $obj->parameters = self::readParameters($matches['parameters']);
+ }
+
+ return $obj;
+
+
+ }
+
+ /**
+ * Reads a parameter list from a property
+ *
+ * This method returns an array of Sabre_VObject_Parameter
+ *
+ * @param string $parameters
+ * @return array
+ */
+ static private function readParameters($parameters) {
+
+ $token = '[A-Z0-9-]+';
+
+ $paramValue = '(?P<paramValue>[^\"^;]*|"[^"]*")';
+
+ $regex = "/(?<=^|;)(?P<paramName>$token)(=$paramValue(?=$|;))?/i";
+ preg_match_all($regex, $parameters, $matches, PREG_SET_ORDER);
+
+ $params = array();
+ foreach($matches as $match) {
+
+ $value = isset($match['paramValue'])?$match['paramValue']:null;
+
+ if (isset($value[0])) {
+ // Stripping quotes, if needed
+ if ($value[0] === '"') $value = substr($value,1,strlen($value)-2);
+ } else {
+ $value = '';
+ }
+
+ $params[] = new Sabre_VObject_Parameter($match['paramName'], stripcslashes($value));
+
+ }
+
+ return $params;
+
+ }
+
+
+}