Mercurial > hg > rc1
comparison vendor/sabre/vobject/lib/Document.php @ 7:430dbd5346f7
vendor sabre as distributed
author | Charlie Root |
---|---|
date | Sat, 13 Jan 2018 09:06:10 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
6:cec75ba50afc | 7:430dbd5346f7 |
---|---|
1 <?php | |
2 | |
3 namespace Sabre\VObject; | |
4 | |
5 /** | |
6 * Document | |
7 * | |
8 * A document is just like a component, except that it's also the top level | |
9 * element. | |
10 * | |
11 * Both a VCALENDAR and a VCARD are considered documents. | |
12 * | |
13 * This class also provides a registry for document types. | |
14 * | |
15 * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/). | |
16 * @author Evert Pot (http://evertpot.com/) | |
17 * @license http://sabre.io/license/ Modified BSD License | |
18 */ | |
19 abstract class Document extends Component { | |
20 | |
21 /** | |
22 * Unknown document type | |
23 */ | |
24 const UNKNOWN = 1; | |
25 | |
26 /** | |
27 * vCalendar 1.0 | |
28 */ | |
29 const VCALENDAR10 = 2; | |
30 | |
31 /** | |
32 * iCalendar 2.0 | |
33 */ | |
34 const ICALENDAR20 = 3; | |
35 | |
36 /** | |
37 * vCard 2.1 | |
38 */ | |
39 const VCARD21 = 4; | |
40 | |
41 /** | |
42 * vCard 3.0 | |
43 */ | |
44 const VCARD30 = 5; | |
45 | |
46 /** | |
47 * vCard 4.0 | |
48 */ | |
49 const VCARD40 = 6; | |
50 | |
51 /** | |
52 * The default name for this component. | |
53 * | |
54 * This should be 'VCALENDAR' or 'VCARD'. | |
55 * | |
56 * @var string | |
57 */ | |
58 static public $defaultName; | |
59 | |
60 /** | |
61 * List of properties, and which classes they map to. | |
62 * | |
63 * @var array | |
64 */ | |
65 static public $propertyMap = array(); | |
66 | |
67 /** | |
68 * List of components, along with which classes they map to. | |
69 * | |
70 * @var array | |
71 */ | |
72 static public $componentMap = array(); | |
73 | |
74 /** | |
75 * List of value-types, and which classes they map to. | |
76 * | |
77 * @var array | |
78 */ | |
79 static public $valueMap = array(); | |
80 | |
81 /** | |
82 * Creates a new document. | |
83 * | |
84 * We're changing the default behavior slightly here. First, we don't want | |
85 * to have to specify a name (we already know it), and we want to allow | |
86 * children to be specified in the first argument. | |
87 * | |
88 * But, the default behavior also works. | |
89 * | |
90 * So the two sigs: | |
91 * | |
92 * new Document(array $children = array(), $defaults = true); | |
93 * new Document(string $name, array $children = array(), $defaults = true) | |
94 * | |
95 * @return void | |
96 */ | |
97 public function __construct() { | |
98 | |
99 $args = func_get_args(); | |
100 if (count($args)===0 || is_array($args[0])) { | |
101 array_unshift($args, $this, static::$defaultName); | |
102 call_user_func_array(array('parent', '__construct'), $args); | |
103 } else { | |
104 array_unshift($args, $this); | |
105 call_user_func_array(array('parent', '__construct'), $args); | |
106 } | |
107 | |
108 } | |
109 | |
110 /** | |
111 * Returns the current document type. | |
112 * | |
113 * @return void | |
114 */ | |
115 public function getDocumentType() { | |
116 | |
117 return self::UNKNOWN; | |
118 | |
119 } | |
120 | |
121 /** | |
122 * Creates a new component or property. | |
123 * | |
124 * If it's a known component, we will automatically call createComponent. | |
125 * otherwise, we'll assume it's a property and call createProperty instead. | |
126 * | |
127 * @param string $name | |
128 * @param string $arg1,... Unlimited number of args | |
129 * @return mixed | |
130 */ | |
131 public function create($name) { | |
132 | |
133 if (isset(static::$componentMap[strtoupper($name)])) { | |
134 | |
135 return call_user_func_array(array($this,'createComponent'), func_get_args()); | |
136 | |
137 } else { | |
138 | |
139 return call_user_func_array(array($this,'createProperty'), func_get_args()); | |
140 | |
141 } | |
142 | |
143 } | |
144 | |
145 /** | |
146 * Creates a new component | |
147 * | |
148 * This method automatically searches for the correct component class, based | |
149 * on its name. | |
150 * | |
151 * You can specify the children either in key=>value syntax, in which case | |
152 * properties will automatically be created, or you can just pass a list of | |
153 * Component and Property object. | |
154 * | |
155 * By default, a set of sensible values will be added to the component. For | |
156 * an iCalendar object, this may be something like CALSCALE:GREGORIAN. To | |
157 * ensure that this does not happen, set $defaults to false. | |
158 * | |
159 * @param string $name | |
160 * @param array $children | |
161 * @param bool $defaults | |
162 * @return Component | |
163 */ | |
164 public function createComponent($name, array $children = null, $defaults = true) { | |
165 | |
166 $name = strtoupper($name); | |
167 $class = 'Sabre\\VObject\\Component'; | |
168 | |
169 if (isset(static::$componentMap[$name])) { | |
170 $class=static::$componentMap[$name]; | |
171 } | |
172 if (is_null($children)) $children = array(); | |
173 return new $class($this, $name, $children, $defaults); | |
174 | |
175 } | |
176 | |
177 /** | |
178 * Factory method for creating new properties | |
179 * | |
180 * This method automatically searches for the correct property class, based | |
181 * on its name. | |
182 * | |
183 * You can specify the parameters either in key=>value syntax, in which case | |
184 * parameters will automatically be created, or you can just pass a list of | |
185 * Parameter objects. | |
186 * | |
187 * @param string $name | |
188 * @param mixed $value | |
189 * @param array $parameters | |
190 * @param string $valueType Force a specific valuetype, such as URI or TEXT | |
191 * @return Property | |
192 */ | |
193 public function createProperty($name, $value = null, array $parameters = null, $valueType = null) { | |
194 | |
195 // If there's a . in the name, it means it's prefixed by a groupname. | |
196 if (($i=strpos($name,'.'))!==false) { | |
197 $group = substr($name, 0, $i); | |
198 $name = strtoupper(substr($name, $i+1)); | |
199 } else { | |
200 $name = strtoupper($name); | |
201 $group = null; | |
202 } | |
203 | |
204 $class = null; | |
205 | |
206 if ($valueType) { | |
207 // The valueType argument comes first to figure out the correct | |
208 // class. | |
209 $class = $this->getClassNameForPropertyValue($valueType); | |
210 } | |
211 | |
212 if (is_null($class) && isset($parameters['VALUE'])) { | |
213 // If a VALUE parameter is supplied, we should use that. | |
214 $class = $this->getClassNameForPropertyValue($parameters['VALUE']); | |
215 } | |
216 if (is_null($class)) { | |
217 $class = $this->getClassNameForPropertyName($name); | |
218 } | |
219 if (is_null($parameters)) $parameters = array(); | |
220 | |
221 return new $class($this, $name, $value, $parameters, $group); | |
222 | |
223 } | |
224 | |
225 /** | |
226 * This method returns a full class-name for a value parameter. | |
227 * | |
228 * For instance, DTSTART may have VALUE=DATE. In that case we will look in | |
229 * our valueMap table and return the appropriate class name. | |
230 * | |
231 * This method returns null if we don't have a specialized class. | |
232 * | |
233 * @param string $valueParam | |
234 * @return void | |
235 */ | |
236 public function getClassNameForPropertyValue($valueParam) { | |
237 | |
238 $valueParam = strtoupper($valueParam); | |
239 if (isset(static::$valueMap[$valueParam])) { | |
240 return static::$valueMap[$valueParam]; | |
241 } | |
242 | |
243 } | |
244 | |
245 /** | |
246 * Returns the default class for a property name. | |
247 * | |
248 * @param string $propertyName | |
249 * @return string | |
250 */ | |
251 public function getClassNameForPropertyName($propertyName) { | |
252 | |
253 if (isset(static::$propertyMap[$propertyName])) { | |
254 return static::$propertyMap[$propertyName]; | |
255 } else { | |
256 return 'Sabre\\VObject\\Property\\Unknown'; | |
257 } | |
258 | |
259 } | |
260 | |
261 } |