Merge branch 'dev' of https://framagit.org/hubzilla/core into dev
This commit is contained in:
commit
95871fe13c
11
CHANGELOG
11
CHANGELOG
@ -1,3 +1,14 @@
|
||||
Hubzilla 4.0.3 (2019-04-26)
|
||||
- Add attachments to zot6 event objects
|
||||
- Add zot6 to federated transports
|
||||
- Update import/export to handle zot6 hublocs and xchans
|
||||
- Update fix_system_urls() to handle zot6 hublocs
|
||||
- Fix infinite loop using postgres as backend
|
||||
- Fix magic auth in combination with zot6
|
||||
- Fix check for required PHP version
|
||||
- Diaspora: favour diaspora protocol identities over others with same hubloc or xchan address
|
||||
|
||||
|
||||
Hubzilla 4.0.2 (2019-04-08)
|
||||
- Port cdav calendar to fullcalendar version 4
|
||||
- Fix perms_pending not evaluated correctly
|
||||
|
@ -310,10 +310,6 @@ class Channel extends Controller {
|
||||
$sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
|
||||
}
|
||||
|
||||
if($datequery || $datequery2) {
|
||||
$sql_extra2 .= " and item.item_thread_top != 0 ";
|
||||
}
|
||||
|
||||
if($order === 'post')
|
||||
$ordering = "created";
|
||||
else
|
||||
@ -342,7 +338,7 @@ class Channel extends Controller {
|
||||
AND (abook.abook_blocked = 0 or abook.abook_flags is null)
|
||||
AND item.item_wall = 1 AND item.item_thread_top = 1
|
||||
$sql_extra $sql_extra2
|
||||
ORDER BY $ordering DESC $pager_sql ",
|
||||
ORDER BY $ordering DESC, item_id $pager_sql ",
|
||||
intval(App::$profile['profile_uid'])
|
||||
);
|
||||
}
|
||||
|
@ -173,8 +173,7 @@ class Photo extends \Zotlabs\Web\Controller {
|
||||
// SSLify if needed
|
||||
if(strpos(z_root(),'https:') !== false && strpos($url,'https:') === false)
|
||||
$url = z_root() . '/sslify/' . $filename . '?f=&url=' . urlencode($url);
|
||||
header("Location: " . $url);
|
||||
killme();
|
||||
goaway($url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
23
composer.lock
generated
23
composer.lock
generated
@ -8,16 +8,16 @@
|
||||
"packages": [
|
||||
{
|
||||
"name": "blueimp/jquery-file-upload",
|
||||
"version": "v9.28.0",
|
||||
"version": "v9.30.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vkhramtsov/jQuery-File-Upload.git",
|
||||
"reference": "ff5accfe2e5c4a522777faa980a90cf86a636d1d"
|
||||
"reference": "1fceec556879403e5c1ae32a7c448aa12b8c3558"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vkhramtsov/jQuery-File-Upload/zipball/ff5accfe2e5c4a522777faa980a90cf86a636d1d",
|
||||
"reference": "ff5accfe2e5c4a522777faa980a90cf86a636d1d",
|
||||
"url": "https://api.github.com/repos/vkhramtsov/jQuery-File-Upload/zipball/1fceec556879403e5c1ae32a7c448aa12b8c3558",
|
||||
"reference": "1fceec556879403e5c1ae32a7c448aa12b8c3558",
|
||||
"shasum": ""
|
||||
},
|
||||
"type": "library",
|
||||
@ -59,7 +59,7 @@
|
||||
"upload",
|
||||
"widget"
|
||||
],
|
||||
"time": "2018-11-13T05:41:39+00:00"
|
||||
"time": "2019-04-22T09:21:57+00:00"
|
||||
},
|
||||
{
|
||||
"name": "bshaffer/oauth2-server-php",
|
||||
@ -861,16 +861,16 @@
|
||||
},
|
||||
{
|
||||
"name": "sabre/vobject",
|
||||
"version": "4.1.6",
|
||||
"version": "4.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sabre-io/vobject.git",
|
||||
"reference": "122cacbdea2c6133ac04db86ec05854beef75adf"
|
||||
"reference": "bd500019764e434ff65872d426f523e7882a0739"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sabre-io/vobject/zipball/122cacbdea2c6133ac04db86ec05854beef75adf",
|
||||
"reference": "122cacbdea2c6133ac04db86ec05854beef75adf",
|
||||
"url": "https://api.github.com/repos/sabre-io/vobject/zipball/bd500019764e434ff65872d426f523e7882a0739",
|
||||
"reference": "bd500019764e434ff65872d426f523e7882a0739",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -879,8 +879,7 @@
|
||||
"sabre/xml": ">=1.5 <3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "> 4.8.35, <6.0.0",
|
||||
"sabre/cs": "^1.0.0"
|
||||
"phpunit/phpunit": "> 4.8.35, <6.0.0"
|
||||
},
|
||||
"suggest": {
|
||||
"hoa/bench": "If you would like to run the benchmark scripts"
|
||||
@ -954,7 +953,7 @@
|
||||
"xCal",
|
||||
"xCard"
|
||||
],
|
||||
"time": "2018-04-20T07:22:50+00:00"
|
||||
"time": "2019-02-19T13:05:37+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sabre/xml",
|
||||
|
@ -4278,7 +4278,7 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
|
||||
if($arr['mid'])
|
||||
$sql_options .= " and parent_mid = '" . dbesc($arr['mid']) . "' ";
|
||||
|
||||
$sql_extra = " AND item.parent IN ( SELECT parent FROM item WHERE item_thread_top = 1 $sql_options $item_normal ) ";
|
||||
$sql_extra = " AND item.parent IN ( SELECT parent FROM item WHERE $item_uids and item_thread_top = 1 $sql_options $item_normal ) ";
|
||||
|
||||
if($arr['since_id'])
|
||||
$sql_extra .= " and item.id > " . $since_id . " ";
|
||||
|
@ -128,6 +128,6 @@ To do so, locate the ImageMagick `policy.xml` configuration file and add the fol
|
||||
<!-- ... -->
|
||||
<policy domain="delegate" rights="none" pattern="*" />
|
||||
<policy domain="coder" rights="none" pattern="*" />
|
||||
<policy domain="coder" rights="read | write" pattern="{GIF,JPEG,PNG}" />
|
||||
<policy domain="coder" rights="read | write" pattern="{GIF,JPEG,JPG,PNG}" />
|
||||
</policymap>
|
||||
```
|
||||
|
2
vendor/blueimp/jquery-file-upload/bower.json
vendored
2
vendor/blueimp/jquery-file-upload/bower.json
vendored
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "blueimp-file-upload",
|
||||
"version": "9.28.0",
|
||||
"version": "9.30.0",
|
||||
"title": "jQuery File Upload",
|
||||
"description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images.",
|
||||
"keywords": [
|
||||
|
4
vendor/blueimp/jquery-file-upload/index.html
vendored
4
vendor/blueimp/jquery-file-upload/index.html
vendored
@ -149,7 +149,9 @@
|
||||
<span class="preview"></span>
|
||||
</td>
|
||||
<td>
|
||||
{% if (window.innerWidth > 480 || !o.options.loadImageFileTypes.test(file.type)) { %}
|
||||
<p class="name">{%=file.name%}</p>
|
||||
{% } %}
|
||||
<strong class="error text-danger"></strong>
|
||||
</td>
|
||||
<td>
|
||||
@ -185,6 +187,7 @@
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
{% if (window.innerWidth > 480 || !file.thumbnailUrl) { %}
|
||||
<p class="name">
|
||||
{% if (file.url) { %}
|
||||
<a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
|
||||
@ -192,6 +195,7 @@
|
||||
<span>{%=file.name%}</span>
|
||||
{% } %}
|
||||
</p>
|
||||
{% } %}
|
||||
{% if (file.error) { %}
|
||||
<div><span class="label label-danger">Error</span> {%=file.error%}</div>
|
||||
{% } %}
|
||||
|
@ -154,7 +154,9 @@
|
||||
<span class="preview"></span>
|
||||
</td>
|
||||
<td>
|
||||
{% if (window.innerWidth > 480 || !o.options.loadImageFileTypes.test(file.type)) { %}
|
||||
<p class="name">{%=file.name%}</p>
|
||||
{% } %}
|
||||
<strong class="error"></strong>
|
||||
</td>
|
||||
<td>
|
||||
@ -184,9 +186,11 @@
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
{% if (window.innerWidth > 480 || !file.thumbnailUrl) { %}
|
||||
<p class="name">
|
||||
<a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
|
||||
</p>
|
||||
{% } %}
|
||||
{% if (file.error) { %}
|
||||
<div><span class="error">Error</span> {%=file.error%}</div>
|
||||
{% } %}
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "blueimp-file-upload",
|
||||
"version": "9.28.0",
|
||||
"version": "9.30.0",
|
||||
"title": "jQuery File Upload",
|
||||
"description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
|
||||
"keywords": [
|
||||
|
1
vendor/composer/autoload_classmap.php
vendored
1
vendor/composer/autoload_classmap.php
vendored
@ -919,6 +919,7 @@ return array(
|
||||
'Zotlabs\\Module\\Cdav' => $baseDir . '/Zotlabs/Module/Cdav.php',
|
||||
'Zotlabs\\Module\\Changeaddr' => $baseDir . '/Zotlabs/Module/Changeaddr.php',
|
||||
'Zotlabs\\Module\\Channel' => $baseDir . '/Zotlabs/Module/Channel.php',
|
||||
'Zotlabs\\Module\\Channel_calendar' => $baseDir . '/Zotlabs/Module/Channel_calendar.php',
|
||||
'Zotlabs\\Module\\Chanview' => $baseDir . '/Zotlabs/Module/Chanview.php',
|
||||
'Zotlabs\\Module\\Chat' => $baseDir . '/Zotlabs/Module/Chat.php',
|
||||
'Zotlabs\\Module\\Chatsvc' => $baseDir . '/Zotlabs/Module/Chatsvc.php',
|
||||
|
1
vendor/composer/autoload_static.php
vendored
1
vendor/composer/autoload_static.php
vendored
@ -1087,6 +1087,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
|
||||
'Zotlabs\\Module\\Cdav' => __DIR__ . '/../..' . '/Zotlabs/Module/Cdav.php',
|
||||
'Zotlabs\\Module\\Changeaddr' => __DIR__ . '/../..' . '/Zotlabs/Module/Changeaddr.php',
|
||||
'Zotlabs\\Module\\Channel' => __DIR__ . '/../..' . '/Zotlabs/Module/Channel.php',
|
||||
'Zotlabs\\Module\\Channel_calendar' => __DIR__ . '/../..' . '/Zotlabs/Module/Channel_calendar.php',
|
||||
'Zotlabs\\Module\\Chanview' => __DIR__ . '/../..' . '/Zotlabs/Module/Chanview.php',
|
||||
'Zotlabs\\Module\\Chat' => __DIR__ . '/../..' . '/Zotlabs/Module/Chat.php',
|
||||
'Zotlabs\\Module\\Chatsvc' => __DIR__ . '/../..' . '/Zotlabs/Module/Chatsvc.php',
|
||||
|
27
vendor/composer/installed.json
vendored
27
vendor/composer/installed.json
vendored
@ -1,20 +1,20 @@
|
||||
[
|
||||
{
|
||||
"name": "blueimp/jquery-file-upload",
|
||||
"version": "v9.28.0",
|
||||
"version_normalized": "9.28.0.0",
|
||||
"version": "v9.30.0",
|
||||
"version_normalized": "9.30.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vkhramtsov/jQuery-File-Upload.git",
|
||||
"reference": "ff5accfe2e5c4a522777faa980a90cf86a636d1d"
|
||||
"reference": "1fceec556879403e5c1ae32a7c448aa12b8c3558"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vkhramtsov/jQuery-File-Upload/zipball/ff5accfe2e5c4a522777faa980a90cf86a636d1d",
|
||||
"reference": "ff5accfe2e5c4a522777faa980a90cf86a636d1d",
|
||||
"url": "https://api.github.com/repos/vkhramtsov/jQuery-File-Upload/zipball/1fceec556879403e5c1ae32a7c448aa12b8c3558",
|
||||
"reference": "1fceec556879403e5c1ae32a7c448aa12b8c3558",
|
||||
"shasum": ""
|
||||
},
|
||||
"time": "2018-11-13T05:41:39+00:00",
|
||||
"time": "2019-04-22T09:21:57+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
@ -886,17 +886,17 @@
|
||||
},
|
||||
{
|
||||
"name": "sabre/vobject",
|
||||
"version": "4.1.6",
|
||||
"version_normalized": "4.1.6.0",
|
||||
"version": "4.2.0",
|
||||
"version_normalized": "4.2.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sabre-io/vobject.git",
|
||||
"reference": "122cacbdea2c6133ac04db86ec05854beef75adf"
|
||||
"reference": "bd500019764e434ff65872d426f523e7882a0739"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sabre-io/vobject/zipball/122cacbdea2c6133ac04db86ec05854beef75adf",
|
||||
"reference": "122cacbdea2c6133ac04db86ec05854beef75adf",
|
||||
"url": "https://api.github.com/repos/sabre-io/vobject/zipball/bd500019764e434ff65872d426f523e7882a0739",
|
||||
"reference": "bd500019764e434ff65872d426f523e7882a0739",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -905,13 +905,12 @@
|
||||
"sabre/xml": ">=1.5 <3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "> 4.8.35, <6.0.0",
|
||||
"sabre/cs": "^1.0.0"
|
||||
"phpunit/phpunit": "> 4.8.35, <6.0.0"
|
||||
},
|
||||
"suggest": {
|
||||
"hoa/bench": "If you would like to run the benchmark scripts"
|
||||
},
|
||||
"time": "2018-04-20T07:22:50+00:00",
|
||||
"time": "2019-02-19T13:05:37+00:00",
|
||||
"bin": [
|
||||
"bin/vobject",
|
||||
"bin/generate_vcards"
|
||||
|
1
vendor/sabre/vobject/.gitignore
vendored
1
vendor/sabre/vobject/.gitignore
vendored
@ -16,6 +16,7 @@ bin/hoa
|
||||
|
||||
# Development stuff
|
||||
testdata/
|
||||
.php_cs.cache
|
||||
|
||||
# OS X
|
||||
.DS_Store
|
||||
|
12
vendor/sabre/vobject/.php_cs.dist
vendored
Normal file
12
vendor/sabre/vobject/.php_cs.dist
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
$config = PhpCsFixer\Config::create();
|
||||
$config->getFinder()
|
||||
->exclude('vendor')
|
||||
->in(__DIR__);
|
||||
$config->setRules([
|
||||
'@PSR1' => true,
|
||||
'@Symfony' =>true
|
||||
]);
|
||||
|
||||
return $config;
|
27
vendor/sabre/vobject/.travis.yml
vendored
27
vendor/sabre/vobject/.travis.yml
vendored
@ -1,20 +1,39 @@
|
||||
language: php
|
||||
sudo: required
|
||||
php:
|
||||
- 5.5
|
||||
- 5.6
|
||||
- 7.0
|
||||
- 7.1
|
||||
- 7.2
|
||||
- 7.3
|
||||
|
||||
sudo: false
|
||||
env:
|
||||
global:
|
||||
- RUN_PHPSTAN="FALSE"
|
||||
|
||||
script:
|
||||
- ./bin/phpunit --configuration tests/phpunit.xml
|
||||
- ./bin/sabre-cs-fixer fix . --dry-run --diff
|
||||
matrix:
|
||||
include:
|
||||
- name: 'PHPStan'
|
||||
php: 7.2
|
||||
env: RUN_PHPSTAN="TRUE"
|
||||
fast_finish: true
|
||||
allow_failures:
|
||||
- php: 5.5
|
||||
|
||||
install:
|
||||
- if [ $RUN_PHPSTAN == "TRUE" ]; then wget https://github.com/phpstan/phpstan/releases/download/0.10.3/phpstan.phar; fi
|
||||
|
||||
before_script:
|
||||
- composer install
|
||||
|
||||
script:
|
||||
- if [ $RUN_PHPSTAN == "FALSE" ]; then ./bin/phpunit --configuration tests/phpunit.xml --coverage-clover=coverage.xml; fi
|
||||
- if [ $RUN_PHPSTAN == "TRUE" ]; then php phpstan.phar analyse -c phpstan.neon lib; fi
|
||||
|
||||
after_success:
|
||||
- bash <(curl -s https://codecov.io/bash)
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.composer/cache
|
||||
|
15
vendor/sabre/vobject/CHANGELOG.md
vendored
15
vendor/sabre/vobject/CHANGELOG.md
vendored
@ -1,6 +1,19 @@
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
4.2.0 (2019-02-19)
|
||||
------------------
|
||||
|
||||
* #432: DTSTAMP must be specified in UTC
|
||||
* #435: ORGANIZER e-mail address are case-insensitive
|
||||
* #441: Repairing BASE64 encoded vCard version 3
|
||||
|
||||
4.2.0-alpha1 (2018-09-26)
|
||||
-------------------------
|
||||
|
||||
* #412: Broker: add timezone to CANCEL messages
|
||||
* #424: Support php7.3
|
||||
|
||||
4.1.6 (2018-04-20)
|
||||
------------------
|
||||
|
||||
@ -29,7 +42,7 @@ ChangeLog
|
||||
|
||||
* #363: Repair script and de-duplicate properties that are only allowed once,
|
||||
but appear more than once. (@ddolcimascolo).
|
||||
* #377: Addes Pacific Time (US & Canada) as exchange timezone
|
||||
* #377: Added Pacific Time (US & Canada) as exchange timezone
|
||||
* #384: Added fallback for VCards without `FN`
|
||||
|
||||
|
||||
|
2
vendor/sabre/vobject/bin/bench.php
vendored
2
vendor/sabre/vobject/bin/bench.php
vendored
@ -9,4 +9,4 @@ $start = microtime(true);
|
||||
|
||||
$lol = Sabre\VObject\Reader::read($data);
|
||||
|
||||
echo "time: " . (microtime(true) - $start) . "\n";
|
||||
echo 'time: '.(microtime(true) - $start)."\n";
|
||||
|
@ -3,14 +3,14 @@
|
||||
include __DIR__.'/../vendor/autoload.php';
|
||||
|
||||
if ($argc < 2) {
|
||||
echo "sabre/vobject ", Sabre\VObject\Version::VERSION, " freebusy benchmark\n";
|
||||
echo 'sabre/vobject ', Sabre\VObject\Version::VERSION, " freebusy benchmark\n";
|
||||
echo "\n";
|
||||
echo "This script can be used to measure the speed of generating a\n";
|
||||
echo "free-busy report based on a calendar.\n";
|
||||
echo "\n";
|
||||
echo "The process will be repeated 100 times to get accurate stats\n";
|
||||
echo "\n";
|
||||
echo "Usage: " . $argv[0] . " inputfile.ics\n";
|
||||
echo 'Usage: '.$argv[0]." inputfile.ics\n";
|
||||
die();
|
||||
}
|
||||
|
||||
@ -30,33 +30,24 @@ $timeZone = new \DateTimeZone('America/Toronto');
|
||||
|
||||
$bench->fb->start();
|
||||
|
||||
for ($i = 0; $i < $repeat; $i++) {
|
||||
|
||||
for ($i = 0; $i < $repeat; ++$i) {
|
||||
$fb = new Sabre\VObject\FreeBusyGenerator($start, $end, $vcal, $timeZone);
|
||||
$results = $fb->getResult();
|
||||
|
||||
}
|
||||
$bench->fb->stop();
|
||||
|
||||
|
||||
|
||||
echo $bench,"\n";
|
||||
|
||||
function formatMemory($input) {
|
||||
|
||||
function formatMemory($input)
|
||||
{
|
||||
if (strlen($input) > 6) {
|
||||
|
||||
return round($input / (1024 * 1024)).'M';
|
||||
|
||||
} elseif (strlen($input) > 3) {
|
||||
|
||||
return round($input / 1024).'K';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
unset($input, $splitter);
|
||||
|
||||
echo "peak memory usage: " . formatMemory(memory_get_peak_usage()), "\n";
|
||||
echo "current memory usage: " . formatMemory(memory_get_usage()), "\n";
|
||||
echo 'peak memory usage: '.formatMemory(memory_get_peak_usage()), "\n";
|
||||
echo 'current memory usage: '.formatMemory(memory_get_usage()), "\n";
|
||||
|
@ -3,13 +3,13 @@
|
||||
include __DIR__.'/../vendor/autoload.php';
|
||||
|
||||
if ($argc < 2) {
|
||||
echo "sabre/vobject ", Sabre\VObject\Version::VERSION, " manipulation benchmark\n";
|
||||
echo 'sabre/vobject ', Sabre\VObject\Version::VERSION, " manipulation benchmark\n";
|
||||
echo "\n";
|
||||
echo "This script can be used to measure the speed of opening a large amount of\n";
|
||||
echo "vcards, making a few alterations and serializing them again.\n";
|
||||
echo "system.";
|
||||
echo 'system.';
|
||||
echo "\n";
|
||||
echo "Usage: " . $argv[0] . " inputfile.vcf\n";
|
||||
echo 'Usage: '.$argv[0]." inputfile.vcf\n";
|
||||
die();
|
||||
}
|
||||
|
||||
@ -22,19 +22,22 @@ $splitter = new Sabre\VObject\Splitter\VCard($input);
|
||||
$bench = new Hoa\Bench\Bench();
|
||||
|
||||
while (true) {
|
||||
|
||||
$bench->parse->start();
|
||||
$vcard = $splitter->getNext();
|
||||
$bench->parse->pause();
|
||||
|
||||
if (!$vcard) break;
|
||||
if (!$vcard) {
|
||||
break;
|
||||
}
|
||||
|
||||
$bench->manipulate->start();
|
||||
$vcard->{'X-FOO'} = 'Random new value!';
|
||||
$emails = [];
|
||||
if (isset($vcard->EMAIL)) foreach ($vcard->EMAIL as $email) {
|
||||
if (isset($vcard->EMAIL)) {
|
||||
foreach ($vcard->EMAIL as $email) {
|
||||
$emails[] = (string) $email;
|
||||
}
|
||||
}
|
||||
$bench->manipulate->pause();
|
||||
|
||||
$bench->serialize->start();
|
||||
@ -42,28 +45,20 @@ while (true) {
|
||||
$bench->serialize->pause();
|
||||
|
||||
$vcard->destroy();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
echo $bench,"\n";
|
||||
|
||||
function formatMemory($input) {
|
||||
|
||||
function formatMemory($input)
|
||||
{
|
||||
if (strlen($input) > 6) {
|
||||
|
||||
return round($input / (1024 * 1024)).'M';
|
||||
|
||||
} elseif (strlen($input) > 3) {
|
||||
|
||||
return round($input / 1024).'K';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
unset($input, $splitter);
|
||||
|
||||
echo "peak memory usage: " . formatMemory(memory_get_peak_usage()), "\n";
|
||||
echo "current memory usage: " . formatMemory(memory_get_usage()), "\n";
|
||||
echo 'peak memory usage: '.formatMemory(memory_get_peak_usage()), "\n";
|
||||
echo 'current memory usage: '.formatMemory(memory_get_usage()), "\n";
|
||||
|
10
vendor/sabre/vobject/bin/fetch_windows_zones.php
vendored
10
vendor/sabre/vobject/bin/fetch_windows_zones.php
vendored
@ -4,7 +4,7 @@
|
||||
$windowsZonesUrl = 'http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml';
|
||||
$outputFile = __DIR__.'/../lib/timezonedata/windowszones.php';
|
||||
|
||||
echo "Fetching timezone map from: " . $windowsZonesUrl, "\n";
|
||||
echo 'Fetching timezone map from: '.$windowsZonesUrl, "\n";
|
||||
|
||||
$data = file_get_contents($windowsZonesUrl);
|
||||
|
||||
@ -13,7 +13,6 @@ $xml = simplexml_load_string($data);
|
||||
$map = [];
|
||||
|
||||
foreach ($xml->xpath('//mapZone') as $mapZone) {
|
||||
|
||||
$from = (string) $mapZone['other'];
|
||||
$to = (string) $mapZone['type'];
|
||||
|
||||
@ -22,7 +21,6 @@ foreach ($xml->xpath('//mapZone') as $mapZone) {
|
||||
if (!isset($map[$from])) {
|
||||
$map[$from] = $to;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ksort($map);
|
||||
@ -33,14 +31,14 @@ fwrite($f, "<?php\n\n");
|
||||
fwrite($f, "/**\n");
|
||||
fwrite($f, " * Automatically generated timezone file\n");
|
||||
fwrite($f, " *\n");
|
||||
fwrite($f, " * Last update: " . date(DATE_W3C) . "\n");
|
||||
fwrite($f, " * Source: " . $windowsZonesUrl . "\n");
|
||||
fwrite($f, ' * Last update: '.date(DATE_W3C)."\n");
|
||||
fwrite($f, ' * Source: '.$windowsZonesUrl."\n");
|
||||
fwrite($f, " *\n");
|
||||
fwrite($f, " * @copyright Copyright (C) fruux GmbH (https://fruux.com/).\n");
|
||||
fwrite($f, " * @license http://sabre.io/license/ Modified BSD License\n");
|
||||
fwrite($f, " */\n");
|
||||
fwrite($f, "\n");
|
||||
fwrite($f, "return ");
|
||||
fwrite($f, 'return ');
|
||||
fwrite($f, var_export($map, true).';');
|
||||
fclose($f);
|
||||
|
||||
|
@ -23,11 +23,13 @@ HI
|
||||
|
||||
$events = 100;
|
||||
|
||||
if (isset($argv[1])) $events = (int)$argv[1];
|
||||
if (isset($argv[1])) {
|
||||
$events = (int) $argv[1];
|
||||
}
|
||||
|
||||
include __DIR__.'/../vendor/autoload.php';
|
||||
|
||||
fwrite(STDERR, "Generating " . $events . " events\n");
|
||||
fwrite(STDERR, 'Generating '.$events." events\n");
|
||||
|
||||
$currentDate = new DateTime('-'.round($events / 2).' days');
|
||||
|
||||
@ -36,8 +38,7 @@ $calendar = new VObject\Component\VCalendar();
|
||||
$ii = 0;
|
||||
|
||||
while ($ii < $events) {
|
||||
|
||||
$ii++;
|
||||
++$ii;
|
||||
|
||||
$event = $calendar->add('VEVENT');
|
||||
$event->DTSTART = 'bla';
|
||||
@ -59,18 +60,16 @@ while ($ii < $events) {
|
||||
break;
|
||||
case 2:
|
||||
$event->RRULE = 'FREQ=DAILY;COUNT='.mt_rand(1, 10);
|
||||
// No break intentional
|
||||
// no break intentional
|
||||
default:
|
||||
$dtStart = clone $currentDate;
|
||||
$dtStart->setTime(mt_rand(1, 23), mt_rand(0, 59), mt_rand(0, 59));
|
||||
$event->DTSTART->setDateTime($dtStart);
|
||||
$event->DURATION = 'PT'.mt_rand(1, 3).'H';
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
$currentDate->modify('+ '.mt_rand(0, 3).' days');
|
||||
|
||||
}
|
||||
fwrite(STDERR, "Validating\n");
|
||||
|
||||
|
88
vendor/sabre/vobject/bin/mergeduplicates.php
vendored
88
vendor/sabre/vobject/bin/mergeduplicates.php
vendored
@ -22,14 +22,12 @@ if (!class_exists('Sabre\\VObject\\Version')) {
|
||||
die(1);
|
||||
}
|
||||
|
||||
echo "sabre/vobject ", Version::VERSION, " duplicate contact merge tool\n";
|
||||
echo 'sabre/vobject ', Version::VERSION, " duplicate contact merge tool\n";
|
||||
|
||||
if ($argc < 3) {
|
||||
|
||||
echo "\n";
|
||||
echo "Usage: ", $argv[0], " input.vcf output.vcf [debug.log]\n";
|
||||
echo 'Usage: ', $argv[0], " input.vcf output.vcf [debug.log]\n";
|
||||
die(1);
|
||||
|
||||
}
|
||||
|
||||
$input = fopen($argv[1], 'r');
|
||||
@ -42,83 +40,72 @@ $splitter = new Splitter\VCard($input);
|
||||
// but not in others, we don't consider them for the sake of finding
|
||||
// differences.
|
||||
$ignoredProperties = [
|
||||
"PRODID",
|
||||
"VERSION",
|
||||
"REV",
|
||||
"UID",
|
||||
"X-ABLABEL",
|
||||
'PRODID',
|
||||
'VERSION',
|
||||
'REV',
|
||||
'UID',
|
||||
'X-ABLABEL',
|
||||
];
|
||||
|
||||
|
||||
$collectedNames = [];
|
||||
|
||||
$stats = [
|
||||
"Total vcards" => 0,
|
||||
"No FN property" => 0,
|
||||
"Ignored duplicates" => 0,
|
||||
"Merged values" => 0,
|
||||
"Error" => 0,
|
||||
"Unique cards" => 0,
|
||||
"Total written" => 0,
|
||||
'Total vcards' => 0,
|
||||
'No FN property' => 0,
|
||||
'Ignored duplicates' => 0,
|
||||
'Merged values' => 0,
|
||||
'Error' => 0,
|
||||
'Unique cards' => 0,
|
||||
'Total written' => 0,
|
||||
];
|
||||
|
||||
function writeStats() {
|
||||
|
||||
function writeStats()
|
||||
{
|
||||
global $stats;
|
||||
foreach ($stats as $name => $value) {
|
||||
echo str_pad($name, 23, " ", STR_PAD_RIGHT), str_pad($value, 6, " ", STR_PAD_LEFT), "\n";
|
||||
echo str_pad($name, 23, ' ', STR_PAD_RIGHT), str_pad($value, 6, ' ', STR_PAD_LEFT), "\n";
|
||||
}
|
||||
// Moving cursor back a few lines.
|
||||
echo "\033[" . count($stats) . "A";
|
||||
|
||||
echo "\033[".count($stats).'A';
|
||||
}
|
||||
|
||||
function write($vcard) {
|
||||
|
||||
function write($vcard)
|
||||
{
|
||||
global $stats, $output;
|
||||
|
||||
$stats["Total written"]++;
|
||||
++$stats['Total written'];
|
||||
fwrite($output, $vcard->serialize()."\n");
|
||||
|
||||
}
|
||||
|
||||
while ($vcard = $splitter->getNext()) {
|
||||
|
||||
$stats["Total vcards"]++;
|
||||
++$stats['Total vcards'];
|
||||
writeStats();
|
||||
|
||||
$fn = isset($vcard->FN) ? (string) $vcard->FN : null;
|
||||
|
||||
if (empty($fn)) {
|
||||
|
||||
// Immediately write this vcard, we don't compare it.
|
||||
$stats["No FN property"]++;
|
||||
$stats['Unique cards']++;
|
||||
++$stats['No FN property'];
|
||||
++$stats['Unique cards'];
|
||||
write($vcard);
|
||||
$vcard->destroy();
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
if (!isset($collectedNames[$fn])) {
|
||||
|
||||
$collectedNames[$fn] = $vcard;
|
||||
$stats['Unique cards']++;
|
||||
++$stats['Unique cards'];
|
||||
continue;
|
||||
|
||||
} else {
|
||||
|
||||
// Starting comparison for all properties. We only check if properties
|
||||
// in the current vcard exactly appear in the earlier vcard as well.
|
||||
foreach ($vcard->children() as $newProp) {
|
||||
|
||||
if (in_array($newProp->name, $ignoredProperties)) {
|
||||
// We don't care about properties such as UID and REV.
|
||||
continue;
|
||||
}
|
||||
$ok = false;
|
||||
foreach ($collectedNames[$fn]->select($newProp->name) as $compareProp) {
|
||||
|
||||
if ($compareProp->serialize() === $newProp->serialize()) {
|
||||
$ok = true;
|
||||
break;
|
||||
@ -126,14 +113,11 @@ while ($vcard = $splitter->getNext()) {
|
||||
}
|
||||
|
||||
if (!$ok) {
|
||||
|
||||
if ($newProp->name === 'EMAIL' || $newProp->name === 'TEL') {
|
||||
|
||||
if ('EMAIL' === $newProp->name || 'TEL' === $newProp->name) {
|
||||
// We're going to make another attempt to find this
|
||||
// property, this time just by value. If we find it, we
|
||||
// consider it a success.
|
||||
foreach ($collectedNames[$fn]->select($newProp->name) as $compareProp) {
|
||||
|
||||
if ($compareProp->getValue() === $newProp->getValue()) {
|
||||
$ok = true;
|
||||
break;
|
||||
@ -141,44 +125,36 @@ while ($vcard = $splitter->getNext()) {
|
||||
}
|
||||
|
||||
if (!$ok) {
|
||||
|
||||
// Merging the new value in the old vcard.
|
||||
$collectedNames[$fn]->add(clone $newProp);
|
||||
$ok = true;
|
||||
$stats['Merged values']++;
|
||||
|
||||
++$stats['Merged values'];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!$ok) {
|
||||
|
||||
// echo $newProp->serialize() . " does not appear in earlier vcard!\n";
|
||||
$stats['Error']++;
|
||||
if ($debug) fwrite($debug, "Missing '" . $newProp->name . "' property in duplicate. Earlier vcard:\n" . $collectedNames[$fn]->serialize() . "\n\nLater:\n" . $vcard->serialize() . "\n\n");
|
||||
++$stats['Error'];
|
||||
if ($debug) {
|
||||
fwrite($debug, "Missing '".$newProp->name."' property in duplicate. Earlier vcard:\n".$collectedNames[$fn]->serialize()."\n\nLater:\n".$vcard->serialize()."\n\n");
|
||||
}
|
||||
|
||||
$vcard->destroy();
|
||||
continue 2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$vcard->destroy();
|
||||
$stats['Ignored duplicates']++;
|
||||
|
||||
++$stats['Ignored duplicates'];
|
||||
}
|
||||
|
||||
foreach ($collectedNames as $vcard) {
|
||||
|
||||
// Overwriting any old PRODID
|
||||
$vcard->PRODID = '-//Sabre//Sabre VObject '.Version::VERSION.'//EN';
|
||||
write($vcard);
|
||||
writeStats();
|
||||
|
||||
}
|
||||
|
||||
echo str_repeat("\n", count($stats)), "\nDone.\n";
|
||||
|
6
vendor/sabre/vobject/bin/rrulebench.php
vendored
6
vendor/sabre/vobject/bin/rrulebench.php
vendored
@ -3,12 +3,12 @@
|
||||
include __DIR__.'/../vendor/autoload.php';
|
||||
|
||||
if ($argc < 4) {
|
||||
echo "sabre/vobject ", Sabre\VObject\Version::VERSION, " RRULE benchmark\n";
|
||||
echo 'sabre/vobject ', Sabre\VObject\Version::VERSION, " RRULE benchmark\n";
|
||||
echo "\n";
|
||||
echo "This script can be used to measure the speed of the 'recurrence expansion'\n";
|
||||
echo "system.";
|
||||
echo 'system.';
|
||||
echo "\n";
|
||||
echo "Usage: " . $argv[0] . " inputfile.ics startdate enddate\n";
|
||||
echo 'Usage: '.$argv[0]." inputfile.ics startdate enddate\n";
|
||||
die();
|
||||
}
|
||||
|
||||
|
4
vendor/sabre/vobject/composer.json
vendored
4
vendor/sabre/vobject/composer.json
vendored
@ -37,9 +37,7 @@
|
||||
"sabre/xml" : ">=1.5 <3.0"
|
||||
},
|
||||
"require-dev" : {
|
||||
"phpunit/phpunit" : "> 4.8.35, <6.0.0",
|
||||
"sabre/cs" : "^1.0.0"
|
||||
|
||||
"phpunit/phpunit" : "> 4.8.35, <6.0.0"
|
||||
},
|
||||
"suggest" : {
|
||||
"hoa/bench" : "If you would like to run the benchmark scripts"
|
||||
|
@ -11,8 +11,8 @@ use Sabre\VObject\Component\VCalendar;
|
||||
* @author Dominik Tobschall (http://tobschall.de/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class BirthdayCalendarGenerator {
|
||||
|
||||
class BirthdayCalendarGenerator
|
||||
{
|
||||
/**
|
||||
* Input objects.
|
||||
*
|
||||
@ -41,12 +41,11 @@ class BirthdayCalendarGenerator {
|
||||
*
|
||||
* @param mixed $objects
|
||||
*/
|
||||
function __construct($objects = null) {
|
||||
|
||||
public function __construct($objects = null)
|
||||
{
|
||||
if ($objects) {
|
||||
$this->setObjects($objects);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -56,52 +55,38 @@ class BirthdayCalendarGenerator {
|
||||
* It's also possible to supply an array of strings or objects.
|
||||
*
|
||||
* @param mixed $objects
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setObjects($objects) {
|
||||
|
||||
public function setObjects($objects)
|
||||
{
|
||||
if (!is_array($objects)) {
|
||||
$objects = [$objects];
|
||||
}
|
||||
|
||||
$this->objects = [];
|
||||
foreach ($objects as $object) {
|
||||
|
||||
if (is_string($object)) {
|
||||
|
||||
$vObj = Reader::read($object);
|
||||
if (!$vObj instanceof Component\VCard) {
|
||||
throw new \InvalidArgumentException('String could not be parsed as \\Sabre\\VObject\\Component\\VCard by setObjects');
|
||||
}
|
||||
|
||||
$this->objects[] = $vObj;
|
||||
|
||||
} elseif ($object instanceof Component\VCard) {
|
||||
|
||||
$this->objects[] = $object;
|
||||
|
||||
} else {
|
||||
|
||||
throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component\\VCard arguments to setObjects');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the output format for the SUMMARY
|
||||
* Sets the output format for the SUMMARY.
|
||||
*
|
||||
* @param string $format
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setFormat($format) {
|
||||
|
||||
public function setFormat($format)
|
||||
{
|
||||
$this->format = $format;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -109,12 +94,11 @@ class BirthdayCalendarGenerator {
|
||||
*
|
||||
* @return Component/VCalendar
|
||||
*/
|
||||
function getResult() {
|
||||
|
||||
public function getResult()
|
||||
{
|
||||
$calendar = new VCalendar();
|
||||
|
||||
foreach ($this->objects as $object) {
|
||||
|
||||
// Skip if there is no BDAY property.
|
||||
if (!$object->select('BDAY')) {
|
||||
continue;
|
||||
@ -181,11 +165,8 @@ class BirthdayCalendarGenerator {
|
||||
'X-SABRE-VCARD-FN' => $object->FN->getValue(),
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $calendar;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
205
vendor/sabre/vobject/lib/Cli.php
vendored
205
vendor/sabre/vobject/lib/Cli.php
vendored
@ -12,8 +12,8 @@ use
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Cli {
|
||||
|
||||
class Cli
|
||||
{
|
||||
/**
|
||||
* No output.
|
||||
*
|
||||
@ -96,8 +96,8 @@ class Cli {
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function main(array $argv) {
|
||||
|
||||
public function main(array $argv)
|
||||
{
|
||||
// @codeCoverageIgnoreStart
|
||||
// We cannot easily test this, so we'll skip it. Pretty basic anyway.
|
||||
|
||||
@ -113,31 +113,27 @@ class Cli {
|
||||
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
|
||||
try {
|
||||
|
||||
list($options, $positional) = $this->parseArguments($argv);
|
||||
|
||||
if (isset($options['q'])) {
|
||||
$this->quiet = true;
|
||||
}
|
||||
$this->log($this->colorize('green', "sabre/vobject ") . $this->colorize('yellow', Version::VERSION));
|
||||
$this->log($this->colorize('green', 'sabre/vobject ').$this->colorize('yellow', Version::VERSION));
|
||||
|
||||
foreach ($options as $name => $value) {
|
||||
|
||||
switch ($name) {
|
||||
|
||||
case 'q':
|
||||
// Already handled earlier.
|
||||
break;
|
||||
case 'h':
|
||||
case 'help':
|
||||
$this->showHelp();
|
||||
|
||||
return 0;
|
||||
break;
|
||||
case 'format':
|
||||
switch ($value) {
|
||||
|
||||
// jcard/jcal documents
|
||||
case 'jcard':
|
||||
case 'jcal':
|
||||
@ -160,7 +156,6 @@ class Cli {
|
||||
|
||||
default:
|
||||
throw new InvalidArgumentException('Unknown format: '.$value);
|
||||
|
||||
}
|
||||
break;
|
||||
case 'pretty':
|
||||
@ -194,22 +189,20 @@ class Cli {
|
||||
|
||||
default:
|
||||
throw new InvalidArgumentException('Unknown format: '.$value);
|
||||
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new InvalidArgumentException('Unknown option: '.$name);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (count($positional) === 0) {
|
||||
if (0 === count($positional)) {
|
||||
$this->showHelp();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (count($positional) === 1) {
|
||||
if (1 === count($positional)) {
|
||||
throw new InvalidArgumentException('Inputfile is a required argument');
|
||||
}
|
||||
|
||||
@ -220,10 +213,10 @@ class Cli {
|
||||
if (!in_array($positional[0], ['validate', 'repair', 'convert', 'color'])) {
|
||||
throw new InvalidArgumentException('Uknown command: '.$positional[0]);
|
||||
}
|
||||
|
||||
} catch (InvalidArgumentException $e) {
|
||||
$this->showHelp();
|
||||
$this->log('Error: '.$e->getMessage(), 'red');
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -232,69 +225,64 @@ class Cli {
|
||||
$this->inputPath = $positional[1];
|
||||
$this->outputPath = isset($positional[2]) ? $positional[2] : '-';
|
||||
|
||||
if ($this->outputPath !== '-') {
|
||||
if ('-' !== $this->outputPath) {
|
||||
$this->stdout = fopen($this->outputPath, 'w');
|
||||
}
|
||||
|
||||
if (!$this->inputFormat) {
|
||||
if (substr($this->inputPath, -5) === '.json') {
|
||||
if ('.json' === substr($this->inputPath, -5)) {
|
||||
$this->inputFormat = 'json';
|
||||
} else {
|
||||
$this->inputFormat = 'mimedir';
|
||||
}
|
||||
}
|
||||
if (!$this->format) {
|
||||
if (substr($this->outputPath, -5) === '.json') {
|
||||
if ('.json' === substr($this->outputPath, -5)) {
|
||||
$this->format = 'json';
|
||||
} else {
|
||||
$this->format = 'mimedir';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$realCode = 0;
|
||||
|
||||
try {
|
||||
|
||||
while ($input = $this->readInput()) {
|
||||
|
||||
$returnCode = $this->$command($input);
|
||||
if ($returnCode !== 0) $realCode = $returnCode;
|
||||
|
||||
if (0 !== $returnCode) {
|
||||
$realCode = $returnCode;
|
||||
}
|
||||
}
|
||||
|
||||
} catch (EofException $e) {
|
||||
// end of file
|
||||
} catch (\Exception $e) {
|
||||
$this->log('Error: '.$e->getMessage(), 'red');
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
return $realCode;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the help message.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function showHelp() {
|
||||
|
||||
protected function showHelp()
|
||||
{
|
||||
$this->log('Usage:', 'yellow');
|
||||
$this->log(" vobject [options] command [arguments]");
|
||||
$this->log(' vobject [options] command [arguments]');
|
||||
$this->log('');
|
||||
$this->log('Options:', 'yellow');
|
||||
$this->log($this->colorize('green', ' -q ')."Don't output anything.");
|
||||
$this->log($this->colorize('green', ' -help -h ') . "Display this help message.");
|
||||
$this->log($this->colorize('green', ' --format ') . "Convert to a specific format. Must be one of: vcard, vcard21,");
|
||||
$this->log($this->colorize('green', ' --forgiving ') . "Makes the parser less strict.");
|
||||
$this->log(" vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir.");
|
||||
$this->log($this->colorize('green', ' --inputformat ') . "If the input format cannot be guessed from the extension, it");
|
||||
$this->log(" must be specified here.");
|
||||
$this->log($this->colorize('green', ' -help -h ').'Display this help message.');
|
||||
$this->log($this->colorize('green', ' --format ').'Convert to a specific format. Must be one of: vcard, vcard21,');
|
||||
$this->log($this->colorize('green', ' --forgiving ').'Makes the parser less strict.');
|
||||
$this->log(' vcard30, vcard40, icalendar20, jcal, jcard, json, mimedir.');
|
||||
$this->log($this->colorize('green', ' --inputformat ').'If the input format cannot be guessed from the extension, it');
|
||||
$this->log(' must be specified here.');
|
||||
// Only PHP 5.4 and up
|
||||
if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
|
||||
$this->log($this->colorize('green', ' --pretty ') . "json pretty-print.");
|
||||
$this->log($this->colorize('green', ' --pretty ').'json pretty-print.');
|
||||
}
|
||||
$this->log('');
|
||||
$this->log('Commands:', 'yellow');
|
||||
@ -319,7 +307,6 @@ HELP
|
||||
$this->log(' vobject color calendar.ics');
|
||||
$this->log('');
|
||||
$this->log('https://github.com/fruux/sabre-vobject', 'purple');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -329,24 +316,23 @@ HELP
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function validate(Component $vObj) {
|
||||
|
||||
protected function validate(Component $vObj)
|
||||
{
|
||||
$returnCode = 0;
|
||||
|
||||
switch ($vObj->name) {
|
||||
case 'VCALENDAR':
|
||||
$this->log("iCalendar: " . (string)$vObj->VERSION);
|
||||
$this->log('iCalendar: '.(string) $vObj->VERSION);
|
||||
break;
|
||||
case 'VCARD':
|
||||
$this->log("vCard: " . (string)$vObj->VERSION);
|
||||
$this->log('vCard: '.(string) $vObj->VERSION);
|
||||
break;
|
||||
}
|
||||
|
||||
$warnings = $vObj->validate();
|
||||
if (!count($warnings)) {
|
||||
$this->log(" No warnings!");
|
||||
$this->log(' No warnings!');
|
||||
} else {
|
||||
|
||||
$levels = [
|
||||
1 => 'REPAIRED',
|
||||
2 => 'WARNING',
|
||||
@ -354,19 +340,15 @@ HELP
|
||||
];
|
||||
$returnCode = 2;
|
||||
foreach ($warnings as $warn) {
|
||||
|
||||
$extra = '';
|
||||
if ($warn['node'] instanceof Property) {
|
||||
$extra = ' (property: "'.$warn['node']->name.'")';
|
||||
}
|
||||
$this->log(" [" . $levels[$warn['level']] . '] ' . $warn['message'] . $extra);
|
||||
|
||||
$this->log(' ['.$levels[$warn['level']].'] '.$warn['message'].$extra);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $returnCode;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -376,24 +358,23 @@ HELP
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function repair(Component $vObj) {
|
||||
|
||||
protected function repair(Component $vObj)
|
||||
{
|
||||
$returnCode = 0;
|
||||
|
||||
switch ($vObj->name) {
|
||||
case 'VCALENDAR':
|
||||
$this->log("iCalendar: " . (string)$vObj->VERSION);
|
||||
$this->log('iCalendar: '.(string) $vObj->VERSION);
|
||||
break;
|
||||
case 'VCARD':
|
||||
$this->log("vCard: " . (string)$vObj->VERSION);
|
||||
$this->log('vCard: '.(string) $vObj->VERSION);
|
||||
break;
|
||||
}
|
||||
|
||||
$warnings = $vObj->validate(Node::REPAIR);
|
||||
if (!count($warnings)) {
|
||||
$this->log(" No warnings!");
|
||||
$this->log(' No warnings!');
|
||||
} else {
|
||||
|
||||
$levels = [
|
||||
1 => 'REPAIRED',
|
||||
2 => 'WARNING',
|
||||
@ -401,20 +382,16 @@ HELP
|
||||
];
|
||||
$returnCode = 2;
|
||||
foreach ($warnings as $warn) {
|
||||
|
||||
$extra = '';
|
||||
if ($warn['node'] instanceof Property) {
|
||||
$extra = ' (property: "'.$warn['node']->name.'")';
|
||||
}
|
||||
$this->log(" [" . $levels[$warn['level']] . '] ' . $warn['message'] . $extra);
|
||||
|
||||
$this->log(' ['.$levels[$warn['level']].'] '.$warn['message'].$extra);
|
||||
}
|
||||
|
||||
}
|
||||
fwrite($this->stdout, $vObj->serialize());
|
||||
|
||||
return $returnCode;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -424,8 +401,8 @@ HELP
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function convert($vObj) {
|
||||
|
||||
protected function convert($vObj)
|
||||
{
|
||||
$json = false;
|
||||
$convertVersion = null;
|
||||
$forceInput = null;
|
||||
@ -433,7 +410,7 @@ HELP
|
||||
switch ($this->format) {
|
||||
case 'json':
|
||||
$json = true;
|
||||
if ($vObj->name === 'VCARD') {
|
||||
if ('VCARD' === $vObj->name) {
|
||||
$convertVersion = Document::VCARD40;
|
||||
}
|
||||
break;
|
||||
@ -460,7 +437,6 @@ HELP
|
||||
case 'vcard40':
|
||||
$convertVersion = Document::VCARD40;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if ($forceInput && $vObj->name !== $forceInput) {
|
||||
@ -480,7 +456,6 @@ HELP
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -490,10 +465,9 @@ HELP
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function color($vObj) {
|
||||
|
||||
protected function color($vObj)
|
||||
{
|
||||
fwrite($this->stdout, $this->serializeComponent($vObj));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -503,8 +477,8 @@ HELP
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function colorize($color, $str, $resetTo = 'default') {
|
||||
|
||||
protected function colorize($color, $str, $resetTo = 'default')
|
||||
{
|
||||
$colors = [
|
||||
'cyan' => '1;36',
|
||||
'red' => '1;31',
|
||||
@ -514,8 +488,8 @@ HELP
|
||||
'default' => '0',
|
||||
'purple' => '0;35',
|
||||
];
|
||||
return "\033[" . $colors[$color] . 'm' . $str . "\033[" . $colors[$resetTo] . "m";
|
||||
|
||||
return "\033[".$colors[$color].'m'.$str."\033[".$colors[$resetTo].'m';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -523,17 +497,14 @@ HELP
|
||||
*
|
||||
* @param string $color
|
||||
* @param string $str
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function cWrite($color, $str) {
|
||||
|
||||
protected function cWrite($color, $str)
|
||||
{
|
||||
fwrite($this->stdout, $this->colorize($color, $str));
|
||||
|
||||
}
|
||||
|
||||
protected function serializeComponent(Component $vObj) {
|
||||
|
||||
protected function serializeComponent(Component $vObj)
|
||||
{
|
||||
$this->cWrite('cyan', 'BEGIN');
|
||||
$this->cWrite('red', ':');
|
||||
$this->cWrite('yellow', $vObj->name."\n");
|
||||
@ -554,33 +525,34 @@ HELP
|
||||
* @return int
|
||||
*/
|
||||
$sortScore = function ($key, $array) {
|
||||
|
||||
if ($array[$key] instanceof Component) {
|
||||
|
||||
// We want to encode VTIMEZONE first, this is a personal
|
||||
// preference.
|
||||
if ($array[$key]->name === 'VTIMEZONE') {
|
||||
if ('VTIMEZONE' === $array[$key]->name) {
|
||||
$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 ($array[$key]->name === 'VERSION') {
|
||||
if ('VERSION' === $array[$key]->name) {
|
||||
$score = 100000000;
|
||||
|
||||
return $score + $key;
|
||||
} else {
|
||||
// All other properties
|
||||
$score = 200000000;
|
||||
|
||||
return $score + $key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
$children = $vObj->children();
|
||||
@ -588,12 +560,10 @@ HELP
|
||||
uksort(
|
||||
$children,
|
||||
function ($a, $b) use ($sortScore, $tmp) {
|
||||
|
||||
$sA = $sortScore($a, $tmp);
|
||||
$sB = $sortScore($b, $tmp);
|
||||
|
||||
return $sA - $sB;
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
@ -608,18 +578,15 @@ HELP
|
||||
$this->cWrite('cyan', 'END');
|
||||
$this->cWrite('red', ':');
|
||||
$this->cWrite('yellow', $vObj->name."\n");
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Colorizes a property.
|
||||
*
|
||||
* @param Property $property
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function serializeProperty(Property $property) {
|
||||
|
||||
protected function serializeProperty(Property $property)
|
||||
{
|
||||
if ($property->group) {
|
||||
$this->cWrite('default', $property->group);
|
||||
$this->cWrite('red', '.');
|
||||
@ -628,19 +595,14 @@ HELP
|
||||
$this->cWrite('yellow', $property->name);
|
||||
|
||||
foreach ($property->parameters as $param) {
|
||||
|
||||
$this->cWrite('red', ';');
|
||||
$this->cWrite('blue', $param->serialize());
|
||||
|
||||
}
|
||||
$this->cWrite('red', ':');
|
||||
|
||||
if ($property instanceof Property\Binary) {
|
||||
|
||||
$this->cWrite('default', 'embedded binary stripped. ('.strlen($property->getValue()).' bytes)');
|
||||
|
||||
} else {
|
||||
|
||||
$parts = $property->getParts();
|
||||
$first1 = true;
|
||||
// Looping through property values
|
||||
@ -667,39 +629,36 @@ HELP
|
||||
';' => $this->colorize('purple', '\;', 'green'),
|
||||
',' => $this->colorize('purple', '\,', 'green'),
|
||||
"\n" => $this->colorize('purple', "\\n\n\t", 'green'),
|
||||
"\r" => "",
|
||||
"\r" => '',
|
||||
]
|
||||
);
|
||||
|
||||
$this->cWrite('green', $subPart);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
$this->cWrite("default", "\n");
|
||||
|
||||
$this->cWrite('default', "\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the list of arguments.
|
||||
*
|
||||
* @param array $argv
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function parseArguments(array $argv) {
|
||||
|
||||
protected function parseArguments(array $argv)
|
||||
{
|
||||
$positional = [];
|
||||
$options = [];
|
||||
|
||||
for ($ii = 0; $ii < count($argv); $ii++) {
|
||||
|
||||
for ($ii = 0; $ii < count($argv); ++$ii) {
|
||||
// Skipping the first argument.
|
||||
if ($ii === 0) continue;
|
||||
if (0 === $ii) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$v = $argv[$ii];
|
||||
|
||||
if (substr($v, 0, 2) === '--') {
|
||||
if ('--' === substr($v, 0, 2)) {
|
||||
// This is a long-form option.
|
||||
$optionName = substr($v, 2);
|
||||
$optionValue = true;
|
||||
@ -707,22 +666,17 @@ HELP
|
||||
list($optionName, $optionValue) = explode('=', $optionName);
|
||||
}
|
||||
$options[$optionName] = $optionValue;
|
||||
} elseif (substr($v, 0, 1) === '-' && strlen($v) > 1) {
|
||||
} elseif ('-' === substr($v, 0, 1) && strlen($v) > 1) {
|
||||
// This is a short-form option.
|
||||
foreach (str_split(substr($v, 1)) as $option) {
|
||||
$options[$option] = true;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$positional[] = $v;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return [$options, $positional];
|
||||
|
||||
}
|
||||
|
||||
protected $parser;
|
||||
@ -732,14 +686,14 @@ HELP
|
||||
*
|
||||
* @return Component
|
||||
*/
|
||||
protected function readInput() {
|
||||
|
||||
protected function readInput()
|
||||
{
|
||||
if (!$this->parser) {
|
||||
if ($this->inputPath !== '-') {
|
||||
if ('-' !== $this->inputPath) {
|
||||
$this->stdin = fopen($this->inputPath, 'r');
|
||||
}
|
||||
|
||||
if ($this->inputFormat === 'mimedir') {
|
||||
if ('mimedir' === $this->inputFormat) {
|
||||
$this->parser = new Parser\MimeDir($this->stdin, ($this->forgiving ? Reader::OPTION_FORGIVING : 0));
|
||||
} else {
|
||||
$this->parser = new Parser\Json($this->stdin, ($this->forgiving ? Reader::OPTION_FORGIVING : 0));
|
||||
@ -747,25 +701,20 @@ HELP
|
||||
}
|
||||
|
||||
return $this->parser->parse();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a message to STDERR.
|
||||
*
|
||||
* @param string $msg
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function log($msg, $color = 'default') {
|
||||
|
||||
protected function log($msg, $color = 'default')
|
||||
{
|
||||
if (!$this->quiet) {
|
||||
if ($color !== 'default') {
|
||||
if ('default' !== $color) {
|
||||
$msg = $this->colorize($color, $msg);
|
||||
}
|
||||
fwrite($this->stderr, $msg."\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
188
vendor/sabre/vobject/lib/Component.php
vendored
188
vendor/sabre/vobject/lib/Component.php
vendored
@ -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,14 +44,12 @@ 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 string $name such as VCALENDAR, VEVENT
|
||||
* @param array $children
|
||||
* @param bool $defaults
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __construct(Document $root, $name, array $children = [], $defaults = true) {
|
||||
|
||||
public function __construct(Document $root, $name, array $children = [], $defaults = true)
|
||||
{
|
||||
$this->name = strtoupper($name);
|
||||
$this->root = $root;
|
||||
|
||||
@ -84,13 +82,11 @@ class Component extends Node {
|
||||
// Component or Property
|
||||
$this->add($child);
|
||||
} else {
|
||||
|
||||
// Property key=>value
|
||||
$this->add($k, $child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -106,8 +102,8 @@ class Component extends Node {
|
||||
*
|
||||
* @return Node
|
||||
*/
|
||||
function add() {
|
||||
|
||||
public function add()
|
||||
{
|
||||
$arguments = func_get_args();
|
||||
|
||||
if ($arguments[0] instanceof Node) {
|
||||
@ -116,15 +112,10 @@ 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;
|
||||
@ -133,8 +124,8 @@ class Component extends Node {
|
||||
} else {
|
||||
$this->children[$name] = [$newNode];
|
||||
}
|
||||
return $newNode;
|
||||
|
||||
return $newNode;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -146,36 +137,34 @@ class Component extends Node {
|
||||
* exact item will be removed.
|
||||
*
|
||||
* @param string|Property|Component $item
|
||||
* @return void
|
||||
*/
|
||||
function remove($item) {
|
||||
|
||||
public 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 (strpos($item, '.') === false) {
|
||||
if (false === strpos($item, '.')) {
|
||||
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');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -184,14 +173,14 @@ class Component extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function children() {
|
||||
|
||||
public function children()
|
||||
{
|
||||
$result = [];
|
||||
foreach ($this->children as $childGroup) {
|
||||
$result = array_merge($result, $childGroup);
|
||||
}
|
||||
return $result;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -200,8 +189,8 @@ class Component extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getComponents() {
|
||||
|
||||
public function getComponents()
|
||||
{
|
||||
$result = [];
|
||||
|
||||
foreach ($this->children as $childGroup) {
|
||||
@ -211,8 +200,8 @@ class Component extends Node {
|
||||
}
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -226,19 +215,21 @@ class Component extends Node {
|
||||
* has not been assigned a group, specify ".EMAIL".
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function select($name) {
|
||||
|
||||
public function select($name)
|
||||
{
|
||||
$group = null;
|
||||
$name = strtoupper($name);
|
||||
if (strpos($name, '.') !== false) {
|
||||
if (false !== strpos($name, '.')) {
|
||||
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)) {
|
||||
@ -249,31 +240,24 @@ class Component extends Node {
|
||||
return array_filter(
|
||||
$result,
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -281,9 +265,9 @@ class Component extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function serialize() {
|
||||
|
||||
$str = "BEGIN:" . $this->name . "\r\n";
|
||||
public function serialize()
|
||||
{
|
||||
$str = 'BEGIN:'.$this->name."\r\n";
|
||||
|
||||
/**
|
||||
* Gives a component a 'score' for sorting purposes.
|
||||
@ -301,33 +285,34 @@ class Component extends Node {
|
||||
* @return int
|
||||
*/
|
||||
$sortScore = function ($key, $array) {
|
||||
|
||||
if ($array[$key] instanceof Component) {
|
||||
|
||||
// We want to encode VTIMEZONE first, this is a personal
|
||||
// preference.
|
||||
if ($array[$key]->name === 'VTIMEZONE') {
|
||||
if ('VTIMEZONE' === $array[$key]->name) {
|
||||
$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 ($array[$key]->name === 'VERSION') {
|
||||
if ('VERSION' === $array[$key]->name) {
|
||||
$score = 100000000;
|
||||
|
||||
return $score + $key;
|
||||
} else {
|
||||
// All other properties
|
||||
$score = 200000000;
|
||||
|
||||
return $score + $key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
$children = $this->children();
|
||||
@ -335,20 +320,19 @@ class Component extends Node {
|
||||
uksort(
|
||||
$children,
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -357,8 +341,8 @@ class Component extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function jsonSerialize() {
|
||||
|
||||
public function jsonSerialize()
|
||||
{
|
||||
$components = [];
|
||||
$properties = [];
|
||||
|
||||
@ -375,21 +359,18 @@ 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.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
function xmlSerialize(Xml\Writer $writer) {
|
||||
|
||||
public function xmlSerialize(Xml\Writer $writer)
|
||||
{
|
||||
$components = [];
|
||||
$properties = [];
|
||||
|
||||
@ -406,7 +387,6 @@ class Component extends Node {
|
||||
$writer->startElement(strtolower($this->name));
|
||||
|
||||
if (!empty($properties)) {
|
||||
|
||||
$writer->startElement('properties');
|
||||
|
||||
foreach ($properties as $property) {
|
||||
@ -414,11 +394,9 @@ class Component extends Node {
|
||||
}
|
||||
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
if (!empty($components)) {
|
||||
|
||||
$writer->startElement('components');
|
||||
|
||||
foreach ($components as $component) {
|
||||
@ -429,7 +407,6 @@ class Component extends Node {
|
||||
}
|
||||
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -437,10 +414,9 @@ class Component extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDefaults() {
|
||||
|
||||
protected function getDefaults()
|
||||
{
|
||||
return [];
|
||||
|
||||
}
|
||||
|
||||
/* Magic property accessors {{{ */
|
||||
@ -459,24 +435,22 @@ class Component extends Node {
|
||||
*
|
||||
* @return Property
|
||||
*/
|
||||
function __get($name) {
|
||||
|
||||
if ($name === 'children') {
|
||||
|
||||
public function __get($name)
|
||||
{
|
||||
if ('children' === $name) {
|
||||
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 (count($matches) === 0) {
|
||||
if (0 === count($matches)) {
|
||||
return;
|
||||
} else {
|
||||
$firstMatch = current($matches);
|
||||
/** @var $firstMatch Property */
|
||||
/* @var $firstMatch Property */
|
||||
$firstMatch->setIterator(new ElementList(array_values($matches)));
|
||||
|
||||
return $firstMatch;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -486,11 +460,11 @@ class Component extends Node {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function __isset($name) {
|
||||
|
||||
public function __isset($name)
|
||||
{
|
||||
$matches = $this->select($name);
|
||||
return count($matches) > 0;
|
||||
|
||||
return count($matches) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -504,11 +478,9 @@ class Component extends Node {
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __set($name, $value) {
|
||||
|
||||
public function __set($name, $value)
|
||||
{
|
||||
$name = strtoupper($name);
|
||||
$this->remove($name);
|
||||
if ($value instanceof self || $value instanceof Property) {
|
||||
@ -523,13 +495,10 @@ class Component extends Node {
|
||||
* specified name.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __unset($name) {
|
||||
|
||||
public function __unset($name)
|
||||
{
|
||||
$this->remove($name);
|
||||
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
@ -537,11 +506,9 @@ 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
|
||||
*/
|
||||
function __clone() {
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
foreach ($this->children as $childName => $childGroup) {
|
||||
foreach ($childGroup as $key => $child) {
|
||||
$clonedChild = clone $child;
|
||||
@ -550,7 +517,6 @@ class Component extends Node {
|
||||
$this->children[$childName][$key] = $clonedChild;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -574,10 +540,9 @@ class Component extends Node {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -604,8 +569,8 @@ class Component extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$rules = $this->getValidationRules();
|
||||
$defaults = $this->getDefaults();
|
||||
|
||||
@ -618,13 +583,12 @@ 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':
|
||||
if (isset($propertyCounters[$propName])) {
|
||||
@ -636,7 +600,7 @@ class Component extends Node {
|
||||
}
|
||||
break;
|
||||
case '1':
|
||||
if (!isset($propertyCounters[$propName]) || $propertyCounters[$propName] !== 1) {
|
||||
if (!isset($propertyCounters[$propName]) || 1 !== $propertyCounters[$propName]) {
|
||||
$repaired = false;
|
||||
if ($options & self::REPAIR && isset($defaults[$propName])) {
|
||||
$this->add($propName, $defaults[$propName]);
|
||||
@ -669,7 +633,7 @@ class Component extends Node {
|
||||
if ($options & self::REPAIR) {
|
||||
$properties = array_unique($this->select($propName), SORT_REGULAR);
|
||||
|
||||
if (count($properties) === 1) {
|
||||
if (1 === count($properties)) {
|
||||
$this->remove($propName);
|
||||
$this->add($properties[0]);
|
||||
|
||||
@ -684,12 +648,10 @@ class Component extends Node {
|
||||
];
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return $messages;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -697,11 +659,9 @@ class Component extends Node {
|
||||
*
|
||||
* It's intended to remove all circular references, so PHP can easily clean
|
||||
* it up.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function destroy() {
|
||||
|
||||
public function destroy()
|
||||
{
|
||||
parent::destroy();
|
||||
foreach ($this->children as $childGroup) {
|
||||
foreach ($childGroup as $child) {
|
||||
@ -709,7 +669,5 @@ class Component extends Node {
|
||||
}
|
||||
}
|
||||
$this->children = [];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
21
vendor/sabre/vobject/lib/Component/Available.php
vendored
21
vendor/sabre/vobject/lib/Component/Available.php
vendored
@ -14,8 +14,8 @@ use Sabre\VObject;
|
||||
* @author Ivan Enderlin
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Available extends VObject\Component {
|
||||
|
||||
class Available extends VObject\Component
|
||||
{
|
||||
/**
|
||||
* Returns the 'effective start' and 'effective end' of this VAVAILABILITY
|
||||
* component.
|
||||
@ -28,8 +28,8 @@ class Available extends VObject\Component {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getEffectiveStartEnd() {
|
||||
|
||||
public function getEffectiveStartEnd()
|
||||
{
|
||||
$effectiveStart = $this->DTSTART->getDateTime();
|
||||
if (isset($this->DTEND)) {
|
||||
$effectiveEnd = $this->DTEND->getDateTime();
|
||||
@ -38,7 +38,6 @@ class Available extends VObject\Component {
|
||||
}
|
||||
|
||||
return [$effectiveStart, $effectiveEnd];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -56,8 +55,8 @@ class Available extends VObject\Component {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'UID' => 1,
|
||||
'DTSTART' => 1,
|
||||
@ -81,7 +80,6 @@ class Available extends VObject\Component {
|
||||
|
||||
'AVAILABLE' => '*',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -108,19 +106,18 @@ class Available extends VObject\Component {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$result = parent::validate($options);
|
||||
|
||||
if (isset($this->DTEND) && isset($this->DURATION)) {
|
||||
$result[] = [
|
||||
'level' => 3,
|
||||
'message' => 'DTEND and DURATION cannot both be present',
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
}
|
||||
|
38
vendor/sabre/vobject/lib/Component/VAlarm.php
vendored
38
vendor/sabre/vobject/lib/Component/VAlarm.php
vendored
@ -16,8 +16,8 @@ use Sabre\VObject\InvalidDataException;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VAlarm extends VObject\Component {
|
||||
|
||||
class VAlarm extends VObject\Component
|
||||
{
|
||||
/**
|
||||
* Returns a DateTime object when this alarm is going to trigger.
|
||||
*
|
||||
@ -25,17 +25,16 @@ class VAlarm extends VObject\Component {
|
||||
*
|
||||
* @return DateTimeImmutable
|
||||
*/
|
||||
function getEffectiveTriggerTime() {
|
||||
|
||||
public function getEffectiveTriggerTime()
|
||||
{
|
||||
$trigger = $this->TRIGGER;
|
||||
if (!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') {
|
||||
if (!isset($trigger['VALUE']) || 'DURATION' === strtoupper($trigger['VALUE'])) {
|
||||
$triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER);
|
||||
$related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START';
|
||||
$related = (isset($trigger['RELATED']) && 'END' == strtoupper($trigger['RELATED'])) ? 'END' : 'START';
|
||||
|
||||
$parentComponent = $this->parent;
|
||||
if ($related === 'START') {
|
||||
|
||||
if ($parentComponent->name === 'VTODO') {
|
||||
if ('START' === $related) {
|
||||
if ('VTODO' === $parentComponent->name) {
|
||||
$propName = 'DUE';
|
||||
} else {
|
||||
$propName = 'DTSTART';
|
||||
@ -44,9 +43,9 @@ class VAlarm extends VObject\Component {
|
||||
$effectiveTrigger = $parentComponent->$propName->getDateTime();
|
||||
$effectiveTrigger = $effectiveTrigger->add($triggerDuration);
|
||||
} else {
|
||||
if ($parentComponent->name === 'VTODO') {
|
||||
if ('VTODO' === $parentComponent->name) {
|
||||
$endProp = 'DUE';
|
||||
} elseif ($parentComponent->name === 'VEVENT') {
|
||||
} elseif ('VEVENT' === $parentComponent->name) {
|
||||
$endProp = 'DTEND';
|
||||
} else {
|
||||
throw new InvalidDataException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT');
|
||||
@ -68,8 +67,8 @@ class VAlarm extends VObject\Component {
|
||||
} else {
|
||||
$effectiveTrigger = $trigger->getDateTime();
|
||||
}
|
||||
return $effectiveTrigger;
|
||||
|
||||
return $effectiveTrigger;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -84,8 +83,8 @@ class VAlarm extends VObject\Component {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) {
|
||||
|
||||
public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end)
|
||||
{
|
||||
$effectiveTrigger = $this->getEffectiveTriggerTime();
|
||||
|
||||
if (isset($this->DURATION)) {
|
||||
@ -98,16 +97,15 @@ class VAlarm extends VObject\Component {
|
||||
$period = new \DatePeriod($effectiveTrigger, $duration, (int) $repeat);
|
||||
|
||||
foreach ($period as $occurrence) {
|
||||
|
||||
if ($start <= $occurrence && $end > $occurrence) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
} else {
|
||||
return ($start <= $effectiveTrigger && $end > $effectiveTrigger);
|
||||
return $start <= $effectiveTrigger && $end > $effectiveTrigger;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -125,8 +123,8 @@ class VAlarm extends VObject\Component {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'ACTION' => 1,
|
||||
'TRIGGER' => 1,
|
||||
@ -136,7 +134,5 @@ class VAlarm extends VObject\Component {
|
||||
|
||||
'ATTACH' => '?',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,8 +15,8 @@ use Sabre\VObject;
|
||||
* @author Ivan Enderlin
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VAvailability extends VObject\Component {
|
||||
|
||||
class VAvailability extends VObject\Component
|
||||
{
|
||||
/**
|
||||
* Returns true or false depending on if the event falls in the specified
|
||||
* time-range. This is used for filtering purposes.
|
||||
@ -31,14 +31,14 @@ class VAvailability extends VObject\Component {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) {
|
||||
|
||||
public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end)
|
||||
{
|
||||
list($effectiveStart, $effectiveEnd) = $this->getEffectiveStartEnd();
|
||||
return (
|
||||
|
||||
return
|
||||
(is_null($effectiveStart) || $start < $effectiveEnd) &&
|
||||
(is_null($effectiveEnd) || $end > $effectiveStart)
|
||||
);
|
||||
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -53,8 +53,8 @@ class VAvailability extends VObject\Component {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getEffectiveStartEnd() {
|
||||
|
||||
public function getEffectiveStartEnd()
|
||||
{
|
||||
$effectiveStart = null;
|
||||
$effectiveEnd = null;
|
||||
|
||||
@ -68,10 +68,8 @@ class VAvailability extends VObject\Component {
|
||||
}
|
||||
|
||||
return [$effectiveStart, $effectiveEnd];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* A simple list of validation rules.
|
||||
*
|
||||
@ -87,8 +85,8 @@ class VAvailability extends VObject\Component {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'UID' => 1,
|
||||
'DTSTAMP' => 1,
|
||||
@ -111,7 +109,6 @@ class VAvailability extends VObject\Component {
|
||||
'COMMENT' => '*',
|
||||
'CONTACT' => '*',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -138,19 +135,18 @@ class VAvailability extends VObject\Component {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$result = parent::validate($options);
|
||||
|
||||
if (isset($this->DTEND) && isset($this->DURATION)) {
|
||||
$result[] = [
|
||||
'level' => 3,
|
||||
'message' => 'DTEND and DURATION cannot both be present',
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
}
|
||||
|
117
vendor/sabre/vobject/lib/Component/VCalendar.php
vendored
117
vendor/sabre/vobject/lib/Component/VCalendar.php
vendored
@ -20,8 +20,8 @@ use Sabre\VObject\Recur\NoInstancesException;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VCalendar extends VObject\Document {
|
||||
|
||||
class VCalendar extends VObject\Document
|
||||
{
|
||||
/**
|
||||
* The default name for this component.
|
||||
*
|
||||
@ -29,14 +29,14 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
static $defaultName = 'VCALENDAR';
|
||||
public static $defaultName = 'VCALENDAR';
|
||||
|
||||
/**
|
||||
* This is a list of components, and which classes they should map to.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $componentMap = [
|
||||
public static $componentMap = [
|
||||
'VCALENDAR' => 'Sabre\\VObject\\Component\\VCalendar',
|
||||
'VALARM' => 'Sabre\\VObject\\Component\\VAlarm',
|
||||
'VEVENT' => 'Sabre\\VObject\\Component\\VEvent',
|
||||
@ -53,7 +53,7 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $valueMap = [
|
||||
public static $valueMap = [
|
||||
'BINARY' => 'Sabre\\VObject\\Property\\Binary',
|
||||
'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean',
|
||||
'CAL-ADDRESS' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress',
|
||||
@ -76,7 +76,7 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $propertyMap = [
|
||||
public static $propertyMap = [
|
||||
// Calendar properties
|
||||
'CALSCALE' => 'Sabre\\VObject\\Property\\FlatText',
|
||||
'METHOD' => 'Sabre\\VObject\\Property\\FlatText',
|
||||
@ -150,7 +150,6 @@ class VCalendar extends VObject\Document {
|
||||
|
||||
// Additions from draft-daboo-calendar-availability-05
|
||||
'BUSYTYPE' => 'Sabre\\VObject\\Property\\Text',
|
||||
|
||||
];
|
||||
|
||||
/**
|
||||
@ -158,10 +157,9 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function getDocumentType() {
|
||||
|
||||
public function getDocumentType()
|
||||
{
|
||||
return self::ICALENDAR20;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -175,21 +173,20 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @return VObject\Component[]
|
||||
*/
|
||||
function getBaseComponents($componentName = null) {
|
||||
|
||||
public function getBaseComponents($componentName = null)
|
||||
{
|
||||
$isBaseComponent = function ($component) {
|
||||
|
||||
if (!$component instanceof VObject\Component) {
|
||||
return false;
|
||||
}
|
||||
if ($component->name === 'VTIMEZONE') {
|
||||
if ('VTIMEZONE' === $component->name) {
|
||||
return false;
|
||||
}
|
||||
if (isset($component->{'RECURRENCE-ID'})) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
if ($componentName) {
|
||||
@ -202,9 +199,7 @@ class VCalendar extends VObject\Document {
|
||||
|
||||
$components = [];
|
||||
foreach ($this->children as $childGroup) {
|
||||
|
||||
foreach ($childGroup as $child) {
|
||||
|
||||
if (!$child instanceof Component) {
|
||||
// If one child is not a component, they all are so we skip
|
||||
// the entire group.
|
||||
@ -213,12 +208,10 @@ class VCalendar extends VObject\Document {
|
||||
if ($isBaseComponent($child)) {
|
||||
$components[] = $child;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return $components;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -231,21 +224,20 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @return VObject\Component|null
|
||||
*/
|
||||
function getBaseComponent($componentName = null) {
|
||||
|
||||
public function getBaseComponent($componentName = null)
|
||||
{
|
||||
$isBaseComponent = function ($component) {
|
||||
|
||||
if (!$component instanceof VObject\Component) {
|
||||
return false;
|
||||
}
|
||||
if ($component->name === 'VTIMEZONE') {
|
||||
if ('VTIMEZONE' === $component->name) {
|
||||
return false;
|
||||
}
|
||||
if (isset($component->{'RECURRENCE-ID'})) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
if ($componentName) {
|
||||
@ -254,6 +246,7 @@ class VCalendar extends VObject\Document {
|
||||
return $child;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -264,10 +257,9 @@ class VCalendar extends VObject\Document {
|
||||
return $child;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -277,7 +269,7 @@ class VCalendar extends VObject\Document {
|
||||
* If this calendar object, has events with recurrence rules, this method
|
||||
* can be used to expand the event into multiple sub-events.
|
||||
*
|
||||
* Each event will be stripped from it's recurrence information, and only
|
||||
* Each event will be stripped from its recurrence information, and only
|
||||
* the instances of the event in the specified timerange will be left
|
||||
* alone.
|
||||
*
|
||||
@ -287,11 +279,12 @@ class VCalendar extends VObject\Document {
|
||||
* @param DateTimeInterface $start
|
||||
* @param DateTimeInterface $end
|
||||
* @param DateTimeZone $timeZone reference timezone for floating dates and
|
||||
* times.
|
||||
* times
|
||||
*
|
||||
* @return VCalendar
|
||||
*/
|
||||
function expand(DateTimeInterface $start, DateTimeInterface $end, DateTimeZone $timeZone = null) {
|
||||
|
||||
public function expand(DateTimeInterface $start, DateTimeInterface $end, DateTimeZone $timeZone = null)
|
||||
{
|
||||
$newChildren = [];
|
||||
$recurringEvents = [];
|
||||
|
||||
@ -300,10 +293,8 @@ class VCalendar extends VObject\Document {
|
||||
}
|
||||
|
||||
$stripTimezones = function (Component $component) use ($timeZone, &$stripTimezones) {
|
||||
|
||||
foreach ($component->children() as $componentChild) {
|
||||
if ($componentChild instanceof Property\ICalendar\DateTime && $componentChild->hasTime()) {
|
||||
|
||||
$dt = $componentChild->getDateTimes($timeZone);
|
||||
// We only need to update the first timezone, because
|
||||
// setDateTimes will match all other timezones to the
|
||||
@ -313,23 +304,20 @@ class VCalendar extends VObject\Document {
|
||||
} elseif ($componentChild instanceof Component) {
|
||||
$stripTimezones($componentChild);
|
||||
}
|
||||
|
||||
}
|
||||
return $component;
|
||||
|
||||
return $component;
|
||||
};
|
||||
|
||||
foreach ($this->children() as $child) {
|
||||
|
||||
if ($child instanceof Property && $child->name !== 'PRODID') {
|
||||
if ($child instanceof Property && 'PRODID' !== $child->name) {
|
||||
// We explictly want to ignore PRODID, because we want to
|
||||
// overwrite it with our own.
|
||||
$newChildren[] = clone $child;
|
||||
} elseif ($child instanceof Component && $child->name !== 'VTIMEZONE') {
|
||||
|
||||
} elseif ($child instanceof Component && 'VTIMEZONE' !== $child->name) {
|
||||
// We're also stripping all VTIMEZONE objects because we're
|
||||
// converting everything to UTC.
|
||||
if ($child->name === 'VEVENT' && (isset($child->{'RECURRENCE-ID'}) || isset($child->RRULE) || isset($child->RDATE))) {
|
||||
if ('VEVENT' === $child->name && (isset($child->{'RECURRENCE-ID'}) || isset($child->RRULE) || isset($child->RDATE))) {
|
||||
// Handle these a bit later.
|
||||
$uid = (string) $child->UID;
|
||||
if (!$uid) {
|
||||
@ -340,19 +328,15 @@ class VCalendar extends VObject\Document {
|
||||
} else {
|
||||
$recurringEvents[$uid] = [clone $child];
|
||||
}
|
||||
} elseif ($child->name === 'VEVENT' && $child->isInTimeRange($start, $end)) {
|
||||
} elseif ('VEVENT' === $child->name && $child->isInTimeRange($start, $end)) {
|
||||
$newChildren[] = $stripTimezones(clone $child);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
foreach ($recurringEvents as $events) {
|
||||
|
||||
try {
|
||||
$it = new EventIterator($events, $timeZone);
|
||||
|
||||
} catch (NoInstancesException $e) {
|
||||
// This event is recurring, but it doesn't have a single
|
||||
// instance. We are skipping this event from the output
|
||||
@ -362,20 +346,14 @@ class VCalendar extends VObject\Document {
|
||||
$it->fastForward($start);
|
||||
|
||||
while ($it->valid() && $it->getDTStart() < $end) {
|
||||
|
||||
if ($it->getDTEnd() > $start) {
|
||||
|
||||
$newChildren[] = $stripTimezones($it->getEventObject());
|
||||
|
||||
}
|
||||
$it->next();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return new self($newChildren);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -383,14 +361,13 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDefaults() {
|
||||
|
||||
protected function getDefaults()
|
||||
{
|
||||
return [
|
||||
'VERSION' => '2.0',
|
||||
'PRODID' => '-//Sabre//Sabre VObject '.VObject\Version::VERSION.'//EN',
|
||||
'CALSCALE' => 'GREGORIAN',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -408,8 +385,8 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'PRODID' => 1,
|
||||
'VERSION' => 1,
|
||||
@ -417,7 +394,6 @@ class VCalendar extends VObject\Document {
|
||||
'CALSCALE' => '?',
|
||||
'METHOD' => '?',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -444,19 +420,18 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$warnings = parent::validate($options);
|
||||
|
||||
if ($ver = $this->VERSION) {
|
||||
if ((string)$ver !== '2.0') {
|
||||
if ('2.0' !== (string) $ver) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.',
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$uidList = [];
|
||||
@ -465,7 +440,7 @@ class VCalendar extends VObject\Document {
|
||||
|
||||
foreach ($this->children() as $child) {
|
||||
if ($child instanceof Component) {
|
||||
$componentsFound++;
|
||||
++$componentsFound;
|
||||
|
||||
if (!in_array($child->name, ['VEVENT', 'VTODO', 'VJOURNAL'])) {
|
||||
continue;
|
||||
@ -475,7 +450,7 @@ class VCalendar extends VObject\Document {
|
||||
$uid = (string) $child->UID;
|
||||
$isMaster = isset($child->{'RECURRENCE-ID'}) ? 0 : 1;
|
||||
if (isset($uidList[$uid])) {
|
||||
$uidList[$uid]['count']++;
|
||||
++$uidList[$uid]['count'];
|
||||
if ($isMaster && $uidList[$uid]['hasMaster']) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
@ -490,11 +465,10 @@ class VCalendar extends VObject\Document {
|
||||
'hasMaster' => $isMaster,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if ($componentsFound === 0) {
|
||||
if (0 === $componentsFound) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'message' => 'An iCalendar object must have at least 1 component.',
|
||||
@ -510,7 +484,7 @@ class VCalendar extends VObject\Document {
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
if (count($componentTypes) === 0) {
|
||||
if (0 === count($componentTypes)) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'message' => 'A calendar object on a CalDAV server must have at least 1 component (VTODO, VEVENT, VJOURNAL).',
|
||||
@ -535,7 +509,6 @@ class VCalendar extends VObject\Document {
|
||||
}
|
||||
|
||||
return $warnings;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -543,19 +516,15 @@ class VCalendar extends VObject\Document {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getByUID($uid) {
|
||||
|
||||
public function getByUID($uid)
|
||||
{
|
||||
return array_filter($this->getComponents(), function ($item) use ($uid) {
|
||||
|
||||
if (!$itemUid = $item->select('UID')) {
|
||||
return false;
|
||||
}
|
||||
$itemUid = current($itemUid)->getValue();
|
||||
|
||||
return $uid === $itemUid;
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
100
vendor/sabre/vobject/lib/Component/VCard.php
vendored
100
vendor/sabre/vobject/lib/Component/VCard.php
vendored
@ -15,8 +15,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VCard extends VObject\Document {
|
||||
|
||||
class VCard extends VObject\Document
|
||||
{
|
||||
/**
|
||||
* The default name for this component.
|
||||
*
|
||||
@ -24,7 +24,7 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
static $defaultName = 'VCARD';
|
||||
public static $defaultName = 'VCARD';
|
||||
|
||||
/**
|
||||
* Caching the version number.
|
||||
@ -38,7 +38,7 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $componentMap = [
|
||||
public static $componentMap = [
|
||||
'VCARD' => 'Sabre\\VObject\\Component\\VCard',
|
||||
];
|
||||
|
||||
@ -47,7 +47,7 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $valueMap = [
|
||||
public static $valueMap = [
|
||||
'BINARY' => 'Sabre\\VObject\\Property\\Binary',
|
||||
'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean',
|
||||
'CONTENT-ID' => 'Sabre\\VObject\\Property\\FlatText', // vCard 2.1 only
|
||||
@ -71,8 +71,7 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $propertyMap = [
|
||||
|
||||
public static $propertyMap = [
|
||||
// vCard 2.1 properties and up
|
||||
'N' => 'Sabre\\VObject\\Property\\Text',
|
||||
'FN' => 'Sabre\\VObject\\Property\\FlatText',
|
||||
@ -136,7 +135,6 @@ class VCard extends VObject\Document {
|
||||
'HOBBY' => 'Sabre\\VObject\\Property\\FlatText',
|
||||
'INTEREST' => 'Sabre\\VObject\\Property\\FlatText',
|
||||
'ORG-DIRECTORY' => 'Sabre\\VObject\\Property\\FlatText',
|
||||
|
||||
];
|
||||
|
||||
/**
|
||||
@ -144,10 +142,9 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function getDocumentType() {
|
||||
|
||||
public function getDocumentType()
|
||||
{
|
||||
if (!$this->version) {
|
||||
|
||||
$version = (string) $this->VERSION;
|
||||
|
||||
switch ($version) {
|
||||
@ -168,7 +165,6 @@ class VCard extends VObject\Document {
|
||||
}
|
||||
|
||||
return $this->version;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -185,11 +181,11 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @return VCard
|
||||
*/
|
||||
function convert($target) {
|
||||
|
||||
public function convert($target)
|
||||
{
|
||||
$converter = new VObject\VCardConverter();
|
||||
return $converter->convert($this, $target);
|
||||
|
||||
return $converter->convert($this, $target);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -221,8 +217,8 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$warnings = [];
|
||||
|
||||
$versionMap = [
|
||||
@ -232,9 +228,9 @@ class VCard extends VObject\Document {
|
||||
];
|
||||
|
||||
$version = $this->select('VERSION');
|
||||
if (count($version) === 1) {
|
||||
if (1 === count($version)) {
|
||||
$version = (string) $this->VERSION;
|
||||
if ($version !== '2.1' && $version !== '3.0' && $version !== '4.0') {
|
||||
if ('2.1' !== $version && '3.0' !== $version && '4.0' !== $version) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.',
|
||||
@ -244,17 +240,16 @@ class VCard extends VObject\Document {
|
||||
$this->VERSION = $versionMap[self::DEFAULT_VERSION];
|
||||
}
|
||||
}
|
||||
if ($version === '2.1' && ($options & self::PROFILE_CARDDAV)) {
|
||||
if ('2.1' === $version && ($options & self::PROFILE_CARDDAV)) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'message' => 'CardDAV servers are not allowed to accept vCard 2.1.',
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
$uid = $this->select('UID');
|
||||
if (count($uid) === 0) {
|
||||
if (0 === count($uid)) {
|
||||
if ($options & self::PROFILE_CARDDAV) {
|
||||
// Required for CardDAV
|
||||
$warningLevel = 3;
|
||||
@ -276,10 +271,9 @@ class VCard extends VObject\Document {
|
||||
}
|
||||
|
||||
$fn = $this->select('FN');
|
||||
if (count($fn) !== 1) {
|
||||
|
||||
if (1 !== count($fn)) {
|
||||
$repaired = false;
|
||||
if (($options & self::REPAIR) && count($fn) === 0) {
|
||||
if (($options & self::REPAIR) && 0 === count($fn)) {
|
||||
// We're going to try to see if we can use the contents of the
|
||||
// N property.
|
||||
if (isset($this->N)) {
|
||||
@ -301,7 +295,6 @@ class VCard extends VObject\Document {
|
||||
$this->FN = (string) $this->EMAIL;
|
||||
$repaired = true;
|
||||
}
|
||||
|
||||
}
|
||||
$warnings[] = [
|
||||
'level' => $repaired ? 1 : 3,
|
||||
@ -314,7 +307,6 @@ class VCard extends VObject\Document {
|
||||
parent::validate($options),
|
||||
$warnings
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -332,8 +324,8 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'ADR' => '*',
|
||||
'ANNIVERSARY' => '?',
|
||||
@ -375,7 +367,6 @@ class VCard extends VObject\Document {
|
||||
// 'FN' => '+',
|
||||
'UID' => '?',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -392,12 +383,11 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @return VObject\Property|null
|
||||
*/
|
||||
function preferred($propertyName) {
|
||||
|
||||
public function preferred($propertyName)
|
||||
{
|
||||
$preferred = null;
|
||||
$lastPref = 101;
|
||||
foreach ($this->select($propertyName) as $field) {
|
||||
|
||||
$pref = 101;
|
||||
if (isset($field['TYPE']) && $field['TYPE']->has('PREF')) {
|
||||
$pref = 1;
|
||||
@ -409,10 +399,9 @@ class VCard extends VObject\Document {
|
||||
$preferred = $field;
|
||||
$lastPref = $pref;
|
||||
}
|
||||
|
||||
}
|
||||
return $preferred;
|
||||
|
||||
return $preferred;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -426,7 +415,8 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @return VObject\Property|null
|
||||
*/
|
||||
function getByType($propertyName, $type) {
|
||||
public function getByType($propertyName, $type)
|
||||
{
|
||||
foreach ($this->select($propertyName) as $field) {
|
||||
if (isset($field['TYPE']) && $field['TYPE']->has($type)) {
|
||||
return $field;
|
||||
@ -439,14 +429,13 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDefaults() {
|
||||
|
||||
protected function getDefaults()
|
||||
{
|
||||
return [
|
||||
'VERSION' => '4.0',
|
||||
'PRODID' => '-//Sabre//Sabre VObject '.VObject\Version::VERSION.'//EN',
|
||||
'UID' => 'sabre-vobject-'.VObject\UUIDUtil::getUUID(),
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -455,8 +444,8 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function jsonSerialize() {
|
||||
|
||||
public function jsonSerialize()
|
||||
{
|
||||
// A vcard does not have sub-components, so we're overriding this
|
||||
// method to remove that array element.
|
||||
$properties = [];
|
||||
@ -469,23 +458,19 @@ class VCard extends VObject\Document {
|
||||
strtolower($this->name),
|
||||
$properties,
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes the data into XML. This is used to create xCard or
|
||||
* xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
function xmlSerialize(Xml\Writer $writer) {
|
||||
|
||||
public function xmlSerialize(Xml\Writer $writer)
|
||||
{
|
||||
$propertiesByGroup = [];
|
||||
|
||||
foreach ($this->children() as $property) {
|
||||
|
||||
$group = $property->group;
|
||||
|
||||
if (!isset($propertiesByGroup[$group])) {
|
||||
@ -493,25 +478,20 @@ class VCard extends VObject\Document {
|
||||
}
|
||||
|
||||
$propertiesByGroup[$group][] = $property;
|
||||
|
||||
}
|
||||
|
||||
$writer->startElement(strtolower($this->name));
|
||||
|
||||
foreach ($propertiesByGroup as $group => $properties) {
|
||||
|
||||
if (!empty($group)) {
|
||||
|
||||
$writer->startElement('group');
|
||||
$writer->writeAttribute('name', strtolower($group));
|
||||
|
||||
}
|
||||
|
||||
foreach ($properties as $property) {
|
||||
switch ($property->name) {
|
||||
|
||||
case 'VERSION':
|
||||
continue;
|
||||
break;
|
||||
|
||||
case 'XML':
|
||||
$value = $property->getParts();
|
||||
@ -522,18 +502,15 @@ class VCard extends VObject\Document {
|
||||
default:
|
||||
$property->xmlSerialize($writer);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($group)) {
|
||||
$writer->endElement();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -543,16 +520,15 @@ class VCard extends VObject\Document {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getClassNameForPropertyName($propertyName) {
|
||||
|
||||
public function getClassNameForPropertyName($propertyName)
|
||||
{
|
||||
$className = parent::getClassNameForPropertyName($propertyName);
|
||||
|
||||
// In vCard 4, BINARY no longer exists, and we need URI instead.
|
||||
if ($className == 'Sabre\\VObject\\Property\\Binary' && $this->getDocumentType() === self::VCARD40) {
|
||||
if ('Sabre\\VObject\\Property\\Binary' == $className && self::VCARD40 === $this->getDocumentType()) {
|
||||
return 'Sabre\\VObject\\Property\\Uri';
|
||||
}
|
||||
|
||||
return $className;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
38
vendor/sabre/vobject/lib/Component/VEvent.php
vendored
38
vendor/sabre/vobject/lib/Component/VEvent.php
vendored
@ -16,8 +16,8 @@ use Sabre\VObject\Recur\NoInstancesException;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VEvent extends VObject\Component {
|
||||
|
||||
class VEvent extends VObject\Component
|
||||
{
|
||||
/**
|
||||
* Returns true or false depending on if the event falls in the specified
|
||||
* time-range. This is used for filtering purposes.
|
||||
@ -30,20 +30,15 @@ class VEvent extends VObject\Component {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) {
|
||||
|
||||
public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end)
|
||||
{
|
||||
if ($this->RRULE) {
|
||||
|
||||
try {
|
||||
|
||||
$it = new EventIterator($this, null, $start->getTimezone());
|
||||
|
||||
} catch (NoInstancesException $e) {
|
||||
|
||||
// If we've catched this exception, there are no instances
|
||||
// for the event that fall into the specified time-range.
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
$it->fastForward($start);
|
||||
@ -54,13 +49,11 @@ class VEvent extends VObject\Component {
|
||||
//
|
||||
// If the starttime of the recurrence did not exceed the
|
||||
// end of the time range as well, we have a match.
|
||||
return ($it->getDTStart() < $end && $it->getDTEnd() > $start);
|
||||
|
||||
return $it->getDTStart() < $end && $it->getDTEnd() > $start;
|
||||
}
|
||||
|
||||
$effectiveStart = $this->DTSTART->getDateTime($start->getTimezone());
|
||||
if (isset($this->DTEND)) {
|
||||
|
||||
// The DTEND property is considered non inclusive. So for a 3 day
|
||||
// event in july, dtstart and dtend would have to be July 1st and
|
||||
// July 4th respectively.
|
||||
@ -68,7 +61,6 @@ class VEvent extends VObject\Component {
|
||||
// See:
|
||||
// http://tools.ietf.org/html/rfc5545#page-54
|
||||
$effectiveEnd = $this->DTEND->getDateTime($end->getTimezone());
|
||||
|
||||
} elseif (isset($this->DURATION)) {
|
||||
$effectiveEnd = $effectiveStart->add(VObject\DateTimeParser::parseDuration($this->DURATION));
|
||||
} elseif (!$this->DTSTART->hasTime()) {
|
||||
@ -76,10 +68,10 @@ class VEvent extends VObject\Component {
|
||||
} else {
|
||||
$effectiveEnd = $effectiveStart;
|
||||
}
|
||||
return (
|
||||
($start < $effectiveEnd) && ($end > $effectiveStart)
|
||||
);
|
||||
|
||||
return
|
||||
($start < $effectiveEnd) && ($end > $effectiveStart)
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -87,13 +79,12 @@ class VEvent extends VObject\Component {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDefaults() {
|
||||
|
||||
protected function getDefaults()
|
||||
{
|
||||
return [
|
||||
'UID' => 'sabre-vobject-'.VObject\UUIDUtil::getUUID(),
|
||||
'DTSTAMP' => date('Ymd\\THis\\Z'),
|
||||
'DTSTAMP' => gmdate('Ymd\\THis\\Z'),
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -111,9 +102,10 @@ class VEvent extends VObject\Component {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
$hasMethod = isset($this->parent->METHOD);
|
||||
|
||||
return [
|
||||
'UID' => 1,
|
||||
'DTSTAMP' => 1,
|
||||
@ -147,7 +139,5 @@ class VEvent extends VObject\Component {
|
||||
'RESOURCES' => '*',
|
||||
'RDATE' => '*',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
20
vendor/sabre/vobject/lib/Component/VFreeBusy.php
vendored
20
vendor/sabre/vobject/lib/Component/VFreeBusy.php
vendored
@ -15,8 +15,8 @@ use Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VFreeBusy extends VObject\Component {
|
||||
|
||||
class VFreeBusy extends VObject\Component
|
||||
{
|
||||
/**
|
||||
* Checks based on the contained FREEBUSY information, if a timeslot is
|
||||
* available.
|
||||
@ -26,13 +26,12 @@ class VFreeBusy extends VObject\Component {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isFree(DateTimeInterface $start, DatetimeInterface $end) {
|
||||
|
||||
public function isFree(DateTimeInterface $start, DatetimeInterface $end)
|
||||
{
|
||||
foreach ($this->select('FREEBUSY') as $freebusy) {
|
||||
|
||||
// We are only interested in FBTYPE=BUSY (the default),
|
||||
// FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE.
|
||||
if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'], 0, 4)) !== 'BUSY') {
|
||||
if (isset($freebusy['FBTYPE']) && 'BUSY' !== strtoupper(substr((string) $freebusy['FBTYPE'], 0, 4))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -55,13 +54,10 @@ class VFreeBusy extends VObject\Component {
|
||||
if ($start < $busyEnd && $end > $busyStart) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -79,8 +75,8 @@ class VFreeBusy extends VObject\Component {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'UID' => 1,
|
||||
'DTSTAMP' => 1,
|
||||
@ -96,7 +92,5 @@ class VFreeBusy extends VObject\Component {
|
||||
'FREEBUSY' => '*',
|
||||
'REQUEST-STATUS' => '*',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
25
vendor/sabre/vobject/lib/Component/VJournal.php
vendored
25
vendor/sabre/vobject/lib/Component/VJournal.php
vendored
@ -14,8 +14,8 @@ use Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VJournal extends VObject\Component {
|
||||
|
||||
class VJournal extends VObject\Component
|
||||
{
|
||||
/**
|
||||
* Returns true or false depending on if the event falls in the specified
|
||||
* time-range. This is used for filtering purposes.
|
||||
@ -28,8 +28,8 @@ class VJournal extends VObject\Component {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) {
|
||||
|
||||
public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end)
|
||||
{
|
||||
$dtstart = isset($this->DTSTART) ? $this->DTSTART->getDateTime() : null;
|
||||
if ($dtstart) {
|
||||
$effectiveEnd = $dtstart;
|
||||
@ -37,11 +37,10 @@ class VJournal extends VObject\Component {
|
||||
$effectiveEnd = $effectiveEnd->modify('+1 day');
|
||||
}
|
||||
|
||||
return ($start <= $effectiveEnd && $end > $dtstart);
|
||||
|
||||
return $start <= $effectiveEnd && $end > $dtstart;
|
||||
}
|
||||
return false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -59,8 +58,8 @@ class VJournal extends VObject\Component {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'UID' => 1,
|
||||
'DTSTAMP' => 1,
|
||||
@ -88,7 +87,6 @@ class VJournal extends VObject\Component {
|
||||
'RELATED-TO' => '*',
|
||||
'RDATE' => '*',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -96,12 +94,11 @@ class VJournal extends VObject\Component {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDefaults() {
|
||||
|
||||
protected function getDefaults()
|
||||
{
|
||||
return [
|
||||
'UID' => 'sabre-vobject-'.VObject\UUIDUtil::getUUID(),
|
||||
'DTSTAMP' => date('Ymd\\THis\\Z'),
|
||||
'DTSTAMP' => gmdate('Ymd\\THis\\Z'),
|
||||
];
|
||||
|
||||
}
|
||||
}
|
||||
|
15
vendor/sabre/vobject/lib/Component/VTimeZone.php
vendored
15
vendor/sabre/vobject/lib/Component/VTimeZone.php
vendored
@ -14,8 +14,8 @@ use Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VTimeZone extends VObject\Component {
|
||||
|
||||
class VTimeZone extends VObject\Component
|
||||
{
|
||||
/**
|
||||
* Returns the PHP DateTimeZone for this VTIMEZONE component.
|
||||
*
|
||||
@ -24,10 +24,9 @@ class VTimeZone extends VObject\Component {
|
||||
*
|
||||
* @return \DateTimeZone
|
||||
*/
|
||||
function getTimeZone() {
|
||||
|
||||
public function getTimeZone()
|
||||
{
|
||||
return VObject\TimeZoneUtil::getTimeZone((string) $this->TZID, $this->root);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -45,8 +44,8 @@ class VTimeZone extends VObject\Component {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'TZID' => 1,
|
||||
|
||||
@ -60,7 +59,5 @@ class VTimeZone extends VObject\Component {
|
||||
'STANDARD' => '*',
|
||||
'DAYLIGHT' => '*',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
39
vendor/sabre/vobject/lib/Component/VTodo.php
vendored
39
vendor/sabre/vobject/lib/Component/VTodo.php
vendored
@ -14,8 +14,8 @@ use Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VTodo extends VObject\Component {
|
||||
|
||||
class VTodo extends VObject\Component
|
||||
{
|
||||
/**
|
||||
* Returns true or false depending on if the event falls in the specified
|
||||
* time-range. This is used for filtering purposes.
|
||||
@ -28,8 +28,8 @@ class VTodo extends VObject\Component {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end) {
|
||||
|
||||
public function isInTimeRange(DateTimeInterface $start, DateTimeInterface $end)
|
||||
{
|
||||
$dtstart = isset($this->DTSTART) ? $this->DTSTART->getDateTime() : null;
|
||||
$duration = isset($this->DURATION) ? VObject\DateTimeParser::parseDuration($this->DURATION) : null;
|
||||
$due = isset($this->DUE) ? $this->DUE->getDateTime() : null;
|
||||
@ -39,6 +39,7 @@ class VTodo extends VObject\Component {
|
||||
if ($dtstart) {
|
||||
if ($duration) {
|
||||
$effectiveEnd = $dtstart->add($duration);
|
||||
|
||||
return $start <= $effectiveEnd && $end > $dtstart;
|
||||
} elseif ($due) {
|
||||
return
|
||||
@ -49,7 +50,7 @@ class VTodo extends VObject\Component {
|
||||
}
|
||||
}
|
||||
if ($due) {
|
||||
return ($start < $due && $end >= $due);
|
||||
return $start < $due && $end >= $due;
|
||||
}
|
||||
if ($completed && $created) {
|
||||
return
|
||||
@ -57,13 +58,13 @@ class VTodo extends VObject\Component {
|
||||
($end >= $created || $end >= $completed);
|
||||
}
|
||||
if ($completed) {
|
||||
return ($start <= $completed && $end >= $completed);
|
||||
return $start <= $completed && $end >= $completed;
|
||||
}
|
||||
if ($created) {
|
||||
return ($end > $created);
|
||||
return $end > $created;
|
||||
}
|
||||
return true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -81,8 +82,8 @@ class VTodo extends VObject\Component {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
function getValidationRules() {
|
||||
|
||||
public function getValidationRules()
|
||||
{
|
||||
return [
|
||||
'UID' => 1,
|
||||
'DTSTAMP' => 1,
|
||||
@ -119,7 +120,6 @@ class VTodo extends VObject\Component {
|
||||
'RESOURCES' => '*',
|
||||
'RDATE' => '*',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -144,36 +144,29 @@ class VTodo extends VObject\Component {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$result = parent::validate($options);
|
||||
if (isset($this->DUE) && isset($this->DTSTART)) {
|
||||
|
||||
$due = $this->DUE;
|
||||
$dtStart = $this->DTSTART;
|
||||
|
||||
if ($due->getValueType() !== $dtStart->getValueType()) {
|
||||
|
||||
$result[] = [
|
||||
'level' => 3,
|
||||
'message' => 'The value type (DATE or DATE-TIME) must be identical for DUE and DTSTART',
|
||||
'node' => $due,
|
||||
];
|
||||
|
||||
} elseif ($due->getDateTime() < $dtStart->getDateTime()) {
|
||||
|
||||
$result[] = [
|
||||
'level' => 3,
|
||||
'message' => 'DUE must occur after DTSTART',
|
||||
'node' => $due,
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -181,13 +174,11 @@ class VTodo extends VObject\Component {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDefaults() {
|
||||
|
||||
protected function getDefaults()
|
||||
{
|
||||
return [
|
||||
'UID' => 'sabre-vobject-'.VObject\UUIDUtil::getUUID(),
|
||||
'DTSTAMP' => date('Ymd\\THis\\Z'),
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
78
vendor/sabre/vobject/lib/DateTimeParser.php
vendored
78
vendor/sabre/vobject/lib/DateTimeParser.php
vendored
@ -16,8 +16,8 @@ use DateTimeZone;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class DateTimeParser {
|
||||
|
||||
class DateTimeParser
|
||||
{
|
||||
/**
|
||||
* Parses an iCalendar (rfc5545) formatted datetime and returns a
|
||||
* DateTimeImmutable object.
|
||||
@ -31,8 +31,8 @@ class DateTimeParser {
|
||||
*
|
||||
* @return DateTimeImmutable
|
||||
*/
|
||||
static function parseDateTime($dt, DateTimeZone $tz = null) {
|
||||
|
||||
public static function parseDateTime($dt, DateTimeZone $tz = null)
|
||||
{
|
||||
// Format is YYYYMMDD + "T" + hhmmss
|
||||
$result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/', $dt, $matches);
|
||||
|
||||
@ -40,7 +40,7 @@ class DateTimeParser {
|
||||
throw new InvalidDataException('The supplied iCalendar datetime value is incorrect: '.$dt);
|
||||
}
|
||||
|
||||
if ($matches[7] === 'Z' || is_null($tz)) {
|
||||
if ('Z' === $matches[7] || is_null($tz)) {
|
||||
$tz = new DateTimeZone('UTC');
|
||||
}
|
||||
|
||||
@ -51,7 +51,6 @@ class DateTimeParser {
|
||||
}
|
||||
|
||||
return $date;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -62,8 +61,8 @@ class DateTimeParser {
|
||||
*
|
||||
* @return DateTimeImmutable
|
||||
*/
|
||||
static function parseDate($date, DateTimeZone $tz = null) {
|
||||
|
||||
public static function parseDate($date, DateTimeZone $tz = null)
|
||||
{
|
||||
// Format is YYYYMMDD
|
||||
$result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])$/', $date, $matches);
|
||||
|
||||
@ -82,7 +81,6 @@ class DateTimeParser {
|
||||
}
|
||||
|
||||
return $date;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -96,18 +94,17 @@ class DateTimeParser {
|
||||
*
|
||||
* @return DateInterval|string
|
||||
*/
|
||||
static function parseDuration($duration, $asString = false) {
|
||||
|
||||
public static function parseDuration($duration, $asString = false)
|
||||
{
|
||||
$result = preg_match('/^(?<plusminus>\+|-)?P((?<week>\d+)W)?((?<day>\d+)D)?(T((?<hour>\d+)H)?((?<minute>\d+)M)?((?<second>\d+)S)?)?$/', $duration, $matches);
|
||||
if (!$result) {
|
||||
throw new InvalidDataException('The supplied iCalendar duration value is incorrect: '.$duration);
|
||||
}
|
||||
|
||||
if (!$asString) {
|
||||
|
||||
$invert = false;
|
||||
|
||||
if ($matches['plusminus'] === '-') {
|
||||
if ('-' === $matches['plusminus']) {
|
||||
$invert = true;
|
||||
}
|
||||
|
||||
@ -137,7 +134,6 @@ class DateTimeParser {
|
||||
}
|
||||
|
||||
if ($matches['minute'] || $matches['second'] || $matches['hour']) {
|
||||
|
||||
$duration .= 'T';
|
||||
|
||||
if ($matches['hour']) {
|
||||
@ -151,10 +147,9 @@ class DateTimeParser {
|
||||
if ($matches['second']) {
|
||||
$duration .= $matches['second'].'S';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($duration === 'P') {
|
||||
if ('P' === $duration) {
|
||||
$duration = 'PT0S';
|
||||
}
|
||||
|
||||
@ -165,7 +160,6 @@ class DateTimeParser {
|
||||
}
|
||||
|
||||
return $iv;
|
||||
|
||||
}
|
||||
|
||||
$parts = [
|
||||
@ -184,14 +178,13 @@ class DateTimeParser {
|
||||
}
|
||||
}
|
||||
|
||||
$newDur = ($matches['plusminus'] === '-' ? '-' : '+') . trim($newDur);
|
||||
$newDur = ('-' === $matches['plusminus'] ? '-' : '+').trim($newDur);
|
||||
|
||||
if ($newDur === '+') {
|
||||
if ('+' === $newDur) {
|
||||
$newDur = '+0 seconds';
|
||||
};
|
||||
}
|
||||
|
||||
return $newDur;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -202,16 +195,15 @@ class DateTimeParser {
|
||||
*
|
||||
* @return DateTimeImmutable|DateInterval
|
||||
*/
|
||||
static function parse($date, $referenceTz = null) {
|
||||
|
||||
if ($date[0] === 'P' || ($date[0] === '-' && $date[1] === 'P')) {
|
||||
public static function parse($date, $referenceTz = null)
|
||||
{
|
||||
if ('P' === $date[0] || ('-' === $date[0] && 'P' === $date[1])) {
|
||||
return self::parseDuration($date);
|
||||
} elseif (strlen($date) === 8) {
|
||||
} elseif (8 === strlen($date)) {
|
||||
return self::parseDate($date, $referenceTz);
|
||||
} else {
|
||||
return self::parseDateTime($date, $referenceTz);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -270,8 +262,8 @@ class DateTimeParser {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
static function parseVCardDateTime($date) {
|
||||
|
||||
public static function parseVCardDateTime($date)
|
||||
{
|
||||
$regex = '/^
|
||||
(?: # date part
|
||||
(?:
|
||||
@ -296,7 +288,6 @@ class DateTimeParser {
|
||||
$/x';
|
||||
|
||||
if (!preg_match($regex, $date, $matches)) {
|
||||
|
||||
// Attempting to parse the extended format.
|
||||
$regex = '/^
|
||||
(?: # date part
|
||||
@ -323,7 +314,6 @@ class DateTimeParser {
|
||||
if (!preg_match($regex, $date, $matches)) {
|
||||
throw new InvalidDataException('Invalid vCard date-time string: '.$date);
|
||||
}
|
||||
|
||||
}
|
||||
$parts = [
|
||||
'year',
|
||||
@ -332,24 +322,21 @@ class DateTimeParser {
|
||||
'hour',
|
||||
'minute',
|
||||
'second',
|
||||
'timezone'
|
||||
'timezone',
|
||||
];
|
||||
|
||||
$result = [];
|
||||
foreach ($parts as $part) {
|
||||
|
||||
if (empty($matches[$part])) {
|
||||
$result[$part] = null;
|
||||
} elseif ($matches[$part] === '-' || $matches[$part] === '--') {
|
||||
} elseif ('-' === $matches[$part] || '--' === $matches[$part]) {
|
||||
$result[$part] = null;
|
||||
} else {
|
||||
$result[$part] = $matches[$part];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -394,8 +381,8 @@ class DateTimeParser {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
static function parseVCardTime($date) {
|
||||
|
||||
public static function parseVCardTime($date)
|
||||
{
|
||||
$regex = '/^
|
||||
(?<hour> [0-9]{2} | -)
|
||||
(?<minute> [0-9]{2} | -)?
|
||||
@ -409,9 +396,7 @@ class DateTimeParser {
|
||||
)?
|
||||
$/x';
|
||||
|
||||
|
||||
if (!preg_match($regex, $date, $matches)) {
|
||||
|
||||
// Attempting to parse the extended format.
|
||||
$regex = '/^
|
||||
(?: (?<hour> [0-9]{2}) : | -)
|
||||
@ -429,30 +414,26 @@ class DateTimeParser {
|
||||
if (!preg_match($regex, $date, $matches)) {
|
||||
throw new InvalidDataException('Invalid vCard time string: '.$date);
|
||||
}
|
||||
|
||||
}
|
||||
$parts = [
|
||||
'hour',
|
||||
'minute',
|
||||
'second',
|
||||
'timezone'
|
||||
'timezone',
|
||||
];
|
||||
|
||||
$result = [];
|
||||
foreach ($parts as $part) {
|
||||
|
||||
if (empty($matches[$part])) {
|
||||
$result[$part] = null;
|
||||
} elseif ($matches[$part] === '-') {
|
||||
} elseif ('-' === $matches[$part]) {
|
||||
$result[$part] = null;
|
||||
} else {
|
||||
$result[$part] = $matches[$part];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -506,8 +487,8 @@ class DateTimeParser {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
static function parseVCardDateAndOrTime($date) {
|
||||
|
||||
public static function parseVCardDateAndOrTime($date)
|
||||
{
|
||||
// \d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d
|
||||
$valueDate = '/^(?J)(?:'.
|
||||
'(?<year>\d{4})(?<month>\d\d)(?<date>\d\d)'.
|
||||
@ -550,7 +531,7 @@ class DateTimeParser {
|
||||
'hour' => null,
|
||||
'minute' => null,
|
||||
'second' => null,
|
||||
'timezone' => null
|
||||
'timezone' => null,
|
||||
];
|
||||
|
||||
// The $valueDateTime expression has a bug with (?J) so we simulate it.
|
||||
@ -575,6 +556,5 @@ class DateTimeParser {
|
||||
unset($parts['year0']);
|
||||
|
||||
return $parts;
|
||||
|
||||
}
|
||||
}
|
||||
|
82
vendor/sabre/vobject/lib/Document.php
vendored
82
vendor/sabre/vobject/lib/Document.php
vendored
@ -16,8 +16,8 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
abstract class Document extends Component {
|
||||
|
||||
abstract class Document extends Component
|
||||
{
|
||||
/**
|
||||
* Unknown document type.
|
||||
*/
|
||||
@ -55,28 +55,28 @@ abstract class Document extends Component {
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
static $defaultName;
|
||||
public static $defaultName;
|
||||
|
||||
/**
|
||||
* List of properties, and which classes they map to.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $propertyMap = [];
|
||||
public static $propertyMap = [];
|
||||
|
||||
/**
|
||||
* List of components, along with which classes they map to.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $componentMap = [];
|
||||
public static $componentMap = [];
|
||||
|
||||
/**
|
||||
* List of value-types, and which classes they map to.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $valueMap = [];
|
||||
public static $valueMap = [];
|
||||
|
||||
/**
|
||||
* Creates a new document.
|
||||
@ -91,20 +91,20 @@ abstract class Document extends Component {
|
||||
*
|
||||
* new Document(array $children = [], $defaults = true);
|
||||
* new Document(string $name, array $children = [], $defaults = true)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$args = func_get_args();
|
||||
if (count($args) === 0 || is_array($args[0])) {
|
||||
array_unshift($args, $this, static::$defaultName);
|
||||
call_user_func_array(['parent', '__construct'], $args);
|
||||
$name = static::$defaultName;
|
||||
if (0 === count($args) || is_array($args[0])) {
|
||||
$children = isset($args[0]) ? $args[0] : [];
|
||||
$defaults = isset($args[1]) ? $args[1] : true;
|
||||
} else {
|
||||
array_unshift($args, $this);
|
||||
call_user_func_array(['parent', '__construct'], $args);
|
||||
$name = $args[0];
|
||||
$children = isset($args[1]) ? $args[1] : [];
|
||||
$defaults = isset($args[2]) ? $args[2] : true;
|
||||
}
|
||||
|
||||
parent::__construct($this, $name, $children, $defaults);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -112,10 +112,9 @@ abstract class Document extends Component {
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function getDocumentType() {
|
||||
|
||||
public function getDocumentType()
|
||||
{
|
||||
return self::UNKNOWN;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -129,18 +128,13 @@ abstract class Document extends Component {
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function create($name) {
|
||||
|
||||
public function create($name)
|
||||
{
|
||||
if (isset(static::$componentMap[strtoupper($name)])) {
|
||||
|
||||
return call_user_func_array([$this, 'createComponent'], func_get_args());
|
||||
|
||||
} else {
|
||||
|
||||
return call_user_func_array([$this, 'createProperty'], func_get_args());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -163,17 +157,19 @@ abstract class Document extends Component {
|
||||
*
|
||||
* @return Component
|
||||
*/
|
||||
function createComponent($name, array $children = null, $defaults = true) {
|
||||
|
||||
public function createComponent($name, array $children = null, $defaults = true)
|
||||
{
|
||||
$name = strtoupper($name);
|
||||
$class = 'Sabre\\VObject\\Component';
|
||||
|
||||
if (isset(static::$componentMap[$name])) {
|
||||
$class = static::$componentMap[$name];
|
||||
}
|
||||
if (is_null($children)) $children = [];
|
||||
return new $class($this, $name, $children, $defaults);
|
||||
if (is_null($children)) {
|
||||
$children = [];
|
||||
}
|
||||
|
||||
return new $class($this, $name, $children, $defaults);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -193,10 +189,10 @@ abstract class Document extends Component {
|
||||
*
|
||||
* @return Property
|
||||
*/
|
||||
function createProperty($name, $value = null, array $parameters = null, $valueType = null) {
|
||||
|
||||
public function createProperty($name, $value = null, array $parameters = null, $valueType = null)
|
||||
{
|
||||
// If there's a . in the name, it means it's prefixed by a groupname.
|
||||
if (($i = strpos($name, '.')) !== false) {
|
||||
if (false !== ($i = strpos($name, '.'))) {
|
||||
$group = substr($name, 0, $i);
|
||||
$name = strtoupper(substr($name, $i + 1));
|
||||
} else {
|
||||
@ -219,15 +215,15 @@ abstract class Document extends Component {
|
||||
if (is_null($class)) {
|
||||
throw new InvalidDataException('Unsupported VALUE parameter for '.$name.' property. You supplied "'.$parameters['VALUE'].'"');
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$class = $this->getClassNameForPropertyName($name);
|
||||
}
|
||||
}
|
||||
if (is_null($parameters)) $parameters = [];
|
||||
if (is_null($parameters)) {
|
||||
$parameters = [];
|
||||
}
|
||||
|
||||
return new $class($this, $name, $value, $parameters, $group);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -239,15 +235,15 @@ abstract class Document extends Component {
|
||||
* This method returns null if we don't have a specialized class.
|
||||
*
|
||||
* @param string $valueParam
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
function getClassNameForPropertyValue($valueParam) {
|
||||
|
||||
public function getClassNameForPropertyValue($valueParam)
|
||||
{
|
||||
$valueParam = strtoupper($valueParam);
|
||||
if (isset(static::$valueMap[$valueParam])) {
|
||||
return static::$valueMap[$valueParam];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -257,14 +253,12 @@ abstract class Document extends Component {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getClassNameForPropertyName($propertyName) {
|
||||
|
||||
public function getClassNameForPropertyName($propertyName)
|
||||
{
|
||||
if (isset(static::$propertyMap[$propertyName])) {
|
||||
return static::$propertyMap[$propertyName];
|
||||
} else {
|
||||
return 'Sabre\\VObject\\Property\\Unknown';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
20
vendor/sabre/vobject/lib/ElementList.php
vendored
20
vendor/sabre/vobject/lib/ElementList.php
vendored
@ -15,9 +15,8 @@ use LogicException;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class ElementList extends ArrayIterator {
|
||||
|
||||
|
||||
class ElementList extends ArrayIterator
|
||||
{
|
||||
/* {{{ ArrayAccess Interface */
|
||||
|
||||
/**
|
||||
@ -25,13 +24,10 @@ class ElementList extends ArrayIterator {
|
||||
*
|
||||
* @param int $offset
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function offsetSet($offset, $value) {
|
||||
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
throw new LogicException('You can not add new objects to an ElementList');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -40,15 +36,11 @@ class ElementList extends ArrayIterator {
|
||||
* This method just forwards the request to the inner iterator
|
||||
*
|
||||
* @param int $offset
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function offsetUnset($offset) {
|
||||
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
throw new LogicException('You can not remove objects from an ElementList');
|
||||
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
}
|
||||
|
4
vendor/sabre/vobject/lib/EofException.php
vendored
4
vendor/sabre/vobject/lib/EofException.php
vendored
@ -10,6 +10,6 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class EofException extends ParseException {
|
||||
|
||||
class EofException extends ParseException
|
||||
{
|
||||
}
|
||||
|
52
vendor/sabre/vobject/lib/FreeBusyData.php
vendored
52
vendor/sabre/vobject/lib/FreeBusyData.php
vendored
@ -9,17 +9,17 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class FreeBusyData {
|
||||
|
||||
class FreeBusyData
|
||||
{
|
||||
/**
|
||||
* Start timestamp
|
||||
* Start timestamp.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $start;
|
||||
|
||||
/**
|
||||
* End timestamp
|
||||
* End timestamp.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
@ -32,8 +32,8 @@ class FreeBusyData {
|
||||
*/
|
||||
protected $data;
|
||||
|
||||
function __construct($start, $end) {
|
||||
|
||||
public function __construct($start, $end)
|
||||
{
|
||||
$this->start = $start;
|
||||
$this->end = $end;
|
||||
$this->data = [];
|
||||
@ -43,7 +43,6 @@ class FreeBusyData {
|
||||
'end' => $this->end,
|
||||
'type' => 'FREE',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -52,15 +51,12 @@ class FreeBusyData {
|
||||
* @param int $start
|
||||
* @param int $end
|
||||
* @param string $type FREE, BUSY, BUSY-UNAVAILABLE or BUSY-TENTATIVE
|
||||
* @return void
|
||||
*/
|
||||
function add($start, $end, $type) {
|
||||
|
||||
public function add($start, $end, $type)
|
||||
{
|
||||
if ($start > $this->end || $end < $this->start) {
|
||||
|
||||
// This new data is outside our timerange.
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
if ($start < $this->start) {
|
||||
@ -75,7 +71,7 @@ class FreeBusyData {
|
||||
// Finding out where we need to insert the new item.
|
||||
$currentIndex = 0;
|
||||
while ($start > $this->data[$currentIndex]['end']) {
|
||||
$currentIndex++;
|
||||
++$currentIndex;
|
||||
}
|
||||
|
||||
// The standard insertion point will be one _after_ the first
|
||||
@ -91,7 +87,7 @@ class FreeBusyData {
|
||||
$preceedingItem = $this->data[$insertStartIndex - 1];
|
||||
if ($this->data[$insertStartIndex - 1]['start'] === $start) {
|
||||
// The old item starts at the exact same point as the new item.
|
||||
$insertStartIndex--;
|
||||
--$insertStartIndex;
|
||||
}
|
||||
|
||||
// Now we know where to insert the item, we need to know where it
|
||||
@ -105,32 +101,32 @@ class FreeBusyData {
|
||||
}
|
||||
|
||||
while ($end > $this->data[$currentIndex]['end']) {
|
||||
|
||||
$currentIndex++;
|
||||
|
||||
++$currentIndex;
|
||||
}
|
||||
|
||||
// What we are about to insert into the array
|
||||
$newItems = [
|
||||
$newItem
|
||||
$newItem,
|
||||
];
|
||||
|
||||
// This is the amount of items that are completely overwritten by the
|
||||
// new item.
|
||||
$itemsToDelete = $currentIndex - $insertStartIndex;
|
||||
if ($this->data[$currentIndex]['end'] <= $end) $itemsToDelete++;
|
||||
if ($this->data[$currentIndex]['end'] <= $end) {
|
||||
++$itemsToDelete;
|
||||
}
|
||||
|
||||
// If itemsToDelete was -1, it means that the newly inserted item is
|
||||
// actually sitting inside an existing one. This means we need to split
|
||||
// the item at the current position in two and insert the new item in
|
||||
// between.
|
||||
if ($itemsToDelete === -1) {
|
||||
if (-1 === $itemsToDelete) {
|
||||
$itemsToDelete = 0;
|
||||
if ($newItem['end'] < $preceedingItem['end']) {
|
||||
$newItems[] = [
|
||||
'start' => $newItem['end'] + 1,
|
||||
'end' => $preceedingItem['end'],
|
||||
'type' => $preceedingItem['type']
|
||||
'type' => $preceedingItem['type'],
|
||||
];
|
||||
}
|
||||
}
|
||||
@ -155,8 +151,8 @@ class FreeBusyData {
|
||||
// merge them into one item.
|
||||
if ($this->data[$insertStartIndex - 1]['type'] === $this->data[$insertStartIndex]['type']) {
|
||||
$doMerge = true;
|
||||
$mergeOffset--;
|
||||
$mergeDelete++;
|
||||
--$mergeOffset;
|
||||
++$mergeDelete;
|
||||
$mergeItem['start'] = $this->data[$insertStartIndex - 1]['start'];
|
||||
}
|
||||
}
|
||||
@ -168,10 +164,9 @@ class FreeBusyData {
|
||||
// merge them into one item.
|
||||
if ($this->data[$insertStartIndex + 1]['type'] === $this->data[$insertStartIndex]['type']) {
|
||||
$doMerge = true;
|
||||
$mergeDelete++;
|
||||
++$mergeDelete;
|
||||
$mergeItem['end'] = $this->data[$insertStartIndex + 1]['end'];
|
||||
}
|
||||
|
||||
}
|
||||
if ($doMerge) {
|
||||
array_splice(
|
||||
@ -181,13 +176,10 @@ class FreeBusyData {
|
||||
[$mergeItem]
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function getData() {
|
||||
|
||||
public function getData()
|
||||
{
|
||||
return $this->data;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
150
vendor/sabre/vobject/lib/FreeBusyGenerator.php
vendored
150
vendor/sabre/vobject/lib/FreeBusyGenerator.php
vendored
@ -23,8 +23,8 @@ use Sabre\VObject\Recur\NoInstancesException;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class FreeBusyGenerator {
|
||||
|
||||
class FreeBusyGenerator
|
||||
{
|
||||
/**
|
||||
* Input objects.
|
||||
*
|
||||
@ -71,7 +71,7 @@ class FreeBusyGenerator {
|
||||
/**
|
||||
* A VAVAILABILITY document.
|
||||
*
|
||||
* If this is set, it's information will be included when calculating
|
||||
* If this is set, its information will be included when calculating
|
||||
* freebusy time.
|
||||
*
|
||||
* @var Document
|
||||
@ -89,8 +89,8 @@ class FreeBusyGenerator {
|
||||
* @param mixed $objects
|
||||
* @param DateTimeZone $timeZone
|
||||
*/
|
||||
function __construct(DateTimeInterface $start = null, DateTimeInterface $end = null, $objects = null, DateTimeZone $timeZone = null) {
|
||||
|
||||
public function __construct(DateTimeInterface $start = null, DateTimeInterface $end = null, $objects = null, DateTimeZone $timeZone = null)
|
||||
{
|
||||
$this->setTimeRange($start, $end);
|
||||
|
||||
if ($objects) {
|
||||
@ -100,7 +100,6 @@ class FreeBusyGenerator {
|
||||
$timeZone = new DateTimeZone('UTC');
|
||||
}
|
||||
$this->setTimeZone($timeZone);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -112,24 +111,20 @@ class FreeBusyGenerator {
|
||||
* The VFREEBUSY object will be automatically added though.
|
||||
*
|
||||
* @param Document $vcalendar
|
||||
* @return void
|
||||
*/
|
||||
function setBaseObject(Document $vcalendar) {
|
||||
|
||||
public function setBaseObject(Document $vcalendar)
|
||||
{
|
||||
$this->baseObject = $vcalendar;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a VAVAILABILITY document.
|
||||
*
|
||||
* @param Document $vcalendar
|
||||
* @return void
|
||||
*/
|
||||
function setVAvailability(Document $vcalendar) {
|
||||
|
||||
public function setVAvailability(Document $vcalendar)
|
||||
{
|
||||
$this->vavailability = $vcalendar;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -140,18 +135,15 @@ class FreeBusyGenerator {
|
||||
* It's also possible to specify multiple objects as an array.
|
||||
*
|
||||
* @param mixed $objects
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setObjects($objects) {
|
||||
|
||||
public function setObjects($objects)
|
||||
{
|
||||
if (!is_array($objects)) {
|
||||
$objects = [$objects];
|
||||
}
|
||||
|
||||
$this->objects = [];
|
||||
foreach ($objects as $object) {
|
||||
|
||||
if (is_string($object) || is_resource($object)) {
|
||||
$this->objects[] = Reader::read($object);
|
||||
} elseif ($object instanceof Component) {
|
||||
@ -159,9 +151,7 @@ class FreeBusyGenerator {
|
||||
} else {
|
||||
throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component arguments to setObjects');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -171,11 +161,9 @@ class FreeBusyGenerator {
|
||||
*
|
||||
* @param DateTimeInterface $start
|
||||
* @param DateTimeInterface $end
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setTimeRange(DateTimeInterface $start = null, DateTimeInterface $end = null) {
|
||||
|
||||
public function setTimeRange(DateTimeInterface $start = null, DateTimeInterface $end = null)
|
||||
{
|
||||
if (!$start) {
|
||||
$start = new DateTimeImmutable(Settings::$minDate);
|
||||
}
|
||||
@ -184,20 +172,16 @@ class FreeBusyGenerator {
|
||||
}
|
||||
$this->start = $start;
|
||||
$this->end = $end;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the reference timezone for floating times.
|
||||
*
|
||||
* @param DateTimeZone $timeZone
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setTimeZone(DateTimeZone $timeZone) {
|
||||
|
||||
public function setTimeZone(DateTimeZone $timeZone)
|
||||
{
|
||||
$this->timeZone = $timeZone;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -206,23 +190,19 @@ class FreeBusyGenerator {
|
||||
*
|
||||
* @return Component
|
||||
*/
|
||||
function getResult() {
|
||||
|
||||
public function getResult()
|
||||
{
|
||||
$fbData = new FreeBusyData(
|
||||
$this->start->getTimeStamp(),
|
||||
$this->end->getTimeStamp()
|
||||
);
|
||||
if ($this->vavailability) {
|
||||
|
||||
$this->calculateAvailability($fbData, $this->vavailability);
|
||||
|
||||
}
|
||||
|
||||
$this->calculateBusy($fbData, $this->objects);
|
||||
|
||||
return $this->generateFreeBusyCalendar($fbData);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -231,15 +211,13 @@ class FreeBusyGenerator {
|
||||
*
|
||||
* @param FreeBusyData $fbData
|
||||
* @param VCalendar $vavailability
|
||||
* @return void
|
||||
*/
|
||||
protected function calculateAvailability(FreeBusyData $fbData, VCalendar $vavailability) {
|
||||
|
||||
protected function calculateAvailability(FreeBusyData $fbData, VCalendar $vavailability)
|
||||
{
|
||||
$vavailComps = iterator_to_array($vavailability->VAVAILABILITY);
|
||||
usort(
|
||||
$vavailComps,
|
||||
function ($a, $b) {
|
||||
|
||||
// We need to order the components by priority. Priority 1
|
||||
// comes first, up until priority 9. Priority 0 comes after
|
||||
// priority 9. No priority implies priority 0.
|
||||
@ -248,11 +226,14 @@ class FreeBusyGenerator {
|
||||
$priorityA = isset($a->PRIORITY) ? (int) $a->PRIORITY->getValue() : 0;
|
||||
$priorityB = isset($b->PRIORITY) ? (int) $b->PRIORITY->getValue() : 0;
|
||||
|
||||
if ($priorityA === 0) $priorityA = 10;
|
||||
if ($priorityB === 0) $priorityB = 10;
|
||||
if (0 === $priorityA) {
|
||||
$priorityA = 10;
|
||||
}
|
||||
if (0 === $priorityB) {
|
||||
$priorityB = 10;
|
||||
}
|
||||
|
||||
return $priorityA - $priorityB;
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
@ -267,7 +248,6 @@ class FreeBusyGenerator {
|
||||
$new = [];
|
||||
|
||||
foreach ($old as $vavail) {
|
||||
|
||||
list($compStart, $compEnd) = $vavail->getEffectiveStartEnd();
|
||||
|
||||
// We don't care about datetimes that are earlier or later than the
|
||||
@ -288,24 +268,19 @@ class FreeBusyGenerator {
|
||||
// Going through our existing list of components to see if there's
|
||||
// a higher priority component that already fully covers this one.
|
||||
foreach ($new as $higherVavail) {
|
||||
|
||||
list($higherStart, $higherEnd) = $higherVavail->getEffectiveStartEnd();
|
||||
if (
|
||||
(is_null($higherStart) || $higherStart < $compStart) &&
|
||||
(is_null($higherEnd) || $higherEnd > $compEnd)
|
||||
) {
|
||||
|
||||
// Component is fully covered by a higher priority
|
||||
// component. We can skip this component.
|
||||
continue 2;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// We're keeping it!
|
||||
$new[] = $vavail;
|
||||
|
||||
}
|
||||
|
||||
// Lastly, we need to traverse the remaining components and fill in the
|
||||
@ -314,7 +289,6 @@ class FreeBusyGenerator {
|
||||
// We traverse the components in reverse, because we want the higher
|
||||
// priority components to override the lower ones.
|
||||
foreach (array_reverse($new) as $vavail) {
|
||||
|
||||
$busyType = isset($vavail->BUSYTYPE) ? strtoupper($vavail->BUSYTYPE) : 'BUSY-UNAVAILABLE';
|
||||
list($vavailStart, $vavailEnd) = $vavail->getEffectiveStartEnd();
|
||||
|
||||
@ -336,8 +310,8 @@ class FreeBusyGenerator {
|
||||
);
|
||||
|
||||
// Looping over the AVAILABLE components.
|
||||
if (isset($vavail->AVAILABLE)) foreach ($vavail->AVAILABLE as $available) {
|
||||
|
||||
if (isset($vavail->AVAILABLE)) {
|
||||
foreach ($vavail->AVAILABLE as $available) {
|
||||
list($availStart, $availEnd) = $available->getEffectiveStartEnd();
|
||||
$fbData->add(
|
||||
$availStart->getTimeStamp(),
|
||||
@ -357,7 +331,6 @@ class FreeBusyGenerator {
|
||||
$startEndDiff = $availStart->diff($availEnd);
|
||||
|
||||
while ($rruleIterator->valid()) {
|
||||
|
||||
$recurStart = $rruleIterator->current();
|
||||
$recurEnd = $recurStart->add($startEndDiff);
|
||||
|
||||
@ -379,14 +352,11 @@ class FreeBusyGenerator {
|
||||
);
|
||||
|
||||
$rruleIterator->next();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -396,26 +366,23 @@ class FreeBusyGenerator {
|
||||
* @param FreeBusyData $fbData
|
||||
* @param VCalendar[] $objects
|
||||
*/
|
||||
protected function calculateBusy(FreeBusyData $fbData, array $objects) {
|
||||
|
||||
protected function calculateBusy(FreeBusyData $fbData, array $objects)
|
||||
{
|
||||
foreach ($objects as $key => $object) {
|
||||
|
||||
foreach ($object->getBaseComponents() as $component) {
|
||||
|
||||
switch ($component->name) {
|
||||
|
||||
case 'VEVENT':
|
||||
|
||||
$FBTYPE = 'BUSY';
|
||||
if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) {
|
||||
if (isset($component->TRANSP) && ('TRANSPARENT' === strtoupper($component->TRANSP))) {
|
||||
break;
|
||||
}
|
||||
if (isset($component->STATUS)) {
|
||||
$status = strtoupper($component->STATUS);
|
||||
if ($status === 'CANCELLED') {
|
||||
if ('CANCELLED' === $status) {
|
||||
break;
|
||||
}
|
||||
if ($status === 'TENTATIVE') {
|
||||
if ('TENTATIVE' === $status) {
|
||||
$FBTYPE = 'BUSY-TENTATIVE';
|
||||
}
|
||||
}
|
||||
@ -430,7 +397,7 @@ class FreeBusyGenerator {
|
||||
// instance. We are skipping this event from the output
|
||||
// entirely.
|
||||
unset($this->objects[$key]);
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
|
||||
if ($this->start) {
|
||||
@ -440,7 +407,6 @@ class FreeBusyGenerator {
|
||||
$maxRecurrences = Settings::$maxRecurrences;
|
||||
|
||||
while ($iterator->valid() && --$maxRecurrences) {
|
||||
|
||||
$startTime = $iterator->getDTStart();
|
||||
if ($this->end && $startTime > $this->end) {
|
||||
break;
|
||||
@ -451,11 +417,8 @@ class FreeBusyGenerator {
|
||||
];
|
||||
|
||||
$iterator->next();
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$startTime = $component->DTSTART->getDateTime($this->timeZone);
|
||||
if ($this->end && $startTime > $this->end) {
|
||||
break;
|
||||
@ -476,13 +439,15 @@ class FreeBusyGenerator {
|
||||
}
|
||||
|
||||
$times[] = [$startTime, $endTime];
|
||||
|
||||
}
|
||||
|
||||
foreach ($times as $time) {
|
||||
|
||||
if ($this->end && $time[0] > $this->end) break;
|
||||
if ($this->start && $time[1] < $this->start) break;
|
||||
if ($this->end && $time[0] > $this->end) {
|
||||
break;
|
||||
}
|
||||
if ($this->start && $time[1] < $this->start) {
|
||||
break;
|
||||
}
|
||||
|
||||
$fbData->add(
|
||||
$time[0]->getTimeStamp(),
|
||||
@ -494,19 +459,19 @@ class FreeBusyGenerator {
|
||||
|
||||
case 'VFREEBUSY':
|
||||
foreach ($component->FREEBUSY as $freebusy) {
|
||||
|
||||
$fbType = isset($freebusy['FBTYPE']) ? strtoupper($freebusy['FBTYPE']) : 'BUSY';
|
||||
|
||||
// Skipping intervals marked as 'free'
|
||||
if ($fbType === 'FREE')
|
||||
if ('FREE' === $fbType) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$values = explode(',', $freebusy);
|
||||
foreach ($values as $value) {
|
||||
list($startTime, $endTime) = explode('/', $value);
|
||||
$startTime = DateTimeParser::parseDateTime($startTime);
|
||||
|
||||
if (substr($endTime, 0, 1) === 'P' || substr($endTime, 0, 2) === '-P') {
|
||||
if ('P' === substr($endTime, 0, 1) || '-P' === substr($endTime, 0, 2)) {
|
||||
$duration = DateTimeParser::parseDuration($endTime);
|
||||
$endTime = clone $startTime;
|
||||
$endTime = $endTime->add($duration);
|
||||
@ -514,27 +479,23 @@ class FreeBusyGenerator {
|
||||
$endTime = DateTimeParser::parseDateTime($endTime);
|
||||
}
|
||||
|
||||
if ($this->start && $this->start > $endTime) continue;
|
||||
if ($this->end && $this->end < $startTime) continue;
|
||||
if ($this->start && $this->start > $endTime) {
|
||||
continue;
|
||||
}
|
||||
if ($this->end && $this->end < $startTime) {
|
||||
continue;
|
||||
}
|
||||
$fbData->add(
|
||||
$startTime->getTimeStamp(),
|
||||
$endTime->getTimeStamp(),
|
||||
$fbType
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -543,8 +504,8 @@ class FreeBusyGenerator {
|
||||
*
|
||||
* @return VCalendar
|
||||
*/
|
||||
protected function generateFreeBusyCalendar(FreeBusyData $fbData) {
|
||||
|
||||
protected function generateFreeBusyCalendar(FreeBusyData $fbData)
|
||||
{
|
||||
if ($this->baseObject) {
|
||||
$calendar = $this->baseObject;
|
||||
} else {
|
||||
@ -571,11 +532,10 @@ class FreeBusyGenerator {
|
||||
$vfreebusy->add($dtstamp);
|
||||
|
||||
foreach ($fbData->getData() as $busyTime) {
|
||||
|
||||
$busyType = strtoupper($busyTime['type']);
|
||||
|
||||
// Ignoring all the FREE parts, because those are already assumed.
|
||||
if ($busyType === 'FREE') {
|
||||
if ('FREE' === $busyType) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -589,16 +549,12 @@ class FreeBusyGenerator {
|
||||
|
||||
// Only setting FBTYPE if it's not BUSY, because BUSY is the
|
||||
// default anyway.
|
||||
if ($busyType !== 'BUSY') {
|
||||
if ('BUSY' !== $busyType) {
|
||||
$prop['FBTYPE'] = $busyType;
|
||||
}
|
||||
$vfreebusy->add($prop);
|
||||
|
||||
}
|
||||
|
||||
return $calendar;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
145
vendor/sabre/vobject/lib/ITip/Broker.php
vendored
145
vendor/sabre/vobject/lib/ITip/Broker.php
vendored
@ -35,8 +35,8 @@ use Sabre\VObject\Recur\EventIterator;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Broker {
|
||||
|
||||
class Broker
|
||||
{
|
||||
/**
|
||||
* This setting determines whether the rules for the SCHEDULE-AGENT
|
||||
* parameter should be followed.
|
||||
@ -109,15 +109,14 @@ class Broker {
|
||||
*
|
||||
* @return VCalendar|null
|
||||
*/
|
||||
function processMessage(Message $itipMessage, VCalendar $existingObject = null) {
|
||||
|
||||
public function processMessage(Message $itipMessage, VCalendar $existingObject = null)
|
||||
{
|
||||
// We only support events at the moment.
|
||||
if ($itipMessage->component !== 'VEVENT') {
|
||||
if ('VEVENT' !== $itipMessage->component) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch ($itipMessage->method) {
|
||||
|
||||
case 'REQUEST':
|
||||
return $this->processMessageRequest($itipMessage, $existingObject);
|
||||
|
||||
@ -130,11 +129,9 @@ class Broker {
|
||||
default:
|
||||
// Unsupported iTip message
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
return $existingObject;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -166,8 +163,8 @@ class Broker {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function parseEvent($calendar = null, $userHref, $oldCalendar = null) {
|
||||
|
||||
public function parseEvent($calendar = null, $userHref, $oldCalendar = null)
|
||||
{
|
||||
if ($oldCalendar) {
|
||||
if (is_string($oldCalendar)) {
|
||||
$oldCalendar = Reader::read($oldCalendar);
|
||||
@ -189,7 +186,6 @@ class Broker {
|
||||
$userHref = (array) $userHref;
|
||||
|
||||
if (!is_null($calendar)) {
|
||||
|
||||
if (is_string($calendar)) {
|
||||
$calendar = Reader::read($calendar);
|
||||
}
|
||||
@ -217,7 +213,6 @@ class Broker {
|
||||
$eventInfo['organizer'] = $oldEventInfo['organizer'];
|
||||
$eventInfo['organizerName'] = $oldEventInfo['organizerName'];
|
||||
}
|
||||
|
||||
} else {
|
||||
// The calendar object got deleted, we need to process this as a
|
||||
// cancellation / decline.
|
||||
@ -233,19 +228,17 @@ class Broker {
|
||||
$eventInfo['attendees'] = [];
|
||||
// Increasing the sequence, but only if the organizer deleted
|
||||
// the event.
|
||||
$eventInfo['sequence']++;
|
||||
++$eventInfo['sequence'];
|
||||
} else {
|
||||
// This is an attendee deleting the event.
|
||||
foreach ($eventInfo['attendees'] as $key => $attendee) {
|
||||
if (in_array($attendee['href'], $userHref)) {
|
||||
$eventInfo['attendees'][$key]['instances'] = ['master' =>
|
||||
['id' => 'master', 'partstat' => 'DECLINED']
|
||||
$eventInfo['attendees'][$key]['instances'] = ['master' => ['id' => 'master', 'partstat' => 'DECLINED'],
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
$baseCalendar = $oldCalendar;
|
||||
|
||||
}
|
||||
|
||||
if (in_array($eventInfo['organizer'], $userHref)) {
|
||||
@ -260,8 +253,8 @@ class Broker {
|
||||
}
|
||||
}
|
||||
}
|
||||
return [];
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
@ -276,8 +269,8 @@ class Broker {
|
||||
*
|
||||
* @return VCalendar|null
|
||||
*/
|
||||
protected function processMessageRequest(Message $itipMessage, VCalendar $existingObject = null) {
|
||||
|
||||
protected function processMessageRequest(Message $itipMessage, VCalendar $existingObject = null)
|
||||
{
|
||||
if (!$existingObject) {
|
||||
// This is a new invite, and we're just going to copy over
|
||||
// all the components from the invite.
|
||||
@ -296,8 +289,8 @@ class Broker {
|
||||
$existingObject->add(clone $component);
|
||||
}
|
||||
}
|
||||
return $existingObject;
|
||||
|
||||
return $existingObject;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -312,8 +305,8 @@ class Broker {
|
||||
*
|
||||
* @return VCalendar|null
|
||||
*/
|
||||
protected function processMessageCancel(Message $itipMessage, VCalendar $existingObject = null) {
|
||||
|
||||
protected function processMessageCancel(Message $itipMessage, VCalendar $existingObject = null)
|
||||
{
|
||||
if (!$existingObject) {
|
||||
// The event didn't exist in the first place, so we're just
|
||||
// ignoring this message.
|
||||
@ -323,8 +316,8 @@ class Broker {
|
||||
$vevent->SEQUENCE = $itipMessage->sequence;
|
||||
}
|
||||
}
|
||||
return $existingObject;
|
||||
|
||||
return $existingObject;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -338,8 +331,8 @@ class Broker {
|
||||
*
|
||||
* @return VCalendar|null
|
||||
*/
|
||||
protected function processMessageReply(Message $itipMessage, VCalendar $existingObject = null) {
|
||||
|
||||
protected function processMessageReply(Message $itipMessage, VCalendar $existingObject = null)
|
||||
{
|
||||
// A reply can only be processed based on an existing object.
|
||||
// If the object is not available, the reply is ignored.
|
||||
if (!$existingObject) {
|
||||
@ -364,7 +357,7 @@ class Broker {
|
||||
$masterObject = null;
|
||||
foreach ($existingObject->VEVENT as $vevent) {
|
||||
$recurId = isset($vevent->{'RECURRENCE-ID'}) ? $vevent->{'RECURRENCE-ID'}->getValue() : 'master';
|
||||
if ($recurId === 'master') {
|
||||
if ('master' === $recurId) {
|
||||
$masterObject = $vevent;
|
||||
}
|
||||
if (isset($instances[$recurId])) {
|
||||
@ -386,9 +379,11 @@ class Broker {
|
||||
// Adding a new attendee. The iTip documentation calls this
|
||||
// a party crasher.
|
||||
$attendee = $vevent->add('ATTENDEE', $itipMessage->sender, [
|
||||
'PARTSTAT' => $instances[$recurId]
|
||||
'PARTSTAT' => $instances[$recurId],
|
||||
]);
|
||||
if ($itipMessage->senderName) $attendee['CN'] = $itipMessage->senderName;
|
||||
if ($itipMessage->senderName) {
|
||||
$attendee['CN'] = $itipMessage->senderName;
|
||||
}
|
||||
}
|
||||
unset($instances[$recurId]);
|
||||
}
|
||||
@ -401,24 +396,23 @@ class Broker {
|
||||
// If we got replies to instances that did not exist in the
|
||||
// original list, it means that new exceptions must be created.
|
||||
foreach ($instances as $recurId => $partstat) {
|
||||
|
||||
$recurrenceIterator = new EventIterator($existingObject, $itipMessage->uid);
|
||||
$found = false;
|
||||
$iterations = 1000;
|
||||
do {
|
||||
|
||||
$newObject = $recurrenceIterator->getEventObject();
|
||||
$recurrenceIterator->next();
|
||||
|
||||
if (isset($newObject->{'RECURRENCE-ID'}) && $newObject->{'RECURRENCE-ID'}->getValue() === $recurId) {
|
||||
$found = true;
|
||||
}
|
||||
$iterations--;
|
||||
|
||||
--$iterations;
|
||||
} while ($recurrenceIterator->valid() && !$found && $iterations);
|
||||
|
||||
// Invalid recurrence id. Skipping this object.
|
||||
if (!$found) continue;
|
||||
if (!$found) {
|
||||
continue;
|
||||
}
|
||||
|
||||
unset(
|
||||
$newObject->RRULE,
|
||||
@ -438,17 +432,16 @@ class Broker {
|
||||
if (!$attendeeFound) {
|
||||
// Adding a new attendee
|
||||
$attendee = $newObject->add('ATTENDEE', $itipMessage->sender, [
|
||||
'PARTSTAT' => $partstat
|
||||
'PARTSTAT' => $partstat,
|
||||
]);
|
||||
if ($itipMessage->senderName) {
|
||||
$attendee['CN'] = $itipMessage->senderName;
|
||||
}
|
||||
}
|
||||
$existingObject->add($newObject);
|
||||
|
||||
}
|
||||
return $existingObject;
|
||||
|
||||
return $existingObject;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -465,8 +458,8 @@ class Broker {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function parseEventForOrganizer(VCalendar $calendar, array $eventInfo, array $oldEventInfo) {
|
||||
|
||||
protected function parseEventForOrganizer(VCalendar $calendar, array $eventInfo, array $oldEventInfo)
|
||||
{
|
||||
// Merging attendee lists.
|
||||
$attendees = [];
|
||||
foreach ($oldEventInfo['attendees'] as $attendee) {
|
||||
@ -497,7 +490,6 @@ class Broker {
|
||||
$messages = [];
|
||||
|
||||
foreach ($attendees as $attendee) {
|
||||
|
||||
// An organizer can also be an attendee. We should not generate any
|
||||
// messages for those.
|
||||
if ($attendee['href'] === $eventInfo['organizer']) {
|
||||
@ -514,7 +506,6 @@ class Broker {
|
||||
$message->recipientName = $attendee['name'];
|
||||
|
||||
if (!$attendee['newInstances']) {
|
||||
|
||||
// If there are no instances the attendee is a part of, it
|
||||
// means the attendee was removed and we need to send him a
|
||||
// CANCEL.
|
||||
@ -523,6 +514,11 @@ class Broker {
|
||||
// Creating the new iCalendar body.
|
||||
$icalMsg = new VCalendar();
|
||||
$icalMsg->METHOD = $message->method;
|
||||
|
||||
foreach ($calendar->select('VTIMEZONE') as $timezone) {
|
||||
$icalMsg->add(clone $timezone);
|
||||
}
|
||||
|
||||
$event = $icalMsg->add('VEVENT', [
|
||||
'UID' => $message->uid,
|
||||
'SEQUENCE' => $message->sequence,
|
||||
@ -537,14 +533,14 @@ class Broker {
|
||||
$event->add(clone $calendar->VEVENT->DURATION);
|
||||
}
|
||||
$org = $event->add('ORGANIZER', $eventInfo['organizer']);
|
||||
if ($eventInfo['organizerName']) $org['CN'] = $eventInfo['organizerName'];
|
||||
if ($eventInfo['organizerName']) {
|
||||
$org['CN'] = $eventInfo['organizerName'];
|
||||
}
|
||||
$event->add('ATTENDEE', $attendee['href'], [
|
||||
'CN' => $attendee['name'],
|
||||
]);
|
||||
$message->significantChange = true;
|
||||
|
||||
} else {
|
||||
|
||||
// The attendee gets the updated event body
|
||||
$message->method = 'REQUEST';
|
||||
|
||||
@ -565,15 +561,13 @@ class Broker {
|
||||
// difference in instances that the attendee is invited to.
|
||||
|
||||
$message->significantChange =
|
||||
$attendee['forceSend'] === 'REQUEST' ||
|
||||
'REQUEST' === $attendee['forceSend'] ||
|
||||
array_keys($attendee['oldInstances']) != array_keys($attendee['newInstances']) ||
|
||||
$oldEventInfo['significantChangeHash'] !== $eventInfo['significantChangeHash'];
|
||||
|
||||
foreach ($attendee['newInstances'] as $instanceId => $instanceInfo) {
|
||||
|
||||
$currentEvent = clone $eventInfo['instances'][$instanceId];
|
||||
if ($instanceId === 'master') {
|
||||
|
||||
if ('master' === $instanceId) {
|
||||
// We need to find a list of events that the attendee
|
||||
// is not a part of to add to the list of exceptions.
|
||||
$exceptions = [];
|
||||
@ -610,24 +604,18 @@ class Broker {
|
||||
if (!isset($attendee['PARTSTAT'])) {
|
||||
$attendee['PARTSTAT'] = 'NEEDS-ACTION';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$icalMsg->add($currentEvent);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$message->message = $icalMsg;
|
||||
$messages[] = $message;
|
||||
|
||||
}
|
||||
|
||||
return $messages;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -642,15 +630,15 @@ class Broker {
|
||||
*
|
||||
* @return Message[]
|
||||
*/
|
||||
protected function parseEventForAttendee(VCalendar $calendar, array $eventInfo, array $oldEventInfo, $attendee) {
|
||||
|
||||
if ($this->scheduleAgentServerRules && $eventInfo['organizerScheduleAgent'] === 'CLIENT') {
|
||||
protected function parseEventForAttendee(VCalendar $calendar, array $eventInfo, array $oldEventInfo, $attendee)
|
||||
{
|
||||
if ($this->scheduleAgentServerRules && 'CLIENT' === $eventInfo['organizerScheduleAgent']) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Don't bother generating messages for events that have already been
|
||||
// cancelled.
|
||||
if ($eventInfo['status'] === 'CANCELLED') {
|
||||
if ('CANCELLED' === $eventInfo['status']) {
|
||||
return [];
|
||||
}
|
||||
|
||||
@ -660,16 +648,13 @@ class Broker {
|
||||
|
||||
$instances = [];
|
||||
foreach ($oldInstances as $instance) {
|
||||
|
||||
$instances[$instance['id']] = [
|
||||
'id' => $instance['id'],
|
||||
'oldstatus' => $instance['partstat'],
|
||||
'newstatus' => null,
|
||||
];
|
||||
|
||||
}
|
||||
foreach ($eventInfo['attendees'][$attendee]['instances'] as $instance) {
|
||||
|
||||
if (isset($instances[$instance['id']])) {
|
||||
$instances[$instance['id']]['newstatus'] = $instance['partstat'];
|
||||
} else {
|
||||
@ -679,7 +664,6 @@ class Broker {
|
||||
'newstatus' => $instance['partstat'],
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// We need to also look for differences in EXDATE. If there are new
|
||||
@ -687,9 +671,8 @@ class Broker {
|
||||
// event, which means we need to send DECLINED specifically for those
|
||||
// instances.
|
||||
// We only need to do that though, if the master event is not declined.
|
||||
if (isset($instances['master']) && $instances['master']['newstatus'] !== 'DECLINED') {
|
||||
if (isset($instances['master']) && 'DECLINED' !== $instances['master']['newstatus']) {
|
||||
foreach ($eventInfo['exdate'] as $exDate) {
|
||||
|
||||
if (!in_array($exDate, $oldEventInfo['exdate'])) {
|
||||
if (isset($instances[$exDate])) {
|
||||
$instances[$exDate]['newstatus'] = 'DECLINED';
|
||||
@ -701,19 +684,16 @@ class Broker {
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Gathering a few extra properties for each instance.
|
||||
foreach ($instances as $recurId => $instanceInfo) {
|
||||
|
||||
if (isset($eventInfo['instances'][$recurId])) {
|
||||
$instances[$recurId]['dtstart'] = clone $eventInfo['instances'][$recurId]->DTSTART;
|
||||
} else {
|
||||
$instances[$recurId]['dtstart'] = $recurId;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$message = new Message();
|
||||
@ -732,8 +712,7 @@ class Broker {
|
||||
$hasReply = false;
|
||||
|
||||
foreach ($instances as $instance) {
|
||||
|
||||
if ($instance['oldstatus'] == $instance['newstatus'] && $eventInfo['organizerForceSend'] !== 'REPLY') {
|
||||
if ($instance['oldstatus'] == $instance['newstatus'] && 'REPLY' !== $eventInfo['organizerForceSend']) {
|
||||
// Skip
|
||||
continue;
|
||||
}
|
||||
@ -773,7 +752,7 @@ class Broker {
|
||||
$event->add('SUMMARY', $summary);
|
||||
}
|
||||
}
|
||||
if ($instance['id'] !== 'master') {
|
||||
if ('master' !== $instance['id']) {
|
||||
$dt = DateTimeParser::parse($instance['id'], $eventInfo['timezone']);
|
||||
// Treat is as a DATE field
|
||||
if (strlen($instance['id']) <= 8) {
|
||||
@ -787,22 +766,21 @@ class Broker {
|
||||
$organizer['CN'] = $message->recipientName;
|
||||
}
|
||||
$attendee = $event->add('ATTENDEE', $message->sender, [
|
||||
'PARTSTAT' => $instance['newstatus']
|
||||
'PARTSTAT' => $instance['newstatus'],
|
||||
]);
|
||||
if ($message->senderName) {
|
||||
$attendee['CN'] = $message->senderName;
|
||||
}
|
||||
$hasReply = true;
|
||||
|
||||
}
|
||||
|
||||
if ($hasReply) {
|
||||
$message->message = $icalMsg;
|
||||
|
||||
return [$message];
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -824,12 +802,13 @@ class Broker {
|
||||
* based on.
|
||||
* 11. significantChangeHash
|
||||
* 12. status
|
||||
*
|
||||
* @param VCalendar $calendar
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function parseEventInfo(VCalendar $calendar = null) {
|
||||
|
||||
protected function parseEventInfo(VCalendar $calendar = null)
|
||||
{
|
||||
$uid = null;
|
||||
$organizer = null;
|
||||
$organizerName = null;
|
||||
@ -868,7 +847,7 @@ class Broker {
|
||||
$organizer = $vevent->ORGANIZER->getNormalizedValue();
|
||||
$organizerName = isset($vevent->ORGANIZER['CN']) ? $vevent->ORGANIZER['CN'] : null;
|
||||
} else {
|
||||
if ($organizer !== $vevent->ORGANIZER->getNormalizedValue()) {
|
||||
if (strtoupper($organizer) !== strtoupper($vevent->ORGANIZER->getNormalizedValue())) {
|
||||
throw new SameOrganizerForAllComponentsException('Every instance of the event must have the same organizer.');
|
||||
}
|
||||
}
|
||||
@ -894,7 +873,7 @@ class Broker {
|
||||
foreach ($vevent->select('RRULE') as $rr) {
|
||||
foreach ($rr->getParts() as $key => $val) {
|
||||
// ignore default values (https://github.com/sabre-io/vobject/issues/126)
|
||||
if ($key === 'INTERVAL' && $val == 1) {
|
||||
if ('INTERVAL' === $key && 1 == $val) {
|
||||
continue;
|
||||
}
|
||||
if (is_array($val)) {
|
||||
@ -911,7 +890,7 @@ class Broker {
|
||||
|
||||
$recurId = isset($vevent->{'RECURRENCE-ID'}) ? $vevent->{'RECURRENCE-ID'}->getValue() : 'master';
|
||||
if (is_null($timezone)) {
|
||||
if ($recurId === 'master') {
|
||||
if ('master' === $recurId) {
|
||||
$timezone = $vevent->DTSTART->getDateTime()->getTimeZone();
|
||||
} else {
|
||||
$timezone = $vevent->{'RECURRENCE-ID'}->getDateTime()->getTimeZone();
|
||||
@ -919,10 +898,9 @@ class Broker {
|
||||
}
|
||||
if (isset($vevent->ATTENDEE)) {
|
||||
foreach ($vevent->ATTENDEE as $attendee) {
|
||||
|
||||
if ($this->scheduleAgentServerRules &&
|
||||
isset($attendee['SCHEDULE-AGENT']) &&
|
||||
strtoupper($attendee['SCHEDULE-AGENT']->getValue()) === 'CLIENT'
|
||||
'CLIENT' === strtoupper($attendee['SCHEDULE-AGENT']->getValue())
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
@ -936,7 +914,6 @@ class Broker {
|
||||
strtoupper($attendee['SCHEDULE-FORCE-SEND']) :
|
||||
null;
|
||||
|
||||
|
||||
if (isset($attendees[$attendee->getNormalizedValue()])) {
|
||||
$attendees[$attendee->getNormalizedValue()]['instances'][$recurId] = [
|
||||
'id' => $recurId,
|
||||
@ -956,10 +933,8 @@ class Broker {
|
||||
'forceSend' => $forceSend,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
$instances[$recurId] = $vevent;
|
||||
|
||||
}
|
||||
|
||||
foreach ($this->significantChangeProperties as $prop) {
|
||||
@ -968,9 +943,9 @@ class Broker {
|
||||
|
||||
$significantChangeHash .= $prop.':';
|
||||
|
||||
if ($prop === 'EXDATE') {
|
||||
if ('EXDATE' === $prop) {
|
||||
$significantChangeHash .= implode(',', $exdate).';';
|
||||
} elseif ($prop === 'RRULE') {
|
||||
} elseif ('RRULE' === $prop) {
|
||||
$significantChangeHash .= implode(',', $rrule).';';
|
||||
} else {
|
||||
foreach ($propertyValues as $val) {
|
||||
@ -996,7 +971,5 @@ class Broker {
|
||||
'significantChangeHash',
|
||||
'status'
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -11,5 +11,6 @@ use Exception;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class ITipException extends Exception {
|
||||
class ITipException extends Exception
|
||||
{
|
||||
}
|
||||
|
15
vendor/sabre/vobject/lib/ITip/Message.php
vendored
15
vendor/sabre/vobject/lib/ITip/Message.php
vendored
@ -14,8 +14,8 @@ namespace Sabre\VObject\ITip;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Message {
|
||||
|
||||
class Message
|
||||
{
|
||||
/**
|
||||
* The object's UID.
|
||||
*
|
||||
@ -123,19 +123,14 @@ class Message {
|
||||
*
|
||||
* @return mixed bool|string
|
||||
*/
|
||||
function getScheduleStatus() {
|
||||
|
||||
public function getScheduleStatus()
|
||||
{
|
||||
if (!$this->scheduleStatus) {
|
||||
|
||||
return false;
|
||||
|
||||
} else {
|
||||
|
||||
list($scheduleStatus) = explode(';', $this->scheduleStatus);
|
||||
|
||||
return $scheduleStatus;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,6 +13,6 @@ namespace Sabre\VObject\ITip;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class SameOrganizerForAllComponentsException extends ITipException {
|
||||
|
||||
class SameOrganizerForAllComponentsException extends ITipException
|
||||
{
|
||||
}
|
||||
|
@ -10,5 +10,6 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class InvalidDataException extends \Exception {
|
||||
class InvalidDataException extends \Exception
|
||||
{
|
||||
}
|
||||
|
76
vendor/sabre/vobject/lib/Node.php
vendored
76
vendor/sabre/vobject/lib/Node.php
vendored
@ -11,13 +11,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
abstract class Node
|
||||
implements \IteratorAggregate,
|
||||
\ArrayAccess,
|
||||
\Countable,
|
||||
\JsonSerializable,
|
||||
Xml\XmlSerializable {
|
||||
|
||||
abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable, \JsonSerializable, Xml\XmlSerializable
|
||||
{
|
||||
/**
|
||||
* The following constants are used by the validate() method.
|
||||
*
|
||||
@ -70,7 +65,7 @@ abstract class Node
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract function serialize();
|
||||
abstract public function serialize();
|
||||
|
||||
/**
|
||||
* This method returns an array, with the representation as it should be
|
||||
@ -78,31 +73,26 @@ abstract class Node
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract function jsonSerialize();
|
||||
abstract public function jsonSerialize();
|
||||
|
||||
/**
|
||||
* This method serializes the data into XML. This is used to create xCard or
|
||||
* xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
abstract function xmlSerialize(Xml\Writer $writer);
|
||||
abstract public function xmlSerialize(Xml\Writer $writer);
|
||||
|
||||
/**
|
||||
* Call this method on a document if you're done using it.
|
||||
*
|
||||
* It's intended to remove all circular references, so PHP can easily clean
|
||||
* it up.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function destroy() {
|
||||
|
||||
public function destroy()
|
||||
{
|
||||
$this->parent = null;
|
||||
$this->root = null;
|
||||
|
||||
}
|
||||
|
||||
/* {{{ IteratorAggregator interface */
|
||||
@ -112,14 +102,13 @@ abstract class Node
|
||||
*
|
||||
* @return ElementList
|
||||
*/
|
||||
function getIterator() {
|
||||
|
||||
public function getIterator()
|
||||
{
|
||||
if (!is_null($this->iterator)) {
|
||||
return $this->iterator;
|
||||
}
|
||||
|
||||
return new ElementList([$this]);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -128,13 +117,10 @@ abstract class Node
|
||||
* Note that this is not actually part of the iterator interface
|
||||
*
|
||||
* @param ElementList $iterator
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setIterator(ElementList $iterator) {
|
||||
|
||||
public function setIterator(ElementList $iterator)
|
||||
{
|
||||
$this->iterator = $iterator;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -159,10 +145,9 @@ abstract class Node
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
return [];
|
||||
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
@ -174,18 +159,17 @@ abstract class Node
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function count() {
|
||||
|
||||
public function count()
|
||||
{
|
||||
$it = $this->getIterator();
|
||||
return $it->count();
|
||||
|
||||
return $it->count();
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
/* {{{ ArrayAccess Interface */
|
||||
|
||||
|
||||
/**
|
||||
* Checks if an item exists through ArrayAccess.
|
||||
*
|
||||
@ -195,11 +179,11 @@ abstract class Node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function offsetExists($offset) {
|
||||
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
$iterator = $this->getIterator();
|
||||
return $iterator->offsetExists($offset);
|
||||
|
||||
return $iterator->offsetExists($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -211,11 +195,11 @@ abstract class Node
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function offsetGet($offset) {
|
||||
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
$iterator = $this->getIterator();
|
||||
return $iterator->offsetGet($offset);
|
||||
|
||||
return $iterator->offsetGet($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -225,11 +209,9 @@ abstract class Node
|
||||
*
|
||||
* @param int $offset
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function offsetSet($offset, $value) {
|
||||
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
$iterator = $this->getIterator();
|
||||
$iterator->offsetSet($offset, $value);
|
||||
|
||||
@ -238,6 +220,7 @@ abstract class Node
|
||||
// This method always throws an exception, so we ignore the closing
|
||||
// brace
|
||||
}
|
||||
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
/**
|
||||
@ -246,11 +229,9 @@ abstract class Node
|
||||
* This method just forwards the request to the inner iterator
|
||||
*
|
||||
* @param int $offset
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function offsetUnset($offset) {
|
||||
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
$iterator = $this->getIterator();
|
||||
$iterator->offsetUnset($offset);
|
||||
|
||||
@ -259,6 +240,7 @@ abstract class Node
|
||||
// This method always throws an exception, so we ignore the closing
|
||||
// brace
|
||||
}
|
||||
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
/* }}} */
|
||||
|
20
vendor/sabre/vobject/lib/PHPUnitAssertions.php
vendored
20
vendor/sabre/vobject/lib/PHPUnitAssertions.php
vendored
@ -3,7 +3,7 @@
|
||||
namespace Sabre\VObject;
|
||||
|
||||
/**
|
||||
* PHPUnit Assertions
|
||||
* PHPUnit Assertions.
|
||||
*
|
||||
* This trait can be added to your unittest to make it easier to test iCalendar
|
||||
* and/or vCards.
|
||||
@ -12,8 +12,8 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
trait PHPUnitAssertions {
|
||||
|
||||
trait PHPUnitAssertions
|
||||
{
|
||||
/**
|
||||
* This method tests wether two vcards or icalendar objects are
|
||||
* semantically identical.
|
||||
@ -32,11 +32,10 @@ trait PHPUnitAssertions {
|
||||
* @param resource|string|Component $actual
|
||||
* @param string $message
|
||||
*/
|
||||
function assertVObjectEqualsVObject($expected, $actual, $message = '') {
|
||||
|
||||
public function assertVObjectEqualsVObject($expected, $actual, $message = '')
|
||||
{
|
||||
$self = $this;
|
||||
$getObj = function ($input) use ($self) {
|
||||
|
||||
if (is_resource($input)) {
|
||||
$input = stream_get_contents($input);
|
||||
}
|
||||
@ -47,11 +46,11 @@ trait PHPUnitAssertions {
|
||||
$this->fail('Input must be a string, stream or VObject component');
|
||||
}
|
||||
unset($input->PRODID);
|
||||
if ($input instanceof Component\VCalendar && (string)$input->CALSCALE === 'GREGORIAN') {
|
||||
if ($input instanceof Component\VCalendar && 'GREGORIAN' === (string) $input->CALSCALE) {
|
||||
unset($input->CALSCALE);
|
||||
}
|
||||
return $input;
|
||||
|
||||
return $input;
|
||||
};
|
||||
|
||||
$expected = $getObj($expected)->serialize();
|
||||
@ -61,13 +60,11 @@ trait PHPUnitAssertions {
|
||||
preg_match_all('|^([A-Z]+):\\*\\*ANY\\*\\*\r$|m', $expected, $matches, PREG_SET_ORDER);
|
||||
|
||||
foreach ($matches as $match) {
|
||||
|
||||
$actual = preg_replace(
|
||||
'|^'.preg_quote($match[1], '|').':(.*)\r$|m',
|
||||
$match[1].':**ANY**'."\r",
|
||||
$actual
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
$this->assertEquals(
|
||||
@ -75,8 +72,5 @@ trait PHPUnitAssertions {
|
||||
$actual,
|
||||
$message
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
99
vendor/sabre/vobject/lib/Parameter.php
vendored
99
vendor/sabre/vobject/lib/Parameter.php
vendored
@ -17,8 +17,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Parameter extends Node {
|
||||
|
||||
class Parameter extends Node
|
||||
{
|
||||
/**
|
||||
* Parameter name.
|
||||
*
|
||||
@ -29,7 +29,7 @@ class Parameter extends Node {
|
||||
/**
|
||||
* vCard 2.1 allows parameters to be encoded without a name.
|
||||
*
|
||||
* We can deduce the parameter name based on it's value.
|
||||
* We can deduce the parameter name based on its value.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
@ -50,8 +50,8 @@ class Parameter extends Node {
|
||||
* @param string $name
|
||||
* @param string $value
|
||||
*/
|
||||
function __construct(Document $root, $name, $value = null) {
|
||||
|
||||
public function __construct(Document $root, $name, $value = null)
|
||||
{
|
||||
$this->name = strtoupper($name);
|
||||
$this->root = $root;
|
||||
if (is_null($name)) {
|
||||
@ -62,13 +62,12 @@ class Parameter extends Node {
|
||||
// If guessParameterNameByValue() returns an empty string
|
||||
// above, we're actually dealing with a parameter that has no value.
|
||||
// In that case we have to move the value to the name.
|
||||
if ($this->name === '') {
|
||||
if ('' === $this->name) {
|
||||
$this->noName = false;
|
||||
$this->name = strtoupper($value);
|
||||
} else {
|
||||
$this->setValue($value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -82,9 +81,9 @@ class Parameter extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
static function guessParameterNameByValue($value) {
|
||||
public static function guessParameterNameByValue($value)
|
||||
{
|
||||
switch (strtoupper($value)) {
|
||||
|
||||
// Encodings
|
||||
case '7-BIT':
|
||||
case 'QUOTED-PRINTABLE':
|
||||
@ -177,13 +176,10 @@ class Parameter extends Node {
|
||||
* This may be either a single, or multiple strings in an array.
|
||||
*
|
||||
* @param string|array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setValue($value) {
|
||||
|
||||
public function setValue($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -194,27 +190,23 @@ class Parameter extends Node {
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
function getValue() {
|
||||
|
||||
public function getValue()
|
||||
{
|
||||
if (is_array($this->value)) {
|
||||
return implode(',', $this->value);
|
||||
} else {
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets multiple values for this parameter.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setParts(array $value) {
|
||||
|
||||
public function setParts(array $value)
|
||||
{
|
||||
$this->value = $value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -224,8 +216,8 @@ class Parameter extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getParts() {
|
||||
|
||||
public function getParts()
|
||||
{
|
||||
if (is_array($this->value)) {
|
||||
return $this->value;
|
||||
} elseif (is_null($this->value)) {
|
||||
@ -233,7 +225,6 @@ class Parameter extends Node {
|
||||
} else {
|
||||
return [$this->value];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -243,17 +234,14 @@ class Parameter extends Node {
|
||||
* parameter value list.
|
||||
*
|
||||
* @param string|array $part
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function addValue($part) {
|
||||
|
||||
public function addValue($part)
|
||||
{
|
||||
if (is_null($this->value)) {
|
||||
$this->value = $part;
|
||||
} else {
|
||||
$this->value = array_merge((array) $this->value, (array) $part);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -267,13 +255,12 @@ class Parameter extends Node {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function has($value) {
|
||||
|
||||
public function has($value)
|
||||
{
|
||||
return in_array(
|
||||
strtolower($value),
|
||||
array_map('strtolower', (array) $this->value)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -281,25 +268,24 @@ class Parameter extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function serialize() {
|
||||
|
||||
public function serialize()
|
||||
{
|
||||
$value = $this->getParts();
|
||||
|
||||
if (count($value) === 0) {
|
||||
if (0 === count($value)) {
|
||||
return $this->name.'=';
|
||||
}
|
||||
|
||||
if ($this->root->getDocumentType() === Document::VCARD21 && $this->noName) {
|
||||
|
||||
if (Document::VCARD21 === $this->root->getDocumentType() && $this->noName) {
|
||||
return implode(';', $value);
|
||||
|
||||
}
|
||||
|
||||
return $this->name.'='.array_reduce(
|
||||
$value,
|
||||
function ($out, $item) {
|
||||
|
||||
if (!is_null($out)) $out .= ',';
|
||||
if (!is_null($out)) {
|
||||
$out .= ',';
|
||||
}
|
||||
|
||||
// If there's no special characters in the string, we'll use the simple
|
||||
// format.
|
||||
@ -330,12 +316,11 @@ class Parameter extends Node {
|
||||
'"' => '^\'',
|
||||
]
|
||||
).'"';
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -344,26 +329,22 @@ class Parameter extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function jsonSerialize() {
|
||||
|
||||
public function jsonSerialize()
|
||||
{
|
||||
return $this->value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes the data into XML. This is used to create xCard or
|
||||
* xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
function xmlSerialize(Xml\Writer $writer) {
|
||||
|
||||
public function xmlSerialize(Xml\Writer $writer)
|
||||
{
|
||||
foreach (explode(',', $this->value) as $value) {
|
||||
$writer->writeElement('text', $value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -371,10 +352,9 @@ class Parameter extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function __toString() {
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this->getValue();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -382,13 +362,12 @@ class Parameter extends Node {
|
||||
*
|
||||
* @return ElementList
|
||||
*/
|
||||
function getIterator() {
|
||||
|
||||
if (!is_null($this->iterator))
|
||||
public function getIterator()
|
||||
{
|
||||
if (!is_null($this->iterator)) {
|
||||
return $this->iterator;
|
||||
}
|
||||
|
||||
return $this->iterator = new ArrayIterator((array) $this->value);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
3
vendor/sabre/vobject/lib/ParseException.php
vendored
3
vendor/sabre/vobject/lib/ParseException.php
vendored
@ -9,5 +9,6 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class ParseException extends \Exception {
|
||||
class ParseException extends \Exception
|
||||
{
|
||||
}
|
||||
|
45
vendor/sabre/vobject/lib/Parser/Json.php
vendored
45
vendor/sabre/vobject/lib/Parser/Json.php
vendored
@ -4,6 +4,7 @@ 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;
|
||||
|
||||
@ -16,8 +17,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.
|
||||
*
|
||||
@ -43,10 +44,10 @@ class Json extends Parser {
|
||||
* @param resource|string|array|null $input
|
||||
* @param int $options
|
||||
*
|
||||
* @return Sabre\VObject\Document
|
||||
* @return \Sabre\VObject\Document
|
||||
*/
|
||||
function parse($input = null, $options = 0) {
|
||||
|
||||
public function parse($input = null, $options = 0)
|
||||
{
|
||||
if (!is_null($input)) {
|
||||
$this->setInput($input);
|
||||
}
|
||||
@ -67,20 +68,20 @@ class Json extends Parser {
|
||||
break;
|
||||
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) {
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -90,8 +91,8 @@ class Json extends Parser {
|
||||
*
|
||||
* @return \Sabre\VObject\Component
|
||||
*/
|
||||
function parseComponent(array $jComp) {
|
||||
|
||||
public function parseComponent(array $jComp)
|
||||
{
|
||||
// We can remove $self from PHP 5.4 onward.
|
||||
$self = $this;
|
||||
|
||||
@ -103,22 +104,21 @@ class Json extends Parser {
|
||||
);
|
||||
|
||||
if (isset($jComp[2])) {
|
||||
|
||||
$components = array_map(
|
||||
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
|
||||
*/
|
||||
function parseProperty(array $jProp) {
|
||||
|
||||
public function parseProperty(array $jProp)
|
||||
{
|
||||
list(
|
||||
$propertyName,
|
||||
$parameters,
|
||||
@ -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 ($defaultPropertyClass === 'Sabre\VObject\Property\FlatText') {
|
||||
if ('Sabre\VObject\Property\FlatText' === $defaultPropertyClass) {
|
||||
$defaultPropertyClass = 'Sabre\VObject\Property\Text';
|
||||
}
|
||||
|
||||
@ -168,22 +168,19 @@ 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
|
||||
*/
|
||||
function setInput($input) {
|
||||
|
||||
public function setInput($input)
|
||||
{
|
||||
if (is_resource($input)) {
|
||||
$input = stream_get_contents($input);
|
||||
}
|
||||
@ -191,7 +188,5 @@ class Json extends Parser {
|
||||
$input = json_decode($input);
|
||||
}
|
||||
$this->input = $input;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
125
vendor/sabre/vobject/lib/Parser/MimeDir.php
vendored
125
vendor/sabre/vobject/lib/Parser/MimeDir.php
vendored
@ -7,6 +7,7 @@ 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;
|
||||
|
||||
/**
|
||||
@ -22,8 +23,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.
|
||||
*
|
||||
@ -72,10 +73,10 @@ class MimeDir extends Parser {
|
||||
* @param string|resource|null $input
|
||||
* @param int $options
|
||||
*
|
||||
* @return Sabre\VObject\Document
|
||||
* @return \Sabre\VObject\Document
|
||||
*/
|
||||
function parse($input = null, $options = 0) {
|
||||
|
||||
public function parse($input = null, $options = 0)
|
||||
{
|
||||
$this->root = null;
|
||||
|
||||
if (!is_null($input)) {
|
||||
@ -89,7 +90,6 @@ class MimeDir extends Parser {
|
||||
$this->parseDocument();
|
||||
|
||||
return $this->root;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -104,24 +104,21 @@ class MimeDir extends Parser {
|
||||
*
|
||||
* @param string $charset
|
||||
*/
|
||||
function setCharset($charset) {
|
||||
|
||||
public function setCharset($charset)
|
||||
{
|
||||
if (!in_array($charset, 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
|
||||
*/
|
||||
function setInput($input) {
|
||||
|
||||
public function setInput($input)
|
||||
{
|
||||
// Resetting the parser
|
||||
$this->lineIndex = 0;
|
||||
$this->startLine = 0;
|
||||
@ -137,24 +134,21 @@ 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)
|
||||
&& ord($line[0]) === 0xef
|
||||
&& ord($line[1]) === 0xbb
|
||||
&& ord($line[2]) === 0xbf) {
|
||||
&& 0xef === ord($line[0])
|
||||
&& 0xbb === ord($line[1])
|
||||
&& 0xbf === ord($line[2])) {
|
||||
$line = substr($line, 3);
|
||||
}
|
||||
|
||||
@ -172,24 +166,21 @@ class MimeDir extends Parser {
|
||||
$this->root = new $class([], false);
|
||||
|
||||
while (true) {
|
||||
|
||||
// Reading until we hit END:
|
||||
$line = $this->readLine();
|
||||
if (strtoupper(substr($line, 0, 4)) === 'END:') {
|
||||
if ('END:' === strtoupper(substr($line, 0, 4))) {
|
||||
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.'"');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -200,25 +191,22 @@ class MimeDir extends Parser {
|
||||
*
|
||||
* @return Node
|
||||
*/
|
||||
protected function parseLine($line) {
|
||||
|
||||
protected function parseLine($line)
|
||||
{
|
||||
// Start of a new component
|
||||
if (strtoupper(substr($line, 0, 6)) === 'BEGIN:') {
|
||||
|
||||
if ('BEGIN:' === strtoupper(substr($line, 0, 6))) {
|
||||
$component = $this->root->createComponent(substr($line, 6), [], false);
|
||||
|
||||
while (true) {
|
||||
|
||||
// Reading until we hit END:
|
||||
$line = $this->readLine();
|
||||
if (strtoupper(substr($line, 0, 4)) === 'END:') {
|
||||
if ('END:' === strtoupper(substr($line, 0, 4))) {
|
||||
break;
|
||||
}
|
||||
$result = $this->parseLine($line);
|
||||
if ($result) {
|
||||
$component->add($result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$name = strtoupper(substr($line, 4));
|
||||
@ -227,19 +215,16 @@ class MimeDir extends Parser {
|
||||
}
|
||||
|
||||
return $component;
|
||||
|
||||
} else {
|
||||
|
||||
// Property reader
|
||||
$property = $this->readProperty($line);
|
||||
if (!$property) {
|
||||
// Ignored line
|
||||
return false;
|
||||
}
|
||||
|
||||
return $property;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -248,7 +233,7 @@ class MimeDir extends Parser {
|
||||
*
|
||||
* If that was not the case, we store it here.
|
||||
*
|
||||
* @var null|string
|
||||
* @var string|null
|
||||
*/
|
||||
protected $lineBuffer;
|
||||
|
||||
@ -281,8 +266,8 @@ class MimeDir extends Parser {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function readLine() {
|
||||
|
||||
protected function readLine()
|
||||
{
|
||||
if (!\is_null($this->lineBuffer)) {
|
||||
$rawLine = $this->lineBuffer;
|
||||
$this->lineBuffer = null;
|
||||
@ -292,15 +277,15 @@ class MimeDir extends Parser {
|
||||
|
||||
$rawLine = \fgets($this->input);
|
||||
|
||||
if ($eof || (\feof($this->input) && $rawLine === false)) {
|
||||
if ($eof || (\feof($this->input) && false === $rawLine)) {
|
||||
throw new EofException('End of document reached prematurely');
|
||||
}
|
||||
if ($rawLine === false) {
|
||||
if (false === $rawLine) {
|
||||
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;
|
||||
|
||||
@ -308,13 +293,12 @@ 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 ($nextLine[0] === "\t" || $nextLine[0] === " ") {
|
||||
if ("\t" === $nextLine[0] || ' ' === $nextLine[0]) {
|
||||
$curLine = \substr($nextLine, 1);
|
||||
$line .= $curLine;
|
||||
$rawLine .= "\n ".$curLine;
|
||||
@ -322,20 +306,17 @@ class MimeDir extends Parser {
|
||||
$this->lineBuffer = $nextLine;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
$this->rawLine = $rawLine;
|
||||
return $line;
|
||||
|
||||
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 {
|
||||
@ -365,12 +346,12 @@ class MimeDir extends Parser {
|
||||
$property = [
|
||||
'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
|
||||
@ -378,9 +359,8 @@ 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'];
|
||||
@ -398,7 +378,7 @@ class MimeDir extends Parser {
|
||||
} else {
|
||||
$property['parameters'][$lastParam] = [
|
||||
$property['parameters'][$lastParam],
|
||||
$value
|
||||
$value,
|
||||
];
|
||||
}
|
||||
continue;
|
||||
@ -422,7 +402,6 @@ class MimeDir extends Parser {
|
||||
// @codeCoverageIgnoreStart
|
||||
throw new \LogicException('This code should not be reachable');
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
}
|
||||
|
||||
if (is_null($property['value'])) {
|
||||
@ -436,7 +415,7 @@ class MimeDir extends Parser {
|
||||
}
|
||||
|
||||
// vCard 2.1 states that parameters may appear without a name, and only
|
||||
// a value. We can deduce the value based on it's name.
|
||||
// a value. We can deduce the value based on its name.
|
||||
//
|
||||
// Our parser will get those as parameters without a value instead, so
|
||||
// we're filtering these parameters out first.
|
||||
@ -457,11 +436,11 @@ class MimeDir extends Parser {
|
||||
$propObj->add(null, $namelessParameter);
|
||||
}
|
||||
|
||||
if (strtoupper($propObj['ENCODING']) === 'QUOTED-PRINTABLE') {
|
||||
if ('QUOTED-PRINTABLE' === strtoupper($propObj['ENCODING'])) {
|
||||
$propObj->setQuotedPrintableValue($this->extractQuotedPrintableValue());
|
||||
} else {
|
||||
$charset = $this->charset;
|
||||
if ($this->root->getDocumentType() === Document::VCARD21 && isset($propObj['CHARSET'])) {
|
||||
if (Document::VCARD21 === $this->root->getDocumentType() && isset($propObj['CHARSET'])) {
|
||||
// vCard 2.1 allows the character set to be specified per property.
|
||||
$charset = (string) $propObj['CHARSET'];
|
||||
}
|
||||
@ -481,7 +460,6 @@ class MimeDir extends Parser {
|
||||
}
|
||||
|
||||
return $propObj;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -546,8 +524,8 @@ class MimeDir extends Parser {
|
||||
*
|
||||
* @return string|string[]
|
||||
*/
|
||||
static function unescapeValue($input, $delimiter = ';') {
|
||||
|
||||
public static function unescapeValue($input, $delimiter = ';')
|
||||
{
|
||||
$regex = '# (?: (\\\\ (?: \\\\ | N | n | ; | , ) )';
|
||||
if ($delimiter) {
|
||||
$regex .= ' | ('.$delimiter.')';
|
||||
@ -560,7 +538,6 @@ class MimeDir extends Parser {
|
||||
$result = '';
|
||||
|
||||
foreach ($matches as $match) {
|
||||
|
||||
switch ($match) {
|
||||
case '\\\\':
|
||||
$result .= '\\';
|
||||
@ -582,14 +559,12 @@ class MimeDir extends Parser {
|
||||
default:
|
||||
$result .= $match;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$resultArray[] = $result;
|
||||
return $delimiter ? $resultArray : $result;
|
||||
|
||||
return $delimiter ? $resultArray : $result;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -623,11 +598,9 @@ 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|\'))#',
|
||||
@ -658,8 +631,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
|
||||
@ -682,7 +655,7 @@ 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
|
||||
@ -691,7 +664,5 @@ class MimeDir extends Parser {
|
||||
}
|
||||
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
19
vendor/sabre/vobject/lib/Parser/Parser.php
vendored
19
vendor/sabre/vobject/lib/Parser/Parser.php
vendored
@ -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,12 +41,10 @@ abstract class Parser {
|
||||
* Optionally, it's possible to parse the input stream here.
|
||||
*
|
||||
* @param mixed $input
|
||||
* @param int $options Any parser options (OPTION constants).
|
||||
*
|
||||
* @return void
|
||||
* @param int $options any parser options (OPTION constants)
|
||||
*/
|
||||
function __construct($input = null, $options = 0) {
|
||||
|
||||
public function __construct($input = null, $options = 0)
|
||||
{
|
||||
if (!is_null($input)) {
|
||||
$this->setInput($input);
|
||||
}
|
||||
@ -66,15 +64,12 @@ abstract class Parser {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract function parse($input = null, $options = 0);
|
||||
abstract public function parse($input = null, $options = 0);
|
||||
|
||||
/**
|
||||
* Sets the input data.
|
||||
*
|
||||
* @param mixed $input
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
abstract function setInput($input);
|
||||
|
||||
abstract public function setInput($input);
|
||||
}
|
||||
|
105
vendor/sabre/vobject/lib/Parser/XML.php
vendored
105
vendor/sabre/vobject/lib/Parser/XML.php
vendored
@ -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,18 +50,15 @@ 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).
|
||||
*
|
||||
* @return void
|
||||
* @param int $options any parser options (OPTION constants)
|
||||
*/
|
||||
function __construct($input = null, $options = 0) {
|
||||
|
||||
public function __construct($input = null, $options = 0)
|
||||
{
|
||||
if (0 === $options) {
|
||||
$options = parent::OPTION_FORGIVING;
|
||||
}
|
||||
|
||||
parent::__construct($input, $options);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -72,10 +69,10 @@ class XML extends Parser {
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @return Sabre\VObject\Document
|
||||
* @return \Sabre\VObject\Document
|
||||
*/
|
||||
function parse($input = null, $options = 0) {
|
||||
|
||||
public function parse($input = null, $options = 0)
|
||||
{
|
||||
if (!is_null($input)) {
|
||||
$this->setInput($input);
|
||||
}
|
||||
@ -89,7 +86,6 @@ class XML extends Parser {
|
||||
}
|
||||
|
||||
switch ($this->input['name']) {
|
||||
|
||||
case '{'.self::XCAL_NAMESPACE.'}icalendar':
|
||||
$this->root = new VCalendar([], false);
|
||||
$this->pointer = &$this->input['value'][0];
|
||||
@ -98,20 +94,17 @@ class XML extends Parser {
|
||||
|
||||
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;
|
||||
@ -121,15 +114,11 @@ 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);
|
||||
@ -141,21 +130,17 @@ 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);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -163,13 +148,10 @@ class XML extends Parser {
|
||||
*
|
||||
* @param Component $parentComponent
|
||||
* @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;
|
||||
@ -178,9 +160,8 @@ class XML extends Parser {
|
||||
$propertyType = 'text';
|
||||
|
||||
// A property which is not part of the standard.
|
||||
if ($namespace !== self::XCAL_NAMESPACE
|
||||
&& $namespace !== self::XCARD_NAMESPACE) {
|
||||
|
||||
if (self::XCAL_NAMESPACE !== $namespace
|
||||
&& self::XCARD_NAMESPACE !== $namespace) {
|
||||
$propertyName = 'xml';
|
||||
$value = '<'.$tagName.' xmlns="'.$namespace.'"';
|
||||
|
||||
@ -204,8 +185,7 @@ class XML extends Parser {
|
||||
}
|
||||
|
||||
// xCard group.
|
||||
if ($propertyName === 'group') {
|
||||
|
||||
if ('group' === $propertyName) {
|
||||
if (!isset($xmlProperty['attributes']['name'])) {
|
||||
continue;
|
||||
}
|
||||
@ -217,20 +197,18 @@ class XML extends Parser {
|
||||
);
|
||||
|
||||
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) {
|
||||
@ -239,11 +217,9 @@ class XML extends Parser {
|
||||
|
||||
$propertyParameters[static::getTagName($xmlParameter['name'])]
|
||||
= implode(',', $propertyParameterValues);
|
||||
|
||||
}
|
||||
|
||||
array_splice($xmlProperty['value'], $i, 1);
|
||||
|
||||
}
|
||||
|
||||
$propertyNameExtended = ($this->root instanceof VCalendar
|
||||
@ -251,7 +227,6 @@ class XML extends Parser {
|
||||
: 'xcard').':'.$propertyName;
|
||||
|
||||
switch ($propertyNameExtended) {
|
||||
|
||||
case 'xcal:geo':
|
||||
$propertyType = 'float';
|
||||
$propertyValue['latitude'] = 0;
|
||||
@ -277,6 +252,7 @@ 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':
|
||||
@ -290,16 +266,12 @@ 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'];
|
||||
}
|
||||
}
|
||||
@ -325,24 +297,19 @@ class XML extends Parser {
|
||||
$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,
|
||||
@ -354,9 +321,7 @@ class XML extends Parser {
|
||||
$this->parseVCalendarComponents($currentComponent);
|
||||
|
||||
$parentComponent->add($currentComponent);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -367,11 +332,9 @@ class XML extends Parser {
|
||||
* @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,
|
||||
@ -380,24 +343,20 @@ class XML extends Parser {
|
||||
);
|
||||
$parentComponent->add($property);
|
||||
$property->setXmlValue($value);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the input data.
|
||||
*
|
||||
* @param resource|string $input
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setInput($input) {
|
||||
|
||||
public 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']
|
||||
= 'Sabre\VObject\Parser\XML\Element\KeyValue';
|
||||
@ -405,11 +364,9 @@ class XML extends Parser {
|
||||
= 'Sabre\VObject\Parser\XML\Element\KeyValue';
|
||||
$reader->xml($input);
|
||||
$input = $reader->parse();
|
||||
|
||||
}
|
||||
|
||||
$this->input = $input;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -419,10 +376,10 @@ class XML extends Parser {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function getTagName($clarkedTagName) {
|
||||
|
||||
protected static function getTagName($clarkedTagName)
|
||||
{
|
||||
list(, $tagName) = SabreXml\Service::parseClarkNotation($clarkedTagName);
|
||||
return $tagName;
|
||||
|
||||
return $tagName;
|
||||
}
|
||||
}
|
||||
|
@ -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,11 +37,12 @@ class KeyValue extends SabreXml\Element\KeyValue {
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
static function xmlDeserialize(SabreXml\Reader $reader) {
|
||||
|
||||
public static function xmlDeserialize(SabreXml\Reader $reader)
|
||||
{
|
||||
// If there's no children, we don't do anything.
|
||||
if ($reader->isEmptyElement) {
|
||||
$reader->next();
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
@ -49,22 +50,16 @@ class KeyValue extends SabreXml\Element\KeyValue {
|
||||
$reader->read();
|
||||
|
||||
do {
|
||||
|
||||
if ($reader->nodeType === SabreXml\Reader::ELEMENT) {
|
||||
|
||||
if (SabreXml\Reader::ELEMENT === $reader->nodeType) {
|
||||
$name = $reader->localName;
|
||||
$values[$name] = $reader->parseCurrentElement()['value'];
|
||||
|
||||
} else {
|
||||
$reader->read();
|
||||
}
|
||||
|
||||
} while ($reader->nodeType !== SabreXml\Reader::END_ELEMENT);
|
||||
} while (SabreXml\Reader::END_ELEMENT !== $reader->nodeType);
|
||||
|
||||
$reader->read();
|
||||
|
||||
return $values;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
218
vendor/sabre/vobject/lib/Property.php
vendored
218
vendor/sabre/vobject/lib/Property.php
vendored
@ -14,8 +14,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
abstract class Property extends Node {
|
||||
|
||||
abstract class Property extends Node
|
||||
{
|
||||
/**
|
||||
* Property name.
|
||||
*
|
||||
@ -66,11 +66,9 @@ abstract class Property extends Node {
|
||||
* @param string|array|null $value
|
||||
* @param array $parameters List of parameters
|
||||
* @param string $group The vcard property group
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null) {
|
||||
|
||||
public function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->group = $group;
|
||||
|
||||
@ -83,7 +81,6 @@ abstract class Property extends Node {
|
||||
if (!is_null($value)) {
|
||||
$this->setValue($value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -92,13 +89,10 @@ abstract class Property extends Node {
|
||||
* This may be either a single, or multiple strings in an array.
|
||||
*
|
||||
* @param string|array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setValue($value) {
|
||||
|
||||
public function setValue($value)
|
||||
{
|
||||
$this->value = $value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -112,12 +106,12 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValue() {
|
||||
|
||||
public function getValue()
|
||||
{
|
||||
if (is_array($this->value)) {
|
||||
if (count($this->value) == 0) {
|
||||
if (0 == count($this->value)) {
|
||||
return;
|
||||
} elseif (count($this->value) === 1) {
|
||||
} elseif (1 === count($this->value)) {
|
||||
return $this->value[0];
|
||||
} else {
|
||||
return $this->getRawMimeDirValue();
|
||||
@ -125,20 +119,16 @@ abstract class Property extends Node {
|
||||
} else {
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a multi-valued property.
|
||||
*
|
||||
* @param array $parts
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setParts(array $parts) {
|
||||
|
||||
public function setParts(array $parts)
|
||||
{
|
||||
$this->value = $parts;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -149,8 +139,8 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getParts() {
|
||||
|
||||
public function getParts()
|
||||
{
|
||||
if (is_null($this->value)) {
|
||||
return [];
|
||||
} elseif (is_array($this->value)) {
|
||||
@ -158,7 +148,6 @@ abstract class Property extends Node {
|
||||
} else {
|
||||
return [$this->value];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -166,22 +155,22 @@ abstract class Property extends Node {
|
||||
*
|
||||
* If a parameter with same name already existed, the values will be
|
||||
* combined.
|
||||
* If nameless parameter is added, we try to guess it's name.
|
||||
* If nameless parameter is added, we try to guess its name.
|
||||
*
|
||||
* @param string $name
|
||||
* @param string|null|array $value
|
||||
* @param string|array|null $value
|
||||
*/
|
||||
function add($name, $value = null) {
|
||||
public function add($name, $value = null)
|
||||
{
|
||||
$noName = false;
|
||||
if ($name === null) {
|
||||
if (null === $name) {
|
||||
$name = Parameter::guessParameterNameByValue($value);
|
||||
$noName = true;
|
||||
}
|
||||
|
||||
if (isset($this->parameters[strtoupper($name)])) {
|
||||
$this->parameters[strtoupper($name)]->addValue($value);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$param = new Parameter($this->root, $name, $value);
|
||||
$param->noName = $noName;
|
||||
$this->parameters[$param->name] = $param;
|
||||
@ -193,10 +182,9 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function parameters() {
|
||||
|
||||
public function parameters()
|
||||
{
|
||||
return $this->parameters;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -207,7 +195,7 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract function getValueType();
|
||||
abstract public function getValueType();
|
||||
|
||||
/**
|
||||
* Sets a raw value coming from a mimedir (iCalendar/vCard) file.
|
||||
@ -216,32 +204,30 @@ abstract class Property extends Node {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
abstract function setRawMimeDirValue($val);
|
||||
abstract public function setRawMimeDirValue($val);
|
||||
|
||||
/**
|
||||
* Returns a raw mime-dir representation of the value.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract function getRawMimeDirValue();
|
||||
abstract public function getRawMimeDirValue();
|
||||
|
||||
/**
|
||||
* Turns the object back into a serialized blob.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function serialize() {
|
||||
|
||||
public function serialize()
|
||||
{
|
||||
$str = $this->name;
|
||||
if ($this->group) $str = $this->group . '.' . $this->name;
|
||||
if ($this->group) {
|
||||
$str = $this->group.'.'.$this->name;
|
||||
}
|
||||
|
||||
foreach ($this->parameters() as $param) {
|
||||
|
||||
$str .= ';'.$param->serialize();
|
||||
|
||||
}
|
||||
|
||||
$str .= ':'.$this->getRawMimeDirValue();
|
||||
@ -258,7 +244,6 @@ abstract class Property extends Node {
|
||||
|
||||
// remove single space after last CRLF
|
||||
return \substr($str, 0, -1);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -268,10 +253,9 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
return $this->getParts();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -280,17 +264,14 @@ abstract class Property extends Node {
|
||||
* The value must always be an array.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setJsonValue(array $value) {
|
||||
|
||||
if (count($value) === 1) {
|
||||
public function setJsonValue(array $value)
|
||||
{
|
||||
if (1 === count($value)) {
|
||||
$this->setValue(reset($value));
|
||||
} else {
|
||||
$this->setValue($value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -299,12 +280,12 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function jsonSerialize() {
|
||||
|
||||
public function jsonSerialize()
|
||||
{
|
||||
$parameters = [];
|
||||
|
||||
foreach ($this->parameters as $parameter) {
|
||||
if ($parameter->name === 'VALUE') {
|
||||
if ('VALUE' === $parameter->name) {
|
||||
continue;
|
||||
}
|
||||
$parameters[strtolower($parameter->name)] = $parameter->jsonSerialize();
|
||||
@ -330,70 +311,56 @@ abstract class Property extends Node {
|
||||
* object.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setXmlValue(array $value) {
|
||||
|
||||
public function setXmlValue(array $value)
|
||||
{
|
||||
$this->setJsonValue($value);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes the data into XML. This is used to create xCard or
|
||||
* xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
function xmlSerialize(Xml\Writer $writer) {
|
||||
|
||||
public function xmlSerialize(Xml\Writer $writer)
|
||||
{
|
||||
$parameters = [];
|
||||
|
||||
foreach ($this->parameters as $parameter) {
|
||||
|
||||
if ($parameter->name === 'VALUE') {
|
||||
if ('VALUE' === $parameter->name) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$parameters[] = $parameter;
|
||||
|
||||
}
|
||||
|
||||
$writer->startElement(strtolower($this->name));
|
||||
|
||||
if (!empty($parameters)) {
|
||||
|
||||
$writer->startElement('parameters');
|
||||
|
||||
foreach ($parameters as $parameter) {
|
||||
|
||||
$writer->startElement(strtolower($parameter->name));
|
||||
$writer->write($parameter);
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
$this->xmlSerializeValue($writer);
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes only the value of a property. This is used to
|
||||
* create xCard or xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
protected function xmlSerializeValue(Xml\Writer $writer) {
|
||||
|
||||
protected function xmlSerializeValue(Xml\Writer $writer)
|
||||
{
|
||||
$valueType = strtolower($this->getValueType());
|
||||
|
||||
foreach ($this->getJsonValue() as $values) {
|
||||
@ -401,7 +368,6 @@ abstract class Property extends Node {
|
||||
$writer->writeElement($valueType, $value);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -413,10 +379,9 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function __toString() {
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this->getValue();
|
||||
|
||||
}
|
||||
|
||||
/* ArrayAccess interface {{{ */
|
||||
@ -428,17 +393,21 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function offsetExists($name) {
|
||||
|
||||
if (is_int($name)) return parent::offsetExists($name);
|
||||
public function offsetExists($name)
|
||||
{
|
||||
if (is_int($name)) {
|
||||
return parent::offsetExists($name);
|
||||
}
|
||||
|
||||
$name = strtoupper($name);
|
||||
|
||||
foreach ($this->parameters as $parameter) {
|
||||
if ($parameter->name == $name) return true;
|
||||
if ($parameter->name == $name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -450,9 +419,11 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return Node
|
||||
*/
|
||||
function offsetGet($name) {
|
||||
|
||||
if (is_int($name)) return parent::offsetGet($name);
|
||||
public function offsetGet($name)
|
||||
{
|
||||
if (is_int($name)) {
|
||||
return parent::offsetGet($name);
|
||||
}
|
||||
$name = strtoupper($name);
|
||||
|
||||
if (!isset($this->parameters[$name])) {
|
||||
@ -460,7 +431,6 @@ abstract class Property extends Node {
|
||||
}
|
||||
|
||||
return $this->parameters[$name];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -468,11 +438,9 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function offsetSet($name, $value) {
|
||||
|
||||
public function offsetSet($name, $value)
|
||||
{
|
||||
if (is_int($name)) {
|
||||
parent::offsetSet($name, $value);
|
||||
// @codeCoverageIgnoreStart
|
||||
@ -484,18 +452,15 @@ abstract class Property extends Node {
|
||||
|
||||
$param = new Parameter($this->root, $name, $value);
|
||||
$this->parameters[$param->name] = $param;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes one or more parameters with the specified name.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function offsetUnset($name) {
|
||||
|
||||
public function offsetUnset($name)
|
||||
{
|
||||
if (is_int($name)) {
|
||||
parent::offsetUnset($name);
|
||||
// @codeCoverageIgnoreStart
|
||||
@ -506,23 +471,20 @@ abstract class Property extends Node {
|
||||
}
|
||||
|
||||
unset($this->parameters[strtoupper($name)]);
|
||||
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
/**
|
||||
* This method is automatically called when the object is cloned.
|
||||
* Specifically, this will ensure all child elements are also cloned.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __clone() {
|
||||
|
||||
public function __clone()
|
||||
{
|
||||
foreach ($this->parameters as $key => $child) {
|
||||
$this->parameters[$key] = clone $child;
|
||||
$this->parameters[$key]->parent = $this;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -543,13 +505,12 @@ abstract class Property extends Node {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$warnings = [];
|
||||
|
||||
// Checking if our value is UTF-8
|
||||
if (!StringUtil::isUTF8($this->getRawMimeDirValue())) {
|
||||
|
||||
$oldValue = $this->getRawMimeDirValue();
|
||||
$level = 3;
|
||||
if ($options & self::REPAIR) {
|
||||
@ -558,10 +519,8 @@ abstract class Property extends Node {
|
||||
$this->setRawMimeDirValue($newValue);
|
||||
$level = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (preg_match('%([\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', $oldValue, $matches)) {
|
||||
$message = 'Property contained a control character (0x'.bin2hex($matches[1]).')';
|
||||
} else {
|
||||
@ -589,21 +548,17 @@ abstract class Property extends Node {
|
||||
);
|
||||
// Removing every other invalid character
|
||||
$this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($encoding = $this->offsetGet('ENCODING')) {
|
||||
|
||||
if ($this->root->getDocumentType() === Document::VCARD40) {
|
||||
if (Document::VCARD40 === $this->root->getDocumentType()) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'message' => 'ENCODING parameter is not valid in vCard 4.',
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
} else {
|
||||
|
||||
$encoding = (string) $encoding;
|
||||
|
||||
$allowedEncoding = [];
|
||||
@ -617,18 +572,28 @@ abstract class Property extends Node {
|
||||
break;
|
||||
case Document::VCARD30:
|
||||
$allowedEncoding = ['B'];
|
||||
//Repair vCard30 that use BASE64 encoding
|
||||
if ($options & self::REPAIR) {
|
||||
if ('BASE64' === strtoupper($encoding)) {
|
||||
$encoding = 'B';
|
||||
$this['ENCODING'] = $encoding;
|
||||
$warnings[] = [
|
||||
'level' => 1,
|
||||
'message' => 'ENCODING=BASE64 has been transformed to ENCODING=B.',
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
if ($allowedEncoding && !in_array(strtoupper($encoding), $allowedEncoding)) {
|
||||
$warnings[] = [
|
||||
'level' => 3,
|
||||
'message' => 'ENCODING='.strtoupper($encoding).' is not valid for this document type.',
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Validating inner parameters
|
||||
@ -637,7 +602,6 @@ abstract class Property extends Node {
|
||||
}
|
||||
|
||||
return $warnings;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -645,17 +609,13 @@ abstract class Property extends Node {
|
||||
*
|
||||
* It's intended to remove all circular references, so PHP can easily clean
|
||||
* it up.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function destroy() {
|
||||
|
||||
public function destroy()
|
||||
{
|
||||
parent::destroy();
|
||||
foreach ($this->parameters as $param) {
|
||||
$param->destroy();
|
||||
}
|
||||
$this->parameters = [];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
47
vendor/sabre/vobject/lib/Property/Binary.php
vendored
47
vendor/sabre/vobject/lib/Property/Binary.php
vendored
@ -18,8 +18,8 @@ use Sabre\VObject\Property;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Binary extends Property {
|
||||
|
||||
class Binary extends Property
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -34,25 +34,18 @@ class Binary extends Property {
|
||||
* This may be either a single, or multiple strings in an array.
|
||||
*
|
||||
* @param string|array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setValue($value) {
|
||||
|
||||
public function setValue($value)
|
||||
{
|
||||
if (is_array($value)) {
|
||||
|
||||
if (count($value) === 1) {
|
||||
if (1 === count($value)) {
|
||||
$this->value = $value[0];
|
||||
} else {
|
||||
throw new \InvalidArgumentException('The argument must either be a string or an array with only one child');
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$this->value = $value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -62,13 +55,10 @@ class Binary extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->value = base64_decode($val);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -76,10 +66,9 @@ class Binary extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return base64_encode($this->value);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -90,10 +79,9 @@ class Binary extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'BINARY';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -103,10 +91,9 @@ class Binary extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
return [base64_encode($this->getValue())];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,14 +102,10 @@ class Binary extends Property {
|
||||
* The value must always be an array.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setJsonValue(array $value) {
|
||||
|
||||
public function setJsonValue(array $value)
|
||||
{
|
||||
$value = array_map('base64_decode', $value);
|
||||
parent::setJsonValue($value);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
31
vendor/sabre/vobject/lib/Property/Boolean.php
vendored
31
vendor/sabre/vobject/lib/Property/Boolean.php
vendored
@ -17,8 +17,8 @@ use
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Boolean extends Property {
|
||||
|
||||
class Boolean extends Property
|
||||
{
|
||||
/**
|
||||
* Sets a raw value coming from a mimedir (iCalendar/vCard) file.
|
||||
*
|
||||
@ -26,14 +26,11 @@ class Boolean extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
$val = strtoupper($val) === 'TRUE' ? true : false;
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$val = 'TRUE' === strtoupper($val) ? true : false;
|
||||
$this->setValue($val);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -41,10 +38,9 @@ class Boolean extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return $this->value ? 'TRUE' : 'FALSE';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -55,10 +51,9 @@ class Boolean extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'BOOLEAN';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -66,11 +61,9 @@ class Boolean extends Property {
|
||||
* object.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setXmlValue(array $value) {
|
||||
|
||||
public function setXmlValue(array $value)
|
||||
{
|
||||
$value = array_map(
|
||||
function ($value) {
|
||||
return 'true' === $value;
|
||||
@ -78,7 +71,5 @@ class Boolean extends Property {
|
||||
$value
|
||||
);
|
||||
parent::setXmlValue($value);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
12
vendor/sabre/vobject/lib/Property/FlatText.php
vendored
12
vendor/sabre/vobject/lib/Property/FlatText.php
vendored
@ -22,8 +22,8 @@ namespace Sabre\VObject\Property;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class FlatText extends Text {
|
||||
|
||||
class FlatText extends Text
|
||||
{
|
||||
/**
|
||||
* Field separator.
|
||||
*
|
||||
@ -37,14 +37,10 @@ class FlatText extends Text {
|
||||
* Overriding this so we're not splitting on a ; delimiter.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setQuotedPrintableValue($val) {
|
||||
|
||||
public function setQuotedPrintableValue($val)
|
||||
{
|
||||
$val = quoted_printable_decode($val);
|
||||
$this->setValue($val);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
52
vendor/sabre/vobject/lib/Property/FloatValue.php
vendored
52
vendor/sabre/vobject/lib/Property/FloatValue.php
vendored
@ -15,8 +15,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class FloatValue extends Property {
|
||||
|
||||
class FloatValue extends Property
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -32,17 +32,14 @@ class FloatValue extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$val = explode($this->delimiter, $val);
|
||||
foreach ($val as &$item) {
|
||||
$item = (float) $item;
|
||||
}
|
||||
$this->setParts($val);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -50,13 +47,12 @@ class FloatValue extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return implode(
|
||||
$this->delimiter,
|
||||
$this->getParts()
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -67,10 +63,9 @@ class FloatValue extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'FLOAT';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -80,20 +75,19 @@ class FloatValue extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
$val = array_map('floatval', $this->getParts());
|
||||
|
||||
// Special-casing the GEO property.
|
||||
//
|
||||
// See:
|
||||
// http://tools.ietf.org/html/draft-ietf-jcardcal-jcal-04#section-3.4.1.2
|
||||
if ($this->name === 'GEO') {
|
||||
if ('GEO' === $this->name) {
|
||||
return [$val];
|
||||
}
|
||||
|
||||
return $val;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -101,42 +95,32 @@ class FloatValue extends Property {
|
||||
* object.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setXmlValue(array $value) {
|
||||
|
||||
public function setXmlValue(array $value)
|
||||
{
|
||||
$value = array_map('floatval', $value);
|
||||
parent::setXmlValue($value);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes only the value of a property. This is used to
|
||||
* create xCard or xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
protected function xmlSerializeValue(Xml\Writer $writer) {
|
||||
|
||||
protected function xmlSerializeValue(Xml\Writer $writer)
|
||||
{
|
||||
// Special-casing the GEO property.
|
||||
//
|
||||
// See:
|
||||
// http://tools.ietf.org/html/rfc6321#section-3.4.1.2
|
||||
if ($this->name === 'GEO') {
|
||||
|
||||
if ('GEO' === $this->name) {
|
||||
$value = array_map('floatval', $this->getParts());
|
||||
|
||||
$writer->writeElement('latitude', $value[0]);
|
||||
$writer->writeElement('longitude', $value[1]);
|
||||
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
parent::xmlSerializeValue($writer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -14,8 +14,8 @@ use
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class CalAddress extends Text {
|
||||
|
||||
class CalAddress extends Text
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -32,10 +32,9 @@ class CalAddress extends Text {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'CAL-ADDRESS';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -48,14 +47,14 @@ class CalAddress extends Text {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getNormalizedValue() {
|
||||
|
||||
public function getNormalizedValue()
|
||||
{
|
||||
$input = $this->getValue();
|
||||
if (!strpos($input, ':')) {
|
||||
return $input;
|
||||
}
|
||||
list($schema, $everythingElse) = explode(':', $input, 2);
|
||||
return strtolower($schema) . ':' . $everythingElse;
|
||||
|
||||
return strtolower($schema).':'.$everythingElse;
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,6 @@ namespace Sabre\VObject\Property\ICalendar;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Date extends DateTime {
|
||||
|
||||
class Date extends DateTime
|
||||
{
|
||||
}
|
||||
|
@ -24,8 +24,8 @@ use Sabre\VObject\TimeZoneUtil;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class DateTime extends Property {
|
||||
|
||||
class DateTime extends Property
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -40,17 +40,14 @@ class DateTime extends Property {
|
||||
* You may also specify DateTime objects here.
|
||||
*
|
||||
* @param array $parts
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setParts(array $parts) {
|
||||
|
||||
public function setParts(array $parts)
|
||||
{
|
||||
if (isset($parts[0]) && $parts[0] instanceof DateTimeInterface) {
|
||||
$this->setDateTimes($parts);
|
||||
} else {
|
||||
parent::setParts($parts);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -61,11 +58,9 @@ class DateTime extends Property {
|
||||
* Instead of strings, you may also use DateTime here.
|
||||
*
|
||||
* @param string|array|DateTimeInterface $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setValue($value) {
|
||||
|
||||
public function setValue($value)
|
||||
{
|
||||
if (is_array($value) && isset($value[0]) && $value[0] instanceof DateTimeInterface) {
|
||||
$this->setDateTimes($value);
|
||||
} elseif ($value instanceof DateTimeInterface) {
|
||||
@ -73,7 +68,6 @@ class DateTime extends Property {
|
||||
} else {
|
||||
parent::setValue($value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -83,13 +77,10 @@ class DateTime extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->setValue(explode($this->delimiter, $val));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -97,10 +88,9 @@ class DateTime extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return implode($this->delimiter, $this->getParts());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -108,10 +98,9 @@ class DateTime extends Property {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function hasTime() {
|
||||
|
||||
return strtoupper((string)$this['VALUE']) !== 'DATE';
|
||||
|
||||
public function hasTime()
|
||||
{
|
||||
return 'DATE' !== strtoupper((string) $this['VALUE']);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -119,15 +108,14 @@ class DateTime extends Property {
|
||||
*
|
||||
* Note that DATE is always floating.
|
||||
*/
|
||||
function isFloating() {
|
||||
|
||||
public function isFloating()
|
||||
{
|
||||
return
|
||||
!$this->hasTime() ||
|
||||
(
|
||||
!isset($this['TZID']) &&
|
||||
strpos($this->getValue(), 'Z') === false
|
||||
false === strpos($this->getValue(), 'Z')
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -143,15 +131,16 @@ class DateTime extends Property {
|
||||
*
|
||||
* @param DateTimeZone $timeZone
|
||||
*
|
||||
* @return DateTimeImmutable
|
||||
* @return \DateTimeImmutable
|
||||
*/
|
||||
function getDateTime(DateTimeZone $timeZone = null) {
|
||||
|
||||
public function getDateTime(DateTimeZone $timeZone = null)
|
||||
{
|
||||
$dt = $this->getDateTimes($timeZone);
|
||||
if (!$dt) return;
|
||||
if (!$dt) {
|
||||
return;
|
||||
}
|
||||
|
||||
return $dt[0];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -163,11 +152,11 @@ class DateTime extends Property {
|
||||
*
|
||||
* @param DateTimeZone $timeZone
|
||||
*
|
||||
* @return DateTimeImmutable[]
|
||||
* @return \DateTimeImmutable[]
|
||||
* @return \DateTime[]
|
||||
*/
|
||||
function getDateTimes(DateTimeZone $timeZone = null) {
|
||||
|
||||
public function getDateTimes(DateTimeZone $timeZone = null)
|
||||
{
|
||||
// Does the property have a TZID?
|
||||
$tzid = $this['TZID'];
|
||||
|
||||
@ -179,22 +168,19 @@ class DateTime extends Property {
|
||||
foreach ($this->getParts() as $part) {
|
||||
$dts[] = DateTimeParser::parse($part, $timeZone);
|
||||
}
|
||||
return $dts;
|
||||
|
||||
return $dts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property as a DateTime object.
|
||||
*
|
||||
* @param DateTimeInterface $dt
|
||||
* @param bool isFloating If set to true, timezones will be ignored.
|
||||
*
|
||||
* @return void
|
||||
* @param bool isFloating If set to true, timezones will be ignored
|
||||
*/
|
||||
function setDateTime(DateTimeInterface $dt, $isFloating = false) {
|
||||
|
||||
public function setDateTime(DateTimeInterface $dt, $isFloating = false)
|
||||
{
|
||||
$this->setDateTimes([$dt], $isFloating);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -204,21 +190,17 @@ class DateTime extends Property {
|
||||
* the otehr values will be adjusted for that timezone
|
||||
*
|
||||
* @param DateTimeInterface[] $dt
|
||||
* @param bool isFloating If set to true, timezones will be ignored.
|
||||
*
|
||||
* @return void
|
||||
* @param bool isFloating If set to true, timezones will be ignored
|
||||
*/
|
||||
function setDateTimes(array $dt, $isFloating = false) {
|
||||
|
||||
public function setDateTimes(array $dt, $isFloating = false)
|
||||
{
|
||||
$values = [];
|
||||
|
||||
if ($this->hasTime()) {
|
||||
|
||||
$tz = null;
|
||||
$isUtc = false;
|
||||
|
||||
foreach ($dt as $d) {
|
||||
|
||||
if ($isFloating) {
|
||||
$values[] = $d->format('Ymd\\THis');
|
||||
continue;
|
||||
@ -238,25 +220,18 @@ class DateTime extends Property {
|
||||
} else {
|
||||
$values[] = $d->format('Ymd\\THis');
|
||||
}
|
||||
|
||||
}
|
||||
if ($isUtc || $isFloating) {
|
||||
$this->offsetUnset('TZID');
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
foreach ($dt as $d) {
|
||||
|
||||
$values[] = $d->format('Ymd');
|
||||
|
||||
}
|
||||
$this->offsetUnset('TZID');
|
||||
|
||||
}
|
||||
|
||||
$this->value = $values;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -267,10 +242,9 @@ class DateTime extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return $this->hasTime() ? 'DATE-TIME' : 'DATE';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -280,8 +254,8 @@ class DateTime extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
$dts = $this->getDateTimes();
|
||||
$hasTime = $this->hasTime();
|
||||
$isFloating = $this->isFloating();
|
||||
@ -291,17 +265,14 @@ class DateTime extends Property {
|
||||
|
||||
return array_map(
|
||||
function (DateTimeInterface $dt) use ($hasTime, $isUtc) {
|
||||
|
||||
if ($hasTime) {
|
||||
return $dt->format('Y-m-d\\TH:i:s').($isUtc ? 'Z' : '');
|
||||
} else {
|
||||
return $dt->format('Y-m-d');
|
||||
}
|
||||
|
||||
},
|
||||
$dts
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -310,11 +281,9 @@ class DateTime extends Property {
|
||||
* The value must always be an array.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setJsonValue(array $value) {
|
||||
|
||||
public function setJsonValue(array $value)
|
||||
{
|
||||
// dates and times in jCal have one difference to dates and times in
|
||||
// iCalendar. In jCal date-parts are separated by dashes, and
|
||||
// time-parts are separated by colons. It makes sense to just remove
|
||||
@ -322,14 +291,11 @@ class DateTime extends Property {
|
||||
$this->setValue(
|
||||
array_map(
|
||||
function ($item) {
|
||||
|
||||
return strtr($item, [':' => '', '-' => '']);
|
||||
|
||||
},
|
||||
$value
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -338,19 +304,16 @@ class DateTime extends Property {
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function offsetSet($name, $value) {
|
||||
|
||||
public function offsetSet($name, $value)
|
||||
{
|
||||
parent::offsetSet($name, $value);
|
||||
if (strtoupper($name) !== 'VALUE') {
|
||||
if ('VALUE' !== strtoupper($name)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// This will ensure that dates are correctly encoded.
|
||||
$this->setDateTimes($this->getDateTimes());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -375,8 +338,8 @@ class DateTime extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$messages = parent::validate($options);
|
||||
$valueType = $this->getValueType();
|
||||
$values = $this->getParts();
|
||||
@ -398,7 +361,7 @@ class DateTime extends Property {
|
||||
'node' => $this,
|
||||
];
|
||||
}
|
||||
return $messages;
|
||||
|
||||
return $messages;
|
||||
}
|
||||
}
|
||||
|
@ -16,8 +16,8 @@ use Sabre\VObject\Property;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Duration extends Property {
|
||||
|
||||
class Duration extends Property
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -33,13 +33,10 @@ class Duration extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->setValue(explode($this->delimiter, $val));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -47,10 +44,9 @@ class Duration extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return implode($this->delimiter, $this->getParts());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -61,10 +57,9 @@ class Duration extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'DURATION';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -74,12 +69,11 @@ class Duration extends Property {
|
||||
*
|
||||
* @return \DateInterval
|
||||
*/
|
||||
function getDateInterval() {
|
||||
|
||||
public function getDateInterval()
|
||||
{
|
||||
$parts = $this->getParts();
|
||||
$value = $parts[0];
|
||||
|
||||
return DateTimeParser::parseDuration($value);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -17,8 +17,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Period extends Property {
|
||||
|
||||
class Period extends Property
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -34,13 +34,10 @@ class Period extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->setValue(explode($this->delimiter, $val));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -48,10 +45,9 @@ class Period extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return implode($this->delimiter, $this->getParts());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -62,10 +58,9 @@ class Period extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'PERIOD';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -74,21 +69,16 @@ class Period extends Property {
|
||||
* The value must always be an array.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setJsonValue(array $value) {
|
||||
|
||||
public function setJsonValue(array $value)
|
||||
{
|
||||
$value = array_map(
|
||||
function ($item) {
|
||||
|
||||
return strtr(implode('/', $item), [':' => '', '-' => '']);
|
||||
|
||||
},
|
||||
$value
|
||||
);
|
||||
parent::setJsonValue($value);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -98,20 +88,19 @@ class Period extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
$return = [];
|
||||
foreach ($this->getParts() as $item) {
|
||||
|
||||
list($start, $end) = explode('/', $item, 2);
|
||||
|
||||
$start = DateTimeParser::parseDateTime($start);
|
||||
|
||||
// This is a duration value.
|
||||
if ($end[0] === 'P') {
|
||||
if ('P' === $end[0]) {
|
||||
$return[] = [
|
||||
$start->format('Y-m-d\\TH:i:s'),
|
||||
$end
|
||||
$end,
|
||||
];
|
||||
} else {
|
||||
$end = DateTimeParser::parseDateTime($end);
|
||||
@ -120,36 +109,29 @@ class Period extends Property {
|
||||
$end->format('Y-m-d\\TH:i:s'),
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $return;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes only the value of a property. This is used to
|
||||
* create xCard or xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
protected function xmlSerializeValue(Xml\Writer $writer) {
|
||||
|
||||
protected function xmlSerializeValue(Xml\Writer $writer)
|
||||
{
|
||||
$writer->startElement(strtolower($this->getValueType()));
|
||||
$value = $this->getJsonValue();
|
||||
$writer->writeElement('start', $value[0][0]);
|
||||
|
||||
if ($value[0][1][0] === 'P') {
|
||||
if ('P' === $value[0][1][0]) {
|
||||
$writer->writeElement('duration', $value[0][1]);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
$writer->writeElement('end', $value[0][1]);
|
||||
}
|
||||
|
||||
$writer->endElement();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,19 +22,17 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Recur extends Property {
|
||||
|
||||
class Recur extends Property
|
||||
{
|
||||
/**
|
||||
* Updates the current value.
|
||||
*
|
||||
* This may be either a single, or multiple strings in an array.
|
||||
*
|
||||
* @param string|array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setValue($value) {
|
||||
|
||||
public function setValue($value)
|
||||
{
|
||||
// If we're getting the data from json, we'll be receiving an object
|
||||
if ($value instanceof \StdClass) {
|
||||
$value = (array) $value;
|
||||
@ -43,15 +41,14 @@ class Recur extends Property {
|
||||
if (is_array($value)) {
|
||||
$newVal = [];
|
||||
foreach ($value as $k => $v) {
|
||||
|
||||
if (is_string($v)) {
|
||||
$v = strtoupper($v);
|
||||
|
||||
// The value had multiple sub-values
|
||||
if (strpos($v, ',') !== false) {
|
||||
if (false !== strpos($v, ',')) {
|
||||
$v = explode(',', $v);
|
||||
}
|
||||
if (strcmp($k, 'until') === 0) {
|
||||
if (0 === strcmp($k, 'until')) {
|
||||
$v = strtr($v, [':' => '', '-' => '']);
|
||||
}
|
||||
} elseif (is_array($v)) {
|
||||
@ -66,7 +63,6 @@ class Recur extends Property {
|
||||
} else {
|
||||
throw new \InvalidArgumentException('You must either pass a string, or a key=>value array');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -80,26 +76,24 @@ class Recur extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValue() {
|
||||
|
||||
public function getValue()
|
||||
{
|
||||
$out = [];
|
||||
foreach ($this->value as $key => $value) {
|
||||
$out[] = $key.'='.(is_array($value) ? implode(',', $value) : $value);
|
||||
}
|
||||
return strtoupper(implode(';', $out));
|
||||
|
||||
return strtoupper(implode(';', $out));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a multi-valued property.
|
||||
*
|
||||
* @param array $parts
|
||||
* @return void
|
||||
*/
|
||||
function setParts(array $parts) {
|
||||
|
||||
public function setParts(array $parts)
|
||||
{
|
||||
$this->setValue($parts);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -110,10 +104,9 @@ class Recur extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getParts() {
|
||||
|
||||
public function getParts()
|
||||
{
|
||||
return $this->value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -123,13 +116,10 @@ class Recur extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->setValue($val);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -137,10 +127,9 @@ class Recur extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return $this->getValue();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -151,10 +140,9 @@ class Recur extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'RECUR';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -164,39 +152,36 @@ class Recur extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
$values = [];
|
||||
foreach ($this->getParts() as $k => $v) {
|
||||
if (strcmp($k, 'UNTIL') === 0) {
|
||||
if (0 === strcmp($k, 'UNTIL')) {
|
||||
$date = new DateTime($this->root, null, $v);
|
||||
$values[strtolower($k)] = $date->getJsonValue()[0];
|
||||
} elseif (strcmp($k, 'COUNT') === 0) {
|
||||
} elseif (0 === strcmp($k, 'COUNT')) {
|
||||
$values[strtolower($k)] = intval($v);
|
||||
} else {
|
||||
$values[strtolower($k)] = $v;
|
||||
}
|
||||
}
|
||||
return [$values];
|
||||
|
||||
return [$values];
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes only the value of a property. This is used to
|
||||
* create xCard or xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
protected function xmlSerializeValue(Xml\Writer $writer) {
|
||||
|
||||
protected function xmlSerializeValue(Xml\Writer $writer)
|
||||
{
|
||||
$valueType = strtolower($this->getValueType());
|
||||
|
||||
foreach ($this->getJsonValue() as $value) {
|
||||
$writer->writeElement($valueType, $value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -206,12 +191,11 @@ class Recur extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
static function stringToArray($value) {
|
||||
|
||||
public static function stringToArray($value)
|
||||
{
|
||||
$value = strtoupper($value);
|
||||
$newValue = [];
|
||||
foreach (explode(';', $value) as $part) {
|
||||
|
||||
// Skipping empty parts.
|
||||
if (empty($part)) {
|
||||
continue;
|
||||
@ -219,11 +203,10 @@ class Recur extends Property {
|
||||
list($partName, $partValue) = explode('=', $part);
|
||||
|
||||
// The value itself had multiple values..
|
||||
if (strpos($partValue, ',') !== false) {
|
||||
if (false !== strpos($partValue, ',')) {
|
||||
$partValue = explode(',', $partValue);
|
||||
}
|
||||
$newValue[$partName] = $partValue;
|
||||
|
||||
}
|
||||
|
||||
return $newValue;
|
||||
@ -251,32 +234,31 @@ class Recur extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$repair = ($options & self::REPAIR);
|
||||
|
||||
$warnings = parent::validate($options);
|
||||
$values = $this->getParts();
|
||||
|
||||
foreach ($values as $key => $value) {
|
||||
|
||||
if ($value === '') {
|
||||
if ('' === $value) {
|
||||
$warnings[] = [
|
||||
'level' => $repair ? 1 : 3,
|
||||
'message' => 'Invalid value for '.$key.' in '.$this->name,
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
if ($repair) {
|
||||
unset($values[$key]);
|
||||
}
|
||||
} elseif ($key == 'BYMONTH') {
|
||||
} elseif ('BYMONTH' == $key) {
|
||||
$byMonth = (array) $value;
|
||||
foreach ($byMonth as $i => $v) {
|
||||
if (!is_numeric($v) || (int) $v < 1 || (int) $v > 12) {
|
||||
$warnings[] = [
|
||||
'level' => $repair ? 1 : 3,
|
||||
'message' => 'BYMONTH in RRULE must have value(s) between 1 and 12!',
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
if ($repair) {
|
||||
if (is_array($value)) {
|
||||
@ -291,14 +273,14 @@ class Recur extends Property {
|
||||
if (is_array($value) && empty($values[$key])) {
|
||||
unset($values[$key]);
|
||||
}
|
||||
} elseif ($key == 'BYWEEKNO') {
|
||||
} elseif ('BYWEEKNO' == $key) {
|
||||
$byWeekNo = (array) $value;
|
||||
foreach ($byWeekNo as $i => $v) {
|
||||
if (!is_numeric($v) || (int)$v < -53 || (int)$v == 0 || (int)$v > 53) {
|
||||
if (!is_numeric($v) || (int) $v < -53 || 0 == (int) $v || (int) $v > 53) {
|
||||
$warnings[] = [
|
||||
'level' => $repair ? 1 : 3,
|
||||
'message' => 'BYWEEKNO in RRULE must have value(s) from -53 to -1, or 1 to 53!',
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
if ($repair) {
|
||||
if (is_array($value)) {
|
||||
@ -313,14 +295,14 @@ class Recur extends Property {
|
||||
if (is_array($value) && empty($values[$key])) {
|
||||
unset($values[$key]);
|
||||
}
|
||||
} elseif ($key == 'BYYEARDAY') {
|
||||
} elseif ('BYYEARDAY' == $key) {
|
||||
$byYearDay = (array) $value;
|
||||
foreach ($byYearDay as $i => $v) {
|
||||
if (!is_numeric($v) || (int)$v < -366 || (int)$v == 0 || (int)$v > 366) {
|
||||
if (!is_numeric($v) || (int) $v < -366 || 0 == (int) $v || (int) $v > 366) {
|
||||
$warnings[] = [
|
||||
'level' => $repair ? 1 : 3,
|
||||
'message' => 'BYYEARDAY in RRULE must have value(s) from -366 to -1, or 1 to 366!',
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
if ($repair) {
|
||||
if (is_array($value)) {
|
||||
@ -336,13 +318,12 @@ class Recur extends Property {
|
||||
unset($values[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (!isset($values['FREQ'])) {
|
||||
$warnings[] = [
|
||||
'level' => $repair ? 1 : 3,
|
||||
'message' => 'FREQ is required in '.$this->name,
|
||||
'node' => $this
|
||||
'node' => $this,
|
||||
];
|
||||
if ($repair) {
|
||||
$this->parent->remove($this);
|
||||
@ -353,7 +334,5 @@ class Recur extends Property {
|
||||
}
|
||||
|
||||
return $warnings;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,8 +15,8 @@ use
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class IntegerValue extends Property {
|
||||
|
||||
class IntegerValue extends Property
|
||||
{
|
||||
/**
|
||||
* Sets a raw value coming from a mimedir (iCalendar/vCard) file.
|
||||
*
|
||||
@ -24,13 +24,10 @@ class IntegerValue extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->setValue((int) $val);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -38,10 +35,9 @@ class IntegerValue extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return $this->value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -52,10 +48,9 @@ class IntegerValue extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'INTEGER';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -65,10 +60,9 @@ class IntegerValue extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
return [(int) $this->getValue()];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -76,13 +70,10 @@ class IntegerValue extends Property {
|
||||
* object.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setXmlValue(array $value) {
|
||||
|
||||
public function setXmlValue(array $value)
|
||||
{
|
||||
$value = array_map('intval', $value);
|
||||
parent::setXmlValue($value);
|
||||
|
||||
}
|
||||
}
|
||||
|
101
vendor/sabre/vobject/lib/Property/Text.php
vendored
101
vendor/sabre/vobject/lib/Property/Text.php
vendored
@ -17,8 +17,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Text extends Property {
|
||||
|
||||
class Text extends Property
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -69,11 +69,9 @@ class Text extends Property {
|
||||
* @param string|array|null $value
|
||||
* @param array $parameters List of parameters
|
||||
* @param string $group The vcard property group
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null) {
|
||||
|
||||
public function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null)
|
||||
{
|
||||
// There's two types of multi-valued text properties:
|
||||
// 1. multivalue properties.
|
||||
// 2. structured value properties
|
||||
@ -84,7 +82,6 @@ class Text extends Property {
|
||||
}
|
||||
|
||||
parent::__construct($root, $name, $value, $parameters, $group);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -94,24 +91,19 @@ class Text extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->setValue(MimeDir::unescapeValue($val, $this->delimiter));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value as a quoted-printable encoded string.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setQuotedPrintableValue($val) {
|
||||
|
||||
public function setQuotedPrintableValue($val)
|
||||
{
|
||||
$val = quoted_printable_decode($val);
|
||||
|
||||
// Quoted printable only appears in vCard 2.1, and the only character
|
||||
@ -123,7 +115,6 @@ class Text extends Property {
|
||||
$regex = '# (?<!\\\\) ; #x';
|
||||
$matches = preg_split($regex, $val);
|
||||
$this->setValue($matches);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -131,8 +122,8 @@ class Text extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
$val = $this->getParts();
|
||||
|
||||
if (isset($this->minimumPropertyValues[$this->name])) {
|
||||
@ -140,7 +131,6 @@ class Text extends Property {
|
||||
}
|
||||
|
||||
foreach ($val as &$item) {
|
||||
|
||||
if (!is_array($item)) {
|
||||
$item = [$item];
|
||||
}
|
||||
@ -153,16 +143,14 @@ class Text extends Property {
|
||||
';' => '\;',
|
||||
',' => '\,',
|
||||
"\n" => '\n',
|
||||
"\r" => "",
|
||||
"\r" => '',
|
||||
]
|
||||
);
|
||||
}
|
||||
$item = implode(',', $item);
|
||||
|
||||
}
|
||||
|
||||
return implode($this->delimiter, $val);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -172,16 +160,16 @@ class Text extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
// Structured text values should always be returned as a single
|
||||
// array-item. Multi-value text should be returned as multiple items in
|
||||
// the top-array.
|
||||
if (in_array($this->name, $this->structuredValues)) {
|
||||
return [$this->getParts()];
|
||||
}
|
||||
return $this->getParts();
|
||||
|
||||
return $this->getParts();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -192,10 +180,9 @@ class Text extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'TEXT';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -203,10 +190,10 @@ class Text extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function serialize() {
|
||||
|
||||
public function serialize()
|
||||
{
|
||||
// We need to kick in a special type of encoding, if it's a 2.1 vcard.
|
||||
if ($this->root->getDocumentType() !== Document::VCARD21) {
|
||||
if (Document::VCARD21 !== $this->root->getDocumentType()) {
|
||||
return parent::serialize();
|
||||
}
|
||||
|
||||
@ -228,22 +215,19 @@ class Text extends Property {
|
||||
}
|
||||
|
||||
$str = $this->name;
|
||||
if ($this->group) $str = $this->group . '.' . $this->name;
|
||||
if ($this->group) {
|
||||
$str = $this->group.'.'.$this->name;
|
||||
}
|
||||
foreach ($this->parameters as $param) {
|
||||
|
||||
if ($param->getValue() === 'QUOTED-PRINTABLE') {
|
||||
if ('QUOTED-PRINTABLE' === $param->getValue()) {
|
||||
continue;
|
||||
}
|
||||
$str .= ';'.$param->serialize();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// If the resulting value contains a \n, we must encode it as
|
||||
// quoted-printable.
|
||||
if (\strpos($val, "\n") !== false) {
|
||||
|
||||
if (false !== \strpos($val, "\n")) {
|
||||
$str .= ';ENCODING=QUOTED-PRINTABLE:';
|
||||
$lastLine = $str;
|
||||
$out = null;
|
||||
@ -252,7 +236,7 @@ class Text extends Property {
|
||||
// encode newlines for us. Specifically, the \r\n sequence must in
|
||||
// vcards be encoded as =0D=OA and we must insert soft-newlines
|
||||
// every 75 bytes.
|
||||
for ($ii = 0;$ii < \strlen($val);$ii++) {
|
||||
for ($ii = 0; $ii < \strlen($val); ++$ii) {
|
||||
$ord = \ord($val[$ii]);
|
||||
// These characters are encoded as themselves.
|
||||
if ($ord >= 32 && $ord <= 126) {
|
||||
@ -265,11 +249,12 @@ class Text extends Property {
|
||||
$out .= $lastLine."=\r\n ";
|
||||
$lastLine = null;
|
||||
}
|
||||
|
||||
}
|
||||
if (!\is_null($lastLine)) $out .= $lastLine . "\r\n";
|
||||
return $out;
|
||||
if (!\is_null($lastLine)) {
|
||||
$out .= $lastLine."\r\n";
|
||||
}
|
||||
|
||||
return $out;
|
||||
} else {
|
||||
$str .= ':'.$val;
|
||||
|
||||
@ -285,21 +270,17 @@ class Text extends Property {
|
||||
|
||||
// remove single space after last CRLF
|
||||
return \substr($str, 0, -1);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes only the value of a property. This is used to
|
||||
* create xCard or xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
protected function xmlSerializeValue(Xml\Writer $writer) {
|
||||
|
||||
protected function xmlSerializeValue(Xml\Writer $writer)
|
||||
{
|
||||
$values = $this->getParts();
|
||||
|
||||
$map = function ($items) use ($values, $writer) {
|
||||
@ -312,7 +293,6 @@ class Text extends Property {
|
||||
};
|
||||
|
||||
switch ($this->name) {
|
||||
|
||||
// Special-casing the REQUEST-STATUS property.
|
||||
//
|
||||
// See:
|
||||
@ -332,14 +312,14 @@ class Text extends Property {
|
||||
'given',
|
||||
'additional',
|
||||
'prefix',
|
||||
'suffix'
|
||||
'suffix',
|
||||
]);
|
||||
break;
|
||||
|
||||
case 'GENDER':
|
||||
$map([
|
||||
'sex',
|
||||
'text'
|
||||
'text',
|
||||
]);
|
||||
break;
|
||||
|
||||
@ -351,21 +331,20 @@ class Text extends Property {
|
||||
'locality',
|
||||
'region',
|
||||
'code',
|
||||
'country'
|
||||
'country',
|
||||
]);
|
||||
break;
|
||||
|
||||
case 'CLIENTPIDMAP':
|
||||
$map([
|
||||
'sourceid',
|
||||
'uri'
|
||||
'uri',
|
||||
]);
|
||||
break;
|
||||
|
||||
default:
|
||||
parent::xmlSerializeValue($writer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -386,12 +365,11 @@ class Text extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$warnings = parent::validate($options);
|
||||
|
||||
if (isset($this->minimumPropertyValues[$this->name])) {
|
||||
|
||||
$minimum = $this->minimumPropertyValues[$this->name];
|
||||
$parts = $this->getParts();
|
||||
if (count($parts) < $minimum) {
|
||||
@ -405,9 +383,8 @@ class Text extends Property {
|
||||
$this->setParts($parts);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $warnings;
|
||||
|
||||
}
|
||||
}
|
||||
|
33
vendor/sabre/vobject/lib/Property/Time.php
vendored
33
vendor/sabre/vobject/lib/Property/Time.php
vendored
@ -13,8 +13,8 @@ use Sabre\VObject\DateTimeParser;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Time extends Text {
|
||||
|
||||
class Time extends Text
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -31,10 +31,9 @@ class Time extends Text {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'TIME';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -43,11 +42,9 @@ class Time extends Text {
|
||||
* The value must always be an array.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setJsonValue(array $value) {
|
||||
|
||||
public function setJsonValue(array $value)
|
||||
{
|
||||
// Removing colons from value.
|
||||
$value = str_replace(
|
||||
':',
|
||||
@ -55,12 +52,11 @@ class Time extends Text {
|
||||
$value
|
||||
);
|
||||
|
||||
if (count($value) === 1) {
|
||||
if (1 === count($value)) {
|
||||
$this->setValue(reset($value));
|
||||
} else {
|
||||
$this->setValue($value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -70,8 +66,8 @@ class Time extends Text {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
$parts = DateTimeParser::parseVCardTime($this->getValue());
|
||||
$timeStr = '';
|
||||
|
||||
@ -109,7 +105,7 @@ class Time extends Text {
|
||||
|
||||
// Timezone
|
||||
if (!is_null($parts['timezone'])) {
|
||||
if ($parts['timezone'] === 'Z') {
|
||||
if ('Z' === $parts['timezone']) {
|
||||
$timeStr .= 'Z';
|
||||
} else {
|
||||
$timeStr .=
|
||||
@ -118,7 +114,6 @@ class Time extends Text {
|
||||
}
|
||||
|
||||
return [$timeStr];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -126,11 +121,9 @@ class Time extends Text {
|
||||
* object.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setXmlValue(array $value) {
|
||||
|
||||
public function setXmlValue(array $value)
|
||||
{
|
||||
$value = array_map(
|
||||
function ($value) {
|
||||
return str_replace(':', '', $value);
|
||||
@ -138,7 +131,5 @@ class Time extends Text {
|
||||
$value
|
||||
);
|
||||
parent::setXmlValue($value);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
15
vendor/sabre/vobject/lib/Property/Unknown.php
vendored
15
vendor/sabre/vobject/lib/Property/Unknown.php
vendored
@ -12,8 +12,8 @@ namespace Sabre\VObject\Property;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Unknown extends Text {
|
||||
|
||||
class Unknown extends Text
|
||||
{
|
||||
/**
|
||||
* Returns the value, in the format it should be encoded for json.
|
||||
*
|
||||
@ -21,10 +21,9 @@ class Unknown extends Text {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
return [$this->getRawMimeDirValue()];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -35,10 +34,8 @@ class Unknown extends Text {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'UNKNOWN';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
30
vendor/sabre/vobject/lib/Property/Uri.php
vendored
30
vendor/sabre/vobject/lib/Property/Uri.php
vendored
@ -14,8 +14,8 @@ use Sabre\VObject\Property;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Uri extends Text {
|
||||
|
||||
class Uri extends Text
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -32,10 +32,9 @@ class Uri extends Text {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'URI';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -43,8 +42,8 @@ class Uri extends Text {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function parameters() {
|
||||
|
||||
public function parameters()
|
||||
{
|
||||
$parameters = parent::parameters();
|
||||
if (!isset($parameters['VALUE']) && in_array($this->name, ['URL', 'PHOTO'])) {
|
||||
// If we are encoding a URI value, and this URI value has no
|
||||
@ -57,8 +56,8 @@ class Uri extends Text {
|
||||
// See Issue #227 and #235
|
||||
$parameters['VALUE'] = new Parameter($this->root, 'VALUE', 'URI');
|
||||
}
|
||||
return $parameters;
|
||||
|
||||
return $parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -68,11 +67,9 @@ class Uri extends Text {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
// Normally we don't need to do any type of unescaping for these
|
||||
// properties, however.. we've noticed that Google Contacts
|
||||
// specifically escapes the colon (:) with a blackslash. While I have
|
||||
@ -81,7 +78,7 @@ class Uri extends Text {
|
||||
//
|
||||
// Good thing backslashes are not allowed in urls. Makes it easy to
|
||||
// assume that a backslash is always intended as an escape character.
|
||||
if ($this->name === 'URL') {
|
||||
if ('URL' === $this->name) {
|
||||
$regex = '# (?: (\\\\ (?: \\\\ | : ) ) ) #x';
|
||||
$matches = preg_split($regex, $val, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
|
||||
$newVal = '';
|
||||
@ -99,7 +96,6 @@ class Uri extends Text {
|
||||
} else {
|
||||
$this->value = strtr($val, ['\,' => ',']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -107,8 +103,8 @@ class Uri extends Text {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
if (is_array($this->value)) {
|
||||
$value = $this->value[0];
|
||||
} else {
|
||||
@ -116,7 +112,5 @@ class Uri extends Text {
|
||||
}
|
||||
|
||||
return strtr($value, [',' => '\,']);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
21
vendor/sabre/vobject/lib/Property/UtcOffset.php
vendored
21
vendor/sabre/vobject/lib/Property/UtcOffset.php
vendored
@ -11,8 +11,8 @@ namespace Sabre\VObject\Property;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class UtcOffset extends Text {
|
||||
|
||||
class UtcOffset extends Text
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -29,10 +29,9 @@ class UtcOffset extends Text {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'UTC-OFFSET';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -41,11 +40,9 @@ class UtcOffset extends Text {
|
||||
* The value must always be an array.
|
||||
*
|
||||
* @param array $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setJsonValue(array $value) {
|
||||
|
||||
public function setJsonValue(array $value)
|
||||
{
|
||||
$value = array_map(
|
||||
function ($value) {
|
||||
return str_replace(':', '', $value);
|
||||
@ -53,7 +50,6 @@ class UtcOffset extends Text {
|
||||
$value
|
||||
);
|
||||
parent::setJsonValue($value);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -63,8 +59,8 @@ class UtcOffset extends Text {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
return array_map(
|
||||
function ($value) {
|
||||
return substr($value, 0, -2).':'.
|
||||
@ -72,6 +68,5 @@ class UtcOffset extends Text {
|
||||
},
|
||||
parent::getJsonValue()
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
17
vendor/sabre/vobject/lib/Property/VCard/Date.php
vendored
17
vendor/sabre/vobject/lib/Property/VCard/Date.php
vendored
@ -11,8 +11,8 @@ namespace Sabre\VObject\Property\VCard;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Date extends DateAndOrTime {
|
||||
|
||||
class Date extends DateAndOrTime
|
||||
{
|
||||
/**
|
||||
* Returns the type of value.
|
||||
*
|
||||
@ -21,23 +21,18 @@ class Date extends DateAndOrTime {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'DATE';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property as a DateTime object.
|
||||
*
|
||||
* @param \DateTimeInterface $dt
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setDateTime(\DateTimeInterface $dt) {
|
||||
|
||||
public function setDateTime(\DateTimeInterface $dt)
|
||||
{
|
||||
$this->value = $dt->format('Ymd');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,12 +19,12 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class DateAndOrTime extends Property {
|
||||
|
||||
class DateAndOrTime extends Property
|
||||
{
|
||||
/**
|
||||
* Field separator.
|
||||
*
|
||||
* @var null|string
|
||||
* @var string|null
|
||||
*/
|
||||
public $delimiter = null;
|
||||
|
||||
@ -36,10 +36,9 @@ class DateAndOrTime extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'DATE-AND-OR-TIME';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -48,11 +47,9 @@ class DateAndOrTime extends Property {
|
||||
* You may also specify DateTimeInterface objects here.
|
||||
*
|
||||
* @param array $parts
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setParts(array $parts) {
|
||||
|
||||
public function setParts(array $parts)
|
||||
{
|
||||
if (count($parts) > 1) {
|
||||
throw new \InvalidArgumentException('Only one value allowed');
|
||||
}
|
||||
@ -61,7 +58,6 @@ class DateAndOrTime extends Property {
|
||||
} else {
|
||||
parent::setParts($parts);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -72,28 +68,23 @@ class DateAndOrTime extends Property {
|
||||
* Instead of strings, you may also use DateTimeInterface here.
|
||||
*
|
||||
* @param string|array|DateTimeInterface $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setValue($value) {
|
||||
|
||||
public function setValue($value)
|
||||
{
|
||||
if ($value instanceof DateTimeInterface) {
|
||||
$this->setDateTime($value);
|
||||
} else {
|
||||
parent::setValue($value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the property as a DateTime object.
|
||||
*
|
||||
* @param DateTimeInterface $dt
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setDateTime(DateTimeInterface $dt) {
|
||||
|
||||
public function setDateTime(DateTimeInterface $dt)
|
||||
{
|
||||
$tz = $dt->getTimeZone();
|
||||
$isUtc = in_array($tz->getName(), ['UTC', 'GMT', 'Z']);
|
||||
|
||||
@ -105,7 +96,6 @@ class DateAndOrTime extends Property {
|
||||
}
|
||||
|
||||
$this->value = $value;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -124,11 +114,11 @@ class DateAndOrTime extends Property {
|
||||
*
|
||||
* @return DateTimeImmutable
|
||||
*/
|
||||
function getDateTime() {
|
||||
|
||||
public function getDateTime()
|
||||
{
|
||||
$now = new DateTime();
|
||||
|
||||
$tzFormat = $now->getTimezone()->getOffset($now) === 0 ? '\\Z' : 'O';
|
||||
$tzFormat = 0 === $now->getTimezone()->getOffset($now) ? '\\Z' : 'O';
|
||||
$nowParts = DateTimeParser::parseVCardDateTime($now->format('Ymd\\This'.$tzFormat));
|
||||
|
||||
$dateParts = DateTimeParser::parseVCardDateTime($this->getValue());
|
||||
@ -141,8 +131,8 @@ class DateAndOrTime extends Property {
|
||||
$dateParts[$k] = $nowParts[$k];
|
||||
}
|
||||
}
|
||||
return new DateTimeImmutable("$dateParts[year]-$dateParts[month]-$dateParts[date] $dateParts[hour]:$dateParts[minute]:$dateParts[second] $dateParts[timezone]");
|
||||
|
||||
return new DateTimeImmutable("$dateParts[year]-$dateParts[month]-$dateParts[date] $dateParts[hour]:$dateParts[minute]:$dateParts[second] $dateParts[timezone]");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -152,15 +142,14 @@ class DateAndOrTime extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
$parts = DateTimeParser::parseVCardDateTime($this->getValue());
|
||||
|
||||
$dateStr = '';
|
||||
|
||||
// Year
|
||||
if (!is_null($parts['year'])) {
|
||||
|
||||
$dateStr .= $parts['year'];
|
||||
|
||||
if (!is_null($parts['month'])) {
|
||||
@ -168,26 +157,21 @@ class DateAndOrTime extends Property {
|
||||
// dash.
|
||||
$dateStr .= '-';
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if (!is_null($parts['month']) || !is_null($parts['date'])) {
|
||||
// Inserting two dashes
|
||||
$dateStr .= '--';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Month
|
||||
if (!is_null($parts['month'])) {
|
||||
|
||||
$dateStr .= $parts['month'];
|
||||
|
||||
if (isset($parts['date'])) {
|
||||
// If month and date are set, we need the separator dash.
|
||||
$dateStr .= '-';
|
||||
}
|
||||
|
||||
} elseif (isset($parts['date'])) {
|
||||
// If the month is empty, and a date is set, we need a 'empty
|
||||
// dash'
|
||||
@ -199,7 +183,6 @@ class DateAndOrTime extends Property {
|
||||
$dateStr .= $parts['date'];
|
||||
}
|
||||
|
||||
|
||||
// Early exit if we don't have a time string.
|
||||
if (is_null($parts['hour']) && is_null($parts['minute']) && is_null($parts['second'])) {
|
||||
return [$dateStr];
|
||||
@ -209,13 +192,11 @@ class DateAndOrTime extends Property {
|
||||
|
||||
// Hour
|
||||
if (!is_null($parts['hour'])) {
|
||||
|
||||
$dateStr .= $parts['hour'];
|
||||
|
||||
if (!is_null($parts['minute'])) {
|
||||
$dateStr .= ':';
|
||||
}
|
||||
|
||||
} else {
|
||||
// We know either minute or second _must_ be set, so we insert a
|
||||
// dash for an empty value.
|
||||
@ -224,13 +205,11 @@ class DateAndOrTime extends Property {
|
||||
|
||||
// Minute
|
||||
if (!is_null($parts['minute'])) {
|
||||
|
||||
$dateStr .= $parts['minute'];
|
||||
|
||||
if (!is_null($parts['second'])) {
|
||||
$dateStr .= ':';
|
||||
}
|
||||
|
||||
} elseif (isset($parts['second'])) {
|
||||
// Dash for empty minute
|
||||
$dateStr .= '-';
|
||||
@ -247,19 +226,16 @@ class DateAndOrTime extends Property {
|
||||
}
|
||||
|
||||
return [$dateStr];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes only the value of a property. This is used to
|
||||
* create xCard or xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
protected function xmlSerializeValue(Xml\Writer $writer) {
|
||||
|
||||
protected function xmlSerializeValue(Xml\Writer $writer)
|
||||
{
|
||||
$valueType = strtolower($this->getValueType());
|
||||
$parts = DateTimeParser::parseVCardDateAndOrTime($this->getValue());
|
||||
$value = '';
|
||||
@ -282,7 +258,6 @@ class DateAndOrTime extends Property {
|
||||
// }
|
||||
if (($d('year') || $d('month') || $d('date'))
|
||||
&& (!$d('hour') && !$d('minute') && !$d('second') && !$d('timezone'))) {
|
||||
|
||||
if ($d('year') && $d('month') && $d('date')) {
|
||||
$value .= $r('year').$r('month').$r('date');
|
||||
} elseif ($d('year') && $d('month') && !$d('date')) {
|
||||
@ -300,7 +275,6 @@ class DateAndOrTime extends Property {
|
||||
// }
|
||||
} elseif ((!$d('year') && !$d('month') && !$d('date'))
|
||||
&& ($d('hour') || $d('minute') || $d('second'))) {
|
||||
|
||||
if ($d('hour')) {
|
||||
$value .= $r('hour').$r('minute').$r('second');
|
||||
} elseif ($d('minute')) {
|
||||
@ -317,7 +291,6 @@ class DateAndOrTime extends Property {
|
||||
// ~ "(Z|[+\-]\d\d(\d\d)?)?" }
|
||||
// }
|
||||
} elseif ($d('date') && $d('hour')) {
|
||||
|
||||
if ($d('year') && $d('month') && $d('date')) {
|
||||
$value .= $r('year').$r('month').$r('date');
|
||||
} elseif (!$d('year') && $d('month') && $d('date')) {
|
||||
@ -328,11 +301,9 @@ class DateAndOrTime extends Property {
|
||||
|
||||
$value .= 'T'.$r('hour').$r('minute').$r('second').
|
||||
$r('timezone');
|
||||
|
||||
}
|
||||
|
||||
$writer->writeElement($valueType, $value);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -342,13 +313,10 @@ class DateAndOrTime extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->setValue($val);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -356,10 +324,9 @@ class DateAndOrTime extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return implode($this->delimiter, $this->getParts());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -384,8 +351,8 @@ class DateAndOrTime extends Property {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function validate($options = 0) {
|
||||
|
||||
public function validate($options = 0)
|
||||
{
|
||||
$messages = parent::validate($options);
|
||||
$value = $this->getValue();
|
||||
|
||||
@ -400,6 +367,5 @@ class DateAndOrTime extends Property {
|
||||
}
|
||||
|
||||
return $messages;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -11,8 +11,8 @@ namespace Sabre\VObject\Property\VCard;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class DateTime extends DateAndOrTime {
|
||||
|
||||
class DateTime extends DateAndOrTime
|
||||
{
|
||||
/**
|
||||
* Returns the type of value.
|
||||
*
|
||||
@ -21,10 +21,8 @@ class DateTime extends DateAndOrTime {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'DATE-TIME';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -14,8 +14,8 @@ use
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class LanguageTag extends Property {
|
||||
|
||||
class LanguageTag extends Property
|
||||
{
|
||||
/**
|
||||
* Sets a raw value coming from a mimedir (iCalendar/vCard) file.
|
||||
*
|
||||
@ -23,13 +23,10 @@ class LanguageTag extends Property {
|
||||
* not yet done, but parameters are not included.
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setRawMimeDirValue($val) {
|
||||
|
||||
public function setRawMimeDirValue($val)
|
||||
{
|
||||
$this->setValue($val);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -37,10 +34,9 @@ class LanguageTag extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getRawMimeDirValue() {
|
||||
|
||||
public function getRawMimeDirValue()
|
||||
{
|
||||
return $this->getValue();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -51,10 +47,8 @@ class LanguageTag extends Property {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'LANGUAGE-TAG';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,8 +15,8 @@ use Sabre\Xml;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class TimeStamp extends Text {
|
||||
|
||||
class TimeStamp extends Text
|
||||
{
|
||||
/**
|
||||
* In case this is a multi-value property. This string will be used as a
|
||||
* delimiter.
|
||||
@ -33,10 +33,9 @@ class TimeStamp extends Text {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getValueType() {
|
||||
|
||||
public function getValueType()
|
||||
{
|
||||
return 'TIMESTAMP';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -46,8 +45,8 @@ class TimeStamp extends Text {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getJsonValue() {
|
||||
|
||||
public function getJsonValue()
|
||||
{
|
||||
$parts = DateTimeParser::parseVCardDateTime($this->getValue());
|
||||
|
||||
$dateStr =
|
||||
@ -64,23 +63,19 @@ class TimeStamp extends Text {
|
||||
}
|
||||
|
||||
return [$dateStr];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method serializes only the value of a property. This is used to
|
||||
* create xCard or xCal documents.
|
||||
*
|
||||
* @param Xml\Writer $writer XML writer.
|
||||
*
|
||||
* @return void
|
||||
* @param Xml\Writer $writer XML writer
|
||||
*/
|
||||
protected function xmlSerializeValue(Xml\Writer $writer) {
|
||||
|
||||
protected function xmlSerializeValue(Xml\Writer $writer)
|
||||
{
|
||||
// xCard is the only XML and JSON format that has the same date and time
|
||||
// format than vCard.
|
||||
$valueType = strtolower($this->getValueType());
|
||||
$writer->writeElement($valueType, $this->getValue());
|
||||
|
||||
}
|
||||
}
|
||||
|
23
vendor/sabre/vobject/lib/Reader.php
vendored
23
vendor/sabre/vobject/lib/Reader.php
vendored
@ -12,8 +12,8 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Reader {
|
||||
|
||||
class Reader
|
||||
{
|
||||
/**
|
||||
* If this option is passed to the reader, it will be less strict about the
|
||||
* validity of the lines.
|
||||
@ -37,16 +37,16 @@ class Reader {
|
||||
* @param string|resource $data
|
||||
* @param int $options
|
||||
* @param string $charset
|
||||
*
|
||||
* @return Document
|
||||
*/
|
||||
static function read($data, $options = 0, $charset = 'UTF-8') {
|
||||
|
||||
public static function read($data, $options = 0, $charset = 'UTF-8')
|
||||
{
|
||||
$parser = new Parser\MimeDir();
|
||||
$parser->setCharset($charset);
|
||||
$result = $parser->parse($data, $options);
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -55,7 +55,7 @@ class Reader {
|
||||
* The options argument is a bitfield. Pass any of the OPTIONS constant to
|
||||
* alter the parsers' behaviour.
|
||||
*
|
||||
* You can either a string, a readable stream, or an array for it's input.
|
||||
* You can either a string, a readable stream, or an array for its input.
|
||||
* Specifying the array is useful if json_decode was already called on the
|
||||
* input.
|
||||
*
|
||||
@ -64,13 +64,12 @@ class Reader {
|
||||
*
|
||||
* @return Document
|
||||
*/
|
||||
static function readJson($data, $options = 0) {
|
||||
|
||||
public static function readJson($data, $options = 0)
|
||||
{
|
||||
$parser = new Parser\Json();
|
||||
$result = $parser->parse($data, $options);
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -86,13 +85,11 @@ class Reader {
|
||||
*
|
||||
* @return Document
|
||||
*/
|
||||
static function readXML($data, $options = 0) {
|
||||
|
||||
public static function readXML($data, $options = 0)
|
||||
{
|
||||
$parser = new Parser\XML();
|
||||
$result = $parser->parse($data, $options);
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
93
vendor/sabre/vobject/lib/Recur/EventIterator.php
vendored
93
vendor/sabre/vobject/lib/Recur/EventIterator.php
vendored
@ -58,8 +58,8 @@ use Sabre\VObject\Settings;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class EventIterator implements \Iterator {
|
||||
|
||||
class EventIterator implements \Iterator
|
||||
{
|
||||
/**
|
||||
* Reference timeZone for floating dates and times.
|
||||
*
|
||||
@ -90,11 +90,11 @@ class EventIterator implements \Iterator {
|
||||
*
|
||||
* @param Component|array $input
|
||||
* @param string|null $uid
|
||||
* @param DateTimeZone $timeZone Reference timezone for floating dates and
|
||||
* times.
|
||||
* @param DateTimeZone $timeZone reference timezone for floating dates and
|
||||
* times
|
||||
*/
|
||||
function __construct($input, $uid = null, DateTimeZone $timeZone = null) {
|
||||
|
||||
public function __construct($input, $uid = null, DateTimeZone $timeZone = null)
|
||||
{
|
||||
if (is_null($timeZone)) {
|
||||
$timeZone = new DateTimeZone('UTC');
|
||||
}
|
||||
@ -115,24 +115,17 @@ class EventIterator implements \Iterator {
|
||||
throw new InvalidArgumentException('No events found in this calendar');
|
||||
}
|
||||
$events = $input->getByUID($uid);
|
||||
|
||||
}
|
||||
|
||||
foreach ($events as $vevent) {
|
||||
|
||||
if (!isset($vevent->{'RECURRENCE-ID'})) {
|
||||
|
||||
$this->masterEvent = $vevent;
|
||||
|
||||
} else {
|
||||
|
||||
$this->exceptions[
|
||||
$vevent->{'RECURRENCE-ID'}->getDateTime($this->timeZone)->getTimeStamp()
|
||||
] = true;
|
||||
$this->overriddenEvents[] = $vevent;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!$this->masterEvent) {
|
||||
@ -152,15 +145,11 @@ class EventIterator implements \Iterator {
|
||||
$this->allDay = !$this->masterEvent->DTSTART->hasTime();
|
||||
|
||||
if (isset($this->masterEvent->EXDATE)) {
|
||||
|
||||
foreach ($this->masterEvent->EXDATE as $exDate) {
|
||||
|
||||
foreach ($exDate->getDateTimes($this->timeZone) as $dt) {
|
||||
$this->exceptions[$dt->getTimeStamp()] = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (isset($this->masterEvent->DTEND)) {
|
||||
@ -202,7 +191,6 @@ class EventIterator implements \Iterator {
|
||||
if (!$this->valid()) {
|
||||
throw new NoInstancesException('This recurrence rule does not generate any valid instances');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -210,12 +198,11 @@ class EventIterator implements \Iterator {
|
||||
*
|
||||
* @return DateTimeImmutable
|
||||
*/
|
||||
function current() {
|
||||
|
||||
public function current()
|
||||
{
|
||||
if ($this->currentDate) {
|
||||
return clone $this->currentDate;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -224,12 +211,11 @@ class EventIterator implements \Iterator {
|
||||
*
|
||||
* @return DateTimeImmutable
|
||||
*/
|
||||
function getDtStart() {
|
||||
|
||||
public function getDtStart()
|
||||
{
|
||||
if ($this->currentDate) {
|
||||
return clone $this->currentDate;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -238,26 +224,26 @@ class EventIterator implements \Iterator {
|
||||
*
|
||||
* @return DateTimeImmutable
|
||||
*/
|
||||
function getDtEnd() {
|
||||
|
||||
public function getDtEnd()
|
||||
{
|
||||
if (!$this->valid()) {
|
||||
return;
|
||||
}
|
||||
$end = clone $this->currentDate;
|
||||
return $end->modify('+' . $this->eventDuration . ' seconds');
|
||||
|
||||
return $end->modify('+'.$this->eventDuration.' seconds');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a VEVENT for the current iterations of the event.
|
||||
*
|
||||
* This VEVENT will have a recurrence id, and it's DTSTART and DTEND
|
||||
* This VEVENT will have a recurrence id, and its DTSTART and DTEND
|
||||
* altered.
|
||||
*
|
||||
* @return VEvent
|
||||
*/
|
||||
function getEventObject() {
|
||||
|
||||
public function getEventObject()
|
||||
{
|
||||
if ($this->currentOverriddenEvent) {
|
||||
return $this->currentOverriddenEvent;
|
||||
}
|
||||
@ -284,8 +270,8 @@ class EventIterator implements \Iterator {
|
||||
$recurid = clone $event->DTSTART;
|
||||
$recurid->name = 'RECURRENCE-ID';
|
||||
$event->add($recurid);
|
||||
return $event;
|
||||
|
||||
return $event;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -295,11 +281,10 @@ class EventIterator implements \Iterator {
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function key() {
|
||||
|
||||
public function key()
|
||||
{
|
||||
// The counter is always 1 ahead.
|
||||
return $this->counter - 1;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -308,20 +293,20 @@ class EventIterator implements \Iterator {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function valid() {
|
||||
|
||||
if ($this->counter > Settings::$maxRecurrences && Settings::$maxRecurrences !== -1) {
|
||||
public function valid()
|
||||
{
|
||||
if ($this->counter > Settings::$maxRecurrences && -1 !== Settings::$maxRecurrences) {
|
||||
throw new MaxInstancesExceededException('Recurring events are only allowed to generate '.Settings::$maxRecurrences);
|
||||
}
|
||||
return !!$this->currentDate;
|
||||
|
||||
return (bool) $this->currentDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the iterator back to the starting point.
|
||||
*/
|
||||
function rewind() {
|
||||
|
||||
public function rewind()
|
||||
{
|
||||
$this->recurIterator->rewind();
|
||||
// re-creating overridden event index.
|
||||
$index = [];
|
||||
@ -338,18 +323,15 @@ class EventIterator implements \Iterator {
|
||||
$this->currentDate = clone $this->startDate;
|
||||
|
||||
$this->next();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Advances the iterator with one step.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function next() {
|
||||
|
||||
public function next()
|
||||
{
|
||||
$this->currentOverriddenEvent = null;
|
||||
$this->counter++;
|
||||
++$this->counter;
|
||||
if ($this->nextDate) {
|
||||
// We had a stored value.
|
||||
$nextDate = $this->nextDate;
|
||||
@ -366,14 +348,11 @@ class EventIterator implements \Iterator {
|
||||
$nextDate = $this->recurIterator->current();
|
||||
$this->recurIterator->next();
|
||||
} while (isset($this->exceptions[$nextDate->getTimeStamp()]));
|
||||
|
||||
}
|
||||
|
||||
|
||||
// $nextDate now contains what rrule thinks is the next one, but an
|
||||
// overridden event may cut ahead.
|
||||
if ($this->overriddenEventsIndex) {
|
||||
|
||||
$offsets = end($this->overriddenEventsIndex);
|
||||
$timestamp = key($this->overriddenEventsIndex);
|
||||
$offset = end($offsets);
|
||||
@ -393,13 +372,10 @@ class EventIterator implements \Iterator {
|
||||
|
||||
// Exit point!
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$this->currentDate = $nextDate;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -407,12 +383,11 @@ class EventIterator implements \Iterator {
|
||||
*
|
||||
* @param DateTimeInterface $dateTime
|
||||
*/
|
||||
function fastForward(DateTimeInterface $dateTime) {
|
||||
|
||||
public function fastForward(DateTimeInterface $dateTime)
|
||||
{
|
||||
while ($this->valid() && $this->getDtEnd() <= $dateTime) {
|
||||
$this->next();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -420,10 +395,9 @@ class EventIterator implements \Iterator {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isInfinite() {
|
||||
|
||||
public function isInfinite()
|
||||
{
|
||||
return $this->recurIterator->isInfinite();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -504,10 +478,9 @@ class EventIterator implements \Iterator {
|
||||
protected $nextDate;
|
||||
|
||||
/**
|
||||
* The event that overwrites the current iteration
|
||||
* The event that overwrites the current iteration.
|
||||
*
|
||||
* @var VEVENT
|
||||
*/
|
||||
protected $currentOverriddenEvent;
|
||||
|
||||
}
|
||||
|
@ -12,5 +12,6 @@ use Exception;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||||
*/
|
||||
class MaxInstancesExceededException extends Exception {
|
||||
class MaxInstancesExceededException extends Exception
|
||||
{
|
||||
}
|
||||
|
@ -13,6 +13,6 @@ use Exception;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
|
||||
*/
|
||||
class NoInstancesException extends Exception {
|
||||
|
||||
class NoInstancesException extends Exception
|
||||
{
|
||||
}
|
||||
|
71
vendor/sabre/vobject/lib/Recur/RDateIterator.php
vendored
71
vendor/sabre/vobject/lib/Recur/RDateIterator.php
vendored
@ -19,29 +19,30 @@ use Sabre\VObject\DateTimeParser;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class RDateIterator implements Iterator {
|
||||
|
||||
class RDateIterator implements Iterator
|
||||
{
|
||||
/**
|
||||
* Creates the Iterator.
|
||||
*
|
||||
* @param string|array $rrule
|
||||
* @param DateTimeInterface $start
|
||||
*/
|
||||
function __construct($rrule, DateTimeInterface $start) {
|
||||
|
||||
public function __construct($rrule, DateTimeInterface $start)
|
||||
{
|
||||
$this->startDate = $start;
|
||||
$this->parseRDate($rrule);
|
||||
$this->currentDate = clone $this->startDate;
|
||||
|
||||
}
|
||||
|
||||
/* Implementation of the Iterator interface {{{ */
|
||||
|
||||
function current() {
|
||||
public function current()
|
||||
{
|
||||
if (!$this->valid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$this->valid()) return;
|
||||
return clone $this->currentDate;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -49,10 +50,9 @@ class RDateIterator implements Iterator {
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function key() {
|
||||
|
||||
public function key()
|
||||
{
|
||||
return $this->counter;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -61,40 +61,35 @@ class RDateIterator implements Iterator {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function valid() {
|
||||
|
||||
return ($this->counter <= count($this->dates));
|
||||
|
||||
public function valid()
|
||||
{
|
||||
return $this->counter <= count($this->dates);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the iterator.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function rewind() {
|
||||
|
||||
public function rewind()
|
||||
{
|
||||
$this->currentDate = clone $this->startDate;
|
||||
$this->counter = 0;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Goes on to the next iteration.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function next() {
|
||||
|
||||
$this->counter++;
|
||||
if (!$this->valid()) return;
|
||||
public function next()
|
||||
{
|
||||
++$this->counter;
|
||||
if (!$this->valid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->currentDate =
|
||||
DateTimeParser::parse(
|
||||
$this->dates[$this->counter - 1],
|
||||
$this->startDate->getTimezone()
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/* End of Iterator implementation }}} */
|
||||
@ -104,10 +99,9 @@ class RDateIterator implements Iterator {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isInfinite() {
|
||||
|
||||
public function isInfinite()
|
||||
{
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,15 +109,12 @@ class RDateIterator implements Iterator {
|
||||
* specified date.
|
||||
*
|
||||
* @param DateTimeInterface $dt
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function fastForward(DateTimeInterface $dt) {
|
||||
|
||||
public function fastForward(DateTimeInterface $dt)
|
||||
{
|
||||
while ($this->valid() && $this->currentDate < $dt) {
|
||||
$this->next();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -159,24 +150,20 @@ class RDateIterator implements Iterator {
|
||||
* class with all the values.
|
||||
*
|
||||
* @param string|array $rrule
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function parseRDate($rdate) {
|
||||
|
||||
protected function parseRDate($rdate)
|
||||
{
|
||||
if (is_string($rdate)) {
|
||||
$rdate = explode(',', $rdate);
|
||||
}
|
||||
|
||||
$this->dates = $rdate;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Array with the RRULE dates
|
||||
* Array with the RRULE dates.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $dates = [];
|
||||
|
||||
}
|
||||
|
193
vendor/sabre/vobject/lib/Recur/RRuleIterator.php
vendored
193
vendor/sabre/vobject/lib/Recur/RRuleIterator.php
vendored
@ -22,29 +22,30 @@ use Sabre\VObject\Property;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class RRuleIterator implements Iterator {
|
||||
|
||||
class RRuleIterator implements Iterator
|
||||
{
|
||||
/**
|
||||
* Creates the Iterator.
|
||||
*
|
||||
* @param string|array $rrule
|
||||
* @param DateTimeInterface $start
|
||||
*/
|
||||
function __construct($rrule, DateTimeInterface $start) {
|
||||
|
||||
public function __construct($rrule, DateTimeInterface $start)
|
||||
{
|
||||
$this->startDate = $start;
|
||||
$this->parseRRule($rrule);
|
||||
$this->currentDate = clone $this->startDate;
|
||||
|
||||
}
|
||||
|
||||
/* Implementation of the Iterator interface {{{ */
|
||||
|
||||
function current() {
|
||||
public function current()
|
||||
{
|
||||
if (!$this->valid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$this->valid()) return;
|
||||
return clone $this->currentDate;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -52,10 +53,9 @@ class RRuleIterator implements Iterator {
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function key() {
|
||||
|
||||
public function key()
|
||||
{
|
||||
return $this->counter;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -65,38 +65,32 @@ class RRuleIterator implements Iterator {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function valid() {
|
||||
|
||||
public function valid()
|
||||
{
|
||||
if (!is_null($this->count)) {
|
||||
return $this->counter < $this->count;
|
||||
}
|
||||
return is_null($this->until) || $this->currentDate <= $this->until;
|
||||
|
||||
return is_null($this->until) || $this->currentDate <= $this->until;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the iterator.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function rewind() {
|
||||
|
||||
public function rewind()
|
||||
{
|
||||
$this->currentDate = clone $this->startDate;
|
||||
$this->counter = 0;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Goes on to the next iteration.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function next() {
|
||||
|
||||
public function next()
|
||||
{
|
||||
// Otherwise, we find the next event in the normal RRULE
|
||||
// sequence.
|
||||
switch ($this->frequency) {
|
||||
|
||||
case 'hourly':
|
||||
$this->nextHourly();
|
||||
break;
|
||||
@ -116,10 +110,8 @@ class RRuleIterator implements Iterator {
|
||||
case 'yearly':
|
||||
$this->nextYearly();
|
||||
break;
|
||||
|
||||
}
|
||||
$this->counter++;
|
||||
|
||||
++$this->counter;
|
||||
}
|
||||
|
||||
/* End of Iterator implementation }}} */
|
||||
@ -129,10 +121,9 @@ class RRuleIterator implements Iterator {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function isInfinite() {
|
||||
|
||||
public function isInfinite()
|
||||
{
|
||||
return !$this->count && !$this->until;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -140,15 +131,12 @@ class RRuleIterator implements Iterator {
|
||||
* specified date.
|
||||
*
|
||||
* @param DateTimeInterface $dt
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function fastForward(DateTimeInterface $dt) {
|
||||
|
||||
public function fastForward(DateTimeInterface $dt)
|
||||
{
|
||||
while ($this->valid() && $this->currentDate < $dt) {
|
||||
$this->next();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -317,24 +305,20 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
/**
|
||||
* Does the processing for advancing the iterator for hourly frequency.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function nextHourly() {
|
||||
|
||||
protected function nextHourly()
|
||||
{
|
||||
$this->currentDate = $this->currentDate->modify('+'.$this->interval.' hours');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the processing for advancing the iterator for daily frequency.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function nextDaily() {
|
||||
|
||||
protected function nextDaily()
|
||||
{
|
||||
if (!$this->byHour && !$this->byDay) {
|
||||
$this->currentDate = $this->currentDate->modify('+'.$this->interval.' days');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -352,16 +336,14 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
do {
|
||||
if ($this->byHour) {
|
||||
if ($this->currentDate->format('G') == '23') {
|
||||
if ('23' == $this->currentDate->format('G')) {
|
||||
// to obey the interval rule
|
||||
$this->currentDate = $this->currentDate->modify('+'.$this->interval - 1 .' days');
|
||||
}
|
||||
|
||||
$this->currentDate = $this->currentDate->modify('+1 hours');
|
||||
|
||||
} else {
|
||||
$this->currentDate = $this->currentDate->modify('+'.$this->interval.' days');
|
||||
|
||||
}
|
||||
|
||||
// Current month of the year
|
||||
@ -372,24 +354,21 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
// Current hour of the day
|
||||
$currentHour = $this->currentDate->format('G');
|
||||
|
||||
} while (
|
||||
($this->byDay && !in_array($currentDay, $recurrenceDays)) ||
|
||||
($this->byHour && !in_array($currentHour, $recurrenceHours)) ||
|
||||
($this->byMonth && !in_array($currentMonth, $recurrenceMonths))
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the processing for advancing the iterator for weekly frequency.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function nextWeekly() {
|
||||
|
||||
protected function nextWeekly()
|
||||
{
|
||||
if (!$this->byHour && !$this->byDay) {
|
||||
$this->currentDate = $this->currentDate->modify('+'.$this->interval.' weeks');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -405,7 +384,6 @@ class RRuleIterator implements Iterator {
|
||||
$firstDay = $this->dayMap[$this->weekStart];
|
||||
|
||||
do {
|
||||
|
||||
if ($this->byHour) {
|
||||
$this->currentDate = $this->currentDate->modify('+1 hours');
|
||||
} else {
|
||||
@ -419,7 +397,7 @@ class RRuleIterator implements Iterator {
|
||||
$currentHour = (int) $this->currentDate->format('G');
|
||||
|
||||
// We need to roll over to the next week
|
||||
if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) {
|
||||
if ($currentDay === $firstDay && (!$this->byHour || '0' == $currentHour)) {
|
||||
$this->currentDate = $this->currentDate->modify('+'.$this->interval - 1 .' weeks');
|
||||
|
||||
// We need to go to the first day of this week, but only if we
|
||||
@ -435,14 +413,11 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
/**
|
||||
* Does the processing for advancing the iterator for monthly frequency.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function nextMonthly() {
|
||||
|
||||
protected function nextMonthly()
|
||||
{
|
||||
$currentDayOfMonth = $this->currentDate->format('j');
|
||||
if (!$this->byMonthDay && !$this->byDay) {
|
||||
|
||||
// If the current day is higher than the 28th, rollover can
|
||||
// occur to the next month. We Must skip these invalid
|
||||
// entries.
|
||||
@ -451,27 +426,25 @@ class RRuleIterator implements Iterator {
|
||||
} else {
|
||||
$increase = 0;
|
||||
do {
|
||||
$increase++;
|
||||
++$increase;
|
||||
$tempDate = clone $this->currentDate;
|
||||
$tempDate = $tempDate->modify('+ '.($this->interval * $increase).' months');
|
||||
} while ($tempDate->format('j') != $currentDayOfMonth);
|
||||
$this->currentDate = $tempDate;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
|
||||
$occurrences = $this->getMonthlyOccurrences();
|
||||
|
||||
foreach ($occurrences as $occurrence) {
|
||||
|
||||
// The first occurrence thats higher than the current
|
||||
// day of the month wins.
|
||||
if ($occurrence > $currentDayOfMonth) {
|
||||
break 2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If we made it all the way here, it means there were no
|
||||
@ -488,7 +461,6 @@ class RRuleIterator implements Iterator {
|
||||
// This goes to 0 because we need to start counting at the
|
||||
// beginning.
|
||||
$currentDayOfMonth = 0;
|
||||
|
||||
}
|
||||
|
||||
$this->currentDate = $this->currentDate->setDate(
|
||||
@ -496,29 +468,24 @@ class RRuleIterator implements Iterator {
|
||||
(int) $this->currentDate->format('n'),
|
||||
(int) $occurrence
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the processing for advancing the iterator for yearly frequency.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function nextYearly() {
|
||||
|
||||
protected function nextYearly()
|
||||
{
|
||||
$currentMonth = $this->currentDate->format('n');
|
||||
$currentYear = $this->currentDate->format('Y');
|
||||
$currentDayOfMonth = $this->currentDate->format('j');
|
||||
|
||||
// No sub-rules, so we just advance by year
|
||||
if (empty($this->byMonth)) {
|
||||
|
||||
// Unless it was a leap day!
|
||||
if ($currentMonth == 2 && $currentDayOfMonth == 29) {
|
||||
|
||||
if (2 == $currentMonth && 29 == $currentDayOfMonth) {
|
||||
$counter = 0;
|
||||
do {
|
||||
$counter++;
|
||||
++$counter;
|
||||
// Here we increase the year count by the interval, until
|
||||
// we hit a date that's also in a leap year.
|
||||
//
|
||||
@ -529,15 +496,14 @@ class RRuleIterator implements Iterator {
|
||||
// functions instead.
|
||||
$nextDate = clone $this->currentDate;
|
||||
$nextDate = $nextDate->modify('+ '.($this->interval * $counter).' years');
|
||||
} while ($nextDate->format('n') != 2);
|
||||
} while (2 != $nextDate->format('n'));
|
||||
|
||||
$this->currentDate = $nextDate;
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
if ($this->byWeekNo !== null) { // byWeekNo is an array with values from -53 to -1, or 1 to 53
|
||||
if (null !== $this->byWeekNo) { // byWeekNo is an array with values from -53 to -1, or 1 to 53
|
||||
$dayOffsets = [];
|
||||
if ($this->byDay) {
|
||||
foreach ($this->byDay as $byDay) {
|
||||
@ -566,6 +532,7 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
if (count($checkDates) > 0) {
|
||||
$this->currentDate = min($checkDates);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -574,7 +541,7 @@ class RRuleIterator implements Iterator {
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->byYearDay !== null) { // byYearDay is an array with values from -366 to -1, or 1 to 366
|
||||
if (null !== $this->byYearDay) { // byYearDay is an array with values from -366 to -1, or 1 to 366
|
||||
$dayOffsets = [];
|
||||
if ($this->byDay) {
|
||||
foreach ($this->byDay as $byDay) {
|
||||
@ -606,6 +573,7 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
if (count($checkDates) > 0) {
|
||||
$this->currentDate = min($checkDates);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -616,8 +584,8 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
// The easiest form
|
||||
$this->currentDate = $this->currentDate->modify('+'.$this->interval.' years');
|
||||
return;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$currentMonth = $this->currentDate->format('n');
|
||||
@ -629,13 +597,10 @@ class RRuleIterator implements Iterator {
|
||||
// If we got a byDay or getMonthDay filter, we must first expand
|
||||
// further.
|
||||
if ($this->byDay || $this->byMonthDay) {
|
||||
|
||||
while (true) {
|
||||
|
||||
$occurrences = $this->getMonthlyOccurrences();
|
||||
|
||||
foreach ($occurrences as $occurrence) {
|
||||
|
||||
// The first occurrence that's higher than the current
|
||||
// day of the month wins.
|
||||
// If we advanced to the next month or year, the first
|
||||
@ -643,7 +608,6 @@ class RRuleIterator implements Iterator {
|
||||
if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) {
|
||||
break 2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If we made it here, it means we need to advance to
|
||||
@ -651,8 +615,7 @@ class RRuleIterator implements Iterator {
|
||||
$currentDayOfMonth = 1;
|
||||
$advancedToNewMonth = true;
|
||||
do {
|
||||
|
||||
$currentMonth++;
|
||||
++$currentMonth;
|
||||
if ($currentMonth > 12) {
|
||||
$currentYear += $this->interval;
|
||||
$currentMonth = 1;
|
||||
@ -664,7 +627,6 @@ class RRuleIterator implements Iterator {
|
||||
(int) $currentMonth,
|
||||
(int) $currentDayOfMonth
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
// If we made it here, it means we got a valid occurrence
|
||||
@ -673,15 +635,13 @@ class RRuleIterator implements Iterator {
|
||||
(int) $currentMonth,
|
||||
(int) $occurrence
|
||||
);
|
||||
|
||||
return;
|
||||
|
||||
} else {
|
||||
|
||||
// These are the 'byMonth' rules, if there are no byDay or
|
||||
// byMonthDay sub-rules.
|
||||
do {
|
||||
|
||||
$currentMonth++;
|
||||
++$currentMonth;
|
||||
if ($currentMonth > 12) {
|
||||
$currentYear += $this->interval;
|
||||
$currentMonth = 1;
|
||||
@ -694,9 +654,7 @@ class RRuleIterator implements Iterator {
|
||||
);
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
@ -706,20 +664,16 @@ class RRuleIterator implements Iterator {
|
||||
* class with all the values.
|
||||
*
|
||||
* @param string|array $rrule
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function parseRRule($rrule) {
|
||||
|
||||
protected function parseRRule($rrule)
|
||||
{
|
||||
if (is_string($rrule)) {
|
||||
$rrule = Property\ICalendar\Recur::stringToArray($rrule);
|
||||
}
|
||||
|
||||
foreach ($rrule as $key => $value) {
|
||||
|
||||
$key = strtoupper($key);
|
||||
switch ($key) {
|
||||
|
||||
case 'FREQ':
|
||||
$value = strtolower($value);
|
||||
if (!in_array(
|
||||
@ -748,7 +702,6 @@ class RRuleIterator implements Iterator {
|
||||
break;
|
||||
|
||||
case 'INTERVAL':
|
||||
// No break
|
||||
|
||||
case 'COUNT':
|
||||
$val = (int) $value;
|
||||
@ -788,7 +741,7 @@ class RRuleIterator implements Iterator {
|
||||
case 'BYYEARDAY':
|
||||
$this->byYearDay = (array) $value;
|
||||
foreach ($this->byYearDay as $byYearDay) {
|
||||
if (!is_numeric($byYearDay) || (int)$byYearDay < -366 || (int)$byYearDay == 0 || (int)$byYearDay > 366) {
|
||||
if (!is_numeric($byYearDay) || (int) $byYearDay < -366 || 0 == (int) $byYearDay || (int) $byYearDay > 366) {
|
||||
throw new InvalidDataException('BYYEARDAY in RRULE must have value(s) from 1 to 366, or -366 to -1!');
|
||||
}
|
||||
}
|
||||
@ -797,7 +750,7 @@ class RRuleIterator implements Iterator {
|
||||
case 'BYWEEKNO':
|
||||
$this->byWeekNo = (array) $value;
|
||||
foreach ($this->byWeekNo as $byWeekNo) {
|
||||
if (!is_numeric($byWeekNo) || (int)$byWeekNo < -53 || (int)$byWeekNo == 0 || (int)$byWeekNo > 53) {
|
||||
if (!is_numeric($byWeekNo) || (int) $byWeekNo < -53 || 0 == (int) $byWeekNo || (int) $byWeekNo > 53) {
|
||||
throw new InvalidDataException('BYWEEKNO in RRULE must have value(s) from 1 to 53, or -53 to -1!');
|
||||
}
|
||||
}
|
||||
@ -822,11 +775,8 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
default:
|
||||
throw new InvalidDataException('Not supported: '.strtoupper($key));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -852,19 +802,18 @@ class RRuleIterator implements Iterator {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getMonthlyOccurrences() {
|
||||
|
||||
protected function getMonthlyOccurrences()
|
||||
{
|
||||
$startDate = clone $this->currentDate;
|
||||
|
||||
$byDayResults = [];
|
||||
|
||||
// Our strategy is to simply go through the byDays, advance the date to
|
||||
// that point and add it to the results.
|
||||
if ($this->byDay) foreach ($this->byDay as $day) {
|
||||
|
||||
if ($this->byDay) {
|
||||
foreach ($this->byDay as $day) {
|
||||
$dayName = $this->dayNames[$this->dayMap[substr($day, -2)]];
|
||||
|
||||
|
||||
// Dayname will be something like 'wednesday'. Now we need to find
|
||||
// all wednesdays in this month.
|
||||
$dayHits = [];
|
||||
@ -894,7 +843,6 @@ class RRuleIterator implements Iterator {
|
||||
$byDayResults[] = $dayHits[$offset - 1];
|
||||
}
|
||||
} else {
|
||||
|
||||
// if it was negative we count from the end of the array
|
||||
// might not exist, fx. -5th tuesday
|
||||
if (isset($dayHits[count($dayHits) + $offset])) {
|
||||
@ -905,14 +853,13 @@ class RRuleIterator implements Iterator {
|
||||
// There was no counter (first, second, last wednesdays), so we
|
||||
// just need to add the all to the list).
|
||||
$byDayResults = array_merge($byDayResults, $dayHits);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$byMonthDayResults = [];
|
||||
if ($this->byMonthDay) foreach ($this->byMonthDay as $monthDay) {
|
||||
|
||||
if ($this->byMonthDay) {
|
||||
foreach ($this->byMonthDay as $monthDay) {
|
||||
// Removing values that are out of range for this month
|
||||
if ($monthDay > $startDate->format('t') ||
|
||||
$monthDay < 0 - $startDate->format('t')) {
|
||||
@ -925,6 +872,7 @@ class RRuleIterator implements Iterator {
|
||||
$byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there was just byDay or just byMonthDay, they just specify our
|
||||
// (almost) final list. If both were provided, then byDay limits the
|
||||
@ -947,7 +895,6 @@ class RRuleIterator implements Iterator {
|
||||
|
||||
$filteredResult = [];
|
||||
foreach ($this->bySetPos as $setPos) {
|
||||
|
||||
if ($setPos < 0) {
|
||||
$setPos = count($result) + ($setPos + 1);
|
||||
}
|
||||
@ -957,8 +904,8 @@ class RRuleIterator implements Iterator {
|
||||
}
|
||||
|
||||
sort($filteredResult, SORT_NUMERIC);
|
||||
return $filteredResult;
|
||||
|
||||
return $filteredResult;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -976,8 +923,8 @@ class RRuleIterator implements Iterator {
|
||||
'SA' => 6,
|
||||
];
|
||||
|
||||
protected function getHours() {
|
||||
|
||||
protected function getHours()
|
||||
{
|
||||
$recurrenceHours = [];
|
||||
foreach ($this->byHour as $byHour) {
|
||||
$recurrenceHours[] = $byHour;
|
||||
@ -986,23 +933,21 @@ class RRuleIterator implements Iterator {
|
||||
return $recurrenceHours;
|
||||
}
|
||||
|
||||
protected function getDays() {
|
||||
|
||||
protected function getDays()
|
||||
{
|
||||
$recurrenceDays = [];
|
||||
foreach ($this->byDay as $byDay) {
|
||||
|
||||
// The day may be preceeded with a positive (+n) or
|
||||
// negative (-n) integer. However, this does not make
|
||||
// sense in 'weekly' so we ignore it here.
|
||||
$recurrenceDays[] = $this->dayMap[substr($byDay, -2)];
|
||||
|
||||
}
|
||||
|
||||
return $recurrenceDays;
|
||||
}
|
||||
|
||||
protected function getMonths() {
|
||||
|
||||
protected function getMonths()
|
||||
{
|
||||
$recurrenceMonths = [];
|
||||
foreach ($this->byMonth as $byMonth) {
|
||||
$recurrenceMonths[] = $byMonth;
|
||||
|
11
vendor/sabre/vobject/lib/Settings.php
vendored
11
vendor/sabre/vobject/lib/Settings.php
vendored
@ -15,8 +15,8 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Settings {
|
||||
|
||||
class Settings
|
||||
{
|
||||
/**
|
||||
* The minimum date we accept for various calculations with dates, such as
|
||||
* recurrences.
|
||||
@ -25,7 +25,7 @@ class Settings {
|
||||
* use-cases. In particular, it covers birthdates for virtually everyone
|
||||
* alive on earth, which is less than 5 people at the time of writing.
|
||||
*/
|
||||
static $minDate = '1900-01-01';
|
||||
public static $minDate = '1900-01-01';
|
||||
|
||||
/**
|
||||
* The maximum date we accept for various calculations with dates, such as
|
||||
@ -34,7 +34,7 @@ class Settings {
|
||||
* The choice of 2100 is pretty arbitrary, but should cover most
|
||||
* appointments made for many years to come.
|
||||
*/
|
||||
static $maxDate = '2100-01-01';
|
||||
public static $maxDate = '2100-01-01';
|
||||
|
||||
/**
|
||||
* The maximum number of recurrences that will be generated.
|
||||
@ -51,6 +51,5 @@ class Settings {
|
||||
*
|
||||
* Set this value to -1 to disable this control altogether.
|
||||
*/
|
||||
static $maxRecurrences = 3500;
|
||||
|
||||
public static $maxRecurrences = 3500;
|
||||
}
|
||||
|
27
vendor/sabre/vobject/lib/Splitter/ICalendar.php
vendored
27
vendor/sabre/vobject/lib/Splitter/ICalendar.php
vendored
@ -19,8 +19,8 @@ use Sabre\VObject\Component\VCalendar;
|
||||
* @author Armin Hackmann
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class ICalendar implements SplitterInterface {
|
||||
|
||||
class ICalendar implements SplitterInterface
|
||||
{
|
||||
/**
|
||||
* Timezones.
|
||||
*
|
||||
@ -38,13 +38,13 @@ class ICalendar implements SplitterInterface {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* The splitter should receive an readable file stream as it's input.
|
||||
* The splitter should receive an readable file stream as its input.
|
||||
*
|
||||
* @param resource $input
|
||||
* @param int $options Parser options, see the OPTIONS constants.
|
||||
* @param int $options parser options, see the OPTIONS constants
|
||||
*/
|
||||
function __construct($input, $options = 0) {
|
||||
|
||||
public function __construct($input, $options = 0)
|
||||
{
|
||||
$data = VObject\Reader::read($input, $options);
|
||||
|
||||
if (!$data instanceof VObject\Component\VCalendar) {
|
||||
@ -57,7 +57,7 @@ class ICalendar implements SplitterInterface {
|
||||
}
|
||||
|
||||
// Get all timezones
|
||||
if ($component->name === 'VTIMEZONE') {
|
||||
if ('VTIMEZONE' === $component->name) {
|
||||
$this->vtimezones[(string) $component->TZID] = $component;
|
||||
continue;
|
||||
}
|
||||
@ -75,7 +75,6 @@ class ICalendar implements SplitterInterface {
|
||||
|
||||
$this->objects[$uid]->add(clone $component);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -84,12 +83,11 @@ class ICalendar implements SplitterInterface {
|
||||
*
|
||||
* When the end is reached, null will be returned.
|
||||
*
|
||||
* @return Sabre\VObject\Component|null
|
||||
* @return \Sabre\VObject\Component|null
|
||||
*/
|
||||
function getNext() {
|
||||
|
||||
public function getNext()
|
||||
{
|
||||
if ($object = array_shift($this->objects)) {
|
||||
|
||||
// create our baseobject
|
||||
$object->version = '2.0';
|
||||
$object->prodid = '-//Sabre//Sabre VObject '.VObject\Version::VERSION.'//EN';
|
||||
@ -101,13 +99,8 @@ class ICalendar implements SplitterInterface {
|
||||
}
|
||||
|
||||
return $object;
|
||||
|
||||
} else {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,16 +15,16 @@ namespace Sabre\VObject\Splitter;
|
||||
* @author Dominik Tobschall (http://tobschall.de/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
interface SplitterInterface {
|
||||
|
||||
interface SplitterInterface
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* The splitter should receive an readable file stream as it's input.
|
||||
* The splitter should receive an readable file stream as its input.
|
||||
*
|
||||
* @param resource $input
|
||||
*/
|
||||
function __construct($input);
|
||||
public function __construct($input);
|
||||
|
||||
/**
|
||||
* Every time getNext() is called, a new object will be parsed, until we
|
||||
@ -32,8 +32,7 @@ interface SplitterInterface {
|
||||
*
|
||||
* When the end is reached, null will be returned.
|
||||
*
|
||||
* @return Sabre\VObject\Component|null
|
||||
* @return \Sabre\VObject\Component|null
|
||||
*/
|
||||
function getNext();
|
||||
|
||||
public function getNext();
|
||||
}
|
||||
|
22
vendor/sabre/vobject/lib/Splitter/VCard.php
vendored
22
vendor/sabre/vobject/lib/Splitter/VCard.php
vendored
@ -19,8 +19,8 @@ use Sabre\VObject\Parser\MimeDir;
|
||||
* @author Armin Hackmann
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VCard implements SplitterInterface {
|
||||
|
||||
class VCard implements SplitterInterface
|
||||
{
|
||||
/**
|
||||
* File handle.
|
||||
*
|
||||
@ -38,16 +38,15 @@ class VCard implements SplitterInterface {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* The splitter should receive an readable file stream as it's input.
|
||||
* The splitter should receive an readable file stream as its input.
|
||||
*
|
||||
* @param resource $input
|
||||
* @param int $options Parser options, see the OPTIONS constants.
|
||||
* @param int $options parser options, see the OPTIONS constants
|
||||
*/
|
||||
function __construct($input, $options = 0) {
|
||||
|
||||
public function __construct($input, $options = 0)
|
||||
{
|
||||
$this->input = $input;
|
||||
$this->parser = new MimeDir($input, $options);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -56,23 +55,20 @@ class VCard implements SplitterInterface {
|
||||
*
|
||||
* When the end is reached, null will be returned.
|
||||
*
|
||||
* @return Sabre\VObject\Component|null
|
||||
* @return \Sabre\VObject\Component|null
|
||||
*/
|
||||
function getNext() {
|
||||
|
||||
public function getNext()
|
||||
{
|
||||
try {
|
||||
$object = $this->parser->parse();
|
||||
|
||||
if (!$object instanceof VObject\Component\VCard) {
|
||||
throw new VObject\ParseException('The supplied input contained non-VCARD data.');
|
||||
}
|
||||
|
||||
} catch (VObject\EofException $e) {
|
||||
return;
|
||||
}
|
||||
|
||||
return $object;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
18
vendor/sabre/vobject/lib/StringUtil.php
vendored
18
vendor/sabre/vobject/lib/StringUtil.php
vendored
@ -9,8 +9,8 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class StringUtil {
|
||||
|
||||
class StringUtil
|
||||
{
|
||||
/**
|
||||
* Returns true or false depending on if a string is valid UTF-8.
|
||||
*
|
||||
@ -18,15 +18,14 @@ class StringUtil {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
static function isUTF8($str) {
|
||||
|
||||
public static function isUTF8($str)
|
||||
{
|
||||
// Control characters
|
||||
if (preg_match('%[\x00-\x08\x0B-\x0C\x0E\x0F]%', $str)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (bool) preg_match('%%u', $str);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -39,8 +38,8 @@ class StringUtil {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
static function convertToUTF8($str) {
|
||||
|
||||
public static function convertToUTF8($str)
|
||||
{
|
||||
$encoding = mb_detect_encoding($str, ['UTF-8', 'ISO-8859-1', 'WINDOWS-1252'], true);
|
||||
|
||||
switch ($encoding) {
|
||||
@ -55,12 +54,9 @@ class StringUtil {
|
||||
*/
|
||||
default:
|
||||
$newStr = $str;
|
||||
|
||||
}
|
||||
|
||||
// Removing any control characters
|
||||
return (preg_replace('%(?:[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', '', $newStr));
|
||||
|
||||
return preg_replace('%(?:[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F])%', '', $newStr);
|
||||
}
|
||||
|
||||
}
|
||||
|
45
vendor/sabre/vobject/lib/TimeZoneUtil.php
vendored
45
vendor/sabre/vobject/lib/TimeZoneUtil.php
vendored
@ -12,16 +12,16 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class TimeZoneUtil {
|
||||
|
||||
static $map = null;
|
||||
class TimeZoneUtil
|
||||
{
|
||||
public static $map = null;
|
||||
|
||||
/**
|
||||
* List of microsoft exchange timezone ids.
|
||||
*
|
||||
* Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx
|
||||
*/
|
||||
static $microsoftExchangeMap = [
|
||||
public static $microsoftExchangeMap = [
|
||||
0 => 'UTC',
|
||||
31 => 'Africa/Casablanca',
|
||||
|
||||
@ -120,10 +120,10 @@ class TimeZoneUtil {
|
||||
* @param string $tzid
|
||||
* @param Sabre\VObject\Component $vcalendar
|
||||
*
|
||||
* @return DateTimeZone
|
||||
* @return \DateTimeZone
|
||||
*/
|
||||
static function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) {
|
||||
|
||||
public static function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false)
|
||||
{
|
||||
// First we will just see if the tzid is a support timezone identifier.
|
||||
//
|
||||
// The only exception is if the timezone starts with (. This is to
|
||||
@ -135,8 +135,7 @@ class TimeZoneUtil {
|
||||
// Since PHP 5.5.10, the first bit will be used as the timezone and
|
||||
// this method will return just GMT+01:00. This is wrong, because it
|
||||
// doesn't take DST into account.
|
||||
if ($tzid[0] !== '(') {
|
||||
|
||||
if ('(' !== $tzid[0]) {
|
||||
// PHP has a bug that logs PHP warnings even it shouldn't:
|
||||
// https://bugs.php.net/bug.php?id=67881
|
||||
//
|
||||
@ -155,7 +154,6 @@ class TimeZoneUtil {
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
self::loadTzMaps();
|
||||
@ -178,7 +176,6 @@ class TimeZoneUtil {
|
||||
// Maybe the author was hyper-lazy and just included an offset. We
|
||||
// support it, but we aren't happy about it.
|
||||
if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) {
|
||||
|
||||
// Note that the path in the source will never be taken from PHP 5.5.10
|
||||
// onwards. PHP 5.5.10 supports the "GMT+0100" style of format, so it
|
||||
// already gets returned early in this function. Once we drop support
|
||||
@ -190,26 +187,21 @@ class TimeZoneUtil {
|
||||
}
|
||||
|
||||
if ($vcalendar) {
|
||||
|
||||
// If that didn't work, we will scan VTIMEZONE objects
|
||||
foreach ($vcalendar->select('VTIMEZONE') as $vtimezone) {
|
||||
|
||||
if ((string) $vtimezone->TZID === $tzid) {
|
||||
|
||||
// Some clients add 'X-LIC-LOCATION' with the olson name.
|
||||
if (isset($vtimezone->{'X-LIC-LOCATION'})) {
|
||||
|
||||
$lic = (string) $vtimezone->{'X-LIC-LOCATION'};
|
||||
|
||||
// Libical generators may specify strings like
|
||||
// "SystemV/EST5EDT". For those we must remove the
|
||||
// SystemV part.
|
||||
if (substr($lic, 0, 8) === 'SystemV/') {
|
||||
if ('SystemV/' === substr($lic, 0, 8)) {
|
||||
$lic = substr($lic, 8);
|
||||
}
|
||||
|
||||
return self::getTimeZone($lic, null, $failIfUncertain);
|
||||
|
||||
}
|
||||
// Microsoft may add a magic number, which we also have an
|
||||
// answer for.
|
||||
@ -217,7 +209,7 @@ class TimeZoneUtil {
|
||||
$cdoId = (int) $vtimezone->{'X-MICROSOFT-CDO-TZID'}->getValue();
|
||||
|
||||
// 2 can mean both Europe/Lisbon and Europe/Sarajevo.
|
||||
if ($cdoId === 2 && strpos((string)$vtimezone->TZID, 'Sarajevo') !== false) {
|
||||
if (2 === $cdoId && false !== strpos((string) $vtimezone->TZID, 'Sarajevo')) {
|
||||
return new \DateTimeZone('Europe/Sarajevo');
|
||||
}
|
||||
|
||||
@ -225,11 +217,8 @@ class TimeZoneUtil {
|
||||
return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($failIfUncertain) {
|
||||
@ -238,16 +227,17 @@ class TimeZoneUtil {
|
||||
|
||||
// If we got all the way here, we default to UTC.
|
||||
return new \DateTimeZone(date_default_timezone_get());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This method will load in all the tz mapping information, if it's not yet
|
||||
* done.
|
||||
*/
|
||||
static function loadTzMaps() {
|
||||
|
||||
if (!is_null(self::$map)) return;
|
||||
public static function loadTzMaps()
|
||||
{
|
||||
if (!is_null(self::$map)) {
|
||||
return;
|
||||
}
|
||||
|
||||
self::$map = array_merge(
|
||||
include __DIR__.'/timezonedata/windowszones.php',
|
||||
@ -255,7 +245,6 @@ class TimeZoneUtil {
|
||||
include __DIR__.'/timezonedata/exchangezones.php',
|
||||
include __DIR__.'/timezonedata/php-workaround.php'
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -269,8 +258,8 @@ class TimeZoneUtil {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
static function getIdentifiersBC() {
|
||||
public static function getIdentifiersBC()
|
||||
{
|
||||
return include __DIR__.'/timezonedata/php-bc.php';
|
||||
}
|
||||
|
||||
}
|
||||
|
19
vendor/sabre/vobject/lib/UUIDUtil.php
vendored
19
vendor/sabre/vobject/lib/UUIDUtil.php
vendored
@ -13,8 +13,8 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class UUIDUtil {
|
||||
|
||||
class UUIDUtil
|
||||
{
|
||||
/**
|
||||
* Returns a pseudo-random v4 UUID.
|
||||
*
|
||||
@ -24,10 +24,9 @@ class UUIDUtil {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
static function getUUID() {
|
||||
|
||||
public static function getUUID()
|
||||
{
|
||||
return sprintf(
|
||||
|
||||
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
|
||||
|
||||
// 32 bits for "time_low"
|
||||
@ -57,13 +56,11 @@ class UUIDUtil {
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
static function validateUUID($uuid) {
|
||||
|
||||
return preg_match(
|
||||
public static function validateUUID($uuid)
|
||||
{
|
||||
return 0 !== preg_match(
|
||||
'/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i',
|
||||
$uuid
|
||||
) !== 0;
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
126
vendor/sabre/vobject/lib/VCardConverter.php
vendored
126
vendor/sabre/vobject/lib/VCardConverter.php
vendored
@ -9,8 +9,8 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class VCardConverter {
|
||||
|
||||
class VCardConverter
|
||||
{
|
||||
/**
|
||||
* Converts a vCard object to a new version.
|
||||
*
|
||||
@ -29,8 +29,8 @@ class VCardConverter {
|
||||
* @param Component\VCard $input
|
||||
* @param int $targetVersion
|
||||
*/
|
||||
function convert(Component\VCard $input, $targetVersion) {
|
||||
|
||||
public function convert(Component\VCard $input, $targetVersion)
|
||||
{
|
||||
$inputVersion = $input->getDocumentType();
|
||||
if ($inputVersion === $targetVersion) {
|
||||
return clone $input;
|
||||
@ -43,7 +43,7 @@ class VCardConverter {
|
||||
throw new \InvalidArgumentException('You can only use vCard 3.0 or 4.0 for the target version');
|
||||
}
|
||||
|
||||
$newVersion = $targetVersion === Document::VCARD40 ? '4.0' : '3.0';
|
||||
$newVersion = Document::VCARD40 === $targetVersion ? '4.0' : '3.0';
|
||||
|
||||
$output = new Component\VCard([
|
||||
'VERSION' => $newVersion,
|
||||
@ -53,13 +53,10 @@ class VCardConverter {
|
||||
unset($output->UID);
|
||||
|
||||
foreach ($input->children() as $property) {
|
||||
|
||||
$this->convertProperty($input, $output, $property, $targetVersion);
|
||||
|
||||
}
|
||||
|
||||
return $output;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -69,11 +66,9 @@ class VCardConverter {
|
||||
* @param Component\VCard $output
|
||||
* @param Property $property
|
||||
* @param int $targetVersion
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion) {
|
||||
|
||||
protected function convertProperty(Component\VCard $input, Component\VCard $output, Property $property, $targetVersion)
|
||||
{
|
||||
// Skipping these, those are automatically added.
|
||||
if (in_array($property->name, ['VERSION', 'PRODID'])) {
|
||||
return;
|
||||
@ -95,15 +90,10 @@ class VCardConverter {
|
||||
$valueType
|
||||
);
|
||||
|
||||
|
||||
if ($targetVersion === Document::VCARD30) {
|
||||
|
||||
if (Document::VCARD30 === $targetVersion) {
|
||||
if ($property instanceof Property\Uri && in_array($property->name, ['PHOTO', 'LOGO', 'SOUND'])) {
|
||||
|
||||
$newProperty = $this->convertUriToBinary($output, $newProperty);
|
||||
|
||||
} elseif ($property instanceof Property\VCard\DateAndOrTime) {
|
||||
|
||||
// In vCard 4, the birth year may be optional. This is not the
|
||||
// case for vCard 3. Apple has a workaround for this that
|
||||
// allows applications that support Apple's extension still
|
||||
@ -118,7 +108,7 @@ class VCardConverter {
|
||||
$newProperty['X-APPLE-OMIT-YEAR'] = '1604';
|
||||
}
|
||||
|
||||
if ($newProperty->name == 'ANNIVERSARY') {
|
||||
if ('ANNIVERSARY' == $newProperty->name) {
|
||||
// Microsoft non-standard anniversary
|
||||
$newProperty->name = 'X-ANNIVERSARY';
|
||||
|
||||
@ -128,14 +118,12 @@ class VCardConverter {
|
||||
// exist yet.
|
||||
$x = 1;
|
||||
while ($output->select('ITEM'.$x.'.')) {
|
||||
$x++;
|
||||
++$x;
|
||||
}
|
||||
$output->add('ITEM'.$x.'.X-ABDATE', $newProperty->getValue(), ['VALUE' => 'DATE-AND-OR-TIME']);
|
||||
$output->add('ITEM'.$x.'.X-ABLABEL', '_$!<Anniversary>!$_');
|
||||
}
|
||||
|
||||
} elseif ($property->name === 'KIND') {
|
||||
|
||||
} elseif ('KIND' === $property->name) {
|
||||
switch (strtolower($property->getValue())) {
|
||||
case 'org':
|
||||
// vCard 3.0 does not have an equivalent to KIND:ORG,
|
||||
@ -153,23 +141,16 @@ class VCardConverter {
|
||||
$newProperty = $output->createProperty('X-ADDRESSBOOKSERVER-KIND', 'GROUP');
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
} elseif ($targetVersion === Document::VCARD40) {
|
||||
|
||||
} elseif (Document::VCARD40 === $targetVersion) {
|
||||
// These properties were removed in vCard 4.0
|
||||
if (in_array($property->name, ['NAME', 'MAILER', 'LABEL', 'CLASS'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($property instanceof Property\Binary) {
|
||||
|
||||
$newProperty = $this->convertBinaryToUri($output, $newProperty, $parameters);
|
||||
|
||||
} elseif ($property instanceof Property\VCard\DateAndOrTime && isset($parameters['X-APPLE-OMIT-YEAR'])) {
|
||||
|
||||
// If a property such as BDAY contained 'X-APPLE-OMIT-YEAR',
|
||||
// then we're stripping the year from the vcard 4 value.
|
||||
$parts = DateTimeParser::parseVCardDateTime($property->getValue());
|
||||
@ -181,16 +162,15 @@ class VCardConverter {
|
||||
// Regardless if the year matched or not, we do need to strip
|
||||
// X-APPLE-OMIT-YEAR.
|
||||
unset($parameters['X-APPLE-OMIT-YEAR']);
|
||||
|
||||
}
|
||||
switch ($property->name) {
|
||||
case 'X-ABSHOWAS':
|
||||
if (strtoupper($property->getValue()) === 'COMPANY') {
|
||||
if ('COMPANY' === strtoupper($property->getValue())) {
|
||||
$newProperty = $output->createProperty('KIND', 'ORG');
|
||||
}
|
||||
break;
|
||||
case 'X-ADDRESSBOOKSERVER-KIND':
|
||||
if (strtoupper($property->getValue()) === 'GROUP') {
|
||||
if ('GROUP' === strtoupper($property->getValue())) {
|
||||
$newProperty = $output->createProperty('KIND', 'GROUP');
|
||||
}
|
||||
break;
|
||||
@ -212,7 +192,7 @@ class VCardConverter {
|
||||
$label = $input->{$property->group.'.X-ABLABEL'};
|
||||
|
||||
// We only support converting anniversaries.
|
||||
if (!$label || $label->getValue() !== '_$!<Anniversary>!$_') {
|
||||
if (!$label || '_$!<Anniversary>!$_' !== $label->getValue()) {
|
||||
break;
|
||||
}
|
||||
|
||||
@ -227,21 +207,19 @@ class VCardConverter {
|
||||
break;
|
||||
// Apple's per-property label system.
|
||||
case 'X-ABLABEL':
|
||||
if ($newProperty->getValue() === '_$!<Anniversary>!$_') {
|
||||
if ('_$!<Anniversary>!$_' === $newProperty->getValue()) {
|
||||
// We can safely remove these, as they are converted to
|
||||
// ANNIVERSARY properties.
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// set property group
|
||||
$newProperty->group = $property->group;
|
||||
|
||||
if ($targetVersion === Document::VCARD40) {
|
||||
if (Document::VCARD40 === $targetVersion) {
|
||||
$this->convertParameters40($newProperty, $parameters);
|
||||
} else {
|
||||
$this->convertParameters30($newProperty, $parameters);
|
||||
@ -257,8 +235,6 @@ class VCardConverter {
|
||||
}
|
||||
|
||||
$output->add($newProperty);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -267,14 +243,14 @@ class VCardConverter {
|
||||
* vCard 4.0 no longer supports BINARY properties.
|
||||
*
|
||||
* @param Component\VCard $output
|
||||
* @param Property\Uri $property The input property.
|
||||
* @param $parameters List of parameters that will eventually be added to
|
||||
* the new property.
|
||||
* @param Property\Uri $property the input property
|
||||
* @param $parameters list of parameters that will eventually be added to
|
||||
* the new property
|
||||
*
|
||||
* @return Property\Uri
|
||||
*/
|
||||
protected function convertBinaryToUri(Component\VCard $output, Property\Binary $newProperty, array &$parameters) {
|
||||
|
||||
protected function convertBinaryToUri(Component\VCard $output, Property\Binary $newProperty, array &$parameters)
|
||||
{
|
||||
$value = $newProperty->getValue();
|
||||
$newProperty = $output->createProperty(
|
||||
$newProperty->name,
|
||||
@ -287,7 +263,6 @@ class VCardConverter {
|
||||
|
||||
// See if we can find a better mimetype.
|
||||
if (isset($parameters['TYPE'])) {
|
||||
|
||||
$newTypes = [];
|
||||
foreach ($parameters['TYPE']->getParts() as $typePart) {
|
||||
if (in_array(
|
||||
@ -307,12 +282,11 @@ class VCardConverter {
|
||||
} else {
|
||||
unset($parameters['TYPE']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$newProperty->setValue('data:'.$mimeType.';base64,'.base64_encode($value));
|
||||
return $newProperty;
|
||||
|
||||
return $newProperty;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -323,16 +297,16 @@ class VCardConverter {
|
||||
* possible, to improve compatibility.
|
||||
*
|
||||
* @param Component\VCard $output
|
||||
* @param Property\Uri $property The input property.
|
||||
* @param Property\Uri $property the input property
|
||||
*
|
||||
* @return Property\Binary|null
|
||||
*/
|
||||
protected function convertUriToBinary(Component\VCard $output, Property\Uri $newProperty) {
|
||||
|
||||
protected function convertUriToBinary(Component\VCard $output, Property\Uri $newProperty)
|
||||
{
|
||||
$value = $newProperty->getValue();
|
||||
|
||||
// Only converting data: uris
|
||||
if (substr($value, 0, 5) !== 'data:') {
|
||||
if ('data:' !== substr($value, 0, 5)) {
|
||||
return $newProperty;
|
||||
}
|
||||
|
||||
@ -354,7 +328,6 @@ class VCardConverter {
|
||||
|
||||
$newProperty['ENCODING'] = 'b';
|
||||
switch ($mimeType) {
|
||||
|
||||
case 'image/jpeg':
|
||||
$newProperty['TYPE'] = 'JPEG';
|
||||
break;
|
||||
@ -364,12 +337,9 @@ class VCardConverter {
|
||||
case 'image/gif':
|
||||
$newProperty['TYPE'] = 'GIF';
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
return $newProperty;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -377,30 +347,26 @@ class VCardConverter {
|
||||
*
|
||||
* @param Property $newProperty
|
||||
* @param array $parameters
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function convertParameters40(Property $newProperty, array $parameters) {
|
||||
|
||||
protected function convertParameters40(Property $newProperty, array $parameters)
|
||||
{
|
||||
// Adding all parameters.
|
||||
foreach ($parameters as $param) {
|
||||
|
||||
// vCard 2.1 allowed parameters with no name
|
||||
if ($param->noName) $param->noName = false;
|
||||
if ($param->noName) {
|
||||
$param->noName = false;
|
||||
}
|
||||
|
||||
switch ($param->name) {
|
||||
|
||||
// We need to see if there's any TYPE=PREF, because in vCard 4
|
||||
// that's now PREF=1.
|
||||
case 'TYPE':
|
||||
foreach ($param->getParts() as $paramPart) {
|
||||
|
||||
if (strtoupper($paramPart) === 'PREF') {
|
||||
if ('PREF' === strtoupper($paramPart)) {
|
||||
$newProperty->add('PREF', '1');
|
||||
} else {
|
||||
$newProperty->add($param->name, $paramPart);
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
// These no longer exist in vCard 4
|
||||
@ -411,11 +377,8 @@ class VCardConverter {
|
||||
default:
|
||||
$newProperty->add($param->name, $param->getParts());
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -423,23 +386,21 @@ class VCardConverter {
|
||||
*
|
||||
* @param Property $newProperty
|
||||
* @param array $parameters
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function convertParameters30(Property $newProperty, array $parameters) {
|
||||
|
||||
protected function convertParameters30(Property $newProperty, array $parameters)
|
||||
{
|
||||
// Adding all parameters.
|
||||
foreach ($parameters as $param) {
|
||||
|
||||
// vCard 2.1 allowed parameters with no name
|
||||
if ($param->noName) $param->noName = false;
|
||||
if ($param->noName) {
|
||||
$param->noName = false;
|
||||
}
|
||||
|
||||
switch ($param->name) {
|
||||
|
||||
case 'ENCODING':
|
||||
// This value only existed in vCard 2.1, and should be
|
||||
// removed for anything else.
|
||||
if (strtoupper($param->getValue()) !== 'QUOTED-PRINTABLE') {
|
||||
if ('QUOTED-PRINTABLE' !== strtoupper($param->getValue())) {
|
||||
$newProperty->add($param->name, $param->getParts());
|
||||
}
|
||||
break;
|
||||
@ -450,7 +411,7 @@ class VCardConverter {
|
||||
* Any other PREF numbers we'll drop.
|
||||
*/
|
||||
case 'PREF':
|
||||
if ($param->getValue() == '1') {
|
||||
if ('1' == $param->getValue()) {
|
||||
$newProperty->add('TYPE', 'PREF');
|
||||
}
|
||||
break;
|
||||
@ -458,10 +419,7 @@ class VCardConverter {
|
||||
default:
|
||||
$newProperty->add($param->name, $param->getParts());
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
7
vendor/sabre/vobject/lib/Version.php
vendored
7
vendor/sabre/vobject/lib/Version.php
vendored
@ -9,11 +9,10 @@ namespace Sabre\VObject;
|
||||
* @author Evert Pot (http://evertpot.com/)
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Version {
|
||||
|
||||
class Version
|
||||
{
|
||||
/**
|
||||
* Full version number.
|
||||
*/
|
||||
const VERSION = '4.1.6';
|
||||
|
||||
const VERSION = '4.2.0';
|
||||
}
|
||||
|
28
vendor/sabre/vobject/lib/Writer.php
vendored
28
vendor/sabre/vobject/lib/Writer.php
vendored
@ -14,8 +14,8 @@ use Sabre\Xml;
|
||||
* @author Ivan Enderlin
|
||||
* @license http://sabre.io/license/ Modified BSD License
|
||||
*/
|
||||
class Writer {
|
||||
|
||||
class Writer
|
||||
{
|
||||
/**
|
||||
* Serializes a vCard or iCalendar object.
|
||||
*
|
||||
@ -23,10 +23,9 @@ class Writer {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
static function write(Component $component) {
|
||||
|
||||
public static function write(Component $component)
|
||||
{
|
||||
return $component->serialize();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -37,10 +36,9 @@ class Writer {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
static function writeJson(Component $component, $options = 0) {
|
||||
|
||||
public static function writeJson(Component $component, $options = 0)
|
||||
{
|
||||
return json_encode($component, $options);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -50,8 +48,8 @@ class Writer {
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
static function writeXml(Component $component) {
|
||||
|
||||
public static function writeXml(Component $component)
|
||||
{
|
||||
$writer = new Xml\Writer();
|
||||
$writer->openMemory();
|
||||
$writer->setIndent(true);
|
||||
@ -59,15 +57,11 @@ class Writer {
|
||||
$writer->startDocument('1.0', 'utf-8');
|
||||
|
||||
if ($component instanceof Component\VCalendar) {
|
||||
|
||||
$writer->startElement('icalendar');
|
||||
$writer->writeAttribute('xmlns', Parser\Xml::XCAL_NAMESPACE);
|
||||
|
||||
$writer->writeAttribute('xmlns', Parser\XML::XCAL_NAMESPACE);
|
||||
} else {
|
||||
|
||||
$writer->startElement('vcards');
|
||||
$writer->writeAttribute('xmlns', Parser\Xml::XCARD_NAMESPACE);
|
||||
|
||||
$writer->writeAttribute('xmlns', Parser\XML::XCARD_NAMESPACE);
|
||||
}
|
||||
|
||||
$component->xmlSerialize($writer);
|
||||
@ -75,7 +69,5 @@ class Writer {
|
||||
$writer->endElement();
|
||||
|
||||
return $writer->outputMemory();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Automatically generated timezone file
|
||||
* Automatically generated timezone file.
|
||||
*
|
||||
* Last update: 2016-08-24T17:35:38-04:00
|
||||
* Source: http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml
|
||||
|
3
vendor/sabre/vobject/phpstan.neon
vendored
Normal file
3
vendor/sabre/vobject/phpstan.neon
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
parameters:
|
||||
level: 0
|
||||
bootstrap: %currentWorkingDirectory%/vendor/autoload.php
|
Reference in New Issue
Block a user