]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add Compound property to avoid double escaping values.
authorThomas Tanghus <thomas@tanghus.net>
Wed, 15 May 2013 16:56:54 +0000 (18:56 +0200)
committerThomas Tanghus <thomas@tanghus.net>
Thu, 16 May 2013 14:59:37 +0000 (16:59 +0200)
lib/vobject/compoundproperty.php [new file with mode: 0644]
tests/lib/vobject.php

diff --git a/lib/vobject/compoundproperty.php b/lib/vobject/compoundproperty.php
new file mode 100644 (file)
index 0000000..d702ab8
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+/**
+ * ownCloud - VObject Compound Property
+ *
+ * @author Thomas Tanghus
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\VObject;
+
+/**
+ * This class overrides \Sabre\VObject\Property::serialize() to not
+ * double escape commas and semi-colons in compound properties.
+*/
+class CompoundProperty extends \Sabre\VObject\Property\Compound {
+
+       /**
+       * Turns the object back into a serialized blob.
+       *
+       * @return string
+       */
+       public function serialize() {
+
+               $str = $this->name;
+               if ($this->group) {
+                       $str = $this->group . '.' . $this->name;
+               }
+
+               foreach($this->parameters as $param) {
+                       $str.=';' . $param->serialize();
+               }
+               $src = array(
+                       "\n",
+               );
+               $out = array(
+                       '\n',
+               );
+               $str.=':' . str_replace($src, $out, $this->value);
+
+               $out = '';
+               while(strlen($str) > 0) {
+                       if (strlen($str) > 75) {
+                               $out .= mb_strcut($str, 0, 75, 'utf-8') . "\r\n";
+                               $str = ' ' . mb_strcut($str, 75, strlen($str), 'utf-8');
+                       } else {
+                               $out .= $str . "\r\n";
+                               $str = '';
+                               break;
+                       }
+               }
+
+               return $out;
+
+       }
+
+}
\ No newline at end of file
index 1103a4b3297084479b082bc42bb0e3f56e0bc881..f28d22a1fcdb3f0d4b4036348d23d339fc0742b6 100644 (file)
@@ -10,10 +10,29 @@ class Test_VObject extends PHPUnit_Framework_TestCase {
 
        public function setUp() {
                Sabre\VObject\Property::$classMap['SUMMARY'] = 'OC\VObject\StringProperty';
+               Sabre\VObject\Property::$classMap['ORG'] = 'OC\VObject\CompoundProperty';
        }
 
        function testStringProperty() {
                $property = Sabre\VObject\Property::create('SUMMARY', 'Escape;this,please');
                $this->assertEquals("SUMMARY:Escape\;this\,please\r\n", $property->serialize());
        }
+
+       function testCompoundProperty() {
+
+               $arr = array(
+                       'ABC, Inc.',
+                       'North American Division',
+                       'Marketing;Sales',
+               );
+
+               $property = Sabre\VObject\Property::create('ORG');
+               $property->setParts($arr);
+
+               $this->assertEquals('ABC\, Inc.;North American Division;Marketing\;Sales', $property->value);
+               $this->assertEquals('ORG:ABC\, Inc.;North American Division;Marketing\;Sales' . "\r\n", $property->serialize());
+               $this->assertEquals(3, count($property->getParts()));
+               $parts = $property->getParts();
+               $this->assertEquals('Marketing;Sales', $parts[2]);
+       }
 }
\ No newline at end of file