diff --git a/app/common.php b/app/common.php
index 8a926f0f3..ef0751873 100755
--- a/app/common.php
+++ b/app/common.php
@@ -1874,7 +1874,8 @@ function MyUrl($path, $params = [])
$ds = ($script_name == 'index.php') ? '/' : '';
$join = ($script_name != 'index.php' || $url_model == 0) ? $ds.'?s=' : '/';
$len = $is_api ? 4 : ($is_install ? 8 : 6);
- $url = str_replace('/'.$path, $join.substr($path, $len), $url);
+ $path = substr($path, $len);
+ $url = str_replace('/'.$path, $join.$path, $url);
// 避免非当前目录生成url索引错误
if($script_name != 'index.php' && $is_index)
diff --git a/composer.lock b/composer.lock
index e69df4c2b..f74d9f54c 100644
--- a/composer.lock
+++ b/composer.lock
@@ -8,16 +8,16 @@
"packages": [
{
"name": "ezyang/htmlpurifier",
- "version": "v4.14.0",
+ "version": "v4.16.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75"
+ "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/12ab42bd6e742c70c0a52f7b82477fcd44e64b75",
- "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8",
+ "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8",
"shasum": "",
"mirrors": [
{
@@ -27,7 +27,17 @@
]
},
"require": {
- "php": ">=5.2"
+ "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0"
+ },
+ "require-dev": {
+ "cerdic/css-tidy": "^1.7 || ^2.0",
+ "simpletest/simpletest": "dev-master"
+ },
+ "suggest": {
+ "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
+ "ext-bcmath": "Used for unit conversion and imagecrash protection",
+ "ext-iconv": "Converts text to and from non-UTF-8 encodings",
+ "ext-tidy": "Used for pretty-printing HTML"
},
"type": "library",
"autoload": {
@@ -59,228 +69,9 @@
],
"support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues",
- "source": "https://github.com/ezyang/htmlpurifier/tree/v4.14.0"
+ "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0"
},
- "time": "2021-12-25T01:21:49+00:00"
- },
- {
- "name": "league/flysystem",
- "version": "1.1.9",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/flysystem.git",
- "reference": "094defdb4a7001845300334e7c1ee2335925ef99"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99",
- "reference": "094defdb4a7001845300334e7c1ee2335925ef99",
- "shasum": "",
- "mirrors": [
- {
- "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
- "preferred": true
- }
- ]
- },
- "require": {
- "ext-fileinfo": "*",
- "league/mime-type-detection": "^1.3",
- "php": "^7.2.5 || ^8.0"
- },
- "conflict": {
- "league/flysystem-sftp": "<1.0.6"
- },
- "require-dev": {
- "phpspec/prophecy": "^1.11.1",
- "phpunit/phpunit": "^8.5.8"
- },
- "suggest": {
- "ext-ftp": "Allows you to use FTP server storage",
- "ext-openssl": "Allows you to use FTPS server storage",
- "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
- "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
- "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
- "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
- "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
- "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
- "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
- "league/flysystem-webdav": "Allows you to use WebDAV storage",
- "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
- "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
- "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "League\\Flysystem\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Frank de Jonge",
- "email": "info@frenky.net"
- }
- ],
- "description": "Filesystem abstraction: Many filesystems, one API.",
- "keywords": [
- "Cloud Files",
- "WebDAV",
- "abstraction",
- "aws",
- "cloud",
- "copy.com",
- "dropbox",
- "file systems",
- "files",
- "filesystem",
- "filesystems",
- "ftp",
- "rackspace",
- "remote",
- "s3",
- "sftp",
- "storage"
- ],
- "support": {
- "issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/1.1.9"
- },
- "funding": [
- {
- "url": "https://offset.earth/frankdejonge",
- "type": "other"
- }
- ],
- "time": "2021-12-09T09:40:50+00:00"
- },
- {
- "name": "league/flysystem-cached-adapter",
- "version": "1.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/flysystem-cached-adapter.git",
- "reference": "d1925efb2207ac4be3ad0c40b8277175f99ffaff"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/d1925efb2207ac4be3ad0c40b8277175f99ffaff",
- "reference": "d1925efb2207ac4be3ad0c40b8277175f99ffaff",
- "shasum": "",
- "mirrors": [
- {
- "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
- "preferred": true
- }
- ]
- },
- "require": {
- "league/flysystem": "~1.0",
- "psr/cache": "^1.0.0"
- },
- "require-dev": {
- "mockery/mockery": "~0.9",
- "phpspec/phpspec": "^3.4",
- "phpunit/phpunit": "^5.7",
- "predis/predis": "~1.0",
- "tedivm/stash": "~0.12"
- },
- "suggest": {
- "ext-phpredis": "Pure C implemented extension for PHP"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "League\\Flysystem\\Cached\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "frankdejonge",
- "email": "info@frenky.net"
- }
- ],
- "description": "An adapter decorator to enable meta-data caching.",
- "support": {
- "issues": "https://github.com/thephpleague/flysystem-cached-adapter/issues",
- "source": "https://github.com/thephpleague/flysystem-cached-adapter/tree/master"
- },
- "time": "2020-07-25T15:56:04+00:00"
- },
- {
- "name": "league/mime-type-detection",
- "version": "1.11.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/mime-type-detection.git",
- "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
- "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
- "shasum": "",
- "mirrors": [
- {
- "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
- "preferred": true
- }
- ]
- },
- "require": {
- "ext-fileinfo": "*",
- "php": "^7.2 || ^8.0"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^3.2",
- "phpstan/phpstan": "^0.12.68",
- "phpunit/phpunit": "^8.5.8 || ^9.3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "League\\MimeTypeDetection\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Frank de Jonge",
- "email": "info@frankdejonge.nl"
- }
- ],
- "description": "Mime-type detection for Flysystem",
- "support": {
- "issues": "https://github.com/thephpleague/mime-type-detection/issues",
- "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0"
- },
- "funding": [
- {
- "url": "https://github.com/frankdejonge",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
- "type": "tidelift"
- }
- ],
- "time": "2022-04-17T13:12:02+00:00"
+ "time": "2022-09-18T07:06:19+00:00"
},
{
"name": "maennchen/zipstream-php",
@@ -627,16 +418,16 @@
},
{
"name": "phpoffice/phpspreadsheet",
- "version": "1.24.0",
+ "version": "1.25.2",
"source": {
"type": "git",
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
- "reference": "ebe8745c92a7cac4514d040758393b5399633b83"
+ "reference": "a317a09e7def49852400a4b3eca4a4b0790ceeb5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/ebe8745c92a7cac4514d040758393b5399633b83",
- "reference": "ebe8745c92a7cac4514d040758393b5399633b83",
+ "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a317a09e7def49852400a4b3eca4a4b0790ceeb5",
+ "reference": "a317a09e7def49852400a4b3eca4a4b0790ceeb5",
"shasum": "",
"mirrors": [
{
@@ -659,33 +450,34 @@
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*",
- "ezyang/htmlpurifier": "^4.13",
+ "ezyang/htmlpurifier": "^4.15",
"maennchen/zipstream-php": "^2.1",
"markbaker/complex": "^3.0",
"markbaker/matrix": "^3.0",
"php": "^7.3 || ^8.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
- "psr/simple-cache": "^1.0 || ^2.0"
+ "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"dompdf/dompdf": "^1.0 || ^2.0",
"friendsofphp/php-cs-fixer": "^3.2",
- "jpgraph/jpgraph": "^4.0",
+ "mitoteam/jpgraph": "10.2.4",
"mpdf/mpdf": "8.1.1",
"phpcompatibility/php-compatibility": "^9.3",
"phpstan/phpstan": "^1.1",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^8.5 || ^9.0",
"squizlabs/php_codesniffer": "^3.7",
- "tecnickcom/tcpdf": "^6.4"
+ "tecnickcom/tcpdf": "6.5"
},
"suggest": {
- "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
- "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+ "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+ "ext-intl": "PHP Internationalization Functions",
+ "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
- "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)"
+ "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
},
"type": "library",
"autoload": {
@@ -731,64 +523,9 @@
],
"support": {
"issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
- "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.24.0"
+ "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.25.2"
},
- "time": "2022-07-09T13:49:09+00:00"
- },
- {
- "name": "psr/cache",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/cache.git",
- "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
- "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
- "shasum": "",
- "mirrors": [
- {
- "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
- "preferred": true
- }
- ]
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Cache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for caching libraries",
- "keywords": [
- "cache",
- "psr",
- "psr-6"
- ],
- "support": {
- "source": "https://github.com/php-fig/cache/tree/master"
- },
- "time": "2016-08-06T20:24:11+00:00"
+ "time": "2022-09-25T17:21:01+00:00"
},
{
"name": "psr/container",
@@ -1137,16 +874,16 @@
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.26.0",
+ "version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
- "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": "",
"mirrors": [
{
@@ -1167,7 +904,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1206,7 +943,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
},
"funding": [
{
@@ -1222,20 +959,20 @@
"type": "tidelift"
}
],
- "time": "2022-05-24T11:49:31+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
"name": "topthink/framework",
- "version": "v6.0.13",
+ "version": "v6.1.1",
"source": {
"type": "git",
"url": "https://github.com/top-think/framework.git",
- "reference": "126d5b2cbacb73d6e2a85cbc7a2c6ee59d0b3fa6"
+ "reference": "2cb56f3e6f3c479fe90ea5f28d38d3b5ef6c4210"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/top-think/framework/zipball/126d5b2cbacb73d6e2a85cbc7a2c6ee59d0b3fa6",
- "reference": "126d5b2cbacb73d6e2a85cbc7a2c6ee59d0b3fa6",
+ "url": "https://api.github.com/repos/top-think/framework/zipball/2cb56f3e6f3c479fe90ea5f28d38d3b5ef6c4210",
+ "reference": "2cb56f3e6f3c479fe90ea5f28d38d3b5ef6c4210",
"shasum": "",
"mirrors": [
{
@@ -1247,8 +984,6 @@
"require": {
"ext-json": "*",
"ext-mbstring": "*",
- "league/flysystem": "^1.1.4",
- "league/flysystem-cached-adapter": "^1.0",
"php": ">=7.2.5",
"psr/container": "~1.0",
"psr/http-message": "^1.0",
@@ -1293,9 +1028,9 @@
],
"support": {
"issues": "https://github.com/top-think/framework/issues",
- "source": "https://github.com/top-think/framework/tree/v6.0.13"
+ "source": "https://github.com/top-think/framework/tree/v6.1.1"
},
- "time": "2022-07-15T02:52:08+00:00"
+ "time": "2022-10-26T03:48:53+00:00"
},
{
"name": "topthink/think-helper",
@@ -1351,16 +1086,16 @@
},
{
"name": "topthink/think-multi-app",
- "version": "v1.0.14",
+ "version": "v1.0.15",
"source": {
"type": "git",
"url": "https://github.com/top-think/think-multi-app.git",
- "reference": "ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3"
+ "reference": "387e0dac059c20f92cac5da41a871e10829c1c97"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3",
- "reference": "ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3",
+ "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/387e0dac059c20f92cac5da41a871e10829c1c97",
+ "reference": "387e0dac059c20f92cac5da41a871e10829c1c97",
"shasum": "",
"mirrors": [
{
@@ -1371,7 +1106,7 @@
},
"require": {
"php": ">=7.1.0",
- "topthink/framework": "^6.0.0"
+ "topthink/framework": "^6.0"
},
"type": "library",
"extra": {
@@ -1399,9 +1134,9 @@
"description": "thinkphp6 multi app support",
"support": {
"issues": "https://github.com/top-think/think-multi-app/issues",
- "source": "https://github.com/top-think/think-multi-app/tree/master"
+ "source": "https://github.com/top-think/think-multi-app/tree/v1.0.15"
},
- "time": "2020-07-12T13:50:37+00:00"
+ "time": "2022-10-26T08:03:06+00:00"
},
{
"name": "topthink/think-orm",
@@ -1562,16 +1297,16 @@
"packages-dev": [
{
"name": "symfony/polyfill-php72",
- "version": "v1.26.0",
+ "version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2"
+ "reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2",
- "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
+ "reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
"shasum": "",
"mirrors": [
{
@@ -1586,7 +1321,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1624,7 +1359,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0"
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
},
"funding": [
{
@@ -1640,20 +1375,20 @@
"type": "tidelift"
}
],
- "time": "2022-05-24T11:49:31+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.26.0",
+ "version": "v1.27.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
- "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"shasum": "",
"mirrors": [
{
@@ -1668,7 +1403,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1713,7 +1448,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
},
"funding": [
{
@@ -1729,20 +1464,20 @@
"type": "tidelift"
}
],
- "time": "2022-05-10T07:21:04+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v4.4.44",
+ "version": "v4.4.47",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "f19951007dae942cc79b979c1fe26bfdfbeb54ed"
+ "reference": "1069c7a3fca74578022fab6f81643248d02f8e63"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f19951007dae942cc79b979c1fe26bfdfbeb54ed",
- "reference": "f19951007dae942cc79b979c1fe26bfdfbeb54ed",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63",
+ "reference": "1069c7a3fca74578022fab6f81643248d02f8e63",
"shasum": "",
"mirrors": [
{
@@ -1808,7 +1543,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v4.4.44"
+ "source": "https://github.com/symfony/var-dumper/tree/v4.4.47"
},
"funding": [
{
@@ -1824,20 +1559,20 @@
"type": "tidelift"
}
],
- "time": "2022-07-20T09:59:04+00:00"
+ "time": "2022-10-03T15:15:11+00:00"
},
{
"name": "topthink/think-trace",
- "version": "v1.4",
+ "version": "v1.5",
"source": {
"type": "git",
"url": "https://github.com/top-think/think-trace.git",
- "reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444"
+ "reference": "55027fd79abb744f32a3be8d9e1ccf873a3ca9b7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/top-think/think-trace/zipball/9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
- "reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
+ "url": "https://api.github.com/repos/top-think/think-trace/zipball/55027fd79abb744f32a3be8d9e1ccf873a3ca9b7",
+ "reference": "55027fd79abb744f32a3be8d9e1ccf873a3ca9b7",
"shasum": "",
"mirrors": [
{
@@ -1848,7 +1583,7 @@
},
"require": {
"php": ">=7.1.0",
- "topthink/framework": "^6.0.0"
+ "topthink/framework": "^6.0"
},
"type": "library",
"extra": {
@@ -1879,9 +1614,9 @@
"description": "thinkphp debug trace",
"support": {
"issues": "https://github.com/top-think/think-trace/issues",
- "source": "https://github.com/top-think/think-trace/tree/v1.4"
+ "source": "https://github.com/top-think/think-trace/tree/v1.5"
},
- "time": "2020-06-29T05:27:28+00:00"
+ "time": "2022-10-26T07:56:45+00:00"
}
],
"aliases": [],
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 90ff71461..a8231bc6f 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -7,11 +7,11 @@ $baseDir = dirname($vendorDir);
return array(
'9b552a3cc426e3287cc811caefa3cf53' => $vendorDir . '/topthink/think-helper/src/helper.php',
- '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'35fab96057f1bf5e7aba31a8a6d5fdde' => $vendorDir . '/topthink/think-orm/stubs/load_stubs.php',
- '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
- '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
- '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
+ '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
+ '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'dc1275c308c5b416beb314b6317daca2' => $vendorDir . '/overtrue/pinyin/src/const.php',
+ '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 55c471c88..515c5baaa 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -9,7 +9,7 @@ return array(
'think\\view\\driver\\' => array($vendorDir . '/topthink/think-view/src'),
'think\\trace\\' => array($vendorDir . '/topthink/think-trace/src'),
'think\\app\\' => array($vendorDir . '/topthink/think-multi-app/src'),
- 'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src'),
+ 'think\\' => array($vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src', $vendorDir . '/topthink/framework/src/think'),
'app\\' => array($baseDir . '/app'),
'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'),
'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
@@ -21,13 +21,9 @@ return array(
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
- 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
'PhpOffice\\PhpSpreadsheet\\' => array($vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet'),
'Overtrue\\Pinyin\\' => array($vendorDir . '/overtrue/pinyin/src'),
'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'),
'Matrix\\' => array($vendorDir . '/markbaker/matrix/classes/src'),
- 'League\\MimeTypeDetection\\' => array($vendorDir . '/league/mime-type-detection/src'),
- 'League\\Flysystem\\Cached\\' => array($vendorDir . '/league/flysystem-cached-adapter/src'),
- 'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
'Complex\\' => array($vendorDir . '/markbaker/complex/classes/src'),
);
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index c0164b79d..4fdef920f 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -8,13 +8,13 @@ class ComposerStaticInit1ed187777399b73a018d9a6af63a57d1
{
public static $files = array (
'9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php',
- '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'35fab96057f1bf5e7aba31a8a6d5fdde' => __DIR__ . '/..' . '/topthink/think-orm/stubs/load_stubs.php',
- '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
- '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
- '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
+ '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
+ '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'dc1275c308c5b416beb314b6317daca2' => __DIR__ . '/..' . '/overtrue/pinyin/src/const.php',
+ '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
);
public static $prefixLengthsPsr4 = array (
@@ -47,7 +47,6 @@ class ComposerStaticInit1ed187777399b73a018d9a6af63a57d1
'Psr\\Http\\Message\\' => 17,
'Psr\\Http\\Client\\' => 16,
'Psr\\Container\\' => 14,
- 'Psr\\Cache\\' => 10,
'PhpOffice\\PhpSpreadsheet\\' => 25,
),
'O' =>
@@ -59,12 +58,6 @@ class ComposerStaticInit1ed187777399b73a018d9a6af63a57d1
'MyCLabs\\Enum\\' => 13,
'Matrix\\' => 7,
),
- 'L' =>
- array (
- 'League\\MimeTypeDetection\\' => 25,
- 'League\\Flysystem\\Cached\\' => 24,
- 'League\\Flysystem\\' => 17,
- ),
'C' =>
array (
'Complex\\' => 8,
@@ -86,10 +79,10 @@ class ComposerStaticInit1ed187777399b73a018d9a6af63a57d1
),
'think\\' =>
array (
- 0 => __DIR__ . '/..' . '/topthink/framework/src/think',
- 1 => __DIR__ . '/..' . '/topthink/think-helper/src',
- 2 => __DIR__ . '/..' . '/topthink/think-orm/src',
- 3 => __DIR__ . '/..' . '/topthink/think-template/src',
+ 0 => __DIR__ . '/..' . '/topthink/think-helper/src',
+ 1 => __DIR__ . '/..' . '/topthink/think-orm/src',
+ 2 => __DIR__ . '/..' . '/topthink/think-template/src',
+ 3 => __DIR__ . '/..' . '/topthink/framework/src/think',
),
'app\\' =>
array (
@@ -136,10 +129,6 @@ class ComposerStaticInit1ed187777399b73a018d9a6af63a57d1
array (
0 => __DIR__ . '/..' . '/psr/container/src',
),
- 'Psr\\Cache\\' =>
- array (
- 0 => __DIR__ . '/..' . '/psr/cache/src',
- ),
'PhpOffice\\PhpSpreadsheet\\' =>
array (
0 => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet',
@@ -156,18 +145,6 @@ class ComposerStaticInit1ed187777399b73a018d9a6af63a57d1
array (
0 => __DIR__ . '/..' . '/markbaker/matrix/classes/src',
),
- 'League\\MimeTypeDetection\\' =>
- array (
- 0 => __DIR__ . '/..' . '/league/mime-type-detection/src',
- ),
- 'League\\Flysystem\\Cached\\' =>
- array (
- 0 => __DIR__ . '/..' . '/league/flysystem-cached-adapter/src',
- ),
- 'League\\Flysystem\\' =>
- array (
- 0 => __DIR__ . '/..' . '/league/flysystem/src',
- ),
'Complex\\' =>
array (
0 => __DIR__ . '/..' . '/markbaker/complex/classes/src',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 793c043dd..753e73530 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -2,17 +2,17 @@
"packages": [
{
"name": "ezyang/htmlpurifier",
- "version": "v4.14.0",
- "version_normalized": "4.14.0.0",
+ "version": "v4.16.0",
+ "version_normalized": "4.16.0.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75"
+ "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/12ab42bd6e742c70c0a52f7b82477fcd44e64b75",
- "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8",
+ "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8",
"shasum": "",
"mirrors": [
{
@@ -22,18 +22,28 @@
]
},
"require": {
- "php": ">=5.2"
+ "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0"
},
- "time": "2021-12-25T01:21:49+00:00",
+ "require-dev": {
+ "cerdic/css-tidy": "^1.7 || ^2.0",
+ "simpletest/simpletest": "dev-master"
+ },
+ "suggest": {
+ "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
+ "ext-bcmath": "Used for unit conversion and imagecrash protection",
+ "ext-iconv": "Converts text to and from non-UTF-8 encodings",
+ "ext-tidy": "Used for pretty-printing HTML"
+ },
+ "time": "2022-09-18T07:06:19+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
- "psr-0": {
- "HTMLPurifier": "library/"
- },
"files": [
"library/HTMLPurifier.composer.php"
],
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
"exclude-from-classmap": [
"/library/HTMLPurifier/Language/"
]
@@ -56,232 +66,10 @@
],
"support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues",
- "source": "https://github.com/ezyang/htmlpurifier/tree/v4.14.0"
+ "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0"
},
"install-path": "../ezyang/htmlpurifier"
},
- {
- "name": "league/flysystem",
- "version": "1.1.9",
- "version_normalized": "1.1.9.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/flysystem.git",
- "reference": "094defdb4a7001845300334e7c1ee2335925ef99"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99",
- "reference": "094defdb4a7001845300334e7c1ee2335925ef99",
- "shasum": "",
- "mirrors": [
- {
- "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
- "preferred": true
- }
- ]
- },
- "require": {
- "ext-fileinfo": "*",
- "league/mime-type-detection": "^1.3",
- "php": "^7.2.5 || ^8.0"
- },
- "conflict": {
- "league/flysystem-sftp": "<1.0.6"
- },
- "require-dev": {
- "phpspec/prophecy": "^1.11.1",
- "phpunit/phpunit": "^8.5.8"
- },
- "suggest": {
- "ext-ftp": "Allows you to use FTP server storage",
- "ext-openssl": "Allows you to use FTPS server storage",
- "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
- "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
- "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
- "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
- "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
- "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
- "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
- "league/flysystem-webdav": "Allows you to use WebDAV storage",
- "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
- "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
- "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
- },
- "time": "2021-12-09T09:40:50+00:00",
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "League\\Flysystem\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Frank de Jonge",
- "email": "info@frenky.net"
- }
- ],
- "description": "Filesystem abstraction: Many filesystems, one API.",
- "keywords": [
- "Cloud Files",
- "WebDAV",
- "abstraction",
- "aws",
- "cloud",
- "copy.com",
- "dropbox",
- "file systems",
- "files",
- "filesystem",
- "filesystems",
- "ftp",
- "rackspace",
- "remote",
- "s3",
- "sftp",
- "storage"
- ],
- "support": {
- "issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/1.1.9"
- },
- "funding": [
- {
- "url": "https://offset.earth/frankdejonge",
- "type": "other"
- }
- ],
- "install-path": "../league/flysystem"
- },
- {
- "name": "league/flysystem-cached-adapter",
- "version": "1.1.0",
- "version_normalized": "1.1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/flysystem-cached-adapter.git",
- "reference": "d1925efb2207ac4be3ad0c40b8277175f99ffaff"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/d1925efb2207ac4be3ad0c40b8277175f99ffaff",
- "reference": "d1925efb2207ac4be3ad0c40b8277175f99ffaff",
- "shasum": ""
- },
- "require": {
- "league/flysystem": "~1.0",
- "psr/cache": "^1.0.0"
- },
- "require-dev": {
- "mockery/mockery": "~0.9",
- "phpspec/phpspec": "^3.4",
- "phpunit/phpunit": "^5.7",
- "predis/predis": "~1.0",
- "tedivm/stash": "~0.12"
- },
- "suggest": {
- "ext-phpredis": "Pure C implemented extension for PHP"
- },
- "time": "2020-07-25T15:56:04+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "League\\Flysystem\\Cached\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "frankdejonge",
- "email": "info@frenky.net"
- }
- ],
- "description": "An adapter decorator to enable meta-data caching.",
- "support": {
- "issues": "https://github.com/thephpleague/flysystem-cached-adapter/issues",
- "source": "https://github.com/thephpleague/flysystem-cached-adapter/tree/master"
- },
- "install-path": "../league/flysystem-cached-adapter"
- },
- {
- "name": "league/mime-type-detection",
- "version": "1.11.0",
- "version_normalized": "1.11.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/mime-type-detection.git",
- "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
- "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
- "shasum": "",
- "mirrors": [
- {
- "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
- "preferred": true
- }
- ]
- },
- "require": {
- "ext-fileinfo": "*",
- "php": "^7.2 || ^8.0"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^3.2",
- "phpstan/phpstan": "^0.12.68",
- "phpunit/phpunit": "^8.5.8 || ^9.3"
- },
- "time": "2022-04-17T13:12:02+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "League\\MimeTypeDetection\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Frank de Jonge",
- "email": "info@frankdejonge.nl"
- }
- ],
- "description": "Mime-type detection for Flysystem",
- "support": {
- "issues": "https://github.com/thephpleague/mime-type-detection/issues",
- "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0"
- },
- "funding": [
- {
- "url": "https://github.com/frankdejonge",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
- "type": "tidelift"
- }
- ],
- "install-path": "../league/mime-type-detection"
- },
{
"name": "maennchen/zipstream-php",
"version": "2.2.1",
@@ -642,17 +430,17 @@
},
{
"name": "phpoffice/phpspreadsheet",
- "version": "1.24.0",
- "version_normalized": "1.24.0.0",
+ "version": "1.25.2",
+ "version_normalized": "1.25.2.0",
"source": {
"type": "git",
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
- "reference": "ebe8745c92a7cac4514d040758393b5399633b83"
+ "reference": "a317a09e7def49852400a4b3eca4a4b0790ceeb5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/ebe8745c92a7cac4514d040758393b5399633b83",
- "reference": "ebe8745c92a7cac4514d040758393b5399633b83",
+ "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a317a09e7def49852400a4b3eca4a4b0790ceeb5",
+ "reference": "a317a09e7def49852400a4b3eca4a4b0790ceeb5",
"shasum": "",
"mirrors": [
{
@@ -675,35 +463,36 @@
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*",
- "ezyang/htmlpurifier": "^4.13",
+ "ezyang/htmlpurifier": "^4.15",
"maennchen/zipstream-php": "^2.1",
"markbaker/complex": "^3.0",
"markbaker/matrix": "^3.0",
"php": "^7.3 || ^8.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
- "psr/simple-cache": "^1.0 || ^2.0"
+ "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"dompdf/dompdf": "^1.0 || ^2.0",
"friendsofphp/php-cs-fixer": "^3.2",
- "jpgraph/jpgraph": "^4.0",
+ "mitoteam/jpgraph": "10.2.4",
"mpdf/mpdf": "8.1.1",
"phpcompatibility/php-compatibility": "^9.3",
"phpstan/phpstan": "^1.1",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^8.5 || ^9.0",
"squizlabs/php_codesniffer": "^3.7",
- "tecnickcom/tcpdf": "^6.4"
+ "tecnickcom/tcpdf": "6.5"
},
"suggest": {
- "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
- "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+ "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+ "ext-intl": "PHP Internationalization Functions",
+ "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
- "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)"
+ "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
},
- "time": "2022-07-09T13:49:09+00:00",
+ "time": "2022-09-25T17:21:01+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -749,62 +538,10 @@
],
"support": {
"issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
- "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.24.0"
+ "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.25.2"
},
"install-path": "../phpoffice/phpspreadsheet"
},
- {
- "name": "psr/cache",
- "version": "1.0.1",
- "version_normalized": "1.0.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/cache.git",
- "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
- "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "time": "2016-08-06T20:24:11+00:00",
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Psr\\Cache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for caching libraries",
- "keywords": [
- "cache",
- "psr",
- "psr-6"
- ],
- "support": {
- "source": "https://github.com/php-fig/cache/tree/master"
- },
- "install-path": "../psr/cache"
- },
{
"name": "psr/container",
"version": "1.1.2",
@@ -1158,17 +895,17 @@
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.26.0",
- "version_normalized": "1.26.0.0",
+ "version": "v1.27.0",
+ "version_normalized": "1.27.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
- "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": "",
"mirrors": [
{
@@ -1186,11 +923,11 @@
"suggest": {
"ext-mbstring": "For best performance"
},
- "time": "2022-05-24T11:49:31+00:00",
+ "time": "2022-11-03T14:55:06+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1230,7 +967,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
},
"funding": [
{
@@ -1250,17 +987,17 @@
},
{
"name": "symfony/polyfill-php72",
- "version": "v1.26.0",
- "version_normalized": "1.26.0.0",
+ "version": "v1.27.0",
+ "version_normalized": "1.27.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2"
+ "reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2",
- "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
+ "reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
"shasum": "",
"mirrors": [
{
@@ -1272,11 +1009,11 @@
"require": {
"php": ">=7.1"
},
- "time": "2022-05-24T11:49:31+00:00",
+ "time": "2022-11-03T14:55:06+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1315,7 +1052,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0"
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
},
"funding": [
{
@@ -1335,17 +1072,17 @@
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.26.0",
- "version_normalized": "1.26.0.0",
+ "version": "v1.27.0",
+ "version_normalized": "1.27.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
- "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"shasum": "",
"mirrors": [
{
@@ -1357,11 +1094,11 @@
"require": {
"php": ">=7.1"
},
- "time": "2022-05-10T07:21:04+00:00",
+ "time": "2022-11-03T14:55:06+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1407,7 +1144,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
},
"funding": [
{
@@ -1427,17 +1164,17 @@
},
{
"name": "symfony/var-dumper",
- "version": "v4.4.44",
- "version_normalized": "4.4.44.0",
+ "version": "v4.4.47",
+ "version_normalized": "4.4.47.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "f19951007dae942cc79b979c1fe26bfdfbeb54ed"
+ "reference": "1069c7a3fca74578022fab6f81643248d02f8e63"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f19951007dae942cc79b979c1fe26bfdfbeb54ed",
- "reference": "f19951007dae942cc79b979c1fe26bfdfbeb54ed",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63",
+ "reference": "1069c7a3fca74578022fab6f81643248d02f8e63",
"shasum": "",
"mirrors": [
{
@@ -1467,7 +1204,7 @@
"ext-intl": "To show region name in time zone dump",
"symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
},
- "time": "2022-07-20T09:59:04+00:00",
+ "time": "2022-10-03T15:15:11+00:00",
"bin": [
"Resources/bin/var-dump-server"
],
@@ -1505,7 +1242,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v4.4.44"
+ "source": "https://github.com/symfony/var-dumper/tree/v4.4.47"
},
"funding": [
{
@@ -1525,17 +1262,17 @@
},
{
"name": "topthink/framework",
- "version": "v6.0.13",
- "version_normalized": "6.0.13.0",
+ "version": "v6.1.1",
+ "version_normalized": "6.1.1.0",
"source": {
"type": "git",
"url": "https://github.com/top-think/framework.git",
- "reference": "126d5b2cbacb73d6e2a85cbc7a2c6ee59d0b3fa6"
+ "reference": "2cb56f3e6f3c479fe90ea5f28d38d3b5ef6c4210"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/top-think/framework/zipball/126d5b2cbacb73d6e2a85cbc7a2c6ee59d0b3fa6",
- "reference": "126d5b2cbacb73d6e2a85cbc7a2c6ee59d0b3fa6",
+ "url": "https://api.github.com/repos/top-think/framework/zipball/2cb56f3e6f3c479fe90ea5f28d38d3b5ef6c4210",
+ "reference": "2cb56f3e6f3c479fe90ea5f28d38d3b5ef6c4210",
"shasum": "",
"mirrors": [
{
@@ -1547,8 +1284,6 @@
"require": {
"ext-json": "*",
"ext-mbstring": "*",
- "league/flysystem": "^1.1.4",
- "league/flysystem-cached-adapter": "^1.0",
"php": ">=7.2.5",
"psr/container": "~1.0",
"psr/http-message": "^1.0",
@@ -1563,7 +1298,7 @@
"mockery/mockery": "^1.2",
"phpunit/phpunit": "^7.0"
},
- "time": "2022-07-15T02:52:08+00:00",
+ "time": "2022-10-26T03:48:53+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -1595,7 +1330,7 @@
],
"support": {
"issues": "https://github.com/top-think/framework/issues",
- "source": "https://github.com/top-think/framework/tree/v6.0.13"
+ "source": "https://github.com/top-think/framework/tree/v6.1.1"
},
"install-path": "../topthink/framework"
},
@@ -1656,24 +1391,30 @@
},
{
"name": "topthink/think-multi-app",
- "version": "v1.0.14",
- "version_normalized": "1.0.14.0",
+ "version": "v1.0.15",
+ "version_normalized": "1.0.15.0",
"source": {
"type": "git",
"url": "https://github.com/top-think/think-multi-app.git",
- "reference": "ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3"
+ "reference": "387e0dac059c20f92cac5da41a871e10829c1c97"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3",
- "reference": "ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3",
- "shasum": ""
+ "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/387e0dac059c20f92cac5da41a871e10829c1c97",
+ "reference": "387e0dac059c20f92cac5da41a871e10829c1c97",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
"php": ">=7.1.0",
- "topthink/framework": "^6.0.0"
+ "topthink/framework": "^6.0"
},
- "time": "2020-07-12T13:50:37+00:00",
+ "time": "2022-10-26T08:03:06+00:00",
"type": "library",
"extra": {
"think": {
@@ -1701,7 +1442,7 @@
"description": "thinkphp6 multi app support",
"support": {
"issues": "https://github.com/top-think/think-multi-app/issues",
- "source": "https://github.com/top-think/think-multi-app/tree/master"
+ "source": "https://github.com/top-think/think-multi-app/tree/v1.0.15"
},
"install-path": "../topthink/think-multi-app"
},
@@ -1815,24 +1556,30 @@
},
{
"name": "topthink/think-trace",
- "version": "v1.4",
- "version_normalized": "1.4.0.0",
+ "version": "v1.5",
+ "version_normalized": "1.5.0.0",
"source": {
"type": "git",
"url": "https://github.com/top-think/think-trace.git",
- "reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444"
+ "reference": "55027fd79abb744f32a3be8d9e1ccf873a3ca9b7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/top-think/think-trace/zipball/9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
- "reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
- "shasum": ""
+ "url": "https://api.github.com/repos/top-think/think-trace/zipball/55027fd79abb744f32a3be8d9e1ccf873a3ca9b7",
+ "reference": "55027fd79abb744f32a3be8d9e1ccf873a3ca9b7",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
},
"require": {
"php": ">=7.1.0",
- "topthink/framework": "^6.0.0"
+ "topthink/framework": "^6.0"
},
- "time": "2020-06-29T05:27:28+00:00",
+ "time": "2022-10-26T07:56:45+00:00",
"type": "library",
"extra": {
"think": {
@@ -1863,7 +1610,7 @@
"description": "thinkphp debug trace",
"support": {
"issues": "https://github.com/top-think/think-trace/issues",
- "source": "https://github.com/top-think/think-trace/tree/v1.4"
+ "source": "https://github.com/top-think/think-trace/tree/v1.5"
},
"install-path": "../topthink/think-trace"
},
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 13da4c8ef..405ed8722 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -5,45 +5,18 @@
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
- 'reference' => '2a77126a1909be677e6bde7c623bb5a0fb75d32b',
+ 'reference' => 'ec0420fb511804f40321aab88a9025e147cf54f4',
'name' => 'shopxo/shopxo',
'dev' => true,
),
'versions' => array(
'ezyang/htmlpurifier' => array(
- 'pretty_version' => 'v4.14.0',
- 'version' => '4.14.0.0',
+ 'pretty_version' => 'v4.16.0',
+ 'version' => '4.16.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../ezyang/htmlpurifier',
'aliases' => array(),
- 'reference' => '12ab42bd6e742c70c0a52f7b82477fcd44e64b75',
- 'dev_requirement' => false,
- ),
- 'league/flysystem' => array(
- 'pretty_version' => '1.1.9',
- 'version' => '1.1.9.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../league/flysystem',
- 'aliases' => array(),
- 'reference' => '094defdb4a7001845300334e7c1ee2335925ef99',
- 'dev_requirement' => false,
- ),
- 'league/flysystem-cached-adapter' => array(
- 'pretty_version' => '1.1.0',
- 'version' => '1.1.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../league/flysystem-cached-adapter',
- 'aliases' => array(),
- 'reference' => 'd1925efb2207ac4be3ad0c40b8277175f99ffaff',
- 'dev_requirement' => false,
- ),
- 'league/mime-type-detection' => array(
- 'pretty_version' => '1.11.0',
- 'version' => '1.11.0.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../league/mime-type-detection',
- 'aliases' => array(),
- 'reference' => 'ff6248ea87a9f116e78edd6002e39e5128a0d4dd',
+ 'reference' => '523407fb06eb9e5f3d59889b3978d5bfe94299c8',
'dev_requirement' => false,
),
'maennchen/zipstream-php' => array(
@@ -92,21 +65,12 @@
'dev_requirement' => false,
),
'phpoffice/phpspreadsheet' => array(
- 'pretty_version' => '1.24.0',
- 'version' => '1.24.0.0',
+ 'pretty_version' => '1.25.2',
+ 'version' => '1.25.2.0',
'type' => 'library',
'install_path' => __DIR__ . '/../phpoffice/phpspreadsheet',
'aliases' => array(),
- 'reference' => 'ebe8745c92a7cac4514d040758393b5399633b83',
- 'dev_requirement' => false,
- ),
- 'psr/cache' => array(
- 'pretty_version' => '1.0.1',
- 'version' => '1.0.1.0',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../psr/cache',
- 'aliases' => array(),
- 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
+ 'reference' => 'a317a09e7def49852400a4b3eca4a4b0790ceeb5',
'dev_requirement' => false,
),
'psr/container' => array(
@@ -169,52 +133,52 @@
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
- 'reference' => '2a77126a1909be677e6bde7c623bb5a0fb75d32b',
+ 'reference' => 'ec0420fb511804f40321aab88a9025e147cf54f4',
'dev_requirement' => false,
),
'symfony/polyfill-mbstring' => array(
- 'pretty_version' => 'v1.26.0',
- 'version' => '1.26.0.0',
+ 'pretty_version' => 'v1.27.0',
+ 'version' => '1.27.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(),
- 'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e',
+ 'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534',
'dev_requirement' => false,
),
'symfony/polyfill-php72' => array(
- 'pretty_version' => 'v1.26.0',
- 'version' => '1.26.0.0',
+ 'pretty_version' => 'v1.27.0',
+ 'version' => '1.27.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php72',
'aliases' => array(),
- 'reference' => 'bf44a9fd41feaac72b074de600314a93e2ae78e2',
+ 'reference' => '869329b1e9894268a8a61dabb69153029b7a8c97',
'dev_requirement' => true,
),
'symfony/polyfill-php80' => array(
- 'pretty_version' => 'v1.26.0',
- 'version' => '1.26.0.0',
+ 'pretty_version' => 'v1.27.0',
+ 'version' => '1.27.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php80',
'aliases' => array(),
- 'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace',
+ 'reference' => '7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936',
'dev_requirement' => true,
),
'symfony/var-dumper' => array(
- 'pretty_version' => 'v4.4.44',
- 'version' => '4.4.44.0',
+ 'pretty_version' => 'v4.4.47',
+ 'version' => '4.4.47.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/var-dumper',
'aliases' => array(),
- 'reference' => 'f19951007dae942cc79b979c1fe26bfdfbeb54ed',
+ 'reference' => '1069c7a3fca74578022fab6f81643248d02f8e63',
'dev_requirement' => true,
),
'topthink/framework' => array(
- 'pretty_version' => 'v6.0.13',
- 'version' => '6.0.13.0',
+ 'pretty_version' => 'v6.1.1',
+ 'version' => '6.1.1.0',
'type' => 'library',
'install_path' => __DIR__ . '/../topthink/framework',
'aliases' => array(),
- 'reference' => '126d5b2cbacb73d6e2a85cbc7a2c6ee59d0b3fa6',
+ 'reference' => '2cb56f3e6f3c479fe90ea5f28d38d3b5ef6c4210',
'dev_requirement' => false,
),
'topthink/think-helper' => array(
@@ -227,12 +191,12 @@
'dev_requirement' => false,
),
'topthink/think-multi-app' => array(
- 'pretty_version' => 'v1.0.14',
- 'version' => '1.0.14.0',
+ 'pretty_version' => 'v1.0.15',
+ 'version' => '1.0.15.0',
'type' => 'library',
'install_path' => __DIR__ . '/../topthink/think-multi-app',
'aliases' => array(),
- 'reference' => 'ccaad7c2d33f42cb1cc2a78d6610aaec02cea4c3',
+ 'reference' => '387e0dac059c20f92cac5da41a871e10829c1c97',
'dev_requirement' => false,
),
'topthink/think-orm' => array(
@@ -254,12 +218,12 @@
'dev_requirement' => false,
),
'topthink/think-trace' => array(
- 'pretty_version' => 'v1.4',
- 'version' => '1.4.0.0',
+ 'pretty_version' => 'v1.5',
+ 'version' => '1.5.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../topthink/think-trace',
'aliases' => array(),
- 'reference' => '9a9fa8f767b6c66c5a133ad21ca1bc96ad329444',
+ 'reference' => '55027fd79abb744f32a3be8d9e1ccf873a3ca9b7',
'dev_requirement' => true,
),
'topthink/think-view' => array(
diff --git a/vendor/ezyang/htmlpurifier/CHANGELOG.md b/vendor/ezyang/htmlpurifier/CHANGELOG.md
new file mode 100644
index 000000000..55cb9029c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/CHANGELOG.md
@@ -0,0 +1,6 @@
+# [4.16.0](https://github.com/ezyang/htmlpurifier/compare/v4.15.0...v4.16.0) (2022-09-18)
+
+
+### Features
+
+* add semantic release ([#307](https://github.com/ezyang/htmlpurifier/issues/307)) ([db31243](https://github.com/ezyang/htmlpurifier/commit/db312435cb9d8d73395f75f9642a43ba6de5e903)), closes [#322](https://github.com/ezyang/htmlpurifier/issues/322) [#323](https://github.com/ezyang/htmlpurifier/issues/323) [#326](https://github.com/ezyang/htmlpurifier/issues/326) [#327](https://github.com/ezyang/htmlpurifier/issues/327) [#328](https://github.com/ezyang/htmlpurifier/issues/328) [#329](https://github.com/ezyang/htmlpurifier/issues/329) [#330](https://github.com/ezyang/htmlpurifier/issues/330) [#331](https://github.com/ezyang/htmlpurifier/issues/331) [#332](https://github.com/ezyang/htmlpurifier/issues/332) [#333](https://github.com/ezyang/htmlpurifier/issues/333) [#337](https://github.com/ezyang/htmlpurifier/issues/337) [#335](https://github.com/ezyang/htmlpurifier/issues/335) [ezyang/htmlpurifier#334](https://github.com/ezyang/htmlpurifier/issues/334) [#336](https://github.com/ezyang/htmlpurifier/issues/336) [#338](https://github.com/ezyang/htmlpurifier/issues/338)
diff --git a/vendor/ezyang/htmlpurifier/VERSION b/vendor/ezyang/htmlpurifier/VERSION
index 09ce0ce71..f029ee574 100644
--- a/vendor/ezyang/htmlpurifier/VERSION
+++ b/vendor/ezyang/htmlpurifier/VERSION
@@ -1 +1 @@
-4.14.0
\ No newline at end of file
+4.15.0
\ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/composer.json b/vendor/ezyang/htmlpurifier/composer.json
index 5f62d889d..d75582950 100644
--- a/vendor/ezyang/htmlpurifier/composer.json
+++ b/vendor/ezyang/htmlpurifier/composer.json
@@ -13,7 +13,11 @@
}
],
"require": {
- "php": ">=5.2"
+ "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0"
+ },
+ "require-dev": {
+ "cerdic/css-tidy": "^1.7 || ^2.0",
+ "simpletest/simpletest": "dev-master"
},
"autoload": {
"psr-0": { "HTMLPurifier": "library/" },
@@ -21,5 +25,20 @@
"exclude-from-classmap": [
"/library/HTMLPurifier/Language/"
]
- }
+ },
+ "suggest": {
+ "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
+ "ext-iconv": "Converts text to and from non-UTF-8 encodings",
+ "ext-bcmath": "Used for unit conversion and imagecrash protection",
+ "ext-tidy": "Used for pretty-printing HTML"
+ },
+ "config": {
+ "sort-packages": true
+ },
+ "repositories": [
+ {
+ "type": "vcs",
+ "url": "https://github.com/ezyang/simpletest.git"
+ }
+ ]
}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
index ee81cac68..47ee0133d 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
@@ -7,7 +7,7 @@
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
* FILE, changes will be overwritten the next time the script is run.
*
- * @version 4.14.0
+ * @version 4.15.0
*
* @warning
* You must *not* include any other HTML Purifier files before this file,
@@ -107,6 +107,7 @@ require 'HTMLPurifier/AttrDef/HTML/Bool.php';
require 'HTMLPurifier/AttrDef/HTML/Nmtokens.php';
require 'HTMLPurifier/AttrDef/HTML/Class.php';
require 'HTMLPurifier/AttrDef/HTML/Color.php';
+require 'HTMLPurifier/AttrDef/HTML/ContentEditable.php';
require 'HTMLPurifier/AttrDef/HTML/FrameTarget.php';
require 'HTMLPurifier/AttrDef/HTML/ID.php';
require 'HTMLPurifier/AttrDef/HTML/Pixels.php';
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
index 2177fc851..26f061276 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
@@ -19,7 +19,7 @@
*/
/*
- HTML Purifier 4.14.0 - Standards Compliant HTML Filtering
+ HTML Purifier 4.15.0 - Standards Compliant HTML Filtering
Copyright (C) 2006-2008 Edward Z. Yang
This library is free software; you can redistribute it and/or
@@ -58,12 +58,12 @@ class HTMLPurifier
* Version of HTML Purifier.
* @type string
*/
- public $version = '4.14.0';
+ public $version = '4.15.0';
/**
* Constant with version of HTML Purifier.
*/
- const VERSION = '4.14.0';
+ const VERSION = '4.15.0';
/**
* Global configuration object.
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
index a3261f8a3..94543f593 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
@@ -101,6 +101,7 @@ require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Nmtokens.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Class.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Color.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ContentEditable.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/FrameTarget.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ID.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Pixels.php';
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php
new file mode 100644
index 000000000..5b03d3e37
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php
@@ -0,0 +1,16 @@
+get('HTML.Trusted')) {
+ $allowed = array('', 'true', 'false');
+ }
+
+ $enum = new HTMLPurifier_AttrDef_Enum($allowed);
+
+ return $enum->validate($string, $config, $context);
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
index 36079b786..5a1fdbbfc 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
@@ -8,6 +8,11 @@
class HTMLPurifier_AttrTransform_NameSync extends HTMLPurifier_AttrTransform
{
+ /**
+ * @type HTMLPurifier_AttrDef_HTML_ID
+ */
+ public $idDef;
+
public function __construct()
{
$this->idDef = new HTMLPurifier_AttrDef_HTML_ID();
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
index 1143b4b49..1033106b3 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
@@ -24,6 +24,11 @@ class HTMLPurifier_AttrTransform_SafeParam extends HTMLPurifier_AttrTransform
*/
private $uri;
+ /**
+ * @type HTMLPurifier_AttrDef_Enum
+ */
+ public $wmode;
+
public function __construct()
{
$this->uri = new HTMLPurifier_AttrDef_URI(true); // embedded
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
index 3b70520b6..e4429e86d 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
@@ -41,6 +41,7 @@ class HTMLPurifier_AttrTypes
$this->info['IAlign'] = self::makeEnum('top,middle,bottom,left,right');
$this->info['LAlign'] = self::makeEnum('top,bottom,left,right');
$this->info['FrameTarget'] = new HTMLPurifier_AttrDef_HTML_FrameTarget();
+ $this->info['ContentEditable'] = new HTMLPurifier_AttrDef_HTML_ContentEditable();
// unimplemented aliases
$this->info['ContentType'] = new HTMLPurifier_AttrDef_Text();
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
index 4fc70e0ef..3d584e727 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
@@ -22,6 +22,8 @@ class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
// XXX: This whole business with 'wrap' is all a bit unsatisfactory
public $elements = array('li' => true, 'ul' => true, 'ol' => true);
+ public $whitespace;
+
/**
* @param array $children
* @param HTMLPurifier_Config $config
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
index 16a6b322b..797d26877 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
@@ -21,7 +21,7 @@ class HTMLPurifier_Config
* HTML Purifier's version
* @type string
*/
- public $version = '4.14.0';
+ public $version = '4.15.0';
/**
* Whether or not to automatically finalize
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
index d5311cedc..57cfd2bb0 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
@@ -176,7 +176,7 @@ class HTMLPurifier_ElementDef
if (!empty($def->content_model)) {
$this->content_model =
- str_replace("#SUPER", $this->content_model, $def->content_model);
+ str_replace("#SUPER", (string)$this->content_model, $def->content_model);
$this->child = false;
}
if (!empty($def->content_model_type)) {
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
index 40a24266a..d4791cc1b 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
@@ -398,8 +398,8 @@ class HTMLPurifier_Encoder
// characters to their true byte-wise ASCII/UTF-8 equivalents.
$str = strtr($str, self::testEncodingSupportsASCII($encoding));
return $str;
- } elseif ($encoding === 'iso-8859-1') {
- $str = utf8_encode($str);
+ } elseif ($encoding === 'iso-8859-1' && function_exists('mb_convert_encoding')) {
+ $str = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1');
return $str;
}
$bug = HTMLPurifier_Encoder::testIconvTruncateBug();
@@ -450,8 +450,8 @@ class HTMLPurifier_Encoder
// Normal stuff
$str = self::iconv('utf-8', $encoding . '//IGNORE', $str);
return $str;
- } elseif ($encoding === 'iso-8859-1') {
- $str = utf8_decode($str);
+ } elseif ($encoding === 'iso-8859-1' && function_exists('mb_convert_encoding')) {
+ $str = mb_convert_encoding($str, 'ISO-8859-1', 'UTF-8');
return $str;
}
trigger_error('Encoding not supported', E_USER_ERROR);
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
index a96ab1bef..7220c14cc 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
@@ -17,6 +17,7 @@ class HTMLPurifier_HTMLModule_CommonAttributes extends HTMLPurifier_HTMLModule
'class' => 'Class',
'id' => 'ID',
'title' => 'CDATA',
+ 'contenteditable' => 'ContentEditable',
),
'Lang' => array(),
'I18N' => array(
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
index 9ee7aa84d..42d514447 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
@@ -31,6 +31,16 @@ class HTMLPurifier_Injector_RemoveSpansWithoutAttributes extends HTMLPurifier_In
*/
private $context;
+ /**
+ * @type SplObjectStorage
+ */
+ private $markForDeletion;
+
+ public function __construct()
+ {
+ $this->markForDeletion = new SplObjectStorage();
+ }
+
public function prepare($config, $context)
{
$this->attrValidator = new HTMLPurifier_AttrValidator();
@@ -64,7 +74,7 @@ class HTMLPurifier_Injector_RemoveSpansWithoutAttributes extends HTMLPurifier_In
if ($current instanceof HTMLPurifier_Token_End && $current->name === 'span') {
// Mark closing span tag for deletion
- $current->markForDeletion = true;
+ $this->markForDeletion->attach($current);
// Delete open span tag
$token = false;
}
@@ -75,7 +85,8 @@ class HTMLPurifier_Injector_RemoveSpansWithoutAttributes extends HTMLPurifier_In
*/
public function handleEnd(&$token)
{
- if ($token->markForDeletion) {
+ if ($this->markForDeletion->contains($token)) {
+ $this->markForDeletion->detach($token);
$token = false;
}
}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
index e70da55a9..b6ea12345 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
@@ -78,7 +78,7 @@ class HTMLPurifier_Length
if ($this->n === '0' && $this->unit === false) {
return true;
}
- if (!ctype_lower($this->unit)) {
+ if ($this->unit === false || !ctype_lower($this->unit)) {
$this->unit = strtolower($this->unit);
}
if (!isset(HTMLPurifier_Length::$allowedUnits[$this->unit])) {
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
index e9da3ed5e..c21f36491 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
@@ -48,6 +48,11 @@ class HTMLPurifier_Lexer
*/
public $tracksLineNumbers = false;
+ /**
+ * @type HTMLPurifier_EntityParser
+ */
+ private $_entity_parser;
+
// -- STATIC ----------------------------------------------------------
/**
@@ -306,8 +311,8 @@ class HTMLPurifier_Lexer
{
// normalize newlines to \n
if ($config->get('Core.NormalizeNewlines')) {
- $html = str_replace("\r\n", "\n", $html);
- $html = str_replace("\r", "\n", $html);
+ $html = str_replace("\r\n", "\n", (string)$html);
+ $html = str_replace("\r", "\n", (string)$html);
}
if ($config->get('HTML.Trusted')) {
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
index 72476ddf3..1564f283d 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
@@ -4410,7 +4410,7 @@ class HTML5TreeConstructer
foreach ($token['attr'] as $attr) {
if (!$el->hasAttribute($attr['name'])) {
- $el->setAttribute($attr['name'], $attr['value']);
+ $el->setAttribute($attr['name'], (string)$attr['value']);
}
}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
index 15b330ea3..f68fc8c30 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
@@ -29,6 +29,7 @@ class HTMLPurifier_PropertyListIterator extends FilterIterator
/**
* @return bool
*/
+ #[\ReturnTypeWillChange]
public function accept()
{
$key = $this->getInnerIterator()->key();
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
index c07370197..c41ae3a76 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
@@ -20,6 +20,7 @@ class HTMLPurifier_StringHash extends ArrayObject
* @param mixed $index
* @return mixed
*/
+ #[\ReturnTypeWillChange]
public function offsetGet($index)
{
$this->accessed[$index] = true;
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
index a6645c17e..32197c0e6 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
@@ -35,7 +35,7 @@ class HTMLPurifier_URIFilter_HostBlacklist extends HTMLPurifier_URIFilter
public function filter(&$uri, $config, $context)
{
foreach ($this->blacklist as $blacklisted_host_fragment) {
- if (strpos($uri->host, $blacklisted_host_fragment) !== false) {
+ if ($uri->host !== null && strpos($uri->host, $blacklisted_host_fragment) !== false) {
return false;
}
}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
index 6e03315a1..e1393deb7 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
@@ -100,11 +100,11 @@ class HTMLPurifier_URIFilter_Munge extends HTMLPurifier_URIFilter
$string = $uri->toString();
// always available
$this->replace['%s'] = $string;
- $this->replace['%r'] = $context->get('EmbeddedURI', true);
- $token = $context->get('CurrentToken', true);
- $this->replace['%n'] = $token ? $token->name : null;
- $this->replace['%m'] = $context->get('CurrentAttr', true);
- $this->replace['%p'] = $context->get('CurrentCSSProperty', true);
+ $this->replace['%r'] = $context->get('EmbeddedURI', true) ?: '';
+ $token = $context->get('CurrentToken', true) ?: '';
+ $this->replace['%n'] = $token ? $token->name : '';
+ $this->replace['%m'] = $context->get('CurrentAttr', true) ?: '';
+ $this->replace['%p'] = $context->get('CurrentCSSProperty', true) ?: '';
// not always available
if ($this->secretKey) {
$this->replace['%t'] = hash_hmac("sha256", $string, $this->secretKey);
diff --git a/vendor/league/flysystem-cached-adapter/.editorconfig b/vendor/league/flysystem-cached-adapter/.editorconfig
deleted file mode 100644
index 153cf3ef5..000000000
--- a/vendor/league/flysystem-cached-adapter/.editorconfig
+++ /dev/null
@@ -1,10 +0,0 @@
-; top-most EditorConfig file
-root = true
-
-; Unix-style newlines
-[*]
-end_of_line = LF
-
-[*.php]
-indent_style = space
-indent_size = 4
diff --git a/vendor/league/flysystem-cached-adapter/.gitignore b/vendor/league/flysystem-cached-adapter/.gitignore
deleted file mode 100644
index 7aea75f4f..000000000
--- a/vendor/league/flysystem-cached-adapter/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-coverage
-coverage.xml
-composer.lock
-vendor
\ No newline at end of file
diff --git a/vendor/league/flysystem-cached-adapter/.php_cs b/vendor/league/flysystem-cached-adapter/.php_cs
deleted file mode 100644
index 6643a32cf..000000000
--- a/vendor/league/flysystem-cached-adapter/.php_cs
+++ /dev/null
@@ -1,7 +0,0 @@
-level(Symfony\CS\FixerInterface::PSR2_LEVEL)
- ->fixers(['-yoda_conditions', 'ordered_use', 'short_array_syntax'])
- ->finder(Symfony\CS\Finder\DefaultFinder::create()
- ->in(__DIR__.'/src/'));
\ No newline at end of file
diff --git a/vendor/league/flysystem-cached-adapter/.scrutinizer.yml b/vendor/league/flysystem-cached-adapter/.scrutinizer.yml
deleted file mode 100644
index fa39b52b3..000000000
--- a/vendor/league/flysystem-cached-adapter/.scrutinizer.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-filter:
- paths: [src/*]
-checks:
- php:
- code_rating: true
- remove_extra_empty_lines: true
- remove_php_closing_tag: true
- remove_trailing_whitespace: true
- fix_use_statements:
- remove_unused: true
- preserve_multiple: false
- preserve_blanklines: true
- order_alphabetically: true
- fix_php_opening_tag: true
- fix_linefeed: true
- fix_line_ending: true
- fix_identation_4spaces: true
- fix_doc_comments: true
-tools:
- external_code_coverage:
- timeout: 900
- runs: 6
- php_code_coverage: false
- php_code_sniffer:
- config:
- standard: PSR2
- filter:
- paths: ['src']
- php_loc:
- enabled: true
- excluded_dirs: [vendor, spec, stubs]
- php_cpd:
- enabled: true
- excluded_dirs: [vendor, spec, stubs]
\ No newline at end of file
diff --git a/vendor/league/flysystem-cached-adapter/.travis.yml b/vendor/league/flysystem-cached-adapter/.travis.yml
deleted file mode 100644
index 6706449fd..000000000
--- a/vendor/league/flysystem-cached-adapter/.travis.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-language: php
-
-php:
- - 5.5
- - 5.6
- - 7.0
- - 7.1
- - 7.2
-
-matrix:
- allow_failures:
- - php: 5.5
-
-env:
- - COMPOSER_OPTS=""
- - COMPOSER_OPTS="--prefer-lowest"
-
-install:
- - if [[ "${TRAVIS_PHP_VERSION}" == "5.5" ]]; then composer require phpunit/phpunit:^4.8.36 phpspec/phpspec:^2 --prefer-dist --update-with-dependencies; fi
- - if [[ "${TRAVIS_PHP_VERSION}" == "7.2" ]]; then composer require phpunit/phpunit:^6.0 --prefer-dist --update-with-dependencies; fi
- - travis_retry composer update --prefer-dist $COMPOSER_OPTS
-
-script:
- - vendor/bin/phpspec run
- - vendor/bin/phpunit
-
-after_script:
- - wget https://scrutinizer-ci.com/ocular.phar'
- - php ocular.phar code-coverage:upload --format=php-clover ./clover/phpunit.xml'
diff --git a/vendor/league/flysystem-cached-adapter/LICENSE b/vendor/league/flysystem-cached-adapter/LICENSE
deleted file mode 100644
index 666f6c826..000000000
--- a/vendor/league/flysystem-cached-adapter/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 Frank de Jonge
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/vendor/league/flysystem-cached-adapter/clover/.gitignore b/vendor/league/flysystem-cached-adapter/clover/.gitignore
deleted file mode 100644
index d6b7ef32c..000000000
--- a/vendor/league/flysystem-cached-adapter/clover/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/vendor/league/flysystem-cached-adapter/composer.json b/vendor/league/flysystem-cached-adapter/composer.json
deleted file mode 100644
index df7fb7fd9..000000000
--- a/vendor/league/flysystem-cached-adapter/composer.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "league/flysystem-cached-adapter",
- "description": "An adapter decorator to enable meta-data caching.",
- "autoload": {
- "psr-4": {
- "League\\Flysystem\\Cached\\": "src/"
- }
- },
- "require": {
- "league/flysystem": "~1.0",
- "psr/cache": "^1.0.0"
- },
- "require-dev": {
- "phpspec/phpspec": "^3.4",
- "phpunit/phpunit": "^5.7",
- "mockery/mockery": "~0.9",
- "predis/predis": "~1.0",
- "tedivm/stash": "~0.12"
- },
- "suggest": {
- "ext-phpredis": "Pure C implemented extension for PHP"
- },
- "license": "MIT",
- "authors": [
- {
- "name": "frankdejonge",
- "email": "info@frenky.net"
- }
- ]
-}
diff --git a/vendor/league/flysystem-cached-adapter/phpspec.yml b/vendor/league/flysystem-cached-adapter/phpspec.yml
deleted file mode 100644
index 5eabcb21b..000000000
--- a/vendor/league/flysystem-cached-adapter/phpspec.yml
+++ /dev/null
@@ -1,6 +0,0 @@
----
-suites:
- cached_adapter_suite:
- namespace: League\Flysystem\Cached
- psr4_prefix: League\Flysystem\Cached
-formatter.name: pretty
diff --git a/vendor/league/flysystem-cached-adapter/phpunit.php b/vendor/league/flysystem-cached-adapter/phpunit.php
deleted file mode 100644
index d10958796..000000000
--- a/vendor/league/flysystem-cached-adapter/phpunit.php
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
-
- ./tests/
-
-
-
-
- ./src/
-
-
-
-
-
-
-
-
diff --git a/vendor/league/flysystem-cached-adapter/readme.md b/vendor/league/flysystem-cached-adapter/readme.md
deleted file mode 100644
index dd1433d98..000000000
--- a/vendor/league/flysystem-cached-adapter/readme.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Flysystem Cached CachedAdapter
-
-[](https://twitter.com/frankdejonge)
-[](https://travis-ci.org/thephpleague/flysystem-cached-adapter)
-[](https://scrutinizer-ci.com/g/thephpleague/flysystem-cached-adapter/code-structure)
-[](https://scrutinizer-ci.com/g/thephpleague/flysystem-cached-adapter)
-[](LICENSE)
-[](https://packagist.org/packages/league/flysystem-cached-adapter)
-[](https://packagist.org/packages/league/flysystem-cached-adapter)
-
-
-The adapter decorator caches metadata and directory listings.
-
-```bash
-composer require league/flysystem-cached-adapter
-```
-
-## Usage
-
-[Check out the docs.](https://flysystem.thephpleague.com/docs/advanced/caching/)
diff --git a/vendor/league/flysystem-cached-adapter/spec/CachedAdapterSpec.php b/vendor/league/flysystem-cached-adapter/spec/CachedAdapterSpec.php
deleted file mode 100644
index 69428d990..000000000
--- a/vendor/league/flysystem-cached-adapter/spec/CachedAdapterSpec.php
+++ /dev/null
@@ -1,435 +0,0 @@
-adapter = $adapter;
- $this->cache = $cache;
- $this->cache->load()->shouldBeCalled();
- $this->beConstructedWith($adapter, $cache);
- }
-
- public function it_is_initializable()
- {
- $this->shouldHaveType('League\Flysystem\Cached\CachedAdapter');
- $this->shouldHaveType('League\Flysystem\AdapterInterface');
- }
-
- public function it_should_forward_read_streams()
- {
- $path = 'path.txt';
- $response = ['path' => $path];
- $this->adapter->readStream($path)->willReturn($response);
- $this->readStream($path)->shouldbe($response);
- }
-
- public function it_should_cache_writes()
- {
- $type = 'file';
- $path = 'path.txt';
- $contents = 'contents';
- $config = new Config();
- $response = compact('path', 'contents', 'type');
- $this->adapter->write($path, $contents, $config)->willReturn($response);
- $this->cache->updateObject($path, $response, true)->shouldBeCalled();
- $this->write($path, $contents, $config)->shouldBe($response);
- }
-
- public function it_should_cache_streamed_writes()
- {
- $type = 'file';
- $path = 'path.txt';
- $stream = tmpfile();
- $config = new Config();
- $response = compact('path', 'stream', 'type');
- $this->adapter->writeStream($path, $stream, $config)->willReturn($response);
- $this->cache->updateObject($path, ['contents' => false] + $response, true)->shouldBeCalled();
- $this->writeStream($path, $stream, $config)->shouldBe($response);
- fclose($stream);
- }
-
- public function it_should_cache_streamed_updates()
- {
- $type = 'file';
- $path = 'path.txt';
- $stream = tmpfile();
- $config = new Config();
- $response = compact('path', 'stream', 'type');
- $this->adapter->updateStream($path, $stream, $config)->willReturn($response);
- $this->cache->updateObject($path, ['contents' => false] + $response, true)->shouldBeCalled();
- $this->updateStream($path, $stream, $config)->shouldBe($response);
- fclose($stream);
- }
-
- public function it_should_ignore_failed_writes()
- {
- $path = 'path.txt';
- $contents = 'contents';
- $config = new Config();
- $this->adapter->write($path, $contents, $config)->willReturn(false);
- $this->write($path, $contents, $config)->shouldBe(false);
- }
-
- public function it_should_ignore_failed_streamed_writes()
- {
- $path = 'path.txt';
- $contents = tmpfile();
- $config = new Config();
- $this->adapter->writeStream($path, $contents, $config)->willReturn(false);
- $this->writeStream($path, $contents, $config)->shouldBe(false);
- fclose($contents);
- }
-
- public function it_should_cache_updated()
- {
- $type = 'file';
- $path = 'path.txt';
- $contents = 'contents';
- $config = new Config();
- $response = compact('path', 'contents', 'type');
- $this->adapter->update($path, $contents, $config)->willReturn($response);
- $this->cache->updateObject($path, $response, true)->shouldBeCalled();
- $this->update($path, $contents, $config)->shouldBe($response);
- }
-
- public function it_should_ignore_failed_updates()
- {
- $path = 'path.txt';
- $contents = 'contents';
- $config = new Config();
- $this->adapter->update($path, $contents, $config)->willReturn(false);
- $this->update($path, $contents, $config)->shouldBe(false);
- }
-
- public function it_should_ignore_failed_streamed_updates()
- {
- $path = 'path.txt';
- $contents = tmpfile();
- $config = new Config();
- $this->adapter->updateStream($path, $contents, $config)->willReturn(false);
- $this->updateStream($path, $contents, $config)->shouldBe(false);
- fclose($contents);
- }
-
- public function it_should_cache_renames()
- {
- $old = 'old.txt';
- $new = 'new.txt';
- $this->adapter->rename($old, $new)->willReturn(true);
- $this->cache->rename($old, $new)->shouldBeCalled();
- $this->rename($old, $new)->shouldBe(true);
- }
-
- public function it_should_ignore_rename_fails()
- {
- $old = 'old.txt';
- $new = 'new.txt';
- $this->adapter->rename($old, $new)->willReturn(false);
- $this->rename($old, $new)->shouldBe(false);
- }
-
- public function it_should_cache_copies()
- {
- $old = 'old.txt';
- $new = 'new.txt';
- $this->adapter->copy($old, $new)->willReturn(true);
- $this->cache->copy($old, $new)->shouldBeCalled();
- $this->copy($old, $new)->shouldBe(true);
- }
-
- public function it_should_ignore_copy_fails()
- {
- $old = 'old.txt';
- $new = 'new.txt';
- $this->adapter->copy($old, $new)->willReturn(false);
- $this->copy($old, $new)->shouldBe(false);
- }
-
- public function it_should_cache_deletes()
- {
- $delete = 'delete.txt';
- $this->adapter->delete($delete)->willReturn(true);
- $this->cache->delete($delete)->shouldBeCalled();
- $this->delete($delete)->shouldBe(true);
- }
-
- public function it_should_ignore_delete_fails()
- {
- $delete = 'delete.txt';
- $this->adapter->delete($delete)->willReturn(false);
- $this->delete($delete)->shouldBe(false);
- }
-
- public function it_should_cache_dir_deletes()
- {
- $delete = 'delete';
- $this->adapter->deleteDir($delete)->willReturn(true);
- $this->cache->deleteDir($delete)->shouldBeCalled();
- $this->deleteDir($delete)->shouldBe(true);
- }
-
- public function it_should_ignore_delete_dir_fails()
- {
- $delete = 'delete';
- $this->adapter->deleteDir($delete)->willReturn(false);
- $this->deleteDir($delete)->shouldBe(false);
- }
-
- public function it_should_cache_dir_creates()
- {
- $dirname = 'dirname';
- $config = new Config();
- $response = ['path' => $dirname, 'type' => 'dir'];
- $this->adapter->createDir($dirname, $config)->willReturn($response);
- $this->cache->updateObject($dirname, $response, true)->shouldBeCalled();
- $this->createDir($dirname, $config)->shouldBe($response);
- }
-
- public function it_should_ignore_create_dir_fails()
- {
- $dirname = 'dirname';
- $config = new Config();
- $this->adapter->createDir($dirname, $config)->willReturn(false);
- $this->createDir($dirname, $config)->shouldBe(false);
- }
-
- public function it_should_cache_set_visibility()
- {
- $path = 'path.txt';
- $visibility = AdapterInterface::VISIBILITY_PUBLIC;
- $this->adapter->setVisibility($path, $visibility)->willReturn(true);
- $this->cache->updateObject($path, ['path' => $path, 'visibility' => $visibility], true)->shouldBeCalled();
- $this->setVisibility($path, $visibility)->shouldBe(true);
- }
-
- public function it_should_ignore_set_visibility_fails()
- {
- $dirname = 'delete';
- $visibility = AdapterInterface::VISIBILITY_PUBLIC;
- $this->adapter->setVisibility($dirname, $visibility)->willReturn(false);
- $this->setVisibility($dirname, $visibility)->shouldBe(false);
- }
-
- public function it_should_indicate_missing_files()
- {
- $this->cache->has($path = 'path.txt')->willReturn(false);
- $this->has($path)->shouldBe(false);
- }
-
- public function it_should_indicate_file_existance()
- {
- $this->cache->has($path = 'path.txt')->willReturn(true);
- $this->has($path)->shouldBe(true);
- }
-
- public function it_should_cache_missing_files()
- {
- $this->cache->has($path = 'path.txt')->willReturn(null);
- $this->adapter->has($path)->willReturn(false);
- $this->cache->storeMiss($path)->shouldBeCalled();
- $this->has($path)->shouldBe(false);
- }
-
- public function it_should_delete_when_metadata_is_missing()
- {
- $path = 'path.txt';
- $this->cache->has($path)->willReturn(true);
- $this->cache->getSize($path)->willReturn(['path' => $path]);
- $this->adapter->getSize($path)->willReturn($response = ['path' => $path, 'size' => 1024]);
- $this->cache->updateObject($path, $response, true)->shouldBeCalled();
- $this->getSize($path)->shouldBe($response);
- }
-
- public function it_should_cache_has()
- {
- $this->cache->has($path = 'path.txt')->willReturn(null);
- $this->adapter->has($path)->willReturn(true);
- $this->cache->updateObject($path, compact('path'), true)->shouldBeCalled();
- $this->has($path)->shouldBe(true);
- }
-
- public function it_should_list_cached_contents()
- {
- $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(true);
- $response = [['path' => 'path.txt']];
- $this->cache->listContents($dirname, $recursive)->willReturn($response);
- $this->listContents($dirname, $recursive)->shouldBe($response);
- }
-
- public function it_should_ignore_failed_list_contents()
- {
- $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(false);
- $this->adapter->listContents($dirname, $recursive)->willReturn(false);
- $this->listContents($dirname, $recursive)->shouldBe(false);
- }
-
- public function it_should_cache_contents_listings()
- {
- $this->cache->isComplete($dirname = 'dirname', $recursive = true)->willReturn(false);
- $response = [['path' => 'path.txt']];
- $this->adapter->listContents($dirname, $recursive)->willReturn($response);
- $this->cache->storeContents($dirname, $response, $recursive)->shouldBeCalled();
- $this->listContents($dirname, $recursive)->shouldBe($response);
- }
-
- public function it_should_use_cached_visibility()
- {
- $this->make_it_use_getter_cache('getVisibility', 'path.txt', [
- 'path' => 'path.txt',
- 'visibility' => AdapterInterface::VISIBILITY_PUBLIC,
- ]);
- }
-
- public function it_should_cache_get_visibility()
- {
- $path = 'path.txt';
- $response = ['visibility' => AdapterInterface::VISIBILITY_PUBLIC, 'path' => $path];
- $this->make_it_cache_getter('getVisibility', $path, $response);
- }
-
- public function it_should_ignore_failed_get_visibility()
- {
- $path = 'path.txt';
- $this->make_it_ignore_failed_getter('getVisibility', $path);
- }
-
- public function it_should_use_cached_timestamp()
- {
- $this->make_it_use_getter_cache('getTimestamp', 'path.txt', [
- 'path' => 'path.txt',
- 'timestamp' => 1234,
- ]);
- }
-
- public function it_should_cache_timestamps()
- {
- $this->make_it_cache_getter('getTimestamp', 'path.txt', [
- 'path' => 'path.txt',
- 'timestamp' => 1234,
- ]);
- }
-
- public function it_should_ignore_failed_get_timestamps()
- {
- $this->make_it_ignore_failed_getter('getTimestamp', 'path.txt');
- }
-
- public function it_should_cache_get_metadata()
- {
- $path = 'path.txt';
- $response = ['visibility' => AdapterInterface::VISIBILITY_PUBLIC, 'path' => $path];
- $this->make_it_cache_getter('getMetadata', $path, $response);
- }
-
- public function it_should_use_cached_metadata()
- {
- $this->make_it_use_getter_cache('getMetadata', 'path.txt', [
- 'path' => 'path.txt',
- 'timestamp' => 1234,
- ]);
- }
-
- public function it_should_ignore_failed_get_metadata()
- {
- $this->make_it_ignore_failed_getter('getMetadata', 'path.txt');
- }
-
- public function it_should_cache_get_size()
- {
- $path = 'path.txt';
- $response = ['size' => 1234, 'path' => $path];
- $this->make_it_cache_getter('getSize', $path, $response);
- }
-
- public function it_should_use_cached_size()
- {
- $this->make_it_use_getter_cache('getSize', 'path.txt', [
- 'path' => 'path.txt',
- 'size' => 1234,
- ]);
- }
-
- public function it_should_ignore_failed_get_size()
- {
- $this->make_it_ignore_failed_getter('getSize', 'path.txt');
- }
-
- public function it_should_cache_get_mimetype()
- {
- $path = 'path.txt';
- $response = ['mimetype' => 'text/plain', 'path' => $path];
- $this->make_it_cache_getter('getMimetype', $path, $response);
- }
-
- public function it_should_use_cached_mimetype()
- {
- $this->make_it_use_getter_cache('getMimetype', 'path.txt', [
- 'path' => 'path.txt',
- 'mimetype' => 'text/plain',
- ]);
- }
-
- public function it_should_ignore_failed_get_mimetype()
- {
- $this->make_it_ignore_failed_getter('getMimetype', 'path.txt');
- }
-
- public function it_should_cache_reads()
- {
- $path = 'path.txt';
- $response = ['path' => $path, 'contents' => 'contents'];
- $this->make_it_cache_getter('read', $path, $response);
- }
-
- public function it_should_use_cached_file_contents()
- {
- $this->make_it_use_getter_cache('read', 'path.txt', [
- 'path' => 'path.txt',
- 'contents' => 'contents'
- ]);
- }
-
- public function it_should_ignore_failed_reads()
- {
- $this->make_it_ignore_failed_getter('read', 'path.txt');
- }
-
- protected function make_it_use_getter_cache($method, $path, $response)
- {
- $this->cache->{$method}($path)->willReturn($response);
- $this->{$method}($path)->shouldBe($response);
- }
-
- protected function make_it_cache_getter($method, $path, $response)
- {
- $this->cache->{$method}($path)->willReturn(false);
- $this->adapter->{$method}($path)->willReturn($response);
- $this->cache->updateObject($path, $response, true)->shouldBeCalled();
- $this->{$method}($path)->shouldBe($response);
- }
-
- protected function make_it_ignore_failed_getter($method, $path)
- {
- $this->cache->{$method}($path)->willReturn(false);
- $this->adapter->{$method}($path)->willReturn(false);
- $this->{$method}($path)->shouldBe(false);
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/src/CacheInterface.php b/vendor/league/flysystem-cached-adapter/src/CacheInterface.php
deleted file mode 100644
index de3ab3d90..000000000
--- a/vendor/league/flysystem-cached-adapter/src/CacheInterface.php
+++ /dev/null
@@ -1,101 +0,0 @@
-adapter = $adapter;
- $this->cache = $cache;
- $this->cache->load();
- }
-
- /**
- * Get the underlying Adapter implementation.
- *
- * @return AdapterInterface
- */
- public function getAdapter()
- {
- return $this->adapter;
- }
-
- /**
- * Get the used Cache implementation.
- *
- * @return CacheInterface
- */
- public function getCache()
- {
- return $this->cache;
- }
-
- /**
- * {@inheritdoc}
- */
- public function write($path, $contents, Config $config)
- {
- $result = $this->adapter->write($path, $contents, $config);
-
- if ($result !== false) {
- $result['type'] = 'file';
- $this->cache->updateObject($path, $result + compact('path', 'contents'), true);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function writeStream($path, $resource, Config $config)
- {
- $result = $this->adapter->writeStream($path, $resource, $config);
-
- if ($result !== false) {
- $result['type'] = 'file';
- $contents = false;
- $this->cache->updateObject($path, $result + compact('path', 'contents'), true);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function update($path, $contents, Config $config)
- {
- $result = $this->adapter->update($path, $contents, $config);
-
- if ($result !== false) {
- $result['type'] = 'file';
- $this->cache->updateObject($path, $result + compact('path', 'contents'), true);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function updateStream($path, $resource, Config $config)
- {
- $result = $this->adapter->updateStream($path, $resource, $config);
-
- if ($result !== false) {
- $result['type'] = 'file';
- $contents = false;
- $this->cache->updateObject($path, $result + compact('path', 'contents'), true);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function rename($path, $newPath)
- {
- $result = $this->adapter->rename($path, $newPath);
-
- if ($result !== false) {
- $this->cache->rename($path, $newPath);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function copy($path, $newpath)
- {
- $result = $this->adapter->copy($path, $newpath);
-
- if ($result !== false) {
- $this->cache->copy($path, $newpath);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function delete($path)
- {
- $result = $this->adapter->delete($path);
-
- if ($result !== false) {
- $this->cache->delete($path);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function deleteDir($dirname)
- {
- $result = $this->adapter->deleteDir($dirname);
-
- if ($result !== false) {
- $this->cache->deleteDir($dirname);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function createDir($dirname, Config $config)
- {
- $result = $this->adapter->createDir($dirname, $config);
-
- if ($result !== false) {
- $type = 'dir';
- $path = $dirname;
- $this->cache->updateObject($dirname, compact('path', 'type'), true);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setVisibility($path, $visibility)
- {
- $result = $this->adapter->setVisibility($path, $visibility);
-
- if ($result !== false) {
- $this->cache->updateObject($path, compact('path', 'visibility'), true);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function has($path)
- {
- $cacheHas = $this->cache->has($path);
-
- if ($cacheHas !== null) {
- return $cacheHas;
- }
-
- $adapterResponse = $this->adapter->has($path);
-
- if (! $adapterResponse) {
- $this->cache->storeMiss($path);
- } else {
- $cacheEntry = is_array($adapterResponse) ? $adapterResponse : compact('path');
- $this->cache->updateObject($path, $cacheEntry, true);
- }
-
- return $adapterResponse;
- }
-
- /**
- * {@inheritdoc}
- */
- public function read($path)
- {
- return $this->callWithFallback('contents', $path, 'read');
- }
-
- /**
- * {@inheritdoc}
- */
- public function readStream($path)
- {
- return $this->adapter->readStream($path);
- }
-
- /**
- * Get the path prefix.
- *
- * @return string|null path prefix or null if pathPrefix is empty
- */
- public function getPathPrefix()
- {
- return $this->adapter->getPathPrefix();
- }
-
- /**
- * Prefix a path.
- *
- * @param string $path
- *
- * @return string prefixed path
- */
- public function applyPathPrefix($path)
- {
- return $this->adapter->applyPathPrefix($path);
- }
-
- /**
- * {@inheritdoc}
- */
- public function listContents($directory = '', $recursive = false)
- {
- if ($this->cache->isComplete($directory, $recursive)) {
- return $this->cache->listContents($directory, $recursive);
- }
-
- $result = $this->adapter->listContents($directory, $recursive);
-
- if ($result !== false) {
- $this->cache->storeContents($directory, $result, $recursive);
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function getMetadata($path)
- {
- return $this->callWithFallback(null, $path, 'getMetadata');
- }
-
- /**
- * {@inheritdoc}
- */
- public function getSize($path)
- {
- return $this->callWithFallback('size', $path, 'getSize');
- }
-
- /**
- * {@inheritdoc}
- */
- public function getMimetype($path)
- {
- return $this->callWithFallback('mimetype', $path, 'getMimetype');
- }
-
- /**
- * {@inheritdoc}
- */
- public function getTimestamp($path)
- {
- return $this->callWithFallback('timestamp', $path, 'getTimestamp');
- }
-
- /**
- * {@inheritdoc}
- */
- public function getVisibility($path)
- {
- return $this->callWithFallback('visibility', $path, 'getVisibility');
- }
-
- /**
- * Call a method and cache the response.
- *
- * @param string $property
- * @param string $path
- * @param string $method
- *
- * @return mixed
- */
- protected function callWithFallback($property, $path, $method)
- {
- $result = $this->cache->{$method}($path);
-
- if ($result !== false && ($property === null || array_key_exists($property, $result))) {
- return $result;
- }
-
- $result = $this->adapter->{$method}($path);
-
- if ($result) {
- $object = $result + compact('path');
- $this->cache->updateObject($path, $object, true);
- }
-
- return $result;
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/AbstractCache.php b/vendor/league/flysystem-cached-adapter/src/Storage/AbstractCache.php
deleted file mode 100644
index 141b46822..000000000
--- a/vendor/league/flysystem-cached-adapter/src/Storage/AbstractCache.php
+++ /dev/null
@@ -1,418 +0,0 @@
-autosave) {
- $this->save();
- }
- }
-
- /**
- * Get the autosave setting.
- *
- * @return bool autosave
- */
- public function getAutosave()
- {
- return $this->autosave;
- }
-
- /**
- * Get the autosave setting.
- *
- * @param bool $autosave
- */
- public function setAutosave($autosave)
- {
- $this->autosave = $autosave;
- }
-
- /**
- * Store the contents listing.
- *
- * @param string $directory
- * @param array $contents
- * @param bool $recursive
- *
- * @return array contents listing
- */
- public function storeContents($directory, array $contents, $recursive = false)
- {
- $directories = [$directory];
-
- foreach ($contents as $object) {
- $this->updateObject($object['path'], $object);
- $object = $this->cache[$object['path']];
-
- if ($recursive && $this->pathIsInDirectory($directory, $object['path'])) {
- $directories[] = $object['dirname'];
- }
- }
-
- foreach (array_unique($directories) as $directory) {
- $this->setComplete($directory, $recursive);
- }
-
- $this->autosave();
- }
-
- /**
- * Update the metadata for an object.
- *
- * @param string $path object path
- * @param array $object object metadata
- * @param bool $autosave whether to trigger the autosave routine
- */
- public function updateObject($path, array $object, $autosave = false)
- {
- if (! $this->has($path)) {
- $this->cache[$path] = Util::pathinfo($path);
- }
-
- $this->cache[$path] = array_merge($this->cache[$path], $object);
-
- if ($autosave) {
- $this->autosave();
- }
-
- $this->ensureParentDirectories($path);
- }
-
- /**
- * Store object hit miss.
- *
- * @param string $path
- */
- public function storeMiss($path)
- {
- $this->cache[$path] = false;
- $this->autosave();
- }
-
- /**
- * Get the contents listing.
- *
- * @param string $dirname
- * @param bool $recursive
- *
- * @return array contents listing
- */
- public function listContents($dirname = '', $recursive = false)
- {
- $result = [];
-
- foreach ($this->cache as $object) {
- if ($object === false) {
- continue;
- }
- if ($object['dirname'] === $dirname) {
- $result[] = $object;
- } elseif ($recursive && $this->pathIsInDirectory($dirname, $object['path'])) {
- $result[] = $object;
- }
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- public function has($path)
- {
- if ($path !== false && array_key_exists($path, $this->cache)) {
- return $this->cache[$path] !== false;
- }
-
- if ($this->isComplete(Util::dirname($path), false)) {
- return false;
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function read($path)
- {
- if (isset($this->cache[$path]['contents']) && $this->cache[$path]['contents'] !== false) {
- return $this->cache[$path];
- }
-
- return false;
- }
-
- /**
- * {@inheritdoc}
- */
- public function readStream($path)
- {
- return false;
- }
-
- /**
- * {@inheritdoc}
- */
- public function rename($path, $newpath)
- {
- if ($this->has($path)) {
- $object = $this->cache[$path];
- unset($this->cache[$path]);
- $object['path'] = $newpath;
- $object = array_merge($object, Util::pathinfo($newpath));
- $this->cache[$newpath] = $object;
- $this->autosave();
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function copy($path, $newpath)
- {
- if ($this->has($path)) {
- $object = $this->cache[$path];
- $object = array_merge($object, Util::pathinfo($newpath));
- $this->updateObject($newpath, $object, true);
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function delete($path)
- {
- $this->storeMiss($path);
- }
-
- /**
- * {@inheritdoc}
- */
- public function deleteDir($dirname)
- {
- foreach ($this->cache as $path => $object) {
- if ($this->pathIsInDirectory($dirname, $path) || $path === $dirname) {
- unset($this->cache[$path]);
- }
- }
-
- unset($this->complete[$dirname]);
-
- $this->autosave();
- }
-
- /**
- * {@inheritdoc}
- */
- public function getMimetype($path)
- {
- if (isset($this->cache[$path]['mimetype'])) {
- return $this->cache[$path];
- }
-
- if (! $result = $this->read($path)) {
- return false;
- }
-
- $mimetype = Util::guessMimeType($path, $result['contents']);
- $this->cache[$path]['mimetype'] = $mimetype;
-
- return $this->cache[$path];
- }
-
- /**
- * {@inheritdoc}
- */
- public function getSize($path)
- {
- if (isset($this->cache[$path]['size'])) {
- return $this->cache[$path];
- }
-
- return false;
- }
-
- /**
- * {@inheritdoc}
- */
- public function getTimestamp($path)
- {
- if (isset($this->cache[$path]['timestamp'])) {
- return $this->cache[$path];
- }
-
- return false;
- }
-
- /**
- * {@inheritdoc}
- */
- public function getVisibility($path)
- {
- if (isset($this->cache[$path]['visibility'])) {
- return $this->cache[$path];
- }
-
- return false;
- }
-
- /**
- * {@inheritdoc}
- */
- public function getMetadata($path)
- {
- if (isset($this->cache[$path]['type'])) {
- return $this->cache[$path];
- }
-
- return false;
- }
-
- /**
- * {@inheritdoc}
- */
- public function isComplete($dirname, $recursive)
- {
- if (! array_key_exists($dirname, $this->complete)) {
- return false;
- }
-
- if ($recursive && $this->complete[$dirname] !== 'recursive') {
- return false;
- }
-
- return true;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setComplete($dirname, $recursive)
- {
- $this->complete[$dirname] = $recursive ? 'recursive' : true;
- }
-
- /**
- * Filter the contents from a listing.
- *
- * @param array $contents object listing
- *
- * @return array filtered contents
- */
- public function cleanContents(array $contents)
- {
- $cachedProperties = array_flip([
- 'path', 'dirname', 'basename', 'extension', 'filename',
- 'size', 'mimetype', 'visibility', 'timestamp', 'type',
- 'md5',
- ]);
-
- foreach ($contents as $path => $object) {
- if (is_array($object)) {
- $contents[$path] = array_intersect_key($object, $cachedProperties);
- }
- }
-
- return $contents;
- }
-
- /**
- * {@inheritdoc}
- */
- public function flush()
- {
- $this->cache = [];
- $this->complete = [];
- $this->autosave();
- }
-
- /**
- * {@inheritdoc}
- */
- public function autosave()
- {
- if ($this->autosave) {
- $this->save();
- }
- }
-
- /**
- * Retrieve serialized cache data.
- *
- * @return string serialized data
- */
- public function getForStorage()
- {
- $cleaned = $this->cleanContents($this->cache);
-
- return json_encode([$cleaned, $this->complete]);
- }
-
- /**
- * Load from serialized cache data.
- *
- * @param string $json
- */
- public function setFromStorage($json)
- {
- list($cache, $complete) = json_decode($json, true);
-
- if (json_last_error() === JSON_ERROR_NONE && is_array($cache) && is_array($complete)) {
- $this->cache = $cache;
- $this->complete = $complete;
- }
- }
-
- /**
- * Ensure parent directories of an object.
- *
- * @param string $path object path
- */
- public function ensureParentDirectories($path)
- {
- $object = $this->cache[$path];
-
- while ($object['dirname'] !== '' && ! isset($this->cache[$object['dirname']])) {
- $object = Util::pathinfo($object['dirname']);
- $object['type'] = 'dir';
- $this->cache[$object['path']] = $object;
- }
- }
-
- /**
- * Determines if the path is inside the directory.
- *
- * @param string $directory
- * @param string $path
- *
- * @return bool
- */
- protected function pathIsInDirectory($directory, $path)
- {
- return $directory === '' || strpos($path, $directory . '/') === 0;
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Adapter.php b/vendor/league/flysystem-cached-adapter/src/Storage/Adapter.php
deleted file mode 100644
index 649a60e3b..000000000
--- a/vendor/league/flysystem-cached-adapter/src/Storage/Adapter.php
+++ /dev/null
@@ -1,115 +0,0 @@
-adapter = $adapter;
- $this->file = $file;
- $this->setExpire($expire);
- }
-
- /**
- * Set the expiration time in seconds.
- *
- * @param int $expire relative expiration time
- */
- protected function setExpire($expire)
- {
- if ($expire) {
- $this->expire = $this->getTime($expire);
- }
- }
-
- /**
- * Get expiration time in seconds.
- *
- * @param int $time relative expiration time
- *
- * @return int actual expiration time
- */
- protected function getTime($time = 0)
- {
- return intval(microtime(true)) + $time;
- }
-
- /**
- * {@inheritdoc}
- */
- public function setFromStorage($json)
- {
- list($cache, $complete, $expire) = json_decode($json, true);
-
- if (! $expire || $expire > $this->getTime()) {
- $this->cache = is_array($cache) ? $cache : [];
- $this->complete = is_array($complete) ? $complete : [];
- } else {
- $this->adapter->delete($this->file);
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function load()
- {
- if ($this->adapter->has($this->file)) {
- $file = $this->adapter->read($this->file);
- if ($file && !empty($file['contents'])) {
- $this->setFromStorage($file['contents']);
- }
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function getForStorage()
- {
- $cleaned = $this->cleanContents($this->cache);
-
- return json_encode([$cleaned, $this->complete, $this->expire]);
- }
-
- /**
- * {@inheritdoc}
- */
- public function save()
- {
- $config = new Config();
- $contents = $this->getForStorage();
-
- if ($this->adapter->has($this->file)) {
- $this->adapter->update($this->file, $contents, $config);
- } else {
- $this->adapter->write($this->file, $contents, $config);
- }
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Memcached.php b/vendor/league/flysystem-cached-adapter/src/Storage/Memcached.php
deleted file mode 100644
index f67d2717a..000000000
--- a/vendor/league/flysystem-cached-adapter/src/Storage/Memcached.php
+++ /dev/null
@@ -1,59 +0,0 @@
-key = $key;
- $this->expire = $expire;
- $this->memcached = $memcached;
- }
-
- /**
- * {@inheritdoc}
- */
- public function load()
- {
- $contents = $this->memcached->get($this->key);
-
- if ($contents !== false) {
- $this->setFromStorage($contents);
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function save()
- {
- $contents = $this->getForStorage();
- $expiration = $this->expire === null ? 0 : time() + $this->expire;
- $this->memcached->set($this->key, $contents, $expiration);
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Memory.php b/vendor/league/flysystem-cached-adapter/src/Storage/Memory.php
deleted file mode 100644
index d0914fabd..000000000
--- a/vendor/league/flysystem-cached-adapter/src/Storage/Memory.php
+++ /dev/null
@@ -1,22 +0,0 @@
-client = $client ?: new Redis();
- $this->key = $key;
- $this->expire = $expire;
- }
-
- /**
- * {@inheritdoc}
- */
- public function load()
- {
- $contents = $this->client->get($this->key);
-
- if ($contents !== false) {
- $this->setFromStorage($contents);
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function save()
- {
- $contents = $this->getForStorage();
- $this->client->set($this->key, $contents);
-
- if ($this->expire !== null) {
- $this->client->expire($this->key, $this->expire);
- }
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Predis.php b/vendor/league/flysystem-cached-adapter/src/Storage/Predis.php
deleted file mode 100644
index 8a295744b..000000000
--- a/vendor/league/flysystem-cached-adapter/src/Storage/Predis.php
+++ /dev/null
@@ -1,75 +0,0 @@
-client = $client ?: new Client();
- $this->key = $key;
- $this->expire = $expire;
- }
-
- /**
- * {@inheritdoc}
- */
- public function load()
- {
- if (($contents = $this->executeCommand('get', [$this->key])) !== null) {
- $this->setFromStorage($contents);
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function save()
- {
- $contents = $this->getForStorage();
- $this->executeCommand('set', [$this->key, $contents]);
-
- if ($this->expire !== null) {
- $this->executeCommand('expire', [$this->key, $this->expire]);
- }
- }
-
- /**
- * Execute a Predis command.
- *
- * @param string $name
- * @param array $arguments
- *
- * @return string
- */
- protected function executeCommand($name, array $arguments)
- {
- $command = $this->client->createCommand($name, $arguments);
-
- return $this->client->executeCommand($command);
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php b/vendor/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php
deleted file mode 100644
index 43be87e53..000000000
--- a/vendor/league/flysystem-cached-adapter/src/Storage/Psr6Cache.php
+++ /dev/null
@@ -1,59 +0,0 @@
-pool = $pool;
- $this->key = $key;
- $this->expire = $expire;
- }
-
- /**
- * {@inheritdoc}
- */
- public function save()
- {
- $item = $this->pool->getItem($this->key);
- $item->set($this->getForStorage());
- $item->expiresAfter($this->expire);
- $this->pool->save($item);
- }
-
- /**
- * {@inheritdoc}
- */
- public function load()
- {
- $item = $this->pool->getItem($this->key);
- if ($item->isHit()) {
- $this->setFromStorage($item->get());
- }
- }
-}
\ No newline at end of file
diff --git a/vendor/league/flysystem-cached-adapter/src/Storage/Stash.php b/vendor/league/flysystem-cached-adapter/src/Storage/Stash.php
deleted file mode 100644
index e05b83228..000000000
--- a/vendor/league/flysystem-cached-adapter/src/Storage/Stash.php
+++ /dev/null
@@ -1,60 +0,0 @@
-key = $key;
- $this->expire = $expire;
- $this->pool = $pool;
- }
-
- /**
- * {@inheritdoc}
- */
- public function load()
- {
- $item = $this->pool->getItem($this->key);
- $contents = $item->get();
-
- if ($item->isMiss() === false) {
- $this->setFromStorage($contents);
- }
- }
-
- /**
- * {@inheritdoc}
- */
- public function save()
- {
- $contents = $this->getForStorage();
- $item = $this->pool->getItem($this->key);
- $item->set($contents, $this->expire);
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/AdapterCacheTests.php b/vendor/league/flysystem-cached-adapter/tests/AdapterCacheTests.php
deleted file mode 100644
index b63cba788..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/AdapterCacheTests.php
+++ /dev/null
@@ -1,104 +0,0 @@
-shouldReceive('has')->once()->with('file.json')->andReturn(false);
- $cache = new Adapter($adapter, 'file.json', 10);
- $cache->load();
- $this->assertFalse($cache->isComplete('', false));
- }
-
- public function testLoadExpired()
- {
- $response = ['contents' => json_encode([[], ['' => true], 1234567890]), 'path' => 'file.json'];
- $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
- $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true);
- $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response);
- $adapter->shouldReceive('delete')->once()->with('file.json');
- $cache = new Adapter($adapter, 'file.json', 10);
- $cache->load();
- $this->assertFalse($cache->isComplete('', false));
- }
-
- public function testLoadSuccess()
- {
- $response = ['contents' => json_encode([[], ['' => true], 9876543210]), 'path' => 'file.json'];
- $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
- $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true);
- $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response);
- $cache = new Adapter($adapter, 'file.json', 10);
- $cache->load();
- $this->assertTrue($cache->isComplete('', false));
- }
-
- public function testSaveExists()
- {
- $response = json_encode([[], [], null]);
- $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
- $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(true);
- $adapter->shouldReceive('update')->once()->with('file.json', $response, Mockery::any());
- $cache = new Adapter($adapter, 'file.json', null);
- $cache->save();
- }
-
- public function testSaveNew()
- {
- $response = json_encode([[], [], null]);
- $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
- $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(false);
- $adapter->shouldReceive('write')->once()->with('file.json', $response, Mockery::any());
- $cache = new Adapter($adapter, 'file.json', null);
- $cache->save();
- }
-
- public function testStoreContentsRecursive()
- {
- $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
- $adapter->shouldReceive('has')->once()->with('file.json')->andReturn(false);
- $adapter->shouldReceive('write')->once()->with('file.json', Mockery::any(), Mockery::any());
-
- $cache = new Adapter($adapter, 'file.json', null);
-
- $contents = [
- ['path' => 'foo/bar', 'dirname' => 'foo'],
- ['path' => 'afoo/bang', 'dirname' => 'afoo'],
- ];
-
- $cache->storeContents('foo', $contents, true);
-
- $this->assertTrue($cache->isComplete('foo', true));
- $this->assertFalse($cache->isComplete('afoo', true));
- }
-
- public function testDeleteDir()
- {
- $cache_data = [
- 'foo' => ['path' => 'foo', 'type' => 'dir', 'dirname' => ''],
- 'foo/bar' => ['path' => 'foo/bar', 'type' => 'file', 'dirname' => 'foo'],
- 'foobaz' => ['path' => 'foobaz', 'type' => 'file', 'dirname' => ''],
- ];
-
- $response = [
- 'contents' => json_encode([$cache_data, [], null]),
- 'path' => 'file.json',
- ];
-
- $adapter = Mockery::mock('League\Flysystem\AdapterInterface');
- $adapter->shouldReceive('has')->zeroOrMoreTimes()->with('file.json')->andReturn(true);
- $adapter->shouldReceive('read')->once()->with('file.json')->andReturn($response);
- $adapter->shouldReceive('update')->once()->with('file.json', Mockery::any(), Mockery::any())->andReturn(true);
-
- $cache = new Adapter($adapter, 'file.json', null);
- $cache->load();
-
- $cache->deleteDir('foo', true);
-
- $this->assertSame(1, count($cache->listContents('', true)));
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/InspectionTests.php b/vendor/league/flysystem-cached-adapter/tests/InspectionTests.php
deleted file mode 100644
index 40d4c915e..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/InspectionTests.php
+++ /dev/null
@@ -1,16 +0,0 @@
-shouldReceive('load')->once();
- $cached_adapter = new CachedAdapter($adapter, $cache);
- $this->assertInstanceOf('League\Flysystem\AdapterInterface', $cached_adapter->getAdapter());
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/MemcachedTests.php b/vendor/league/flysystem-cached-adapter/tests/MemcachedTests.php
deleted file mode 100644
index e3d9ad939..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/MemcachedTests.php
+++ /dev/null
@@ -1,35 +0,0 @@
-shouldReceive('get')->once()->andReturn(false);
- $cache = new Memcached($client);
- $cache->load();
- $this->assertFalse($cache->isComplete('', false));
- }
-
- public function testLoadSuccess()
- {
- $response = json_encode([[], ['' => true]]);
- $client = Mockery::mock('Memcached');
- $client->shouldReceive('get')->once()->andReturn($response);
- $cache = new Memcached($client);
- $cache->load();
- $this->assertTrue($cache->isComplete('', false));
- }
-
- public function testSave()
- {
- $response = json_encode([[], []]);
- $client = Mockery::mock('Memcached');
- $client->shouldReceive('set')->once()->andReturn($response);
- $cache = new Memcached($client);
- $cache->save();
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/MemoryCacheTests.php b/vendor/league/flysystem-cached-adapter/tests/MemoryCacheTests.php
deleted file mode 100644
index 3ac58fd08..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/MemoryCacheTests.php
+++ /dev/null
@@ -1,255 +0,0 @@
-setAutosave(true);
- $this->assertTrue($cache->getAutosave());
- $cache->setAutosave(false);
- $this->assertFalse($cache->getAutosave());
- }
-
- public function testCacheMiss()
- {
- $cache = new Memory();
- $cache->storeMiss('path.txt');
- $this->assertFalse($cache->has('path.txt'));
- }
-
- public function testIsComplete()
- {
- $cache = new Memory();
- $this->assertFalse($cache->isComplete('dirname', false));
- $cache->setComplete('dirname', false);
- $this->assertFalse($cache->isComplete('dirname', true));
- $cache->setComplete('dirname', true);
- $this->assertTrue($cache->isComplete('dirname', true));
- }
-
- public function testCleanContents()
- {
- $cache = new Memory();
- $input = [[
- 'path' => 'path.txt',
- 'visibility' => 'public',
- 'invalid' => 'thing',
- ]];
-
- $expected = [[
- 'path' => 'path.txt',
- 'visibility' => 'public',
- ]];
-
- $output = $cache->cleanContents($input);
- $this->assertEquals($expected, $output);
- }
-
- public function testGetForStorage()
- {
- $cache = new Memory();
- $input = [[
- 'path' => 'path.txt',
- 'visibility' => 'public',
- 'type' => 'file',
- ]];
-
- $cache->storeContents('', $input, true);
- $contents = $cache->listContents('', true);
- $cached = [];
- foreach ($contents as $item) {
- $cached[$item['path']] = $item;
- }
-
- $this->assertEquals(json_encode([$cached, ['' => 'recursive']]), $cache->getForStorage());
- }
-
- public function testParentCompleteIsUsedDuringHas()
- {
- $cache = new Memory();
- $cache->setComplete('dirname', false);
- $this->assertFalse($cache->has('dirname/path.txt'));
- }
-
- public function testFlush()
- {
- $cache = new Memory();
- $cache->setComplete('dirname', true);
- $cache->updateObject('path.txt', [
- 'path' => 'path.txt',
- 'visibility' => 'public',
- ]);
- $cache->flush();
- $this->assertFalse($cache->isComplete('dirname', true));
- $this->assertNull($cache->has('path.txt'));
- }
-
- public function testSetFromStorage()
- {
- $cache = new Memory();
- $json = [[
- 'path.txt' => ['path' => 'path.txt', 'type' => 'file'],
- ], ['dirname' => 'recursive']];
- $jsonString = json_encode($json);
- $cache->setFromStorage($jsonString);
- $this->assertTrue($cache->has('path.txt'));
- $this->assertTrue($cache->isComplete('dirname', true));
- }
-
- public function testGetMetadataFail()
- {
- $cache = new Memory();
- $this->assertFalse($cache->getMetadata('path.txt'));
- }
-
- public function metaGetterProvider()
- {
- return [
- ['getTimestamp', 'timestamp', 12344],
- ['getMimetype', 'mimetype', 'text/plain'],
- ['getSize', 'size', 12],
- ['getVisibility', 'visibility', 'private'],
- ['read', 'contents', '__contents__'],
- ];
- }
-
- /**
- * @dataProvider metaGetterProvider
- *
- * @param $method
- * @param $key
- * @param $value
- */
- public function testMetaGetters($method, $key, $value)
- {
- $cache = new Memory();
- $this->assertFalse($cache->{$method}('path.txt'));
- $cache->updateObject('path.txt', $object = [
- 'path' => 'path.txt',
- 'type' => 'file',
- $key => $value,
- ] + Util::pathinfo('path.txt'), true);
- $this->assertEquals($object, $cache->{$method}('path.txt'));
- $this->assertEquals($object, $cache->getMetadata('path.txt'));
- }
-
- public function testGetDerivedMimetype()
- {
- $cache = new Memory();
- $cache->updateObject('path.txt', [
- 'contents' => 'something',
- ]);
- $response = $cache->getMimetype('path.txt');
- $this->assertEquals('text/plain', $response['mimetype']);
- }
-
- public function testCopyFail()
- {
- $cache = new Memory();
- $cache->copy('one', 'two');
- $this->assertNull($cache->has('two'));
- $this->assertNull($cache->load());
- }
-
- public function testStoreContents()
- {
- $cache = new Memory();
- $cache->storeContents('dirname', [
- ['path' => 'dirname', 'type' => 'dir'],
- ['path' => 'dirname/nested', 'type' => 'dir'],
- ['path' => 'dirname/nested/deep', 'type' => 'dir'],
- ['path' => 'other/nested/deep', 'type' => 'dir'],
- ], true);
-
- $this->isTrue($cache->isComplete('other/nested', true));
- }
-
- public function testDelete()
- {
- $cache = new Memory();
- $cache->updateObject('path.txt', ['type' => 'file']);
- $this->assertTrue($cache->has('path.txt'));
- $cache->delete('path.txt');
- $this->assertFalse($cache->has('path.txt'));
- }
-
- public function testDeleteDir()
- {
- $cache = new Memory();
- $cache->storeContents('dirname', [
- ['path' => 'dirname/path.txt', 'type' => 'file'],
- ]);
- $this->assertTrue($cache->isComplete('dirname', false));
- $this->assertTrue($cache->has('dirname/path.txt'));
- $cache->deleteDir('dirname');
- $this->assertFalse($cache->isComplete('dirname', false));
- $this->assertNull($cache->has('dirname/path.txt'));
- }
-
- public function testReadStream()
- {
- $cache = new Memory();
- $this->assertFalse($cache->readStream('path.txt'));
- }
-
- public function testRename()
- {
- $cache = new Memory();
- $cache->updateObject('path.txt', ['type' => 'file']);
- $cache->rename('path.txt', 'newpath.txt');
- $this->assertTrue($cache->has('newpath.txt'));
- }
-
- public function testCopy()
- {
- $cache = new Memory();
- $cache->updateObject('path.txt', ['type' => 'file']);
- $cache->copy('path.txt', 'newpath.txt');
- $this->assertTrue($cache->has('newpath.txt'));
- }
-
- public function testComplextListContents()
- {
- $cache = new Memory();
- $cache->storeContents('', [
- ['path' => 'dirname', 'type' => 'dir'],
- ['path' => 'dirname/file.txt', 'type' => 'file'],
- ['path' => 'other', 'type' => 'dir'],
- ['path' => 'other/file.txt', 'type' => 'file'],
- ['path' => 'other/nested/file.txt', 'type' => 'file'],
- ]);
-
- $this->assertCount(3, $cache->listContents('other', true));
- }
-
- public function testComplextListContentsWithDeletedFile()
- {
- $cache = new Memory();
- $cache->storeContents('', [
- ['path' => 'dirname', 'type' => 'dir'],
- ['path' => 'dirname/file.txt', 'type' => 'file'],
- ['path' => 'other', 'type' => 'dir'],
- ['path' => 'other/file.txt', 'type' => 'file'],
- ['path' => 'other/another_file.txt', 'type' => 'file'],
- ]);
-
- $cache->delete('other/another_file.txt');
- $this->assertCount(4, $cache->listContents('', true));
- }
-
- public function testCacheMissIfContentsIsFalse()
- {
- $cache = new Memory();
- $cache->updateObject('path.txt', [
- 'path' => 'path.txt',
- 'contents' => false,
- ], true);
-
- $this->assertFalse($cache->read('path.txt'));
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/NoopCacheTests.php b/vendor/league/flysystem-cached-adapter/tests/NoopCacheTests.php
deleted file mode 100644
index 148616ff1..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/NoopCacheTests.php
+++ /dev/null
@@ -1,35 +0,0 @@
-assertEquals($cache, $cache->storeMiss('file.txt'));
- $this->assertNull($cache->setComplete('', false));
- $this->assertNull($cache->load());
- $this->assertNull($cache->flush());
- $this->assertNull($cache->has('path.txt'));
- $this->assertNull($cache->autosave());
- $this->assertFalse($cache->isComplete('', false));
- $this->assertFalse($cache->read('something'));
- $this->assertFalse($cache->readStream('something'));
- $this->assertFalse($cache->getMetadata('something'));
- $this->assertFalse($cache->getMimetype('something'));
- $this->assertFalse($cache->getSize('something'));
- $this->assertFalse($cache->getTimestamp('something'));
- $this->assertFalse($cache->getVisibility('something'));
- $this->assertEmpty($cache->listContents('', false));
- $this->assertFalse($cache->rename('', ''));
- $this->assertFalse($cache->copy('', ''));
- $this->assertNull($cache->save());
- $object = ['path' => 'path.ext'];
- $this->assertEquals($object, $cache->updateObject('path.txt', $object));
- $this->assertEquals([['path' => 'some/file.txt']], $cache->storeContents('unknwon', [
- ['path' => 'some/file.txt'],
- ], false));
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/PhpRedisTests.php b/vendor/league/flysystem-cached-adapter/tests/PhpRedisTests.php
deleted file mode 100644
index d1ccb6545..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/PhpRedisTests.php
+++ /dev/null
@@ -1,45 +0,0 @@
-shouldReceive('get')->with('flysystem')->once()->andReturn(false);
- $cache = new PhpRedis($client);
- $cache->load();
- $this->assertFalse($cache->isComplete('', false));
- }
-
- public function testLoadSuccess()
- {
- $response = json_encode([[], ['' => true]]);
- $client = Mockery::mock('Redis');
- $client->shouldReceive('get')->with('flysystem')->once()->andReturn($response);
- $cache = new PhpRedis($client);
- $cache->load();
- $this->assertTrue($cache->isComplete('', false));
- }
-
- public function testSave()
- {
- $data = json_encode([[], []]);
- $client = Mockery::mock('Redis');
- $client->shouldReceive('set')->with('flysystem', $data)->once();
- $cache = new PhpRedis($client);
- $cache->save();
- }
-
- public function testSaveWithExpire()
- {
- $data = json_encode([[], []]);
- $client = Mockery::mock('Redis');
- $client->shouldReceive('set')->with('flysystem', $data)->once();
- $client->shouldReceive('expire')->with('flysystem', 20)->once();
- $cache = new PhpRedis($client, 'flysystem', 20);
- $cache->save();
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/PredisTests.php b/vendor/league/flysystem-cached-adapter/tests/PredisTests.php
deleted file mode 100644
index e33e10468..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/PredisTests.php
+++ /dev/null
@@ -1,55 +0,0 @@
-shouldReceive('createCommand')->with('get', ['flysystem'])->once()->andReturn($command);
- $client->shouldReceive('executeCommand')->with($command)->andReturn(null);
- $cache = new Predis($client);
- $cache->load();
- $this->assertFalse($cache->isComplete('', false));
- }
-
- public function testLoadSuccess()
- {
- $response = json_encode([[], ['' => true]]);
- $client = Mockery::mock('Predis\Client');
- $command = Mockery::mock('Predis\Command\CommandInterface');
- $client->shouldReceive('createCommand')->with('get', ['flysystem'])->once()->andReturn($command);
- $client->shouldReceive('executeCommand')->with($command)->andReturn($response);
- $cache = new Predis($client);
- $cache->load();
- $this->assertTrue($cache->isComplete('', false));
- }
-
- public function testSave()
- {
- $data = json_encode([[], []]);
- $client = Mockery::mock('Predis\Client');
- $command = Mockery::mock('Predis\Command\CommandInterface');
- $client->shouldReceive('createCommand')->with('set', ['flysystem', $data])->once()->andReturn($command);
- $client->shouldReceive('executeCommand')->with($command)->once();
- $cache = new Predis($client);
- $cache->save();
- }
-
- public function testSaveWithExpire()
- {
- $data = json_encode([[], []]);
- $client = Mockery::mock('Predis\Client');
- $command = Mockery::mock('Predis\Command\CommandInterface');
- $client->shouldReceive('createCommand')->with('set', ['flysystem', $data])->once()->andReturn($command);
- $client->shouldReceive('executeCommand')->with($command)->once();
- $expireCommand = Mockery::mock('Predis\Command\CommandInterface');
- $client->shouldReceive('createCommand')->with('expire', ['flysystem', 20])->once()->andReturn($expireCommand);
- $client->shouldReceive('executeCommand')->with($expireCommand)->once();
- $cache = new Predis($client, 'flysystem', 20);
- $cache->save();
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/Psr6CacheTest.php b/vendor/league/flysystem-cached-adapter/tests/Psr6CacheTest.php
deleted file mode 100644
index d5e5700cf..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/Psr6CacheTest.php
+++ /dev/null
@@ -1,45 +0,0 @@
-shouldReceive('isHit')->once()->andReturn(false);
- $pool->shouldReceive('getItem')->once()->andReturn($item);
- $cache = new Psr6Cache($pool);
- $cache->load();
- $this->assertFalse($cache->isComplete('', false));
- }
-
- public function testLoadSuccess()
- {
- $response = json_encode([[], ['' => true]]);
- $pool = Mockery::mock('Psr\Cache\CacheItemPoolInterface');
- $item = Mockery::mock('Psr\Cache\CacheItemInterface');
- $item->shouldReceive('get')->once()->andReturn($response);
- $item->shouldReceive('isHit')->once()->andReturn(true);
- $pool->shouldReceive('getItem')->once()->andReturn($item);
- $cache = new Psr6Cache($pool);
- $cache->load();
- $this->assertTrue($cache->isComplete('', false));
- }
-
- public function testSave()
- {
- $response = json_encode([[], []]);
- $ttl = 4711;
- $pool = Mockery::mock('Psr\Cache\CacheItemPoolInterface');
- $item = Mockery::mock('Psr\Cache\CacheItemInterface');
- $item->shouldReceive('expiresAfter')->once()->with($ttl);
- $item->shouldReceive('set')->once()->andReturn($response);
- $pool->shouldReceive('getItem')->once()->andReturn($item);
- $pool->shouldReceive('save')->once()->with($item);
- $cache = new Psr6Cache($pool, 'foo', $ttl);
- $cache->save();
- }
-}
diff --git a/vendor/league/flysystem-cached-adapter/tests/StashTest.php b/vendor/league/flysystem-cached-adapter/tests/StashTest.php
deleted file mode 100644
index 29e142d79..000000000
--- a/vendor/league/flysystem-cached-adapter/tests/StashTest.php
+++ /dev/null
@@ -1,43 +0,0 @@
-shouldReceive('get')->once()->andReturn(null);
- $item->shouldReceive('isMiss')->once()->andReturn(true);
- $pool->shouldReceive('getItem')->once()->andReturn($item);
- $cache = new Stash($pool);
- $cache->load();
- $this->assertFalse($cache->isComplete('', false));
- }
-
- public function testLoadSuccess()
- {
- $response = json_encode([[], ['' => true]]);
- $pool = Mockery::mock('Stash\Pool');
- $item = Mockery::mock('Stash\Item');
- $item->shouldReceive('get')->once()->andReturn($response);
- $item->shouldReceive('isMiss')->once()->andReturn(false);
- $pool->shouldReceive('getItem')->once()->andReturn($item);
- $cache = new Stash($pool);
- $cache->load();
- $this->assertTrue($cache->isComplete('', false));
- }
-
- public function testSave()
- {
- $response = json_encode([[], []]);
- $pool = Mockery::mock('Stash\Pool');
- $item = Mockery::mock('Stash\Item');
- $item->shouldReceive('set')->once()->andReturn($response);
- $pool->shouldReceive('getItem')->once()->andReturn($item);
- $cache = new Stash($pool);
- $cache->save();
- }
-}
diff --git a/vendor/league/flysystem/CODE_OF_CONDUCT.md b/vendor/league/flysystem/CODE_OF_CONDUCT.md
deleted file mode 100644
index 89569c015..000000000
--- a/vendor/league/flysystem/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, sex characteristics, gender identity and expression,
-level of experience, education, socio-economic status, nationality, personal
-appearance, race, religion, or sexual identity and orientation.
-
-## Our Standards
-
-Examples of behavior that contributes to creating a positive environment
-include:
-
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery and unwelcome sexual attention or
- advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
-
-## Scope
-
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project team at info+flysystem@frankdejonge.nl. All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see
-https://www.contributor-covenant.org/faq
diff --git a/vendor/league/flysystem/LICENSE b/vendor/league/flysystem/LICENSE
deleted file mode 100644
index f2684c841..000000000
--- a/vendor/league/flysystem/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2013-2019 Frank de Jonge
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/vendor/league/flysystem/SECURITY.md b/vendor/league/flysystem/SECURITY.md
deleted file mode 100644
index f5b205ed0..000000000
--- a/vendor/league/flysystem/SECURITY.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Security Policy
-
-## Supported Versions
-
-| Version | Supported |
-| ------- | ------------------ |
-| 1.0.x | :white_check_mark: |
-| 2.0.x | :x: |
-
-## Reporting a Vulnerability
-
-When you've encountered a security vulnerability, please disclose it securely.
-
-The security process is described at:
-[https://flysystem.thephpleague.com/docs/security/](https://flysystem.thephpleague.com/docs/security/)
-
diff --git a/vendor/league/flysystem/composer.json b/vendor/league/flysystem/composer.json
deleted file mode 100644
index 32ec81d1b..000000000
--- a/vendor/league/flysystem/composer.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "name": "league/flysystem",
- "type": "library",
- "description": "Filesystem abstraction: Many filesystems, one API.",
- "keywords": [
- "filesystem", "filesystems", "files", "storage", "dropbox", "aws",
- "abstraction", "s3", "ftp", "sftp", "remote", "webdav",
- "file systems", "cloud", "cloud files", "rackspace", "copy.com"
- ],
- "funding": [
- {
- "type": "other",
- "url": "https://offset.earth/frankdejonge"
- }
- ],
- "license": "MIT",
- "authors": [
- {
- "name": "Frank de Jonge",
- "email": "info@frenky.net"
- }
- ],
- "require": {
- "php": "^7.2.5 || ^8.0",
- "ext-fileinfo": "*",
- "league/mime-type-detection": "^1.3"
- },
- "require-dev": {
- "phpspec/prophecy": "^1.11.1",
- "phpunit/phpunit": "^8.5.8"
- },
- "autoload": {
- "psr-4": {
- "League\\Flysystem\\": "src/"
- }
- },
- "autoload-dev": {
- "psr-4": {
- "League\\Flysystem\\Stub\\": "stub/"
- }
- },
- "suggest": {
- "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
- "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
- "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
- "league/flysystem-webdav": "Allows you to use WebDAV storage",
- "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
- "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
- "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
- "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications",
- "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
- "ext-ftp": "Allows you to use FTP server storage",
- "ext-openssl": "Allows you to use FTPS server storage",
- "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
- "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter"
- },
- "conflict": {
- "league/flysystem-sftp": "<1.0.6"
- },
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
- "scripts": {
- "phpstan": "php phpstan.php"
- }
-}
diff --git a/vendor/league/flysystem/deprecations.md b/vendor/league/flysystem/deprecations.md
deleted file mode 100644
index c336a425d..000000000
--- a/vendor/league/flysystem/deprecations.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Deprecations
-
-This document lists all the planned deprecations.
-
-## Handlers will be removed in 2.0
-
-The `Handler` type and associated calls will be removed in version 2.0.
-
-### Upgrade path
-
-You should create your own implementation for handling OOP usage,
-but it's recommended to move away from using an OOP-style wrapper entirely.
-
-The reason for this is that it's too easy for implementation details (for
-your application this is Flysystem) to leak into the application. The most
-important part for Flysystem is that it improves portability and creates a
-solid boundary between your application core and the infrastructure you use.
-The OOP-style handling breaks this principle, therefore I want to stop
-promoting it.
diff --git a/vendor/league/flysystem/src/Adapter/AbstractAdapter.php b/vendor/league/flysystem/src/Adapter/AbstractAdapter.php
deleted file mode 100644
index a6a8ed026..000000000
--- a/vendor/league/flysystem/src/Adapter/AbstractAdapter.php
+++ /dev/null
@@ -1,72 +0,0 @@
-pathPrefix = null;
-
- return;
- }
-
- $this->pathPrefix = rtrim($prefix, '\\/') . $this->pathSeparator;
- }
-
- /**
- * Get the path prefix.
- *
- * @return string|null path prefix or null if pathPrefix is empty
- */
- public function getPathPrefix()
- {
- return $this->pathPrefix;
- }
-
- /**
- * Prefix a path.
- *
- * @param string $path
- *
- * @return string prefixed path
- */
- public function applyPathPrefix($path)
- {
- return $this->getPathPrefix() . ltrim($path, '\\/');
- }
-
- /**
- * Remove a path prefix.
- *
- * @param string $path
- *
- * @return string path without the prefix
- */
- public function removePathPrefix($path)
- {
- return substr($path, strlen((string) $this->getPathPrefix()));
- }
-}
diff --git a/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php b/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php
deleted file mode 100644
index 25d949ead..000000000
--- a/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php
+++ /dev/null
@@ -1,705 +0,0 @@
-safeStorage = new SafeStorage();
- $this->setConfig($config);
- }
-
- /**
- * Set the config.
- *
- * @param array $config
- *
- * @return $this
- */
- public function setConfig(array $config)
- {
- foreach ($this->configurable as $setting) {
- if ( ! isset($config[$setting])) {
- continue;
- }
-
- $method = 'set' . ucfirst($setting);
-
- if (method_exists($this, $method)) {
- $this->$method($config[$setting]);
- }
- }
-
- return $this;
- }
-
- /**
- * Returns the host.
- *
- * @return string
- */
- public function getHost()
- {
- return $this->host;
- }
-
- /**
- * Set the host.
- *
- * @param string $host
- *
- * @return $this
- */
- public function setHost($host)
- {
- $this->host = $host;
-
- return $this;
- }
-
- /**
- * Set the public permission value.
- *
- * @param int $permPublic
- *
- * @return $this
- */
- public function setPermPublic($permPublic)
- {
- $this->permPublic = $permPublic;
-
- return $this;
- }
-
- /**
- * Set the private permission value.
- *
- * @param int $permPrivate
- *
- * @return $this
- */
- public function setPermPrivate($permPrivate)
- {
- $this->permPrivate = $permPrivate;
-
- return $this;
- }
-
- /**
- * Returns the ftp port.
- *
- * @return int
- */
- public function getPort()
- {
- return $this->port;
- }
-
- /**
- * Returns the root folder to work from.
- *
- * @return string
- */
- public function getRoot()
- {
- return $this->root;
- }
-
- /**
- * Set the ftp port.
- *
- * @param int|string $port
- *
- * @return $this
- */
- public function setPort($port)
- {
- $this->port = (int) $port;
-
- return $this;
- }
-
- /**
- * Set the root folder to work from.
- *
- * @param string $root
- *
- * @return $this
- */
- public function setRoot($root)
- {
- $this->root = rtrim($root, '\\/') . $this->separator;
-
- return $this;
- }
-
- /**
- * Returns the ftp username.
- *
- * @return string username
- */
- public function getUsername()
- {
- $username = $this->safeStorage->retrieveSafely('username');
-
- return $username !== null ? $username : 'anonymous';
- }
-
- /**
- * Set ftp username.
- *
- * @param string $username
- *
- * @return $this
- */
- public function setUsername($username)
- {
- $this->safeStorage->storeSafely('username', $username);
-
- return $this;
- }
-
- /**
- * Returns the password.
- *
- * @return string password
- */
- public function getPassword()
- {
- return $this->safeStorage->retrieveSafely('password');
- }
-
- /**
- * Set the ftp password.
- *
- * @param string $password
- *
- * @return $this
- */
- public function setPassword($password)
- {
- $this->safeStorage->storeSafely('password', $password);
-
- return $this;
- }
-
- /**
- * Returns the amount of seconds before the connection will timeout.
- *
- * @return int
- */
- public function getTimeout()
- {
- return $this->timeout;
- }
-
- /**
- * Set the amount of seconds before the connection should timeout.
- *
- * @param int $timeout
- *
- * @return $this
- */
- public function setTimeout($timeout)
- {
- $this->timeout = (int) $timeout;
-
- return $this;
- }
-
- /**
- * Return the FTP system type.
- *
- * @return string
- */
- public function getSystemType()
- {
- return $this->systemType;
- }
-
- /**
- * Set the FTP system type (windows or unix).
- *
- * @param string $systemType
- *
- * @return $this
- */
- public function setSystemType($systemType)
- {
- $this->systemType = strtolower($systemType);
-
- return $this;
- }
-
- /**
- * True to enable timestamps for FTP servers that return unix-style listings.
- *
- * @param bool $bool
- *
- * @return $this
- */
- public function setEnableTimestampsOnUnixListings($bool = false)
- {
- $this->enableTimestampsOnUnixListings = $bool;
-
- return $this;
- }
-
- /**
- * @inheritdoc
- */
- public function listContents($directory = '', $recursive = false)
- {
- return $this->listDirectoryContents($directory, $recursive);
- }
-
- abstract protected function listDirectoryContents($directory, $recursive = false);
-
- /**
- * Normalize a directory listing.
- *
- * @param array $listing
- * @param string $prefix
- *
- * @return array directory listing
- */
- protected function normalizeListing(array $listing, $prefix = '')
- {
- $base = $prefix;
- $result = [];
- $listing = $this->removeDotDirectories($listing);
-
- while ($item = array_shift($listing)) {
- if (preg_match('#^.*:$#', $item)) {
- $base = preg_replace('~^\./*|:$~', '', $item);
- continue;
- }
-
- $result[] = $this->normalizeObject($item, $base);
- }
-
- return $this->sortListing($result);
- }
-
- /**
- * Sort a directory listing.
- *
- * @param array $result
- *
- * @return array sorted listing
- */
- protected function sortListing(array $result)
- {
- $compare = function ($one, $two) {
- return strnatcmp($one['path'], $two['path']);
- };
-
- usort($result, $compare);
-
- return $result;
- }
-
- /**
- * Normalize a file entry.
- *
- * @param string $item
- * @param string $base
- *
- * @return array normalized file array
- *
- * @throws NotSupportedException
- */
- protected function normalizeObject($item, $base)
- {
- $systemType = $this->systemType ?: $this->detectSystemType($item);
-
- if ($systemType === 'unix') {
- return $this->normalizeUnixObject($item, $base);
- } elseif ($systemType === 'windows') {
- return $this->normalizeWindowsObject($item, $base);
- }
-
- throw NotSupportedException::forFtpSystemType($systemType);
- }
-
- /**
- * Normalize a Unix file entry.
- *
- * Given $item contains:
- * '-rw-r--r-- 1 ftp ftp 409 Aug 19 09:01 file1.txt'
- *
- * This function will return:
- * [
- * 'type' => 'file',
- * 'path' => 'file1.txt',
- * 'visibility' => 'public',
- * 'size' => 409,
- * 'timestamp' => 1566205260
- * ]
- *
- * @param string $item
- * @param string $base
- *
- * @return array normalized file array
- */
- protected function normalizeUnixObject($item, $base)
- {
- $item = preg_replace('#\s+#', ' ', trim($item), 7);
-
- if (count(explode(' ', $item, 9)) !== 9) {
- throw new RuntimeException("Metadata can't be parsed from item '$item' , not enough parts.");
- }
-
- list($permissions, /* $number */, /* $owner */, /* $group */, $size, $month, $day, $timeOrYear, $name) = explode(' ', $item, 9);
- $type = $this->detectType($permissions);
- $path = $base === '' ? $name : $base . $this->separator . $name;
-
- if ($type === 'dir') {
- $result = compact('type', 'path');
- if ($this->enableTimestampsOnUnixListings) {
- $timestamp = $this->normalizeUnixTimestamp($month, $day, $timeOrYear);
- $result += compact('timestamp');
- }
-
- return $result;
- }
-
- $permissions = $this->normalizePermissions($permissions);
- $visibility = $permissions & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE;
- $size = (int) $size;
-
- $result = compact('type', 'path', 'visibility', 'size');
- if ($this->enableTimestampsOnUnixListings) {
- $timestamp = $this->normalizeUnixTimestamp($month, $day, $timeOrYear);
- $result += compact('timestamp');
- }
-
- return $result;
- }
-
- /**
- * Only accurate to the minute (current year), or to the day.
- *
- * Inadequacies in timestamp accuracy are due to limitations of the FTP 'LIST' command
- *
- * Note: The 'MLSD' command is a machine-readable replacement for 'LIST'
- * but many FTP servers do not support it :(
- *
- * @param string $month e.g. 'Aug'
- * @param string $day e.g. '19'
- * @param string $timeOrYear e.g. '09:01' OR '2015'
- *
- * @return int
- */
- protected function normalizeUnixTimestamp($month, $day, $timeOrYear)
- {
- if (is_numeric($timeOrYear)) {
- $year = $timeOrYear;
- $hour = '00';
- $minute = '00';
- $seconds = '00';
- } else {
- $year = date('Y');
- list($hour, $minute) = explode(':', $timeOrYear);
- $seconds = '00';
- }
- $dateTime = DateTime::createFromFormat('Y-M-j-G:i:s', "{$year}-{$month}-{$day}-{$hour}:{$minute}:{$seconds}");
-
- return $dateTime->getTimestamp();
- }
-
- /**
- * Normalize a Windows/DOS file entry.
- *
- * @param string $item
- * @param string $base
- *
- * @return array normalized file array
- */
- protected function normalizeWindowsObject($item, $base)
- {
- $item = preg_replace('#\s+#', ' ', trim($item), 3);
-
- if (count(explode(' ', $item, 4)) !== 4) {
- throw new RuntimeException("Metadata can't be parsed from item '$item' , not enough parts.");
- }
-
- list($date, $time, $size, $name) = explode(' ', $item, 4);
- $path = $base === '' ? $name : $base . $this->separator . $name;
-
- // Check for the correct date/time format
- $format = strlen($date) === 8 ? 'm-d-yH:iA' : 'Y-m-dH:i';
- $dt = DateTime::createFromFormat($format, $date . $time);
- $timestamp = $dt ? $dt->getTimestamp() : (int) strtotime("$date $time");
-
- if ($size === '
') {
- $type = 'dir';
-
- return compact('type', 'path', 'timestamp');
- }
-
- $type = 'file';
- $visibility = AdapterInterface::VISIBILITY_PUBLIC;
- $size = (int) $size;
-
- return compact('type', 'path', 'visibility', 'size', 'timestamp');
- }
-
- /**
- * Get the system type from a listing item.
- *
- * @param string $item
- *
- * @return string the system type
- */
- protected function detectSystemType($item)
- {
- return preg_match('/^[0-9]{2,4}-[0-9]{2}-[0-9]{2}/', trim($item)) ? 'windows' : 'unix';
- }
-
- /**
- * Get the file type from the permissions.
- *
- * @param string $permissions
- *
- * @return string file type
- */
- protected function detectType($permissions)
- {
- return substr($permissions, 0, 1) === 'd' ? 'dir' : 'file';
- }
-
- /**
- * Normalize a permissions string.
- *
- * @param string $permissions
- *
- * @return int
- */
- protected function normalizePermissions($permissions)
- {
- if (is_numeric($permissions)) {
- return ((int) $permissions) & 0777;
- }
-
- // remove the type identifier
- $permissions = substr($permissions, 1);
-
- // map the string rights to the numeric counterparts
- $map = ['-' => '0', 'r' => '4', 'w' => '2', 'x' => '1'];
- $permissions = strtr($permissions, $map);
-
- // split up the permission groups
- $parts = str_split($permissions, 3);
-
- // convert the groups
- $mapper = function ($part) {
- return array_sum(str_split($part));
- };
-
- // converts to decimal number
- return octdec(implode('', array_map($mapper, $parts)));
- }
-
- /**
- * Filter out dot-directories.
- *
- * @param array $list
- *
- * @return array
- */
- public function removeDotDirectories(array $list)
- {
- $filter = function ($line) {
- return $line !== '' && ! preg_match('#.* \.(\.)?$|^total#', $line);
- };
-
- return array_filter($list, $filter);
- }
-
- /**
- * @inheritdoc
- */
- public function has($path)
- {
- return $this->getMetadata($path);
- }
-
- /**
- * @inheritdoc
- */
- public function getSize($path)
- {
- return $this->getMetadata($path);
- }
-
- /**
- * @inheritdoc
- */
- public function getVisibility($path)
- {
- return $this->getMetadata($path);
- }
-
- /**
- * Ensure a directory exists.
- *
- * @param string $dirname
- */
- public function ensureDirectory($dirname)
- {
- $dirname = (string) $dirname;
-
- if ($dirname !== '' && ! $this->has($dirname)) {
- $this->createDir($dirname, new Config());
- }
- }
-
- /**
- * @return mixed
- */
- public function getConnection()
- {
- if ( ! $this->isConnected()) {
- $this->disconnect();
- $this->connect();
- }
-
- return $this->connection;
- }
-
- /**
- * Get the public permission value.
- *
- * @return int
- */
- public function getPermPublic()
- {
- return $this->permPublic;
- }
-
- /**
- * Get the private permission value.
- *
- * @return int
- */
- public function getPermPrivate()
- {
- return $this->permPrivate;
- }
-
- /**
- * Disconnect on destruction.
- */
- public function __destruct()
- {
- $this->disconnect();
- }
-
- /**
- * Establish a connection.
- */
- abstract public function connect();
-
- /**
- * Close the connection.
- */
- abstract public function disconnect();
-
- /**
- * Check if a connection is active.
- *
- * @return bool
- */
- abstract public function isConnected();
-
- protected function escapePath($path)
- {
- return str_replace(['*', '[', ']'], ['\\*', '\\[', '\\]'], $path);
- }
-}
diff --git a/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php b/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php
deleted file mode 100644
index fd8d2161e..000000000
--- a/vendor/league/flysystem/src/Adapter/CanOverwriteFiles.php
+++ /dev/null
@@ -1,12 +0,0 @@
-transferMode = $mode;
-
- return $this;
- }
-
- /**
- * Set if Ssl is enabled.
- *
- * @param bool $ssl
- *
- * @return $this
- */
- public function setSsl($ssl)
- {
- $this->ssl = (bool) $ssl;
-
- return $this;
- }
-
- /**
- * Set if passive mode should be used.
- *
- * @param bool $passive
- */
- public function setPassive($passive = true)
- {
- $this->passive = $passive;
- }
-
- /**
- * @param bool $ignorePassiveAddress
- */
- public function setIgnorePassiveAddress($ignorePassiveAddress)
- {
- $this->ignorePassiveAddress = $ignorePassiveAddress;
- }
-
- /**
- * @param bool $recurseManually
- */
- public function setRecurseManually($recurseManually)
- {
- $this->recurseManually = $recurseManually;
- }
-
- /**
- * @param bool $utf8
- */
- public function setUtf8($utf8)
- {
- $this->utf8 = (bool) $utf8;
- }
-
- /**
- * Connect to the FTP server.
- */
- public function connect()
- {
- $tries = 3;
- start_connecting:
-
- if ($this->ssl) {
- $this->connection = @ftp_ssl_connect($this->getHost(), $this->getPort(), $this->getTimeout());
- } else {
- $this->connection = @ftp_connect($this->getHost(), $this->getPort(), $this->getTimeout());
- }
-
- if ( ! $this->connection) {
- $tries--;
-
- if ($tries > 0) goto start_connecting;
-
- throw new ConnectionRuntimeException('Could not connect to host: ' . $this->getHost() . ', port:' . $this->getPort());
- }
-
- $this->login();
- $this->setUtf8Mode();
- $this->setConnectionPassiveMode();
- $this->setConnectionRoot();
- $this->isPureFtpd = $this->isPureFtpdServer();
- }
-
- /**
- * Set the connection to UTF-8 mode.
- */
- protected function setUtf8Mode()
- {
- if ($this->utf8) {
- $response = ftp_raw($this->connection, "OPTS UTF8 ON");
- if (!in_array(substr($response[0], 0, 3), ['200', '202'])) {
- throw new ConnectionRuntimeException(
- 'Could not set UTF-8 mode for connection: ' . $this->getHost() . '::' . $this->getPort()
- );
- }
- }
- }
-
- /**
- * Set the connections to passive mode.
- *
- * @throws ConnectionRuntimeException
- */
- protected function setConnectionPassiveMode()
- {
- if (is_bool($this->ignorePassiveAddress) && defined('FTP_USEPASVADDRESS')) {
- ftp_set_option($this->connection, FTP_USEPASVADDRESS, ! $this->ignorePassiveAddress);
- }
-
- if ( ! ftp_pasv($this->connection, $this->passive)) {
- throw new ConnectionRuntimeException(
- 'Could not set passive mode for connection: ' . $this->getHost() . '::' . $this->getPort()
- );
- }
- }
-
- /**
- * Set the connection root.
- */
- protected function setConnectionRoot()
- {
- $root = $this->getRoot();
- $connection = $this->connection;
-
- if ($root && ! ftp_chdir($connection, $root)) {
- throw new InvalidRootException('Root is invalid or does not exist: ' . $this->getRoot());
- }
-
- // Store absolute path for further reference.
- // This is needed when creating directories and
- // initial root was a relative path, else the root
- // would be relative to the chdir'd path.
- $this->root = ftp_pwd($connection);
- }
-
- /**
- * Login.
- *
- * @throws ConnectionRuntimeException
- */
- protected function login()
- {
- set_error_handler(function () {
- });
- $isLoggedIn = ftp_login(
- $this->connection,
- $this->getUsername(),
- $this->getPassword()
- );
- restore_error_handler();
-
- if ( ! $isLoggedIn) {
- $this->disconnect();
- throw new ConnectionRuntimeException(
- 'Could not login with connection: ' . $this->getHost() . '::' . $this->getPort(
- ) . ', username: ' . $this->getUsername()
- );
- }
- }
-
- /**
- * Disconnect from the FTP server.
- */
- public function disconnect()
- {
- if ($this->hasFtpConnection()) {
- @ftp_close($this->connection);
- }
-
- $this->connection = null;
- }
-
- /**
- * @inheritdoc
- */
- public function write($path, $contents, Config $config)
- {
- $stream = fopen('php://temp', 'w+b');
- fwrite($stream, $contents);
- rewind($stream);
- $result = $this->writeStream($path, $stream, $config);
- fclose($stream);
-
- if ($result === false) {
- return false;
- }
-
- $result['contents'] = $contents;
- $result['mimetype'] = $config->get('mimetype') ?: Util::guessMimeType($path, $contents);
-
- return $result;
- }
-
- /**
- * @inheritdoc
- */
- public function writeStream($path, $resource, Config $config)
- {
- $this->ensureDirectory(Util::dirname($path));
-
- if ( ! ftp_fput($this->getConnection(), $path, $resource, $this->transferMode)) {
- return false;
- }
-
- if ($visibility = $config->get('visibility')) {
- $this->setVisibility($path, $visibility);
- }
-
- $type = 'file';
-
- return compact('type', 'path', 'visibility');
- }
-
- /**
- * @inheritdoc
- */
- public function update($path, $contents, Config $config)
- {
- return $this->write($path, $contents, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function updateStream($path, $resource, Config $config)
- {
- return $this->writeStream($path, $resource, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function rename($path, $newpath)
- {
- return ftp_rename($this->getConnection(), $path, $newpath);
- }
-
- /**
- * @inheritdoc
- */
- public function delete($path)
- {
- return ftp_delete($this->getConnection(), $path);
- }
-
- /**
- * @inheritdoc
- */
- public function deleteDir($dirname)
- {
- $connection = $this->getConnection();
- $contents = array_reverse($this->listDirectoryContents($dirname, false));
-
- foreach ($contents as $object) {
- if ($object['type'] === 'file') {
- if ( ! ftp_delete($connection, $object['path'])) {
- return false;
- }
- } elseif ( ! $this->deleteDir($object['path'])) {
- return false;
- }
- }
-
- return ftp_rmdir($connection, $dirname);
- }
-
- /**
- * @inheritdoc
- */
- public function createDir($dirname, Config $config)
- {
- $connection = $this->getConnection();
- $directories = explode('/', $dirname);
-
- foreach ($directories as $directory) {
- if (false === $this->createActualDirectory($directory, $connection)) {
- $this->setConnectionRoot();
-
- return false;
- }
-
- ftp_chdir($connection, $directory);
- }
-
- $this->setConnectionRoot();
-
- return ['type' => 'dir', 'path' => $dirname];
- }
-
- /**
- * Create a directory.
- *
- * @param string $directory
- * @param resource $connection
- *
- * @return bool
- */
- protected function createActualDirectory($directory, $connection)
- {
- // List the current directory
- $listing = ftp_nlist($connection, '.') ?: [];
-
- foreach ($listing as $key => $item) {
- if (preg_match('~^\./.*~', $item)) {
- $listing[$key] = substr($item, 2);
- }
- }
-
- if (in_array($directory, $listing, true)) {
- return true;
- }
-
- return (boolean) ftp_mkdir($connection, $directory);
- }
-
- /**
- * @inheritdoc
- */
- public function getMetadata($path)
- {
- if ($path === '') {
- return ['type' => 'dir', 'path' => ''];
- }
-
- if (@ftp_chdir($this->getConnection(), $path) === true) {
- $this->setConnectionRoot();
-
- return ['type' => 'dir', 'path' => $path];
- }
-
- $listing = $this->ftpRawlist('-A', $path);
-
- if (empty($listing) || in_array('total 0', $listing, true)) {
- return false;
- }
-
- if (preg_match('/.* not found/', $listing[0])) {
- return false;
- }
-
- if (preg_match('/^total [0-9]*$/', $listing[0])) {
- array_shift($listing);
- }
-
- return $this->normalizeObject($listing[0], '');
- }
-
- /**
- * @inheritdoc
- */
- public function getMimetype($path)
- {
- if ( ! $metadata = $this->getMetadata($path)) {
- return false;
- }
-
- $metadata['mimetype'] = MimeType::detectByFilename($path);
-
- return $metadata;
- }
-
- /**
- * @inheritdoc
- */
- public function getTimestamp($path)
- {
- $timestamp = ftp_mdtm($this->getConnection(), $path);
-
- return ($timestamp !== -1) ? ['path' => $path, 'timestamp' => $timestamp] : false;
- }
-
- /**
- * @inheritdoc
- */
- public function read($path)
- {
- if ( ! $object = $this->readStream($path)) {
- return false;
- }
-
- $object['contents'] = stream_get_contents($object['stream']);
- fclose($object['stream']);
- unset($object['stream']);
-
- return $object;
- }
-
- /**
- * @inheritdoc
- */
- public function readStream($path)
- {
- $stream = fopen('php://temp', 'w+b');
- $result = ftp_fget($this->getConnection(), $stream, $path, $this->transferMode);
- rewind($stream);
-
- if ( ! $result) {
- fclose($stream);
-
- return false;
- }
-
- return ['type' => 'file', 'path' => $path, 'stream' => $stream];
- }
-
- /**
- * @inheritdoc
- */
- public function setVisibility($path, $visibility)
- {
- $mode = $visibility === AdapterInterface::VISIBILITY_PUBLIC ? $this->getPermPublic() : $this->getPermPrivate();
-
- if ( ! ftp_chmod($this->getConnection(), $mode, $path)) {
- return false;
- }
-
- return compact('path', 'visibility');
- }
-
- /**
- * @inheritdoc
- *
- * @param string $directory
- */
- protected function listDirectoryContents($directory, $recursive = true)
- {
- if ($recursive && $this->recurseManually) {
- return $this->listDirectoryContentsRecursive($directory);
- }
-
- $options = $recursive ? '-alnR' : '-aln';
- $listing = $this->ftpRawlist($options, $directory);
-
- return $listing ? $this->normalizeListing($listing, $directory) : [];
- }
-
- /**
- * @inheritdoc
- *
- * @param string $directory
- */
- protected function listDirectoryContentsRecursive($directory)
- {
- $listing = $this->normalizeListing($this->ftpRawlist('-aln', $directory) ?: [], $directory);
- $output = [];
-
- foreach ($listing as $item) {
- $output[] = $item;
- if ($item['type'] !== 'dir') {
- continue;
- }
- $output = array_merge($output, $this->listDirectoryContentsRecursive($item['path']));
- }
-
- return $output;
- }
-
- /**
- * Check if the connection is open.
- *
- * @return bool
- *
- * @throws ConnectionErrorException
- */
- public function isConnected()
- {
- return $this->hasFtpConnection() && $this->getRawExecResponseCode('NOOP') === 200;
- }
-
- /**
- * @return bool
- */
- protected function isPureFtpdServer()
- {
- $response = ftp_raw($this->connection, 'HELP');
-
- return stripos(implode(' ', $response), 'Pure-FTPd') !== false;
- }
-
- /**
- * The ftp_rawlist function with optional escaping.
- *
- * @param string $options
- * @param string $path
- *
- * @return array
- */
- protected function ftpRawlist($options, $path)
- {
- $connection = $this->getConnection();
-
- if ($this->isPureFtpd) {
- $path = str_replace([' ', '[', ']'], ['\ ', '\\[', '\\]'], $path);
- }
-
- return ftp_rawlist($connection, $options . ' ' . $this->escapePath($path));
- }
-
- private function getRawExecResponseCode($command)
- {
- $response = @ftp_raw($this->connection, trim($command));
-
- return (int) preg_replace('/\D/', '', implode(' ', $response));
- }
-
- private function hasFtpConnection(): bool
- {
- return is_resource($this->connection) || $this->connection instanceof \FTP\Connection;
- }
-}
diff --git a/vendor/league/flysystem/src/Adapter/Ftpd.php b/vendor/league/flysystem/src/Adapter/Ftpd.php
deleted file mode 100644
index 7e71d19f6..000000000
--- a/vendor/league/flysystem/src/Adapter/Ftpd.php
+++ /dev/null
@@ -1,48 +0,0 @@
- 'dir', 'path' => ''];
- }
-
- if (@ftp_chdir($this->getConnection(), $path) === true) {
- $this->setConnectionRoot();
-
- return ['type' => 'dir', 'path' => $path];
- }
-
- $object = ftp_raw($this->getConnection(), 'STAT ' . $this->escapePath($path));
-
- if ( ! $object || count($object) < 3) {
- return false;
- }
-
- if (substr($object[1], 0, 5) === "ftpd:") {
- return false;
- }
-
- return $this->normalizeObject($object[1], '');
- }
-
- /**
- * @inheritdoc
- */
- protected function listDirectoryContents($directory, $recursive = true)
- {
- $listing = ftp_rawlist($this->getConnection(), $this->escapePath($directory), $recursive);
-
- if ($listing === false || ( ! empty($listing) && substr($listing[0], 0, 5) === "ftpd:")) {
- return [];
- }
-
- return $this->normalizeListing($listing, $directory);
- }
-}
diff --git a/vendor/league/flysystem/src/Adapter/Local.php b/vendor/league/flysystem/src/Adapter/Local.php
deleted file mode 100644
index 747c463ec..000000000
--- a/vendor/league/flysystem/src/Adapter/Local.php
+++ /dev/null
@@ -1,533 +0,0 @@
- [
- 'public' => 0644,
- 'private' => 0600,
- ],
- 'dir' => [
- 'public' => 0755,
- 'private' => 0700,
- ],
- ];
-
- /**
- * @var string
- */
- protected $pathSeparator = DIRECTORY_SEPARATOR;
-
- /**
- * @var array
- */
- protected $permissionMap;
-
- /**
- * @var int
- */
- protected $writeFlags;
-
- /**
- * @var int
- */
- private $linkHandling;
-
- /**
- * Constructor.
- *
- * @param string $root
- * @param int $writeFlags
- * @param int $linkHandling
- * @param array $permissions
- *
- * @throws LogicException
- */
- public function __construct($root, $writeFlags = LOCK_EX, $linkHandling = self::DISALLOW_LINKS, array $permissions = [])
- {
- $root = is_link($root) ? realpath($root) : $root;
- $this->permissionMap = array_replace_recursive(static::$permissions, $permissions);
- $this->ensureDirectory($root);
-
- if ( ! is_dir($root) || ! is_readable($root)) {
- throw new LogicException('The root path ' . $root . ' is not readable.');
- }
-
- $this->setPathPrefix($root);
- $this->writeFlags = $writeFlags;
- $this->linkHandling = $linkHandling;
- }
-
- /**
- * Ensure the root directory exists.
- *
- * @param string $root root directory path
- *
- * @return void
- *
- * @throws Exception in case the root directory can not be created
- */
- protected function ensureDirectory($root)
- {
- if ( ! is_dir($root)) {
- $umask = umask(0);
-
- if ( ! @mkdir($root, $this->permissionMap['dir']['public'], true)) {
- $mkdirError = error_get_last();
- }
-
- umask($umask);
- clearstatcache(false, $root);
-
- if ( ! is_dir($root)) {
- $errorMessage = isset($mkdirError['message']) ? $mkdirError['message'] : '';
- throw new Exception(sprintf('Impossible to create the root directory "%s". %s', $root, $errorMessage));
- }
- }
- }
-
- /**
- * @inheritdoc
- */
- public function has($path)
- {
- $location = $this->applyPathPrefix($path);
-
- return file_exists($location);
- }
-
- /**
- * @inheritdoc
- */
- public function write($path, $contents, Config $config)
- {
- $location = $this->applyPathPrefix($path);
- $this->ensureDirectory(dirname($location));
-
- if (($size = file_put_contents($location, $contents, $this->writeFlags)) === false) {
- return false;
- }
-
- $type = 'file';
- $result = compact('contents', 'type', 'size', 'path');
-
- if ($visibility = $config->get('visibility')) {
- $result['visibility'] = $visibility;
- $this->setVisibility($path, $visibility);
- }
-
- return $result;
- }
-
- /**
- * @inheritdoc
- */
- public function writeStream($path, $resource, Config $config)
- {
- $location = $this->applyPathPrefix($path);
- $this->ensureDirectory(dirname($location));
- $stream = fopen($location, 'w+b');
-
- if ( ! $stream || stream_copy_to_stream($resource, $stream) === false || ! fclose($stream)) {
- return false;
- }
-
- $type = 'file';
- $result = compact('type', 'path');
-
- if ($visibility = $config->get('visibility')) {
- $this->setVisibility($path, $visibility);
- $result['visibility'] = $visibility;
- }
-
- return $result;
- }
-
- /**
- * @inheritdoc
- */
- public function readStream($path)
- {
- $location = $this->applyPathPrefix($path);
- $stream = fopen($location, 'rb');
-
- return ['type' => 'file', 'path' => $path, 'stream' => $stream];
- }
-
- /**
- * @inheritdoc
- */
- public function updateStream($path, $resource, Config $config)
- {
- return $this->writeStream($path, $resource, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function update($path, $contents, Config $config)
- {
- $location = $this->applyPathPrefix($path);
- $size = file_put_contents($location, $contents, $this->writeFlags);
-
- if ($size === false) {
- return false;
- }
-
- $type = 'file';
-
- $result = compact('type', 'path', 'size', 'contents');
-
- if ($visibility = $config->get('visibility')) {
- $this->setVisibility($path, $visibility);
- $result['visibility'] = $visibility;
- }
-
- return $result;
- }
-
- /**
- * @inheritdoc
- */
- public function read($path)
- {
- $location = $this->applyPathPrefix($path);
- $contents = @file_get_contents($location);
-
- if ($contents === false) {
- return false;
- }
-
- return ['type' => 'file', 'path' => $path, 'contents' => $contents];
- }
-
- /**
- * @inheritdoc
- */
- public function rename($path, $newpath)
- {
- $location = $this->applyPathPrefix($path);
- $destination = $this->applyPathPrefix($newpath);
- $parentDirectory = $this->applyPathPrefix(Util::dirname($newpath));
- $this->ensureDirectory($parentDirectory);
-
- return rename($location, $destination);
- }
-
- /**
- * @inheritdoc
- */
- public function copy($path, $newpath)
- {
- $location = $this->applyPathPrefix($path);
- $destination = $this->applyPathPrefix($newpath);
- $this->ensureDirectory(dirname($destination));
-
- return copy($location, $destination);
- }
-
- /**
- * @inheritdoc
- */
- public function delete($path)
- {
- $location = $this->applyPathPrefix($path);
-
- return @unlink($location);
- }
-
- /**
- * @inheritdoc
- */
- public function listContents($directory = '', $recursive = false)
- {
- $result = [];
- $location = $this->applyPathPrefix($directory);
-
- if ( ! is_dir($location)) {
- return [];
- }
-
- $iterator = $recursive ? $this->getRecursiveDirectoryIterator($location) : $this->getDirectoryIterator($location);
-
- foreach ($iterator as $file) {
- $path = $this->getFilePath($file);
-
- if (preg_match('#(^|/|\\\\)\.{1,2}$#', $path)) {
- continue;
- }
-
- $result[] = $this->normalizeFileInfo($file);
- }
-
- unset($iterator);
-
- return array_filter($result);
- }
-
- /**
- * @inheritdoc
- */
- public function getMetadata($path)
- {
- $location = $this->applyPathPrefix($path);
- clearstatcache(false, $location);
- $info = new SplFileInfo($location);
-
- return $this->normalizeFileInfo($info);
- }
-
- /**
- * @inheritdoc
- */
- public function getSize($path)
- {
- return $this->getMetadata($path);
- }
-
- /**
- * @inheritdoc
- */
- public function getMimetype($path)
- {
- $location = $this->applyPathPrefix($path);
- $finfo = new Finfo(FILEINFO_MIME_TYPE);
- $mimetype = $finfo->file($location);
-
- if (in_array($mimetype, ['application/octet-stream', 'inode/x-empty', 'application/x-empty'])) {
- $mimetype = Util\MimeType::detectByFilename($location);
- }
-
- return ['path' => $path, 'type' => 'file', 'mimetype' => $mimetype];
- }
-
- /**
- * @inheritdoc
- */
- public function getTimestamp($path)
- {
- return $this->getMetadata($path);
- }
-
- /**
- * @inheritdoc
- */
- public function getVisibility($path)
- {
- $location = $this->applyPathPrefix($path);
- clearstatcache(false, $location);
- $permissions = octdec(substr(sprintf('%o', fileperms($location)), -4));
- $type = is_dir($location) ? 'dir' : 'file';
-
- foreach ($this->permissionMap[$type] as $visibility => $visibilityPermissions) {
- if ($visibilityPermissions == $permissions) {
- return compact('path', 'visibility');
- }
- }
-
- $visibility = substr(sprintf('%o', fileperms($location)), -4);
-
- return compact('path', 'visibility');
- }
-
- /**
- * @inheritdoc
- */
- public function setVisibility($path, $visibility)
- {
- $location = $this->applyPathPrefix($path);
- $type = is_dir($location) ? 'dir' : 'file';
- $success = chmod($location, $this->permissionMap[$type][$visibility]);
-
- if ($success === false) {
- return false;
- }
-
- return compact('path', 'visibility');
- }
-
- /**
- * @inheritdoc
- */
- public function createDir($dirname, Config $config)
- {
- $location = $this->applyPathPrefix($dirname);
- $umask = umask(0);
- $visibility = $config->get('visibility', 'public');
- $return = ['path' => $dirname, 'type' => 'dir'];
-
- if ( ! is_dir($location)) {
- if (false === @mkdir($location, $this->permissionMap['dir'][$visibility], true)
- || false === is_dir($location)) {
- $return = false;
- }
- }
-
- umask($umask);
-
- return $return;
- }
-
- /**
- * @inheritdoc
- */
- public function deleteDir($dirname)
- {
- $location = $this->applyPathPrefix($dirname);
-
- if ( ! is_dir($location)) {
- return false;
- }
-
- $contents = $this->getRecursiveDirectoryIterator($location, RecursiveIteratorIterator::CHILD_FIRST);
-
- /** @var SplFileInfo $file */
- foreach ($contents as $file) {
- $this->guardAgainstUnreadableFileInfo($file);
- $this->deleteFileInfoObject($file);
- }
-
- unset($contents);
-
- return rmdir($location);
- }
-
- /**
- * @param SplFileInfo $file
- */
- protected function deleteFileInfoObject(SplFileInfo $file)
- {
- switch ($file->getType()) {
- case 'dir':
- rmdir($file->getRealPath());
- break;
- case 'link':
- unlink($file->getPathname());
- break;
- default:
- unlink($file->getRealPath());
- }
- }
-
- /**
- * Normalize the file info.
- *
- * @param SplFileInfo $file
- *
- * @return array|void
- *
- * @throws NotSupportedException
- */
- protected function normalizeFileInfo(SplFileInfo $file)
- {
- if ( ! $file->isLink()) {
- return $this->mapFileInfo($file);
- }
-
- if ($this->linkHandling & self::DISALLOW_LINKS) {
- throw NotSupportedException::forLink($file);
- }
- }
-
- /**
- * Get the normalized path from a SplFileInfo object.
- *
- * @param SplFileInfo $file
- *
- * @return string
- */
- protected function getFilePath(SplFileInfo $file)
- {
- $location = $file->getPathname();
- $path = $this->removePathPrefix($location);
-
- return trim(str_replace('\\', '/', $path), '/');
- }
-
- /**
- * @param string $path
- * @param int $mode
- *
- * @return RecursiveIteratorIterator
- */
- protected function getRecursiveDirectoryIterator($path, $mode = RecursiveIteratorIterator::SELF_FIRST)
- {
- return new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
- $mode
- );
- }
-
- /**
- * @param string $path
- *
- * @return DirectoryIterator
- */
- protected function getDirectoryIterator($path)
- {
- $iterator = new DirectoryIterator($path);
-
- return $iterator;
- }
-
- /**
- * @param SplFileInfo $file
- *
- * @return array
- */
- protected function mapFileInfo(SplFileInfo $file)
- {
- $normalized = [
- 'type' => $file->getType(),
- 'path' => $this->getFilePath($file),
- ];
-
- $normalized['timestamp'] = $file->getMTime();
-
- if ($normalized['type'] === 'file') {
- $normalized['size'] = $file->getSize();
- }
-
- return $normalized;
- }
-
- /**
- * @param SplFileInfo $file
- *
- * @throws UnreadableFileException
- */
- protected function guardAgainstUnreadableFileInfo(SplFileInfo $file)
- {
- if ( ! $file->isReadable()) {
- throw UnreadableFileException::forFileInfo($file);
- }
- }
-}
diff --git a/vendor/league/flysystem/src/Adapter/NullAdapter.php b/vendor/league/flysystem/src/Adapter/NullAdapter.php
deleted file mode 100644
index 2527087f7..000000000
--- a/vendor/league/flysystem/src/Adapter/NullAdapter.php
+++ /dev/null
@@ -1,144 +0,0 @@
-get('visibility')) {
- $result['visibility'] = $visibility;
- }
-
- return $result;
- }
-
- /**
- * @inheritdoc
- */
- public function update($path, $contents, Config $config)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function read($path)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function rename($path, $newpath)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function delete($path)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function listContents($directory = '', $recursive = false)
- {
- return [];
- }
-
- /**
- * @inheritdoc
- */
- public function getMetadata($path)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function getSize($path)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function getMimetype($path)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function getTimestamp($path)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function getVisibility($path)
- {
- return false;
- }
-
- /**
- * @inheritdoc
- */
- public function setVisibility($path, $visibility)
- {
- return compact('visibility');
- }
-
- /**
- * @inheritdoc
- */
- public function createDir($dirname, Config $config)
- {
- return ['path' => $dirname, 'type' => 'dir'];
- }
-
- /**
- * @inheritdoc
- */
- public function deleteDir($dirname)
- {
- return false;
- }
-}
diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php
deleted file mode 100644
index fc0a747ac..000000000
--- a/vendor/league/flysystem/src/Adapter/Polyfill/NotSupportingVisibilityTrait.php
+++ /dev/null
@@ -1,33 +0,0 @@
-readStream($path);
-
- if ($response === false || ! is_resource($response['stream'])) {
- return false;
- }
-
- $result = $this->writeStream($newpath, $response['stream'], new Config());
-
- if ($result !== false && is_resource($response['stream'])) {
- fclose($response['stream']);
- }
-
- return $result !== false;
- }
-
- // Required abstract method
-
- /**
- * @param string $path
- *
- * @return resource
- */
- abstract public function readStream($path);
-
- /**
- * @param string $path
- * @param resource $resource
- * @param Config $config
- *
- * @return resource
- */
- abstract public function writeStream($path, $resource, Config $config);
-}
diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php
deleted file mode 100644
index 2b31c01d6..000000000
--- a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedReadingTrait.php
+++ /dev/null
@@ -1,44 +0,0 @@
-read($path)) {
- return false;
- }
-
- $stream = fopen('php://temp', 'w+b');
- fwrite($stream, $data['contents']);
- rewind($stream);
- $data['stream'] = $stream;
- unset($data['contents']);
-
- return $data;
- }
-
- /**
- * Reads a file.
- *
- * @param string $path
- *
- * @return array|false
- *
- * @see League\Flysystem\ReadInterface::read()
- */
- abstract public function read($path);
-}
diff --git a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php b/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php
deleted file mode 100644
index 80424960c..000000000
--- a/vendor/league/flysystem/src/Adapter/Polyfill/StreamedTrait.php
+++ /dev/null
@@ -1,9 +0,0 @@
-stream($path, $resource, $config, 'write');
- }
-
- /**
- * Update a file using a stream.
- *
- * @param string $path
- * @param resource $resource
- * @param Config $config Config object or visibility setting
- *
- * @return mixed false of file metadata
- */
- public function updateStream($path, $resource, Config $config)
- {
- return $this->stream($path, $resource, $config, 'update');
- }
-
- // Required abstract methods
- abstract public function write($pash, $contents, Config $config);
- abstract public function update($pash, $contents, Config $config);
-}
diff --git a/vendor/league/flysystem/src/Adapter/SynologyFtp.php b/vendor/league/flysystem/src/Adapter/SynologyFtp.php
deleted file mode 100644
index fe0d344cf..000000000
--- a/vendor/league/flysystem/src/Adapter/SynologyFtp.php
+++ /dev/null
@@ -1,8 +0,0 @@
-settings = $settings;
- }
-
- /**
- * Get a setting.
- *
- * @param string $key
- * @param mixed $default
- *
- * @return mixed config setting or default when not found
- */
- public function get($key, $default = null)
- {
- if ( ! array_key_exists($key, $this->settings)) {
- return $this->getDefault($key, $default);
- }
-
- return $this->settings[$key];
- }
-
- /**
- * Check if an item exists by key.
- *
- * @param string $key
- *
- * @return bool
- */
- public function has($key)
- {
- if (array_key_exists($key, $this->settings)) {
- return true;
- }
-
- return $this->fallback instanceof Config
- ? $this->fallback->has($key)
- : false;
- }
-
- /**
- * Try to retrieve a default setting from a config fallback.
- *
- * @param string $key
- * @param mixed $default
- *
- * @return mixed config setting or default when not found
- */
- protected function getDefault($key, $default)
- {
- if ( ! $this->fallback) {
- return $default;
- }
-
- return $this->fallback->get($key, $default);
- }
-
- /**
- * Set a setting.
- *
- * @param string $key
- * @param mixed $value
- *
- * @return $this
- */
- public function set($key, $value)
- {
- $this->settings[$key] = $value;
-
- return $this;
- }
-
- /**
- * Set the fallback.
- *
- * @param Config $fallback
- *
- * @return $this
- */
- public function setFallback(Config $fallback)
- {
- $this->fallback = $fallback;
-
- return $this;
- }
-}
diff --git a/vendor/league/flysystem/src/ConfigAwareTrait.php b/vendor/league/flysystem/src/ConfigAwareTrait.php
deleted file mode 100644
index 202d605da..000000000
--- a/vendor/league/flysystem/src/ConfigAwareTrait.php
+++ /dev/null
@@ -1,49 +0,0 @@
-config = $config ? Util::ensureConfig($config) : new Config;
- }
-
- /**
- * Get the Config.
- *
- * @return Config config object
- */
- public function getConfig()
- {
- return $this->config;
- }
-
- /**
- * Convert a config array to a Config object with the correct fallback.
- *
- * @param array $config
- *
- * @return Config
- */
- protected function prepareConfig(array $config)
- {
- $config = new Config($config);
- $config->setFallback($this->getConfig());
-
- return $config;
- }
-}
diff --git a/vendor/league/flysystem/src/ConnectionErrorException.php b/vendor/league/flysystem/src/ConnectionErrorException.php
deleted file mode 100644
index adb651d3d..000000000
--- a/vendor/league/flysystem/src/ConnectionErrorException.php
+++ /dev/null
@@ -1,9 +0,0 @@
-filesystem->deleteDir($this->path);
- }
-
- /**
- * List the directory contents.
- *
- * @param bool $recursive
- *
- * @return array|bool directory contents or false
- */
- public function getContents($recursive = false)
- {
- return $this->filesystem->listContents($this->path, $recursive);
- }
-}
diff --git a/vendor/league/flysystem/src/Exception.php b/vendor/league/flysystem/src/Exception.php
deleted file mode 100644
index 4596c0a9a..000000000
--- a/vendor/league/flysystem/src/Exception.php
+++ /dev/null
@@ -1,8 +0,0 @@
-filesystem->has($this->path);
- }
-
- /**
- * Read the file.
- *
- * @return string|false file contents
- */
- public function read()
- {
- return $this->filesystem->read($this->path);
- }
-
- /**
- * Read the file as a stream.
- *
- * @return resource|false file stream
- */
- public function readStream()
- {
- return $this->filesystem->readStream($this->path);
- }
-
- /**
- * Write the new file.
- *
- * @param string $content
- *
- * @return bool success boolean
- */
- public function write($content)
- {
- return $this->filesystem->write($this->path, $content);
- }
-
- /**
- * Write the new file using a stream.
- *
- * @param resource $resource
- *
- * @return bool success boolean
- */
- public function writeStream($resource)
- {
- return $this->filesystem->writeStream($this->path, $resource);
- }
-
- /**
- * Update the file contents.
- *
- * @param string $content
- *
- * @return bool success boolean
- */
- public function update($content)
- {
- return $this->filesystem->update($this->path, $content);
- }
-
- /**
- * Update the file contents with a stream.
- *
- * @param resource $resource
- *
- * @return bool success boolean
- */
- public function updateStream($resource)
- {
- return $this->filesystem->updateStream($this->path, $resource);
- }
-
- /**
- * Create the file or update if exists.
- *
- * @param string $content
- *
- * @return bool success boolean
- */
- public function put($content)
- {
- return $this->filesystem->put($this->path, $content);
- }
-
- /**
- * Create the file or update if exists using a stream.
- *
- * @param resource $resource
- *
- * @return bool success boolean
- */
- public function putStream($resource)
- {
- return $this->filesystem->putStream($this->path, $resource);
- }
-
- /**
- * Rename the file.
- *
- * @param string $newpath
- *
- * @return bool success boolean
- */
- public function rename($newpath)
- {
- if ($this->filesystem->rename($this->path, $newpath)) {
- $this->path = $newpath;
-
- return true;
- }
-
- return false;
- }
-
- /**
- * Copy the file.
- *
- * @param string $newpath
- *
- * @return File|false new file or false
- */
- public function copy($newpath)
- {
- if ($this->filesystem->copy($this->path, $newpath)) {
- return new File($this->filesystem, $newpath);
- }
-
- return false;
- }
-
- /**
- * Get the file's timestamp.
- *
- * @return string|false The timestamp or false on failure.
- */
- public function getTimestamp()
- {
- return $this->filesystem->getTimestamp($this->path);
- }
-
- /**
- * Get the file's mimetype.
- *
- * @return string|false The file mime-type or false on failure.
- */
- public function getMimetype()
- {
- return $this->filesystem->getMimetype($this->path);
- }
-
- /**
- * Get the file's visibility.
- *
- * @return string|false The visibility (public|private) or false on failure.
- */
- public function getVisibility()
- {
- return $this->filesystem->getVisibility($this->path);
- }
-
- /**
- * Get the file's metadata.
- *
- * @return array|false The file metadata or false on failure.
- */
- public function getMetadata()
- {
- return $this->filesystem->getMetadata($this->path);
- }
-
- /**
- * Get the file size.
- *
- * @return int|false The file size or false on failure.
- */
- public function getSize()
- {
- return $this->filesystem->getSize($this->path);
- }
-
- /**
- * Delete the file.
- *
- * @return bool success boolean
- */
- public function delete()
- {
- return $this->filesystem->delete($this->path);
- }
-}
diff --git a/vendor/league/flysystem/src/FileExistsException.php b/vendor/league/flysystem/src/FileExistsException.php
deleted file mode 100644
index c82e20c16..000000000
--- a/vendor/league/flysystem/src/FileExistsException.php
+++ /dev/null
@@ -1,37 +0,0 @@
-path = $path;
-
- parent::__construct('File already exists at path: ' . $this->getPath(), $code, $previous);
- }
-
- /**
- * Get the path which was found.
- *
- * @return string
- */
- public function getPath()
- {
- return $this->path;
- }
-}
diff --git a/vendor/league/flysystem/src/FileNotFoundException.php b/vendor/league/flysystem/src/FileNotFoundException.php
deleted file mode 100644
index 989df69bb..000000000
--- a/vendor/league/flysystem/src/FileNotFoundException.php
+++ /dev/null
@@ -1,37 +0,0 @@
-path = $path;
-
- parent::__construct('File not found at path: ' . $this->getPath(), $code, $previous);
- }
-
- /**
- * Get the path which was not found.
- *
- * @return string
- */
- public function getPath()
- {
- return $this->path;
- }
-}
diff --git a/vendor/league/flysystem/src/Filesystem.php b/vendor/league/flysystem/src/Filesystem.php
deleted file mode 100644
index c4eaf2781..000000000
--- a/vendor/league/flysystem/src/Filesystem.php
+++ /dev/null
@@ -1,409 +0,0 @@
-adapter = $adapter;
- $this->setConfig($config);
- }
-
- /**
- * Get the Adapter.
- *
- * @return AdapterInterface adapter
- */
- public function getAdapter()
- {
- return $this->adapter;
- }
-
- /**
- * @inheritdoc
- */
- public function has($path)
- {
- $path = Util::normalizePath($path);
-
- return strlen($path) === 0 ? false : (bool) $this->getAdapter()->has($path);
- }
-
- /**
- * @inheritdoc
- */
- public function write($path, $contents, array $config = [])
- {
- $path = Util::normalizePath($path);
- $this->assertAbsent($path);
- $config = $this->prepareConfig($config);
-
- return (bool) $this->getAdapter()->write($path, $contents, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function writeStream($path, $resource, array $config = [])
- {
- if ( ! is_resource($resource) || get_resource_type($resource) !== 'stream') {
- throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.');
- }
-
- $path = Util::normalizePath($path);
- $this->assertAbsent($path);
- $config = $this->prepareConfig($config);
-
- Util::rewindStream($resource);
-
- return (bool) $this->getAdapter()->writeStream($path, $resource, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function put($path, $contents, array $config = [])
- {
- $path = Util::normalizePath($path);
- $config = $this->prepareConfig($config);
-
- if ( ! $this->getAdapter() instanceof CanOverwriteFiles && $this->has($path)) {
- return (bool) $this->getAdapter()->update($path, $contents, $config);
- }
-
- return (bool) $this->getAdapter()->write($path, $contents, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function putStream($path, $resource, array $config = [])
- {
- if ( ! is_resource($resource) || get_resource_type($resource) !== 'stream') {
- throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.');
- }
-
- $path = Util::normalizePath($path);
- $config = $this->prepareConfig($config);
- Util::rewindStream($resource);
-
- if ( ! $this->getAdapter() instanceof CanOverwriteFiles && $this->has($path)) {
- return (bool) $this->getAdapter()->updateStream($path, $resource, $config);
- }
-
- return (bool) $this->getAdapter()->writeStream($path, $resource, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function readAndDelete($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
- $contents = $this->read($path);
-
- if ($contents === false) {
- return false;
- }
-
- $this->delete($path);
-
- return $contents;
- }
-
- /**
- * @inheritdoc
- */
- public function update($path, $contents, array $config = [])
- {
- $path = Util::normalizePath($path);
- $config = $this->prepareConfig($config);
-
- $this->assertPresent($path);
-
- return (bool) $this->getAdapter()->update($path, $contents, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function updateStream($path, $resource, array $config = [])
- {
- if ( ! is_resource($resource) || get_resource_type($resource) !== 'stream') {
- throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.');
- }
-
- $path = Util::normalizePath($path);
- $config = $this->prepareConfig($config);
- $this->assertPresent($path);
- Util::rewindStream($resource);
-
- return (bool) $this->getAdapter()->updateStream($path, $resource, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function read($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- if ( ! ($object = $this->getAdapter()->read($path))) {
- return false;
- }
-
- return $object['contents'];
- }
-
- /**
- * @inheritdoc
- */
- public function readStream($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- if ( ! $object = $this->getAdapter()->readStream($path)) {
- return false;
- }
-
- return $object['stream'];
- }
-
- /**
- * @inheritdoc
- */
- public function rename($path, $newpath)
- {
- $path = Util::normalizePath($path);
- $newpath = Util::normalizePath($newpath);
- $this->assertPresent($path);
- $this->assertAbsent($newpath);
-
- return (bool) $this->getAdapter()->rename($path, $newpath);
- }
-
- /**
- * @inheritdoc
- */
- public function copy($path, $newpath)
- {
- $path = Util::normalizePath($path);
- $newpath = Util::normalizePath($newpath);
- $this->assertPresent($path);
- $this->assertAbsent($newpath);
-
- return $this->getAdapter()->copy($path, $newpath);
- }
-
- /**
- * @inheritdoc
- */
- public function delete($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- return $this->getAdapter()->delete($path);
- }
-
- /**
- * @inheritdoc
- */
- public function deleteDir($dirname)
- {
- $dirname = Util::normalizePath($dirname);
-
- if ($dirname === '') {
- throw new RootViolationException('Root directories can not be deleted.');
- }
-
- return (bool) $this->getAdapter()->deleteDir($dirname);
- }
-
- /**
- * @inheritdoc
- */
- public function createDir($dirname, array $config = [])
- {
- $dirname = Util::normalizePath($dirname);
- $config = $this->prepareConfig($config);
-
- return (bool) $this->getAdapter()->createDir($dirname, $config);
- }
-
- /**
- * @inheritdoc
- */
- public function listContents($directory = '', $recursive = false)
- {
- $directory = Util::normalizePath($directory);
- $contents = $this->getAdapter()->listContents($directory, $recursive);
-
- return (new ContentListingFormatter($directory, $recursive, $this->config->get('case_sensitive', true)))
- ->formatListing($contents);
- }
-
- /**
- * @inheritdoc
- */
- public function getMimetype($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- if (( ! $object = $this->getAdapter()->getMimetype($path)) || ! array_key_exists('mimetype', $object)) {
- return false;
- }
-
- return $object['mimetype'];
- }
-
- /**
- * @inheritdoc
- */
- public function getTimestamp($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- if (( ! $object = $this->getAdapter()->getTimestamp($path)) || ! array_key_exists('timestamp', $object)) {
- return false;
- }
-
- return (int) $object['timestamp'];
- }
-
- /**
- * @inheritdoc
- */
- public function getVisibility($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- if (( ! $object = $this->getAdapter()->getVisibility($path)) || ! array_key_exists('visibility', $object)) {
- return false;
- }
-
- return $object['visibility'];
- }
-
- /**
- * @inheritdoc
- */
- public function getSize($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- if (( ! $object = $this->getAdapter()->getSize($path)) || ! array_key_exists('size', $object)) {
- return false;
- }
-
- return (int) $object['size'];
- }
-
- /**
- * @inheritdoc
- */
- public function setVisibility($path, $visibility)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- return (bool) $this->getAdapter()->setVisibility($path, $visibility);
- }
-
- /**
- * @inheritdoc
- */
- public function getMetadata($path)
- {
- $path = Util::normalizePath($path);
- $this->assertPresent($path);
-
- return $this->getAdapter()->getMetadata($path);
- }
-
- /**
- * @inheritdoc
- */
- public function get($path, Handler $handler = null)
- {
- $path = Util::normalizePath($path);
-
- if ( ! $handler) {
- $metadata = $this->getMetadata($path);
- $handler = ($metadata && $metadata['type'] === 'file') ? new File($this, $path) : new Directory($this, $path);
- }
-
- $handler->setPath($path);
- $handler->setFilesystem($this);
-
- return $handler;
- }
-
- /**
- * Assert a file is present.
- *
- * @param string $path path to file
- *
- * @throws FileNotFoundException
- *
- * @return void
- */
- public function assertPresent($path)
- {
- if ($this->config->get('disable_asserts', false) === false && ! $this->has($path)) {
- throw new FileNotFoundException($path);
- }
- }
-
- /**
- * Assert a file is absent.
- *
- * @param string $path path to file
- *
- * @throws FileExistsException
- *
- * @return void
- */
- public function assertAbsent($path)
- {
- if ($this->config->get('disable_asserts', false) === false && $this->has($path)) {
- throw new FileExistsException($path);
- }
- }
-}
diff --git a/vendor/league/flysystem/src/FilesystemException.php b/vendor/league/flysystem/src/FilesystemException.php
deleted file mode 100644
index 3121e533d..000000000
--- a/vendor/league/flysystem/src/FilesystemException.php
+++ /dev/null
@@ -1,7 +0,0 @@
-path = $path;
- $this->filesystem = $filesystem;
- }
-
- /**
- * Check whether the entree is a directory.
- *
- * @return bool
- */
- public function isDir()
- {
- return $this->getType() === 'dir';
- }
-
- /**
- * Check whether the entree is a file.
- *
- * @return bool
- */
- public function isFile()
- {
- return $this->getType() === 'file';
- }
-
- /**
- * Retrieve the entree type (file|dir).
- *
- * @return string file or dir
- */
- public function getType()
- {
- $metadata = $this->filesystem->getMetadata($this->path);
-
- return $metadata ? $metadata['type'] : 'dir';
- }
-
- /**
- * Set the Filesystem object.
- *
- * @param FilesystemInterface $filesystem
- *
- * @return $this
- */
- public function setFilesystem(FilesystemInterface $filesystem)
- {
- $this->filesystem = $filesystem;
-
- return $this;
- }
-
- /**
- * Retrieve the Filesystem object.
- *
- * @return FilesystemInterface
- */
- public function getFilesystem()
- {
- return $this->filesystem;
- }
-
- /**
- * Set the entree path.
- *
- * @param string $path
- *
- * @return $this
- */
- public function setPath($path)
- {
- $this->path = $path;
-
- return $this;
- }
-
- /**
- * Retrieve the entree path.
- *
- * @return string path
- */
- public function getPath()
- {
- return $this->path;
- }
-
- /**
- * Plugins pass-through.
- *
- * @param string $method
- * @param array $arguments
- *
- * @return mixed
- */
- public function __call($method, array $arguments)
- {
- array_unshift($arguments, $this->path);
- $callback = [$this->filesystem, $method];
-
- try {
- return call_user_func_array($callback, $arguments);
- } catch (BadMethodCallException $e) {
- throw new BadMethodCallException(
- 'Call to undefined method '
- . get_called_class()
- . '::' . $method
- );
- }
- }
-}
diff --git a/vendor/league/flysystem/src/InvalidRootException.php b/vendor/league/flysystem/src/InvalidRootException.php
deleted file mode 100644
index 468d1d58c..000000000
--- a/vendor/league/flysystem/src/InvalidRootException.php
+++ /dev/null
@@ -1,9 +0,0 @@
- Filesystem,]
- *
- * @throws InvalidArgumentException
- */
- public function __construct(array $filesystems = [])
- {
- $this->mountFilesystems($filesystems);
- }
-
- /**
- * Mount filesystems.
- *
- * @param FilesystemInterface[] $filesystems [:prefix => Filesystem,]
- *
- * @throws InvalidArgumentException
- *
- * @return $this
- */
- public function mountFilesystems(array $filesystems)
- {
- foreach ($filesystems as $prefix => $filesystem) {
- $this->mountFilesystem($prefix, $filesystem);
- }
-
- return $this;
- }
-
- /**
- * Mount filesystems.
- *
- * @param string $prefix
- * @param FilesystemInterface $filesystem
- *
- * @throws InvalidArgumentException
- *
- * @return $this
- */
- public function mountFilesystem($prefix, FilesystemInterface $filesystem)
- {
- if ( ! is_string($prefix)) {
- throw new InvalidArgumentException(__METHOD__ . ' expects argument #1 to be a string.');
- }
-
- $this->filesystems[$prefix] = $filesystem;
-
- return $this;
- }
-
- /**
- * Get the filesystem with the corresponding prefix.
- *
- * @param string $prefix
- *
- * @throws FilesystemNotFoundException
- *
- * @return FilesystemInterface
- */
- public function getFilesystem($prefix)
- {
- if ( ! isset($this->filesystems[$prefix])) {
- throw new FilesystemNotFoundException('No filesystem mounted with prefix ' . $prefix);
- }
-
- return $this->filesystems[$prefix];
- }
-
- /**
- * Retrieve the prefix from an arguments array.
- *
- * @param array $arguments
- *
- * @throws InvalidArgumentException
- *
- * @return array [:prefix, :arguments]
- */
- public function filterPrefix(array $arguments)
- {
- if (empty($arguments)) {
- throw new InvalidArgumentException('At least one argument needed');
- }
-
- $path = array_shift($arguments);
-
- if ( ! is_string($path)) {
- throw new InvalidArgumentException('First argument should be a string');
- }
-
- list($prefix, $path) = $this->getPrefixAndPath($path);
- array_unshift($arguments, $path);
-
- return [$prefix, $arguments];
- }
-
- /**
- * @param string $directory
- * @param bool $recursive
- *
- * @throws InvalidArgumentException
- * @throws FilesystemNotFoundException
- *
- * @return array
- */
- public function listContents($directory = '', $recursive = false)
- {
- list($prefix, $directory) = $this->getPrefixAndPath($directory);
- $filesystem = $this->getFilesystem($prefix);
- $result = $filesystem->listContents($directory, $recursive);
-
- foreach ($result as &$file) {
- $file['filesystem'] = $prefix;
- }
-
- return $result;
- }
-
- /**
- * Call forwarder.
- *
- * @param string $method
- * @param array $arguments
- *
- * @throws InvalidArgumentException
- * @throws FilesystemNotFoundException
- *
- * @return mixed
- */
- public function __call($method, $arguments)
- {
- list($prefix, $arguments) = $this->filterPrefix($arguments);
-
- return $this->invokePluginOnFilesystem($method, $arguments, $prefix);
- }
-
- /**
- * @param string $from
- * @param string $to
- * @param array $config
- *
- * @throws InvalidArgumentException
- * @throws FilesystemNotFoundException
- * @throws FileExistsException
- *
- * @return bool
- */
- public function copy($from, $to, array $config = [])
- {
- list($prefixFrom, $from) = $this->getPrefixAndPath($from);
-
- $buffer = $this->getFilesystem($prefixFrom)->readStream($from);
-
- if ($buffer === false) {
- return false;
- }
-
- list($prefixTo, $to) = $this->getPrefixAndPath($to);
-
- $result = $this->getFilesystem($prefixTo)->writeStream($to, $buffer, $config);
-
- if (is_resource($buffer)) {
- fclose($buffer);
- }
-
- return $result;
- }
-
- /**
- * List with plugin adapter.
- *
- * @param array $keys
- * @param string $directory
- * @param bool $recursive
- *
- * @throws InvalidArgumentException
- * @throws FilesystemNotFoundException
- *
- * @return array
- */
- public function listWith(array $keys = [], $directory = '', $recursive = false)
- {
- list($prefix, $directory) = $this->getPrefixAndPath($directory);
- $arguments = [$keys, $directory, $recursive];
-
- return $this->invokePluginOnFilesystem('listWith', $arguments, $prefix);
- }
-
- /**
- * Move a file.
- *
- * @param string $from
- * @param string $to
- * @param array $config
- *
- * @throws InvalidArgumentException
- * @throws FilesystemNotFoundException
- *
- * @return bool
- */
- public function move($from, $to, array $config = [])
- {
- list($prefixFrom, $pathFrom) = $this->getPrefixAndPath($from);
- list($prefixTo, $pathTo) = $this->getPrefixAndPath($to);
-
- if ($prefixFrom === $prefixTo) {
- $filesystem = $this->getFilesystem($prefixFrom);
- $renamed = $filesystem->rename($pathFrom, $pathTo);
-
- if ($renamed && isset($config['visibility'])) {
- return $filesystem->setVisibility($pathTo, $config['visibility']);
- }
-
- return $renamed;
- }
-
- $copied = $this->copy($from, $to, $config);
-
- if ($copied) {
- return $this->delete($from);
- }
-
- return false;
- }
-
- /**
- * Invoke a plugin on a filesystem mounted on a given prefix.
- *
- * @param string $method
- * @param array $arguments
- * @param string $prefix
- *
- * @throws FilesystemNotFoundException
- *
- * @return mixed
- */
- public function invokePluginOnFilesystem($method, $arguments, $prefix)
- {
- $filesystem = $this->getFilesystem($prefix);
-
- try {
- return $this->invokePlugin($method, $arguments, $filesystem);
- } catch (PluginNotFoundException $e) {
- // Let it pass, it's ok, don't panic.
- }
-
- $callback = [$filesystem, $method];
-
- return call_user_func_array($callback, $arguments);
- }
-
- /**
- * @param string $path
- *
- * @throws InvalidArgumentException
- *
- * @return string[] [:prefix, :path]
- */
- protected function getPrefixAndPath($path)
- {
- if (strpos($path, '://') < 1) {
- throw new InvalidArgumentException('No prefix detected in path: ' . $path);
- }
-
- return explode('://', $path, 2);
- }
-
- /**
- * Check whether a file exists.
- *
- * @param string $path
- *
- * @return bool
- */
- public function has($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->has($path);
- }
-
- /**
- * Read a file.
- *
- * @param string $path The path to the file.
- *
- * @throws FileNotFoundException
- *
- * @return string|false The file contents or false on failure.
- */
- public function read($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->read($path);
- }
-
- /**
- * Retrieves a read-stream for a path.
- *
- * @param string $path The path to the file.
- *
- * @throws FileNotFoundException
- *
- * @return resource|false The path resource or false on failure.
- */
- public function readStream($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->readStream($path);
- }
-
- /**
- * Get a file's metadata.
- *
- * @param string $path The path to the file.
- *
- * @throws FileNotFoundException
- *
- * @return array|false The file metadata or false on failure.
- */
- public function getMetadata($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->getMetadata($path);
- }
-
- /**
- * Get a file's size.
- *
- * @param string $path The path to the file.
- *
- * @throws FileNotFoundException
- *
- * @return int|false The file size or false on failure.
- */
- public function getSize($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->getSize($path);
- }
-
- /**
- * Get a file's mime-type.
- *
- * @param string $path The path to the file.
- *
- * @throws FileNotFoundException
- *
- * @return string|false The file mime-type or false on failure.
- */
- public function getMimetype($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->getMimetype($path);
- }
-
- /**
- * Get a file's timestamp.
- *
- * @param string $path The path to the file.
- *
- * @throws FileNotFoundException
- *
- * @return string|false The timestamp or false on failure.
- */
- public function getTimestamp($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->getTimestamp($path);
- }
-
- /**
- * Get a file's visibility.
- *
- * @param string $path The path to the file.
- *
- * @throws FileNotFoundException
- *
- * @return string|false The visibility (public|private) or false on failure.
- */
- public function getVisibility($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->getVisibility($path);
- }
-
- /**
- * Write a new file.
- *
- * @param string $path The path of the new file.
- * @param string $contents The file contents.
- * @param array $config An optional configuration array.
- *
- * @throws FileExistsException
- *
- * @return bool True on success, false on failure.
- */
- public function write($path, $contents, array $config = [])
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->write($path, $contents, $config);
- }
-
- /**
- * Write a new file using a stream.
- *
- * @param string $path The path of the new file.
- * @param resource $resource The file handle.
- * @param array $config An optional configuration array.
- *
- * @throws InvalidArgumentException If $resource is not a file handle.
- * @throws FileExistsException
- *
- * @return bool True on success, false on failure.
- */
- public function writeStream($path, $resource, array $config = [])
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->writeStream($path, $resource, $config);
- }
-
- /**
- * Update an existing file.
- *
- * @param string $path The path of the existing file.
- * @param string $contents The file contents.
- * @param array $config An optional configuration array.
- *
- * @throws FileNotFoundException
- *
- * @return bool True on success, false on failure.
- */
- public function update($path, $contents, array $config = [])
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->update($path, $contents, $config);
- }
-
- /**
- * Update an existing file using a stream.
- *
- * @param string $path The path of the existing file.
- * @param resource $resource The file handle.
- * @param array $config An optional configuration array.
- *
- * @throws InvalidArgumentException If $resource is not a file handle.
- * @throws FileNotFoundException
- *
- * @return bool True on success, false on failure.
- */
- public function updateStream($path, $resource, array $config = [])
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->updateStream($path, $resource, $config);
- }
-
- /**
- * Rename a file.
- *
- * @param string $path Path to the existing file.
- * @param string $newpath The new path of the file.
- *
- * @throws FileExistsException Thrown if $newpath exists.
- * @throws FileNotFoundException Thrown if $path does not exist.
- *
- * @return bool True on success, false on failure.
- */
- public function rename($path, $newpath)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->rename($path, $newpath);
- }
-
- /**
- * Delete a file.
- *
- * @param string $path
- *
- * @throws FileNotFoundException
- *
- * @return bool True on success, false on failure.
- */
- public function delete($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->delete($path);
- }
-
- /**
- * Delete a directory.
- *
- * @param string $dirname
- *
- * @throws RootViolationException Thrown if $dirname is empty.
- *
- * @return bool True on success, false on failure.
- */
- public function deleteDir($dirname)
- {
- list($prefix, $dirname) = $this->getPrefixAndPath($dirname);
-
- return $this->getFilesystem($prefix)->deleteDir($dirname);
- }
-
- /**
- * Create a directory.
- *
- * @param string $dirname The name of the new directory.
- * @param array $config An optional configuration array.
- *
- * @return bool True on success, false on failure.
- */
- public function createDir($dirname, array $config = [])
- {
- list($prefix, $dirname) = $this->getPrefixAndPath($dirname);
-
- return $this->getFilesystem($prefix)->createDir($dirname);
- }
-
- /**
- * Set the visibility for a file.
- *
- * @param string $path The path to the file.
- * @param string $visibility One of 'public' or 'private'.
- *
- * @throws FileNotFoundException
- *
- * @return bool True on success, false on failure.
- */
- public function setVisibility($path, $visibility)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->setVisibility($path, $visibility);
- }
-
- /**
- * Create a file or update if exists.
- *
- * @param string $path The path to the file.
- * @param string $contents The file contents.
- * @param array $config An optional configuration array.
- *
- * @return bool True on success, false on failure.
- */
- public function put($path, $contents, array $config = [])
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->put($path, $contents, $config);
- }
-
- /**
- * Create a file or update if exists.
- *
- * @param string $path The path to the file.
- * @param resource $resource The file handle.
- * @param array $config An optional configuration array.
- *
- * @throws InvalidArgumentException Thrown if $resource is not a resource.
- *
- * @return bool True on success, false on failure.
- */
- public function putStream($path, $resource, array $config = [])
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->putStream($path, $resource, $config);
- }
-
- /**
- * Read and delete a file.
- *
- * @param string $path The path to the file.
- *
- * @throws FileNotFoundException
- *
- * @return string|false The file contents, or false on failure.
- */
- public function readAndDelete($path)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->readAndDelete($path);
- }
-
- /**
- * Get a file/directory handler.
- *
- * @deprecated
- *
- * @param string $path The path to the file.
- * @param Handler $handler An optional existing handler to populate.
- *
- * @return Handler Either a file or directory handler.
- */
- public function get($path, Handler $handler = null)
- {
- list($prefix, $path) = $this->getPrefixAndPath($path);
-
- return $this->getFilesystem($prefix)->get($path);
- }
-}
diff --git a/vendor/league/flysystem/src/NotSupportedException.php b/vendor/league/flysystem/src/NotSupportedException.php
deleted file mode 100644
index e0a989b22..000000000
--- a/vendor/league/flysystem/src/NotSupportedException.php
+++ /dev/null
@@ -1,37 +0,0 @@
-getPathname());
- }
-
- /**
- * Create a new exception for a link.
- *
- * @param string $systemType
- *
- * @return static
- */
- public static function forFtpSystemType($systemType)
- {
- $message = "The FTP system type '$systemType' is currently not supported.";
-
- return new static($message);
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/AbstractPlugin.php b/vendor/league/flysystem/src/Plugin/AbstractPlugin.php
deleted file mode 100644
index 0d5678976..000000000
--- a/vendor/league/flysystem/src/Plugin/AbstractPlugin.php
+++ /dev/null
@@ -1,24 +0,0 @@
-filesystem = $filesystem;
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/EmptyDir.php b/vendor/league/flysystem/src/Plugin/EmptyDir.php
deleted file mode 100644
index b5ae7f582..000000000
--- a/vendor/league/flysystem/src/Plugin/EmptyDir.php
+++ /dev/null
@@ -1,34 +0,0 @@
-filesystem->listContents($dirname, false);
-
- foreach ($listing as $item) {
- if ($item['type'] === 'dir') {
- $this->filesystem->deleteDir($item['path']);
- } else {
- $this->filesystem->delete($item['path']);
- }
- }
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/ForcedCopy.php b/vendor/league/flysystem/src/Plugin/ForcedCopy.php
deleted file mode 100644
index a41e9f3ae..000000000
--- a/vendor/league/flysystem/src/Plugin/ForcedCopy.php
+++ /dev/null
@@ -1,44 +0,0 @@
-filesystem->delete($newpath);
- } catch (FileNotFoundException $e) {
- // The destination path does not exist. That's ok.
- $deleted = true;
- }
-
- if ($deleted) {
- return $this->filesystem->copy($path, $newpath);
- }
-
- return false;
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/ForcedRename.php b/vendor/league/flysystem/src/Plugin/ForcedRename.php
deleted file mode 100644
index 3f51cd607..000000000
--- a/vendor/league/flysystem/src/Plugin/ForcedRename.php
+++ /dev/null
@@ -1,44 +0,0 @@
-filesystem->delete($newpath);
- } catch (FileNotFoundException $e) {
- // The destination path does not exist. That's ok.
- $deleted = true;
- }
-
- if ($deleted) {
- return $this->filesystem->rename($path, $newpath);
- }
-
- return false;
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/GetWithMetadata.php b/vendor/league/flysystem/src/Plugin/GetWithMetadata.php
deleted file mode 100644
index 2f13d2fd2..000000000
--- a/vendor/league/flysystem/src/Plugin/GetWithMetadata.php
+++ /dev/null
@@ -1,51 +0,0 @@
-filesystem->getMetadata($path);
-
- if ( ! $object) {
- return false;
- }
-
- $keys = array_diff($metadata, array_keys($object));
-
- foreach ($keys as $key) {
- if ( ! method_exists($this->filesystem, $method = 'get' . ucfirst($key))) {
- throw new InvalidArgumentException('Could not fetch metadata: ' . $key);
- }
-
- $object[$key] = $this->filesystem->{$method}($path);
- }
-
- return $object;
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/ListFiles.php b/vendor/league/flysystem/src/Plugin/ListFiles.php
deleted file mode 100644
index 9669fe7e7..000000000
--- a/vendor/league/flysystem/src/Plugin/ListFiles.php
+++ /dev/null
@@ -1,35 +0,0 @@
-filesystem->listContents($directory, $recursive);
-
- $filter = function ($object) {
- return $object['type'] === 'file';
- };
-
- return array_values(array_filter($contents, $filter));
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/ListPaths.php b/vendor/league/flysystem/src/Plugin/ListPaths.php
deleted file mode 100644
index 0889d1f8d..000000000
--- a/vendor/league/flysystem/src/Plugin/ListPaths.php
+++ /dev/null
@@ -1,36 +0,0 @@
-filesystem->listContents($directory, $recursive);
-
- foreach ($contents as $object) {
- $result[] = $object['path'];
- }
-
- return $result;
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/ListWith.php b/vendor/league/flysystem/src/Plugin/ListWith.php
deleted file mode 100644
index d64debeca..000000000
--- a/vendor/league/flysystem/src/Plugin/ListWith.php
+++ /dev/null
@@ -1,60 +0,0 @@
-filesystem->listContents($directory, $recursive);
-
- foreach ($contents as $index => $object) {
- if ($object['type'] === 'file') {
- $missingKeys = array_diff($keys, array_keys($object));
- $contents[$index] = array_reduce($missingKeys, [$this, 'getMetadataByName'], $object);
- }
- }
-
- return $contents;
- }
-
- /**
- * Get a meta-data value by key name.
- *
- * @param array $object
- * @param string $key
- *
- * @return array
- */
- protected function getMetadataByName(array $object, $key)
- {
- $method = 'get' . ucfirst($key);
-
- if ( ! method_exists($this->filesystem, $method)) {
- throw new \InvalidArgumentException('Could not get meta-data for key: ' . $key);
- }
-
- $object[$key] = $this->filesystem->{$method}($object['path']);
-
- return $object;
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/PluggableTrait.php b/vendor/league/flysystem/src/Plugin/PluggableTrait.php
deleted file mode 100644
index 922edfe52..000000000
--- a/vendor/league/flysystem/src/Plugin/PluggableTrait.php
+++ /dev/null
@@ -1,97 +0,0 @@
-plugins[$plugin->getMethod()] = $plugin;
-
- return $this;
- }
-
- /**
- * Find a specific plugin.
- *
- * @param string $method
- *
- * @throws PluginNotFoundException
- *
- * @return PluginInterface
- */
- protected function findPlugin($method)
- {
- if ( ! isset($this->plugins[$method])) {
- throw new PluginNotFoundException('Plugin not found for method: ' . $method);
- }
-
- return $this->plugins[$method];
- }
-
- /**
- * Invoke a plugin by method name.
- *
- * @param string $method
- * @param array $arguments
- * @param FilesystemInterface $filesystem
- *
- * @throws PluginNotFoundException
- *
- * @return mixed
- */
- protected function invokePlugin($method, array $arguments, FilesystemInterface $filesystem)
- {
- $plugin = $this->findPlugin($method);
- $plugin->setFilesystem($filesystem);
- $callback = [$plugin, 'handle'];
-
- return call_user_func_array($callback, $arguments);
- }
-
- /**
- * Plugins pass-through.
- *
- * @param string $method
- * @param array $arguments
- *
- * @throws BadMethodCallException
- *
- * @return mixed
- */
- public function __call($method, array $arguments)
- {
- try {
- return $this->invokePlugin($method, $arguments, $this);
- } catch (PluginNotFoundException $e) {
- throw new BadMethodCallException(
- 'Call to undefined method '
- . get_class($this)
- . '::' . $method
- );
- }
- }
-}
diff --git a/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php b/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php
deleted file mode 100644
index fd1d7e7e3..000000000
--- a/vendor/league/flysystem/src/Plugin/PluginNotFoundException.php
+++ /dev/null
@@ -1,10 +0,0 @@
-hash = spl_object_hash($this);
- static::$safeStorage[$this->hash] = [];
- }
-
- public function storeSafely($key, $value)
- {
- static::$safeStorage[$this->hash][$key] = $value;
- }
-
- public function retrieveSafely($key)
- {
- if (array_key_exists($key, static::$safeStorage[$this->hash])) {
- return static::$safeStorage[$this->hash][$key];
- }
- }
-
- public function __destruct()
- {
- unset(static::$safeStorage[$this->hash]);
- }
-}
diff --git a/vendor/league/flysystem/src/UnreadableFileException.php b/vendor/league/flysystem/src/UnreadableFileException.php
deleted file mode 100644
index e66803383..000000000
--- a/vendor/league/flysystem/src/UnreadableFileException.php
+++ /dev/null
@@ -1,18 +0,0 @@
-getRealPath()
- )
- );
- }
-}
diff --git a/vendor/league/flysystem/src/Util.php b/vendor/league/flysystem/src/Util.php
deleted file mode 100644
index 1a2db718d..000000000
--- a/vendor/league/flysystem/src/Util.php
+++ /dev/null
@@ -1,354 +0,0 @@
- ''];
- }
-
- /**
- * Normalize a dirname return value.
- *
- * @param string $dirname
- *
- * @return string normalized dirname
- */
- public static function normalizeDirname($dirname)
- {
- return $dirname === '.' ? '' : $dirname;
- }
-
- /**
- * Get a normalized dirname from a path.
- *
- * @param string $path
- *
- * @return string dirname
- */
- public static function dirname($path)
- {
- return static::normalizeDirname(dirname($path));
- }
-
- /**
- * Map result arrays.
- *
- * @param array $object
- * @param array $map
- *
- * @return array mapped result
- */
- public static function map(array $object, array $map)
- {
- $result = [];
-
- foreach ($map as $from => $to) {
- if ( ! isset($object[$from])) {
- continue;
- }
-
- $result[$to] = $object[$from];
- }
-
- return $result;
- }
-
- /**
- * Normalize path.
- *
- * @param string $path
- *
- * @throws LogicException
- *
- * @return string
- */
- public static function normalizePath($path)
- {
- return static::normalizeRelativePath($path);
- }
-
- /**
- * Normalize relative directories in a path.
- *
- * @param string $path
- *
- * @throws LogicException
- *
- * @return string
- */
- public static function normalizeRelativePath($path)
- {
- $path = str_replace('\\', '/', $path);
- $path = static::removeFunkyWhiteSpace($path);
- $parts = [];
-
- foreach (explode('/', $path) as $part) {
- switch ($part) {
- case '':
- case '.':
- break;
-
- case '..':
- if (empty($parts)) {
- throw new LogicException(
- 'Path is outside of the defined root, path: [' . $path . ']'
- );
- }
- array_pop($parts);
- break;
-
- default:
- $parts[] = $part;
- break;
- }
- }
-
- $path = implode('/', $parts);
-
- return $path;
- }
-
- /**
- * Rejects unprintable characters and invalid unicode characters.
- *
- * @param string $path
- *
- * @return string $path
- */
- protected static function removeFunkyWhiteSpace($path)
- {
- if (preg_match('#\p{C}+#u', $path)) {
- throw CorruptedPathDetected::forPath($path);
- }
-
- return $path;
- }
-
- /**
- * Normalize prefix.
- *
- * @param string $prefix
- * @param string $separator
- *
- * @return string normalized path
- */
- public static function normalizePrefix($prefix, $separator)
- {
- return rtrim($prefix, $separator) . $separator;
- }
-
- /**
- * Get content size.
- *
- * @param string $contents
- *
- * @return int content size
- */
- public static function contentSize($contents)
- {
- return defined('MB_OVERLOAD_STRING') ? mb_strlen($contents, '8bit') : strlen($contents);
- }
-
- /**
- * Guess MIME Type based on the path of the file and it's content.
- *
- * @param string $path
- * @param string|resource $content
- *
- * @return string|null MIME Type or NULL if no extension detected
- */
- public static function guessMimeType($path, $content)
- {
- $mimeType = MimeType::detectByContent($content);
-
- if ( ! (empty($mimeType) || in_array($mimeType, ['application/x-empty', 'text/plain', 'text/x-asm']))) {
- return $mimeType;
- }
-
- return MimeType::detectByFilename($path);
- }
-
- /**
- * Emulate directories.
- *
- * @param array $listing
- *
- * @return array listing with emulated directories
- */
- public static function emulateDirectories(array $listing)
- {
- $directories = [];
- $listedDirectories = [];
-
- foreach ($listing as $object) {
- [$directories, $listedDirectories] = static::emulateObjectDirectories($object, $directories, $listedDirectories);
- }
-
- $directories = array_diff(array_unique($directories), array_unique($listedDirectories));
-
- foreach ($directories as $directory) {
- $listing[] = static::pathinfo($directory) + ['type' => 'dir'];
- }
-
- return $listing;
- }
-
- /**
- * Ensure a Config instance.
- *
- * @param null|array|Config $config
- *
- * @return Config config instance
- *
- * @throw LogicException
- */
- public static function ensureConfig($config)
- {
- if ($config === null) {
- return new Config();
- }
-
- if ($config instanceof Config) {
- return $config;
- }
-
- if (is_array($config)) {
- return new Config($config);
- }
-
- throw new LogicException('A config should either be an array or a Flysystem\Config object.');
- }
-
- /**
- * Rewind a stream.
- *
- * @param resource $resource
- */
- public static function rewindStream($resource)
- {
- if (ftell($resource) !== 0 && static::isSeekableStream($resource)) {
- rewind($resource);
- }
- }
-
- public static function isSeekableStream($resource)
- {
- $metadata = stream_get_meta_data($resource);
-
- return $metadata['seekable'];
- }
-
- /**
- * Get the size of a stream.
- *
- * @param resource $resource
- *
- * @return int|null stream size
- */
- public static function getStreamSize($resource)
- {
- $stat = fstat($resource);
-
- if ( ! is_array($stat) || ! isset($stat['size'])) {
- return null;
- }
-
- return $stat['size'];
- }
-
- /**
- * Emulate the directories of a single object.
- *
- * @param array $object
- * @param array $directories
- * @param array $listedDirectories
- *
- * @return array
- */
- protected static function emulateObjectDirectories(array $object, array $directories, array $listedDirectories)
- {
- if ($object['type'] === 'dir') {
- $listedDirectories[] = $object['path'];
- }
-
- if ( ! isset($object['dirname']) || trim($object['dirname']) === '') {
- return [$directories, $listedDirectories];
- }
-
- $parent = $object['dirname'];
-
- while (isset($parent) && trim($parent) !== '' && ! in_array($parent, $directories)) {
- $directories[] = $parent;
- $parent = static::dirname($parent);
- }
-
- if (isset($object['type']) && $object['type'] === 'dir') {
- $listedDirectories[] = $object['path'];
-
- return [$directories, $listedDirectories];
- }
-
- return [$directories, $listedDirectories];
- }
-
- /**
- * Returns the trailing name component of the path.
- *
- * @param string $path
- *
- * @return string
- */
- private static function basename($path)
- {
- $separators = DIRECTORY_SEPARATOR === '/' ? '/' : '\/';
-
- $path = rtrim($path, $separators);
-
- $basename = preg_replace('#.*?([^' . preg_quote($separators, '#') . ']+$)#', '$1', $path);
-
- if (DIRECTORY_SEPARATOR === '/') {
- return $basename;
- }
- // @codeCoverageIgnoreStart
- // Extra Windows path munging. This is tested via AppVeyor, but code
- // coverage is not reported.
-
- // Handle relative paths with drive letters. c:file.txt.
- while (preg_match('#^[a-zA-Z]{1}:[^\\\/]#', $basename)) {
- $basename = substr($basename, 2);
- }
-
- // Remove colon for standalone drive letter names.
- if (preg_match('#^[a-zA-Z]{1}:$#', $basename)) {
- $basename = rtrim($basename, ':');
- }
-
- return $basename;
- // @codeCoverageIgnoreEnd
- }
-}
diff --git a/vendor/league/flysystem/src/Util/ContentListingFormatter.php b/vendor/league/flysystem/src/Util/ContentListingFormatter.php
deleted file mode 100644
index ae0d3b91d..000000000
--- a/vendor/league/flysystem/src/Util/ContentListingFormatter.php
+++ /dev/null
@@ -1,122 +0,0 @@
-directory = rtrim($directory, '/');
- $this->recursive = $recursive;
- $this->caseSensitive = $caseSensitive;
- }
-
- /**
- * Format contents listing.
- *
- * @param array $listing
- *
- * @return array
- */
- public function formatListing(array $listing)
- {
- $listing = array_filter(array_map([$this, 'addPathInfo'], $listing), [$this, 'isEntryOutOfScope']);
-
- return $this->sortListing(array_values($listing));
- }
-
- private function addPathInfo(array $entry)
- {
- return $entry + Util::pathinfo($entry['path']);
- }
-
- /**
- * Determine if the entry is out of scope.
- *
- * @param array $entry
- *
- * @return bool
- */
- private function isEntryOutOfScope(array $entry)
- {
- if (empty($entry['path']) && $entry['path'] !== '0') {
- return false;
- }
-
- if ($this->recursive) {
- return $this->residesInDirectory($entry);
- }
-
- return $this->isDirectChild($entry);
- }
-
- /**
- * Check if the entry resides within the parent directory.
- *
- * @param array $entry
- *
- * @return bool
- */
- private function residesInDirectory(array $entry)
- {
- if ($this->directory === '') {
- return true;
- }
-
- return $this->caseSensitive
- ? strpos($entry['path'], $this->directory . '/') === 0
- : stripos($entry['path'], $this->directory . '/') === 0;
- }
-
- /**
- * Check if the entry is a direct child of the directory.
- *
- * @param array $entry
- *
- * @return bool
- */
- private function isDirectChild(array $entry)
- {
- return $this->caseSensitive
- ? $entry['dirname'] === $this->directory
- : strcasecmp($this->directory, $entry['dirname']) === 0;
- }
-
- /**
- * @param array $listing
- *
- * @return array
- */
- private function sortListing(array $listing)
- {
- usort($listing, function ($a, $b) {
- return strcasecmp($a['path'], $b['path']);
- });
-
- return $listing;
- }
-}
diff --git a/vendor/league/flysystem/src/Util/MimeType.php b/vendor/league/flysystem/src/Util/MimeType.php
deleted file mode 100644
index 35cba3fb8..000000000
--- a/vendor/league/flysystem/src/Util/MimeType.php
+++ /dev/null
@@ -1,80 +0,0 @@
-detectMimeTypeFromBuffer($content);
- }
-
- return 'text/plain';
- }
-
- /**
- * Detects MIME Type based on file extension.
- *
- * @param string $extension
- *
- * @return string MIME Type
- */
- public static function detectByFileExtension($extension)
- {
- return static::detector()->detectMimeTypeFromPath('artificial.' . $extension) ?: 'text/plain';
- }
-
- /**
- * @param string $filename
- *
- * @return string MIME Type
- */
- public static function detectByFilename($filename)
- {
- return static::detector()->detectMimeTypeFromPath($filename) ?: 'text/plain';
- }
-
- /**
- * @return array Map of file extension to MIME Type
- */
- public static function getExtensionToMimeTypeMap()
- {
- return static::$extensionToMimeTypeMap;
- }
-}
diff --git a/vendor/league/flysystem/src/Util/StreamHasher.php b/vendor/league/flysystem/src/Util/StreamHasher.php
deleted file mode 100644
index 938ec5db7..000000000
--- a/vendor/league/flysystem/src/Util/StreamHasher.php
+++ /dev/null
@@ -1,36 +0,0 @@
-algo = $algo;
- }
-
- /**
- * @param resource $resource
- *
- * @return string
- */
- public function hash($resource)
- {
- rewind($resource);
- $context = hash_init($this->algo);
- hash_update_stream($context, $resource);
- fclose($resource);
-
- return hash_final($context);
- }
-}
diff --git a/vendor/league/mime-type-detection/CHANGELOG.md b/vendor/league/mime-type-detection/CHANGELOG.md
deleted file mode 100644
index 2264f7ad8..000000000
--- a/vendor/league/mime-type-detection/CHANGELOG.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Changelog
-
-## 1.10.0 - 2022-04-11
-
-### Fixed
-
-- Added Flysystem v1 inconclusive mime-types and made it configurable as a constructor parameter.
-
-## 1.9.0 - 2021-11-21
-
-### Updated
-
-- Updated lookup
-
-## 1.8.0 - 2021-09-25
-
-### Added
-
-- Added the decorator `OverridingExtensionToMimeTypeMap` which allows you to override values.
-
-## 1.7.0 - 2021-01-18
-
-### Added
-
-- Added a `bufferSampleSize` parameter to the `FinfoMimeTypeDetector` class that allows you to send a reduced content sample which costs less memory.
-
-## 1.6.0 - 2021-01-18
-
-### Changes
-
-- Updated generated mime-type map
diff --git a/vendor/league/mime-type-detection/LICENSE b/vendor/league/mime-type-detection/LICENSE
deleted file mode 100644
index 1f0165218..000000000
--- a/vendor/league/mime-type-detection/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2013-2022 Frank de Jonge
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/vendor/league/mime-type-detection/composer.json b/vendor/league/mime-type-detection/composer.json
deleted file mode 100644
index 80ca1af81..000000000
--- a/vendor/league/mime-type-detection/composer.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "league/mime-type-detection",
- "description": "Mime-type detection for Flysystem",
- "license": "MIT",
- "authors": [
- {
- "name": "Frank de Jonge",
- "email": "info@frankdejonge.nl"
- }
- ],
- "scripts": {
- "test": "vendor/bin/phpunit",
- "phpstan": "vendor/bin/phpstan analyse -l 6 src"
- },
- "require": {
- "php": "^7.2 || ^8.0",
- "ext-fileinfo": "*"
- },
- "require-dev": {
- "phpunit/phpunit": "^8.5.8 || ^9.3",
- "phpstan/phpstan": "^0.12.68",
- "friendsofphp/php-cs-fixer": "^3.2"
- },
- "autoload": {
- "psr-4": {
- "League\\MimeTypeDetection\\": "src"
- }
- },
- "config": {
- "platform": {
- "php": "7.2.0"
- }
- }
-}
diff --git a/vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php b/vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php
deleted file mode 100644
index fc0424161..000000000
--- a/vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php
+++ /dev/null
@@ -1,13 +0,0 @@
-extensions = $extensions ?: new GeneratedExtensionToMimeTypeMap();
- }
-
- public function detectMimeType(string $path, $contents): ?string
- {
- return $this->detectMimeTypeFromPath($path);
- }
-
- public function detectMimeTypeFromPath(string $path): ?string
- {
- $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));
-
- return $this->extensions->lookupMimeType($extension);
- }
-
- public function detectMimeTypeFromFile(string $path): ?string
- {
- return $this->detectMimeTypeFromPath($path);
- }
-
- public function detectMimeTypeFromBuffer(string $contents): ?string
- {
- return null;
- }
-}
diff --git a/vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php b/vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php
deleted file mode 100644
index 1dad7bc1a..000000000
--- a/vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php
+++ /dev/null
@@ -1,10 +0,0 @@
-
- */
- private $inconclusiveMimetypes;
-
- public function __construct(
- string $magicFile = '',
- ExtensionToMimeTypeMap $extensionMap = null,
- ?int $bufferSampleSize = null,
- array $inconclusiveMimetypes = self::INCONCLUSIVE_MIME_TYPES
- ) {
- $this->finfo = new finfo(FILEINFO_MIME_TYPE, $magicFile);
- $this->extensionMap = $extensionMap ?: new GeneratedExtensionToMimeTypeMap();
- $this->bufferSampleSize = $bufferSampleSize;
- $this->inconclusiveMimetypes = $inconclusiveMimetypes;
- }
-
- public function detectMimeType(string $path, $contents): ?string
- {
- $mimeType = is_string($contents)
- ? (@$this->finfo->buffer($this->takeSample($contents)) ?: null)
- : null;
-
- if ($mimeType !== null && ! in_array($mimeType, $this->inconclusiveMimetypes)) {
- return $mimeType;
- }
-
- return $this->detectMimeTypeFromPath($path);
- }
-
- public function detectMimeTypeFromPath(string $path): ?string
- {
- $extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));
-
- return $this->extensionMap->lookupMimeType($extension);
- }
-
- public function detectMimeTypeFromFile(string $path): ?string
- {
- return @$this->finfo->file($path) ?: null;
- }
-
- public function detectMimeTypeFromBuffer(string $contents): ?string
- {
- return @$this->finfo->buffer($this->takeSample($contents)) ?: null;
- }
-
- private function takeSample(string $contents): string
- {
- if ($this->bufferSampleSize === null) {
- return $contents;
- }
-
- return (string) substr($contents, 0, $this->bufferSampleSize);
- }
-}
diff --git a/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php b/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php
deleted file mode 100644
index f092388dd..000000000
--- a/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php
+++ /dev/null
@@ -1,1227 +0,0 @@
- 'application/vnd.1000minds.decision-model+xml',
- '3dml' => 'text/vnd.in3d.3dml',
- '3ds' => 'image/x-3ds',
- '3g2' => 'video/3gpp2',
- '3gp' => 'video/3gp',
- '3gpp' => 'video/3gpp',
- '3mf' => 'model/3mf',
- '7z' => 'application/x-7z-compressed',
- '7zip' => 'application/x-7z-compressed',
- '123' => 'application/vnd.lotus-1-2-3',
- 'aab' => 'application/x-authorware-bin',
- 'aac' => 'audio/x-acc',
- 'aam' => 'application/x-authorware-map',
- 'aas' => 'application/x-authorware-seg',
- 'abw' => 'application/x-abiword',
- 'ac' => 'application/vnd.nokia.n-gage.ac+xml',
- 'ac3' => 'audio/ac3',
- 'acc' => 'application/vnd.americandynamics.acc',
- 'ace' => 'application/x-ace-compressed',
- 'acu' => 'application/vnd.acucobol',
- 'acutc' => 'application/vnd.acucorp',
- 'adp' => 'audio/adpcm',
- 'aep' => 'application/vnd.audiograph',
- 'afm' => 'application/x-font-type1',
- 'afp' => 'application/vnd.ibm.modcap',
- 'age' => 'application/vnd.age',
- 'ahead' => 'application/vnd.ahead.space',
- 'ai' => 'application/pdf',
- 'aif' => 'audio/x-aiff',
- 'aifc' => 'audio/x-aiff',
- 'aiff' => 'audio/x-aiff',
- 'air' => 'application/vnd.adobe.air-application-installer-package+zip',
- 'ait' => 'application/vnd.dvb.ait',
- 'ami' => 'application/vnd.amiga.ami',
- 'amr' => 'audio/amr',
- 'apk' => 'application/vnd.android.package-archive',
- 'apng' => 'image/apng',
- 'appcache' => 'text/cache-manifest',
- 'application' => 'application/x-ms-application',
- 'apr' => 'application/vnd.lotus-approach',
- 'arc' => 'application/x-freearc',
- 'arj' => 'application/x-arj',
- 'asc' => 'application/pgp-signature',
- 'asf' => 'video/x-ms-asf',
- 'asm' => 'text/x-asm',
- 'aso' => 'application/vnd.accpac.simply.aso',
- 'asx' => 'video/x-ms-asf',
- 'atc' => 'application/vnd.acucorp',
- 'atom' => 'application/atom+xml',
- 'atomcat' => 'application/atomcat+xml',
- 'atomdeleted' => 'application/atomdeleted+xml',
- 'atomsvc' => 'application/atomsvc+xml',
- 'atx' => 'application/vnd.antix.game-component',
- 'au' => 'audio/x-au',
- 'avci' => 'image/avci',
- 'avcs' => 'image/avcs',
- 'avi' => 'video/x-msvideo',
- 'avif' => 'image/avif',
- 'aw' => 'application/applixware',
- 'azf' => 'application/vnd.airzip.filesecure.azf',
- 'azs' => 'application/vnd.airzip.filesecure.azs',
- 'azv' => 'image/vnd.airzip.accelerator.azv',
- 'azw' => 'application/vnd.amazon.ebook',
- 'b16' => 'image/vnd.pco.b16',
- 'bat' => 'application/x-msdownload',
- 'bcpio' => 'application/x-bcpio',
- 'bdf' => 'application/x-font-bdf',
- 'bdm' => 'application/vnd.syncml.dm+wbxml',
- 'bdoc' => 'application/x-bdoc',
- 'bed' => 'application/vnd.realvnc.bed',
- 'bh2' => 'application/vnd.fujitsu.oasysprs',
- 'bin' => 'application/octet-stream',
- 'blb' => 'application/x-blorb',
- 'blorb' => 'application/x-blorb',
- 'bmi' => 'application/vnd.bmi',
- 'bmml' => 'application/vnd.balsamiq.bmml+xml',
- 'bmp' => 'image/bmp',
- 'book' => 'application/vnd.framemaker',
- 'box' => 'application/vnd.previewsystems.box',
- 'boz' => 'application/x-bzip2',
- 'bpk' => 'application/octet-stream',
- 'bpmn' => 'application/octet-stream',
- 'bsp' => 'model/vnd.valve.source.compiled-map',
- 'btif' => 'image/prs.btif',
- 'buffer' => 'application/octet-stream',
- 'bz' => 'application/x-bzip',
- 'bz2' => 'application/x-bzip2',
- 'c' => 'text/x-c',
- 'c4d' => 'application/vnd.clonk.c4group',
- 'c4f' => 'application/vnd.clonk.c4group',
- 'c4g' => 'application/vnd.clonk.c4group',
- 'c4p' => 'application/vnd.clonk.c4group',
- 'c4u' => 'application/vnd.clonk.c4group',
- 'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
- 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
- 'cab' => 'application/vnd.ms-cab-compressed',
- 'caf' => 'audio/x-caf',
- 'cap' => 'application/vnd.tcpdump.pcap',
- 'car' => 'application/vnd.curl.car',
- 'cat' => 'application/vnd.ms-pki.seccat',
- 'cb7' => 'application/x-cbr',
- 'cba' => 'application/x-cbr',
- 'cbr' => 'application/x-cbr',
- 'cbt' => 'application/x-cbr',
- 'cbz' => 'application/x-cbr',
- 'cc' => 'text/x-c',
- 'cco' => 'application/x-cocoa',
- 'cct' => 'application/x-director',
- 'ccxml' => 'application/ccxml+xml',
- 'cdbcmsg' => 'application/vnd.contact.cmsg',
- 'cdf' => 'application/x-netcdf',
- 'cdfx' => 'application/cdfx+xml',
- 'cdkey' => 'application/vnd.mediastation.cdkey',
- 'cdmia' => 'application/cdmi-capability',
- 'cdmic' => 'application/cdmi-container',
- 'cdmid' => 'application/cdmi-domain',
- 'cdmio' => 'application/cdmi-object',
- 'cdmiq' => 'application/cdmi-queue',
- 'cdr' => 'application/cdr',
- 'cdx' => 'chemical/x-cdx',
- 'cdxml' => 'application/vnd.chemdraw+xml',
- 'cdy' => 'application/vnd.cinderella',
- 'cer' => 'application/pkix-cert',
- 'cfs' => 'application/x-cfs-compressed',
- 'cgm' => 'image/cgm',
- 'chat' => 'application/x-chat',
- 'chm' => 'application/vnd.ms-htmlhelp',
- 'chrt' => 'application/vnd.kde.kchart',
- 'cif' => 'chemical/x-cif',
- 'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
- 'cil' => 'application/vnd.ms-artgalry',
- 'cjs' => 'application/node',
- 'cla' => 'application/vnd.claymore',
- 'class' => 'application/octet-stream',
- 'clkk' => 'application/vnd.crick.clicker.keyboard',
- 'clkp' => 'application/vnd.crick.clicker.palette',
- 'clkt' => 'application/vnd.crick.clicker.template',
- 'clkw' => 'application/vnd.crick.clicker.wordbank',
- 'clkx' => 'application/vnd.crick.clicker',
- 'clp' => 'application/x-msclip',
- 'cmc' => 'application/vnd.cosmocaller',
- 'cmdf' => 'chemical/x-cmdf',
- 'cml' => 'chemical/x-cml',
- 'cmp' => 'application/vnd.yellowriver-custom-menu',
- 'cmx' => 'image/x-cmx',
- 'cod' => 'application/vnd.rim.cod',
- 'coffee' => 'text/coffeescript',
- 'com' => 'application/x-msdownload',
- 'conf' => 'text/plain',
- 'cpio' => 'application/x-cpio',
- 'cpl' => 'application/cpl+xml',
- 'cpp' => 'text/x-c',
- 'cpt' => 'application/mac-compactpro',
- 'crd' => 'application/x-mscardfile',
- 'crl' => 'application/pkix-crl',
- 'crt' => 'application/x-x509-ca-cert',
- 'crx' => 'application/x-chrome-extension',
- 'cryptonote' => 'application/vnd.rig.cryptonote',
- 'csh' => 'application/x-csh',
- 'csl' => 'application/vnd.citationstyles.style+xml',
- 'csml' => 'chemical/x-csml',
- 'csp' => 'application/vnd.commonspace',
- 'csr' => 'application/octet-stream',
- 'css' => 'text/css',
- 'cst' => 'application/x-director',
- 'csv' => 'text/csv',
- 'cu' => 'application/cu-seeme',
- 'curl' => 'text/vnd.curl',
- 'cww' => 'application/prs.cww',
- 'cxt' => 'application/x-director',
- 'cxx' => 'text/x-c',
- 'dae' => 'model/vnd.collada+xml',
- 'daf' => 'application/vnd.mobius.daf',
- 'dart' => 'application/vnd.dart',
- 'dataless' => 'application/vnd.fdsn.seed',
- 'davmount' => 'application/davmount+xml',
- 'dbf' => 'application/vnd.dbf',
- 'dbk' => 'application/docbook+xml',
- 'dcr' => 'application/x-director',
- 'dcurl' => 'text/vnd.curl.dcurl',
- 'dd2' => 'application/vnd.oma.dd2+xml',
- 'ddd' => 'application/vnd.fujixerox.ddd',
- 'ddf' => 'application/vnd.syncml.dmddf+xml',
- 'dds' => 'image/vnd.ms-dds',
- 'deb' => 'application/x-debian-package',
- 'def' => 'text/plain',
- 'deploy' => 'application/octet-stream',
- 'der' => 'application/x-x509-ca-cert',
- 'dfac' => 'application/vnd.dreamfactory',
- 'dgc' => 'application/x-dgc-compressed',
- 'dic' => 'text/x-c',
- 'dir' => 'application/x-director',
- 'dis' => 'application/vnd.mobius.dis',
- 'disposition-notification' => 'message/disposition-notification',
- 'dist' => 'application/octet-stream',
- 'distz' => 'application/octet-stream',
- 'djv' => 'image/vnd.djvu',
- 'djvu' => 'image/vnd.djvu',
- 'dll' => 'application/octet-stream',
- 'dmg' => 'application/x-apple-diskimage',
- 'dmn' => 'application/octet-stream',
- 'dmp' => 'application/vnd.tcpdump.pcap',
- 'dms' => 'application/octet-stream',
- 'dna' => 'application/vnd.dna',
- 'doc' => 'application/msword',
- 'docm' => 'application/vnd.ms-word.template.macroEnabled.12',
- 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- 'dot' => 'application/msword',
- 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
- 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
- 'dp' => 'application/vnd.osgi.dp',
- 'dpg' => 'application/vnd.dpgraph',
- 'dra' => 'audio/vnd.dra',
- 'drle' => 'image/dicom-rle',
- 'dsc' => 'text/prs.lines.tag',
- 'dssc' => 'application/dssc+der',
- 'dtb' => 'application/x-dtbook+xml',
- 'dtd' => 'application/xml-dtd',
- 'dts' => 'audio/vnd.dts',
- 'dtshd' => 'audio/vnd.dts.hd',
- 'dump' => 'application/octet-stream',
- 'dvb' => 'video/vnd.dvb.file',
- 'dvi' => 'application/x-dvi',
- 'dwd' => 'application/atsc-dwd+xml',
- 'dwf' => 'model/vnd.dwf',
- 'dwg' => 'image/vnd.dwg',
- 'dxf' => 'image/vnd.dxf',
- 'dxp' => 'application/vnd.spotfire.dxp',
- 'dxr' => 'application/x-director',
- 'ear' => 'application/java-archive',
- 'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
- 'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
- 'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
- 'ecma' => 'application/ecmascript',
- 'edm' => 'application/vnd.novadigm.edm',
- 'edx' => 'application/vnd.novadigm.edx',
- 'efif' => 'application/vnd.picsel',
- 'ei6' => 'application/vnd.pg.osasli',
- 'elc' => 'application/octet-stream',
- 'emf' => 'image/emf',
- 'eml' => 'message/rfc822',
- 'emma' => 'application/emma+xml',
- 'emotionml' => 'application/emotionml+xml',
- 'emz' => 'application/x-msmetafile',
- 'eol' => 'audio/vnd.digital-winds',
- 'eot' => 'application/vnd.ms-fontobject',
- 'eps' => 'application/postscript',
- 'epub' => 'application/epub+zip',
- 'es' => 'application/ecmascript',
- 'es3' => 'application/vnd.eszigno3+xml',
- 'esa' => 'application/vnd.osgi.subsystem',
- 'esf' => 'application/vnd.epson.esf',
- 'et3' => 'application/vnd.eszigno3+xml',
- 'etx' => 'text/x-setext',
- 'eva' => 'application/x-eva',
- 'evy' => 'application/x-envoy',
- 'exe' => 'application/octet-stream',
- 'exi' => 'application/exi',
- 'exp' => 'application/express',
- 'exr' => 'image/aces',
- 'ext' => 'application/vnd.novadigm.ext',
- 'ez' => 'application/andrew-inset',
- 'ez2' => 'application/vnd.ezpix-album',
- 'ez3' => 'application/vnd.ezpix-package',
- 'f' => 'text/x-fortran',
- 'f4v' => 'video/mp4',
- 'f77' => 'text/x-fortran',
- 'f90' => 'text/x-fortran',
- 'fbs' => 'image/vnd.fastbidsheet',
- 'fcdt' => 'application/vnd.adobe.formscentral.fcdt',
- 'fcs' => 'application/vnd.isac.fcs',
- 'fdf' => 'application/vnd.fdf',
- 'fdt' => 'application/fdt+xml',
- 'fe_launch' => 'application/vnd.denovo.fcselayout-link',
- 'fg5' => 'application/vnd.fujitsu.oasysgp',
- 'fgd' => 'application/x-director',
- 'fh' => 'image/x-freehand',
- 'fh4' => 'image/x-freehand',
- 'fh5' => 'image/x-freehand',
- 'fh7' => 'image/x-freehand',
- 'fhc' => 'image/x-freehand',
- 'fig' => 'application/x-xfig',
- 'fits' => 'image/fits',
- 'flac' => 'audio/x-flac',
- 'fli' => 'video/x-fli',
- 'flo' => 'application/vnd.micrografx.flo',
- 'flv' => 'video/x-flv',
- 'flw' => 'application/vnd.kde.kivio',
- 'flx' => 'text/vnd.fmi.flexstor',
- 'fly' => 'text/vnd.fly',
- 'fm' => 'application/vnd.framemaker',
- 'fnc' => 'application/vnd.frogans.fnc',
- 'fo' => 'application/vnd.software602.filler.form+xml',
- 'for' => 'text/x-fortran',
- 'fpx' => 'image/vnd.fpx',
- 'frame' => 'application/vnd.framemaker',
- 'fsc' => 'application/vnd.fsc.weblaunch',
- 'fst' => 'image/vnd.fst',
- 'ftc' => 'application/vnd.fluxtime.clip',
- 'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
- 'fvt' => 'video/vnd.fvt',
- 'fxp' => 'application/vnd.adobe.fxp',
- 'fxpl' => 'application/vnd.adobe.fxp',
- 'fzs' => 'application/vnd.fuzzysheet',
- 'g2w' => 'application/vnd.geoplan',
- 'g3' => 'image/g3fax',
- 'g3w' => 'application/vnd.geospace',
- 'gac' => 'application/vnd.groove-account',
- 'gam' => 'application/x-tads',
- 'gbr' => 'application/rpki-ghostbusters',
- 'gca' => 'application/x-gca-compressed',
- 'gdl' => 'model/vnd.gdl',
- 'gdoc' => 'application/vnd.google-apps.document',
- 'ged' => 'text/vnd.familysearch.gedcom',
- 'geo' => 'application/vnd.dynageo',
- 'geojson' => 'application/geo+json',
- 'gex' => 'application/vnd.geometry-explorer',
- 'ggb' => 'application/vnd.geogebra.file',
- 'ggt' => 'application/vnd.geogebra.tool',
- 'ghf' => 'application/vnd.groove-help',
- 'gif' => 'image/gif',
- 'gim' => 'application/vnd.groove-identity-message',
- 'glb' => 'model/gltf-binary',
- 'gltf' => 'model/gltf+json',
- 'gml' => 'application/gml+xml',
- 'gmx' => 'application/vnd.gmx',
- 'gnumeric' => 'application/x-gnumeric',
- 'gpg' => 'application/gpg-keys',
- 'gph' => 'application/vnd.flographit',
- 'gpx' => 'application/gpx+xml',
- 'gqf' => 'application/vnd.grafeq',
- 'gqs' => 'application/vnd.grafeq',
- 'gram' => 'application/srgs',
- 'gramps' => 'application/x-gramps-xml',
- 'gre' => 'application/vnd.geometry-explorer',
- 'grv' => 'application/vnd.groove-injector',
- 'grxml' => 'application/srgs+xml',
- 'gsf' => 'application/x-font-ghostscript',
- 'gsheet' => 'application/vnd.google-apps.spreadsheet',
- 'gslides' => 'application/vnd.google-apps.presentation',
- 'gtar' => 'application/x-gtar',
- 'gtm' => 'application/vnd.groove-tool-message',
- 'gtw' => 'model/vnd.gtw',
- 'gv' => 'text/vnd.graphviz',
- 'gxf' => 'application/gxf',
- 'gxt' => 'application/vnd.geonext',
- 'gz' => 'application/gzip',
- 'gzip' => 'application/gzip',
- 'h' => 'text/x-c',
- 'h261' => 'video/h261',
- 'h263' => 'video/h263',
- 'h264' => 'video/h264',
- 'hal' => 'application/vnd.hal+xml',
- 'hbci' => 'application/vnd.hbci',
- 'hbs' => 'text/x-handlebars-template',
- 'hdd' => 'application/x-virtualbox-hdd',
- 'hdf' => 'application/x-hdf',
- 'heic' => 'image/heic',
- 'heics' => 'image/heic-sequence',
- 'heif' => 'image/heif',
- 'heifs' => 'image/heif-sequence',
- 'hej2' => 'image/hej2k',
- 'held' => 'application/atsc-held+xml',
- 'hh' => 'text/x-c',
- 'hjson' => 'application/hjson',
- 'hlp' => 'application/winhlp',
- 'hpgl' => 'application/vnd.hp-hpgl',
- 'hpid' => 'application/vnd.hp-hpid',
- 'hps' => 'application/vnd.hp-hps',
- 'hqx' => 'application/mac-binhex40',
- 'hsj2' => 'image/hsj2',
- 'htc' => 'text/x-component',
- 'htke' => 'application/vnd.kenameaapp',
- 'htm' => 'text/html',
- 'html' => 'text/html',
- 'hvd' => 'application/vnd.yamaha.hv-dic',
- 'hvp' => 'application/vnd.yamaha.hv-voice',
- 'hvs' => 'application/vnd.yamaha.hv-script',
- 'i2g' => 'application/vnd.intergeo',
- 'icc' => 'application/vnd.iccprofile',
- 'ice' => 'x-conference/x-cooltalk',
- 'icm' => 'application/vnd.iccprofile',
- 'ico' => 'image/x-icon',
- 'ics' => 'text/calendar',
- 'ief' => 'image/ief',
- 'ifb' => 'text/calendar',
- 'ifm' => 'application/vnd.shana.informed.formdata',
- 'iges' => 'model/iges',
- 'igl' => 'application/vnd.igloader',
- 'igm' => 'application/vnd.insors.igm',
- 'igs' => 'model/iges',
- 'igx' => 'application/vnd.micrografx.igx',
- 'iif' => 'application/vnd.shana.informed.interchange',
- 'img' => 'application/octet-stream',
- 'imp' => 'application/vnd.accpac.simply.imp',
- 'ims' => 'application/vnd.ms-ims',
- 'in' => 'text/plain',
- 'ini' => 'text/plain',
- 'ink' => 'application/inkml+xml',
- 'inkml' => 'application/inkml+xml',
- 'install' => 'application/x-install-instructions',
- 'iota' => 'application/vnd.astraea-software.iota',
- 'ipfix' => 'application/ipfix',
- 'ipk' => 'application/vnd.shana.informed.package',
- 'irm' => 'application/vnd.ibm.rights-management',
- 'irp' => 'application/vnd.irepository.package+xml',
- 'iso' => 'application/x-iso9660-image',
- 'itp' => 'application/vnd.shana.informed.formtemplate',
- 'its' => 'application/its+xml',
- 'ivp' => 'application/vnd.immervision-ivp',
- 'ivu' => 'application/vnd.immervision-ivu',
- 'jad' => 'text/vnd.sun.j2me.app-descriptor',
- 'jade' => 'text/jade',
- 'jam' => 'application/vnd.jam',
- 'jar' => 'application/java-archive',
- 'jardiff' => 'application/x-java-archive-diff',
- 'java' => 'text/x-java-source',
- 'jhc' => 'image/jphc',
- 'jisp' => 'application/vnd.jisp',
- 'jls' => 'image/jls',
- 'jlt' => 'application/vnd.hp-jlyt',
- 'jng' => 'image/x-jng',
- 'jnlp' => 'application/x-java-jnlp-file',
- 'joda' => 'application/vnd.joost.joda-archive',
- 'jp2' => 'image/jp2',
- 'jpe' => 'image/jpeg',
- 'jpeg' => 'image/jpeg',
- 'jpf' => 'image/jpx',
- 'jpg' => 'image/jpeg',
- 'jpg2' => 'image/jp2',
- 'jpgm' => 'video/jpm',
- 'jpgv' => 'video/jpeg',
- 'jph' => 'image/jph',
- 'jpm' => 'video/jpm',
- 'jpx' => 'image/jpx',
- 'js' => 'application/javascript',
- 'json' => 'application/json',
- 'json5' => 'application/json5',
- 'jsonld' => 'application/ld+json',
- 'jsonml' => 'application/jsonml+json',
- 'jsx' => 'text/jsx',
- 'jxr' => 'image/jxr',
- 'jxra' => 'image/jxra',
- 'jxrs' => 'image/jxrs',
- 'jxs' => 'image/jxs',
- 'jxsc' => 'image/jxsc',
- 'jxsi' => 'image/jxsi',
- 'jxss' => 'image/jxss',
- 'kar' => 'audio/midi',
- 'karbon' => 'application/vnd.kde.karbon',
- 'kdb' => 'application/octet-stream',
- 'kdbx' => 'application/x-keepass2',
- 'key' => 'application/x-iwork-keynote-sffkey',
- 'kfo' => 'application/vnd.kde.kformula',
- 'kia' => 'application/vnd.kidspiration',
- 'kml' => 'application/vnd.google-earth.kml+xml',
- 'kmz' => 'application/vnd.google-earth.kmz',
- 'kne' => 'application/vnd.kinar',
- 'knp' => 'application/vnd.kinar',
- 'kon' => 'application/vnd.kde.kontour',
- 'kpr' => 'application/vnd.kde.kpresenter',
- 'kpt' => 'application/vnd.kde.kpresenter',
- 'kpxx' => 'application/vnd.ds-keypoint',
- 'ksp' => 'application/vnd.kde.kspread',
- 'ktr' => 'application/vnd.kahootz',
- 'ktx' => 'image/ktx',
- 'ktx2' => 'image/ktx2',
- 'ktz' => 'application/vnd.kahootz',
- 'kwd' => 'application/vnd.kde.kword',
- 'kwt' => 'application/vnd.kde.kword',
- 'lasxml' => 'application/vnd.las.las+xml',
- 'latex' => 'application/x-latex',
- 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
- 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
- 'les' => 'application/vnd.hhe.lesson-player',
- 'less' => 'text/less',
- 'lgr' => 'application/lgr+xml',
- 'lha' => 'application/octet-stream',
- 'link66' => 'application/vnd.route66.link66+xml',
- 'list' => 'text/plain',
- 'list3820' => 'application/vnd.ibm.modcap',
- 'listafp' => 'application/vnd.ibm.modcap',
- 'litcoffee' => 'text/coffeescript',
- 'lnk' => 'application/x-ms-shortcut',
- 'log' => 'text/plain',
- 'lostxml' => 'application/lost+xml',
- 'lrf' => 'application/octet-stream',
- 'lrm' => 'application/vnd.ms-lrm',
- 'ltf' => 'application/vnd.frogans.ltf',
- 'lua' => 'text/x-lua',
- 'luac' => 'application/x-lua-bytecode',
- 'lvp' => 'audio/vnd.lucent.voice',
- 'lwp' => 'application/vnd.lotus-wordpro',
- 'lzh' => 'application/octet-stream',
- 'm1v' => 'video/mpeg',
- 'm2a' => 'audio/mpeg',
- 'm2v' => 'video/mpeg',
- 'm3a' => 'audio/mpeg',
- 'm3u' => 'text/plain',
- 'm3u8' => 'application/vnd.apple.mpegurl',
- 'm4a' => 'audio/x-m4a',
- 'm4p' => 'application/mp4',
- 'm4s' => 'video/iso.segment',
- 'm4u' => 'application/vnd.mpegurl',
- 'm4v' => 'video/x-m4v',
- 'm13' => 'application/x-msmediaview',
- 'm14' => 'application/x-msmediaview',
- 'm21' => 'application/mp21',
- 'ma' => 'application/mathematica',
- 'mads' => 'application/mads+xml',
- 'maei' => 'application/mmt-aei+xml',
- 'mag' => 'application/vnd.ecowin.chart',
- 'maker' => 'application/vnd.framemaker',
- 'man' => 'text/troff',
- 'manifest' => 'text/cache-manifest',
- 'map' => 'application/json',
- 'mar' => 'application/octet-stream',
- 'markdown' => 'text/markdown',
- 'mathml' => 'application/mathml+xml',
- 'mb' => 'application/mathematica',
- 'mbk' => 'application/vnd.mobius.mbk',
- 'mbox' => 'application/mbox',
- 'mc1' => 'application/vnd.medcalcdata',
- 'mcd' => 'application/vnd.mcd',
- 'mcurl' => 'text/vnd.curl.mcurl',
- 'md' => 'text/markdown',
- 'mdb' => 'application/x-msaccess',
- 'mdi' => 'image/vnd.ms-modi',
- 'mdx' => 'text/mdx',
- 'me' => 'text/troff',
- 'mesh' => 'model/mesh',
- 'meta4' => 'application/metalink4+xml',
- 'metalink' => 'application/metalink+xml',
- 'mets' => 'application/mets+xml',
- 'mfm' => 'application/vnd.mfmp',
- 'mft' => 'application/rpki-manifest',
- 'mgp' => 'application/vnd.osgeo.mapguide.package',
- 'mgz' => 'application/vnd.proteus.magazine',
- 'mid' => 'audio/midi',
- 'midi' => 'audio/midi',
- 'mie' => 'application/x-mie',
- 'mif' => 'application/vnd.mif',
- 'mime' => 'message/rfc822',
- 'mj2' => 'video/mj2',
- 'mjp2' => 'video/mj2',
- 'mjs' => 'application/javascript',
- 'mk3d' => 'video/x-matroska',
- 'mka' => 'audio/x-matroska',
- 'mkd' => 'text/x-markdown',
- 'mks' => 'video/x-matroska',
- 'mkv' => 'video/x-matroska',
- 'mlp' => 'application/vnd.dolby.mlp',
- 'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
- 'mmf' => 'application/vnd.smaf',
- 'mml' => 'text/mathml',
- 'mmr' => 'image/vnd.fujixerox.edmics-mmr',
- 'mng' => 'video/x-mng',
- 'mny' => 'application/x-msmoney',
- 'mobi' => 'application/x-mobipocket-ebook',
- 'mods' => 'application/mods+xml',
- 'mov' => 'video/quicktime',
- 'movie' => 'video/x-sgi-movie',
- 'mp2' => 'audio/mpeg',
- 'mp2a' => 'audio/mpeg',
- 'mp3' => 'audio/mpeg',
- 'mp4' => 'video/mp4',
- 'mp4a' => 'audio/mp4',
- 'mp4s' => 'application/mp4',
- 'mp4v' => 'video/mp4',
- 'mp21' => 'application/mp21',
- 'mpc' => 'application/vnd.mophun.certificate',
- 'mpd' => 'application/dash+xml',
- 'mpe' => 'video/mpeg',
- 'mpeg' => 'video/mpeg',
- 'mpf' => 'application/media-policy-dataset+xml',
- 'mpg' => 'video/mpeg',
- 'mpg4' => 'video/mp4',
- 'mpga' => 'audio/mpeg',
- 'mpkg' => 'application/vnd.apple.installer+xml',
- 'mpm' => 'application/vnd.blueice.multipass',
- 'mpn' => 'application/vnd.mophun.application',
- 'mpp' => 'application/vnd.ms-project',
- 'mpt' => 'application/vnd.ms-project',
- 'mpy' => 'application/vnd.ibm.minipay',
- 'mqy' => 'application/vnd.mobius.mqy',
- 'mrc' => 'application/marc',
- 'mrcx' => 'application/marcxml+xml',
- 'ms' => 'text/troff',
- 'mscml' => 'application/mediaservercontrol+xml',
- 'mseed' => 'application/vnd.fdsn.mseed',
- 'mseq' => 'application/vnd.mseq',
- 'msf' => 'application/vnd.epson.msf',
- 'msg' => 'application/vnd.ms-outlook',
- 'msh' => 'model/mesh',
- 'msi' => 'application/x-msdownload',
- 'msl' => 'application/vnd.mobius.msl',
- 'msm' => 'application/octet-stream',
- 'msp' => 'application/octet-stream',
- 'msty' => 'application/vnd.muvee.style',
- 'mtl' => 'model/mtl',
- 'mts' => 'model/vnd.mts',
- 'mus' => 'application/vnd.musician',
- 'musd' => 'application/mmt-usd+xml',
- 'musicxml' => 'application/vnd.recordare.musicxml+xml',
- 'mvb' => 'application/x-msmediaview',
- 'mvt' => 'application/vnd.mapbox-vector-tile',
- 'mwf' => 'application/vnd.mfer',
- 'mxf' => 'application/mxf',
- 'mxl' => 'application/vnd.recordare.musicxml',
- 'mxmf' => 'audio/mobile-xmf',
- 'mxml' => 'application/xv+xml',
- 'mxs' => 'application/vnd.triscape.mxs',
- 'mxu' => 'video/vnd.mpegurl',
- 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
- 'n3' => 'text/n3',
- 'nb' => 'application/mathematica',
- 'nbp' => 'application/vnd.wolfram.player',
- 'nc' => 'application/x-netcdf',
- 'ncx' => 'application/x-dtbncx+xml',
- 'nfo' => 'text/x-nfo',
- 'ngdat' => 'application/vnd.nokia.n-gage.data',
- 'nitf' => 'application/vnd.nitf',
- 'nlu' => 'application/vnd.neurolanguage.nlu',
- 'nml' => 'application/vnd.enliven',
- 'nnd' => 'application/vnd.noblenet-directory',
- 'nns' => 'application/vnd.noblenet-sealer',
- 'nnw' => 'application/vnd.noblenet-web',
- 'npx' => 'image/vnd.net-fpx',
- 'nq' => 'application/n-quads',
- 'nsc' => 'application/x-conference',
- 'nsf' => 'application/vnd.lotus-notes',
- 'nt' => 'application/n-triples',
- 'ntf' => 'application/vnd.nitf',
- 'numbers' => 'application/x-iwork-numbers-sffnumbers',
- 'nzb' => 'application/x-nzb',
- 'oa2' => 'application/vnd.fujitsu.oasys2',
- 'oa3' => 'application/vnd.fujitsu.oasys3',
- 'oas' => 'application/vnd.fujitsu.oasys',
- 'obd' => 'application/x-msbinder',
- 'obgx' => 'application/vnd.openblox.game+xml',
- 'obj' => 'model/obj',
- 'oda' => 'application/oda',
- 'odb' => 'application/vnd.oasis.opendocument.database',
- 'odc' => 'application/vnd.oasis.opendocument.chart',
- 'odf' => 'application/vnd.oasis.opendocument.formula',
- 'odft' => 'application/vnd.oasis.opendocument.formula-template',
- 'odg' => 'application/vnd.oasis.opendocument.graphics',
- 'odi' => 'application/vnd.oasis.opendocument.image',
- 'odm' => 'application/vnd.oasis.opendocument.text-master',
- 'odp' => 'application/vnd.oasis.opendocument.presentation',
- 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
- 'odt' => 'application/vnd.oasis.opendocument.text',
- 'oga' => 'audio/ogg',
- 'ogex' => 'model/vnd.opengex',
- 'ogg' => 'audio/ogg',
- 'ogv' => 'video/ogg',
- 'ogx' => 'application/ogg',
- 'omdoc' => 'application/omdoc+xml',
- 'onepkg' => 'application/onenote',
- 'onetmp' => 'application/onenote',
- 'onetoc' => 'application/onenote',
- 'onetoc2' => 'application/onenote',
- 'opf' => 'application/oebps-package+xml',
- 'opml' => 'text/x-opml',
- 'oprc' => 'application/vnd.palm',
- 'opus' => 'audio/ogg',
- 'org' => 'text/x-org',
- 'osf' => 'application/vnd.yamaha.openscoreformat',
- 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
- 'osm' => 'application/vnd.openstreetmap.data+xml',
- 'otc' => 'application/vnd.oasis.opendocument.chart-template',
- 'otf' => 'font/otf',
- 'otg' => 'application/vnd.oasis.opendocument.graphics-template',
- 'oth' => 'application/vnd.oasis.opendocument.text-web',
- 'oti' => 'application/vnd.oasis.opendocument.image-template',
- 'otp' => 'application/vnd.oasis.opendocument.presentation-template',
- 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
- 'ott' => 'application/vnd.oasis.opendocument.text-template',
- 'ova' => 'application/x-virtualbox-ova',
- 'ovf' => 'application/x-virtualbox-ovf',
- 'owl' => 'application/rdf+xml',
- 'oxps' => 'application/oxps',
- 'oxt' => 'application/vnd.openofficeorg.extension',
- 'p' => 'text/x-pascal',
- 'p7a' => 'application/x-pkcs7-signature',
- 'p7b' => 'application/x-pkcs7-certificates',
- 'p7c' => 'application/pkcs7-mime',
- 'p7m' => 'application/pkcs7-mime',
- 'p7r' => 'application/x-pkcs7-certreqresp',
- 'p7s' => 'application/pkcs7-signature',
- 'p8' => 'application/pkcs8',
- 'p10' => 'application/x-pkcs10',
- 'p12' => 'application/x-pkcs12',
- 'pac' => 'application/x-ns-proxy-autoconfig',
- 'pages' => 'application/x-iwork-pages-sffpages',
- 'pas' => 'text/x-pascal',
- 'paw' => 'application/vnd.pawaafile',
- 'pbd' => 'application/vnd.powerbuilder6',
- 'pbm' => 'image/x-portable-bitmap',
- 'pcap' => 'application/vnd.tcpdump.pcap',
- 'pcf' => 'application/x-font-pcf',
- 'pcl' => 'application/vnd.hp-pcl',
- 'pclxl' => 'application/vnd.hp-pclxl',
- 'pct' => 'image/x-pict',
- 'pcurl' => 'application/vnd.curl.pcurl',
- 'pcx' => 'image/x-pcx',
- 'pdb' => 'application/x-pilot',
- 'pde' => 'text/x-processing',
- 'pdf' => 'application/pdf',
- 'pem' => 'application/x-x509-user-cert',
- 'pfa' => 'application/x-font-type1',
- 'pfb' => 'application/x-font-type1',
- 'pfm' => 'application/x-font-type1',
- 'pfr' => 'application/font-tdpfr',
- 'pfx' => 'application/x-pkcs12',
- 'pgm' => 'image/x-portable-graymap',
- 'pgn' => 'application/x-chess-pgn',
- 'pgp' => 'application/pgp',
- 'phar' => 'application/octet-stream',
- 'php' => 'application/x-httpd-php',
- 'php3' => 'application/x-httpd-php',
- 'php4' => 'application/x-httpd-php',
- 'phps' => 'application/x-httpd-php-source',
- 'phtml' => 'application/x-httpd-php',
- 'pic' => 'image/x-pict',
- 'pkg' => 'application/octet-stream',
- 'pki' => 'application/pkixcmp',
- 'pkipath' => 'application/pkix-pkipath',
- 'pkpass' => 'application/vnd.apple.pkpass',
- 'pl' => 'application/x-perl',
- 'plb' => 'application/vnd.3gpp.pic-bw-large',
- 'plc' => 'application/vnd.mobius.plc',
- 'plf' => 'application/vnd.pocketlearn',
- 'pls' => 'application/pls+xml',
- 'pm' => 'application/x-perl',
- 'pml' => 'application/vnd.ctc-posml',
- 'png' => 'image/png',
- 'pnm' => 'image/x-portable-anymap',
- 'portpkg' => 'application/vnd.macports.portpkg',
- 'pot' => 'application/vnd.ms-powerpoint',
- 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
- 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
- 'ppa' => 'application/vnd.ms-powerpoint',
- 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
- 'ppd' => 'application/vnd.cups-ppd',
- 'ppm' => 'image/x-portable-pixmap',
- 'pps' => 'application/vnd.ms-powerpoint',
- 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
- 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
- 'ppt' => 'application/powerpoint',
- 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
- 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
- 'pqa' => 'application/vnd.palm',
- 'prc' => 'model/prc',
- 'pre' => 'application/vnd.lotus-freelance',
- 'prf' => 'application/pics-rules',
- 'provx' => 'application/provenance+xml',
- 'ps' => 'application/postscript',
- 'psb' => 'application/vnd.3gpp.pic-bw-small',
- 'psd' => 'application/x-photoshop',
- 'psf' => 'application/x-font-linux-psf',
- 'pskcxml' => 'application/pskc+xml',
- 'pti' => 'image/prs.pti',
- 'ptid' => 'application/vnd.pvi.ptid1',
- 'pub' => 'application/x-mspublisher',
- 'pvb' => 'application/vnd.3gpp.pic-bw-var',
- 'pwn' => 'application/vnd.3m.post-it-notes',
- 'pya' => 'audio/vnd.ms-playready.media.pya',
- 'pyv' => 'video/vnd.ms-playready.media.pyv',
- 'qam' => 'application/vnd.epson.quickanime',
- 'qbo' => 'application/vnd.intu.qbo',
- 'qfx' => 'application/vnd.intu.qfx',
- 'qps' => 'application/vnd.publishare-delta-tree',
- 'qt' => 'video/quicktime',
- 'qwd' => 'application/vnd.quark.quarkxpress',
- 'qwt' => 'application/vnd.quark.quarkxpress',
- 'qxb' => 'application/vnd.quark.quarkxpress',
- 'qxd' => 'application/vnd.quark.quarkxpress',
- 'qxl' => 'application/vnd.quark.quarkxpress',
- 'qxt' => 'application/vnd.quark.quarkxpress',
- 'ra' => 'audio/x-realaudio',
- 'ram' => 'audio/x-pn-realaudio',
- 'raml' => 'application/raml+yaml',
- 'rapd' => 'application/route-apd+xml',
- 'rar' => 'application/x-rar',
- 'ras' => 'image/x-cmu-raster',
- 'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
- 'rdf' => 'application/rdf+xml',
- 'rdz' => 'application/vnd.data-vision.rdz',
- 'relo' => 'application/p2p-overlay+xml',
- 'rep' => 'application/vnd.businessobjects',
- 'res' => 'application/x-dtbresource+xml',
- 'rgb' => 'image/x-rgb',
- 'rif' => 'application/reginfo+xml',
- 'rip' => 'audio/vnd.rip',
- 'ris' => 'application/x-research-info-systems',
- 'rl' => 'application/resource-lists+xml',
- 'rlc' => 'image/vnd.fujixerox.edmics-rlc',
- 'rld' => 'application/resource-lists-diff+xml',
- 'rm' => 'audio/x-pn-realaudio',
- 'rmi' => 'audio/midi',
- 'rmp' => 'audio/x-pn-realaudio-plugin',
- 'rms' => 'application/vnd.jcp.javame.midlet-rms',
- 'rmvb' => 'application/vnd.rn-realmedia-vbr',
- 'rnc' => 'application/relax-ng-compact-syntax',
- 'rng' => 'application/xml',
- 'roa' => 'application/rpki-roa',
- 'roff' => 'text/troff',
- 'rp9' => 'application/vnd.cloanto.rp9',
- 'rpm' => 'audio/x-pn-realaudio-plugin',
- 'rpss' => 'application/vnd.nokia.radio-presets',
- 'rpst' => 'application/vnd.nokia.radio-preset',
- 'rq' => 'application/sparql-query',
- 'rs' => 'application/rls-services+xml',
- 'rsa' => 'application/x-pkcs7',
- 'rsat' => 'application/atsc-rsat+xml',
- 'rsd' => 'application/rsd+xml',
- 'rsheet' => 'application/urc-ressheet+xml',
- 'rss' => 'application/rss+xml',
- 'rtf' => 'text/rtf',
- 'rtx' => 'text/richtext',
- 'run' => 'application/x-makeself',
- 'rusd' => 'application/route-usd+xml',
- 'rv' => 'video/vnd.rn-realvideo',
- 's' => 'text/x-asm',
- 's3m' => 'audio/s3m',
- 'saf' => 'application/vnd.yamaha.smaf-audio',
- 'sass' => 'text/x-sass',
- 'sbml' => 'application/sbml+xml',
- 'sc' => 'application/vnd.ibm.secure-container',
- 'scd' => 'application/x-msschedule',
- 'scm' => 'application/vnd.lotus-screencam',
- 'scq' => 'application/scvp-cv-request',
- 'scs' => 'application/scvp-cv-response',
- 'scss' => 'text/x-scss',
- 'scurl' => 'text/vnd.curl.scurl',
- 'sda' => 'application/vnd.stardivision.draw',
- 'sdc' => 'application/vnd.stardivision.calc',
- 'sdd' => 'application/vnd.stardivision.impress',
- 'sdkd' => 'application/vnd.solent.sdkm+xml',
- 'sdkm' => 'application/vnd.solent.sdkm+xml',
- 'sdp' => 'application/sdp',
- 'sdw' => 'application/vnd.stardivision.writer',
- 'sea' => 'application/octet-stream',
- 'see' => 'application/vnd.seemail',
- 'seed' => 'application/vnd.fdsn.seed',
- 'sema' => 'application/vnd.sema',
- 'semd' => 'application/vnd.semd',
- 'semf' => 'application/vnd.semf',
- 'senmlx' => 'application/senml+xml',
- 'sensmlx' => 'application/sensml+xml',
- 'ser' => 'application/java-serialized-object',
- 'setpay' => 'application/set-payment-initiation',
- 'setreg' => 'application/set-registration-initiation',
- 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
- 'sfs' => 'application/vnd.spotfire.sfs',
- 'sfv' => 'text/x-sfv',
- 'sgi' => 'image/sgi',
- 'sgl' => 'application/vnd.stardivision.writer-global',
- 'sgm' => 'text/sgml',
- 'sgml' => 'text/sgml',
- 'sh' => 'application/x-sh',
- 'shar' => 'application/x-shar',
- 'shex' => 'text/shex',
- 'shf' => 'application/shf+xml',
- 'shtml' => 'text/html',
- 'sid' => 'image/x-mrsid-image',
- 'sieve' => 'application/sieve',
- 'sig' => 'application/pgp-signature',
- 'sil' => 'audio/silk',
- 'silo' => 'model/mesh',
- 'sis' => 'application/vnd.symbian.install',
- 'sisx' => 'application/vnd.symbian.install',
- 'sit' => 'application/x-stuffit',
- 'sitx' => 'application/x-stuffitx',
- 'siv' => 'application/sieve',
- 'skd' => 'application/vnd.koan',
- 'skm' => 'application/vnd.koan',
- 'skp' => 'application/vnd.koan',
- 'skt' => 'application/vnd.koan',
- 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
- 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
- 'slim' => 'text/slim',
- 'slm' => 'text/slim',
- 'sls' => 'application/route-s-tsid+xml',
- 'slt' => 'application/vnd.epson.salt',
- 'sm' => 'application/vnd.stepmania.stepchart',
- 'smf' => 'application/vnd.stardivision.math',
- 'smi' => 'application/smil',
- 'smil' => 'application/smil',
- 'smv' => 'video/x-smv',
- 'smzip' => 'application/vnd.stepmania.package',
- 'snd' => 'audio/basic',
- 'snf' => 'application/x-font-snf',
- 'so' => 'application/octet-stream',
- 'spc' => 'application/x-pkcs7-certificates',
- 'spdx' => 'text/spdx',
- 'spf' => 'application/vnd.yamaha.smaf-phrase',
- 'spl' => 'application/x-futuresplash',
- 'spot' => 'text/vnd.in3d.spot',
- 'spp' => 'application/scvp-vp-response',
- 'spq' => 'application/scvp-vp-request',
- 'spx' => 'audio/ogg',
- 'sql' => 'application/x-sql',
- 'src' => 'application/x-wais-source',
- 'srt' => 'application/x-subrip',
- 'sru' => 'application/sru+xml',
- 'srx' => 'application/sparql-results+xml',
- 'ssdl' => 'application/ssdl+xml',
- 'sse' => 'application/vnd.kodak-descriptor',
- 'ssf' => 'application/vnd.epson.ssf',
- 'ssml' => 'application/ssml+xml',
- 'sst' => 'application/octet-stream',
- 'st' => 'application/vnd.sailingtracker.track',
- 'stc' => 'application/vnd.sun.xml.calc.template',
- 'std' => 'application/vnd.sun.xml.draw.template',
- 'stf' => 'application/vnd.wt.stf',
- 'sti' => 'application/vnd.sun.xml.impress.template',
- 'stk' => 'application/hyperstudio',
- 'stl' => 'model/stl',
- 'stpx' => 'model/step+xml',
- 'stpxz' => 'model/step-xml+zip',
- 'stpz' => 'model/step+zip',
- 'str' => 'application/vnd.pg.format',
- 'stw' => 'application/vnd.sun.xml.writer.template',
- 'styl' => 'text/stylus',
- 'stylus' => 'text/stylus',
- 'sub' => 'text/vnd.dvb.subtitle',
- 'sus' => 'application/vnd.sus-calendar',
- 'susp' => 'application/vnd.sus-calendar',
- 'sv4cpio' => 'application/x-sv4cpio',
- 'sv4crc' => 'application/x-sv4crc',
- 'svc' => 'application/vnd.dvb.service',
- 'svd' => 'application/vnd.svd',
- 'svg' => 'image/svg+xml',
- 'svgz' => 'image/svg+xml',
- 'swa' => 'application/x-director',
- 'swf' => 'application/x-shockwave-flash',
- 'swi' => 'application/vnd.aristanetworks.swi',
- 'swidtag' => 'application/swid+xml',
- 'sxc' => 'application/vnd.sun.xml.calc',
- 'sxd' => 'application/vnd.sun.xml.draw',
- 'sxg' => 'application/vnd.sun.xml.writer.global',
- 'sxi' => 'application/vnd.sun.xml.impress',
- 'sxm' => 'application/vnd.sun.xml.math',
- 'sxw' => 'application/vnd.sun.xml.writer',
- 't' => 'text/troff',
- 't3' => 'application/x-t3vm-image',
- 't38' => 'image/t38',
- 'taglet' => 'application/vnd.mynfc',
- 'tao' => 'application/vnd.tao.intent-module-archive',
- 'tap' => 'image/vnd.tencent.tap',
- 'tar' => 'application/x-tar',
- 'tcap' => 'application/vnd.3gpp2.tcap',
- 'tcl' => 'application/x-tcl',
- 'td' => 'application/urc-targetdesc+xml',
- 'teacher' => 'application/vnd.smart.teacher',
- 'tei' => 'application/tei+xml',
- 'teicorpus' => 'application/tei+xml',
- 'tex' => 'application/x-tex',
- 'texi' => 'application/x-texinfo',
- 'texinfo' => 'application/x-texinfo',
- 'text' => 'text/plain',
- 'tfi' => 'application/thraud+xml',
- 'tfm' => 'application/x-tex-tfm',
- 'tfx' => 'image/tiff-fx',
- 'tga' => 'image/x-tga',
- 'tgz' => 'application/x-tar',
- 'thmx' => 'application/vnd.ms-officetheme',
- 'tif' => 'image/tiff',
- 'tiff' => 'image/tiff',
- 'tk' => 'application/x-tcl',
- 'tmo' => 'application/vnd.tmobile-livetv',
- 'toml' => 'application/toml',
- 'torrent' => 'application/x-bittorrent',
- 'tpl' => 'application/vnd.groove-tool-template',
- 'tpt' => 'application/vnd.trid.tpt',
- 'tr' => 'text/troff',
- 'tra' => 'application/vnd.trueapp',
- 'trig' => 'application/trig',
- 'trm' => 'application/x-msterminal',
- 'ts' => 'video/mp2t',
- 'tsd' => 'application/timestamped-data',
- 'tsv' => 'text/tab-separated-values',
- 'ttc' => 'font/collection',
- 'ttf' => 'font/ttf',
- 'ttl' => 'text/turtle',
- 'ttml' => 'application/ttml+xml',
- 'twd' => 'application/vnd.simtech-mindmapper',
- 'twds' => 'application/vnd.simtech-mindmapper',
- 'txd' => 'application/vnd.genomatix.tuxedo',
- 'txf' => 'application/vnd.mobius.txf',
- 'txt' => 'text/plain',
- 'u3d' => 'model/u3d',
- 'u8dsn' => 'message/global-delivery-status',
- 'u8hdr' => 'message/global-headers',
- 'u8mdn' => 'message/global-disposition-notification',
- 'u8msg' => 'message/global',
- 'u32' => 'application/x-authorware-bin',
- 'ubj' => 'application/ubjson',
- 'udeb' => 'application/x-debian-package',
- 'ufd' => 'application/vnd.ufdl',
- 'ufdl' => 'application/vnd.ufdl',
- 'ulx' => 'application/x-glulx',
- 'umj' => 'application/vnd.umajin',
- 'unityweb' => 'application/vnd.unity',
- 'uoml' => 'application/vnd.uoml+xml',
- 'uri' => 'text/uri-list',
- 'uris' => 'text/uri-list',
- 'urls' => 'text/uri-list',
- 'usdz' => 'model/vnd.usdz+zip',
- 'ustar' => 'application/x-ustar',
- 'utz' => 'application/vnd.uiq.theme',
- 'uu' => 'text/x-uuencode',
- 'uva' => 'audio/vnd.dece.audio',
- 'uvd' => 'application/vnd.dece.data',
- 'uvf' => 'application/vnd.dece.data',
- 'uvg' => 'image/vnd.dece.graphic',
- 'uvh' => 'video/vnd.dece.hd',
- 'uvi' => 'image/vnd.dece.graphic',
- 'uvm' => 'video/vnd.dece.mobile',
- 'uvp' => 'video/vnd.dece.pd',
- 'uvs' => 'video/vnd.dece.sd',
- 'uvt' => 'application/vnd.dece.ttml+xml',
- 'uvu' => 'video/vnd.uvvu.mp4',
- 'uvv' => 'video/vnd.dece.video',
- 'uvva' => 'audio/vnd.dece.audio',
- 'uvvd' => 'application/vnd.dece.data',
- 'uvvf' => 'application/vnd.dece.data',
- 'uvvg' => 'image/vnd.dece.graphic',
- 'uvvh' => 'video/vnd.dece.hd',
- 'uvvi' => 'image/vnd.dece.graphic',
- 'uvvm' => 'video/vnd.dece.mobile',
- 'uvvp' => 'video/vnd.dece.pd',
- 'uvvs' => 'video/vnd.dece.sd',
- 'uvvt' => 'application/vnd.dece.ttml+xml',
- 'uvvu' => 'video/vnd.uvvu.mp4',
- 'uvvv' => 'video/vnd.dece.video',
- 'uvvx' => 'application/vnd.dece.unspecified',
- 'uvvz' => 'application/vnd.dece.zip',
- 'uvx' => 'application/vnd.dece.unspecified',
- 'uvz' => 'application/vnd.dece.zip',
- 'vbox' => 'application/x-virtualbox-vbox',
- 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack',
- 'vcard' => 'text/vcard',
- 'vcd' => 'application/x-cdlink',
- 'vcf' => 'text/x-vcard',
- 'vcg' => 'application/vnd.groove-vcard',
- 'vcs' => 'text/x-vcalendar',
- 'vcx' => 'application/vnd.vcx',
- 'vdi' => 'application/x-virtualbox-vdi',
- 'vds' => 'model/vnd.sap.vds',
- 'vhd' => 'application/x-virtualbox-vhd',
- 'vis' => 'application/vnd.visionary',
- 'viv' => 'video/vnd.vivo',
- 'vlc' => 'application/videolan',
- 'vmdk' => 'application/x-virtualbox-vmdk',
- 'vob' => 'video/x-ms-vob',
- 'vor' => 'application/vnd.stardivision.writer',
- 'vox' => 'application/x-authorware-bin',
- 'vrml' => 'model/vrml',
- 'vsd' => 'application/vnd.visio',
- 'vsf' => 'application/vnd.vsf',
- 'vss' => 'application/vnd.visio',
- 'vst' => 'application/vnd.visio',
- 'vsw' => 'application/vnd.visio',
- 'vtf' => 'image/vnd.valve.source.texture',
- 'vtt' => 'text/vtt',
- 'vtu' => 'model/vnd.vtu',
- 'vxml' => 'application/voicexml+xml',
- 'w3d' => 'application/x-director',
- 'wad' => 'application/x-doom',
- 'wadl' => 'application/vnd.sun.wadl+xml',
- 'war' => 'application/java-archive',
- 'wasm' => 'application/wasm',
- 'wav' => 'audio/x-wav',
- 'wax' => 'audio/x-ms-wax',
- 'wbmp' => 'image/vnd.wap.wbmp',
- 'wbs' => 'application/vnd.criticaltools.wbs+xml',
- 'wbxml' => 'application/wbxml',
- 'wcm' => 'application/vnd.ms-works',
- 'wdb' => 'application/vnd.ms-works',
- 'wdp' => 'image/vnd.ms-photo',
- 'weba' => 'audio/webm',
- 'webapp' => 'application/x-web-app-manifest+json',
- 'webm' => 'video/webm',
- 'webmanifest' => 'application/manifest+json',
- 'webp' => 'image/webp',
- 'wg' => 'application/vnd.pmi.widget',
- 'wgt' => 'application/widget',
- 'wif' => 'application/watcherinfo+xml',
- 'wks' => 'application/vnd.ms-works',
- 'wm' => 'video/x-ms-wm',
- 'wma' => 'audio/x-ms-wma',
- 'wmd' => 'application/x-ms-wmd',
- 'wmf' => 'image/wmf',
- 'wml' => 'text/vnd.wap.wml',
- 'wmlc' => 'application/wmlc',
- 'wmls' => 'text/vnd.wap.wmlscript',
- 'wmlsc' => 'application/vnd.wap.wmlscriptc',
- 'wmv' => 'video/x-ms-wmv',
- 'wmx' => 'video/x-ms-wmx',
- 'wmz' => 'application/x-msmetafile',
- 'woff' => 'font/woff',
- 'woff2' => 'font/woff2',
- 'word' => 'application/msword',
- 'wpd' => 'application/vnd.wordperfect',
- 'wpl' => 'application/vnd.ms-wpl',
- 'wps' => 'application/vnd.ms-works',
- 'wqd' => 'application/vnd.wqd',
- 'wri' => 'application/x-mswrite',
- 'wrl' => 'model/vrml',
- 'wsc' => 'message/vnd.wfa.wsc',
- 'wsdl' => 'application/wsdl+xml',
- 'wspolicy' => 'application/wspolicy+xml',
- 'wtb' => 'application/vnd.webturbo',
- 'wvx' => 'video/x-ms-wvx',
- 'x3d' => 'model/x3d+xml',
- 'x3db' => 'model/x3d+fastinfoset',
- 'x3dbz' => 'model/x3d+binary',
- 'x3dv' => 'model/x3d-vrml',
- 'x3dvz' => 'model/x3d+vrml',
- 'x3dz' => 'model/x3d+xml',
- 'x32' => 'application/x-authorware-bin',
- 'x_b' => 'model/vnd.parasolid.transmit.binary',
- 'x_t' => 'model/vnd.parasolid.transmit.text',
- 'xaml' => 'application/xaml+xml',
- 'xap' => 'application/x-silverlight-app',
- 'xar' => 'application/vnd.xara',
- 'xav' => 'application/xcap-att+xml',
- 'xbap' => 'application/x-ms-xbap',
- 'xbd' => 'application/vnd.fujixerox.docuworks.binder',
- 'xbm' => 'image/x-xbitmap',
- 'xca' => 'application/xcap-caps+xml',
- 'xcs' => 'application/calendar+xml',
- 'xdf' => 'application/xcap-diff+xml',
- 'xdm' => 'application/vnd.syncml.dm+xml',
- 'xdp' => 'application/vnd.adobe.xdp+xml',
- 'xdssc' => 'application/dssc+xml',
- 'xdw' => 'application/vnd.fujixerox.docuworks',
- 'xel' => 'application/xcap-el+xml',
- 'xenc' => 'application/xenc+xml',
- 'xer' => 'application/patch-ops-error+xml',
- 'xfdf' => 'application/vnd.adobe.xfdf',
- 'xfdl' => 'application/vnd.xfdl',
- 'xht' => 'application/xhtml+xml',
- 'xhtml' => 'application/xhtml+xml',
- 'xhvml' => 'application/xv+xml',
- 'xif' => 'image/vnd.xiff',
- 'xl' => 'application/excel',
- 'xla' => 'application/vnd.ms-excel',
- 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
- 'xlc' => 'application/vnd.ms-excel',
- 'xlf' => 'application/xliff+xml',
- 'xlm' => 'application/vnd.ms-excel',
- 'xls' => 'application/vnd.ms-excel',
- 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
- 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
- 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
- 'xlt' => 'application/vnd.ms-excel',
- 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
- 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
- 'xlw' => 'application/vnd.ms-excel',
- 'xm' => 'audio/xm',
- 'xml' => 'application/xml',
- 'xns' => 'application/xcap-ns+xml',
- 'xo' => 'application/vnd.olpc-sugar',
- 'xop' => 'application/xop+xml',
- 'xpi' => 'application/x-xpinstall',
- 'xpl' => 'application/xproc+xml',
- 'xpm' => 'image/x-xpixmap',
- 'xpr' => 'application/vnd.is-xpr',
- 'xps' => 'application/vnd.ms-xpsdocument',
- 'xpw' => 'application/vnd.intercon.formnet',
- 'xpx' => 'application/vnd.intercon.formnet',
- 'xsd' => 'application/xml',
- 'xsl' => 'application/xml',
- 'xslt' => 'application/xslt+xml',
- 'xsm' => 'application/vnd.syncml+xml',
- 'xspf' => 'application/xspf+xml',
- 'xul' => 'application/vnd.mozilla.xul+xml',
- 'xvm' => 'application/xv+xml',
- 'xvml' => 'application/xv+xml',
- 'xwd' => 'image/x-xwindowdump',
- 'xyz' => 'chemical/x-xyz',
- 'xz' => 'application/x-xz',
- 'yaml' => 'text/yaml',
- 'yang' => 'application/yang',
- 'yin' => 'application/yin+xml',
- 'yml' => 'text/yaml',
- 'ymp' => 'text/x-suse-ymp',
- 'z' => 'application/x-compress',
- 'z1' => 'application/x-zmachine',
- 'z2' => 'application/x-zmachine',
- 'z3' => 'application/x-zmachine',
- 'z4' => 'application/x-zmachine',
- 'z5' => 'application/x-zmachine',
- 'z6' => 'application/x-zmachine',
- 'z7' => 'application/x-zmachine',
- 'z8' => 'application/x-zmachine',
- 'zaz' => 'application/vnd.zzazz.deck+xml',
- 'zip' => 'application/zip',
- 'zir' => 'application/vnd.zul',
- 'zirz' => 'application/vnd.zul',
- 'zmm' => 'application/vnd.handheld-entertainment+xml',
- 'zsh' => 'text/x-scriptzsh',
- ];
-
- public function lookupMimeType(string $extension): ?string
- {
- return self::MIME_TYPES_FOR_EXTENSIONS[$extension] ?? null;
- }
-}
diff --git a/vendor/league/mime-type-detection/src/MimeTypeDetector.php b/vendor/league/mime-type-detection/src/MimeTypeDetector.php
deleted file mode 100644
index 5d799d2a8..000000000
--- a/vendor/league/mime-type-detection/src/MimeTypeDetector.php
+++ /dev/null
@@ -1,19 +0,0 @@
- $overrides
- */
- public function __construct(ExtensionToMimeTypeMap $innerMap, array $overrides)
- {
- $this->innerMap = $innerMap;
- $this->overrides = $overrides;
- }
-
- public function lookupMimeType(string $extension): ?string
- {
- return $this->overrides[$extension] ?? $this->innerMap->lookupMimeType($extension);
- }
-}
diff --git a/vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php b/vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php
index ca2feb429..16809b849 100644
--- a/vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php
+++ b/vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php
@@ -55,7 +55,7 @@ $config
'function_declaration' => true,
'function_to_constant' => true,
'function_typehint_space' => true,
- 'general_phpdoc_annotation_remove' => ['annotations' => ['access', 'category', 'copyright', 'throws']],
+ 'general_phpdoc_annotation_remove' => ['annotations' => ['access', 'category', 'copyright']],
'global_namespace_import' => true,
'header_comment' => false, // We don't use common header in all our files
'heredoc_indentation' => false, // Requires PHP >= 7.3
diff --git a/vendor/phpoffice/phpspreadsheet/CHANGELOG.md b/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
index f820d903f..84bb504e9 100644
--- a/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
+++ b/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
@@ -5,6 +5,109 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com)
and this project adheres to [Semantic Versioning](https://semver.org).
+## 1.25.2 - 2022-09-25
+
+### Added
+
+- Nothing
+
+### Changed
+
+- Nothing
+
+### Deprecated
+
+- Nothing
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Composer dependency clash with ezyang/htmlpurifier
+
+
+## 1.25.0 - 2022-09-25
+
+### Added
+
+- Implementation of the new `TEXTBEFORE()`, `TEXTAFTER()` and `TEXTSPLIT()` Excel Functions
+- Implementation of the `ARRAYTOTEXT()` and `VALUETOTEXT()` Excel Functions
+- Support for [mitoteam/jpgraph](https://packagist.org/packages/mitoteam/jpgraph) implementation of
+ JpGraph library to render charts added.
+- Charts: Add Gradients, Transparency, Hidden Axes, Rounded Corners, Trendlines, Date Axes.
+
+### Changed
+
+- Allow variant behaviour when merging cells [Issue #3065](https://github.com/PHPOffice/PhpSpreadsheet/issues/3065)
+ - Merge methods now allow an additional `$behaviour` argument. Permitted values are:
+ - Worksheet::MERGE_CELL_CONTENT_EMPTY - Empty the content of the hidden cells (the default behaviour)
+ - Worksheet::MERGE_CELL_CONTENT_HIDE - Keep the content of the hidden cells
+ - Worksheet::MERGE_CELL_CONTENT_MERGE - Move the content of the hidden cells into the first cell
+
+### Deprecated
+
+- Axis getLineProperty deprecated in favor of getLineColorProperty.
+- Moved majorGridlines and minorGridlines from Chart to Axis. Setting either in Chart constructor or through Chart methods, or getting either using Chart methods is deprecated.
+- Chart::EXCEL_COLOR_TYPE_* copied from Properties to ChartColor; use in Properties is deprecated.
+- ChartColor::EXCEL_COLOR_TYPE_ARGB deprecated in favor of EXCEL_COLOR_TYPE_RGB ("A" component was never allowed).
+- Misspelled Properties::LINE_STYLE_DASH_SQUERE_DOT deprecated in favor of LINE_STYLE_DASH_SQUARE_DOT.
+- Clone not permitted for Spreadsheet. Spreadsheet->copy() can be used instead.
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Fix update to defined names when inserting/deleting rows/columns [Issue #3076](https://github.com/PHPOffice/PhpSpreadsheet/issues/3076) [PR #3077](https://github.com/PHPOffice/PhpSpreadsheet/pull/3077)
+- Fix DataValidation sqRef when inserting/deleting rows/columns [Issue #3056](https://github.com/PHPOffice/PhpSpreadsheet/issues/3056) [PR #3074](https://github.com/PHPOffice/PhpSpreadsheet/pull/3074)
+- Named ranges not usable as anchors in OFFSET function [Issue #3013](https://github.com/PHPOffice/PhpSpreadsheet/issues/3013)
+- Fully flatten an array [Issue #2955](https://github.com/PHPOffice/PhpSpreadsheet/issues/2955) [PR #2956](https://github.com/PHPOffice/PhpSpreadsheet/pull/2956)
+- cellExists() and getCell() methods should support UTF-8 named cells [Issue #2987](https://github.com/PHPOffice/PhpSpreadsheet/issues/2987) [PR #2988](https://github.com/PHPOffice/PhpSpreadsheet/pull/2988)
+- Spreadsheet copy fixed, clone disabled. [PR #2951](https://github.com/PHPOffice/PhpSpreadsheet/pull/2951)
+- Fix PDF problems with text rotation and paper size. [Issue #1747](https://github.com/PHPOffice/PhpSpreadsheet/issues/1747) [Issue #1713](https://github.com/PHPOffice/PhpSpreadsheet/issues/1713) [PR #2960](https://github.com/PHPOffice/PhpSpreadsheet/pull/2960)
+- Limited support for chart titles as formulas [Issue #2965](https://github.com/PHPOffice/PhpSpreadsheet/issues/2965) [Issue #749](https://github.com/PHPOffice/PhpSpreadsheet/issues/749) [PR #2971](https://github.com/PHPOffice/PhpSpreadsheet/pull/2971)
+- Add Gradients, Transparency, and Hidden Axes to Chart [Issue #2257](https://github.com/PHPOffice/PhpSpreadsheet/issues/2257) [Issue #2229](https://github.com/PHPOffice/PhpSpreadsheet/issues/2929) [Issue #2935](https://github.com/PHPOffice/PhpSpreadsheet/issues/2935) [PR #2950](https://github.com/PHPOffice/PhpSpreadsheet/pull/2950)
+- Chart Support for Rounded Corners and Trendlines [Issue #2968](https://github.com/PHPOffice/PhpSpreadsheet/issues/2968) [Issue #2815](https://github.com/PHPOffice/PhpSpreadsheet/issues/2815) [PR #2976](https://github.com/PHPOffice/PhpSpreadsheet/pull/2976)
+- Add setName Method for Chart [Issue #2991](https://github.com/PHPOffice/PhpSpreadsheet/issues/2991) [PR #3001](https://github.com/PHPOffice/PhpSpreadsheet/pull/3001)
+- Eliminate partial dependency on php-intl in StringHelper [Issue #2982](https://github.com/PHPOffice/PhpSpreadsheet/issues/2982) [PR #2994](https://github.com/PHPOffice/PhpSpreadsheet/pull/2994)
+- Minor changes for Pdf [Issue #2999](https://github.com/PHPOffice/PhpSpreadsheet/issues/2999) [PR #3002](https://github.com/PHPOffice/PhpSpreadsheet/pull/3002) [PR #3006](https://github.com/PHPOffice/PhpSpreadsheet/pull/3006)
+- Html/Pdf Do net set background color for cells using (default) nofill [PR #3016](https://github.com/PHPOffice/PhpSpreadsheet/pull/3016)
+- Add support for Date Axis to Chart [Issue #2967](https://github.com/PHPOffice/PhpSpreadsheet/issues/2967) [PR #3018](https://github.com/PHPOffice/PhpSpreadsheet/pull/3018)
+- Reconcile Differences Between Css and Excel for Cell Alignment [PR #3048](https://github.com/PHPOffice/PhpSpreadsheet/pull/3048)
+- R1C1 Format Internationalization and Better Support for Relative Offsets [Issue #1704](https://github.com/PHPOffice/PhpSpreadsheet/issues/1704) [PR #3052](https://github.com/PHPOffice/PhpSpreadsheet/pull/3052)
+- Minor Fix for Percentage Formatting [Issue #1929](https://github.com/PHPOffice/PhpSpreadsheet/issues/1929) [PR #3053](https://github.com/PHPOffice/PhpSpreadsheet/pull/3053)
+
+## 1.24.1 - 2022-07-18
+
+### Added
+
+- Support for SimpleCache Interface versions 1.0, 2.0 and 3.0
+- Add Chart Axis Option textRotation [Issue #2705](https://github.com/PHPOffice/PhpSpreadsheet/issues/2705) [PR #2940](https://github.com/PHPOffice/PhpSpreadsheet/pull/2940)
+
+### Changed
+
+- Nothing
+
+### Deprecated
+
+- Nothing
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Fix Encoding issue with Html reader (PHP 8.2 deprecation for mb_convert_encoding) [Issue #2942](https://github.com/PHPOffice/PhpSpreadsheet/issues/2942) [PR #2943](https://github.com/PHPOffice/PhpSpreadsheet/pull/2943)
+- Additional Chart fixes
+ - Pie chart with part separated unwantedly [Issue #2506](https://github.com/PHPOffice/PhpSpreadsheet/issues/2506) [PR #2928](https://github.com/PHPOffice/PhpSpreadsheet/pull/2928)
+ - Chart styling is lost on simple load / save process [Issue #1797](https://github.com/PHPOffice/PhpSpreadsheet/issues/1797) [Issue #2077](https://github.com/PHPOffice/PhpSpreadsheet/issues/2077) [PR #2930](https://github.com/PHPOffice/PhpSpreadsheet/pull/2930)
+ - Can't create contour chart (surface 2d) [Issue #2931](https://github.com/PHPOffice/PhpSpreadsheet/issues/2931) [PR #2933](https://github.com/PHPOffice/PhpSpreadsheet/pull/2933)
+- VLOOKUP Breaks When Array Contains Null Cells [Issue #2934](https://github.com/PHPOffice/PhpSpreadsheet/issues/2934) [PR #2939](https://github.com/PHPOffice/PhpSpreadsheet/pull/2939)
+
## 1.24.0 - 2022-07-09
Note that this will be the last 1.x branch release before the 2.x release. We will maintain both branches in parallel for a time; but users are requested to update to version 2.0 once that is fully available.
diff --git a/vendor/phpoffice/phpspreadsheet/README.md b/vendor/phpoffice/phpspreadsheet/README.md
index 57560702a..ef04cd072 100644
--- a/vendor/phpoffice/phpspreadsheet/README.md
+++ b/vendor/phpoffice/phpspreadsheet/README.md
@@ -29,7 +29,7 @@ composer require phpoffice/phpspreadsheet
```
If you are building your installation on a development machine that is on a different PHP version to the server where it will be deployed, or if your PHP CLI version is not the same as your run-time such as `php-fpm` or Apache's `mod_php`, then you might want to add the following to your `composer.json` before installing:
-```json lines
+```json
{
"require": {
"phpoffice/phpspreadsheet": "^1.23"
@@ -71,15 +71,19 @@ or the appropriate PDF Writer wrapper for the library that you have chosen to in
#### Chart Export
-For Chart export, we support, which you will also need to install yourself
- - jpgraph/jpgraph
+For Chart export, we support following packages, which you will also need to install yourself using `composer require`
+ - [jpgraph/jpgraph](https://packagist.org/packages/jpgraph/jpgraph) (this package was abandoned at version 4.0.
+ You can manually download the latest version that supports PHP 8 and above from [jpgraph.net](https://jpgraph.net/))
+ - [mitoteam/jpgraph](https://packagist.org/packages/mitoteam/jpgraph) (fork with php 8.1 support)
and then configure PhpSpreadsheet using:
```php
-Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph::class);
+Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph::class); // to use jpgraph/jpgraph
+//or
+Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\MtJpGraphRenderer::class); // to use mitoteam/jpgraph
```
-You can `composer/require` the github version of jpgraph, but this was abandoned at version 4.0; or manually download the latest version that supports PHP 8 and above from [jpgraph.net](https://jpgraph.net/)
+One or the other of these libraries is necessary if you want to generate HTML or PDF files that include charts.
## Documentation
diff --git a/vendor/phpoffice/phpspreadsheet/composer.json b/vendor/phpoffice/phpspreadsheet/composer.json
index 16991514f..e686788eb 100644
--- a/vendor/phpoffice/phpspreadsheet/composer.json
+++ b/vendor/phpoffice/phpspreadsheet/composer.json
@@ -69,32 +69,33 @@
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*",
- "ezyang/htmlpurifier": "^4.13",
+ "ezyang/htmlpurifier": "^4.15",
"maennchen/zipstream-php": "^2.1",
"markbaker/complex": "^3.0",
"markbaker/matrix": "^3.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
- "psr/simple-cache": "^1.0 || ^2.0"
+ "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "dev-master",
"dompdf/dompdf": "^1.0 || ^2.0",
"friendsofphp/php-cs-fixer": "^3.2",
- "jpgraph/jpgraph": "^4.0",
+ "mitoteam/jpgraph": "10.2.4",
"mpdf/mpdf": "8.1.1",
"phpcompatibility/php-compatibility": "^9.3",
"phpstan/phpstan": "^1.1",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^8.5 || ^9.0",
"squizlabs/php_codesniffer": "^3.7",
- "tecnickcom/tcpdf": "^6.4"
+ "tecnickcom/tcpdf": "6.5"
},
"suggest": {
+ "ext-intl": "PHP Internationalization Functions",
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
- "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
- "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
- "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers"
+ "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+ "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer",
+ "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers"
},
"autoload": {
"psr-4": {
diff --git a/vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon b/vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon
index 5ef5522f0..c4b76cdd7 100644
--- a/vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon
+++ b/vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon
@@ -515,11 +515,6 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Calculation/FormulaParser.php
- -
- message: "#^Strict comparison using \\=\\=\\= between string and null will always evaluate to false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Calculation/FormulaParser.php
-
-
message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Calculation\\\\Functions\\:\\:ifCondition\\(\\) has no return type specified\\.$#"
count: 1
@@ -1065,11 +1060,6 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Calculation/TextData/Text.php
- -
- message: "#^Elseif branch is unreachable because previous condition is always true\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Cell/Cell.php
-
-
message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Cell\\\\Cell\\:\\:getFormulaAttributes\\(\\) has no return type specified\\.$#"
count: 1
@@ -1110,11 +1100,6 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Cell/Coordinate.php
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Collection\\\\Memory\\:\\:\\$cache has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Collection/Memory.php
-
-
message: "#^Parameter \\#1 \\$namedRange of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:addNamedRange\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\NamedRange, \\$this\\(PhpOffice\\\\PhpSpreadsheet\\\\DefinedName\\) given\\.$#"
count: 1
@@ -1675,456 +1660,11 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Reader/Xls/RC4.php
- -
- message: "#^Argument of an invalid type array\\\\|false supplied for foreach, only iterables are supported\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot access offset 0 on array\\\\|false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
-
message: "#^Cannot access property \\$r on SimpleXMLElement\\|null\\.$#"
count: 2
path: src/PhpSpreadsheet/Reader/Xlsx.php
- -
- message: "#^Cannot call method addChart\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setBold\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setColor\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setItalic\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setName\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setSize\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setStrikethrough\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setSubscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setSuperscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Cannot call method setUnderline\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Comparison operation \"\\>\" between SimpleXMLElement\\|null and 0 results in an error\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:boolean\\(\\) has parameter \\$value with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToBoolean\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToBoolean\\(\\) has parameter \\$c with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToError\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToError\\(\\) has parameter \\$c with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$c with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$calculatedValue with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$castBaseType with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$cellDataType with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$r with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$sharedFormulas with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$value with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToString\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToString\\(\\) has parameter \\$c with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:dirAdd\\(\\) has parameter \\$add with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:dirAdd\\(\\) has parameter \\$base with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:getArrayItem\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:getArrayItem\\(\\) has parameter \\$array with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:getArrayItem\\(\\) has parameter \\$key with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:getFromZipArchive\\(\\) should return string but returns string\\|false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readFormControlProperties\\(\\) has parameter \\$dir with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readFormControlProperties\\(\\) has parameter \\$docSheet with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readFormControlProperties\\(\\) has parameter \\$fileWorksheet with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readPrinterSettings\\(\\) has parameter \\$dir with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readPrinterSettings\\(\\) has parameter \\$docSheet with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readPrinterSettings\\(\\) has parameter \\$fileWorksheet with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:stripWhiteSpaceFromStyleString\\(\\) has parameter \\$string with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:toCSSArray\\(\\) has parameter \\$style with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Negated boolean expression is always true\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Parameter \\#1 \\$fontSizeInPoints of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:fontSizeToPixels\\(\\) expects int, string given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Parameter \\#1 \\$haystack of function strpos expects string, int\\|string given\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Parameter \\#1 \\$sizeInCm of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:centimeterSizeToPixels\\(\\) expects int, string given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Parameter \\#1 \\$sizeInInch of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:inchSizeToPixels\\(\\) expects int, string given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Parameter \\#1 \\$worksheetName of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getSheetByName\\(\\) expects string, array\\|string given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, int\\|string given\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Reader/Xlsx.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:readAutoFilter\\(\\) has parameter \\$autoFilterRange with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:readAutoFilter\\(\\) has parameter \\$xmlSheet with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
-
- -
- message: "#^Parameter \\#1 \\$operator of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\\\Column\\\\Rule\\:\\:setRule\\(\\) expects string, null given\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:\\$worksheet has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:\\$worksheetXml has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\BaseParserClass\\:\\:boolean\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\BaseParserClass\\:\\:boolean\\(\\) has parameter \\$value with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:isFilteredColumn\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:isFilteredColumn\\(\\) has parameter \\$columnCoordinate with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:isFilteredRow\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:isFilteredRow\\(\\) has parameter \\$rowCoordinate with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readColumnAttributes\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readColumnAttributes\\(\\) has parameter \\$readDataOnly with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readColumnRangeAttributes\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readColumnRangeAttributes\\(\\) has parameter \\$readDataOnly with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readRowAttributes\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readRowAttributes\\(\\) has parameter \\$readDataOnly with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:\\$worksheet has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:\\$worksheetXml has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readConditionalStyles\\(\\) has parameter \\$xmlSheet with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readDataBarExtLstOfConditionalRule\\(\\) has parameter \\$cfRule with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readDataBarExtLstOfConditionalRule\\(\\) has parameter \\$conditionalFormattingRuleExtensions with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readDataBarOfConditionalRule\\(\\) has parameter \\$cfRule with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readDataBarOfConditionalRule\\(\\) has parameter \\$conditionalFormattingRuleExtensions with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readStyleRules\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readStyleRules\\(\\) has parameter \\$cfRules with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readStyleRules\\(\\) has parameter \\$extLst with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:setConditionalStyles\\(\\) has parameter \\$xmlExtLst with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:\\$dxfs has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:\\$worksheet has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:\\$worksheetXml has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\DataValidations\\:\\:\\$worksheet has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\DataValidations\\:\\:\\$worksheetXml has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\Hyperlinks\\:\\:\\$hyperlinks has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\Hyperlinks\\:\\:\\$worksheet has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\PageSetup\\:\\:load\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\PageSetup\\:\\:pageSetup\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\PageSetup\\:\\:\\$worksheet has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\PageSetup\\:\\:\\$worksheetXml has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\SheetViewOptions\\:\\:\\$worksheet has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\SheetViewOptions\\:\\:\\$worksheetXml has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php
-
-
message: "#^Parameter \\#1 \\$haystack of function strpos expects string, string\\|false given\\.$#"
count: 1
@@ -2270,51 +1810,6 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE.php
- -
- message: "#^Cannot access offset 0 on array\\|false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
- -
- message: "#^Cannot access offset 2 on array\\|false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
- -
- message: "#^Cannot access offset 4 on array\\|false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
- -
- message: "#^Cannot access offset 6 on array\\|false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
- -
- message: "#^Parameter \\#1 \\$size of function imagettfbbox expects float, float\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
- -
- message: "#^Parameter \\#2 \\$defaultFont of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Drawing\\:\\:pixelsToCellDimension\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:\\$autoSizeMethods has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
- -
- message: "#^Unreachable statement \\- code above always terminates\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
- -
- message: "#^Variable \\$cellText on left side of \\?\\? always exists and is not nullable\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Shared/Font.php
-
-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\JAMA\\\\EigenvalueDecomposition\\:\\:\\$cdivi has no type specified\\.$#"
count: 1
@@ -2335,11 +1830,6 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Shared/JAMA/LUDecomposition.php
- -
- message: "#^Call to function is_string\\(\\) with float\\|int will always evaluate to false\\.$#"
- count: 5
- path: src/PhpSpreadsheet/Shared/JAMA/Matrix.php
-
-
message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\JAMA\\\\Matrix\\:\\:__construct\\(\\) has parameter \\$args with no type specified\\.$#"
count: 1
@@ -2420,11 +1910,6 @@ parameters:
count: 2
path: src/PhpSpreadsheet/Shared/JAMA/Matrix.php
- -
- message: "#^Result of && is always false\\.$#"
- count: 10
- path: src/PhpSpreadsheet/Shared/JAMA/Matrix.php
-
-
message: "#^Unreachable statement \\- code above always terminates\\.$#"
count: 19
@@ -2860,11 +2345,6 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Spreadsheet.php
- -
- message: "#^Comparison operation \"\\<\\=\" between int\\ and 1000 is always true\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Spreadsheet.php
-
-
message: "#^Parameter \\#1 \\$worksheet of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getIndex\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet, PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\|null given\\.$#"
count: 1
@@ -2875,21 +2355,11 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Spreadsheet.php
- -
- message: "#^Result of \\|\\| is always true\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Spreadsheet.php
-
-
message: "#^Strict comparison using \\=\\=\\= between PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet and null will always evaluate to false\\.$#"
count: 1
path: src/PhpSpreadsheet/Spreadsheet.php
- -
- message: "#^Strict comparison using \\=\\=\\= between string and null will always evaluate to false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Spreadsheet.php
-
-
message: "#^Unreachable statement \\- code above always terminates\\.$#"
count: 1
@@ -3125,21 +2595,6 @@ parameters:
count: 1
path: src/PhpSpreadsheet/Worksheet/PageSetup.php
- -
- message: "#^Parameter \\#1 \\$value of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\PageSetup\\:\\:setFirstPageNumber\\(\\) expects int, null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Worksheet/PageSetup.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\PageSetup\\:\\:\\$pageOrder has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Worksheet/PageSetup.php
-
- -
- message: "#^Strict comparison using \\=\\=\\= between int\\ and null will always evaluate to false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Worksheet/PageSetup.php
-
-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\SheetView\\:\\:\\$sheetViewTypes has no type specified\\.$#"
count: 1
@@ -3240,316 +2695,6 @@ parameters:
count: 2
path: src/PhpSpreadsheet/Worksheet/Worksheet.php
- -
- message: "#^Call to function array_key_exists\\(\\) with int and array\\{none\\: 'none', dashDot\\: '1px dashed', dashDotDot\\: '1px dotted', dashed\\: '1px dashed', dotted\\: '1px dotted', double\\: '3px double', hair\\: '1px solid', medium\\: '2px solid', \\.\\.\\.\\} will always evaluate to false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Cannot access offset 'mime' on array\\|false\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Cannot access offset 0 on array\\|false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Cannot access offset 1 on array\\|false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Cannot call method getSubscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Cannot call method getSuperscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:calculateSpansOmitRows\\(\\) has parameter \\$candidateSpannedRow with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:calculateSpansOmitRows\\(\\) has parameter \\$sheet with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:calculateSpansOmitRows\\(\\) has parameter \\$sheetIndex with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateHTMLFooter\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateMeta\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateMeta\\(\\) has parameter \\$desc with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateMeta\\(\\) has parameter \\$val with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellCss\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellCss\\(\\) has parameter \\$cellAddress with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellCss\\(\\) has parameter \\$columnNumber with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellCss\\(\\) has parameter \\$row with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellData\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellData\\(\\) has parameter \\$cell with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellData\\(\\) has parameter \\$cellType with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellData\\(\\) has parameter \\$cssClass with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellDataValue\\(\\) has parameter \\$cell with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellDataValue\\(\\) has parameter \\$cellData with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellDataValueRich\\(\\) has parameter \\$cell with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowCellDataValueRich\\(\\) has parameter \\$cellData with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowIncludeCharts\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowIncludeCharts\\(\\) has parameter \\$coordinate with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowSpans\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowSpans\\(\\) has parameter \\$colSpan with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowSpans\\(\\) has parameter \\$html with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowSpans\\(\\) has parameter \\$rowSpan with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$cellData with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$cellType with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$colNum with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$colSpan with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$coordinate with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$cssClass with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$html with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$row with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$rowSpan with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateRowWriteCell\\(\\) has parameter \\$sheetIndex with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetPrep\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetStarts\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetStarts\\(\\) has parameter \\$rowMin with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetStarts\\(\\) has parameter \\$sheet with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetTags\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetTags\\(\\) has parameter \\$row with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetTags\\(\\) has parameter \\$tbodyStart with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetTags\\(\\) has parameter \\$theadEnd with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateSheetTags\\(\\) has parameter \\$theadStart with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateTableFooter\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateTableTag\\(\\) has parameter \\$html with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateTableTag\\(\\) has parameter \\$id with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateTableTag\\(\\) has parameter \\$sheetIndex with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateTableTagInline\\(\\) has no return type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:generateTableTagInline\\(\\) has parameter \\$id with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Parameter \\#1 \\$borderStyle of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:mapBorderStyle\\(\\) expects int, string given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Parameter \\#1 \\$font of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:createCSSStyleFont\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Parameter \\#1 \\$hAlign of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:mapHAlign\\(\\) expects string, string\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Parameter \\#1 \\$vAlign of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Html\\:\\:mapVAlign\\(\\) expects string, string\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Parameter \\#2 \\$length of function fread expects int\\<0, max\\>, int\\<0, max\\>\\|false given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
- -
- message: "#^Parameter \\#3 \\$use_include_path of function fopen expects bool, int given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Html.php
-
-
message: "#^Negated boolean expression is always false\\.$#"
count: 1
@@ -3772,7 +2917,7 @@ parameters:
-
message: "#^Cannot access offset 1 on array\\|false\\.$#"
- count: 2
+ count: 1
path: src/PhpSpreadsheet/Writer/Xls/Worksheet.php
-
@@ -3869,289 +3014,3 @@ parameters:
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xls\\\\Xf\\:\\:\\$diag is never read, only written\\.$#"
count: 1
path: src/PhpSpreadsheet/Writer/Xls/Xf.php
-
- -
- message: "#^Argument of an invalid type array\\|null supplied for foreach, only iterables are supported\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx.php
-
- -
- message: "#^Parameter \\#1 \\$path of function basename expects string, array\\|string\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx.php
-
- -
- message: "#^Parameter \\#1 \\$path of function dirname expects string, array\\|string\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx.php
-
- -
- message: "#^Possibly invalid array key type array\\|string\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx.php
-
- -
- message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\:\\:\\$pathNames has no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx.php
-
- -
- message: "#^Parameter \\#1 \\$string of function substr expects string, int given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Comments.php
-
- -
- message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, int given\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Writer/Xlsx/Comments.php
-
- -
- message: "#^Expression on left side of \\?\\? is not nullable\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php
-
- -
- message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, int given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/DocProps.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Writer/Xlsx/DocProps.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Rels\\:\\:writeUnparsedRelationship\\(\\) has parameter \\$relationship with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Rels.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Rels\\:\\:writeUnparsedRelationship\\(\\) has parameter \\$type with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Rels.php
-
- -
- message: "#^Parameter \\#2 \\$id of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Rels\\:\\:writeRelationship\\(\\) expects int, string given\\.$#"
- count: 5
- path: src/PhpSpreadsheet/Writer/Xlsx/Rels.php
-
- -
- message: "#^Parameter \\#4 \\$target of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Rels\\:\\:writeRelationship\\(\\) expects string, array\\|string\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Rels.php
-
- -
- message: "#^Cannot call method getBold\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getColor\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getItalic\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getName\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getSize\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getStrikethrough\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getSubscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getSuperscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getUnderline\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Instanceof between \\*NEVER\\* and PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText will always evaluate to false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Instanceof between string and PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText will always evaluate to false\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Parameter \\#1 \\$text of method PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText\\:\\:createTextRun\\(\\) expects string, string\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, float\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<0, max\\> given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, string\\|null given\\.$#"
- count: 4
- path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
-
- -
- message: "#^Cannot call method getStyle\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Conditional\\|null\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Comparison operation \"\\<\" between int\\ and 0 is always true\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$borders of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Style\\:\\:writeBorder\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Borders, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Borders\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$fill of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Style\\:\\:writeFill\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Fill, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Fill\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$font of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Style\\:\\:writeFont\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$numberFormat of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Style\\:\\:writeNumFmt\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, float given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#"
- count: 22
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<0, max\\> given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<1, max\\> given\\.$#"
- count: 2
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, string\\|null given\\.$#"
- count: 7
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Result of \\|\\| is always true\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Style.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#"
- count: 7
- path: src/PhpSpreadsheet/Writer/Xlsx/Workbook.php
-
- -
- message: "#^Expression on left side of \\?\\? is not nullable\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^If condition is always true\\.$#"
- count: 6
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeAttributeIf\\(\\) has parameter \\$condition with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeDataBarElements\\(\\) has parameter \\$dataBar with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeElementIf\\(\\) has parameter \\$condition with no type specified\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, int\\|string given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#"
- count: 15
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<0, max\\> given\\.$#"
- count: 3
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<1, max\\> given\\.$#"
- count: 9
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, string\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Parameter \\#3 \\$stringTable of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeSheetData\\(\\) expects array\\, array\\\\|null given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
- -
- message: "#^Parameter \\#4 \\$val of static method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeAttributeIf\\(\\) expects string, int given\\.$#"
- count: 1
- path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
-
diff --git a/vendor/phpoffice/phpspreadsheet/phpstan.neon.dist b/vendor/phpoffice/phpspreadsheet/phpstan.neon.dist
index 61672b28c..30bd6c2f7 100644
--- a/vendor/phpoffice/phpspreadsheet/phpstan.neon.dist
+++ b/vendor/phpoffice/phpspreadsheet/phpstan.neon.dist
@@ -11,17 +11,13 @@ parameters:
- tests/
excludePaths:
- src/PhpSpreadsheet/Chart/Renderer/JpGraph.php
+ - src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php
parallel:
processTimeout: 300.0
checkMissingIterableValueType: false
ignoreErrors:
- - '~^Parameter \#1 \$im(age)? of function (imagedestroy|imageistruecolor|imagealphablending|imagesavealpha|imagecolortransparent|imagecolorsforindex|imagesavealpha|imagesx|imagesy) expects (GdImage|resource), GdImage\|resource given\.$~'
+ - '~^Parameter \#1 \$im(age)? of function (imagedestroy|imageistruecolor|imagealphablending|imagesavealpha|imagecolortransparent|imagecolorsforindex|imagesavealpha|imagesx|imagesy|imagepng) expects (GdImage|resource), GdImage\|resource given\.$~'
- '~^Parameter \#2 \$src_im(age)? of function imagecopy expects (GdImage|resource), GdImage\|resource given\.$~'
# Accept a bit anything for assert methods
- '~^Parameter \#2 .* of static method PHPUnit\\Framework\\Assert\:\:assert\w+\(\) expects .*, .* given\.$~'
- '~^Method PhpOffice\\PhpSpreadsheetTests\\.*\:\:test.*\(\) has parameter \$args with no type specified\.$~'
-
- # Some issues in Xls/Parser between 1.6.3 and 1.7.7
- -
- message: "#^Offset '(left|right|value)' does not exist on (non-empty-array\\|string|array\\|null)\\.$#"
- path: src/PhpSpreadsheet/Writer/Xls/Parser.php
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php
index 5b1c55202..4f95af54f 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php
@@ -7,7 +7,6 @@ use PhpOffice\PhpSpreadsheet\Calculation\Engine\CyclicReferenceStack;
use PhpOffice\PhpSpreadsheet\Calculation\Engine\Logger;
use PhpOffice\PhpSpreadsheet\Calculation\Information\ErrorValue;
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
-use PhpOffice\PhpSpreadsheet\Calculation\Information\Value;
use PhpOffice\PhpSpreadsheet\Calculation\Token\Stack;
use PhpOffice\PhpSpreadsheet\Cell\Cell;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
@@ -305,8 +304,8 @@ class Calculation
],
'ARRAYTOTEXT' => [
'category' => Category::CATEGORY_TEXT_AND_DATA,
- 'functionCall' => [Functions::class, 'DUMMY'],
- 'argumentCount' => '?',
+ 'functionCall' => [TextData\Text::class, 'fromArray'],
+ 'argumentCount' => '1,2',
],
'ASC' => [
'category' => Category::CATEGORY_TEXT_AND_DATA,
@@ -2490,13 +2489,13 @@ class Calculation
],
'TEXTAFTER' => [
'category' => Category::CATEGORY_TEXT_AND_DATA,
- 'functionCall' => [Functions::class, 'DUMMY'],
- 'argumentCount' => '2-4',
+ 'functionCall' => [TextData\Extract::class, 'after'],
+ 'argumentCount' => '2-6',
],
'TEXTBEFORE' => [
'category' => Category::CATEGORY_TEXT_AND_DATA,
- 'functionCall' => [Functions::class, 'DUMMY'],
- 'argumentCount' => '2-4',
+ 'functionCall' => [TextData\Extract::class, 'before'],
+ 'argumentCount' => '2-6',
],
'TEXTJOIN' => [
'category' => Category::CATEGORY_TEXT_AND_DATA,
@@ -2505,8 +2504,8 @@ class Calculation
],
'TEXTSPLIT' => [
'category' => Category::CATEGORY_TEXT_AND_DATA,
- 'functionCall' => [Functions::class, 'DUMMY'],
- 'argumentCount' => '2-5',
+ 'functionCall' => [TextData\Text::class, 'split'],
+ 'argumentCount' => '2-6',
],
'THAIDAYOFWEEK' => [
'category' => Category::CATEGORY_DATE_AND_TIME,
@@ -2660,8 +2659,8 @@ class Calculation
],
'VALUETOTEXT' => [
'category' => Category::CATEGORY_TEXT_AND_DATA,
- 'functionCall' => [Functions::class, 'DUMMY'],
- 'argumentCount' => '?',
+ 'functionCall' => [TextData\Format::class, 'valueToText'],
+ 'argumentCount' => '1,2',
],
'VAR' => [
'category' => Category::CATEGORY_STATISTICAL,
@@ -3111,7 +3110,7 @@ class Calculation
[$localeFunction] = explode('##', $localeFunction); // Strip out comments
if (strpos($localeFunction, '=') !== false) {
[$fName, $lfName] = array_map('trim', explode('=', $localeFunction));
- if ((isset(self::$phpSpreadsheetFunctions[$fName])) && ($lfName != '') && ($fName != $lfName)) {
+ if ((substr($fName, 0, 1) === '*' || isset(self::$phpSpreadsheetFunctions[$fName])) && ($lfName != '') && ($fName != $lfName)) {
self::$localeFunctions[$fName] = $lfName;
}
}
@@ -4757,9 +4756,8 @@ class Calculation
break;
}
-
- // if the token is a unary operator, pop one value off the stack, do the operation, and push it back on
} elseif (($token === '~') || ($token === '%')) {
+ // if the token is a unary operator, pop one value off the stack, do the operation, and push it back on
if (($arg = $stack->pop()) === null) {
return $this->raiseFormulaError('Internal error - Operand value missing from stack');
}
@@ -4795,7 +4793,7 @@ class Calculation
if (isset($matches[8])) {
if ($cell === null) {
- // We can't access the range, so return a REF error
+ // We can't access the range, so return a REF error
$cellValue = Information\ExcelError::REF();
} else {
$cellRef = $matches[6] . $matches[7] . ':' . $matches[9] . $matches[10];
@@ -4866,9 +4864,8 @@ class Calculation
if (isset($storeKey)) {
$branchStore[$storeKey] = $cellValue;
}
-
- // if the token is a function, pop arguments off the stack, hand them to the function, and push the result back on
} elseif (preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $token ?? '', $matches)) {
+ // if the token is a function, pop arguments off the stack, hand them to the function, and push the result back on
if ($pCellParent) {
$cell->attach($pCellParent);
}
@@ -4978,8 +4975,8 @@ class Calculation
if (isset($storeKey)) {
$branchStore[$storeKey] = $token;
}
- // if the token is a named range or formula, evaluate it and push the result onto the stack
} elseif (preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '$/miu', $token, $matches)) {
+ // if the token is a named range or formula, evaluate it and push the result onto the stack
$definedName = $matches[6];
if ($cell === null || $pCellWorksheet === null) {
return $this->raiseFormulaError("undefined name '$token'");
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php
index c6ee5969e..256c3effb 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php
@@ -98,9 +98,9 @@ class Logger
$cellReference = implode(' -> ', $this->cellStack->showStack());
if ($this->echoDebugLog) {
echo $cellReference,
- ($this->cellStack->count() > 0 ? ' => ' : ''),
- $message,
- PHP_EOL;
+ ($this->cellStack->count() > 0 ? ' => ' : ''),
+ $message,
+ PHP_EOL;
}
$this->debugLog[] = $cellReference .
($this->cellStack->count() > 0 ? ' => ' : '') .
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php
index 4d4bc07e3..6aaf1faa5 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php
@@ -57,7 +57,7 @@ class Compare
*
* @param array|float $number the value to test against step
* Or can be an array of values
- * @param array|float $step The threshold value. If you omit a value for step, GESTEP uses zero.
+ * @param null|array|float $step The threshold value. If you omit a value for step, GESTEP uses zero.
* Or can be an array of values
*
* @return array|int|string (string in the event of an error)
@@ -72,7 +72,7 @@ class Compare
try {
$number = EngineeringValidations::validateFloat($number);
- $step = EngineeringValidations::validateFloat($step);
+ $step = EngineeringValidations::validateFloat($step ?? 0.0);
} catch (Exception $e) {
return $e->getMessage();
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php
index 677fb0fb7..b7c298dbc 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php
@@ -106,6 +106,7 @@ class ConvertUOM
'W' => ['Group' => self::CATEGORY_POWER, 'Unit Name' => 'Watt', 'AllowPrefix' => true],
'w' => ['Group' => self::CATEGORY_POWER, 'Unit Name' => 'Watt', 'AllowPrefix' => true],
'PS' => ['Group' => self::CATEGORY_POWER, 'Unit Name' => 'Pferdestärke', 'AllowPrefix' => false],
+ // Magnetism
'T' => ['Group' => self::CATEGORY_MAGNETISM, 'Unit Name' => 'Tesla', 'AllowPrefix' => true],
'ga' => ['Group' => self::CATEGORY_MAGNETISM, 'Unit Name' => 'Gauss', 'AllowPrefix' => true],
// Temperature
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php
index ddf45b23b..f71d96fc7 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php
@@ -61,7 +61,7 @@ class FormulaParser
/**
* Create a new FormulaParser.
*
- * @param string $formula Formula to parse
+ * @param ?string $formula Formula to parse
*/
public function __construct($formula = '')
{
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php
index ddd3e200a..172f20222 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php
@@ -573,24 +573,20 @@ class Functions
return (array) $array;
}
- $arrayValues = [];
- foreach ($array as $value) {
+ $flattened = [];
+ $stack = array_values($array);
+
+ while ($stack) {
+ $value = array_shift($stack);
+
if (is_array($value)) {
- foreach ($value as $val) {
- if (is_array($val)) {
- foreach ($val as $v) {
- $arrayValues[] = $v;
- }
- } else {
- $arrayValues[] = $val;
- }
- }
+ array_unshift($stack, ...array_values($value));
} else {
- $arrayValues[] = $value;
+ $flattened[] = $value;
}
}
- return $arrayValues;
+ return $flattened;
}
/**
@@ -691,7 +687,7 @@ class Functions
$worksheet2 = $defined->getWorkSheet();
if (!$defined->isFormula() && $worksheet2 !== null) {
$coordinate = "'" . $worksheet2->getTitle() . "'!" .
- (string) preg_replace('/^=/', '', $defined->getValue());
+ (string) preg_replace('/^=/', '', str_replace('$', '', $defined->getValue()));
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ErrorValue.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ErrorValue.php
index dda2c7050..4b9f818fe 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ErrorValue.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ErrorValue.php
@@ -47,7 +47,7 @@ class ErrorValue
return false;
}
- return in_array($value, ExcelError::$errorCodes, true);
+ return in_array($value, ExcelError::ERROR_CODES, true);
}
/**
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ExcelError.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ExcelError.php
index 5ca74a3ed..06f386635 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ExcelError.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ExcelError.php
@@ -13,7 +13,7 @@ class ExcelError
*
* @var array
*/
- public static $errorCodes = [
+ public const ERROR_CODES = [
'null' => '#NULL!', // 1
'divisionbyzero' => '#DIV/0!', // 2
'value' => '#VALUE!', // 3
@@ -30,12 +30,23 @@ class ExcelError
'calculation' => '#CALC!', //14
];
+ /**
+ * List of error codes. Replaced by constant;
+ * previously it was public and updateable, allowing
+ * user to make inappropriate alterations.
+ *
+ * @deprecated 1.25.0 Use ERROR_CODES constant instead.
+ *
+ * @var array
+ */
+ public static $errorCodes = self::ERROR_CODES;
+
/**
* @param mixed $value
*/
public static function throwError($value): string
{
- return in_array($value, self::$errorCodes, true) ? $value : self::$errorCodes['value'];
+ return in_array($value, self::ERROR_CODES, true) ? $value : self::ERROR_CODES['value'];
}
/**
@@ -52,7 +63,7 @@ class ExcelError
}
$i = 1;
- foreach (self::$errorCodes as $errorCode) {
+ foreach (self::ERROR_CODES as $errorCode) {
if ($value === $errorCode) {
return $i;
}
@@ -71,7 +82,7 @@ class ExcelError
*/
public static function null(): string
{
- return self::$errorCodes['null'];
+ return self::ERROR_CODES['null'];
}
/**
@@ -83,7 +94,7 @@ class ExcelError
*/
public static function NAN(): string
{
- return self::$errorCodes['num'];
+ return self::ERROR_CODES['num'];
}
/**
@@ -95,7 +106,7 @@ class ExcelError
*/
public static function REF(): string
{
- return self::$errorCodes['reference'];
+ return self::ERROR_CODES['reference'];
}
/**
@@ -111,7 +122,7 @@ class ExcelError
*/
public static function NA(): string
{
- return self::$errorCodes['na'];
+ return self::ERROR_CODES['na'];
}
/**
@@ -123,7 +134,7 @@ class ExcelError
*/
public static function VALUE(): string
{
- return self::$errorCodes['value'];
+ return self::ERROR_CODES['value'];
}
/**
@@ -135,7 +146,7 @@ class ExcelError
*/
public static function NAME(): string
{
- return self::$errorCodes['name'];
+ return self::ERROR_CODES['name'];
}
/**
@@ -145,7 +156,7 @@ class ExcelError
*/
public static function DIV0(): string
{
- return self::$errorCodes['divisionbyzero'];
+ return self::ERROR_CODES['divisionbyzero'];
}
/**
@@ -155,6 +166,6 @@ class ExcelError
*/
public static function CALC(): string
{
- return self::$errorCodes['calculation'];
+ return self::ERROR_CODES['calculation'];
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/Value.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/Value.php
index 0ac6b6697..2e524db53 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/Value.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/Value.php
@@ -240,7 +240,7 @@ class Value
*
* @param null|mixed $value The value you want converted
*
- * @return number N converts values listed in the following table
+ * @return number|string N converts values listed in the following table
* If value is or refers to N returns
* A number That number value
* A date The Excel serialized number of that date
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Address.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Address.php
index c8cdf2dd8..0d2db8b20 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Address.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Address.php
@@ -4,6 +4,7 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\LookupRef;
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
+use PhpOffice\PhpSpreadsheet\Cell\AddressHelper;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
class Address
@@ -72,6 +73,9 @@ class Address
$sheetName = self::sheetName($sheetName);
+ if (is_int($referenceStyle)) {
+ $referenceStyle = (bool) $referenceStyle;
+ }
if ((!is_bool($referenceStyle)) || $referenceStyle === self::REFERENCE_STYLE_A1) {
return self::formatAsA1($row, $column, $relativity, $sheetName);
}
@@ -113,7 +117,8 @@ class Address
if (($relativity == self::ADDRESS_ROW_RELATIVE) || ($relativity == self::ADDRESS_RELATIVE)) {
$row = "[{$row}]";
}
+ [$rowChar, $colChar] = AddressHelper::getRowAndColumnChars();
- return "{$sheetName}R{$row}C{$column}";
+ return "{$sheetName}$rowChar{$row}$colChar{$column}";
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/HLookup.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/HLookup.php
index d67718ce0..e2d27bde2 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/HLookup.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/HLookup.php
@@ -66,7 +66,7 @@ class HLookup extends LookupBase
*/
private static function hLookupSearch($lookupValue, array $lookupArray, $column, bool $notExactMatch): ?int
{
- $lookupLower = StringHelper::strToLower($lookupValue);
+ $lookupLower = StringHelper::strToLower((string) $lookupValue);
$rowNumber = null;
foreach ($lookupArray[$column] as $rowKey => $rowData) {
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Helpers.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Helpers.php
index 7408a66e8..76a194b38 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Helpers.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Helpers.php
@@ -13,12 +13,12 @@ class Helpers
public const CELLADDRESS_USE_R1C1 = false;
- private static function convertR1C1(string &$cellAddress1, ?string &$cellAddress2, bool $a1): string
+ private static function convertR1C1(string &$cellAddress1, ?string &$cellAddress2, bool $a1, ?int $baseRow = null, ?int $baseCol = null): string
{
if ($a1 === self::CELLADDRESS_USE_R1C1) {
- $cellAddress1 = AddressHelper::convertToA1($cellAddress1);
+ $cellAddress1 = AddressHelper::convertToA1($cellAddress1, $baseRow ?? 1, $baseCol ?? 1);
if ($cellAddress2) {
- $cellAddress2 = AddressHelper::convertToA1($cellAddress2);
+ $cellAddress2 = AddressHelper::convertToA1($cellAddress2, $baseRow ?? 1, $baseCol ?? 1);
}
}
@@ -35,7 +35,7 @@ class Helpers
}
}
- public static function extractCellAddresses(string $cellAddress, bool $a1, Worksheet $sheet, string $sheetName = ''): array
+ public static function extractCellAddresses(string $cellAddress, bool $a1, Worksheet $sheet, string $sheetName = '', ?int $baseRow = null, ?int $baseCol = null): array
{
$cellAddress1 = $cellAddress;
$cellAddress2 = null;
@@ -52,7 +52,7 @@ class Helpers
if (strpos($cellAddress, ':') !== false) {
[$cellAddress1, $cellAddress2] = explode(':', $cellAddress);
}
- $cellAddress = self::convertR1C1($cellAddress1, $cellAddress2, $a1);
+ $cellAddress = self::convertR1C1($cellAddress1, $cellAddress2, $a1, $baseRow, $baseCol);
return [$cellAddress1, $cellAddress2, $cellAddress];
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Indirect.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Indirect.php
index 417a1f798..91a14491e 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Indirect.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Indirect.php
@@ -7,6 +7,7 @@ use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
use PhpOffice\PhpSpreadsheet\Cell\Cell;
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class Indirect
@@ -63,6 +64,8 @@ class Indirect
*/
public static function INDIRECT($cellAddress, $a1fmt, Cell $cell)
{
+ [$baseCol, $baseRow] = Coordinate::indexesFromString($cell->getCoordinate());
+
try {
$a1 = self::a1Format($a1fmt);
$cellAddress = self::validateAddress($cellAddress);
@@ -78,7 +81,11 @@ class Indirect
$cellAddress = self::handleRowColumnRanges($worksheet, ...explode(':', $cellAddress));
}
- [$cellAddress1, $cellAddress2, $cellAddress] = Helpers::extractCellAddresses($cellAddress, $a1, $cell->getWorkSheet(), $sheetName);
+ try {
+ [$cellAddress1, $cellAddress2, $cellAddress] = Helpers::extractCellAddresses($cellAddress, $a1, $cell->getWorkSheet(), $sheetName, $baseRow, $baseCol);
+ } catch (Exception $e) {
+ return ExcelError::REF();
+ }
if (
(!preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/miu', $cellAddress1, $matches)) ||
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php
index 8e451fe41..a001540c2 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php
@@ -19,8 +19,16 @@ abstract class LookupBase
protected static function validateIndexLookup(array $lookup_array, $index_number): int
{
- // index_number must be a number greater than or equal to 1
- if (!is_numeric($index_number) || $index_number < 1) {
+ // index_number must be a number greater than or equal to 1.
+ // Excel results are inconsistent when index is non-numeric.
+ // VLOOKUP(whatever, whatever, SQRT(-1)) yields NUM error, but
+ // VLOOKUP(whatever, whatever, cellref) yields REF error
+ // when cellref is '=SQRT(-1)'. So just try our best here.
+ // Similar results if string (literal yields VALUE, cellRef REF).
+ if (!is_numeric($index_number)) {
+ throw new Exception(ExcelError::throwError($index_number));
+ }
+ if ($index_number < 1) {
throw new Exception(ExcelError::VALUE());
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Offset.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Offset.php
index 9f3377f6d..02a255812 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Offset.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Offset.php
@@ -99,6 +99,8 @@ class Offset
private static function extractWorksheet($cellAddress, Cell $cell): array
{
+ $cellAddress = self::assessCellAddress($cellAddress, $cell);
+
$sheetName = '';
if (strpos($cellAddress, '!') !== false) {
[$sheetName, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true);
@@ -112,6 +114,15 @@ class Offset
return [$cellAddress, $worksheet];
}
+ private static function assessCellAddress(string $cellAddress, Cell $cell): string
+ {
+ if (preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/mui', $cellAddress) !== false) {
+ $cellAddress = Functions::expandDefinedName($cellAddress, $cell);
+ }
+
+ return $cellAddress;
+ }
+
private static function adjustEndCellColumnForWidth(string $endCellColumn, $width, int $startCellColumn, $columns)
{
$endCellColumn = Coordinate::columnIndexFromString($endCellColumn) - 1;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php
index 53a7badc9..edeb1aa8c 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php
@@ -68,8 +68,8 @@ class VLookup extends LookupBase
{
reset($a);
$firstColumn = key($a);
- $aLower = StringHelper::strToLower($a[$firstColumn]);
- $bLower = StringHelper::strToLower($b[$firstColumn]);
+ $aLower = StringHelper::strToLower((string) $a[$firstColumn]);
+ $bLower = StringHelper::strToLower((string) $b[$firstColumn]);
if ($aLower == $bLower) {
return 0;
@@ -84,7 +84,7 @@ class VLookup extends LookupBase
*/
private static function vLookupSearch($lookupValue, array $lookupArray, $column, bool $notExactMatch): ?int
{
- $lookupLower = StringHelper::strToLower($lookupValue);
+ $lookupLower = StringHelper::strToLower((string) $lookupValue);
$rowNumber = null;
foreach ($lookupArray as $rowKey => $rowData) {
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php
index b9fcfc73e..22cad2cfd 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php
@@ -17,7 +17,7 @@ class Random
*/
public static function rand()
{
- return (mt_rand(0, 10000000)) / 10000000;
+ return mt_rand(0, 10000000) / 10000000;
}
/**
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php
index 41b011a5f..85195c88f 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php
@@ -203,7 +203,7 @@ class Averages extends AggregateBase
$args,
function ($value) {
// Is it a numeric value?
- return (is_numeric($value)) && (!is_string($value));
+ return is_numeric($value) && (!is_string($value));
}
);
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php
index 8574d58db..c87433648 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php
@@ -101,7 +101,7 @@ class ChiSquared
return 1 - self::distributionRightTail($value, $degrees);
}
- return (($value ** (($degrees / 2) - 1) * exp(-$value / 2))) /
+ return ($value ** (($degrees / 2) - 1) * exp(-$value / 2)) /
((2 ** ($degrees / 2)) * Gamma::gammaValue($degrees / 2));
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php
index d29f80cab..ee7e31b77 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php
@@ -4,6 +4,9 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData;
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalcExp;
+use PhpOffice\PhpSpreadsheet\Calculation\Functions;
+use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
+use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
class Extract
{
@@ -95,4 +98,183 @@ class Extract
return mb_substr($value ?? '', mb_strlen($value ?? '', 'UTF-8') - $chars, $chars, 'UTF-8');
}
+
+ /**
+ * TEXTBEFORE.
+ *
+ * @param mixed $text the text that you're searching
+ * Or can be an array of values
+ * @param null|array|string $delimiter the text that marks the point before which you want to extract
+ * Multiple delimiters can be passed as an array of string values
+ * @param mixed $instance The instance of the delimiter after which you want to extract the text.
+ * By default, this is the first instance (1).
+ * A negative value means start searching from the end of the text string.
+ * Or can be an array of values
+ * @param mixed $matchMode Determines whether the match is case-sensitive or not.
+ * 0 - Case-sensitive
+ * 1 - Case-insensitive
+ * Or can be an array of values
+ * @param mixed $matchEnd Treats the end of text as a delimiter.
+ * 0 - Don't match the delimiter against the end of the text.
+ * 1 - Match the delimiter against the end of the text.
+ * Or can be an array of values
+ * @param mixed $ifNotFound value to return if no match is found
+ * The default is a #N/A Error
+ * Or can be an array of values
+ *
+ * @return mixed|mixed[] the string extracted from text before the delimiter; or the $ifNotFound value
+ * If an array of values is passed for any of the arguments, then the returned result
+ * will also be an array with matching dimensions
+ */
+ public static function before($text, $delimiter, $instance = 1, $matchMode = 0, $matchEnd = 0, $ifNotFound = '#N/A')
+ {
+ if (is_array($text) || is_array($instance) || is_array($matchMode) || is_array($matchEnd) || is_array($ifNotFound)) {
+ return self::evaluateArrayArgumentsIgnore([self::class, __FUNCTION__], 1, $text, $delimiter, $instance, $matchMode, $matchEnd, $ifNotFound);
+ }
+
+ $text = Helpers::extractString($text ?? '');
+ $instance = (int) $instance;
+ $matchMode = (int) $matchMode;
+ $matchEnd = (int) $matchEnd;
+
+ $split = self::validateTextBeforeAfter($text, $delimiter, $instance, $matchMode, $matchEnd, $ifNotFound);
+ if (is_array($split) === false) {
+ return $split;
+ }
+ if (Helpers::extractString(Functions::flattenSingleValue($delimiter ?? '')) === '') {
+ return ($instance > 0) ? '' : $text;
+ }
+
+ // Adjustment for a match as the first element of the split
+ $flags = self::matchFlags($matchMode);
+ $delimiter = self::buildDelimiter($delimiter);
+ $adjust = preg_match('/^' . $delimiter . "\$/{$flags}", $split[0]);
+ $oddReverseAdjustment = count($split) % 2;
+
+ $split = ($instance < 0)
+ ? array_slice($split, 0, max(count($split) - (abs($instance) * 2 - 1) - $adjust - $oddReverseAdjustment, 0))
+ : array_slice($split, 0, $instance * 2 - 1 - $adjust);
+
+ return implode('', $split);
+ }
+
+ /**
+ * TEXTAFTER.
+ *
+ * @param mixed $text the text that you're searching
+ * @param null|array|string $delimiter the text that marks the point before which you want to extract
+ * Multiple delimiters can be passed as an array of string values
+ * @param mixed $instance The instance of the delimiter after which you want to extract the text.
+ * By default, this is the first instance (1).
+ * A negative value means start searching from the end of the text string.
+ * Or can be an array of values
+ * @param mixed $matchMode Determines whether the match is case-sensitive or not.
+ * 0 - Case-sensitive
+ * 1 - Case-insensitive
+ * Or can be an array of values
+ * @param mixed $matchEnd Treats the end of text as a delimiter.
+ * 0 - Don't match the delimiter against the end of the text.
+ * 1 - Match the delimiter against the end of the text.
+ * Or can be an array of values
+ * @param mixed $ifNotFound value to return if no match is found
+ * The default is a #N/A Error
+ * Or can be an array of values
+ *
+ * @return mixed|mixed[] the string extracted from text before the delimiter; or the $ifNotFound value
+ * If an array of values is passed for any of the arguments, then the returned result
+ * will also be an array with matching dimensions
+ */
+ public static function after($text, $delimiter, $instance = 1, $matchMode = 0, $matchEnd = 0, $ifNotFound = '#N/A')
+ {
+ if (is_array($text) || is_array($instance) || is_array($matchMode) || is_array($matchEnd) || is_array($ifNotFound)) {
+ return self::evaluateArrayArgumentsIgnore([self::class, __FUNCTION__], 1, $text, $delimiter, $instance, $matchMode, $matchEnd, $ifNotFound);
+ }
+
+ $text = Helpers::extractString($text ?? '');
+ $instance = (int) $instance;
+ $matchMode = (int) $matchMode;
+ $matchEnd = (int) $matchEnd;
+
+ $split = self::validateTextBeforeAfter($text, $delimiter, $instance, $matchMode, $matchEnd, $ifNotFound);
+ if (is_array($split) === false) {
+ return $split;
+ }
+ if (Helpers::extractString(Functions::flattenSingleValue($delimiter ?? '')) === '') {
+ return ($instance < 0) ? '' : $text;
+ }
+
+ // Adjustment for a match as the first element of the split
+ $flags = self::matchFlags($matchMode);
+ $delimiter = self::buildDelimiter($delimiter);
+ $adjust = preg_match('/^' . $delimiter . "\$/{$flags}", $split[0]);
+ $oddReverseAdjustment = count($split) % 2;
+
+ $split = ($instance < 0)
+ ? array_slice($split, count($split) - (abs($instance + 1) * 2) - $adjust - $oddReverseAdjustment)
+ : array_slice($split, $instance * 2 - $adjust);
+
+ return implode('', $split);
+ }
+
+ /**
+ * @param null|array|string $delimiter
+ * @param int $matchMode
+ * @param int $matchEnd
+ * @param mixed $ifNotFound
+ *
+ * @return string|string[]
+ */
+ private static function validateTextBeforeAfter(string $text, $delimiter, int $instance, $matchMode, $matchEnd, $ifNotFound)
+ {
+ $flags = self::matchFlags($matchMode);
+ $delimiter = self::buildDelimiter($delimiter);
+
+ if (preg_match('/' . $delimiter . "/{$flags}", $text) === 0 && $matchEnd === 0) {
+ return $ifNotFound;
+ }
+
+ $split = preg_split('/' . $delimiter . "/{$flags}", $text, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
+ if ($split === false) {
+ return ExcelError::NA();
+ }
+
+ if ($instance === 0 || abs($instance) > StringHelper::countCharacters($text)) {
+ return ExcelError::VALUE();
+ }
+
+ if ($matchEnd === 0 && (abs($instance) > floor(count($split) / 2))) {
+ return ExcelError::NA();
+ } elseif ($matchEnd !== 0 && (abs($instance) - 1 > ceil(count($split) / 2))) {
+ return ExcelError::NA();
+ }
+
+ return $split;
+ }
+
+ /**
+ * @param null|array|string $delimiter the text that marks the point before which you want to extract
+ * Multiple delimiters can be passed as an array of string values
+ */
+ private static function buildDelimiter($delimiter): string
+ {
+ if (is_array($delimiter)) {
+ $delimiter = Functions::flattenArray($delimiter);
+ $quotedDelimiters = array_map(
+ function ($delimiter) {
+ return preg_quote($delimiter ?? '');
+ },
+ $delimiter
+ );
+ $delimiters = implode('|', $quotedDelimiters);
+
+ return '(' . $delimiters . ')';
+ }
+
+ return '(' . preg_quote($delimiter ?? '') . ')';
+ }
+
+ private static function matchFlags(int $matchMode): string
+ {
+ return ($matchMode === 0) ? 'mu' : 'miu';
+ }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php
index bec114968..03e75d1d2 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php
@@ -4,11 +4,13 @@ namespace PhpOffice\PhpSpreadsheet\Calculation\TextData;
use DateTimeInterface;
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
+use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel;
use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalcExp;
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
use PhpOffice\PhpSpreadsheet\Calculation\MathTrig;
+use PhpOffice\PhpSpreadsheet\RichText\RichText;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
@@ -208,6 +210,38 @@ class Format
return (float) $value;
}
+ /**
+ * TEXT.
+ *
+ * @param mixed $value The value to format
+ * Or can be an array of values
+ * @param mixed $format
+ *
+ * @return array|string
+ * If an array of values is passed for either of the arguments, then the returned result
+ * will also be an array with matching dimensions
+ */
+ public static function valueToText($value, $format = false)
+ {
+ if (is_array($value) || is_array($format)) {
+ return self::evaluateArrayArguments([self::class, __FUNCTION__], $value, $format);
+ }
+
+ $format = (bool) $format;
+
+ if (is_object($value) && $value instanceof RichText) {
+ $value = $value->getPlainText();
+ }
+ if (is_string($value)) {
+ $value = ($format === true) ? Calculation::wrapResult($value) : $value;
+ $value = str_replace("\n", '', $value);
+ } elseif (is_bool($value)) {
+ $value = Calculation::$localeBoolean[$value === true ? 'TRUE' : 'FALSE'];
+ }
+
+ return (string) $value;
+ }
+
/**
* @param mixed $decimalSeparator
*/
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php
index 490c43c20..83810422c 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php
@@ -3,6 +3,8 @@
namespace PhpOffice\PhpSpreadsheet\Calculation\TextData;
use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
+use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
+use PhpOffice\PhpSpreadsheet\Calculation\Functions;
class Text
{
@@ -77,4 +79,176 @@ class Text
return null;
}
+
+ /**
+ * TEXTSPLIT.
+ *
+ * @param mixed $text the text that you're searching
+ * @param null|array|string $columnDelimiter The text that marks the point where to spill the text across columns.
+ * Multiple delimiters can be passed as an array of string values
+ * @param null|array|string $rowDelimiter The text that marks the point where to spill the text down rows.
+ * Multiple delimiters can be passed as an array of string values
+ * @param bool $ignoreEmpty Specify FALSE to create an empty cell when two delimiters are consecutive.
+ * true = create empty cells
+ * false = skip empty cells
+ * Defaults to TRUE, which creates an empty cell
+ * @param bool $matchMode Determines whether the match is case-sensitive or not.
+ * true = case-sensitive
+ * false = case-insensitive
+ * By default, a case-sensitive match is done.
+ * @param mixed $padding The value with which to pad the result.
+ * The default is #N/A.
+ *
+ * @return array the array built from the text, split by the row and column delimiters
+ */
+ public static function split($text, $columnDelimiter = null, $rowDelimiter = null, bool $ignoreEmpty = false, bool $matchMode = true, $padding = '#N/A')
+ {
+ $text = Functions::flattenSingleValue($text);
+
+ $flags = self::matchFlags($matchMode);
+
+ if ($rowDelimiter !== null) {
+ $delimiter = self::buildDelimiter($rowDelimiter);
+ $rows = ($delimiter === '()')
+ ? [$text]
+ : preg_split("/{$delimiter}/{$flags}", $text);
+ } else {
+ $rows = [$text];
+ }
+
+ /** @var array $rows */
+ if ($ignoreEmpty === true) {
+ $rows = array_values(array_filter(
+ $rows,
+ function ($row) {
+ return $row !== '';
+ }
+ ));
+ }
+
+ if ($columnDelimiter !== null) {
+ $delimiter = self::buildDelimiter($columnDelimiter);
+ array_walk(
+ $rows,
+ function (&$row) use ($delimiter, $flags, $ignoreEmpty): void {
+ $row = ($delimiter === '()')
+ ? [$row]
+ : preg_split("/{$delimiter}/{$flags}", $row);
+ /** @var array $row */
+ if ($ignoreEmpty === true) {
+ $row = array_values(array_filter(
+ $row,
+ function ($value) {
+ return $value !== '';
+ }
+ ));
+ }
+ }
+ );
+ if ($ignoreEmpty === true) {
+ $rows = array_values(array_filter(
+ $rows,
+ function ($row) {
+ return $row !== [] && $row !== [''];
+ }
+ ));
+ }
+ }
+
+ return self::applyPadding($rows, $padding);
+ }
+
+ /**
+ * @param mixed $padding
+ */
+ private static function applyPadding(array $rows, $padding): array
+ {
+ $columnCount = array_reduce(
+ $rows,
+ function (int $counter, array $row): int {
+ return max($counter, count($row));
+ },
+ 0
+ );
+
+ return array_map(
+ function (array $row) use ($columnCount, $padding): array {
+ return (count($row) < $columnCount)
+ ? array_merge($row, array_fill(0, $columnCount - count($row), $padding))
+ : $row;
+ },
+ $rows
+ );
+ }
+
+ /**
+ * @param null|array|string $delimiter the text that marks the point before which you want to split
+ * Multiple delimiters can be passed as an array of string values
+ */
+ private static function buildDelimiter($delimiter): string
+ {
+ $valueSet = Functions::flattenArray($delimiter);
+
+ if (is_array($delimiter) && count($valueSet) > 1) {
+ $quotedDelimiters = array_map(
+ function ($delimiter) {
+ return preg_quote($delimiter ?? '');
+ },
+ $valueSet
+ );
+ $delimiters = implode('|', $quotedDelimiters);
+
+ return '(' . $delimiters . ')';
+ }
+
+ return '(' . preg_quote(Functions::flattenSingleValue($delimiter)) . ')';
+ }
+
+ private static function matchFlags(bool $matchMode): string
+ {
+ return ($matchMode === true) ? 'miu' : 'mu';
+ }
+
+ public static function fromArray(array $array, int $format = 0): string
+ {
+ $result = [];
+ foreach ($array as $row) {
+ $cells = [];
+ foreach ($row as $cellValue) {
+ $value = ($format === 1) ? self::formatValueMode1($cellValue) : self::formatValueMode0($cellValue);
+ $cells[] = $value;
+ }
+ $result[] = implode(($format === 1) ? ',' : ', ', $cells);
+ }
+
+ $result = implode(($format === 1) ? ';' : ', ', $result);
+
+ return ($format === 1) ? '{' . $result . '}' : $result;
+ }
+
+ /**
+ * @param mixed $cellValue
+ */
+ private static function formatValueMode0($cellValue): string
+ {
+ if (is_bool($cellValue)) {
+ return ($cellValue) ? Calculation::$localeBoolean['TRUE'] : Calculation::$localeBoolean['FALSE'];
+ }
+
+ return (string) $cellValue;
+ }
+
+ /**
+ * @param mixed $cellValue
+ */
+ private static function formatValueMode1($cellValue): string
+ {
+ if (is_string($cellValue) && Functions::isError($cellValue) === false) {
+ return Calculation::FORMULA_STRING_QUOTE . $cellValue . Calculation::FORMULA_STRING_QUOTE;
+ } elseif (is_bool($cellValue)) {
+ return ($cellValue) ? Calculation::$localeBoolean['TRUE'] : Calculation::$localeBoolean['FALSE'];
+ }
+
+ return (string) $cellValue;
+ }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/Translations.xlsx b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/Translations.xlsx
index d013aee0f..7b9fb0ddd 100644
Binary files a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/Translations.xlsx and b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/Translations.xlsx differ
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/functions
index 6260760bc..03b68c9bd 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/functions
@@ -245,6 +245,7 @@ ROWS = RÆKKER
RTD = RTD
TRANSPOSE = TRANSPONER
VLOOKUP = LOPSLAG
+*RC = RK
##
## Matematiske og trigonometriske funktioner (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/functions
index 331232f7e..d49fc5f1b 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/functions
@@ -243,6 +243,7 @@ ROWS = ZEILEN
RTD = RTD
TRANSPOSE = MTRANS
VLOOKUP = SVERWEIS
+*RC = ZS
##
## Mathematische und trigonometrische Funktionen (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/functions
index 1f9f2891e..88012aa12 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/functions
@@ -245,6 +245,7 @@ ROWS = FILAS
RTD = RDTR
TRANSPOSE = TRANSPONER
VLOOKUP = BUSCARV
+*RC = FC
##
## Funciones matemáticas y trigonométricas (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/functions
index 33068d93e..18f7c8c8b 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/functions
@@ -245,6 +245,7 @@ ROWS = RIVIT
RTD = RTD
TRANSPOSE = TRANSPONOI
VLOOKUP = PHAKU
+*RC = RS
##
## Matemaattiset ja trigonometriset funktiot (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/functions
index 78b603e9c..621cb0db3 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/functions
@@ -240,6 +240,7 @@ ROWS = LIGNES
RTD = RTD
TRANSPOSE = TRANSPOSE
VLOOKUP = RECHERCHEV
+*RC = LC
##
## Fonctions mathématiques et trigonométriques (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/functions
index 46b301271..4a375ea2d 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/functions
@@ -245,6 +245,7 @@ ROWS = SOROK
RTD = VIA
TRANSPOSE = TRANSZPONÁLÁS
VLOOKUP = FKERES
+*RC = SO
##
## Matematikai és trigonometrikus függvények (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nb/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nb/functions
index b0a0f9492..d352e1f41 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nb/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nb/functions
@@ -245,6 +245,7 @@ ROWS = RADER
RTD = RTD
TRANSPOSE = TRANSPONER
VLOOKUP = FINN.RAD
+*RC = RK
##
## Matematikk- og trigonometrifunksjoner (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/functions
index 0e4f1597d..ce0b30cc8 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/functions
@@ -244,6 +244,7 @@ ROWS = RIJEN
RTD = RTG
TRANSPOSE = TRANSPONEREN
VLOOKUP = VERT.ZOEKEN
+*RC = RK
##
## Wiskundige en trigonometrische functies (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/functions
index feba30d9a..5781b0c70 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/functions
@@ -242,6 +242,7 @@ ROWS = LINS
RTD = RTD
TRANSPOSE = TRANSPOR
VLOOKUP = PROCV
+*RC = LC
##
## Funções matemáticas e trigonométricas (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/functions
index 8a94d8260..70a3bb0c7 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/functions
@@ -245,6 +245,7 @@ ROWS = LINS
RTD = RTD
TRANSPOSE = TRANSPOR
VLOOKUP = PROCV
+*RC = LC
##
## Funções matemáticas e trigonométricas (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/functions
index 2531b4c1d..491ecfb93 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/functions
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/functions
@@ -243,6 +243,7 @@ ROWS = RADER
RTD = RTD
TRANSPOSE = TRANSPONERA
VLOOKUP = LETARAD
+*RC = RK
##
## Matematiska och trigonometriska funktioner (Math & Trig Functions)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressHelper.php
index 535bdee03..a23a78b65 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressHelper.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressHelper.php
@@ -2,23 +2,44 @@
namespace PhpOffice\PhpSpreadsheet\Cell;
+use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
+use PhpOffice\PhpSpreadsheet\Calculation\Functions;
use PhpOffice\PhpSpreadsheet\Exception;
class AddressHelper
{
public const R1C1_COORDINATE_REGEX = '/(R((?:\[-?\d*\])|(?:\d*))?)(C((?:\[-?\d*\])|(?:\d*))?)/i';
+ /** @return string[] */
+ public static function getRowAndColumnChars()
+ {
+ $rowChar = 'R';
+ $colChar = 'C';
+ if (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_EXCEL) {
+ $rowColChars = Calculation::localeFunc('*RC');
+ if (mb_strlen($rowColChars) === 2) {
+ $rowChar = mb_substr($rowColChars, 0, 1);
+ $colChar = mb_substr($rowColChars, 1, 1);
+ }
+ }
+
+ return [$rowChar, $colChar];
+ }
+
/**
* Converts an R1C1 format cell address to an A1 format cell address.
*/
public static function convertToA1(
string $address,
int $currentRowNumber = 1,
- int $currentColumnNumber = 1
+ int $currentColumnNumber = 1,
+ bool $useLocale = true
): string {
- $validityCheck = preg_match('/^(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))$/i', $address, $cellReference);
+ [$rowChar, $colChar] = $useLocale ? self::getRowAndColumnChars() : ['R', 'C'];
+ $regex = '/^(' . $rowChar . '(\[?[-+]?\d*\]?))(' . $colChar . '(\[?[-+]?\d*\]?))$/i';
+ $validityCheck = preg_match($regex, $address, $cellReference);
- if ($validityCheck === 0) {
+ if (empty($validityCheck)) {
throw new Exception('Invalid R1C1-format Cell Reference');
}
@@ -92,7 +113,7 @@ class AddressHelper
// Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent,
// then modify the formula to use that new reference
foreach ($cellReferences as $cellReference) {
- $A1CellReference = self::convertToA1($cellReference[0][0], $currentRowNumber, $currentColumnNumber);
+ $A1CellReference = self::convertToA1($cellReference[0][0], $currentRowNumber, $currentColumnNumber, false);
$value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0]));
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php
index 2005694df..d4d793d78 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php
@@ -50,14 +50,14 @@ class Cell
private $dataType;
/**
- * Collection of cells.
+ * The collection of cells that this cell belongs to (i.e. The Cell Collection for the parent Worksheet).
*
* @var Cells
*/
private $parent;
/**
- * Index to cellXf.
+ * Index to the cellXf reference for the styling of this cell.
*
* @var int
*/
@@ -95,9 +95,8 @@ class Cell
* Create a new Cell.
*
* @param mixed $value
- * @param string $dataType
*/
- public function __construct($value, $dataType, Worksheet $worksheet)
+ public function __construct($value, ?string $dataType, Worksheet $worksheet)
{
// Initialise cell value
$this->value = $value;
@@ -111,7 +110,7 @@ class Cell
$dataType = DataType::TYPE_STRING;
}
$this->dataType = $dataType;
- } elseif (!self::getValueBinder()->bindValue($this, $value)) {
+ } elseif (self::getValueBinder()->bindValue($this, $value) === false) {
throw new Exception('Value could not be bound to cell.');
}
}
@@ -167,10 +166,8 @@ class Cell
/**
* Get cell value with formatting.
- *
- * @return string
*/
- public function getFormattedValue()
+ public function getFormattedValue(): string
{
return (string) NumberFormat::toFormattedString(
$this->getCalculatedValue(),
@@ -188,7 +185,7 @@ class Cell
*
* @return $this
*/
- public function setValue($value)
+ public function setValue($value): self
{
if (!self::getValueBinder()->bindValue($this, $value)) {
throw new Exception('Value could not be bound to cell.');
@@ -205,7 +202,7 @@ class Cell
* Note that PhpSpreadsheet does not validate that the value and datatype are consistent, in using this
* method, then it is your responsibility as an end-user developer to validate that the value and
* the datatype match.
- * If you do mismatch value and datatpe, then the value you enter may be changed to match the datatype
+ * If you do mismatch value and datatype, then the value you enter may be changed to match the datatype
* that you specify.
*
* @return Cell
@@ -271,7 +268,7 @@ class Cell
*
* @return mixed
*/
- public function getCalculatedValue($resetLog = true)
+ public function getCalculatedValue(bool $resetLog = true)
{
if ($this->dataType === DataType::TYPE_FORMULA) {
try {
@@ -316,10 +313,8 @@ class Cell
* Set old calculated value (cached).
*
* @param mixed $originalValue Value
- *
- * @return Cell
*/
- public function setCalculatedValue($originalValue)
+ public function setCalculatedValue($originalValue): self
{
if ($originalValue !== null) {
$this->calculatedValue = (is_numeric($originalValue)) ? (float) $originalValue : $originalValue;
@@ -345,10 +340,8 @@ class Cell
/**
* Get cell data type.
- *
- * @return string
*/
- public function getDataType()
+ public function getDataType(): string
{
return $this->dataType;
}
@@ -357,10 +350,8 @@ class Cell
* Set cell data type.
*
* @param string $dataType see DataType::TYPE_*
- *
- * @return Cell
*/
- public function setDataType($dataType)
+ public function setDataType($dataType): self
{
if ($dataType == DataType::TYPE_STRING2) {
$dataType = DataType::TYPE_STRING;
@@ -392,10 +383,8 @@ class Cell
/**
* Get Data validation rules.
- *
- * @return DataValidation
*/
- public function getDataValidation()
+ public function getDataValidation(): DataValidation
{
if (!isset($this->parent)) {
throw new Exception('Cannot get data validation for cell that is not bound to a worksheet');
@@ -420,10 +409,8 @@ class Cell
/**
* Does this cell contain valid value?
- *
- * @return bool
*/
- public function hasValidValue()
+ public function hasValidValue(): bool
{
$validator = new DataValidator();
@@ -432,10 +419,8 @@ class Cell
/**
* Does this cell contain a Hyperlink?
- *
- * @return bool
*/
- public function hasHyperlink()
+ public function hasHyperlink(): bool
{
if (!isset($this->parent)) {
throw new Exception('Cannot check for hyperlink when cell is not bound to a worksheet');
@@ -446,10 +431,8 @@ class Cell
/**
* Get Hyperlink.
- *
- * @return Hyperlink
*/
- public function getHyperlink()
+ public function getHyperlink(): Hyperlink
{
if (!isset($this->parent)) {
throw new Exception('Cannot get hyperlink for cell that is not bound to a worksheet');
@@ -460,10 +443,8 @@ class Cell
/**
* Set Hyperlink.
- *
- * @return Cell
*/
- public function setHyperlink(?Hyperlink $hyperlink = null)
+ public function setHyperlink(?Hyperlink $hyperlink = null): self
{
if (!isset($this->parent)) {
throw new Exception('Cannot set hyperlink for cell that is not bound to a worksheet');
@@ -486,10 +467,8 @@ class Cell
/**
* Get parent worksheet.
- *
- * @return Worksheet
*/
- public function getWorksheet()
+ public function getWorksheet(): Worksheet
{
try {
$worksheet = $this->parent->getParent();
@@ -506,27 +485,22 @@ class Cell
/**
* Is this cell in a merge range.
- *
- * @return bool
*/
- public function isInMergeRange()
+ public function isInMergeRange(): bool
{
return (bool) $this->getMergeRange();
}
/**
* Is this cell the master (top left cell) in a merge range (that holds the actual data value).
- *
- * @return bool
*/
- public function isMergeRangeValueCell()
+ public function isMergeRangeValueCell(): bool
{
if ($mergeRange = $this->getMergeRange()) {
$mergeRange = Coordinate::splitRange($mergeRange);
[$startCell] = $mergeRange[0];
- if ($this->getCoordinate() === $startCell) {
- return true;
- }
+
+ return $this->getCoordinate() === $startCell;
}
return false;
@@ -576,10 +550,8 @@ class Cell
/**
* Re-bind parent.
- *
- * @return Cell
*/
- public function rebindParent(Worksheet $parent)
+ public function rebindParent(Worksheet $parent): self
{
$this->parent = $parent->getCellCollection();
@@ -590,10 +562,8 @@ class Cell
* Is cell in a specific range?
*
* @param string $range Cell range (e.g. A1:A1)
- *
- * @return bool
*/
- public function isInRange($range)
+ public function isInRange(string $range): bool
{
[$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($range);
@@ -614,7 +584,7 @@ class Cell
*
* @return int Result of comparison (always -1 or 1, never zero!)
*/
- public static function compareCells(self $a, self $b)
+ public static function compareCells(self $a, self $b): int
{
if ($a->getRow() < $b->getRow()) {
return -1;
@@ -629,10 +599,8 @@ class Cell
/**
* Get value binder to use.
- *
- * @return IValueBinder
*/
- public static function getValueBinder()
+ public static function getValueBinder(): IValueBinder
{
if (self::$valueBinder === null) {
self::$valueBinder = new DefaultValueBinder();
@@ -655,33 +623,27 @@ class Cell
public function __clone()
{
$vars = get_object_vars($this);
- foreach ($vars as $key => $value) {
- if ((is_object($value)) && ($key != 'parent')) {
- $this->$key = clone $value;
+ foreach ($vars as $propertyName => $propertyValue) {
+ if ((is_object($propertyValue)) && ($propertyName !== 'parent')) {
+ $this->$propertyName = clone $propertyValue;
} else {
- $this->$key = $value;
+ $this->$propertyName = $propertyValue;
}
}
}
/**
* Get index to cellXf.
- *
- * @return int
*/
- public function getXfIndex()
+ public function getXfIndex(): int
{
return $this->xfIndex;
}
/**
* Set index to cellXf.
- *
- * @param int $indexValue
- *
- * @return Cell
*/
- public function setXfIndex($indexValue)
+ public function setXfIndex(int $indexValue): self
{
$this->xfIndex = $indexValue;
@@ -695,7 +657,7 @@ class Cell
*
* @return $this
*/
- public function setFormulaAttributes($attributes)
+ public function setFormulaAttributes($attributes): self
{
$this->formulaAttributes = $attributes;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php
index 506783979..2fca62127 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php
@@ -2,6 +2,7 @@
namespace PhpOffice\PhpSpreadsheet\Cell;
+use PhpOffice\PhpSpreadsheet\Calculation\Functions;
use PhpOffice\PhpSpreadsheet\Exception;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
@@ -349,6 +350,19 @@ abstract class Coordinate
*/
public static function extractAllCellReferencesInRange($cellRange): array
{
+ if (substr_count($cellRange, '!') > 1) {
+ throw new Exception('3-D Range References are not supported');
+ }
+
+ [$worksheet, $cellRange] = Worksheet::extractSheetTitle($cellRange, true);
+ $quoted = '';
+ if ($worksheet > '') {
+ $quoted = Worksheet::nameRequiresQuotes($worksheet) ? "'" : '';
+ if (substr($worksheet, 0, 1) === "'" && substr($worksheet, -1, 1) === "'") {
+ $worksheet = substr($worksheet, 1, -1);
+ }
+ $worksheet = str_replace("'", "''", $worksheet);
+ }
[$ranges, $operators] = self::getCellBlocksFromRangeString($cellRange);
$cells = [];
@@ -364,7 +378,12 @@ abstract class Coordinate
$cellList = array_merge(...$cells);
- return self::sortCellReferenceArray($cellList);
+ return array_map(
+ function ($cellAddress) use ($worksheet, $quoted) {
+ return ($worksheet !== '') ? "{$quoted}{$worksheet}{$quoted}!{$cellAddress}" : $cellAddress;
+ },
+ self::sortCellReferenceArray($cellList)
+ );
}
private static function processRangeSetOperators(array $operators, array $cells): array
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php
index 1f55cf03b..9ebb081fa 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php
@@ -10,6 +10,14 @@ namespace PhpOffice\PhpSpreadsheet\Chart;
*/
class Axis extends Properties
{
+ const AXIS_TYPE_CATEGORY = 'catAx';
+ const AXIS_TYPE_DATE = 'dateAx';
+ const AXIS_TYPE_VALUE = 'valAx';
+
+ const TIME_UNIT_DAYS = 'days';
+ const TIME_UNIT_MONTHS = 'months';
+ const TIME_UNIT_YEARS = 'years';
+
public function __construct()
{
parent::__construct();
@@ -60,6 +68,11 @@ class Axis extends Properties
'axis_labels' => self::AXIS_LABELS_NEXT_TO,
'horizontal_crosses' => self::HORIZONTAL_CROSSES_AUTOZERO,
'horizontal_crosses_value' => null,
+ 'textRotation' => null,
+ 'hidden' => null,
+ 'majorTimeUnit' => self::TIME_UNIT_YEARS,
+ 'minorTimeUnit' => self::TIME_UNIT_MONTHS,
+ 'baseTimeUnit' => self::TIME_UNIT_DAYS,
];
/**
@@ -72,6 +85,7 @@ class Axis extends Properties
private const NUMERIC_FORMAT = [
Properties::FORMAT_CODE_NUMBER,
Properties::FORMAT_CODE_DATE,
+ Properties::FORMAT_CODE_DATE_ISO8601,
];
/**
@@ -113,12 +127,12 @@ class Axis extends Properties
public function getAxisIsNumericFormat(): bool
{
- return (bool) $this->axisNumber['numeric'];
+ return $this->axisType === self::AXIS_TYPE_DATE || (bool) $this->axisNumber['numeric'];
}
public function setAxisOption(string $key, ?string $value): void
{
- if (!empty($value)) {
+ if ($value !== null && $value !== '') {
$this->axisOptions[$key] = $value;
}
}
@@ -136,7 +150,12 @@ class Axis extends Properties
?string $minimum = null,
?string $maximum = null,
?string $majorUnit = null,
- ?string $minorUnit = null
+ ?string $minorUnit = null,
+ ?string $textRotation = null,
+ ?string $hidden = null,
+ ?string $baseTimeUnit = null,
+ ?string $majorTimeUnit = null,
+ ?string $minorTimeUnit = null
): void {
$this->axisOptions['axis_labels'] = $axisLabels;
$this->setAxisOption('horizontal_crosses_value', $horizontalCrossesValue);
@@ -144,11 +163,15 @@ class Axis extends Properties
$this->setAxisOption('orientation', $axisOrientation);
$this->setAxisOption('major_tick_mark', $majorTmt);
$this->setAxisOption('minor_tick_mark', $minorTmt);
- $this->setAxisOption('minor_tick_mark', $minorTmt);
$this->setAxisOption('minimum', $minimum);
$this->setAxisOption('maximum', $maximum);
$this->setAxisOption('major_unit', $majorUnit);
$this->setAxisOption('minor_unit', $minorUnit);
+ $this->setAxisOption('textRotation', $textRotation);
+ $this->setAxisOption('hidden', $hidden);
+ $this->setAxisOption('baseTimeUnit', $baseTimeUnit);
+ $this->setAxisOption('majorTimeUnit', $majorTimeUnit);
+ $this->setAxisOption('minorTimeUnit', $minorTimeUnit);
}
/**
@@ -180,7 +203,7 @@ class Axis extends Properties
public function setAxisType(string $type): self
{
- if ($type === 'catAx' || $type === 'valAx') {
+ if ($type === self::AXIS_TYPE_CATEGORY || $type === self::AXIS_TYPE_VALUE || $type === self::AXIS_TYPE_DATE) {
$this->axisType = $type;
} else {
$this->axisType = '';
@@ -196,7 +219,7 @@ class Axis extends Properties
* @param ?int $alpha
* @param ?string $AlphaType
*/
- public function setFillParameters($color, $alpha = null, $AlphaType = self::EXCEL_COLOR_TYPE_ARGB): void
+ public function setFillParameters($color, $alpha = null, $AlphaType = ChartColor::EXCEL_COLOR_TYPE_RGB): void
{
$this->fillColor->setColorProperties($color, $alpha, $AlphaType);
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php
index 3f4dd2a7f..f41d78830 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php
@@ -141,6 +141,15 @@ class Chart
/** @var bool */
private $oneCellAnchor = false;
+ /** @var bool */
+ private $autoTitleDeleted = false;
+
+ /** @var bool */
+ private $noFill = false;
+
+ /** @var bool */
+ private $roundedCorners = false;
+
/**
* Create a new Chart.
* majorGridlines and minorGridlines are deprecated, moved to Axis.
@@ -179,6 +188,13 @@ class Chart
return $this->name;
}
+ public function setName(string $name): self
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
/**
* Get Worksheet.
*/
@@ -645,14 +661,10 @@ class Chart
/**
* Render the chart to given file (or stream).
- * Unable to cover code until a usable current version of JpGraph
- * is made available through Composer.
*
* @param string $outputDestination Name of the file render to
*
* @return bool true on success
- *
- * @codeCoverageIgnore
*/
public function render($outputDestination = null)
{
@@ -732,4 +744,42 @@ class Chart
return $this;
}
+
+ public function getAutoTitleDeleted(): bool
+ {
+ return $this->autoTitleDeleted;
+ }
+
+ public function setAutoTitleDeleted(bool $autoTitleDeleted): self
+ {
+ $this->autoTitleDeleted = $autoTitleDeleted;
+
+ return $this;
+ }
+
+ public function getNoFill(): bool
+ {
+ return $this->noFill;
+ }
+
+ public function setNoFill(bool $noFill): self
+ {
+ $this->noFill = $noFill;
+
+ return $this;
+ }
+
+ public function getRoundedCorners(): bool
+ {
+ return $this->roundedCorners;
+ }
+
+ public function setRoundedCorners(?bool $roundedCorners): self
+ {
+ if ($roundedCorners !== null) {
+ $this->roundedCorners = $roundedCorners;
+ }
+
+ return $this;
+ }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/ChartColor.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/ChartColor.php
index 7f87e3912..87f310200 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/ChartColor.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/ChartColor.php
@@ -24,15 +24,18 @@ class ChartColor
/** @var ?int */
private $alpha;
+ /** @var ?int */
+ private $brightness;
+
/**
* @param string|string[] $value
*/
- public function __construct($value = '', ?int $alpha = null, ?string $type = null)
+ public function __construct($value = '', ?int $alpha = null, ?string $type = null, ?int $brightness = null)
{
if (is_array($value)) {
$this->setColorPropertiesArray($value);
} else {
- $this->setColorProperties($value, $alpha, $type);
+ $this->setColorProperties($value, $alpha, $type, $brightness);
}
}
@@ -72,10 +75,23 @@ class ChartColor
return $this;
}
+ public function getBrightness(): ?int
+ {
+ return $this->brightness;
+ }
+
+ public function setBrightness(?int $brightness): self
+ {
+ $this->brightness = $brightness;
+
+ return $this;
+ }
+
/**
* @param null|float|int|string $alpha
+ * @param null|float|int|string $brightness
*/
- public function setColorProperties(?string $color, $alpha = null, ?string $type = null): self
+ public function setColorProperties(?string $color, $alpha = null, ?string $type = null, $brightness = null): self
{
if (empty($type) && !empty($color)) {
if (substr($color, 0, 1) === '*') {
@@ -99,6 +115,11 @@ class ChartColor
} elseif (is_numeric($alpha)) {
$this->setAlpha((int) $alpha);
}
+ if ($brightness === null) {
+ $this->setBrightness(null);
+ } elseif (is_numeric($brightness)) {
+ $this->setBrightness((int) $brightness);
+ }
return $this;
}
@@ -108,7 +129,8 @@ class ChartColor
return $this->setColorProperties(
$color['value'] ?? '',
$color['alpha'] ?? null,
- $color['type'] ?? null
+ $color['type'] ?? null,
+ $color['brightness'] ?? null
);
}
@@ -133,6 +155,8 @@ class ChartColor
$retVal = $this->type;
} elseif ($propertyName === 'alpha') {
$retVal = $this->alpha;
+ } elseif ($propertyName === 'brightness') {
+ $retVal = $this->brightness;
}
return $retVal;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php
index 548145e7e..5d33e96d0 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php
@@ -94,7 +94,7 @@ class DataSeries
private $plotCategory = [];
/**
- * Smooth Line.
+ * Smooth Line. Must be specified for both DataSeries and DataSeriesValues.
*
* @var bool
*/
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php
index bc0e04d19..cd166b23b 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php
@@ -88,6 +88,9 @@ class DataSeriesValues extends Properties
/** @var ?Layout */
private $labelLayout;
+ /** @var TrendLine[] */
+ private $trendLines = [];
+
/**
* Create a new DataSeriesValues object.
*
@@ -321,13 +324,13 @@ class DataSeriesValues extends Properties
if (is_array($this->fillColor)) {
$array = [];
foreach ($this->fillColor as $chartColor) {
- $array[] = self::chartColorToString($chartColor);
+ $array[] = $this->chartColorToString($chartColor);
}
return $array;
}
- return self::chartColorToString($this->fillColor);
+ return $this->chartColorToString($this->fillColor);
}
/**
@@ -345,13 +348,13 @@ class DataSeriesValues extends Properties
if ($fillString instanceof ChartColor) {
$this->fillColor[] = $fillString;
} else {
- $this->fillColor[] = self::stringToChartColor($fillString);
+ $this->fillColor[] = $this->stringToChartColor($fillString);
}
}
} elseif ($color instanceof ChartColor) {
$this->fillColor = $color;
- } elseif (is_string($color)) {
- $this->fillColor = self::stringToChartColor($color);
+ } else {
+ $this->fillColor = $this->stringToChartColor($color);
}
return $this;
@@ -536,7 +539,7 @@ class DataSeriesValues extends Properties
}
/**
- * Smooth Line.
+ * Smooth Line. Must be specified for both DataSeries and DataSeriesValues.
*
* @var bool
*/
@@ -577,4 +580,16 @@ class DataSeriesValues extends Properties
return $this;
}
+
+ public function setTrendLines(array $trendLines): self
+ {
+ $this->trendLines = $trendLines;
+
+ return $this;
+ }
+
+ public function getTrendLines(): array
+ {
+ return $this->trendLines;
+ }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php
index 03a0ca3ec..3dabcc63f 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php
@@ -53,6 +53,19 @@ class Layout
*/
private $height;
+ /**
+ * Position - t=top.
+ *
+ * @var string
+ */
+ private $dLblPos = '';
+
+ /** @var string */
+ private $numFmtCode = '';
+
+ /** @var bool */
+ private $numFmtLinked = false;
+
/**
* show legend key
* Specifies that legend keys should be shown in data labels.
@@ -143,6 +156,12 @@ class Layout
if (isset($layout['h'])) {
$this->height = (float) $layout['h'];
}
+ if (isset($layout['dLblPos'])) {
+ $this->dLblPos = (string) $layout['dLblPos'];
+ }
+ if (isset($layout['numFmtCode'])) {
+ $this->numFmtCode = (string) $layout['numFmtCode'];
+ }
$this->initBoolean($layout, 'showLegendKey');
$this->initBoolean($layout, 'showVal');
$this->initBoolean($layout, 'showCatName');
@@ -150,6 +169,7 @@ class Layout
$this->initBoolean($layout, 'showPercent');
$this->initBoolean($layout, 'showBubbleSize');
$this->initBoolean($layout, 'showLeaderLines');
+ $this->initBoolean($layout, 'numFmtLinked');
$this->initColor($layout, 'labelFillColor');
$this->initColor($layout, 'labelBorderColor');
$this->initColor($layout, 'labelFontColor');
@@ -484,4 +504,40 @@ class Layout
return $this;
}
+
+ public function getDLblPos(): string
+ {
+ return $this->dLblPos;
+ }
+
+ public function setDLblPos(string $dLblPos): self
+ {
+ $this->dLblPos = $dLblPos;
+
+ return $this;
+ }
+
+ public function getNumFmtCode(): string
+ {
+ return $this->numFmtCode;
+ }
+
+ public function setNumFmtCode(string $numFmtCode): self
+ {
+ $this->numFmtCode = $numFmtCode;
+
+ return $this;
+ }
+
+ public function getNumFmtLinked(): bool
+ {
+ return $this->numFmtLinked;
+ }
+
+ public function setNumFmtLinked(bool $numFmtLinked): self
+ {
+ $this->numFmtLinked = $numFmtLinked;
+
+ return $this;
+ }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php
index 4bd49ece0..ccde4bb2a 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php
@@ -6,6 +6,30 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class PlotArea
{
+ /**
+ * No fill in plot area (show Excel gridlines through chart).
+ *
+ * @var bool
+ */
+ private $noFill = false;
+
+ /**
+ * PlotArea Gradient Stop list.
+ * Each entry is a 2-element array.
+ * First is position in %.
+ * Second is ChartColor.
+ *
+ * @var array[]
+ */
+ private $gradientFillStops = [];
+
+ /**
+ * PlotArea Gradient Angle.
+ *
+ * @var ?float
+ */
+ private $gradientFillAngle;
+
/**
* PlotArea Layout.
*
@@ -101,4 +125,42 @@ class PlotArea
$plotSeries->refresh($worksheet);
}
}
+
+ public function setNoFill(bool $noFill): self
+ {
+ $this->noFill = $noFill;
+
+ return $this;
+ }
+
+ public function getNoFill(): bool
+ {
+ return $this->noFill;
+ }
+
+ public function setGradientFillProperties(array $gradientFillStops, ?float $gradientFillAngle): self
+ {
+ $this->gradientFillStops = $gradientFillStops;
+ $this->gradientFillAngle = $gradientFillAngle;
+
+ return $this;
+ }
+
+ /**
+ * Get gradientFillAngle.
+ */
+ public function getGradientFillAngle(): ?float
+ {
+ return $this->gradientFillAngle;
+ }
+
+ /**
+ * Get gradientFillStops.
+ *
+ * @return array
+ */
+ public function getGradientFillStops()
+ {
+ return $this->gradientFillStops;
+ }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraph.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraph.php
index b276707dd..0b0164b4e 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraph.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraph.php
@@ -2,68 +2,20 @@
namespace PhpOffice\PhpSpreadsheet\Chart\Renderer;
-use AccBarPlot;
-use AccLinePlot;
-use BarPlot;
-use ContourPlot;
-use Graph;
-use GroupBarPlot;
-use LinePlot;
-use PhpOffice\PhpSpreadsheet\Chart\Chart;
-use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
-use PieGraph;
-use PiePlot;
-use PiePlot3D;
-use PiePlotC;
-use RadarGraph;
-use RadarPlot;
-use ScatterPlot;
-use Spline;
-use StockPlot;
-
/**
- * Jpgraph is not maintained in Composer, and the version there
- * is extremely out of date. For that reason, all unit test
- * requiring Jpgraph are skipped. So, do not measure
- * code coverage for this class till that is fixed.
+ * Jpgraph is not oficially maintained in Composer, so the version there
+ * could be out of date. For that reason, all unit test requiring Jpgraph
+ * are skipped. So, do not measure code coverage for this class till that
+ * is fixed.
+ *
+ * This implementation uses abandoned package
+ * https://packagist.org/packages/jpgraph/jpgraph
*
* @codeCoverageIgnore
*/
-class JpGraph implements IRenderer
+class JpGraph extends JpGraphRendererBase
{
- private static $width = 640;
-
- private static $height = 480;
-
- private static $colourSet = [
- 'mediumpurple1', 'palegreen3', 'gold1', 'cadetblue1',
- 'darkmagenta', 'coral', 'dodgerblue3', 'eggplant',
- 'mediumblue', 'magenta', 'sandybrown', 'cyan',
- 'firebrick1', 'forestgreen', 'deeppink4', 'darkolivegreen',
- 'goldenrod2',
- ];
-
- private static $markSet;
-
- private $chart;
-
- private $graph;
-
- private static $plotColour = 0;
-
- private static $plotMark = 0;
-
- /**
- * Create a new jpgraph.
- */
- public function __construct(Chart $chart)
- {
- self::init();
- $this->graph = null;
- $this->chart = $chart;
- }
-
- private static function init(): void
+ protected static function init(): void
{
static $loaded = false;
if ($loaded) {
@@ -81,802 +33,6 @@ class JpGraph implements IRenderer
\JpGraph\JpGraph::module('scatter');
\JpGraph\JpGraph::module('stock');
- self::$markSet = [
- 'diamond' => MARK_DIAMOND,
- 'square' => MARK_SQUARE,
- 'triangle' => MARK_UTRIANGLE,
- 'x' => MARK_X,
- 'star' => MARK_STAR,
- 'dot' => MARK_FILLEDCIRCLE,
- 'dash' => MARK_DTRIANGLE,
- 'circle' => MARK_CIRCLE,
- 'plus' => MARK_CROSS,
- ];
-
$loaded = true;
}
-
- private function formatPointMarker($seriesPlot, $markerID)
- {
- $plotMarkKeys = array_keys(self::$markSet);
- if ($markerID === null) {
- // Use default plot marker (next marker in the series)
- self::$plotMark %= count(self::$markSet);
- $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]);
- } elseif ($markerID !== 'none') {
- // Use specified plot marker (if it exists)
- if (isset(self::$markSet[$markerID])) {
- $seriesPlot->mark->SetType(self::$markSet[$markerID]);
- } else {
- // If the specified plot marker doesn't exist, use default plot marker (next marker in the series)
- self::$plotMark %= count(self::$markSet);
- $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]);
- }
- } else {
- // Hide plot marker
- $seriesPlot->mark->Hide();
- }
- $seriesPlot->mark->SetColor(self::$colourSet[self::$plotColour]);
- $seriesPlot->mark->SetFillColor(self::$colourSet[self::$plotColour]);
- $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
-
- return $seriesPlot;
- }
-
- private function formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation = '')
- {
- $datasetLabelFormatCode = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode();
- if ($datasetLabelFormatCode !== null) {
- // Retrieve any label formatting code
- $datasetLabelFormatCode = stripslashes($datasetLabelFormatCode);
- }
-
- $testCurrentIndex = 0;
- foreach ($datasetLabels as $i => $datasetLabel) {
- if (is_array($datasetLabel)) {
- if ($rotation == 'bar') {
- $datasetLabels[$i] = implode(' ', $datasetLabel);
- } else {
- $datasetLabel = array_reverse($datasetLabel);
- $datasetLabels[$i] = implode("\n", $datasetLabel);
- }
- } else {
- // Format labels according to any formatting code
- if ($datasetLabelFormatCode !== null) {
- $datasetLabels[$i] = NumberFormat::toFormattedString($datasetLabel, $datasetLabelFormatCode);
- }
- }
- ++$testCurrentIndex;
- }
-
- return $datasetLabels;
- }
-
- private function percentageSumCalculation($groupID, $seriesCount)
- {
- $sumValues = [];
- // Adjust our values to a percentage value across all series in the group
- for ($i = 0; $i < $seriesCount; ++$i) {
- if ($i == 0) {
- $sumValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
- } else {
- $nextValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
- foreach ($nextValues as $k => $value) {
- if (isset($sumValues[$k])) {
- $sumValues[$k] += $value;
- } else {
- $sumValues[$k] = $value;
- }
- }
- }
- }
-
- return $sumValues;
- }
-
- private function percentageAdjustValues($dataValues, $sumValues)
- {
- foreach ($dataValues as $k => $dataValue) {
- $dataValues[$k] = $dataValue / $sumValues[$k] * 100;
- }
-
- return $dataValues;
- }
-
- private function getCaption($captionElement)
- {
- // Read any caption
- $caption = ($captionElement !== null) ? $captionElement->getCaption() : null;
- // Test if we have a title caption to display
- if ($caption !== null) {
- // If we do, it could be a plain string or an array
- if (is_array($caption)) {
- // Implode an array to a plain string
- $caption = implode('', $caption);
- }
- }
-
- return $caption;
- }
-
- private function renderTitle(): void
- {
- $title = $this->getCaption($this->chart->getTitle());
- if ($title !== null) {
- $this->graph->title->Set($title);
- }
- }
-
- private function renderLegend(): void
- {
- $legend = $this->chart->getLegend();
- if ($legend !== null) {
- $legendPosition = $legend->getPosition();
- switch ($legendPosition) {
- case 'r':
- $this->graph->legend->SetPos(0.01, 0.5, 'right', 'center'); // right
- $this->graph->legend->SetColumns(1);
-
- break;
- case 'l':
- $this->graph->legend->SetPos(0.01, 0.5, 'left', 'center'); // left
- $this->graph->legend->SetColumns(1);
-
- break;
- case 't':
- $this->graph->legend->SetPos(0.5, 0.01, 'center', 'top'); // top
-
- break;
- case 'b':
- $this->graph->legend->SetPos(0.5, 0.99, 'center', 'bottom'); // bottom
-
- break;
- default:
- $this->graph->legend->SetPos(0.01, 0.01, 'right', 'top'); // top-right
- $this->graph->legend->SetColumns(1);
-
- break;
- }
- } else {
- $this->graph->legend->Hide();
- }
- }
-
- private function renderCartesianPlotArea($type = 'textlin'): void
- {
- $this->graph = new Graph(self::$width, self::$height);
- $this->graph->SetScale($type);
-
- $this->renderTitle();
-
- // Rotate for bar rather than column chart
- $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotDirection();
- $reverse = $rotation == 'bar';
-
- $xAxisLabel = $this->chart->getXAxisLabel();
- if ($xAxisLabel !== null) {
- $title = $this->getCaption($xAxisLabel);
- if ($title !== null) {
- $this->graph->xaxis->SetTitle($title, 'center');
- $this->graph->xaxis->title->SetMargin(35);
- if ($reverse) {
- $this->graph->xaxis->title->SetAngle(90);
- $this->graph->xaxis->title->SetMargin(90);
- }
- }
- }
-
- $yAxisLabel = $this->chart->getYAxisLabel();
- if ($yAxisLabel !== null) {
- $title = $this->getCaption($yAxisLabel);
- if ($title !== null) {
- $this->graph->yaxis->SetTitle($title, 'center');
- if ($reverse) {
- $this->graph->yaxis->title->SetAngle(0);
- $this->graph->yaxis->title->SetMargin(-55);
- }
- }
- }
- }
-
- private function renderPiePlotArea(): void
- {
- $this->graph = new PieGraph(self::$width, self::$height);
-
- $this->renderTitle();
- }
-
- private function renderRadarPlotArea(): void
- {
- $this->graph = new RadarGraph(self::$width, self::$height);
- $this->graph->SetScale('lin');
-
- $this->renderTitle();
- }
-
- private function renderPlotLine($groupID, $filled = false, $combination = false, $dimensions = '2d'): void
- {
- $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
-
- $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount();
- if ($labelCount > 0) {
- $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
- $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);
- $this->graph->xaxis->SetTickLabels($datasetLabels);
- }
-
- $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
- $seriesPlots = [];
- if ($grouping == 'percentStacked') {
- $sumValues = $this->percentageSumCalculation($groupID, $seriesCount);
- } else {
- $sumValues = [];
- }
-
- // Loop through each data series in turn
- for ($i = 0; $i < $seriesCount; ++$i) {
- $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
- $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
-
- if ($grouping == 'percentStacked') {
- $dataValues = $this->percentageAdjustValues($dataValues, $sumValues);
- }
-
- // Fill in any missing values in the $dataValues array
- $testCurrentIndex = 0;
- foreach ($dataValues as $k => $dataValue) {
- while ($k != $testCurrentIndex) {
- $dataValues[$testCurrentIndex] = null;
- ++$testCurrentIndex;
- }
- ++$testCurrentIndex;
- }
-
- $seriesPlot = new LinePlot($dataValues);
- if ($combination) {
- $seriesPlot->SetBarCenter();
- }
-
- if ($filled) {
- $seriesPlot->SetFilled(true);
- $seriesPlot->SetColor('black');
- $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]);
- } else {
- // Set the appropriate plot marker
- $this->formatPointMarker($seriesPlot, $marker);
- }
- $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
- $seriesPlot->SetLegend($dataLabel);
-
- $seriesPlots[] = $seriesPlot;
- }
-
- if ($grouping == 'standard') {
- $groupPlot = $seriesPlots;
- } else {
- $groupPlot = new AccLinePlot($seriesPlots);
- }
- $this->graph->Add($groupPlot);
- }
-
- private function renderPlotBar($groupID, $dimensions = '2d'): void
- {
- $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotDirection();
- // Rotate for bar rather than column chart
- if (($groupID == 0) && ($rotation == 'bar')) {
- $this->graph->Set90AndMargin();
- }
- $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
-
- $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount();
- if ($labelCount > 0) {
- $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
- $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation);
- // Rotate for bar rather than column chart
- if ($rotation == 'bar') {
- $datasetLabels = array_reverse($datasetLabels);
- $this->graph->yaxis->SetPos('max');
- $this->graph->yaxis->SetLabelAlign('center', 'top');
- $this->graph->yaxis->SetLabelSide(SIDE_RIGHT);
- }
- $this->graph->xaxis->SetTickLabels($datasetLabels);
- }
-
- $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
- $seriesPlots = [];
- if ($grouping == 'percentStacked') {
- $sumValues = $this->percentageSumCalculation($groupID, $seriesCount);
- } else {
- $sumValues = [];
- }
-
- // Loop through each data series in turn
- for ($j = 0; $j < $seriesCount; ++$j) {
- $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();
- if ($grouping == 'percentStacked') {
- $dataValues = $this->percentageAdjustValues($dataValues, $sumValues);
- }
-
- // Fill in any missing values in the $dataValues array
- $testCurrentIndex = 0;
- foreach ($dataValues as $k => $dataValue) {
- while ($k != $testCurrentIndex) {
- $dataValues[$testCurrentIndex] = null;
- ++$testCurrentIndex;
- }
- ++$testCurrentIndex;
- }
-
- // Reverse the $dataValues order for bar rather than column chart
- if ($rotation == 'bar') {
- $dataValues = array_reverse($dataValues);
- }
- $seriesPlot = new BarPlot($dataValues);
- $seriesPlot->SetColor('black');
- $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]);
- if ($dimensions == '3d') {
- $seriesPlot->SetShadow();
- }
- if (!$this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) {
- $dataLabel = '';
- } else {
- $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue();
- }
- $seriesPlot->SetLegend($dataLabel);
-
- $seriesPlots[] = $seriesPlot;
- }
- // Reverse the plot order for bar rather than column chart
- if (($rotation == 'bar') && ($grouping != 'percentStacked')) {
- $seriesPlots = array_reverse($seriesPlots);
- }
-
- if ($grouping == 'clustered') {
- $groupPlot = new GroupBarPlot($seriesPlots);
- } elseif ($grouping == 'standard') {
- $groupPlot = new GroupBarPlot($seriesPlots);
- } else {
- $groupPlot = new AccBarPlot($seriesPlots);
- if ($dimensions == '3d') {
- $groupPlot->SetShadow();
- }
- }
-
- $this->graph->Add($groupPlot);
- }
-
- private function renderPlotScatter($groupID, $bubble): void
- {
- $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
- $scatterStyle = $bubbleSize = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
-
- $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
- $seriesPlots = [];
-
- // Loop through each data series in turn
- for ($i = 0; $i < $seriesCount; ++$i) {
- $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
- $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
-
- foreach ($dataValuesY as $k => $dataValueY) {
- $dataValuesY[$k] = $k;
- }
-
- $seriesPlot = new ScatterPlot($dataValuesX, $dataValuesY);
- if ($scatterStyle == 'lineMarker') {
- $seriesPlot->SetLinkPoints();
- $seriesPlot->link->SetColor(self::$colourSet[self::$plotColour]);
- } elseif ($scatterStyle == 'smoothMarker') {
- $spline = new Spline($dataValuesY, $dataValuesX);
- [$splineDataY, $splineDataX] = $spline->Get(count($dataValuesX) * self::$width / 20);
- $lplot = new LinePlot($splineDataX, $splineDataY);
- $lplot->SetColor(self::$colourSet[self::$plotColour]);
-
- $this->graph->Add($lplot);
- }
-
- if ($bubble) {
- $this->formatPointMarker($seriesPlot, 'dot');
- $seriesPlot->mark->SetColor('black');
- $seriesPlot->mark->SetSize($bubbleSize);
- } else {
- $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
- $this->formatPointMarker($seriesPlot, $marker);
- }
- $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
- $seriesPlot->SetLegend($dataLabel);
-
- $this->graph->Add($seriesPlot);
- }
- }
-
- private function renderPlotRadar($groupID): void
- {
- $radarStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
-
- $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
- $seriesPlots = [];
-
- // Loop through each data series in turn
- for ($i = 0; $i < $seriesCount; ++$i) {
- $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
- $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
- $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
-
- $dataValues = [];
- foreach ($dataValuesY as $k => $dataValueY) {
- $dataValues[$k] = implode(' ', array_reverse($dataValueY));
- }
- $tmp = array_shift($dataValues);
- $dataValues[] = $tmp;
- $tmp = array_shift($dataValuesX);
- $dataValuesX[] = $tmp;
-
- $this->graph->SetTitles(array_reverse($dataValues));
-
- $seriesPlot = new RadarPlot(array_reverse($dataValuesX));
-
- $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
- $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
- if ($radarStyle == 'filled') {
- $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour]);
- }
- $this->formatPointMarker($seriesPlot, $marker);
- $seriesPlot->SetLegend($dataLabel);
-
- $this->graph->Add($seriesPlot);
- }
- }
-
- private function renderPlotContour($groupID): void
- {
- $contourStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
-
- $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
- $seriesPlots = [];
-
- $dataValues = [];
- // Loop through each data series in turn
- for ($i = 0; $i < $seriesCount; ++$i) {
- $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
- $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
-
- $dataValues[$i] = $dataValuesX;
- }
- $seriesPlot = new ContourPlot($dataValues);
-
- $this->graph->Add($seriesPlot);
- }
-
- private function renderPlotStock($groupID): void
- {
- $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
- $plotOrder = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder();
-
- $dataValues = [];
- // Loop through each data series in turn and build the plot arrays
- foreach ($plotOrder as $i => $v) {
- $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($v)->getDataValues();
- foreach ($dataValuesX as $j => $dataValueX) {
- $dataValues[$plotOrder[$i]][$j] = $dataValueX;
- }
- }
- if (empty($dataValues)) {
- return;
- }
-
- $dataValuesPlot = [];
- // Flatten the plot arrays to a single dimensional array to work with jpgraph
- $jMax = count($dataValues[0]);
- for ($j = 0; $j < $jMax; ++$j) {
- for ($i = 0; $i < $seriesCount; ++$i) {
- $dataValuesPlot[] = $dataValues[$i][$j];
- }
- }
-
- // Set the x-axis labels
- $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount();
- if ($labelCount > 0) {
- $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
- $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);
- $this->graph->xaxis->SetTickLabels($datasetLabels);
- }
-
- $seriesPlot = new StockPlot($dataValuesPlot);
- $seriesPlot->SetWidth(20);
-
- $this->graph->Add($seriesPlot);
- }
-
- private function renderAreaChart($groupCount, $dimensions = '2d'): void
- {
- $this->renderCartesianPlotArea();
-
- for ($i = 0; $i < $groupCount; ++$i) {
- $this->renderPlotLine($i, true, false, $dimensions);
- }
- }
-
- private function renderLineChart($groupCount, $dimensions = '2d'): void
- {
- $this->renderCartesianPlotArea();
-
- for ($i = 0; $i < $groupCount; ++$i) {
- $this->renderPlotLine($i, false, false, $dimensions);
- }
- }
-
- private function renderBarChart($groupCount, $dimensions = '2d'): void
- {
- $this->renderCartesianPlotArea();
-
- for ($i = 0; $i < $groupCount; ++$i) {
- $this->renderPlotBar($i, $dimensions);
- }
- }
-
- private function renderScatterChart($groupCount): void
- {
- $this->renderCartesianPlotArea('linlin');
-
- for ($i = 0; $i < $groupCount; ++$i) {
- $this->renderPlotScatter($i, false);
- }
- }
-
- private function renderBubbleChart($groupCount): void
- {
- $this->renderCartesianPlotArea('linlin');
-
- for ($i = 0; $i < $groupCount; ++$i) {
- $this->renderPlotScatter($i, true);
- }
- }
-
- private function renderPieChart($groupCount, $dimensions = '2d', $doughnut = false, $multiplePlots = false): void
- {
- $this->renderPiePlotArea();
-
- $iLimit = ($multiplePlots) ? $groupCount : 1;
- for ($groupID = 0; $groupID < $iLimit; ++$groupID) {
- $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
- $exploded = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
- $datasetLabels = [];
- if ($groupID == 0) {
- $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount();
- if ($labelCount > 0) {
- $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
- $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount);
- }
- }
-
- $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
- $seriesPlots = [];
- // For pie charts, we only display the first series: doughnut charts generally display all series
- $jLimit = ($multiplePlots) ? $seriesCount : 1;
- // Loop through each data series in turn
- for ($j = 0; $j < $jLimit; ++$j) {
- $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();
-
- // Fill in any missing values in the $dataValues array
- $testCurrentIndex = 0;
- foreach ($dataValues as $k => $dataValue) {
- while ($k != $testCurrentIndex) {
- $dataValues[$testCurrentIndex] = null;
- ++$testCurrentIndex;
- }
- ++$testCurrentIndex;
- }
-
- if ($dimensions == '3d') {
- $seriesPlot = new PiePlot3D($dataValues);
- } else {
- if ($doughnut) {
- $seriesPlot = new PiePlotC($dataValues);
- } else {
- $seriesPlot = new PiePlot($dataValues);
- }
- }
-
- if ($multiplePlots) {
- $seriesPlot->SetSize(($jLimit - $j) / ($jLimit * 4));
- }
-
- if ($doughnut) {
- $seriesPlot->SetMidColor('white');
- }
-
- $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
- if (count($datasetLabels) > 0) {
- $seriesPlot->SetLabels(array_fill(0, count($datasetLabels), ''));
- }
- if ($dimensions != '3d') {
- $seriesPlot->SetGuideLines(false);
- }
- if ($j == 0) {
- if ($exploded) {
- $seriesPlot->ExplodeAll();
- }
- $seriesPlot->SetLegends($datasetLabels);
- }
-
- $this->graph->Add($seriesPlot);
- }
- }
- }
-
- private function renderRadarChart($groupCount): void
- {
- $this->renderRadarPlotArea();
-
- for ($groupID = 0; $groupID < $groupCount; ++$groupID) {
- $this->renderPlotRadar($groupID);
- }
- }
-
- private function renderStockChart($groupCount): void
- {
- $this->renderCartesianPlotArea('intint');
-
- for ($groupID = 0; $groupID < $groupCount; ++$groupID) {
- $this->renderPlotStock($groupID);
- }
- }
-
- private function renderContourChart($groupCount, $dimensions): void
- {
- $this->renderCartesianPlotArea('intint');
-
- for ($i = 0; $i < $groupCount; ++$i) {
- $this->renderPlotContour($i);
- }
- }
-
- private function renderCombinationChart($groupCount, $dimensions, $outputDestination)
- {
- $this->renderCartesianPlotArea();
-
- for ($i = 0; $i < $groupCount; ++$i) {
- $dimensions = null;
- $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
- switch ($chartType) {
- case 'area3DChart':
- $dimensions = '3d';
- // no break
- case 'areaChart':
- $this->renderPlotLine($i, true, true, $dimensions);
-
- break;
- case 'bar3DChart':
- $dimensions = '3d';
- // no break
- case 'barChart':
- $this->renderPlotBar($i, $dimensions);
-
- break;
- case 'line3DChart':
- $dimensions = '3d';
- // no break
- case 'lineChart':
- $this->renderPlotLine($i, false, true, $dimensions);
-
- break;
- case 'scatterChart':
- $this->renderPlotScatter($i, false);
-
- break;
- case 'bubbleChart':
- $this->renderPlotScatter($i, true);
-
- break;
- default:
- $this->graph = null;
-
- return false;
- }
- }
-
- $this->renderLegend();
-
- $this->graph->Stroke($outputDestination);
-
- return true;
- }
-
- public function render($outputDestination)
- {
- self::$plotColour = 0;
-
- $groupCount = $this->chart->getPlotArea()->getPlotGroupCount();
-
- $dimensions = null;
- if ($groupCount == 1) {
- $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType();
- } else {
- $chartTypes = [];
- for ($i = 0; $i < $groupCount; ++$i) {
- $chartTypes[] = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
- }
- $chartTypes = array_unique($chartTypes);
- if (count($chartTypes) == 1) {
- $chartType = array_pop($chartTypes);
- } elseif (count($chartTypes) == 0) {
- echo 'Chart is not yet implemented
';
-
- return false;
- } else {
- return $this->renderCombinationChart($groupCount, $dimensions, $outputDestination);
- }
- }
-
- switch ($chartType) {
- case 'area3DChart':
- $dimensions = '3d';
- // no break
- case 'areaChart':
- $this->renderAreaChart($groupCount, $dimensions);
-
- break;
- case 'bar3DChart':
- $dimensions = '3d';
- // no break
- case 'barChart':
- $this->renderBarChart($groupCount, $dimensions);
-
- break;
- case 'line3DChart':
- $dimensions = '3d';
- // no break
- case 'lineChart':
- $this->renderLineChart($groupCount, $dimensions);
-
- break;
- case 'pie3DChart':
- $dimensions = '3d';
- // no break
- case 'pieChart':
- $this->renderPieChart($groupCount, $dimensions, false, false);
-
- break;
- case 'doughnut3DChart':
- $dimensions = '3d';
- // no break
- case 'doughnutChart':
- $this->renderPieChart($groupCount, $dimensions, true, true);
-
- break;
- case 'scatterChart':
- $this->renderScatterChart($groupCount);
-
- break;
- case 'bubbleChart':
- $this->renderBubbleChart($groupCount);
-
- break;
- case 'radarChart':
- $this->renderRadarChart($groupCount);
-
- break;
- case 'surface3DChart':
- $dimensions = '3d';
- // no break
- case 'surfaceChart':
- $this->renderContourChart($groupCount, $dimensions);
-
- break;
- case 'stockChart':
- $this->renderStockChart($groupCount);
-
- break;
- default:
- echo $chartType . ' is not yet implemented
';
-
- return false;
- }
- $this->renderLegend();
-
- $this->graph->Stroke($outputDestination);
-
- return true;
- }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php
new file mode 100644
index 000000000..cb9b544b8
--- /dev/null
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php
@@ -0,0 +1,852 @@
+graph = null;
+ $this->chart = $chart;
+
+ self::$markSet = [
+ 'diamond' => MARK_DIAMOND,
+ 'square' => MARK_SQUARE,
+ 'triangle' => MARK_UTRIANGLE,
+ 'x' => MARK_X,
+ 'star' => MARK_STAR,
+ 'dot' => MARK_FILLEDCIRCLE,
+ 'dash' => MARK_DTRIANGLE,
+ 'circle' => MARK_CIRCLE,
+ 'plus' => MARK_CROSS,
+ ];
+ }
+
+ /**
+ * This method should be overriden in descendants to do real JpGraph library initialization.
+ */
+ abstract protected static function init(): void;
+
+ private function formatPointMarker($seriesPlot, $markerID)
+ {
+ $plotMarkKeys = array_keys(self::$markSet);
+ if ($markerID === null) {
+ // Use default plot marker (next marker in the series)
+ self::$plotMark %= count(self::$markSet);
+ $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]);
+ } elseif ($markerID !== 'none') {
+ // Use specified plot marker (if it exists)
+ if (isset(self::$markSet[$markerID])) {
+ $seriesPlot->mark->SetType(self::$markSet[$markerID]);
+ } else {
+ // If the specified plot marker doesn't exist, use default plot marker (next marker in the series)
+ self::$plotMark %= count(self::$markSet);
+ $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]);
+ }
+ } else {
+ // Hide plot marker
+ $seriesPlot->mark->Hide();
+ }
+ $seriesPlot->mark->SetColor(self::$colourSet[self::$plotColour]);
+ $seriesPlot->mark->SetFillColor(self::$colourSet[self::$plotColour]);
+ $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
+
+ return $seriesPlot;
+ }
+
+ private function formatDataSetLabels($groupID, $datasetLabels, $rotation = '')
+ {
+ $datasetLabelFormatCode = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode() ?? '';
+ // Retrieve any label formatting code
+ $datasetLabelFormatCode = stripslashes($datasetLabelFormatCode);
+
+ $testCurrentIndex = 0;
+ foreach ($datasetLabels as $i => $datasetLabel) {
+ if (is_array($datasetLabel)) {
+ if ($rotation == 'bar') {
+ $datasetLabels[$i] = implode(' ', $datasetLabel);
+ } else {
+ $datasetLabel = array_reverse($datasetLabel);
+ $datasetLabels[$i] = implode("\n", $datasetLabel);
+ }
+ } else {
+ // Format labels according to any formatting code
+ if ($datasetLabelFormatCode !== null) {
+ $datasetLabels[$i] = NumberFormat::toFormattedString($datasetLabel, $datasetLabelFormatCode);
+ }
+ }
+ ++$testCurrentIndex;
+ }
+
+ return $datasetLabels;
+ }
+
+ private function percentageSumCalculation($groupID, $seriesCount)
+ {
+ $sumValues = [];
+ // Adjust our values to a percentage value across all series in the group
+ for ($i = 0; $i < $seriesCount; ++$i) {
+ if ($i == 0) {
+ $sumValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
+ } else {
+ $nextValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
+ foreach ($nextValues as $k => $value) {
+ if (isset($sumValues[$k])) {
+ $sumValues[$k] += $value;
+ } else {
+ $sumValues[$k] = $value;
+ }
+ }
+ }
+ }
+
+ return $sumValues;
+ }
+
+ private function percentageAdjustValues($dataValues, $sumValues)
+ {
+ foreach ($dataValues as $k => $dataValue) {
+ $dataValues[$k] = $dataValue / $sumValues[$k] * 100;
+ }
+
+ return $dataValues;
+ }
+
+ private function getCaption($captionElement)
+ {
+ // Read any caption
+ $caption = ($captionElement !== null) ? $captionElement->getCaption() : null;
+ // Test if we have a title caption to display
+ if ($caption !== null) {
+ // If we do, it could be a plain string or an array
+ if (is_array($caption)) {
+ // Implode an array to a plain string
+ $caption = implode('', $caption);
+ }
+ }
+
+ return $caption;
+ }
+
+ private function renderTitle(): void
+ {
+ $title = $this->getCaption($this->chart->getTitle());
+ if ($title !== null) {
+ $this->graph->title->Set($title);
+ }
+ }
+
+ private function renderLegend(): void
+ {
+ $legend = $this->chart->getLegend();
+ if ($legend !== null) {
+ $legendPosition = $legend->getPosition();
+ switch ($legendPosition) {
+ case 'r':
+ $this->graph->legend->SetPos(0.01, 0.5, 'right', 'center'); // right
+ $this->graph->legend->SetColumns(1);
+
+ break;
+ case 'l':
+ $this->graph->legend->SetPos(0.01, 0.5, 'left', 'center'); // left
+ $this->graph->legend->SetColumns(1);
+
+ break;
+ case 't':
+ $this->graph->legend->SetPos(0.5, 0.01, 'center', 'top'); // top
+
+ break;
+ case 'b':
+ $this->graph->legend->SetPos(0.5, 0.99, 'center', 'bottom'); // bottom
+
+ break;
+ default:
+ $this->graph->legend->SetPos(0.01, 0.01, 'right', 'top'); // top-right
+ $this->graph->legend->SetColumns(1);
+
+ break;
+ }
+ } else {
+ $this->graph->legend->Hide();
+ }
+ }
+
+ private function renderCartesianPlotArea($type = 'textlin'): void
+ {
+ $this->graph = new Graph(self::$width, self::$height);
+ $this->graph->SetScale($type);
+
+ $this->renderTitle();
+
+ // Rotate for bar rather than column chart
+ $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotDirection();
+ $reverse = $rotation == 'bar';
+
+ $xAxisLabel = $this->chart->getXAxisLabel();
+ if ($xAxisLabel !== null) {
+ $title = $this->getCaption($xAxisLabel);
+ if ($title !== null) {
+ $this->graph->xaxis->SetTitle($title, 'center');
+ $this->graph->xaxis->title->SetMargin(35);
+ if ($reverse) {
+ $this->graph->xaxis->title->SetAngle(90);
+ $this->graph->xaxis->title->SetMargin(90);
+ }
+ }
+ }
+
+ $yAxisLabel = $this->chart->getYAxisLabel();
+ if ($yAxisLabel !== null) {
+ $title = $this->getCaption($yAxisLabel);
+ if ($title !== null) {
+ $this->graph->yaxis->SetTitle($title, 'center');
+ if ($reverse) {
+ $this->graph->yaxis->title->SetAngle(0);
+ $this->graph->yaxis->title->SetMargin(-55);
+ }
+ }
+ }
+ }
+
+ private function renderPiePlotArea(): void
+ {
+ $this->graph = new PieGraph(self::$width, self::$height);
+
+ $this->renderTitle();
+ }
+
+ private function renderRadarPlotArea(): void
+ {
+ $this->graph = new RadarGraph(self::$width, self::$height);
+ $this->graph->SetScale('lin');
+
+ $this->renderTitle();
+ }
+
+ private function renderPlotLine($groupID, $filled = false, $combination = false): void
+ {
+ $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
+
+ $index = array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[0];
+ $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getPointCount();
+ if ($labelCount > 0) {
+ $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
+ $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels);
+ $this->graph->xaxis->SetTickLabels($datasetLabels);
+ }
+
+ $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
+ $seriesPlots = [];
+ if ($grouping == 'percentStacked') {
+ $sumValues = $this->percentageSumCalculation($groupID, $seriesCount);
+ } else {
+ $sumValues = [];
+ }
+
+ // Loop through each data series in turn
+ for ($i = 0; $i < $seriesCount; ++$i) {
+ $index = array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[$i];
+ $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getDataValues();
+ $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getPointMarker();
+
+ if ($grouping == 'percentStacked') {
+ $dataValues = $this->percentageAdjustValues($dataValues, $sumValues);
+ }
+
+ // Fill in any missing values in the $dataValues array
+ $testCurrentIndex = 0;
+ foreach ($dataValues as $k => $dataValue) {
+ while ($k != $testCurrentIndex) {
+ $dataValues[$testCurrentIndex] = null;
+ ++$testCurrentIndex;
+ }
+ ++$testCurrentIndex;
+ }
+
+ $seriesPlot = new LinePlot($dataValues);
+ if ($combination) {
+ $seriesPlot->SetBarCenter();
+ }
+
+ if ($filled) {
+ $seriesPlot->SetFilled(true);
+ $seriesPlot->SetColor('black');
+ $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]);
+ } else {
+ // Set the appropriate plot marker
+ $this->formatPointMarker($seriesPlot, $marker);
+ }
+ $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)->getDataValue();
+ $seriesPlot->SetLegend($dataLabel);
+
+ $seriesPlots[] = $seriesPlot;
+ }
+
+ if ($grouping == 'standard') {
+ $groupPlot = $seriesPlots;
+ } else {
+ $groupPlot = new AccLinePlot($seriesPlots);
+ }
+ $this->graph->Add($groupPlot);
+ }
+
+ private function renderPlotBar($groupID, $dimensions = '2d'): void
+ {
+ $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotDirection();
+ // Rotate for bar rather than column chart
+ if (($groupID == 0) && ($rotation == 'bar')) {
+ $this->graph->Set90AndMargin();
+ }
+ $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping();
+
+ $index = array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[0];
+ $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getPointCount();
+ if ($labelCount > 0) {
+ $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
+ $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $rotation);
+ // Rotate for bar rather than column chart
+ if ($rotation == 'bar') {
+ $datasetLabels = array_reverse($datasetLabels);
+ $this->graph->yaxis->SetPos('max');
+ $this->graph->yaxis->SetLabelAlign('center', 'top');
+ $this->graph->yaxis->SetLabelSide(SIDE_RIGHT);
+ }
+ $this->graph->xaxis->SetTickLabels($datasetLabels);
+ }
+
+ $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
+ $seriesPlots = [];
+ if ($grouping == 'percentStacked') {
+ $sumValues = $this->percentageSumCalculation($groupID, $seriesCount);
+ } else {
+ $sumValues = [];
+ }
+
+ // Loop through each data series in turn
+ for ($j = 0; $j < $seriesCount; ++$j) {
+ $index = array_keys($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder())[$j];
+ $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($index)->getDataValues();
+ if ($grouping == 'percentStacked') {
+ $dataValues = $this->percentageAdjustValues($dataValues, $sumValues);
+ }
+
+ // Fill in any missing values in the $dataValues array
+ $testCurrentIndex = 0;
+ foreach ($dataValues as $k => $dataValue) {
+ while ($k != $testCurrentIndex) {
+ $dataValues[$testCurrentIndex] = null;
+ ++$testCurrentIndex;
+ }
+ ++$testCurrentIndex;
+ }
+
+ // Reverse the $dataValues order for bar rather than column chart
+ if ($rotation == 'bar') {
+ $dataValues = array_reverse($dataValues);
+ }
+ $seriesPlot = new BarPlot($dataValues);
+ $seriesPlot->SetColor('black');
+ $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]);
+ if ($dimensions == '3d') {
+ $seriesPlot->SetShadow();
+ }
+ if (!$this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) {
+ $dataLabel = '';
+ } else {
+ $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue();
+ }
+ $seriesPlot->SetLegend($dataLabel);
+
+ $seriesPlots[] = $seriesPlot;
+ }
+ // Reverse the plot order for bar rather than column chart
+ if (($rotation == 'bar') && ($grouping != 'percentStacked')) {
+ $seriesPlots = array_reverse($seriesPlots);
+ }
+
+ if ($grouping == 'clustered') {
+ $groupPlot = new GroupBarPlot($seriesPlots);
+ } elseif ($grouping == 'standard') {
+ $groupPlot = new GroupBarPlot($seriesPlots);
+ } else {
+ $groupPlot = new AccBarPlot($seriesPlots);
+ if ($dimensions == '3d') {
+ $groupPlot->SetShadow();
+ }
+ }
+
+ $this->graph->Add($groupPlot);
+ }
+
+ private function renderPlotScatter($groupID, $bubble): void
+ {
+ $scatterStyle = $bubbleSize = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
+
+ $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
+
+ // Loop through each data series in turn
+ for ($i = 0; $i < $seriesCount; ++$i) {
+ $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
+ $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
+
+ foreach ($dataValuesY as $k => $dataValueY) {
+ $dataValuesY[$k] = $k;
+ }
+
+ $seriesPlot = new ScatterPlot($dataValuesX, $dataValuesY);
+ if ($scatterStyle == 'lineMarker') {
+ $seriesPlot->SetLinkPoints();
+ $seriesPlot->link->SetColor(self::$colourSet[self::$plotColour]);
+ } elseif ($scatterStyle == 'smoothMarker') {
+ $spline = new Spline($dataValuesY, $dataValuesX);
+ [$splineDataY, $splineDataX] = $spline->Get(count($dataValuesX) * self::$width / 20);
+ $lplot = new LinePlot($splineDataX, $splineDataY);
+ $lplot->SetColor(self::$colourSet[self::$plotColour]);
+
+ $this->graph->Add($lplot);
+ }
+
+ if ($bubble) {
+ $this->formatPointMarker($seriesPlot, 'dot');
+ $seriesPlot->mark->SetColor('black');
+ $seriesPlot->mark->SetSize($bubbleSize);
+ } else {
+ $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
+ $this->formatPointMarker($seriesPlot, $marker);
+ }
+ $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
+ $seriesPlot->SetLegend($dataLabel);
+
+ $this->graph->Add($seriesPlot);
+ }
+ }
+
+ private function renderPlotRadar($groupID): void
+ {
+ $radarStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
+
+ $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
+
+ // Loop through each data series in turn
+ for ($i = 0; $i < $seriesCount; ++$i) {
+ $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues();
+ $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
+ $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker();
+
+ $dataValues = [];
+ foreach ($dataValuesY as $k => $dataValueY) {
+ $dataValues[$k] = implode(' ', array_reverse($dataValueY));
+ }
+ $tmp = array_shift($dataValues);
+ $dataValues[] = $tmp;
+ $tmp = array_shift($dataValuesX);
+ $dataValuesX[] = $tmp;
+
+ $this->graph->SetTitles(array_reverse($dataValues));
+
+ $seriesPlot = new RadarPlot(array_reverse($dataValuesX));
+
+ $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue();
+ $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
+ if ($radarStyle == 'filled') {
+ $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour]);
+ }
+ $this->formatPointMarker($seriesPlot, $marker);
+ $seriesPlot->SetLegend($dataLabel);
+
+ $this->graph->Add($seriesPlot);
+ }
+ }
+
+ private function renderPlotContour($groupID): void
+ {
+ $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
+
+ $dataValues = [];
+ // Loop through each data series in turn
+ for ($i = 0; $i < $seriesCount; ++$i) {
+ $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues();
+
+ $dataValues[$i] = $dataValuesX;
+ }
+ $seriesPlot = new ContourPlot($dataValues);
+
+ $this->graph->Add($seriesPlot);
+ }
+
+ private function renderPlotStock($groupID): void
+ {
+ $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
+ $plotOrder = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder();
+
+ $dataValues = [];
+ // Loop through each data series in turn and build the plot arrays
+ foreach ($plotOrder as $i => $v) {
+ $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($v);
+ if ($dataValuesX === false) {
+ continue;
+ }
+ $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($v)->getDataValues();
+ foreach ($dataValuesX as $j => $dataValueX) {
+ $dataValues[$plotOrder[$i]][$j] = $dataValueX;
+ }
+ }
+ if (empty($dataValues)) {
+ return;
+ }
+
+ $dataValuesPlot = [];
+ // Flatten the plot arrays to a single dimensional array to work with jpgraph
+ $jMax = count($dataValues[0]);
+ for ($j = 0; $j < $jMax; ++$j) {
+ for ($i = 0; $i < $seriesCount; ++$i) {
+ $dataValuesPlot[] = $dataValues[$i][$j] ?? null;
+ }
+ }
+
+ // Set the x-axis labels
+ $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount();
+ if ($labelCount > 0) {
+ $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
+ $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels);
+ $this->graph->xaxis->SetTickLabels($datasetLabels);
+ }
+
+ $seriesPlot = new StockPlot($dataValuesPlot);
+ $seriesPlot->SetWidth(20);
+
+ $this->graph->Add($seriesPlot);
+ }
+
+ private function renderAreaChart($groupCount): void
+ {
+ $this->renderCartesianPlotArea();
+
+ for ($i = 0; $i < $groupCount; ++$i) {
+ $this->renderPlotLine($i, true, false);
+ }
+ }
+
+ private function renderLineChart($groupCount): void
+ {
+ $this->renderCartesianPlotArea();
+
+ for ($i = 0; $i < $groupCount; ++$i) {
+ $this->renderPlotLine($i, false, false);
+ }
+ }
+
+ private function renderBarChart($groupCount, $dimensions = '2d'): void
+ {
+ $this->renderCartesianPlotArea();
+
+ for ($i = 0; $i < $groupCount; ++$i) {
+ $this->renderPlotBar($i, $dimensions);
+ }
+ }
+
+ private function renderScatterChart($groupCount): void
+ {
+ $this->renderCartesianPlotArea('linlin');
+
+ for ($i = 0; $i < $groupCount; ++$i) {
+ $this->renderPlotScatter($i, false);
+ }
+ }
+
+ private function renderBubbleChart($groupCount): void
+ {
+ $this->renderCartesianPlotArea('linlin');
+
+ for ($i = 0; $i < $groupCount; ++$i) {
+ $this->renderPlotScatter($i, true);
+ }
+ }
+
+ private function renderPieChart($groupCount, $dimensions = '2d', $doughnut = false, $multiplePlots = false): void
+ {
+ $this->renderPiePlotArea();
+
+ $iLimit = ($multiplePlots) ? $groupCount : 1;
+ for ($groupID = 0; $groupID < $iLimit; ++$groupID) {
+ $exploded = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle();
+ $datasetLabels = [];
+ if ($groupID == 0) {
+ $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount();
+ if ($labelCount > 0) {
+ $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues();
+ $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels);
+ }
+ }
+
+ $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount();
+ // For pie charts, we only display the first series: doughnut charts generally display all series
+ $jLimit = ($multiplePlots) ? $seriesCount : 1;
+ // Loop through each data series in turn
+ for ($j = 0; $j < $jLimit; ++$j) {
+ $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues();
+
+ // Fill in any missing values in the $dataValues array
+ $testCurrentIndex = 0;
+ foreach ($dataValues as $k => $dataValue) {
+ while ($k != $testCurrentIndex) {
+ $dataValues[$testCurrentIndex] = null;
+ ++$testCurrentIndex;
+ }
+ ++$testCurrentIndex;
+ }
+
+ if ($dimensions == '3d') {
+ $seriesPlot = new PiePlot3D($dataValues);
+ } else {
+ if ($doughnut) {
+ $seriesPlot = new PiePlotC($dataValues);
+ } else {
+ $seriesPlot = new PiePlot($dataValues);
+ }
+ }
+
+ if ($multiplePlots) {
+ $seriesPlot->SetSize(($jLimit - $j) / ($jLimit * 4));
+ }
+
+ if ($doughnut && method_exists($seriesPlot, 'SetMidColor')) {
+ $seriesPlot->SetMidColor('white');
+ }
+
+ $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]);
+ if (count($datasetLabels) > 0) {
+ $seriesPlot->SetLabels(array_fill(0, count($datasetLabels), ''));
+ }
+ if ($dimensions != '3d') {
+ $seriesPlot->SetGuideLines(false);
+ }
+ if ($j == 0) {
+ if ($exploded) {
+ $seriesPlot->ExplodeAll();
+ }
+ $seriesPlot->SetLegends($datasetLabels);
+ }
+
+ $this->graph->Add($seriesPlot);
+ }
+ }
+ }
+
+ private function renderRadarChart($groupCount): void
+ {
+ $this->renderRadarPlotArea();
+
+ for ($groupID = 0; $groupID < $groupCount; ++$groupID) {
+ $this->renderPlotRadar($groupID);
+ }
+ }
+
+ private function renderStockChart($groupCount): void
+ {
+ $this->renderCartesianPlotArea('intint');
+
+ for ($groupID = 0; $groupID < $groupCount; ++$groupID) {
+ $this->renderPlotStock($groupID);
+ }
+ }
+
+ private function renderContourChart($groupCount): void
+ {
+ $this->renderCartesianPlotArea('intint');
+
+ for ($i = 0; $i < $groupCount; ++$i) {
+ $this->renderPlotContour($i);
+ }
+ }
+
+ private function renderCombinationChart($groupCount, $outputDestination)
+ {
+ $this->renderCartesianPlotArea();
+
+ for ($i = 0; $i < $groupCount; ++$i) {
+ $dimensions = null;
+ $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
+ switch ($chartType) {
+ case 'area3DChart':
+ case 'areaChart':
+ $this->renderPlotLine($i, true, true);
+
+ break;
+ case 'bar3DChart':
+ $dimensions = '3d';
+ // no break
+ case 'barChart':
+ $this->renderPlotBar($i, $dimensions);
+
+ break;
+ case 'line3DChart':
+ case 'lineChart':
+ $this->renderPlotLine($i, false, true);
+
+ break;
+ case 'scatterChart':
+ $this->renderPlotScatter($i, false);
+
+ break;
+ case 'bubbleChart':
+ $this->renderPlotScatter($i, true);
+
+ break;
+ default:
+ $this->graph = null;
+
+ return false;
+ }
+ }
+
+ $this->renderLegend();
+
+ $this->graph->Stroke($outputDestination);
+
+ return true;
+ }
+
+ public function render($outputDestination)
+ {
+ self::$plotColour = 0;
+
+ $groupCount = $this->chart->getPlotArea()->getPlotGroupCount();
+
+ $dimensions = null;
+ if ($groupCount == 1) {
+ $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType();
+ } else {
+ $chartTypes = [];
+ for ($i = 0; $i < $groupCount; ++$i) {
+ $chartTypes[] = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType();
+ }
+ $chartTypes = array_unique($chartTypes);
+ if (count($chartTypes) == 1) {
+ $chartType = array_pop($chartTypes);
+ } elseif (count($chartTypes) == 0) {
+ echo 'Chart is not yet implemented
';
+
+ return false;
+ } else {
+ return $this->renderCombinationChart($groupCount, $outputDestination);
+ }
+ }
+
+ switch ($chartType) {
+ case 'area3DChart':
+ $dimensions = '3d';
+ // no break
+ case 'areaChart':
+ $this->renderAreaChart($groupCount);
+
+ break;
+ case 'bar3DChart':
+ $dimensions = '3d';
+ // no break
+ case 'barChart':
+ $this->renderBarChart($groupCount, $dimensions);
+
+ break;
+ case 'line3DChart':
+ $dimensions = '3d';
+ // no break
+ case 'lineChart':
+ $this->renderLineChart($groupCount);
+
+ break;
+ case 'pie3DChart':
+ $dimensions = '3d';
+ // no break
+ case 'pieChart':
+ $this->renderPieChart($groupCount, $dimensions, false, false);
+
+ break;
+ case 'doughnut3DChart':
+ $dimensions = '3d';
+ // no break
+ case 'doughnutChart':
+ $this->renderPieChart($groupCount, $dimensions, true, true);
+
+ break;
+ case 'scatterChart':
+ $this->renderScatterChart($groupCount);
+
+ break;
+ case 'bubbleChart':
+ $this->renderBubbleChart($groupCount);
+
+ break;
+ case 'radarChart':
+ $this->renderRadarChart($groupCount);
+
+ break;
+ case 'surface3DChart':
+ case 'surfaceChart':
+ $this->renderContourChart($groupCount);
+
+ break;
+ case 'stockChart':
+ $this->renderStockChart($groupCount);
+
+ break;
+ default:
+ echo $chartType . ' is not yet implemented
';
+
+ return false;
+ }
+ $this->renderLegend();
+
+ $this->graph->Stroke($outputDestination);
+
+ return true;
+ }
+}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/MtJpGraphRenderer.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/MtJpGraphRenderer.php
new file mode 100644
index 000000000..e1f0f90ad
--- /dev/null
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/MtJpGraphRenderer.php
@@ -0,0 +1,36 @@
+setTrendLineProperties(
+ $trendLineType,
+ $order,
+ $period,
+ $dispRSqr,
+ $dispEq,
+ $backward,
+ $forward,
+ $intercept,
+ $name
+ );
+ }
+
+ public function getTrendLineType(): string
+ {
+ return $this->trendLineType;
+ }
+
+ public function setTrendLineType(string $trendLineType): self
+ {
+ $this->trendLineType = $trendLineType;
+
+ return $this;
+ }
+
+ public function getOrder(): int
+ {
+ return $this->order;
+ }
+
+ public function setOrder(int $order): self
+ {
+ $this->order = $order;
+
+ return $this;
+ }
+
+ public function getPeriod(): int
+ {
+ return $this->period;
+ }
+
+ public function setPeriod(int $period): self
+ {
+ $this->period = $period;
+
+ return $this;
+ }
+
+ public function getDispRSqr(): bool
+ {
+ return $this->dispRSqr;
+ }
+
+ public function setDispRSqr(bool $dispRSqr): self
+ {
+ $this->dispRSqr = $dispRSqr;
+
+ return $this;
+ }
+
+ public function getDispEq(): bool
+ {
+ return $this->dispEq;
+ }
+
+ public function setDispEq(bool $dispEq): self
+ {
+ $this->dispEq = $dispEq;
+
+ return $this;
+ }
+
+ public function getName(): string
+ {
+ return $this->name;
+ }
+
+ public function setName(string $name): self
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ public function getBackward(): float
+ {
+ return $this->backward;
+ }
+
+ public function setBackward(float $backward): self
+ {
+ $this->backward = $backward;
+
+ return $this;
+ }
+
+ public function getForward(): float
+ {
+ return $this->forward;
+ }
+
+ public function setForward(float $forward): self
+ {
+ $this->forward = $forward;
+
+ return $this;
+ }
+
+ public function getIntercept(): float
+ {
+ return $this->intercept;
+ }
+
+ public function setIntercept(float $intercept): self
+ {
+ $this->intercept = $intercept;
+
+ return $this;
+ }
+
+ public function setTrendLineProperties(
+ ?string $trendLineType = null,
+ ?int $order = 0,
+ ?int $period = 0,
+ ?bool $dispRSqr = false,
+ ?bool $dispEq = false,
+ ?float $backward = null,
+ ?float $forward = null,
+ ?float $intercept = null,
+ ?string $name = null
+ ): self {
+ if (!empty($trendLineType)) {
+ $this->setTrendLineType($trendLineType);
+ }
+ if ($order !== null) {
+ $this->setOrder($order);
+ }
+ if ($period !== null) {
+ $this->setPeriod($period);
+ }
+ if ($dispRSqr !== null) {
+ $this->setDispRSqr($dispRSqr);
+ }
+ if ($dispEq !== null) {
+ $this->setDispEq($dispEq);
+ }
+ if ($backward !== null) {
+ $this->setBackward($backward);
+ }
+ if ($forward !== null) {
+ $this->setForward($forward);
+ }
+ if ($intercept !== null) {
+ $this->setIntercept($intercept);
+ }
+ if ($name !== null) {
+ $this->setName($name);
+ }
+
+ return $this;
+ }
+}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php
index 20fccf48a..82c9ae1ae 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php
@@ -91,10 +91,8 @@ class Cells
* Whether the collection holds a cell for the given coordinate.
*
* @param string $cellCoordinate Coordinate of the cell to check
- *
- * @return bool
*/
- public function has($cellCoordinate)
+ public function has($cellCoordinate): bool
{
return ($cellCoordinate === $this->currentCoordinate) || isset($this->index[$cellCoordinate]);
}
@@ -103,10 +101,8 @@ class Cells
* Add or update a cell in the collection.
*
* @param Cell $cell Cell to update
- *
- * @return Cell
*/
- public function update(Cell $cell)
+ public function update(Cell $cell): Cell
{
return $this->add($cell->getCoordinate(), $cell);
}
@@ -165,10 +161,8 @@ class Cells
/**
* Return the column coordinate of the currently active cell object.
- *
- * @return string
*/
- public function getCurrentColumn()
+ public function getCurrentColumn(): string
{
sscanf($this->currentCoordinate ?? '', '%[A-Z]%d', $column, $row);
@@ -177,10 +171,8 @@ class Cells
/**
* Return the row coordinate of the currently active cell object.
- *
- * @return int
*/
- public function getCurrentRow()
+ public function getCurrentRow(): int
{
sscanf($this->currentCoordinate ?? '', '%[A-Z]%d', $column, $row);
@@ -276,7 +268,9 @@ class Cells
*/
private function getUniqueID()
{
- return Settings::getCache() instanceof Memory
+ $cacheType = Settings::getCache();
+
+ return ($cacheType instanceof Memory\SimpleCache1 || $cacheType instanceof Memory\SimpleCache3)
? random_bytes(7) . ':'
: uniqid('phpspreadsheet.', true) . '.';
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php
index 26f18dfc5..b3833bd8b 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php
@@ -12,9 +12,8 @@ abstract class CellsFactory
*
* @param Worksheet $worksheet Enable cell caching for this worksheet
*
- * @return Cells
* */
- public static function getInstance(Worksheet $worksheet)
+ public static function getInstance(Worksheet $worksheet): Cells
{
return new Cells($worksheet, Settings::getCache());
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory/SimpleCache1.php
similarity index 93%
rename from vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory.php
rename to vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory/SimpleCache1.php
index 2690ab7d0..a0eb6ec22 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory/SimpleCache1.php
@@ -1,6 +1,6 @@
cache = [];
+
+ return true;
+ }
+
+ /**
+ * @param string $key
+ */
+ public function delete($key): bool
+ {
+ unset($this->cache[$key]);
+
+ return true;
+ }
+
+ /**
+ * @param iterable $keys
+ */
+ public function deleteMultiple($keys): bool
+ {
+ foreach ($keys as $key) {
+ $this->delete($key);
+ }
+
+ return true;
+ }
+
+ /**
+ * @param string $key
+ * @param mixed $default
+ */
+ public function get($key, $default = null): mixed
+ {
+ if ($this->has($key)) {
+ return $this->cache[$key];
+ }
+
+ return $default;
+ }
+
+ /**
+ * @param iterable $keys
+ * @param mixed $default
+ */
+ public function getMultiple($keys, $default = null): iterable
+ {
+ $results = [];
+ foreach ($keys as $key) {
+ $results[$key] = $this->get($key, $default);
+ }
+
+ return $results;
+ }
+
+ /**
+ * @param string $key
+ */
+ public function has($key): bool
+ {
+ return array_key_exists($key, $this->cache);
+ }
+
+ /**
+ * @param string $key
+ * @param mixed $value
+ * @param null|DateInterval|int $ttl
+ */
+ public function set($key, $value, $ttl = null): bool
+ {
+ $this->cache[$key] = $value;
+
+ return true;
+ }
+
+ /**
+ * @param iterable $values
+ * @param null|DateInterval|int $ttl
+ */
+ public function setMultiple($values, $ttl = null): bool
+ {
+ foreach ($values as $key => $value) {
+ $this->set($key, $value);
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DefinedName.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DefinedName.php
index 3b874b435..464fa8e34 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DefinedName.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DefinedName.php
@@ -150,7 +150,7 @@ abstract class DefinedName
// New title
$newTitle = $this->name;
- ReferenceHelper::getInstance()->updateNamedFormulas($this->worksheet->getParent(), $oldTitle, $newTitle);
+ ReferenceHelper::getInstance()->updateNamedFormulae($this->worksheet->getParent(), $oldTitle, $newTitle);
}
return $this;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Dimension.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Dimension.php
index 425c9a616..ff07ce5b8 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Dimension.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Dimension.php
@@ -55,10 +55,20 @@ class Dimension
*/
protected $unit;
+ /**
+ * Phpstan bug has been fixed; this function allows us to
+ * pass Phpstan whether fixed or not.
+ *
+ * @param mixed $value
+ */
+ private static function stanBugFixed($value): array
+ {
+ return is_array($value) ? $value : [null, null];
+ }
+
public function __construct(string $dimension)
{
- // @phpstan-ignore-next-line
- [$size, $unit] = sscanf($dimension, '%[1234567890.]%s');
+ [$size, $unit] = self::stanBugFixed(sscanf($dimension, '%[1234567890.]%s'));
$unit = strtolower(trim($unit ?? ''));
$size = (float) $size;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php
index 8ce37003c..0ac0c7969 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php
@@ -4,6 +4,7 @@ namespace PhpOffice\PhpSpreadsheet\Helper;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Writer\IWriter;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
@@ -84,7 +85,7 @@ class Sample
foreach ($regex as $file) {
$file = str_replace(str_replace('\\', '/', $baseDir) . '/', '', str_replace('\\', '/', $file[0]));
$info = pathinfo($file);
- $category = str_replace('_', ' ', $info['dirname']);
+ $category = str_replace('_', ' ', $info['dirname'] ?? '');
$name = str_replace('_', ' ', (string) preg_replace('/(|\.php)/', '', $info['filename']));
if (!in_array($category, ['.', 'boostrap', 'templates'])) {
if (!isset($files[$category])) {
@@ -182,6 +183,33 @@ class Sample
echo date('H:i:s ') . $message . $eol;
}
+ public function titles(string $category, string $functionName, ?string $description = null): void
+ {
+ $this->log(sprintf('%s Functions:', $category));
+ $description === null
+ ? $this->log(sprintf('Function: %s()', rtrim($functionName, '()')))
+ : $this->log(sprintf('Function: %s() - %s.', rtrim($functionName, '()'), rtrim($description, '.')));
+ }
+
+ public function displayGrid(array $matrix): void
+ {
+ $renderer = new TextGrid($matrix, $this->isCli());
+ echo $renderer->render();
+ }
+
+ public function logCalculationResult(
+ Worksheet $worksheet,
+ string $functionName,
+ string $formulaCell,
+ ?string $descriptionCell = null
+ ): void {
+ if ($descriptionCell !== null) {
+ $this->log($worksheet->getCell($descriptionCell)->getValue());
+ }
+ $this->log($worksheet->getCell($formulaCell)->getValue());
+ $this->log(sprintf('%s() Result is ', $functionName) . $worksheet->getCell($formulaCell)->getCalculatedValue());
+ }
+
/**
* Log ending notes.
*/
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/TextGrid.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/TextGrid.php
new file mode 100644
index 000000000..acb9ae60e
--- /dev/null
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/TextGrid.php
@@ -0,0 +1,139 @@
+rows = array_keys($matrix);
+ $this->columns = array_keys($matrix[$this->rows[0]]);
+
+ $matrix = array_values($matrix);
+ array_walk(
+ $matrix,
+ function (&$row): void {
+ $row = array_values($row);
+ }
+ );
+
+ $this->matrix = $matrix;
+ $this->isCli = $isCli;
+ }
+
+ public function render(): string
+ {
+ $this->gridDisplay = $this->isCli ? '' : '';
+
+ $maxRow = max($this->rows);
+ $maxRowLength = strlen((string) $maxRow) + 1;
+ $columnWidths = $this->getColumnWidths($this->matrix);
+
+ $this->renderColumnHeader($maxRowLength, $columnWidths);
+ $this->renderRows($maxRowLength, $columnWidths);
+ $this->renderFooter($maxRowLength, $columnWidths);
+
+ $this->gridDisplay .= $this->isCli ? '' : '';
+
+ return $this->gridDisplay;
+ }
+
+ private function renderRows(int $maxRowLength, array $columnWidths): void
+ {
+ foreach ($this->matrix as $row => $rowData) {
+ $this->gridDisplay .= '|' . str_pad((string) $this->rows[$row], $maxRowLength, ' ', STR_PAD_LEFT) . ' ';
+ $this->renderCells($rowData, $columnWidths);
+ $this->gridDisplay .= '|' . PHP_EOL;
+ }
+ }
+
+ private function renderCells(array $rowData, array $columnWidths): void
+ {
+ foreach ($rowData as $column => $cell) {
+ $cell = ($this->isCli) ? (string) $cell : htmlentities((string) $cell);
+ $this->gridDisplay .= '| ';
+ $this->gridDisplay .= str_pad($cell, $columnWidths[$column] + 1, ' ');
+ }
+ }
+
+ private function renderColumnHeader(int $maxRowLength, array $columnWidths): void
+ {
+ $this->gridDisplay .= str_repeat(' ', $maxRowLength + 2);
+ foreach ($this->columns as $column => $reference) {
+ $this->gridDisplay .= '+-' . str_repeat('-', $columnWidths[$column] + 1);
+ }
+ $this->gridDisplay .= '+' . PHP_EOL;
+
+ $this->gridDisplay .= str_repeat(' ', $maxRowLength + 2);
+ foreach ($this->columns as $column => $reference) {
+ $this->gridDisplay .= '| ' . str_pad((string) $reference, $columnWidths[$column] + 1, ' ');
+ }
+ $this->gridDisplay .= '|' . PHP_EOL;
+
+ $this->renderFooter($maxRowLength, $columnWidths);
+ }
+
+ private function renderFooter(int $maxRowLength, array $columnWidths): void
+ {
+ $this->gridDisplay .= '+' . str_repeat('-', $maxRowLength + 1);
+ foreach ($this->columns as $column => $reference) {
+ $this->gridDisplay .= '+-';
+ $this->gridDisplay .= str_pad((string) '', $columnWidths[$column] + 1, '-');
+ }
+ $this->gridDisplay .= '+' . PHP_EOL;
+ }
+
+ private function getColumnWidths(array $matrix): array
+ {
+ $columnCount = count($this->matrix, COUNT_RECURSIVE) / count($this->matrix);
+ $columnWidths = [];
+ for ($column = 0; $column < $columnCount; ++$column) {
+ $columnWidths[] = $this->getColumnWidth(array_column($this->matrix, $column));
+ }
+
+ return $columnWidths;
+ }
+
+ private function getColumnWidth(array $columnData): int
+ {
+ $columnWidth = 0;
+ $columnData = array_values($columnData);
+
+ foreach ($columnData as $columnValue) {
+ if (is_string($columnValue)) {
+ $columnWidth = max($columnWidth, strlen($columnValue));
+ } elseif (is_bool($columnValue)) {
+ $columnWidth = max($columnWidth, strlen($columnValue ? 'TRUE' : 'FALSE'));
+ }
+
+ $columnWidth = max($columnWidth, strlen((string) $columnWidth));
+ }
+
+ return $columnWidth;
+ }
+}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric.php
index ca087e615..1dcb0a125 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric.php
@@ -363,7 +363,7 @@ class Gnumeric extends BaseReader
if ($sheet !== null && isset($sheet->MergedRegions)) {
foreach ($sheet->MergedRegions->Merge as $mergeCells) {
if (strpos((string) $mergeCells, ':') !== false) {
- $this->spreadsheet->getActiveSheet()->mergeCells($mergeCells);
+ $this->spreadsheet->getActiveSheet()->mergeCells($mergeCells, Worksheet::MERGE_CELL_CONTENT_HIDE);
}
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php
index 3d859e15f..76f128e02 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php
@@ -201,7 +201,7 @@ class Html extends BaseReader
/**
* Loads Spreadsheet from file.
*/
- protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
+ public function loadSpreadsheetFromFile(string $filename): Spreadsheet
{
// Create new Spreadsheet
$spreadsheet = new Spreadsheet();
@@ -651,7 +651,13 @@ class Html extends BaseReader
// Reload the HTML file into the DOM object
try {
$convert = $this->securityScanner->scanFile($filename);
- $loaded = $dom->loadHTML($convert);
+ $lowend = "\u{80}";
+ $highend = "\u{10ffff}";
+ $regexp = "/[$lowend-$highend]/u";
+ /** @var callable */
+ $callback = [self::class, 'replaceNonAscii'];
+ $convert = preg_replace_callback($regexp, $callback, $convert);
+ $loaded = ($convert === null) ? false : $dom->loadHTML($convert);
} catch (Throwable $e) {
$loaded = false;
}
@@ -662,6 +668,11 @@ class Html extends BaseReader
return $this->loadDocument($dom, $spreadsheet);
}
+ private static function replaceNonAscii(array $matches): string
+ {
+ return '' . mb_ord($matches[0], 'UTF-8') . ';';
+ }
+
/**
* Spreadsheet from content.
*
@@ -674,7 +685,13 @@ class Html extends BaseReader
// Reload the HTML file into the DOM object
try {
$convert = $this->securityScanner->scan($content);
- $loaded = $dom->loadHTML($convert);
+ $lowend = "\u{80}";
+ $highend = "\u{10ffff}";
+ $regexp = "/[$lowend-$highend]/u";
+ /** @var callable */
+ $callback = [self::class, 'replaceNonAscii'];
+ $convert = preg_replace_callback($regexp, $callback, $convert);
+ $loaded = ($convert === null) ? false : $dom->loadHTML($convert);
} catch (Throwable $e) {
$loaded = false;
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods.php
index 7e776ab78..e3de47317 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods.php
@@ -20,6 +20,7 @@ use PhpOffice\PhpSpreadsheet\Shared\Date;
use PhpOffice\PhpSpreadsheet\Shared\File;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
+use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use Throwable;
use XMLReader;
use ZipArchive;
@@ -759,7 +760,7 @@ class Ods extends BaseReader
}
$cellRange = $columnID . $rowID . ':' . $columnTo . $rowTo;
- $spreadsheet->getActiveSheet()->mergeCells($cellRange);
+ $spreadsheet->getActiveSheet()->mergeCells($cellRange, Worksheet::MERGE_CELL_CONTENT_HIDE);
}
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php
index 8155b838f..40008d01d 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php
@@ -52,7 +52,7 @@ class XmlScanner
public static function threadSafeLibxmlDisableEntityLoaderAvailability()
{
- if (PHP_MAJOR_VERSION == 7) {
+ if (PHP_MAJOR_VERSION === 7) {
switch (PHP_MINOR_VERSION) {
case 2:
return PHP_RELEASE_VERSION >= 1;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php
index 9f8a3ace9..a8de52282 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php
@@ -4585,7 +4585,7 @@ class Xls extends BaseReader
(strpos($cellRangeAddress, ':') !== false) &&
($this->includeCellRangeFiltered($cellRangeAddress))
) {
- $this->phpSheet->mergeCells($cellRangeAddress);
+ $this->phpSheet->mergeCells($cellRangeAddress, Worksheet::MERGE_CELL_CONTENT_HIDE);
}
}
}
@@ -6999,7 +6999,7 @@ class Xls extends BaseReader
}
break;
- // Unknown cases // don't know how to deal with
+ // Unknown cases // don't know how to deal with
default:
throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula');
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php
index 52df94e4c..e2fae121b 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php
@@ -31,6 +31,7 @@ use PhpOffice\PhpSpreadsheet\Shared\Font;
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Color;
+use PhpOffice\PhpSpreadsheet\Style\Font as StyleFont;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Style\Style;
use PhpOffice\PhpSpreadsheet\Worksheet\HeaderFooterDrawing;
@@ -293,7 +294,7 @@ class Xlsx extends BaseReader
return $worksheetInfo;
}
- private static function castToBoolean($c)
+ private static function castToBoolean(SimpleXMLElement $c): bool
{
$value = isset($c->v) ? (string) $c->v : null;
if ($value == '0') {
@@ -305,18 +306,25 @@ class Xlsx extends BaseReader
return (bool) $c->v;
}
- private static function castToError($c)
+ private static function castToError(?SimpleXMLElement $c): ?string
{
- return isset($c->v) ? (string) $c->v : null;
+ return isset($c, $c->v) ? (string) $c->v : null;
}
- private static function castToString($c)
+ private static function castToString(?SimpleXMLElement $c): ?string
{
- return isset($c->v) ? (string) $c->v : null;
+ return isset($c, $c->v) ? (string) $c->v : null;
}
- private function castToFormula($c, $r, &$cellDataType, &$value, &$calculatedValue, &$sharedFormulas, $castBaseType): void
+ /**
+ * @param mixed $value
+ * @param mixed $calculatedValue
+ */
+ private function castToFormula(?SimpleXMLElement $c, string $r, string &$cellDataType, &$value, &$calculatedValue, array &$sharedFormulas, string $castBaseType): void
{
+ if ($c === null) {
+ return;
+ }
$attr = $c->f->attributes();
$cellDataType = 'f';
$value = "={$c->f}";
@@ -389,7 +397,7 @@ class Xlsx extends BaseReader
$contents = $archive->getFromName(substr($fileName, 1), 0, ZipArchive::FL_NOCASE);
}
- return $contents;
+ return ($contents === false) ? '' : $contents;
}
/**
@@ -479,7 +487,7 @@ class Xlsx extends BaseReader
$propertyReader->readCustomProperties($this->getFromZipArchive($zip, $relTarget));
break;
- //Ribbon
+ //Ribbon
case Namespaces::EXTENSIBILITY:
$customUI = $relTarget;
if ($customUI) {
@@ -530,7 +538,7 @@ class Xlsx extends BaseReader
}
break;
- // a vbaProject ? (: some macros)
+ // a vbaProject ? (: some macros)
case Namespaces::VBA:
$macros = $ele['Target'];
@@ -906,7 +914,7 @@ class Xlsx extends BaseReader
foreach ($xmlSheet->mergeCells->mergeCell as $mergeCell) {
$mergeRef = (string) $mergeCell['ref'];
if (strpos($mergeRef, ':') !== false) {
- $docSheet->mergeCells((string) $mergeCell['ref']);
+ $docSheet->mergeCells((string) $mergeCell['ref'], Worksheet::MERGE_CELL_CONTENT_HIDE);
}
}
}
@@ -1143,7 +1151,7 @@ class Xlsx extends BaseReader
}
// Header/footer images
- if ($xmlSheet && $xmlSheet->legacyDrawingHF && !$this->readDataOnly) {
+ if ($xmlSheet && $xmlSheet->legacyDrawingHF) {
if ($zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) {
$relsWorksheet = $this->loadZipNoNamespace(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels', Namespaces::RELATIONSHIPS);
$vmlRelationship = '';
@@ -1550,7 +1558,7 @@ class Xlsx extends BaseReader
break;
case '_xlnm.Print_Area':
- $rangeSets = preg_split("/('?(?:.*?)'?(?:![A-Z0-9]+:[A-Z0-9]+)),?/", $extractedRange, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
+ $rangeSets = preg_split("/('?(?:.*?)'?(?:![A-Z0-9]+:[A-Z0-9]+)),?/", $extractedRange, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) ?: [];
$newRangeSets = [];
foreach ($rangeSets as $rangeSet) {
[, $rangeSet] = Worksheet::extractSheetTitle($rangeSet, true);
@@ -1605,7 +1613,7 @@ class Xlsx extends BaseReader
if (strpos((string) $definedName, '!') !== false) {
$range[0] = str_replace("''", "'", $range[0]);
$range[0] = str_replace("'", '', $range[0]);
- if ($worksheet = $excel->getSheetByName($range[0])) {
+ if ($worksheet = $excel->getSheetByName($range[0])) { // @phpstan-ignore-line
$excel->addDefinedName(DefinedName::createInstance((string) $definedName['name'], $worksheet, $extractedRange, true, $scope));
} else {
$excel->addDefinedName(DefinedName::createInstance((string) $definedName['name'], $scope, $extractedRange, true, $scope));
@@ -1626,7 +1634,7 @@ class Xlsx extends BaseReader
// Need to split on a comma or a space if not in quotes, and extract the first part.
$definedNameValueParts = preg_split("/[ ,](?=([^']*'[^']*')*[^']*$)/miuU", $definedRange);
// Extract sheet name
- [$extractedSheetName] = Worksheet::extractSheetTitle((string) $definedNameValueParts[0], true);
+ [$extractedSheetName] = Worksheet::extractSheetTitle((string) $definedNameValueParts[0], true); // @phpstan-ignore-line
$extractedSheetName = trim($extractedSheetName, "'");
// Locate sheet
@@ -1673,7 +1681,7 @@ class Xlsx extends BaseReader
if (isset($charts[$chartEntryRef])) {
$chartPositionRef = $charts[$chartEntryRef]['sheet'] . '!' . $charts[$chartEntryRef]['id'];
if (isset($chartDetails[$chartPositionRef])) {
- $excel->getSheetByName($charts[$chartEntryRef]['sheet'])->addChart($objChart);
+ $excel->getSheetByName($charts[$chartEntryRef]['sheet'])->addChart($objChart); // @phpstan-ignore-line
$objChart->setWorksheet($excel->getSheetByName($charts[$chartEntryRef]['sheet']));
// For oneCellAnchor or absoluteAnchor positioned charts,
// toCoordinate is not in the data. Does it need to be calculated?
@@ -1695,7 +1703,7 @@ class Xlsx extends BaseReader
break;
- // unparsed
+ // unparsed
case 'application/vnd.ms-excel.controlproperties+xml':
$unparsedLoadedData['override_content_types'][(string) $contentType['PartName']] = (string) $contentType['ContentType'];
@@ -1722,28 +1730,28 @@ class Xlsx extends BaseReader
$value->createText(StringHelper::controlCharacterOOXML2PHP((string) $is->t));
} else {
if (is_object($is->r)) {
-
/** @var SimpleXMLElement $run */
foreach ($is->r as $run) {
if (!isset($run->rPr)) {
$value->createText(StringHelper::controlCharacterOOXML2PHP((string) $run->t));
} else {
$objText = $value->createTextRun(StringHelper::controlCharacterOOXML2PHP((string) $run->t));
+ $objFont = $objText->getFont() ?? new StyleFont();
if (isset($run->rPr->rFont)) {
$attr = $run->rPr->rFont->attributes();
if (isset($attr['val'])) {
- $objText->getFont()->setName((string) $attr['val']);
+ $objFont->setName((string) $attr['val']);
}
}
if (isset($run->rPr->sz)) {
$attr = $run->rPr->sz->attributes();
if (isset($attr['val'])) {
- $objText->getFont()->setSize((float) $attr['val']);
+ $objFont->setSize((float) $attr['val']);
}
}
if (isset($run->rPr->color)) {
- $objText->getFont()->setColor(new Color($this->styleReader->readColor($run->rPr->color)));
+ $objFont->setColor(new Color($this->styleReader->readColor($run->rPr->color)));
}
if (isset($run->rPr->b)) {
$attr = $run->rPr->b->attributes();
@@ -1751,7 +1759,7 @@ class Xlsx extends BaseReader
(isset($attr['val']) && self::boolean((string) $attr['val'])) ||
(!isset($attr['val']))
) {
- $objText->getFont()->setBold(true);
+ $objFont->setBold(true);
}
}
if (isset($run->rPr->i)) {
@@ -1760,7 +1768,7 @@ class Xlsx extends BaseReader
(isset($attr['val']) && self::boolean((string) $attr['val'])) ||
(!isset($attr['val']))
) {
- $objText->getFont()->setItalic(true);
+ $objFont->setItalic(true);
}
}
if (isset($run->rPr->vertAlign)) {
@@ -1768,19 +1776,19 @@ class Xlsx extends BaseReader
if (isset($attr['val'])) {
$vertAlign = strtolower((string) $attr['val']);
if ($vertAlign == 'superscript') {
- $objText->getFont()->setSuperscript(true);
+ $objFont->setSuperscript(true);
}
if ($vertAlign == 'subscript') {
- $objText->getFont()->setSubscript(true);
+ $objFont->setSubscript(true);
}
}
}
if (isset($run->rPr->u)) {
$attr = $run->rPr->u->attributes();
if (!isset($attr['val'])) {
- $objText->getFont()->setUnderline(\PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLE);
+ $objFont->setUnderline(\PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLE);
} else {
- $objText->getFont()->setUnderline((string) $attr['val']);
+ $objFont->setUnderline((string) $attr['val']);
}
}
if (isset($run->rPr->strike)) {
@@ -1789,7 +1797,7 @@ class Xlsx extends BaseReader
(isset($attr['val']) && self::boolean((string) $attr['val'])) ||
(!isset($attr['val']))
) {
- $objText->getFont()->setStrikethrough(true);
+ $objFont->setStrikethrough(true);
}
}
}
@@ -1842,17 +1850,30 @@ class Xlsx extends BaseReader
}
}
+ /**
+ * @param null|array|bool|SimpleXMLElement $array
+ * @param int|string $key
+ *
+ * @return mixed
+ */
private static function getArrayItem($array, $key = 0)
{
- return $array[$key] ?? null;
+ return ($array === null || is_bool($array)) ? null : ($array[$key] ?? null);
}
+ /**
+ * @param null|SimpleXMLElement|string $base
+ * @param null|SimpleXMLElement|string $add
+ */
private static function dirAdd($base, $add): string
{
+ $base = (string) $base;
+ $add = (string) $add;
+
return (string) preg_replace('~[^/]+/\.\./~', '', dirname($base) . "/$add");
}
- private static function toCSSArray($style): array
+ private static function toCSSArray(string $style): array
{
$style = self::stripWhiteSpaceFromStyleString($style);
@@ -1866,15 +1887,15 @@ class Xlsx extends BaseReader
}
if (strpos($item[1], 'pt') !== false) {
$item[1] = str_replace('pt', '', $item[1]);
- $item[1] = Font::fontSizeToPixels($item[1]);
+ $item[1] = (string) Font::fontSizeToPixels((int) $item[1]);
}
if (strpos($item[1], 'in') !== false) {
$item[1] = str_replace('in', '', $item[1]);
- $item[1] = Font::inchSizeToPixels($item[1]);
+ $item[1] = (string) Font::inchSizeToPixels((int) $item[1]);
}
if (strpos($item[1], 'cm') !== false) {
$item[1] = str_replace('cm', '', $item[1]);
- $item[1] = Font::centimeterSizeToPixels($item[1]);
+ $item[1] = (string) Font::centimeterSizeToPixels((int) $item[1]);
}
$style[$item[0]] = $item[1];
@@ -1883,11 +1904,14 @@ class Xlsx extends BaseReader
return $style;
}
- public static function stripWhiteSpaceFromStyleString($string): string
+ public static function stripWhiteSpaceFromStyleString(string $string): string
{
return trim(str_replace(["\r", "\n", ' '], '', $string), ';');
}
+ /**
+ * @param mixed $value
+ */
private static function boolean($value): bool
{
if (is_object($value)) {
@@ -1956,7 +1980,7 @@ class Xlsx extends BaseReader
return $returnValue;
}
- private function readFormControlProperties(Spreadsheet $excel, $dir, $fileWorksheet, $docSheet, array &$unparsedLoadedData): void
+ private function readFormControlProperties(Spreadsheet $excel, string $dir, string $fileWorksheet, Worksheet $docSheet, array &$unparsedLoadedData): void
{
$zip = $this->zip;
if (!$zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) {
@@ -1983,7 +2007,7 @@ class Xlsx extends BaseReader
unset($unparsedCtrlProps);
}
- private function readPrinterSettings(Spreadsheet $excel, $dir, $fileWorksheet, $docSheet, array &$unparsedLoadedData): void
+ private function readPrinterSettings(Spreadsheet $excel, string $dir, string $fileWorksheet, Worksheet $docSheet, array &$unparsedLoadedData): void
{
$zip = $this->zip;
if (!$zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) {
@@ -2071,7 +2095,7 @@ class Xlsx extends BaseReader
if ($xmlSheet && $xmlSheet->autoFilter) {
// In older files, autofilter structure is defined in the worksheet file
(new AutoFilter($docSheet, $xmlSheet))->load();
- } elseif ($xmlSheet && $xmlSheet->tableParts && $xmlSheet->tableParts['count'] > 0) {
+ } elseif ($xmlSheet && $xmlSheet->tableParts && (int) $xmlSheet->tableParts['count'] > 0) {
// But for Office365, MS decided to make it all just a bit more complicated
$this->readAutoFilterTablesInTablesFile($xmlSheet, $dir, $fileWorksheet, $zip, $docSheet);
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
index 374da9f63..39328adb8 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
@@ -9,8 +9,10 @@ use SimpleXMLElement;
class AutoFilter
{
+ /** @var Worksheet */
private $worksheet;
+ /** @var SimpleXMLElement */
private $worksheetXml;
public function __construct(Worksheet $workSheet, SimpleXMLElement $worksheetXml)
@@ -28,7 +30,7 @@ class AutoFilter
}
}
- private function readAutoFilter($autoFilterRange, $xmlSheet): void
+ private function readAutoFilter(string $autoFilterRange, SimpleXMLElement $xmlSheet): void
{
$autoFilter = $this->worksheet->getAutoFilter();
$autoFilter->setRange($autoFilterRange);
@@ -39,15 +41,15 @@ class AutoFilter
if ($filterColumn->filters) {
$column->setFilterType(Column::AUTOFILTER_FILTERTYPE_FILTER);
$filters = $filterColumn->filters;
- if ((isset($filters['blank'])) && ($filters['blank'] == 1)) {
+ if ((isset($filters['blank'])) && ((int) $filters['blank'] == 1)) {
// Operator is undefined, but always treated as EQUAL
- $column->createRule()->setRule(null, '')->setRuleType(Rule::AUTOFILTER_RULETYPE_FILTER);
+ $column->createRule()->setRule('', '')->setRuleType(Rule::AUTOFILTER_RULETYPE_FILTER);
}
// Standard filters are always an OR join, so no join rule needs to be set
// Entries can be either filter elements
foreach ($filters->filter as $filterRule) {
// Operator is undefined, but always treated as EQUAL
- $column->createRule()->setRule(null, (string) $filterRule['val'])->setRuleType(Rule::AUTOFILTER_RULETYPE_FILTER);
+ $column->createRule()->setRule('', (string) $filterRule['val'])->setRuleType(Rule::AUTOFILTER_RULETYPE_FILTER);
}
// Or Date Group elements
@@ -69,7 +71,7 @@ class AutoFilter
foreach ($filters->dateGroupItem as $dateGroupItem) {
// Operator is undefined, but always treated as EQUAL
$column->createRule()->setRule(
- null,
+ '',
[
'year' => (string) $dateGroupItem['year'],
'month' => (string) $dateGroupItem['month'],
@@ -83,9 +85,9 @@ class AutoFilter
}
}
- private function readCustomAutoFilter(SimpleXMLElement $filterColumn, Column $column): void
+ private function readCustomAutoFilter(?SimpleXMLElement $filterColumn, Column $column): void
{
- if ($filterColumn->customFilters) {
+ if (isset($filterColumn, $filterColumn->customFilters)) {
$column->setFilterType(Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER);
$customFilters = $filterColumn->customFilters;
// Custom filters can an AND or an OR join;
@@ -102,15 +104,15 @@ class AutoFilter
}
}
- private function readDynamicAutoFilter(SimpleXMLElement $filterColumn, Column $column): void
+ private function readDynamicAutoFilter(?SimpleXMLElement $filterColumn, Column $column): void
{
- if ($filterColumn->dynamicFilter) {
+ if (isset($filterColumn, $filterColumn->dynamicFilter)) {
$column->setFilterType(Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER);
// We should only ever have one dynamic filter
foreach ($filterColumn->dynamicFilter as $filterRule) {
// Operator is undefined, but always treated as EQUAL
$column->createRule()->setRule(
- null,
+ '',
(string) $filterRule['val'],
(string) $filterRule['type']
)->setRuleType(Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER);
@@ -124,9 +126,9 @@ class AutoFilter
}
}
- private function readTopTenAutoFilter(SimpleXMLElement $filterColumn, Column $column): void
+ private function readTopTenAutoFilter(?SimpleXMLElement $filterColumn, Column $column): void
{
- if ($filterColumn->top10) {
+ if (isset($filterColumn, $filterColumn->top10)) {
$column->setFilterType(Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER);
// We should only ever have one top10 filter
foreach ($filterColumn->top10 as $filterRule) {
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php
index 1679f01f9..2f1464582 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php
@@ -4,7 +4,10 @@ namespace PhpOffice\PhpSpreadsheet\Reader\Xlsx;
class BaseParserClass
{
- protected static function boolean($value)
+ /**
+ * @param mixed $value
+ */
+ protected static function boolean($value): bool
{
if (is_object($value)) {
$value = (string) $value;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Chart.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Chart.php
index cf77a7f25..c22334cac 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Chart.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Chart.php
@@ -11,8 +11,10 @@ use PhpOffice\PhpSpreadsheet\Chart\GridLines;
use PhpOffice\PhpSpreadsheet\Chart\Layout;
use PhpOffice\PhpSpreadsheet\Chart\Legend;
use PhpOffice\PhpSpreadsheet\Chart\PlotArea;
-use PhpOffice\PhpSpreadsheet\Chart\Properties;
+use PhpOffice\PhpSpreadsheet\Chart\Properties as ChartProperties;
use PhpOffice\PhpSpreadsheet\Chart\Title;
+use PhpOffice\PhpSpreadsheet\Chart\TrendLine;
+use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\RichText\RichText;
use PhpOffice\PhpSpreadsheet\Style\Font;
use SimpleXMLElement;
@@ -72,12 +74,34 @@ class Chart
$rotX = $rotY = $rAngAx = $perspective = null;
$xAxis = new Axis();
$yAxis = new Axis();
+ $autoTitleDeleted = null;
+ $chartNoFill = false;
+ $gradientArray = [];
+ $gradientLin = null;
+ $roundedCorners = false;
foreach ($chartElementsC as $chartElementKey => $chartElement) {
switch ($chartElementKey) {
+ case 'spPr':
+ $possibleNoFill = $chartElementsC->spPr->children($this->aNamespace);
+ if (isset($possibleNoFill->noFill)) {
+ $chartNoFill = true;
+ }
+
+ break;
+ case 'roundedCorners':
+ /** @var bool */
+ $roundedCorners = self::getAttribute($chartElementsC->roundedCorners, 'val', 'boolean');
+
+ break;
case 'chart':
foreach ($chartElement as $chartDetailsKey => $chartDetails) {
- $chartDetailsC = $chartDetails->children($this->cNamespace);
+ $chartDetails = Xlsx::testSimpleXml($chartDetails);
switch ($chartDetailsKey) {
+ case 'autoTitleDeleted':
+ /** @var bool */
+ $autoTitleDeleted = self::getAttribute($chartElementsC->chart->autoTitleDeleted, 'val', 'boolean');
+
+ break;
case 'view3D':
$rotX = self::getAttribute($chartDetails->rotX, 'val', 'integer');
$rotY = self::getAttribute($chartDetails->rotY, 'val', 'integer');
@@ -89,18 +113,42 @@ class Chart
$plotAreaLayout = $XaxisLabel = $YaxisLabel = null;
$plotSeries = $plotAttributes = [];
$catAxRead = false;
+ $plotNoFill = false;
foreach ($chartDetails as $chartDetailKey => $chartDetail) {
+ $chartDetail = Xlsx::testSimpleXml($chartDetail);
switch ($chartDetailKey) {
+ case 'spPr':
+ $possibleNoFill = $chartDetails->spPr->children($this->aNamespace);
+ if (isset($possibleNoFill->noFill)) {
+ $plotNoFill = true;
+ }
+ if (isset($possibleNoFill->gradFill->gsLst)) {
+ foreach ($possibleNoFill->gradFill->gsLst->gs as $gradient) {
+ $gradient = Xlsx::testSimpleXml($gradient);
+ /** @var float */
+ $pos = self::getAttribute($gradient, 'pos', 'float');
+ $gradientArray[] = [
+ $pos / ChartProperties::PERCENTAGE_MULTIPLIER,
+ new ChartColor($this->readColor($gradient)),
+ ];
+ }
+ }
+ if (isset($possibleNoFill->gradFill->lin)) {
+ $gradientLin = ChartProperties::XmlToAngle((string) self::getAttribute($possibleNoFill->gradFill->lin, 'ang', 'string'));
+ }
+
+ break;
case 'layout':
$plotAreaLayout = $this->chartLayoutDetails($chartDetail);
break;
- case 'catAx':
+ case Axis::AXIS_TYPE_CATEGORY:
+ case Axis::AXIS_TYPE_DATE:
$catAxRead = true;
if (isset($chartDetail->title)) {
$XaxisLabel = $this->chartTitle($chartDetail->title->children($this->cNamespace));
}
- $xAxis->setAxisType('catAx');
+ $xAxis->setAxisType($chartDetailKey);
$this->readEffects($chartDetail, $xAxis);
if (isset($chartDetail->spPr)) {
$sppr = $chartDetail->spPr->children($this->aNamespace);
@@ -129,13 +177,7 @@ class Chart
$this->setAxisProperties($chartDetail, $xAxis);
break;
- case 'dateAx':
- if (isset($chartDetail->title)) {
- $XaxisLabel = $this->chartTitle($chartDetail->title->children($this->cNamespace));
- }
-
- break;
- case 'valAx':
+ case Axis::AXIS_TYPE_VALUE:
$whichAxis = null;
$axPos = null;
if (isset($chartDetail->axPos)) {
@@ -228,7 +270,7 @@ class Chart
case 'doughnutChart':
case 'pieChart':
case 'pie3DChart':
- $explosion = isset($chartDetail->ser->explosion);
+ $explosion = self::getAttribute($chartDetail->ser->explosion, 'val', 'string');
$plotSer = $this->chartDataSeries($chartDetail, $chartDetailKey);
$plotSer->setPlotStyle("$explosion");
$plotSeries[] = $plotSer;
@@ -272,7 +314,7 @@ class Chart
break;
case 'stockChart':
$plotSeries[] = $this->chartDataSeries($chartDetail, $chartDetailKey);
- $plotAttributes = $this->readChartAttributes($plotAreaLayout);
+ $plotAttributes = $this->readChartAttributes($chartDetail);
break;
}
@@ -282,6 +324,12 @@ class Chart
}
$plotArea = new PlotArea($plotAreaLayout, $plotSeries);
$this->setChartAttributes($plotAreaLayout, $plotAttributes);
+ if ($plotNoFill) {
+ $plotArea->setNoFill(true);
+ }
+ if (!empty($gradientArray)) {
+ $plotArea->setGradientFillProperties($gradientArray, $gradientLin);
+ }
break;
case 'plotVisOnly':
@@ -301,6 +349,7 @@ class Chart
$legendLayout = null;
$legendOverlay = false;
foreach ($chartDetails as $chartDetailKey => $chartDetail) {
+ $chartDetail = Xlsx::testSimpleXml($chartDetail);
switch ($chartDetailKey) {
case 'legendPos':
$legendPos = self::getAttribute($chartDetail, 'val', 'string');
@@ -324,6 +373,13 @@ class Chart
}
}
$chart = new \PhpOffice\PhpSpreadsheet\Chart\Chart($chartName, $title, $legend, $plotArea, $plotVisOnly, (string) $dispBlanksAs, $XaxisLabel, $YaxisLabel, $xAxis, $yAxis);
+ if ($chartNoFill) {
+ $chart->setNoFill(true);
+ }
+ $chart->setRoundedCorners($roundedCorners);
+ if (is_bool($autoTitleDeleted)) {
+ $chart->setAutoTitleDeleted($autoTitleDeleted);
+ }
if (is_int($rotX)) {
$chart->setRotX($rotX);
}
@@ -345,14 +401,24 @@ class Chart
$caption = [];
$titleLayout = null;
foreach ($titleDetails as $titleDetailKey => $chartDetail) {
+ $chartDetail = Xlsx::testSimpleXml($chartDetail);
switch ($titleDetailKey) {
case 'tx':
- $titleDetails = $chartDetail->rich->children($this->aNamespace);
- foreach ($titleDetails as $titleKey => $titleDetail) {
- switch ($titleKey) {
- case 'p':
- $titleDetailPart = $titleDetail->children($this->aNamespace);
- $caption[] = $this->parseRichText($titleDetailPart);
+ if (isset($chartDetail->rich)) {
+ $titleDetails = $chartDetail->rich->children($this->aNamespace);
+ foreach ($titleDetails as $titleKey => $titleDetail) {
+ $titleDetail = Xlsx::testSimpleXml($titleDetail);
+ switch ($titleKey) {
+ case 'p':
+ $titleDetailPart = $titleDetail->children($this->aNamespace);
+ $caption[] = $this->parseRichText($titleDetailPart);
+ }
+ }
+ } elseif (isset($chartDetail->strRef->strCache)) {
+ foreach ($chartDetail->strRef->strCache->pt as $pt) {
+ if (isset($pt->v)) {
+ $caption[] = (string) $pt->v;
+ }
}
}
@@ -378,6 +444,7 @@ class Chart
}
$layout = [];
foreach ($details as $detailKey => $detail) {
+ $detail = Xlsx::testSimpleXml($detail);
$layout[$detailKey] = self::getAttribute($detail, 'val', 'string');
}
@@ -404,12 +471,14 @@ class Chart
$pointSize = null;
$noFill = false;
$bubble3D = false;
- $dPtColors = [];
+ $dptColors = [];
$markerFillColor = null;
$markerBorderColor = null;
$lineStyle = null;
$labelLayout = null;
+ $trendLines = [];
foreach ($seriesDetails as $seriesKey => $seriesDetail) {
+ $seriesDetail = Xlsx::testSimpleXml($seriesDetail);
switch ($seriesKey) {
case 'idx':
$seriesIndex = self::getAttribute($seriesDetail, 'val', 'integer');
@@ -426,7 +495,6 @@ class Chart
break;
case 'spPr':
$children = $seriesDetail->children($this->aNamespace);
- $ln = $children->ln;
if (isset($children->ln)) {
$ln = $children->ln;
if (is_countable($ln->noFill) && count($ln->noFill) === 1) {
@@ -456,6 +524,41 @@ class Chart
}
}
+ break;
+ case 'trendline':
+ $trendLine = new TrendLine();
+ $this->readLineStyle($seriesDetail, $trendLine);
+ /** @var ?string */
+ $trendLineType = self::getAttribute($seriesDetail->trendlineType, 'val', 'string');
+ /** @var ?bool */
+ $dispRSqr = self::getAttribute($seriesDetail->dispRSqr, 'val', 'boolean');
+ /** @var ?bool */
+ $dispEq = self::getAttribute($seriesDetail->dispEq, 'val', 'boolean');
+ /** @var ?int */
+ $order = self::getAttribute($seriesDetail->order, 'val', 'integer');
+ /** @var ?int */
+ $period = self::getAttribute($seriesDetail->period, 'val', 'integer');
+ /** @var ?float */
+ $forward = self::getAttribute($seriesDetail->forward, 'val', 'float');
+ /** @var ?float */
+ $backward = self::getAttribute($seriesDetail->backward, 'val', 'float');
+ /** @var ?float */
+ $intercept = self::getAttribute($seriesDetail->intercept, 'val', 'float');
+ /** @var ?string */
+ $name = (string) $seriesDetail->name;
+ $trendLine->setTrendLineProperties(
+ $trendLineType,
+ $order,
+ $period,
+ $dispRSqr,
+ $dispEq,
+ $backward,
+ $forward,
+ $intercept,
+ $name
+ );
+ $trendLines[] = $trendLine;
+
break;
case 'marker':
$marker = self::getAttribute($seriesDetail->symbol, 'val', 'string');
@@ -594,6 +697,17 @@ class Chart
$seriesValues[$seriesIndex]->setSmoothLine(true);
}
}
+ if (!empty($trendLines)) {
+ if (isset($seriesLabel[$seriesIndex])) {
+ $seriesLabel[$seriesIndex]->setTrendLines($trendLines);
+ }
+ if (isset($seriesCategory[$seriesIndex])) {
+ $seriesCategory[$seriesIndex]->setTrendLines($trendLines);
+ }
+ if (isset($seriesValues[$seriesIndex])) {
+ $seriesValues[$seriesIndex]->setTrendLines($trendLines);
+ }
+ }
}
}
/** @phpstan-ignore-next-line */
@@ -677,6 +791,7 @@ class Chart
$pointCount = 0;
foreach ($seriesValueSet as $seriesValueIdx => $seriesValue) {
+ $seriesValue = Xlsx::testSimpleXml($seriesValue);
switch ($seriesValueIdx) {
case 'ptCount':
$pointCount = self::getAttribute($seriesValue, 'val', 'integer');
@@ -749,7 +864,6 @@ class Chart
private function parseRichText(SimpleXMLElement $titleDetailPart): RichText
{
$value = new RichText();
- $objText = null;
$defaultFontSize = null;
$defaultBold = null;
$defaultItalic = null;
@@ -961,12 +1075,19 @@ class Chart
}
/**
- * @param null|Layout|SimpleXMLElement $chartDetail
+ * @param ?SimpleXMLElement $chartDetail
*/
private function readChartAttributes($chartDetail): array
{
$plotAttributes = [];
if (isset($chartDetail->dLbls)) {
+ if (isset($chartDetail->dLbls->dLblPos)) {
+ $plotAttributes['dLblPos'] = self::getAttribute($chartDetail->dLbls->dLblPos, 'val', 'string');
+ }
+ if (isset($chartDetail->dLbls->numFmt)) {
+ $plotAttributes['numFmtCode'] = self::getAttribute($chartDetail->dLbls->numFmt, 'formatCode', 'string');
+ $plotAttributes['numFmtLinked'] = self::getAttribute($chartDetail->dLbls->numFmt, 'sourceLinked', 'boolean');
+ }
if (isset($chartDetail->dLbls->showLegendKey)) {
$plotAttributes['showLegendKey'] = self::getAttribute($chartDetail->dLbls->showLegendKey, 'val', 'string');
}
@@ -1047,7 +1168,7 @@ class Chart
}
}
- private function readEffects(SimpleXMLElement $chartDetail, ?Properties $chartObject): void
+ private function readEffects(SimpleXMLElement $chartDetail, ?ChartProperties $chartObject): void
{
if (!isset($chartObject, $chartDetail->spPr)) {
return;
@@ -1055,7 +1176,7 @@ class Chart
$sppr = $chartDetail->spPr->children($this->aNamespace);
if (isset($sppr->effectLst->glow)) {
- $axisGlowSize = (float) self::getAttribute($sppr->effectLst->glow, 'rad', 'integer') / Properties::POINTS_WIDTH_MULTIPLIER;
+ $axisGlowSize = (float) self::getAttribute($sppr->effectLst->glow, 'rad', 'integer') / ChartProperties::POINTS_WIDTH_MULTIPLIER;
if ($axisGlowSize != 0.0) {
$colorArray = $this->readColor($sppr->effectLst->glow);
$chartObject->setGlowProperties($axisGlowSize, $colorArray['value'], $colorArray['alpha'], $colorArray['type']);
@@ -1066,7 +1187,7 @@ class Chart
/** @var string */
$softEdgeSize = self::getAttribute($sppr->effectLst->softEdge, 'rad', 'string');
if (is_numeric($softEdgeSize)) {
- $chartObject->setSoftEdges((float) Properties::xmlToPoints($softEdgeSize));
+ $chartObject->setSoftEdges((float) ChartProperties::xmlToPoints($softEdgeSize));
}
}
@@ -1081,20 +1202,20 @@ class Chart
if ($type !== '') {
/** @var string */
$blur = self::getAttribute($sppr->effectLst->$type, 'blurRad', 'string');
- $blur = is_numeric($blur) ? Properties::xmlToPoints($blur) : null;
+ $blur = is_numeric($blur) ? ChartProperties::xmlToPoints($blur) : null;
/** @var string */
$dist = self::getAttribute($sppr->effectLst->$type, 'dist', 'string');
- $dist = is_numeric($dist) ? Properties::xmlToPoints($dist) : null;
+ $dist = is_numeric($dist) ? ChartProperties::xmlToPoints($dist) : null;
/** @var string */
$direction = self::getAttribute($sppr->effectLst->$type, 'dir', 'string');
- $direction = is_numeric($direction) ? Properties::xmlToAngle($direction) : null;
+ $direction = is_numeric($direction) ? ChartProperties::xmlToAngle($direction) : null;
$algn = self::getAttribute($sppr->effectLst->$type, 'algn', 'string');
$rot = self::getAttribute($sppr->effectLst->$type, 'rotWithShape', 'string');
$size = [];
foreach (['sx', 'sy'] as $sizeType) {
$sizeValue = self::getAttribute($sppr->effectLst->$type, $sizeType, 'string');
if (is_numeric($sizeValue)) {
- $size[$sizeType] = Properties::xmlToTenthOfPercent((string) $sizeValue);
+ $size[$sizeType] = ChartProperties::xmlToTenthOfPercent((string) $sizeValue);
} else {
$size[$sizeType] = null;
}
@@ -1102,7 +1223,7 @@ class Chart
foreach (['kx', 'ky'] as $sizeType) {
$sizeValue = self::getAttribute($sppr->effectLst->$type, $sizeType, 'string');
if (is_numeric($sizeValue)) {
- $size[$sizeType] = Properties::xmlToAngle((string) $sizeValue);
+ $size[$sizeType] = ChartProperties::xmlToAngle((string) $sizeValue);
} else {
$size[$sizeType] = null;
}
@@ -1131,6 +1252,7 @@ class Chart
'type' => null,
'value' => null,
'alpha' => null,
+ 'brightness' => null,
];
foreach (ChartColor::EXCEL_COLOR_TYPES as $type) {
if (isset($colorXml->$type)) {
@@ -1143,6 +1265,13 @@ class Chart
$result['alpha'] = ChartColor::alphaFromXml($alpha);
}
}
+ if (isset($colorXml->$type->lumMod)) {
+ /** @var string */
+ $brightness = self::getAttribute($colorXml->$type->lumMod, 'val', 'string');
+ if (is_numeric($brightness)) {
+ $result['brightness'] = ChartColor::alphaFromXml($brightness);
+ }
+ }
break;
}
@@ -1151,7 +1280,7 @@ class Chart
return $result;
}
- private function readLineStyle(SimpleXMLElement $chartDetail, ?Properties $chartObject): void
+ private function readLineStyle(SimpleXMLElement $chartDetail, ?ChartProperties $chartObject): void
{
if (!isset($chartObject, $chartDetail->spPr)) {
return;
@@ -1165,7 +1294,7 @@ class Chart
/** @var string */
$lineWidthTemp = self::getAttribute($sppr->ln, 'w', 'string');
if (is_numeric($lineWidthTemp)) {
- $lineWidth = Properties::xmlToPoints($lineWidthTemp);
+ $lineWidth = ChartProperties::xmlToPoints($lineWidthTemp);
}
/** @var string */
$compoundType = self::getAttribute($sppr->ln, 'cmpd', 'string');
@@ -1174,15 +1303,13 @@ class Chart
/** @var string */
$capType = self::getAttribute($sppr->ln, 'cap', 'string');
if (isset($sppr->ln->miter)) {
- $joinType = Properties::LINE_STYLE_JOIN_MITER;
+ $joinType = ChartProperties::LINE_STYLE_JOIN_MITER;
} elseif (isset($sppr->ln->bevel)) {
- $joinType = Properties::LINE_STYLE_JOIN_BEVEL;
+ $joinType = ChartProperties::LINE_STYLE_JOIN_BEVEL;
} else {
$joinType = '';
}
- $headArrowType = '';
$headArrowSize = '';
- $endArrowType = '';
$endArrowSize = '';
/** @var string */
$headArrowType = self::getAttribute($sppr->ln->headEnd, 'type', 'string');
@@ -1220,6 +1347,9 @@ class Chart
if (!isset($whichAxis)) {
return;
}
+ if (isset($chartDetail->delete)) {
+ $whichAxis->setAxisOption('hidden', (string) self::getAttribute($chartDetail->delete, 'val', 'string'));
+ }
if (isset($chartDetail->numFmt)) {
$whichAxis->setAxisNumberProperties(
(string) self::getAttribute($chartDetail->numFmt, 'formatCode', 'string'),
@@ -1263,5 +1393,24 @@ class Chart
if (isset($chartDetail->minorUnit)) {
$whichAxis->setAxisOption('minor_unit', (string) self::getAttribute($chartDetail->minorUnit, 'val', 'string'));
}
+ if (isset($chartDetail->baseTimeUnit)) {
+ $whichAxis->setAxisOption('baseTimeUnit', (string) self::getAttribute($chartDetail->baseTimeUnit, 'val', 'string'));
+ }
+ if (isset($chartDetail->majorTimeUnit)) {
+ $whichAxis->setAxisOption('majorTimeUnit', (string) self::getAttribute($chartDetail->majorTimeUnit, 'val', 'string'));
+ }
+ if (isset($chartDetail->minorTimeUnit)) {
+ $whichAxis->setAxisOption('minorTimeUnit', (string) self::getAttribute($chartDetail->minorTimeUnit, 'val', 'string'));
+ }
+ if (isset($chartDetail->txPr)) {
+ $children = $chartDetail->txPr->children($this->aNamespace);
+ if (isset($children->bodyPr)) {
+ /** @var string */
+ $textRotation = self::getAttribute($children->bodyPr, 'rot', 'string');
+ if (is_numeric($textRotation)) {
+ $whichAxis->setAxisOption('textRotation', (string) ChartProperties::xmlToAngle($textRotation));
+ }
+ }
+ }
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
index 2a1e2afd8..347057338 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php
@@ -10,8 +10,10 @@ use SimpleXMLElement;
class ColumnAndRowAttributes extends BaseParserClass
{
+ /** @var Worksheet */
private $worksheet;
+ /** @var ?SimpleXMLElement */
private $worksheetXml;
public function __construct(Worksheet $workSheet, ?SimpleXMLElement $worksheetXml = null)
@@ -120,7 +122,7 @@ class ColumnAndRowAttributes extends BaseParserClass
}
}
- private function isFilteredColumn(IReadFilter $readFilter, $columnCoordinate, array $rowsAttributes)
+ private function isFilteredColumn(IReadFilter $readFilter, string $columnCoordinate, array $rowsAttributes): bool
{
foreach ($rowsAttributes as $rowCoordinate => $rowAttributes) {
if (!$readFilter->readCell($columnCoordinate, $rowCoordinate, $this->worksheet->getTitle())) {
@@ -131,7 +133,7 @@ class ColumnAndRowAttributes extends BaseParserClass
return false;
}
- private function readColumnAttributes(SimpleXMLElement $worksheetCols, $readDataOnly)
+ private function readColumnAttributes(SimpleXMLElement $worksheetCols, bool $readDataOnly): array
{
$columnAttributes = [];
@@ -151,7 +153,7 @@ class ColumnAndRowAttributes extends BaseParserClass
return $columnAttributes;
}
- private function readColumnRangeAttributes(SimpleXMLElement $column, $readDataOnly)
+ private function readColumnRangeAttributes(SimpleXMLElement $column, bool $readDataOnly): array
{
$columnAttributes = [];
@@ -172,7 +174,7 @@ class ColumnAndRowAttributes extends BaseParserClass
return $columnAttributes;
}
- private function isFilteredRow(IReadFilter $readFilter, $rowCoordinate, array $columnsAttributes)
+ private function isFilteredRow(IReadFilter $readFilter, int $rowCoordinate, array $columnsAttributes): bool
{
foreach ($columnsAttributes as $columnCoordinate => $columnAttributes) {
if (!$readFilter->readCell($columnCoordinate, $rowCoordinate, $this->worksheet->getTitle())) {
@@ -183,7 +185,7 @@ class ColumnAndRowAttributes extends BaseParserClass
return false;
}
- private function readRowAttributes(SimpleXMLElement $worksheetRow, $readDataOnly)
+ private function readRowAttributes(SimpleXMLElement $worksheetRow, bool $readDataOnly): array
{
$rowAttributes = [];
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
index c631a0fe7..7d947bacf 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php
@@ -10,11 +10,14 @@ use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalFormatValueO
use PhpOffice\PhpSpreadsheet\Style\Style as Style;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use SimpleXMLElement;
+use stdClass;
class ConditionalStyles
{
+ /** @var Worksheet */
private $worksheet;
+ /** @var SimpleXMLElement */
private $worksheetXml;
/**
@@ -22,6 +25,7 @@ class ConditionalStyles
*/
private $ns;
+ /** @var array */
private $dxfs;
public function __construct(Worksheet $workSheet, SimpleXMLElement $worksheetXml, array $dxfs = [])
@@ -146,7 +150,7 @@ class ConditionalStyles
return $cfStyle;
}
- private function readConditionalStyles($xmlSheet): array
+ private function readConditionalStyles(SimpleXMLElement $xmlSheet): array
{
$conditionals = [];
foreach ($xmlSheet->conditionalFormatting as $conditional) {
@@ -162,7 +166,7 @@ class ConditionalStyles
return $conditionals;
}
- private function setConditionalStyles(Worksheet $worksheet, array $conditionals, $xmlExtLst): void
+ private function setConditionalStyles(Worksheet $worksheet, array $conditionals, SimpleXMLElement $xmlExtLst): void
{
foreach ($conditionals as $cellRangeReference => $cfRules) {
ksort($cfRules);
@@ -176,7 +180,7 @@ class ConditionalStyles
}
}
- private function readStyleRules($cfRules, $extLst)
+ private function readStyleRules(array $cfRules, SimpleXMLElement $extLst): array
{
$conditionalFormattingRuleExtensions = ConditionalFormattingRuleExtension::parseExtLstXml($extLst);
$conditionalStyles = [];
@@ -213,7 +217,7 @@ class ConditionalStyles
if (isset($cfRule->dataBar)) {
$objConditional->setDataBar(
- $this->readDataBarOfConditionalRule($cfRule, $conditionalFormattingRuleExtensions)
+ $this->readDataBarOfConditionalRule($cfRule, $conditionalFormattingRuleExtensions) // @phpstan-ignore-line
);
} else {
$objConditional->setStyle(clone $this->dxfs[(int) ($cfRule['dxfId'])]);
@@ -225,7 +229,10 @@ class ConditionalStyles
return $conditionalStyles;
}
- private function readDataBarOfConditionalRule($cfRule, $conditionalFormattingRuleExtensions): ConditionalDataBar
+ /**
+ * @param SimpleXMLElement|stdClass $cfRule
+ */
+ private function readDataBarOfConditionalRule($cfRule, array $conditionalFormattingRuleExtensions): ConditionalDataBar
{
$dataBar = new ConditionalDataBar();
//dataBar attribute
@@ -257,7 +264,10 @@ class ConditionalStyles
return $dataBar;
}
- private function readDataBarExtLstOfConditionalRule(ConditionalDataBar $dataBar, $cfRule, $conditionalFormattingRuleExtensions): void
+ /**
+ * @param SimpleXMLElement|stdClass $cfRule
+ */
+ private function readDataBarExtLstOfConditionalRule(ConditionalDataBar $dataBar, $cfRule, array $conditionalFormattingRuleExtensions): void
{
if (isset($cfRule->extLst)) {
$ns = $cfRule->extLst->getNamespaces(true);
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php
index b699cb574..dac76230c 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php
@@ -8,8 +8,10 @@ use SimpleXMLElement;
class DataValidations
{
+ /** @var Worksheet */
private $worksheet;
+ /** @var SimpleXMLElement */
private $worksheetXml;
public function __construct(Worksheet $workSheet, SimpleXMLElement $worksheetXml)
@@ -22,7 +24,7 @@ class DataValidations
{
foreach ($this->worksheetXml->dataValidations->dataValidation as $dataValidation) {
// Uppercase coordinate
- $range = strtoupper($dataValidation['sqref']);
+ $range = strtoupper((string) $dataValidation['sqref']);
$rangeSet = explode(' ', $range);
foreach ($rangeSet as $range) {
$stRange = $this->worksheet->shrinkRangeToFit($range);
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php
index 848849962..7d48c7967 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php
@@ -9,8 +9,10 @@ use SimpleXMLElement;
class Hyperlinks
{
+ /** @var Worksheet */
private $worksheet;
+ /** @var array */
private $hyperlinks = [];
public function __construct(Worksheet $workSheet)
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php
index 56f18f98b..08decd6e4 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php
@@ -8,8 +8,10 @@ use SimpleXMLElement;
class PageSetup extends BaseParserClass
{
+ /** @var Worksheet */
private $worksheet;
+ /** @var ?SimpleXMLElement */
private $worksheetXml;
public function __construct(Worksheet $workSheet, ?SimpleXMLElement $worksheetXml = null)
@@ -18,16 +20,17 @@ class PageSetup extends BaseParserClass
$this->worksheetXml = $worksheetXml;
}
- public function load(array $unparsedLoadedData)
+ public function load(array $unparsedLoadedData): array
{
- if (!$this->worksheetXml) {
+ $worksheetXml = $this->worksheetXml;
+ if ($worksheetXml === null) {
return $unparsedLoadedData;
}
- $this->margins($this->worksheetXml, $this->worksheet);
- $unparsedLoadedData = $this->pageSetup($this->worksheetXml, $this->worksheet, $unparsedLoadedData);
- $this->headerFooter($this->worksheetXml, $this->worksheet);
- $this->pageBreaks($this->worksheetXml, $this->worksheet);
+ $this->margins($worksheetXml, $this->worksheet);
+ $unparsedLoadedData = $this->pageSetup($worksheetXml, $this->worksheet, $unparsedLoadedData);
+ $this->headerFooter($worksheetXml, $this->worksheet);
+ $this->pageBreaks($worksheetXml, $this->worksheet);
return $unparsedLoadedData;
}
@@ -45,7 +48,7 @@ class PageSetup extends BaseParserClass
}
}
- private function pageSetup(SimpleXMLElement $xmlSheet, Worksheet $worksheet, array $unparsedLoadedData)
+ private function pageSetup(SimpleXMLElement $xmlSheet, Worksheet $worksheet, array $unparsedLoadedData): array
{
if ($xmlSheet->pageSetup) {
$docPageSetup = $worksheet->getPageSetup();
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php
index a302cc569..9c02da9f8 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php
@@ -7,8 +7,10 @@ use SimpleXMLElement;
class SheetViewOptions extends BaseParserClass
{
+ /** @var Worksheet */
private $worksheet;
+ /** @var ?SimpleXMLElement */
private $worksheetXml;
public function __construct(Worksheet $workSheet, ?SimpleXMLElement $worksheetXml = null)
@@ -24,10 +26,11 @@ class SheetViewOptions extends BaseParserClass
}
if (isset($this->worksheetXml->sheetPr)) {
- $this->tabColor($this->worksheetXml->sheetPr, $styleReader);
- $this->codeName($this->worksheetXml->sheetPr);
- $this->outlines($this->worksheetXml->sheetPr);
- $this->pageSetup($this->worksheetXml->sheetPr);
+ $sheetPr = $this->worksheetXml->sheetPr;
+ $this->tabColor($sheetPr, $styleReader);
+ $this->codeName($sheetPr);
+ $this->outlines($sheetPr);
+ $this->pageSetup($sheetPr);
}
if (isset($this->worksheetXml->sheetFormatPr)) {
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php
index 9d61e3d36..4743afbf9 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php
@@ -29,7 +29,7 @@ class WorkbookView
$this->spreadsheet->setActiveSheetIndex(0);
$workbookView = $xmlWorkbook->children($mainNS)->bookViews->workbookView;
- if (($readDataOnly !== true || !empty($this->loadSheetsOnly)) && !empty($workbookView)) {
+ if ($readDataOnly !== true && !empty($workbookView)) {
$workbookViewAttributes = self::testSimpleXml(self::getAttributes($workbookView));
// active sheet index
$activeTab = (int) $workbookViewAttributes->activeTab; // refers to old sheet index
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php
index 0b5e0966c..d8f0d9dcd 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php
@@ -18,6 +18,7 @@ use PhpOffice\PhpSpreadsheet\Shared\Date;
use PhpOffice\PhpSpreadsheet\Shared\File;
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use SimpleXMLElement;
/**
@@ -364,7 +365,7 @@ class Xml extends BaseReader
$rowTo = $rowTo + $cell_ss['MergeDown'];
}
$cellRange .= ':' . $columnTo . $rowTo;
- $spreadsheet->getActiveSheet()->mergeCells($cellRange);
+ $spreadsheet->getActiveSheet()->mergeCells($cellRange, Worksheet::MERGE_CELL_CONTENT_HIDE);
}
$hasCalculatedValue = false;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php
index 08a38b3bb..3f53ed1d4 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php
@@ -253,10 +253,11 @@ class ReferenceHelper
? uksort($aDataValidationCollection, [self::class, 'cellReverseSort'])
: uksort($aDataValidationCollection, [self::class, 'cellSort']);
- foreach ($aDataValidationCollection as $cellAddress => $value) {
+ foreach ($aDataValidationCollection as $cellAddress => $dataValidation) {
$newReference = $this->updateCellReference($cellAddress);
if ($cellAddress !== $newReference) {
- $worksheet->setDataValidation($newReference, $value);
+ $dataValidation->setSqref($newReference);
+ $worksheet->setDataValidation($newReference, $dataValidation);
$worksheet->setDataValidation($cellAddress, null);
}
}
@@ -537,11 +538,7 @@ class ReferenceHelper
// Update workbook: define names
if (count($worksheet->getParent()->getDefinedNames()) > 0) {
- foreach ($worksheet->getParent()->getDefinedNames() as $definedName) {
- if ($definedName->getWorksheet() !== null && $definedName->getWorksheet()->getHashCode() === $worksheet->getHashCode()) {
- $definedName->setValue($this->updateCellReference($definedName->getValue()));
- }
- }
+ $this->updateDefinedNames($worksheet, $beforeCellAddress, $numberOfColumns, $numberOfRows);
}
// Garbage collect
@@ -865,13 +862,13 @@ class ReferenceHelper
}
/**
- * Update named formulas (i.e. containing worksheet references / named ranges).
+ * Update named formulae (i.e. containing worksheet references / named ranges).
*
* @param Spreadsheet $spreadsheet Object to update
* @param string $oldName Old name (name to replace)
* @param string $newName New name
*/
- public function updateNamedFormulas(Spreadsheet $spreadsheet, $oldName = '', $newName = ''): void
+ public function updateNamedFormulae(Spreadsheet $spreadsheet, $oldName = '', $newName = ''): void
{
if ($oldName == '') {
return;
@@ -880,7 +877,7 @@ class ReferenceHelper
foreach ($spreadsheet->getWorksheetIterator() as $sheet) {
foreach ($sheet->getCoordinates(false) as $coordinate) {
$cell = $sheet->getCell($coordinate);
- if (($cell !== null) && ($cell->getDataType() === DataType::TYPE_FORMULA)) {
+ if ($cell->getDataType() === DataType::TYPE_FORMULA) {
$formula = $cell->getValue();
if (strpos($formula, $oldName) !== false) {
$formula = str_replace("'" . $oldName . "'!", "'" . $newName . "'!", $formula);
@@ -892,6 +889,40 @@ class ReferenceHelper
}
}
+ private function updateDefinedNames(Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
+ {
+ foreach ($worksheet->getParent()->getDefinedNames() as $definedName) {
+ if ($definedName->isFormula() === false) {
+ $this->updateNamedRange($definedName, $worksheet, $beforeCellAddress, $numberOfColumns, $numberOfRows);
+ } else {
+ $this->updateNamedFormula($definedName, $worksheet, $beforeCellAddress, $numberOfColumns, $numberOfRows);
+ }
+ }
+ }
+
+ private function updateNamedRange(DefinedName $definedName, Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
+ {
+ $cellAddress = $definedName->getValue();
+ $asFormula = ($cellAddress[0] === '=');
+ if ($definedName->getWorksheet() !== null && $definedName->getWorksheet()->getHashCode() === $worksheet->getHashCode()) {
+ if ($asFormula === true) {
+ $formula = $this->updateFormulaReferences($cellAddress, $beforeCellAddress, $numberOfColumns, $numberOfRows, $worksheet->getTitle());
+ $definedName->setValue($formula);
+ } else {
+ $definedName->setValue($this->updateCellReference(ltrim($cellAddress, '=')));
+ }
+ }
+ }
+
+ private function updateNamedFormula(DefinedName $definedName, Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
+ {
+ if ($definedName->getWorksheet() !== null && $definedName->getWorksheet()->getHashCode() === $worksheet->getHashCode()) {
+ $formula = $definedName->getValue();
+ $formula = $this->updateFormulaReferences($formula, $beforeCellAddress, $numberOfColumns, $numberOfRows, $worksheet->getTitle());
+ $definedName->setValue($formula);
+ }
+ }
+
/**
* Update cell range.
*
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php
index 5fbbadb67..3282a596e 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php
@@ -8,6 +8,7 @@ use PhpOffice\PhpSpreadsheet\Collection\Memory;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\SimpleCache\CacheInterface;
+use ReflectionClass;
class Settings
{
@@ -161,12 +162,19 @@ class Settings
public static function getCache(): CacheInterface
{
if (!self::$cache) {
- self::$cache = new Memory();
+ self::$cache = self::useSimpleCacheVersion3() ? new Memory\SimpleCache3() : new Memory\SimpleCache1();
}
return self::$cache;
}
+ public static function useSimpleCacheVersion3(): bool
+ {
+ return
+ PHP_MAJOR_VERSION === 8 &&
+ (new ReflectionClass(CacheInterface::class))->getMethod('get')->getReturnType() !== null;
+ }
+
/**
* Set the HTTP client implementation to be used for network request.
*/
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php
index 1adf213ec..e90c679b6 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php
@@ -13,7 +13,7 @@ class Font
const AUTOSIZE_METHOD_APPROX = 'approx';
const AUTOSIZE_METHOD_EXACT = 'exact';
- private static $autoSizeMethods = [
+ private const AUTOSIZE_METHODS = [
self::AUTOSIZE_METHOD_APPROX,
self::AUTOSIZE_METHOD_EXACT,
];
@@ -101,6 +101,105 @@ class Font
const VERDANA_ITALIC = 'verdanai.ttf';
const VERDANA_BOLD_ITALIC = 'verdanaz.ttf';
+ const FONT_FILE_NAMES = [
+ 'Arial' => [
+ 'x' => self::ARIAL,
+ 'xb' => self::ARIAL_BOLD,
+ 'xi' => self::ARIAL_ITALIC,
+ 'xbi' => self::ARIAL_BOLD_ITALIC,
+ ],
+ 'Calibri' => [
+ 'x' => self::CALIBRI,
+ 'xb' => self::CALIBRI_BOLD,
+ 'xi' => self::CALIBRI_ITALIC,
+ 'xbi' => self::CALIBRI_BOLD_ITALIC,
+ ],
+ 'Comic Sans MS' => [
+ 'x' => self::COMIC_SANS_MS,
+ 'xb' => self::COMIC_SANS_MS_BOLD,
+ 'xi' => self::COMIC_SANS_MS,
+ 'xbi' => self::COMIC_SANS_MS_BOLD,
+ ],
+ 'Courier New' => [
+ 'x' => self::COURIER_NEW,
+ 'xb' => self::COURIER_NEW_BOLD,
+ 'xi' => self::COURIER_NEW_ITALIC,
+ 'xbi' => self::COURIER_NEW_BOLD_ITALIC,
+ ],
+ 'Georgia' => [
+ 'x' => self::GEORGIA,
+ 'xb' => self::GEORGIA_BOLD,
+ 'xi' => self::GEORGIA_ITALIC,
+ 'xbi' => self::GEORGIA_BOLD_ITALIC,
+ ],
+ 'Impact' => [
+ 'x' => self::IMPACT,
+ 'xb' => self::IMPACT,
+ 'xi' => self::IMPACT,
+ 'xbi' => self::IMPACT,
+ ],
+ 'Liberation Sans' => [
+ 'x' => self::LIBERATION_SANS,
+ 'xb' => self::LIBERATION_SANS_BOLD,
+ 'xi' => self::LIBERATION_SANS_ITALIC,
+ 'xbi' => self::LIBERATION_SANS_BOLD_ITALIC,
+ ],
+ 'Lucida Console' => [
+ 'x' => self::LUCIDA_CONSOLE,
+ 'xb' => self::LUCIDA_CONSOLE,
+ 'xi' => self::LUCIDA_CONSOLE,
+ 'xbi' => self::LUCIDA_CONSOLE,
+ ],
+ 'Lucida Sans Unicode' => [
+ 'x' => self::LUCIDA_SANS_UNICODE,
+ 'xb' => self::LUCIDA_SANS_UNICODE,
+ 'xi' => self::LUCIDA_SANS_UNICODE,
+ 'xbi' => self::LUCIDA_SANS_UNICODE,
+ ],
+ 'Microsoft Sans Serif' => [
+ 'x' => self::MICROSOFT_SANS_SERIF,
+ 'xb' => self::MICROSOFT_SANS_SERIF,
+ 'xi' => self::MICROSOFT_SANS_SERIF,
+ 'xbi' => self::MICROSOFT_SANS_SERIF,
+ ],
+ 'Palatino Linotype' => [
+ 'x' => self::PALATINO_LINOTYPE,
+ 'xb' => self::PALATINO_LINOTYPE_BOLD,
+ 'xi' => self::PALATINO_LINOTYPE_ITALIC,
+ 'xbi' => self::PALATINO_LINOTYPE_BOLD_ITALIC,
+ ],
+ 'Symbol' => [
+ 'x' => self::SYMBOL,
+ 'xb' => self::SYMBOL,
+ 'xi' => self::SYMBOL,
+ 'xbi' => self::SYMBOL,
+ ],
+ 'Tahoma' => [
+ 'x' => self::TAHOMA,
+ 'xb' => self::TAHOMA_BOLD,
+ 'xi' => self::TAHOMA,
+ 'xbi' => self::TAHOMA_BOLD,
+ ],
+ 'Times New Roman' => [
+ 'x' => self::TIMES_NEW_ROMAN,
+ 'xb' => self::TIMES_NEW_ROMAN_BOLD,
+ 'xi' => self::TIMES_NEW_ROMAN_ITALIC,
+ 'xbi' => self::TIMES_NEW_ROMAN_BOLD_ITALIC,
+ ],
+ 'Trebuchet MS' => [
+ 'x' => self::TREBUCHET_MS,
+ 'xb' => self::TREBUCHET_MS_BOLD,
+ 'xi' => self::TREBUCHET_MS_ITALIC,
+ 'xbi' => self::TREBUCHET_MS_BOLD_ITALIC,
+ ],
+ 'Verdana' => [
+ 'x' => self::VERDANA,
+ 'xb' => self::VERDANA_BOLD,
+ 'xi' => self::VERDANA_ITALIC,
+ 'xbi' => self::VERDANA_BOLD_ITALIC,
+ ],
+ ];
+
/**
* AutoSize method.
*
@@ -113,54 +212,65 @@ class Font
*
* @var string
*/
- private static $trueTypeFontPath;
+ private static $trueTypeFontPath = '';
/**
* How wide is a default column for a given default font and size?
* Empirical data found by inspecting real Excel files and reading off the pixel width
* in Microsoft Office Excel 2007.
+ * Added height in points.
+ */
+ public const DEFAULT_COLUMN_WIDTHS = [
+ 'Arial' => [
+ 1 => ['px' => 24, 'width' => 12.00000000, 'height' => 5.25],
+ 2 => ['px' => 24, 'width' => 12.00000000, 'height' => 5.25],
+ 3 => ['px' => 32, 'width' => 10.66406250, 'height' => 6.0],
+
+ 4 => ['px' => 32, 'width' => 10.66406250, 'height' => 6.75],
+ 5 => ['px' => 40, 'width' => 10.00000000, 'height' => 8.25],
+ 6 => ['px' => 48, 'width' => 9.59765625, 'height' => 8.25],
+ 7 => ['px' => 48, 'width' => 9.59765625, 'height' => 9.0],
+ 8 => ['px' => 56, 'width' => 9.33203125, 'height' => 11.25],
+ 9 => ['px' => 64, 'width' => 9.14062500, 'height' => 12.0],
+ 10 => ['px' => 64, 'width' => 9.14062500, 'height' => 12.75],
+ ],
+ 'Calibri' => [
+ 1 => ['px' => 24, 'width' => 12.00000000, 'height' => 5.25],
+ 2 => ['px' => 24, 'width' => 12.00000000, 'height' => 5.25],
+ 3 => ['px' => 32, 'width' => 10.66406250, 'height' => 6.00],
+ 4 => ['px' => 32, 'width' => 10.66406250, 'height' => 6.75],
+ 5 => ['px' => 40, 'width' => 10.00000000, 'height' => 8.25],
+ 6 => ['px' => 48, 'width' => 9.59765625, 'height' => 8.25],
+ 7 => ['px' => 48, 'width' => 9.59765625, 'height' => 9.0],
+ 8 => ['px' => 56, 'width' => 9.33203125, 'height' => 11.25],
+ 9 => ['px' => 56, 'width' => 9.33203125, 'height' => 12.0],
+ 10 => ['px' => 64, 'width' => 9.14062500, 'height' => 12.75],
+ 11 => ['px' => 64, 'width' => 9.14062500, 'height' => 15.0],
+ ],
+ 'Verdana' => [
+ 1 => ['px' => 24, 'width' => 12.00000000, 'height' => 5.25],
+ 2 => ['px' => 24, 'width' => 12.00000000, 'height' => 5.25],
+ 3 => ['px' => 32, 'width' => 10.66406250, 'height' => 6.0],
+ 4 => ['px' => 32, 'width' => 10.66406250, 'height' => 6.75],
+ 5 => ['px' => 40, 'width' => 10.00000000, 'height' => 8.25],
+ 6 => ['px' => 48, 'width' => 9.59765625, 'height' => 8.25],
+ 7 => ['px' => 48, 'width' => 9.59765625, 'height' => 9.0],
+ 8 => ['px' => 64, 'width' => 9.14062500, 'height' => 10.5],
+ 9 => ['px' => 72, 'width' => 9.00000000, 'height' => 11.25],
+ 10 => ['px' => 72, 'width' => 9.00000000, 'height' => 12.75],
+ ],
+ ];
+
+ /**
+ * List of column widths. Replaced by constant;
+ * previously it was public and updateable, allowing
+ * user to make inappropriate alterations.
+ *
+ * @deprecated 1.25.0 Use DEFAULT_COLUMN_WIDTHS constant instead.
*
* @var array
*/
- public static $defaultColumnWidths = [
- 'Arial' => [
- 1 => ['px' => 24, 'width' => 12.00000000],
- 2 => ['px' => 24, 'width' => 12.00000000],
- 3 => ['px' => 32, 'width' => 10.66406250],
- 4 => ['px' => 32, 'width' => 10.66406250],
- 5 => ['px' => 40, 'width' => 10.00000000],
- 6 => ['px' => 48, 'width' => 9.59765625],
- 7 => ['px' => 48, 'width' => 9.59765625],
- 8 => ['px' => 56, 'width' => 9.33203125],
- 9 => ['px' => 64, 'width' => 9.14062500],
- 10 => ['px' => 64, 'width' => 9.14062500],
- ],
- 'Calibri' => [
- 1 => ['px' => 24, 'width' => 12.00000000],
- 2 => ['px' => 24, 'width' => 12.00000000],
- 3 => ['px' => 32, 'width' => 10.66406250],
- 4 => ['px' => 32, 'width' => 10.66406250],
- 5 => ['px' => 40, 'width' => 10.00000000],
- 6 => ['px' => 48, 'width' => 9.59765625],
- 7 => ['px' => 48, 'width' => 9.59765625],
- 8 => ['px' => 56, 'width' => 9.33203125],
- 9 => ['px' => 56, 'width' => 9.33203125],
- 10 => ['px' => 64, 'width' => 9.14062500],
- 11 => ['px' => 64, 'width' => 9.14062500],
- ],
- 'Verdana' => [
- 1 => ['px' => 24, 'width' => 12.00000000],
- 2 => ['px' => 24, 'width' => 12.00000000],
- 3 => ['px' => 32, 'width' => 10.66406250],
- 4 => ['px' => 32, 'width' => 10.66406250],
- 5 => ['px' => 40, 'width' => 10.00000000],
- 6 => ['px' => 48, 'width' => 9.59765625],
- 7 => ['px' => 48, 'width' => 9.59765625],
- 8 => ['px' => 64, 'width' => 9.14062500],
- 9 => ['px' => 72, 'width' => 9.00000000],
- 10 => ['px' => 72, 'width' => 9.00000000],
- ],
- ];
+ public static $defaultColumnWidths = self::DEFAULT_COLUMN_WIDTHS;
/**
* Set autoSize method.
@@ -171,7 +281,7 @@ class Font
*/
public static function setAutoSizeMethod($method)
{
- if (!in_array($method, self::$autoSizeMethods)) {
+ if (!in_array($method, self::AUTOSIZE_METHODS)) {
return false;
}
self::$autoSizeMethod = $method;
@@ -219,7 +329,7 @@ class Font
* Calculate an (approximate) OpenXML column width, based on font size and text contained.
*
* @param FontStyle $font Font object
- * @param RichText|string $cellText Text to calculate width
+ * @param null|RichText|string $cellText Text to calculate width
* @param int $rotation Rotation angle
* @param null|FontStyle $defaultFont Font object
* @param bool $filterAdjustment Add space for Autofilter or Table dropdown
@@ -238,7 +348,8 @@ class Font
}
// Special case if there are one or more newline characters ("\n")
- if (strpos($cellText ?? '', "\n") !== false) {
+ $cellText = $cellText ?? '';
+ if (strpos(/** @scrutinizer ignore-type */ $cellText, "\n") !== false) {
$lineTexts = explode("\n", $cellText);
$lineWidths = [];
foreach ($lineTexts as $lineText) {
@@ -281,7 +392,7 @@ class Font
}
// Convert from pixel width to column width
- $columnWidth = Drawing::pixelsToCellDimension((int) $columnWidth, $defaultFont);
+ $columnWidth = Drawing::pixelsToCellDimension((int) $columnWidth, $defaultFont ?? new FontStyle());
// Return
return (int) round($columnWidth, 6);
@@ -299,7 +410,12 @@ class Font
// font size should really be supplied in pixels in GD2,
// but since GD2 seems to assume 72dpi, pixels and points are the same
$fontFile = self::getTrueTypeFontFileFromFont($font);
- $textBox = imagettfbbox($font->getSize(), $rotation, $fontFile, $text);
+ $textBox = imagettfbbox($font->getSize() ?? 10.0, $rotation, $fontFile, $text);
+ if ($textBox === false) {
+ // @codeCoverageIgnoreStart
+ throw new PhpSpreadsheetException('imagettfbbox failed');
+ // @codeCoverageIgnoreEnd
+ }
// Get corners positions
$lowerLeftCornerX = $textBox[0];
@@ -409,129 +525,48 @@ class Font
*
* @return string Path to TrueType font file
*/
- public static function getTrueTypeFontFileFromFont(FontStyle $font)
+ public static function getTrueTypeFontFileFromFont(FontStyle $font, bool $checkPath = true)
{
- if (!file_exists(self::$trueTypeFontPath) || !is_dir(self::$trueTypeFontPath)) {
+ if ($checkPath && (!file_exists(self::$trueTypeFontPath) || !is_dir(self::$trueTypeFontPath))) {
throw new PhpSpreadsheetException('Valid directory to TrueType Font files not specified');
}
$name = $font->getName();
+ if (!isset(self::FONT_FILE_NAMES[$name])) {
+ throw new PhpSpreadsheetException('Unknown font name "' . $name . '". Cannot map to TrueType font file');
+ }
$bold = $font->getBold();
$italic = $font->getItalic();
-
- // Check if we can map font to true type font file
- switch ($name) {
- case 'Arial':
- $fontFile = (
- $bold ? ($italic ? self::ARIAL_BOLD_ITALIC : self::ARIAL_BOLD)
- : ($italic ? self::ARIAL_ITALIC : self::ARIAL)
- );
-
- break;
- case 'Calibri':
- $fontFile = (
- $bold ? ($italic ? self::CALIBRI_BOLD_ITALIC : self::CALIBRI_BOLD)
- : ($italic ? self::CALIBRI_ITALIC : self::CALIBRI)
- );
-
- break;
- case 'Courier New':
- $fontFile = (
- $bold ? ($italic ? self::COURIER_NEW_BOLD_ITALIC : self::COURIER_NEW_BOLD)
- : ($italic ? self::COURIER_NEW_ITALIC : self::COURIER_NEW)
- );
-
- break;
- case 'Comic Sans MS':
- $fontFile = (
- $bold ? self::COMIC_SANS_MS_BOLD : self::COMIC_SANS_MS
- );
-
- break;
- case 'Georgia':
- $fontFile = (
- $bold ? ($italic ? self::GEORGIA_BOLD_ITALIC : self::GEORGIA_BOLD)
- : ($italic ? self::GEORGIA_ITALIC : self::GEORGIA)
- );
-
- break;
- case 'Impact':
- $fontFile = self::IMPACT;
-
- break;
- case 'Liberation Sans':
- $fontFile = (
- $bold ? ($italic ? self::LIBERATION_SANS_BOLD_ITALIC : self::LIBERATION_SANS_BOLD)
- : ($italic ? self::LIBERATION_SANS_ITALIC : self::LIBERATION_SANS)
- );
-
- break;
- case 'Lucida Console':
- $fontFile = self::LUCIDA_CONSOLE;
-
- break;
- case 'Lucida Sans Unicode':
- $fontFile = self::LUCIDA_SANS_UNICODE;
-
- break;
- case 'Microsoft Sans Serif':
- $fontFile = self::MICROSOFT_SANS_SERIF;
-
- break;
- case 'Palatino Linotype':
- $fontFile = (
- $bold ? ($italic ? self::PALATINO_LINOTYPE_BOLD_ITALIC : self::PALATINO_LINOTYPE_BOLD)
- : ($italic ? self::PALATINO_LINOTYPE_ITALIC : self::PALATINO_LINOTYPE)
- );
-
- break;
- case 'Symbol':
- $fontFile = self::SYMBOL;
-
- break;
- case 'Tahoma':
- $fontFile = (
- $bold ? self::TAHOMA_BOLD : self::TAHOMA
- );
-
- break;
- case 'Times New Roman':
- $fontFile = (
- $bold ? ($italic ? self::TIMES_NEW_ROMAN_BOLD_ITALIC : self::TIMES_NEW_ROMAN_BOLD)
- : ($italic ? self::TIMES_NEW_ROMAN_ITALIC : self::TIMES_NEW_ROMAN)
- );
-
- break;
- case 'Trebuchet MS':
- $fontFile = (
- $bold ? ($italic ? self::TREBUCHET_MS_BOLD_ITALIC : self::TREBUCHET_MS_BOLD)
- : ($italic ? self::TREBUCHET_MS_ITALIC : self::TREBUCHET_MS)
- );
-
- break;
- case 'Verdana':
- $fontFile = (
- $bold ? ($italic ? self::VERDANA_BOLD_ITALIC : self::VERDANA_BOLD)
- : ($italic ? self::VERDANA_ITALIC : self::VERDANA)
- );
-
- break;
- default:
- throw new PhpSpreadsheetException('Unknown font name "' . $name . '". Cannot map to TrueType font file');
-
- break;
+ $index = 'x';
+ if ($bold) {
+ $index .= 'b';
}
+ if ($italic) {
+ $index .= 'i';
+ }
+ $fontFile = self::FONT_FILE_NAMES[$name][$index];
- $fontFile = self::$trueTypeFontPath . $fontFile;
+ $separator = '';
+ if (mb_strlen(self::$trueTypeFontPath) > 1 && mb_substr(self::$trueTypeFontPath, -1) !== '/' && mb_substr(self::$trueTypeFontPath, -1) !== '\\') {
+ $separator = DIRECTORY_SEPARATOR;
+ }
+ $fontFile = self::$trueTypeFontPath . $separator . $fontFile;
// Check if file actually exists
- if (!file_exists($fontFile)) {
+ if ($checkPath && !file_exists($fontFile)) {
throw new PhpSpreadsheetException('TrueType Font file not found');
}
return $fontFile;
}
+ public const CHARSET_FROM_FONT_NAME = [
+ 'EucrosiaUPC' => self::CHARSET_ANSI_THAI,
+ 'Wingdings' => self::CHARSET_SYMBOL,
+ 'Wingdings 2' => self::CHARSET_SYMBOL,
+ 'Wingdings 3' => self::CHARSET_SYMBOL,
+ ];
+
/**
* Returns the associated charset for the font name.
*
@@ -541,19 +576,7 @@ class Font
*/
public static function getCharsetFromFontName($fontName)
{
- switch ($fontName) {
- // Add more cases. Check FONT records in real Excel files.
- case 'EucrosiaUPC':
- return self::CHARSET_ANSI_THAI;
- case 'Wingdings':
- return self::CHARSET_SYMBOL;
- case 'Wingdings 2':
- return self::CHARSET_SYMBOL;
- case 'Wingdings 3':
- return self::CHARSET_SYMBOL;
- default:
- return self::CHARSET_ANSI_LATIN;
- }
+ return self::CHARSET_FROM_FONT_NAME[$fontName] ?? self::CHARSET_ANSI_LATIN;
}
/**
@@ -567,17 +590,17 @@ class Font
*/
public static function getDefaultColumnWidthByFont(FontStyle $font, $returnAsPixels = false)
{
- if (isset(self::$defaultColumnWidths[$font->getName()][$font->getSize()])) {
+ if (isset(self::DEFAULT_COLUMN_WIDTHS[$font->getName()][$font->getSize()])) {
// Exact width can be determined
$columnWidth = $returnAsPixels ?
- self::$defaultColumnWidths[$font->getName()][$font->getSize()]['px']
- : self::$defaultColumnWidths[$font->getName()][$font->getSize()]['width'];
+ self::DEFAULT_COLUMN_WIDTHS[$font->getName()][$font->getSize()]['px']
+ : self::DEFAULT_COLUMN_WIDTHS[$font->getName()][$font->getSize()]['width'];
} else {
// We don't have data for this particular font and size, use approximation by
// extrapolating from Calibri 11
$columnWidth = $returnAsPixels ?
- self::$defaultColumnWidths['Calibri'][11]['px']
- : self::$defaultColumnWidths['Calibri'][11]['width'];
+ self::DEFAULT_COLUMN_WIDTHS['Calibri'][11]['px']
+ : self::DEFAULT_COLUMN_WIDTHS['Calibri'][11]['width'];
$columnWidth = $columnWidth * $font->getSize() / 11;
// Round pixels to closest integer
@@ -599,173 +622,14 @@ class Font
*/
public static function getDefaultRowHeightByFont(FontStyle $font)
{
- switch ($font->getName()) {
- case 'Arial':
- switch ($font->getSize()) {
- case 10:
- // inspection of Arial 10 workbook says 12.75pt ~17px
- $rowHeight = 12.75;
-
- break;
- case 9:
- // inspection of Arial 9 workbook says 12.00pt ~16px
- $rowHeight = 12;
-
- break;
- case 8:
- // inspection of Arial 8 workbook says 11.25pt ~15px
- $rowHeight = 11.25;
-
- break;
- case 7:
- // inspection of Arial 7 workbook says 9.00pt ~12px
- $rowHeight = 9;
-
- break;
- case 6:
- case 5:
- // inspection of Arial 5,6 workbook says 8.25pt ~11px
- $rowHeight = 8.25;
-
- break;
- case 4:
- // inspection of Arial 4 workbook says 6.75pt ~9px
- $rowHeight = 6.75;
-
- break;
- case 3:
- // inspection of Arial 3 workbook says 6.00pt ~8px
- $rowHeight = 6;
-
- break;
- case 2:
- case 1:
- // inspection of Arial 1,2 workbook says 5.25pt ~7px
- $rowHeight = 5.25;
-
- break;
- default:
- // use Arial 10 workbook as an approximation, extrapolation
- $rowHeight = 12.75 * $font->getSize() / 10;
-
- break;
- }
-
- break;
- case 'Calibri':
- switch ($font->getSize()) {
- case 11:
- // inspection of Calibri 11 workbook says 15.00pt ~20px
- $rowHeight = 15;
-
- break;
- case 10:
- // inspection of Calibri 10 workbook says 12.75pt ~17px
- $rowHeight = 12.75;
-
- break;
- case 9:
- // inspection of Calibri 9 workbook says 12.00pt ~16px
- $rowHeight = 12;
-
- break;
- case 8:
- // inspection of Calibri 8 workbook says 11.25pt ~15px
- $rowHeight = 11.25;
-
- break;
- case 7:
- // inspection of Calibri 7 workbook says 9.00pt ~12px
- $rowHeight = 9;
-
- break;
- case 6:
- case 5:
- // inspection of Calibri 5,6 workbook says 8.25pt ~11px
- $rowHeight = 8.25;
-
- break;
- case 4:
- // inspection of Calibri 4 workbook says 6.75pt ~9px
- $rowHeight = 6.75;
-
- break;
- case 3:
- // inspection of Calibri 3 workbook says 6.00pt ~8px
- $rowHeight = 6.00;
-
- break;
- case 2:
- case 1:
- // inspection of Calibri 1,2 workbook says 5.25pt ~7px
- $rowHeight = 5.25;
-
- break;
- default:
- // use Calibri 11 workbook as an approximation, extrapolation
- $rowHeight = 15 * $font->getSize() / 11;
-
- break;
- }
-
- break;
- case 'Verdana':
- switch ($font->getSize()) {
- case 10:
- // inspection of Verdana 10 workbook says 12.75pt ~17px
- $rowHeight = 12.75;
-
- break;
- case 9:
- // inspection of Verdana 9 workbook says 11.25pt ~15px
- $rowHeight = 11.25;
-
- break;
- case 8:
- // inspection of Verdana 8 workbook says 10.50pt ~14px
- $rowHeight = 10.50;
-
- break;
- case 7:
- // inspection of Verdana 7 workbook says 9.00pt ~12px
- $rowHeight = 9.00;
-
- break;
- case 6:
- case 5:
- // inspection of Verdana 5,6 workbook says 8.25pt ~11px
- $rowHeight = 8.25;
-
- break;
- case 4:
- // inspection of Verdana 4 workbook says 6.75pt ~9px
- $rowHeight = 6.75;
-
- break;
- case 3:
- // inspection of Verdana 3 workbook says 6.00pt ~8px
- $rowHeight = 6;
-
- break;
- case 2:
- case 1:
- // inspection of Verdana 1,2 workbook says 5.25pt ~7px
- $rowHeight = 5.25;
-
- break;
- default:
- // use Verdana 10 workbook as an approximation, extrapolation
- $rowHeight = 12.75 * $font->getSize() / 10;
-
- break;
- }
-
- break;
- default:
- // just use Calibri as an approximation
- $rowHeight = 15 * $font->getSize() / 11;
-
- break;
+ $name = $font->getName();
+ $size = $font->getSize();
+ if (isset(self::DEFAULT_COLUMN_WIDTHS[$name][$size])) {
+ $rowHeight = self::DEFAULT_COLUMN_WIDTHS[$name][$size]['height'];
+ } elseif ($name === 'Arial' || $name === 'Verdana') {
+ $rowHeight = self::DEFAULT_COLUMN_WIDTHS[$name][10]['height'] * $size / 10.0;
+ } else {
+ $rowHeight = self::DEFAULT_COLUMN_WIDTHS['Calibri'][11]['height'] * $size / 11.0;
}
return $rowHeight;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php
index 66111b6c8..1ec7f6abf 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php
@@ -495,7 +495,7 @@ class EigenvalueDecomposition
$this->V[$i][$n - 1] = $q * $z + $p * $this->V[$i][$n];
$this->V[$i][$n] = $q * $this->V[$i][$n] - $p * $z;
}
- // Complex pair
+ // Complex pair
} else {
$this->d[$n - 1] = $x + $p;
$this->d[$n] = $x + $p;
@@ -671,7 +671,7 @@ class EigenvalueDecomposition
} else {
$this->H[$i][$n] = -$r / ($eps * $norm);
}
- // Solve real equations
+ // Solve real equations
} else {
$x = $this->H[$i][$i + 1];
$y = $this->H[$i + 1][$i];
@@ -693,7 +693,7 @@ class EigenvalueDecomposition
}
}
}
- // Complex vector
+ // Complex vector
} elseif ($q < 0) {
$l = $n - 1;
// Last vector component imaginary so matrix is triangular
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php
index ab78ef18c..5e35d4919 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php
@@ -3,6 +3,7 @@
namespace PhpOffice\PhpSpreadsheet\Shared\JAMA;
use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalculationException;
+use PhpOffice\PhpSpreadsheet\Calculation\Functions;
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
@@ -66,21 +67,21 @@ class Matrix
$this->A = $args[0];
break;
- //Square matrix - n x n
+ //Square matrix - n x n
case 'integer':
$this->m = $args[0];
$this->n = $args[0];
$this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0));
break;
- //Rectangular matrix - m x n
+ //Rectangular matrix - m x n
case 'integer,integer':
$this->m = $args[0];
$this->n = $args[1];
$this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0));
break;
- //Rectangular matrix - m x n initialized from packed array
+ //Rectangular matrix - m x n initialized from packed array
case 'array,integer':
$this->m = $args[1];
if ($this->m != 0) {
@@ -190,7 +191,7 @@ class Matrix
return $R;
break;
- //A($i0...$iF; $j0...$jF)
+ //A($i0...$iF; $j0...$jF)
case 'integer,integer,integer,integer':
[$i0, $iF, $j0, $jF] = $args;
if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) {
@@ -213,7 +214,7 @@ class Matrix
return $R;
break;
- //$R = array of row indices; $C = array of column indices
+ //$R = array of row indices; $C = array of column indices
case 'array,array':
[$RL, $CL] = $args;
if (count($RL) > 0) {
@@ -236,7 +237,7 @@ class Matrix
return $R;
break;
- //A($i0...$iF); $CL = array of column indices
+ //A($i0...$iF); $CL = array of column indices
case 'integer,integer,array':
[$i0, $iF, $CL] = $args;
if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) {
@@ -259,7 +260,7 @@ class Matrix
return $R;
break;
- //$RL = array of row indices
+ //$RL = array of row indices
case 'array,integer,integer':
[$RL, $j0, $jF] = $args;
if (count($RL) > 0) {
@@ -532,14 +533,8 @@ class Matrix
for ($j = 0; $j < $this->n; ++$j) {
$validValues = true;
$value = $M->get($i, $j);
- if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
- $this->A[$i][$j] = trim($this->A[$i][$j], '"');
- $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]);
- }
- if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
- $value = trim($value, '"');
- $validValues &= StringHelper::convertToNumberIfFraction($value);
- }
+ [$this->A[$i][$j], $validValues] = $this->validateExtractedValue($this->A[$i][$j], $validValues);
+ [$value, $validValues] = $this->validateExtractedValue($value, $validValues);
if ($validValues) {
$this->A[$i][$j] += $value;
} else {
@@ -632,14 +627,8 @@ class Matrix
for ($j = 0; $j < $this->n; ++$j) {
$validValues = true;
$value = $M->get($i, $j);
- if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
- $this->A[$i][$j] = trim($this->A[$i][$j], '"');
- $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]);
- }
- if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
- $value = trim($value, '"');
- $validValues &= StringHelper::convertToNumberIfFraction($value);
- }
+ [$this->A[$i][$j], $validValues] = $this->validateExtractedValue($this->A[$i][$j], $validValues);
+ [$value, $validValues] = $this->validateExtractedValue($value, $validValues);
if ($validValues) {
$this->A[$i][$j] -= $value;
} else {
@@ -734,14 +723,8 @@ class Matrix
for ($j = 0; $j < $this->n; ++$j) {
$validValues = true;
$value = $M->get($i, $j);
- if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
- $this->A[$i][$j] = trim($this->A[$i][$j], '"');
- $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]);
- }
- if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
- $value = trim($value, '"');
- $validValues &= StringHelper::convertToNumberIfFraction($value);
- }
+ [$this->A[$i][$j], $validValues] = $this->validateExtractedValue($this->A[$i][$j], $validValues);
+ [$value, $validValues] = $this->validateExtractedValue($value, $validValues);
if ($validValues) {
$this->A[$i][$j] *= $value;
} else {
@@ -792,14 +775,8 @@ class Matrix
for ($j = 0; $j < $this->n; ++$j) {
$validValues = true;
$value = $M->get($i, $j);
- if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
- $this->A[$i][$j] = trim($this->A[$i][$j], '"');
- $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]);
- }
- if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
- $value = trim($value, '"');
- $validValues &= StringHelper::convertToNumberIfFraction($value);
- }
+ [$this->A[$i][$j], $validValues] = $this->validateExtractedValue($this->A[$i][$j], $validValues);
+ [$value, $validValues] = $this->validateExtractedValue($value, $validValues);
if ($validValues) {
if ($value == 0) {
// Trap for Divide by Zero error
@@ -1079,14 +1056,8 @@ class Matrix
for ($j = 0; $j < $this->n; ++$j) {
$validValues = true;
$value = $M->get($i, $j);
- if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) {
- $this->A[$i][$j] = trim($this->A[$i][$j], '"');
- $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]);
- }
- if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
- $value = trim($value, '"');
- $validValues &= StringHelper::convertToNumberIfFraction($value);
- }
+ [$this->A[$i][$j], $validValues] = $this->validateExtractedValue($this->A[$i][$j], $validValues);
+ [$value, $validValues] = $this->validateExtractedValue($value, $validValues);
if ($validValues) {
$this->A[$i][$j] = $this->A[$i][$j] ** $value;
} else {
@@ -1187,4 +1158,20 @@ class Matrix
return $L->det();
}
+
+ /**
+ * @param mixed $value
+ */
+ private function validateExtractedValue($value, bool $validValues): array
+ {
+ if (!is_numeric($value) && is_array($value)) {
+ $value = Functions::flattenArray($value)[0];
+ }
+ if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) {
+ $value = trim($value, '"');
+ $validValues &= StringHelper::convertToNumberIfFraction($value);
+ }
+
+ return [$value, $validValues];
+ }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php
index 6c8999d02..b809bfa1d 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php
@@ -315,7 +315,7 @@ class SingularValueDecomposition
}
break;
- // Split at negligible s(k).
+ // Split at negligible s(k).
case 2:
$f = $e[$k - 1];
$e[$k - 1] = 0.0;
@@ -336,7 +336,7 @@ class SingularValueDecomposition
}
break;
- // Perform one qr step.
+ // Perform one qr step.
case 3:
// Calculate the shift.
$scale = max(max(max(max(abs($this->s[$p - 1]), abs($this->s[$p - 2])), abs($e[$p - 2])), abs($this->s[$k])), abs($e[$k]));
@@ -396,7 +396,7 @@ class SingularValueDecomposition
$iter = $iter + 1;
break;
- // Convergence.
+ // Convergence.
case 4:
// Make the singular values positive.
if ($this->s[$k] <= 0.0) {
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php
index 030df66df..16026c3ca 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php
@@ -3,7 +3,6 @@
namespace PhpOffice\PhpSpreadsheet\Shared;
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
-use UConverter;
class StringHelper
{
@@ -334,26 +333,23 @@ class StringHelper
public static function sanitizeUTF8(string $textValue): string
{
$textValue = str_replace(["\xef\xbf\xbe", "\xef\xbf\xbf"], "\xef\xbf\xbd", $textValue);
- if (class_exists(UConverter::class)) {
- $returnValue = UConverter::transcode($textValue, 'UTF-8', 'UTF-8');
- if ($returnValue !== false) {
- return $returnValue;
- }
- }
- // @codeCoverageIgnoreStart
- // I don't think any of the code below should ever be executed.
- if (self::getIsIconvEnabled()) {
- $returnValue = @iconv('UTF-8', 'UTF-8', $textValue);
- if ($returnValue !== false) {
- return $returnValue;
- }
- }
-
+ $subst = mb_substitute_character(); // default is question mark
+ mb_substitute_character(65533); // Unicode substitution character
// Phpstan does not think this can return false.
$returnValue = mb_convert_encoding($textValue, 'UTF-8', 'UTF-8');
+ mb_substitute_character(/** @scrutinizer ignore-type */ $subst);
- return $returnValue;
- // @codeCoverageIgnoreEnd
+ return self::returnString($returnValue);
+ }
+
+ /**
+ * Strictly to satisfy Scrutinizer.
+ *
+ * @param mixed $value
+ */
+ private static function returnString($value): string
+ {
+ return is_string($value) ? $value : '';
}
/**
@@ -447,7 +443,7 @@ class StringHelper
}
}
- return mb_convert_encoding($textValue, $to, $from);
+ return self::returnString(mb_convert_encoding($textValue, $to, $from));
}
/**
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php
index 33b4fe0c4..364700e25 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php
@@ -3,10 +3,13 @@
namespace PhpOffice\PhpSpreadsheet;
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
+use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
+use PhpOffice\PhpSpreadsheet\Shared\File;
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
use PhpOffice\PhpSpreadsheet\Style\Style;
use PhpOffice\PhpSpreadsheet\Worksheet\Iterator;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
class Spreadsheet
{
@@ -721,6 +724,19 @@ class Spreadsheet
return null;
}
+ /**
+ * Get sheet by name, throwing exception if not found.
+ */
+ public function getSheetByNameOrThrow(string $worksheetName): Worksheet
+ {
+ $worksheet = $this->getSheetByName($worksheetName);
+ if ($worksheet === null) {
+ throw new Exception("Sheet $worksheetName does not exist.");
+ }
+
+ return $worksheet;
+ }
+
/**
* Get index for sheet.
*
@@ -1120,28 +1136,24 @@ class Spreadsheet
*/
public function copy()
{
- $copied = clone $this;
+ $filename = File::temporaryFilename();
+ $writer = new XlsxWriter($this);
+ $writer->setIncludeCharts(true);
+ $writer->save($filename);
- $worksheetCount = count($this->workSheetCollection);
- for ($i = 0; $i < $worksheetCount; ++$i) {
- $this->workSheetCollection[$i] = $this->workSheetCollection[$i]->copy();
- $this->workSheetCollection[$i]->rebindParent($this);
- }
+ $reader = new XlsxReader();
+ $reader->setIncludeCharts(true);
+ $reloadedSpreadsheet = $reader->load($filename);
+ unlink($filename);
- return $copied;
+ return $reloadedSpreadsheet;
}
- /**
- * Implement PHP __clone to create a deep clone, not just a shallow copy.
- */
public function __clone()
{
- // @phpstan-ignore-next-line
- foreach ($this as $key => $val) {
- if (is_object($val) || (is_array($val))) {
- $this->{$key} = unserialize(serialize($val));
- }
- }
+ throw new Exception(
+ 'Do not use clone on spreadsheet. Use spreadsheet->copy() instead.'
+ );
}
/**
@@ -1562,7 +1574,7 @@ class Spreadsheet
* Workbook window is hidden and cannot be shown in the
* user interface.
*
- * @param string $visibility visibility status of the workbook
+ * @param null|string $visibility visibility status of the workbook
*/
public function setVisibility($visibility): void
{
@@ -1596,7 +1608,7 @@ class Spreadsheet
*/
public function setTabRatio($tabRatio): void
{
- if ($tabRatio >= 0 || $tabRatio <= 1000) {
+ if ($tabRatio >= 0 && $tabRatio <= 1000) {
$this->tabRatio = (int) $tabRatio;
} else {
throw new Exception('Tab ratio must be between 0 and 1000.');
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php
index 83ac5b0da..68edfaca4 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php
@@ -15,6 +15,27 @@ class Alignment extends Supervisor
const HORIZONTAL_JUSTIFY = 'justify';
const HORIZONTAL_FILL = 'fill';
const HORIZONTAL_DISTRIBUTED = 'distributed'; // Excel2007 only
+ private const HORIZONTAL_CENTER_CONTINUOUS_LC = 'centercontinuous';
+ // Mapping for horizontal alignment
+ const HORIZONTAL_ALIGNMENT_FOR_XLSX = [
+ self::HORIZONTAL_LEFT => self::HORIZONTAL_LEFT,
+ self::HORIZONTAL_RIGHT => self::HORIZONTAL_RIGHT,
+ self::HORIZONTAL_CENTER => self::HORIZONTAL_CENTER,
+ self::HORIZONTAL_CENTER_CONTINUOUS => self::HORIZONTAL_CENTER_CONTINUOUS,
+ self::HORIZONTAL_JUSTIFY => self::HORIZONTAL_JUSTIFY,
+ self::HORIZONTAL_FILL => self::HORIZONTAL_FILL,
+ self::HORIZONTAL_DISTRIBUTED => self::HORIZONTAL_DISTRIBUTED,
+ ];
+ // Mapping for horizontal alignment CSS
+ const HORIZONTAL_ALIGNMENT_FOR_HTML = [
+ self::HORIZONTAL_LEFT => self::HORIZONTAL_LEFT,
+ self::HORIZONTAL_RIGHT => self::HORIZONTAL_RIGHT,
+ self::HORIZONTAL_CENTER => self::HORIZONTAL_CENTER,
+ self::HORIZONTAL_CENTER_CONTINUOUS => self::HORIZONTAL_CENTER,
+ self::HORIZONTAL_JUSTIFY => self::HORIZONTAL_JUSTIFY,
+ //self::HORIZONTAL_FILL => self::HORIZONTAL_FILL, // no reasonable equivalent for fill
+ self::HORIZONTAL_DISTRIBUTED => self::HORIZONTAL_JUSTIFY,
+ ];
// Vertical alignment styles
const VERTICAL_BOTTOM = 'bottom';
@@ -22,6 +43,45 @@ class Alignment extends Supervisor
const VERTICAL_CENTER = 'center';
const VERTICAL_JUSTIFY = 'justify';
const VERTICAL_DISTRIBUTED = 'distributed'; // Excel2007 only
+ // Vertical alignment CSS
+ private const VERTICAL_BASELINE = 'baseline';
+ private const VERTICAL_MIDDLE = 'middle';
+ private const VERTICAL_SUB = 'sub';
+ private const VERTICAL_SUPER = 'super';
+ private const VERTICAL_TEXT_BOTTOM = 'text-bottom';
+ private const VERTICAL_TEXT_TOP = 'text-top';
+
+ // Mapping for vertical alignment
+ const VERTICAL_ALIGNMENT_FOR_XLSX = [
+ self::VERTICAL_BOTTOM => self::VERTICAL_BOTTOM,
+ self::VERTICAL_TOP => self::VERTICAL_TOP,
+ self::VERTICAL_CENTER => self::VERTICAL_CENTER,
+ self::VERTICAL_JUSTIFY => self::VERTICAL_JUSTIFY,
+ self::VERTICAL_DISTRIBUTED => self::VERTICAL_DISTRIBUTED,
+ // css settings that arent't in sync with Excel
+ self::VERTICAL_BASELINE => self::VERTICAL_BOTTOM,
+ self::VERTICAL_MIDDLE => self::VERTICAL_CENTER,
+ self::VERTICAL_SUB => self::VERTICAL_BOTTOM,
+ self::VERTICAL_SUPER => self::VERTICAL_TOP,
+ self::VERTICAL_TEXT_BOTTOM => self::VERTICAL_BOTTOM,
+ self::VERTICAL_TEXT_TOP => self::VERTICAL_TOP,
+ ];
+
+ // Mapping for vertical alignment for Html
+ const VERTICAL_ALIGNMENT_FOR_HTML = [
+ self::VERTICAL_BOTTOM => self::VERTICAL_BOTTOM,
+ self::VERTICAL_TOP => self::VERTICAL_TOP,
+ self::VERTICAL_CENTER => self::VERTICAL_MIDDLE,
+ self::VERTICAL_JUSTIFY => self::VERTICAL_MIDDLE,
+ self::VERTICAL_DISTRIBUTED => self::VERTICAL_MIDDLE,
+ // css settings that arent't in sync with Excel
+ self::VERTICAL_BASELINE => self::VERTICAL_BASELINE,
+ self::VERTICAL_MIDDLE => self::VERTICAL_MIDDLE,
+ self::VERTICAL_SUB => self::VERTICAL_SUB,
+ self::VERTICAL_SUPER => self::VERTICAL_SUPER,
+ self::VERTICAL_TEXT_BOTTOM => self::VERTICAL_TEXT_BOTTOM,
+ self::VERTICAL_TEXT_TOP => self::VERTICAL_TEXT_TOP,
+ ];
// Read order
const READORDER_CONTEXT = 0;
@@ -202,8 +262,9 @@ class Alignment extends Supervisor
*/
public function setHorizontal(string $horizontalAlignment)
{
- if ($horizontalAlignment == '') {
- $horizontalAlignment = self::HORIZONTAL_GENERAL;
+ $horizontalAlignment = strtolower($horizontalAlignment);
+ if ($horizontalAlignment === self::HORIZONTAL_CENTER_CONTINUOUS_LC) {
+ $horizontalAlignment = self::HORIZONTAL_CENTER_CONTINUOUS;
}
if ($this->isSupervisor) {
@@ -239,9 +300,7 @@ class Alignment extends Supervisor
*/
public function setVertical($verticalAlignment)
{
- if ($verticalAlignment == '') {
- $verticalAlignment = self::VERTICAL_BOTTOM;
- }
+ $verticalAlignment = strtolower($verticalAlignment);
if ($this->isSupervisor) {
$styleArray = $this->getStyleArray(['vertical' => $verticalAlignment]);
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php
index 9ab0c98fb..922be803c 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php
@@ -387,8 +387,6 @@ class Color extends Supervisor
* @param int $colorIndex Index entry point into the colour array
* @param bool $background Flag to indicate whether default background or foreground colour
* should be returned if the indexed colour doesn't exist
- *
- * @return Color
*/
public static function indexedColor($colorIndex, $background = false, ?array $palette = null): self
{
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBar.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBar.php
index 54513670e..f7a2eee19 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBar.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBar.php
@@ -11,10 +11,10 @@ class ConditionalDataBar
/** children */
- /** @var ConditionalFormatValueObject */
+ /** @var ?ConditionalFormatValueObject */
private $minimumConditionalFormatValueObject;
- /** @var ConditionalFormatValueObject */
+ /** @var ?ConditionalFormatValueObject */
private $maximumConditionalFormatValueObject;
/** @var string */
@@ -22,7 +22,7 @@ class ConditionalDataBar
/** */
- /** @var ConditionalFormattingRuleExtension */
+ /** @var ?ConditionalFormattingRuleExtension */
private $conditionalFormattingRuleExt;
/**
@@ -43,10 +43,7 @@ class ConditionalDataBar
return $this;
}
- /**
- * @return ConditionalFormatValueObject
- */
- public function getMinimumConditionalFormatValueObject()
+ public function getMinimumConditionalFormatValueObject(): ?ConditionalFormatValueObject
{
return $this->minimumConditionalFormatValueObject;
}
@@ -58,10 +55,7 @@ class ConditionalDataBar
return $this;
}
- /**
- * @return ConditionalFormatValueObject
- */
- public function getMaximumConditionalFormatValueObject()
+ public function getMaximumConditionalFormatValueObject(): ?ConditionalFormatValueObject
{
return $this->maximumConditionalFormatValueObject;
}
@@ -85,10 +79,7 @@ class ConditionalDataBar
return $this;
}
- /**
- * @return ConditionalFormattingRuleExtension
- */
- public function getConditionalFormattingRuleExt()
+ public function getConditionalFormattingRuleExt(): ?ConditionalFormattingRuleExtension
{
return $this->conditionalFormattingRuleExt;
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php
index 19d67563e..3d7bc1bce 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php
@@ -743,14 +743,14 @@ class Font extends Supervisor
private function hashChartColor(?ChartColor $underlineColor): string
{
- if ($this->underlineColor === null) {
+ if ($underlineColor === null) {
return '';
}
return
- $this->underlineColor->getValue()
- . $this->underlineColor->getType()
- . (string) $this->underlineColor->getAlpha();
+ $underlineColor->getValue()
+ . $underlineColor->getType()
+ . (string) $underlineColor->getAlpha();
}
/**
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php
index f4d3412bd..07aaff1f7 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php
@@ -20,7 +20,8 @@ class PercentageFormatter extends BaseFormatter
$format = str_replace('%', '%%', $format);
$wholePartSize = strlen((string) floor($value));
- $decimalPartSize = $placeHolders = 0;
+ $decimalPartSize = 0;
+ $placeHolders = '';
// Number of decimals
if (preg_match('/\.([?0]+)/u', $format, $matches)) {
$decimalPartSize = strlen($matches[1]);
@@ -29,12 +30,13 @@ class PercentageFormatter extends BaseFormatter
$placeHolders = str_repeat(' ', strlen($matches[1]) - $decimalPartSize);
}
// Number of digits to display before the decimal
- if (preg_match('/([#0,]+)\./u', $format, $matches)) {
- $wholePartSize = max($wholePartSize, strlen($matches[1]));
+ if (preg_match('/([#0,]+)\.?/u', $format, $matches)) {
+ $firstZero = preg_replace('/^[#,]*/', '', $matches[1]);
+ $wholePartSize = max($wholePartSize, strlen($firstZero));
}
- $wholePartSize += $decimalPartSize;
- $replacement = "{$wholePartSize}.{$decimalPartSize}";
+ $wholePartSize += $decimalPartSize + (int) ($decimalPartSize > 0);
+ $replacement = "0{$wholePartSize}.{$decimalPartSize}";
$mask = (string) preg_replace('/[#0,]+\.?[?#0,]*/ui', "%{$replacement}f{$placeHolders}", $format);
/** @var float */
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php
index 17286f9c8..94877f667 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php
@@ -8,6 +8,7 @@ use PhpOffice\PhpSpreadsheet\Collection\Cells;
/**
* @template TKey
+ *
* @implements Iterator
*/
abstract class CellIterator implements Iterator
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php
index c23bfc590..4bdc2d4ca 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php
@@ -259,10 +259,11 @@ class PageSetup
/**
* First page number.
*
- * @var int
+ * @var ?int
*/
private $firstPageNumber;
+ /** @var string */
private $pageOrder = self::PAGEORDER_DOWN_THEN_OVER;
/**
@@ -375,7 +376,7 @@ class PageSetup
{
// Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface,
// but it is apparently still able to handle any scale >= 0, where 0 results in 100
- if (($scale >= 0) || $scale === null) {
+ if ($scale === null || $scale >= 0) {
$this->scale = $scale;
if ($update) {
$this->fitToPage = false;
@@ -845,7 +846,7 @@ class PageSetup
/**
* Get first page number.
*
- * @return int
+ * @return ?int
*/
public function getFirstPageNumber()
{
@@ -855,7 +856,7 @@ class PageSetup
/**
* Set first page number.
*
- * @param int $value
+ * @param ?int $value
*
* @return $this
*/
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php
index be717053f..8235ccf14 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php
@@ -32,14 +32,20 @@ use PhpOffice\PhpSpreadsheet\Style\Style;
class Worksheet implements IComparable
{
// Break types
- const BREAK_NONE = 0;
- const BREAK_ROW = 1;
- const BREAK_COLUMN = 2;
+ public const BREAK_NONE = 0;
+ public const BREAK_ROW = 1;
+ public const BREAK_COLUMN = 2;
// Sheet state
- const SHEETSTATE_VISIBLE = 'visible';
- const SHEETSTATE_HIDDEN = 'hidden';
- const SHEETSTATE_VERYHIDDEN = 'veryHidden';
+ public const SHEETSTATE_VISIBLE = 'visible';
+ public const SHEETSTATE_HIDDEN = 'hidden';
+ public const SHEETSTATE_VERYHIDDEN = 'veryHidden';
+
+ public const MERGE_CELL_CONTENT_EMPTY = 'empty';
+ public const MERGE_CELL_CONTENT_HIDE = 'hide';
+ public const MERGE_CELL_CONTENT_MERGE = 'merge';
+
+ protected const SHEET_NAME_REQUIRES_NO_QUOTES = '/^[_\p{L}][_\p{L}\p{N}]*$/mui';
/**
* Maximum 31 characters allowed for sheet title.
@@ -917,7 +923,7 @@ class Worksheet implements IComparable
$this->parent->getCalculationEngine()
->renameCalculationCacheForWorksheet($oldTitle, $newTitle);
if ($updateFormulaCellReferences) {
- ReferenceHelper::getInstance()->updateNamedFormulas($this->parent, $oldTitle, $newTitle);
+ ReferenceHelper::getInstance()->updateNamedFormulae($this->parent, $oldTitle, $newTitle);
}
}
@@ -1265,7 +1271,7 @@ class Worksheet implements IComparable
}
} elseif (
!preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $coordinate) &&
- preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/i', $coordinate)
+ preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/iu', $coordinate)
) {
// Named range?
$namedRange = $this->validateNamedRange($coordinate, true);
@@ -1336,7 +1342,7 @@ class Worksheet implements IComparable
*
* @return Cell Cell that was created
*/
- public function createNewCell($coordinate)
+ public function createNewCell($coordinate): Cell
{
[$column, $row, $columnString] = Coordinate::indexesFromString($coordinate);
$cell = new Cell(null, DataType::TYPE_NULL, $this);
@@ -1357,7 +1363,7 @@ class Worksheet implements IComparable
if ($rowDimension !== null && $rowDimension->getXfIndex() > 0) {
// then there is a row dimension with explicit style, assign it to the cell
- $cell->setXfIndex($rowDimension->getXfIndex());
+ $cell->setXfIndex(/** @scrutinizer ignore-type */ $rowDimension->getXfIndex());
} elseif ($columnDimension !== null && $columnDimension->getXfIndex() > 0) {
// then there is a column dimension, assign it to the cell
$cell->setXfIndex($columnDimension->getXfIndex());
@@ -1413,6 +1419,11 @@ class Worksheet implements IComparable
return $this->rowDimensions[$row];
}
+ public function rowDimensionExists(int $row): bool
+ {
+ return isset($this->rowDimensions[$row]);
+ }
+
/**
* Get column dimension at a specific column.
*
@@ -1751,10 +1762,15 @@ class Worksheet implements IComparable
* @param AddressRange|array|string $range A simple string containing a Cell range like 'A1:E10'
* or passing in an array of [$fromColumnIndex, $fromRow, $toColumnIndex, $toRow] (e.g. [3, 5, 6, 8]),
* or an AddressRange.
+ * @param string $behaviour How the merged cells should behave.
+ * Possible values are:
+ * MERGE_CELL_CONTENT_EMPTY - Empty the content of the hidden cells
+ * MERGE_CELL_CONTENT_HIDE - Keep the content of the hidden cells
+ * MERGE_CELL_CONTENT_MERGE - Move the content of the hidden cells into the first cell
*
* @return $this
*/
- public function mergeCells($range)
+ public function mergeCells($range, $behaviour = self::MERGE_CELL_CONTENT_EMPTY)
{
$range = Functions::trimSheetFromCellReference(Validations::validateCellRange($range));
@@ -1786,18 +1802,22 @@ class Worksheet implements IComparable
$this->getCell($upperLeft)->setValueExplicit(null, DataType::TYPE_NULL);
}
- // Blank out the rest of the cells in the range (if they exist)
- if ($numberRows > $numberColumns) {
- $this->clearMergeCellsByColumn($firstColumn, $lastColumn, $firstRow, $lastRow, $upperLeft);
- } else {
- $this->clearMergeCellsByRow($firstColumn, $lastColumnIndex, $firstRow, $lastRow, $upperLeft);
+ if ($behaviour !== self::MERGE_CELL_CONTENT_HIDE) {
+ // Blank out the rest of the cells in the range (if they exist)
+ if ($numberRows > $numberColumns) {
+ $this->clearMergeCellsByColumn($firstColumn, $lastColumn, $firstRow, $lastRow, $upperLeft, $behaviour);
+ } else {
+ $this->clearMergeCellsByRow($firstColumn, $lastColumnIndex, $firstRow, $lastRow, $upperLeft, $behaviour);
+ }
}
return $this;
}
- private function clearMergeCellsByColumn(string $firstColumn, string $lastColumn, int $firstRow, int $lastRow, string $upperLeft): void
+ private function clearMergeCellsByColumn(string $firstColumn, string $lastColumn, int $firstRow, int $lastRow, string $upperLeft, string $behaviour): void
{
+ $leftCellValue = [$this->getCell($upperLeft)->getFormattedValue()];
+
foreach ($this->getColumnIterator($firstColumn, $lastColumn) as $column) {
$iterator = $column->getCellIterator($firstRow);
$iterator->setIterateOnlyExistingCells(true);
@@ -1807,17 +1827,21 @@ class Worksheet implements IComparable
if ($row > $lastRow) {
break;
}
- $thisCell = $cell->getColumn() . $row;
- if ($upperLeft !== $thisCell) {
- $cell->setValueExplicit(null, DataType::TYPE_NULL);
- }
+ $leftCellValue = $this->mergeCellBehaviour($cell, $upperLeft, $behaviour, $leftCellValue);
}
}
}
+
+ $leftCellValue = implode(' ', $leftCellValue);
+ if ($behaviour === self::MERGE_CELL_CONTENT_MERGE) {
+ $this->getCell($upperLeft)->setValueExplicit($leftCellValue, DataType::TYPE_STRING);
+ }
}
- private function clearMergeCellsByRow(string $firstColumn, int $lastColumnIndex, int $firstRow, int $lastRow, string $upperLeft): void
+ private function clearMergeCellsByRow(string $firstColumn, int $lastColumnIndex, int $firstRow, int $lastRow, string $upperLeft, string $behaviour): void
{
+ $leftCellValue = [$this->getCell($upperLeft)->getFormattedValue()];
+
foreach ($this->getRowIterator($firstRow, $lastRow) as $row) {
$iterator = $row->getCellIterator($firstColumn);
$iterator->setIterateOnlyExistingCells(true);
@@ -1828,13 +1852,31 @@ class Worksheet implements IComparable
if ($columnIndex > $lastColumnIndex) {
break;
}
- $thisCell = $column . $cell->getRow();
- if ($upperLeft !== $thisCell) {
- $cell->setValueExplicit(null, DataType::TYPE_NULL);
- }
+ $leftCellValue = $this->mergeCellBehaviour($cell, $upperLeft, $behaviour, $leftCellValue);
}
}
}
+
+ $leftCellValue = implode(' ', $leftCellValue);
+ if ($behaviour === self::MERGE_CELL_CONTENT_MERGE) {
+ $this->getCell($upperLeft)->setValueExplicit($leftCellValue, DataType::TYPE_STRING);
+ }
+ }
+
+ public function mergeCellBehaviour(Cell $cell, string $upperLeft, string $behaviour, array $leftCellValue): array
+ {
+ if ($cell->getCoordinate() !== $upperLeft) {
+ Calculation::getInstance($cell->getWorksheet()->getParent())->flushInstance();
+ if ($behaviour === self::MERGE_CELL_CONTENT_MERGE) {
+ $cellValue = $cell->getFormattedValue();
+ if ($cellValue !== '') {
+ $leftCellValue[] = $cellValue;
+ }
+ }
+ $cell->setValueExplicit(null, DataType::TYPE_NULL);
+ }
+
+ return $leftCellValue;
}
/**
@@ -1849,17 +1891,22 @@ class Worksheet implements IComparable
* @param int $row1 Numeric row coordinate of the first cell
* @param int $columnIndex2 Numeric column coordinate of the last cell
* @param int $row2 Numeric row coordinate of the last cell
+ * @param string $behaviour How the merged cells should behave.
+ * Possible values are:
+ * MERGE_CELL_CONTENT_EMPTY - Empty the content of the hidden cells
+ * MERGE_CELL_CONTENT_HIDE - Keep the content of the hidden cells
+ * MERGE_CELL_CONTENT_MERGE - Move the content of the hidden cells into the first cell
*
* @return $this
*/
- public function mergeCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2)
+ public function mergeCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2, $behaviour = self::MERGE_CELL_CONTENT_EMPTY)
{
$cellRange = new CellRange(
CellAddress::fromColumnAndRow($columnIndex1, $row1),
CellAddress::fromColumnAndRow($columnIndex2, $row2)
);
- return $this->mergeCells($cellRange);
+ return $this->mergeCells($cellRange, $behaviour);
}
/**
@@ -2454,10 +2501,8 @@ class Worksheet implements IComparable
/**
* Show gridlines?
- *
- * @return bool
*/
- public function getShowGridlines()
+ public function getShowGridlines(): bool
{
return $this->showGridlines;
}
@@ -2469,7 +2514,7 @@ class Worksheet implements IComparable
*
* @return $this
*/
- public function setShowGridlines($showGridLines)
+ public function setShowGridlines(bool $showGridLines): self
{
$this->showGridlines = $showGridLines;
@@ -2478,10 +2523,8 @@ class Worksheet implements IComparable
/**
* Print gridlines?
- *
- * @return bool
*/
- public function getPrintGridlines()
+ public function getPrintGridlines(): bool
{
return $this->printGridlines;
}
@@ -2493,7 +2536,7 @@ class Worksheet implements IComparable
*
* @return $this
*/
- public function setPrintGridlines($printGridLines)
+ public function setPrintGridlines(bool $printGridLines): self
{
$this->printGridlines = $printGridLines;
@@ -2502,10 +2545,8 @@ class Worksheet implements IComparable
/**
* Show row and column headers?
- *
- * @return bool
*/
- public function getShowRowColHeaders()
+ public function getShowRowColHeaders(): bool
{
return $this->showRowColHeaders;
}
@@ -2517,7 +2558,7 @@ class Worksheet implements IComparable
*
* @return $this
*/
- public function setShowRowColHeaders($showRowColHeaders)
+ public function setShowRowColHeaders(bool $showRowColHeaders): self
{
$this->showRowColHeaders = $showRowColHeaders;
@@ -2526,10 +2567,8 @@ class Worksheet implements IComparable
/**
* Show summary below? (Row/Column outlining).
- *
- * @return bool
*/
- public function getShowSummaryBelow()
+ public function getShowSummaryBelow(): bool
{
return $this->showSummaryBelow;
}
@@ -2541,7 +2580,7 @@ class Worksheet implements IComparable
*
* @return $this
*/
- public function setShowSummaryBelow($showSummaryBelow)
+ public function setShowSummaryBelow(bool $showSummaryBelow): self
{
$this->showSummaryBelow = $showSummaryBelow;
@@ -2550,10 +2589,8 @@ class Worksheet implements IComparable
/**
* Show summary right? (Row/Column outlining).
- *
- * @return bool
*/
- public function getShowSummaryRight()
+ public function getShowSummaryRight(): bool
{
return $this->showSummaryRight;
}
@@ -2565,7 +2602,7 @@ class Worksheet implements IComparable
*
* @return $this
*/
- public function setShowSummaryRight($showSummaryRight)
+ public function setShowSummaryRight(bool $showSummaryRight): self
{
$this->showSummaryRight = $showSummaryRight;
@@ -2589,7 +2626,7 @@ class Worksheet implements IComparable
*
* @return $this
*/
- public function setComments(array $comments)
+ public function setComments(array $comments): self
{
$this->comments = $comments;
@@ -2604,7 +2641,7 @@ class Worksheet implements IComparable
*
* @return $this
*/
- public function removeComment($cellCoordinate)
+ public function removeComment($cellCoordinate): self
{
$cellAddress = Functions::trimSheetFromCellReference(Validations::validateCellAddress($cellCoordinate));
@@ -2628,10 +2665,8 @@ class Worksheet implements IComparable
*
* @param array|CellAddress|string $cellCoordinate Coordinate of the cell as a string, eg: 'C5';
* or as an array of [$columnIndex, $row] (e.g. [3, 5]), or a CellAddress object.
- *
- * @return Comment
*/
- public function getComment($cellCoordinate)
+ public function getComment($cellCoordinate): Comment
{
$cellAddress = Functions::trimSheetFromCellReference(Validations::validateCellAddress($cellCoordinate));
@@ -2664,10 +2699,8 @@ class Worksheet implements IComparable
*
* @param int $columnIndex Numeric column coordinate of the cell
* @param int $row Numeric row coordinate of the cell
- *
- * @return Comment
*/
- public function getCommentByColumnAndRow($columnIndex, $row)
+ public function getCommentByColumnAndRow($columnIndex, $row): Comment
{
return $this->getComment(Coordinate::stringFromColumnIndex($columnIndex) . $row);
}
@@ -3046,7 +3079,11 @@ class Worksheet implements IComparable
* Extract worksheet title from range.
*
* Example: extractSheetTitle("testSheet!A1") ==> 'A1'
+ * Example: extractSheetTitle("testSheet!A1:C3") ==> 'A1:C3'
* Example: extractSheetTitle("'testSheet 1'!A1", true) ==> ['testSheet 1', 'A1'];
+ * Example: extractSheetTitle("'testSheet 1'!A1:C3", true) ==> ['testSheet 1', 'A1:C3'];
+ * Example: extractSheetTitle("A1", true) ==> ['', 'A1'];
+ * Example: extractSheetTitle("A1:C3", true) ==> ['', 'A1:C3']
*
* @param string $range Range to extract title from
* @param bool $returnRange Return range? (see example)
@@ -3445,4 +3482,9 @@ class Worksheet implements IComparable
{
return $this->codeName !== null;
}
+
+ public static function nameRequiresQuotes(string $sheetName): bool
+ {
+ return preg_match(self::SHEET_NAME_REQUIRES_NO_QUOTES, $sheetName) !== 1;
+ }
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Html.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Html.php
index da32025a6..0fef0f607 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Html.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Html.php
@@ -24,6 +24,7 @@ use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Style\Style;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
+use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class Html extends BaseWriter
@@ -54,7 +55,7 @@ class Html extends BaseWriter
*
* @var bool
*/
- private $embedImages = false;
+ protected $embedImages = false;
/**
* Use inline CSS?
@@ -126,6 +127,13 @@ class Html extends BaseWriter
*/
protected $isPdf = false;
+ /**
+ * Is the current writer creating mPDF?
+ *
+ * @var bool
+ */
+ protected $isMPdf = false;
+
/**
* Generate the Navigation block.
*
@@ -223,13 +231,6 @@ class Html extends BaseWriter
$this->editHtmlCallback = $callback;
}
- const VALIGN_ARR = [
- Alignment::VERTICAL_BOTTOM => 'bottom',
- Alignment::VERTICAL_TOP => 'top',
- Alignment::VERTICAL_CENTER => 'middle',
- Alignment::VERTICAL_JUSTIFY => 'middle',
- ];
-
/**
* Map VAlign.
*
@@ -239,17 +240,9 @@ class Html extends BaseWriter
*/
private function mapVAlign($vAlign)
{
- return array_key_exists($vAlign, self::VALIGN_ARR) ? self::VALIGN_ARR[$vAlign] : 'baseline';
+ return Alignment::VERTICAL_ALIGNMENT_FOR_HTML[$vAlign] ?? '';
}
- const HALIGN_ARR = [
- Alignment::HORIZONTAL_LEFT => 'left',
- Alignment::HORIZONTAL_RIGHT => 'right',
- Alignment::HORIZONTAL_CENTER => 'center',
- Alignment::HORIZONTAL_CENTER_CONTINUOUS => 'center',
- Alignment::HORIZONTAL_JUSTIFY => 'justify',
- ];
-
/**
* Map HAlign.
*
@@ -259,7 +252,7 @@ class Html extends BaseWriter
*/
private function mapHAlign($hAlign)
{
- return array_key_exists($hAlign, self::HALIGN_ARR) ? self::HALIGN_ARR[$hAlign] : '';
+ return Alignment::HORIZONTAL_ALIGNMENT_FOR_HTML[$hAlign] ?? '';
}
const BORDER_ARR = [
@@ -280,7 +273,7 @@ class Html extends BaseWriter
/**
* Map border style.
*
- * @param int $borderStyle Sheet index
+ * @param int|string $borderStyle Sheet index
*
* @return string
*/
@@ -347,7 +340,7 @@ class Html extends BaseWriter
return $this;
}
- private static function generateMeta($val, $desc)
+ private static function generateMeta(?string $val, string $desc): string
{
return $val
? (' ' . PHP_EOL)
@@ -391,7 +384,7 @@ class Html extends BaseWriter
return $html;
}
- private function generateSheetPrep()
+ private function generateSheetPrep(): array
{
// Ensure that Spans have been calculated?
$this->calculateSpans();
@@ -406,7 +399,7 @@ class Html extends BaseWriter
return $sheets;
}
- private function generateSheetStarts($sheet, $rowMin)
+ private function generateSheetStarts(Worksheet $sheet, int $rowMin): array
{
// calculate start of ,
$tbodyStart = $rowMin;
@@ -425,7 +418,7 @@ class Html extends BaseWriter
return [$theadStart, $theadEnd, $tbodyStart];
}
- private function generateSheetTags($row, $theadStart, $theadEnd, $tbodyStart)
+ private function generateSheetTags(int $row, int $theadStart, int $theadEnd, int $tbodyStart): array
{
// ?
$startTag = ($row == $theadStart) ? (' ' . PHP_EOL) : '';
@@ -544,15 +537,10 @@ class Html extends BaseWriter
* Extend Row if chart is placed after nominal end of row.
* This code should be exercised by sample:
* Chart/32_Chart_read_write_PDF.php.
- * However, that test is suppressed due to out-of-date
- * Jpgraph code issuing warnings. So, don't measure
- * code coverage for this function till that is fixed.
*
* @param int $row Row to check for charts
*
* @return array
- *
- * @codeCoverageIgnore
*/
private function extendRowsForCharts(Worksheet $worksheet, int $row)
{
@@ -628,11 +616,12 @@ class Html extends BaseWriter
*
* @return string
*/
- public static function winFileToUrl($filename)
+ public static function winFileToUrl($filename, bool $mpdf = false)
{
// Windows filename
if (substr($filename, 1, 2) === ':\\') {
- $filename = 'file:///' . str_replace('\\', '/', $filename);
+ $protocol = $mpdf ? '' : 'file:///';
+ $filename = $protocol . str_replace('\\', '/', $filename);
}
return $filename;
@@ -674,12 +663,12 @@ class Html extends BaseWriter
$filename = htmlspecialchars($filename, Settings::htmlEntityFlags());
$html .= PHP_EOL;
- $imageData = self::winFileToUrl($filename);
+ $imageData = self::winFileToUrl($filename, $this->isMPdf);
- if (($this->embedImages && !$this->isPdf) || substr($imageData, 0, 6) === 'zip://') {
+ if ($this->embedImages || substr($imageData, 0, 6) === 'zip://') {
$picture = @file_get_contents($filename);
if ($picture !== false) {
- $imageDetails = getimagesize($filename);
+ $imageDetails = getimagesize($filename) ?: [];
// base64 encode the binary data
$base64 = base64_encode($picture);
$imageData = 'data:' . $imageDetails['mime'] . ';base64,' . $base64;
@@ -694,12 +683,10 @@ class Html extends BaseWriter
$imageResource = $drawing->getImageResource();
if ($imageResource) {
ob_start(); // Let's start output buffering.
- // @phpstan-ignore-next-line
imagepng($imageResource); // This will normally output the image, but because of ob_start(), it won't.
- $contents = ob_get_contents(); // Instead, output above is saved to $contents
+ $contents = (string) ob_get_contents(); // Instead, output above is saved to $contents
ob_end_clean(); // End the output buffer.
- /** @phpstan-ignore-next-line */
$dataUri = 'data:image/png;base64,' . base64_encode($contents);
// Because of the nature of tables, width is more important than height.
@@ -718,11 +705,6 @@ class Html extends BaseWriter
* Generate chart tag in cell.
* This code should be exercised by sample:
* Chart/32_Chart_read_write_PDF.php.
- * However, that test is suppressed due to out-of-date
- * Jpgraph code issuing warnings. So, don't measure
- * code coverage for this function till that is fixed.
- *
- * @codeCoverageIgnore
*/
private function writeChartInCell(Worksheet $worksheet, string $coordinates): string
{
@@ -740,21 +722,18 @@ class Html extends BaseWriter
}
$html .= PHP_EOL;
- $imageDetails = getimagesize($chartFileName);
+ $imageDetails = getimagesize($chartFileName) ?: [];
$filedesc = $chart->getTitle();
$filedesc = $filedesc ? $filedesc->getCaptionText() : '';
$filedesc = $filedesc ? htmlspecialchars($filedesc, ENT_QUOTES) : 'Embedded chart';
- if ($fp = fopen($chartFileName, 'rb', 0)) {
- $picture = fread($fp, filesize($chartFileName));
- fclose($fp);
- /** @phpstan-ignore-next-line */
+ $picture = file_get_contents($chartFileName);
+ if ($picture !== false) {
$base64 = base64_encode($picture);
$imageData = 'data:' . $imageDetails['mime'] . ';base64,' . $base64;
$html .= '
' . PHP_EOL;
-
- unlink($chartFileName);
}
+ unlink($chartFileName);
}
}
}
@@ -942,8 +921,8 @@ class Html extends BaseWriter
// Calculate cell style hashes
foreach ($this->spreadsheet->getCellXfCollection() as $index => $style) {
- $css['td.style' . $index] = $this->createCSSStyle($style);
- $css['th.style' . $index] = $this->createCSSStyle($style);
+ $css['td.style' . $index . ', th.style' . $index] = $this->createCSSStyle($style);
+ //$css['th.style' . $index] = $this->createCSSStyle($style);
}
// Fetch sheets
@@ -995,14 +974,25 @@ class Html extends BaseWriter
$css = [];
// Create CSS
- $css['vertical-align'] = $this->mapVAlign($alignment->getVertical());
- $textAlign = $this->mapHAlign($alignment->getHorizontal());
+ $verticalAlign = $this->mapVAlign($alignment->getVertical() ?? '');
+ if ($verticalAlign) {
+ $css['vertical-align'] = $verticalAlign;
+ }
+ $textAlign = $this->mapHAlign($alignment->getHorizontal() ?? '');
if ($textAlign) {
$css['text-align'] = $textAlign;
if (in_array($textAlign, ['left', 'right'])) {
$css['padding-' . $textAlign] = (string) ((int) $alignment->getIndent() * 9) . 'px';
}
}
+ $rotation = $alignment->getTextRotation();
+ if ($rotation !== 0 && $rotation !== Alignment::TEXTROTATION_STACK_PHPSPREADSHEET) {
+ if ($this->isMPdf) {
+ $css['text-rotate'] = "$rotation";
+ } else {
+ $css['transform'] = "rotate({$rotation}deg)";
+ }
+ }
return $css;
}
@@ -1064,10 +1054,8 @@ class Html extends BaseWriter
* Create CSS style.
*
* @param Border $border Border
- *
- * @return string
*/
- private function createCSSStyleBorder(Border $border)
+ private function createCSSStyleBorder(Border $border): string
{
// Create CSS - add !important to non-none border styles for merged cells
$borderStyle = $this->mapBorderStyle($border->getBorderStyle());
@@ -1088,9 +1076,11 @@ class Html extends BaseWriter
$css = [];
// Create CSS
- $value = $fill->getFillType() == Fill::FILL_NONE ?
- 'white' : '#' . $fill->getStartColor()->getRGB();
- $css['background-color'] = $value;
+ if ($fill->getFillType() !== Fill::FILL_NONE) {
+ $value = $fill->getFillType() == Fill::FILL_NONE ?
+ 'white' : '#' . $fill->getStartColor()->getRGB();
+ $css['background-color'] = $value;
+ }
return $css;
}
@@ -1098,7 +1088,7 @@ class Html extends BaseWriter
/**
* Generate HTML footer.
*/
- public function generateHTMLFooter()
+ public function generateHTMLFooter(): string
{
// Construct HTML
$html = '';
@@ -1108,7 +1098,7 @@ class Html extends BaseWriter
return $html;
}
- private function generateTableTagInline(Worksheet $worksheet, $id)
+ private function generateTableTagInline(Worksheet $worksheet, string $id): string
{
$style = isset($this->cssStyles['table']) ?
$this->assembleCSS($this->cssStyles['table']) : '';
@@ -1128,7 +1118,7 @@ class Html extends BaseWriter
return $html;
}
- private function generateTableTag(Worksheet $worksheet, $id, &$html, $sheetIndex): void
+ private function generateTableTag(Worksheet $worksheet, string $id, string &$html, int $sheetIndex): void
{
if (!$this->useInlineCss) {
$gridlines = $worksheet->getShowGridlines() ? ' gridlines' : '';
@@ -1155,9 +1145,9 @@ class Html extends BaseWriter
$html = '';
$id = $showid ? "id='sheet$sheetIndex'" : '';
if ($showid) {
- $html .= "\n";
+ $html .= "
" . PHP_EOL;
} else {
- $html .= "
\n";
+ $html .= "
" . PHP_EOL;
}
$this->generateTableTag($worksheet, $id, $html, $sheetIndex);
@@ -1181,7 +1171,7 @@ class Html extends BaseWriter
/**
* Generate table footer.
*/
- private function generateTableFooter()
+ private function generateTableFooter(): string
{
return '
' . PHP_EOL . '' . PHP_EOL;
}
@@ -1227,7 +1217,7 @@ class Html extends BaseWriter
return $html;
}
- private function generateRowCellCss(Worksheet $worksheet, $cellAddress, $row, $columnNumber)
+ private function generateRowCellCss(Worksheet $worksheet, string $cellAddress, int $row, int $columnNumber): array
{
$cell = ($cellAddress > '') ? $worksheet->getCellCollection()->get($cellAddress) : '';
$coordinate = Coordinate::stringFromColumnIndex($columnNumber + 1) . ($row + 1);
@@ -1253,22 +1243,24 @@ class Html extends BaseWriter
return [$cell, $cssClass, $coordinate];
}
- private function generateRowCellDataValueRich($cell, &$cellData): void
+ private function generateRowCellDataValueRich(Cell $cell, string &$cellData): void
{
// Loop through rich text elements
$elements = $cell->getValue()->getRichTextElements();
foreach ($elements as $element) {
// Rich text start?
if ($element instanceof Run) {
- $cellData .= '';
-
$cellEnd = '';
- if ($element->getFont()->getSuperscript()) {
- $cellData .= '';
- $cellEnd = '';
- } elseif ($element->getFont()->getSubscript()) {
- $cellData .= '';
- $cellEnd = '';
+ if ($element->getFont() !== null) {
+ $cellData .= '';
+
+ if ($element->getFont()->getSuperscript()) {
+ $cellData .= '';
+ $cellEnd = '';
+ } elseif ($element->getFont()->getSubscript()) {
+ $cellData .= '';
+ $cellEnd = '';
+ }
}
// Convert UTF8 data to PCDATA
@@ -1286,23 +1278,22 @@ class Html extends BaseWriter
}
}
- private function generateRowCellDataValue(Worksheet $worksheet, $cell, &$cellData): void
+ private function generateRowCellDataValue(Worksheet $worksheet, Cell $cell, string &$cellData): void
{
if ($cell->getValue() instanceof RichText) {
$this->generateRowCellDataValueRich($cell, $cellData);
} else {
$origData = $this->preCalculateFormulas ? $cell->getCalculatedValue() : $cell->getValue();
$formatCode = $worksheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode();
- if ($formatCode !== null) {
- $cellData = NumberFormat::toFormattedString(
- $origData,
- $formatCode,
- [$this, 'formatColor']
- );
- }
+
+ $cellData = NumberFormat::toFormattedString(
+ $origData ?? '',
+ $formatCode ?? NumberFormat::FORMAT_GENERAL,
+ [$this, 'formatColor']
+ );
if ($cellData === $origData) {
- $cellData = htmlspecialchars($cellData ?? '', Settings::htmlEntityFlags());
+ $cellData = htmlspecialchars($cellData, Settings::htmlEntityFlags());
}
if ($worksheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont()->getSuperscript()) {
$cellData = '' . $cellData . '';
@@ -1312,7 +1303,11 @@ class Html extends BaseWriter
}
}
- private function generateRowCellData(Worksheet $worksheet, $cell, &$cssClass, $cellType)
+ /**
+ * @param null|Cell|string $cell
+ * @param array|string $cssClass
+ */
+ private function generateRowCellData(Worksheet $worksheet, $cell, &$cssClass, string $cellType): string
{
$cellData = ' ';
if ($cell instanceof Cell) {
@@ -1332,10 +1327,10 @@ class Html extends BaseWriter
$cellData = nl2br($cellData);
// Extend CSS class?
- if (!$this->useInlineCss) {
+ if (!$this->useInlineCss && is_string($cssClass)) {
$cssClass .= ' style' . $cell->getXfIndex();
$cssClass .= ' ' . $cell->getDataType();
- } else {
+ } elseif (is_array($cssClass)) {
if ($cellType == 'th') {
if (isset($this->cssStyles['th.style' . $cell->getXfIndex()])) {
$cssClass = array_merge($cssClass, $this->cssStyles['th.style' . $cell->getXfIndex()]);
@@ -1365,12 +1360,12 @@ class Html extends BaseWriter
return $cellData;
}
- private function generateRowIncludeCharts(Worksheet $worksheet, $coordinate)
+ private function generateRowIncludeCharts(Worksheet $worksheet, string $coordinate): string
{
return $this->includeCharts ? $this->writeChartInCell($worksheet, $coordinate) : '';
}
- private function generateRowSpans($html, $rowSpan, $colSpan)
+ private function generateRowSpans(string $html, int $rowSpan, int $colSpan): string
{
$html .= ($colSpan > 1) ? (' colspan="' . $colSpan . '"') : '';
$html .= ($rowSpan > 1) ? (' rowspan="' . $rowSpan . '"') : '';
@@ -1378,7 +1373,10 @@ class Html extends BaseWriter
return $html;
}
- private function generateRowWriteCell(&$html, Worksheet $worksheet, $coordinate, $cellType, $cellData, $colSpan, $rowSpan, $cssClass, $colNum, $sheetIndex, $row): void
+ /**
+ * @param array|string $cssClass
+ */
+ private function generateRowWriteCell(string &$html, Worksheet $worksheet, string $coordinate, string $cellType, string $cellData, int $colSpan, int $rowSpan, $cssClass, int $colNum, int $sheetIndex, int $row): void
{
// Image?
$htmlx = $this->writeImageInCell($worksheet, $coordinate);
@@ -1386,7 +1384,7 @@ class Html extends BaseWriter
$htmlx .= $this->generateRowIncludeCharts($worksheet, $coordinate);
// Column start
$html .= ' <' . $cellType;
- if (!$this->useInlineCss && !$this->isPdf) {
+ if (!$this->useInlineCss && !$this->isPdf && is_string($cssClass)) {
$html .= ' class="' . $cssClass . '"';
if ($htmlx) {
$html .= " style='position: relative;'";
@@ -1396,9 +1394,11 @@ class Html extends BaseWriter
// We must explicitly write the width of the element because TCPDF
// does not recognize e.g.
if ($this->useInlineCss) {
- $xcssClass = $cssClass;
+ $xcssClass = is_array($cssClass) ? $cssClass : [];
} else {
- $html .= ' class="' . $cssClass . '"';
+ if (is_string($cssClass)) {
+ $html .= ' class="' . $cssClass . '"';
+ }
$xcssClass = [];
}
$width = 0;
@@ -1409,8 +1409,7 @@ class Html extends BaseWriter
$width += $this->columnWidths[$sheetIndex][$i];
}
}
- $xcssClass['width'] = $width . 'pt';
-
+ $xcssClass['width'] = (string) $width . 'pt';
// We must also explicitly write the height of the | element because TCPDF
// does not recognize e.g. |
if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $row]['height'])) {
@@ -1452,15 +1451,16 @@ class Html extends BaseWriter
// Sheet index
$sheetIndex = $worksheet->getParent()->getIndex($worksheet);
$html = $this->generateRowStart($worksheet, $sheetIndex, $row);
+ $generateDiv = $this->isMPdf && $worksheet->getRowDimension($row + 1)->getVisible() === false;
+ if ($generateDiv) {
+ $html .= '' . PHP_EOL;
+ }
// Write cells
$colNum = 0;
foreach ($values as $cellAddress) {
[$cell, $cssClass, $coordinate] = $this->generateRowCellCss($worksheet, $cellAddress, $row, $colNum);
- $colSpan = 1;
- $rowSpan = 1;
-
// Cell Data
$cellData = $this->generateRowCellData($worksheet, $cell, $cssClass, $cellType);
@@ -1474,8 +1474,8 @@ class Html extends BaseWriter
&& $this->isSpannedCell[$worksheet->getParent()->getIndex($worksheet)][$row + 1][$colNum]);
// Colspan and Rowspan
- $colspan = 1;
- $rowspan = 1;
+ $colSpan = 1;
+ $rowSpan = 1;
if (isset($this->isBaseCell[$worksheet->getParent()->getIndex($worksheet)][$row + 1][$colNum])) {
$spans = $this->isBaseCell[$worksheet->getParent()->getIndex($worksheet)][$row + 1][$colNum];
$rowSpan = $spans['rowspan'];
@@ -1499,6 +1499,9 @@ class Html extends BaseWriter
}
// Write row end
+ if ($generateDiv) {
+ $html .= '
' . PHP_EOL;
+ }
$html .= '
' . PHP_EOL;
// Return
@@ -1722,7 +1725,7 @@ class Html extends BaseWriter
$this->spansAreCalculated = true;
}
- private function calculateSpansOmitRows($sheet, $sheetIndex, $candidateSpannedRow): void
+ private function calculateSpansOmitRows(Worksheet $sheet, int $sheetIndex, array $candidateSpannedRow): void
{
// Identify which rows should be omitted in HTML. These are the rows where all the cells
// participate in a merge and the where base cells are somewhere above.
@@ -1785,7 +1788,8 @@ class Html extends BaseWriter
public function getOrientation(): ?string
{
- return null;
+ // Expect Pdf classes to override this method.
+ return $this->isPdf ? PageSetup::ORIENTATION_PORTRAIT : null;
}
/**
@@ -1824,31 +1828,31 @@ class Html extends BaseWriter
$bottom = StringHelper::FormatNumber($worksheet->getPageMargins()->getBottom()) . 'in; ';
$htmlPage .= 'margin-bottom: ' . $bottom;
$orientation = $this->getOrientation() ?? $worksheet->getPageSetup()->getOrientation();
- if ($orientation === \PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE) {
+ if ($orientation === PageSetup::ORIENTATION_LANDSCAPE) {
$htmlPage .= 'size: landscape; ';
- } elseif ($orientation === \PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_PORTRAIT) {
+ } elseif ($orientation === PageSetup::ORIENTATION_PORTRAIT) {
$htmlPage .= 'size: portrait; ';
}
- $htmlPage .= "}\n";
+ $htmlPage .= '}' . PHP_EOL;
++$sheetId;
}
- $htmlPage .= <<div {margin-top: 5px;}
- body>div:first-child {margin-top: 0;}
- .scrpgbrk {margin-top: 1px;}
-}
-@media print {
- .gridlinesp td {border: 1px solid black;}
- .gridlinesp th {border: 1px solid black;}
- .navigation {display: none;}
-}
-
-EOF;
+ $htmlPage .= implode(PHP_EOL, [
+ '.navigation {page-break-after: always;}',
+ '.scrpgbrk, div + div {page-break-before: always;}',
+ '@media screen {',
+ ' .gridlines td {border: 1px solid black;}',
+ ' .gridlines th {border: 1px solid black;}',
+ ' body>div {margin-top: 5px;}',
+ ' body>div:first-child {margin-top: 0;}',
+ ' .scrpgbrk {margin-top: 1px;}',
+ '}',
+ '@media print {',
+ ' .gridlinesp td {border: 1px solid black;}',
+ ' .gridlinesp th {border: 1px solid black;}',
+ ' .navigation {display: none;}',
+ '}',
+ '',
+ ]);
$htmlPage .= $generateSurroundingHTML ? ('' . PHP_EOL) : '';
return $htmlPage;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php
index b0a627260..d8bf1f0c1 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php
@@ -62,6 +62,8 @@ interface IWriter
* Save PhpSpreadsheet to file.
*
* @param resource|string $filename Name of the file to save
+ *
+ * @throws Exception
*/
public function save($filename, int $flags = 0): void;
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php
index fc96f9049..690b0c54a 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php
@@ -7,6 +7,13 @@ use PhpOffice\PhpSpreadsheet\Writer\Pdf;
class Dompdf extends Pdf
{
+ /**
+ * embed images, or link to images.
+ *
+ * @var bool
+ */
+ protected $embedImages = true;
+
/**
* Gets the implementation of external PDF library that should be used.
*
@@ -26,15 +33,15 @@ class Dompdf extends Pdf
{
$fileHandle = parent::prepareForSave($filename);
- // Default PDF paper size
- $paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.)
-
// Check for paper size and page orientation
$setup = $this->spreadsheet->getSheet($this->getSheetIndex() ?? 0)->getPageSetup();
$orientation = $this->getOrientation() ?? $setup->getOrientation();
$orientation = ($orientation === PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';
$printPaperSize = $this->getPaperSize() ?? $setup->getPaperSize();
$paperSize = self::$paperSizes[$printPaperSize] ?? PageSetup::getPaperSizeDefault();
+ if (is_array($paperSize) && count($paperSize) === 2) {
+ $paperSize = [0.0, 0.0, $paperSize[0], $paperSize[1]];
+ }
$orientation = ($orientation == 'L') ? 'landscape' : 'portrait';
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php
index 281e1a4f9..d0ce9ed45 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php
@@ -8,6 +8,9 @@ use PhpOffice\PhpSpreadsheet\Writer\Pdf;
class Mpdf extends Pdf
{
+ /** @var bool */
+ protected $isMPdf = true;
+
/**
* Gets the implementation of external PDF library that should be used.
*
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php
index d29d47648..aefc6b56d 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php
@@ -77,7 +77,7 @@ class Tcpdf extends Pdf
$pdf->SetCreator($this->spreadsheet->getProperties()->getCreator());
// Write to file
- fwrite($fileHandle, $pdf->output($filename, 'S'));
+ fwrite($fileHandle, $pdf->output('', 'S'));
parent::restoreStateAfterSave();
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php
index eadf0083e..69457357b 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php
@@ -732,7 +732,6 @@ class Xls extends BaseWriter
} elseif ($dataProp['type']['data'] == 0x1E) { // null-terminated string prepended by dword string length
// Null-terminated string
$dataProp['data']['data'] .= chr(0);
- // @phpstan-ignore-next-line
++$dataProp['data']['length'];
// Complete the string with null string for being a %4
$dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4) == 4 ? 0 : (4 - $dataProp['data']['length'] % 4));
@@ -750,7 +749,6 @@ class Xls extends BaseWriter
} else {
$dataSection_Content .= $dataProp['data']['data'];
- // @phpstan-ignore-next-line
$dataSection_Content_Offset += 4 + $dataProp['data']['length'];
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php
index 2f75f9082..ca407d2a0 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php
@@ -78,7 +78,7 @@ class Parser
/**
* The parse tree to be generated.
*
- * @var string
+ * @var array|string
*/
public $parseTree;
@@ -531,7 +531,7 @@ class Parser
{
return($this->convertFunction($token, $this->_func_args));
}*/
- // if it's an argument, ignore the token (the argument remains)
+ // if it's an argument, ignore the token (the argument remains)
} elseif ($token == 'arg') {
return '';
}
@@ -1445,6 +1445,9 @@ class Parser
if (empty($tree)) { // If it's the first call use parseTree
$tree = $this->parseTree;
}
+ if (!is_array($tree) || !isset($tree['left'], $tree['right'], $tree['value'])) {
+ throw new WriterException('Unexpected non-array');
+ }
if (is_array($tree['left'])) {
$converted_tree = $this->toReversePolish($tree['left']);
@@ -1475,7 +1478,7 @@ class Parser
$left_tree = '';
}
- // add it's left subtree and return.
+ // add its left subtree and return.
return $left_tree . $this->convertFunction($tree['value'], $tree['right']);
}
$converted_tree = $this->convert($tree['value']);
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php
index 378655183..78fda5174 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php
@@ -465,7 +465,7 @@ class Worksheet extends BIFFwriter
switch ($calctype) {
case 'integer':
case 'double':
- $this->writeNumber($row, $column, $calculatedValue, $xfIndex);
+ $this->writeNumber($row, $column, (float) $calculatedValue, $xfIndex);
break;
case 'string':
@@ -473,7 +473,7 @@ class Worksheet extends BIFFwriter
break;
case 'boolean':
- $this->writeBoolErr($row, $column, $calculatedValue, 0, $xfIndex);
+ $this->writeBoolErr($row, $column, (int) $calculatedValue, 0, $xfIndex);
break;
default:
@@ -2405,10 +2405,12 @@ class Worksheet extends BIFFwriter
for ($i = 0; $i < $width; ++$i) {
/** @phpstan-ignore-next-line */
$color = imagecolorsforindex($image, imagecolorat($image, $i, $j));
- foreach (['red', 'green', 'blue'] as $key) {
- $color[$key] = $color[$key] + (int) round((255 - $color[$key]) * $color['alpha'] / 127);
+ if ($color !== false) {
+ foreach (['red', 'green', 'blue'] as $key) {
+ $color[$key] = $color[$key] + (int) round((255 - $color[$key]) * $color['alpha'] / 127);
+ }
+ $data .= chr($color['blue']) . chr($color['green']) . chr($color['red']);
}
- $data .= chr($color['blue']) . chr($color['green']) . chr($color['red']);
}
if (3 * $width % 4) {
$data .= str_repeat("\x00", 4 - 3 * $width % 4);
@@ -2836,7 +2838,7 @@ class Worksheet extends BIFFwriter
$operatorType = 0x01;
break;
- // not OPERATOR_NOTBETWEEN 0x02
+ // not OPERATOR_NOTBETWEEN 0x02
}
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php
index 5aca51174..c9446e707 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php
@@ -349,12 +349,15 @@ class Xlsx extends BaseWriter
//a custom UI in this workbook ? add it ("base" xml and additional objects (pictures) and rels)
if ($this->spreadSheet->hasRibbon()) {
$tmpRibbonTarget = $this->spreadSheet->getRibbonXMLData('target');
+ $tmpRibbonTarget = is_string($tmpRibbonTarget) ? $tmpRibbonTarget : '';
$zipContent[$tmpRibbonTarget] = $this->spreadSheet->getRibbonXMLData('data');
if ($this->spreadSheet->hasRibbonBinObjects()) {
$tmpRootPath = dirname($tmpRibbonTarget) . '/';
$ribbonBinObjects = $this->spreadSheet->getRibbonBinObjects('data'); //the files to write
- foreach ($ribbonBinObjects as $aPath => $aContent) {
- $zipContent[$tmpRootPath . $aPath] = $aContent;
+ if (is_array($ribbonBinObjects)) {
+ foreach ($ribbonBinObjects as $aPath => $aContent) {
+ $zipContent[$tmpRootPath . $aPath] = $aContent;
+ }
}
//the rels for files
$zipContent[$tmpRootPath . '_rels/' . basename($tmpRibbonTarget) . '.rels'] = $this->getWriterPartRelsRibbon()->writeRibbonRelationships($this->spreadSheet);
@@ -684,6 +687,7 @@ class Xlsx extends BaseWriter
return $this;
}
+ /** @var array */
private $pathNames = [];
private function addZipFile(string $path, string $content): void
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php
index 356b44e97..3b64bd8e9 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php
@@ -11,6 +11,7 @@ use PhpOffice\PhpSpreadsheet\Chart\Legend;
use PhpOffice\PhpSpreadsheet\Chart\PlotArea;
use PhpOffice\PhpSpreadsheet\Chart\Properties;
use PhpOffice\PhpSpreadsheet\Chart\Title;
+use PhpOffice\PhpSpreadsheet\Chart\TrendLine;
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
@@ -58,7 +59,7 @@ class Chart extends WriterPart
$objWriter->writeAttribute('val', 'en-GB');
$objWriter->endElement();
$objWriter->startElement('c:roundedCorners');
- $objWriter->writeAttribute('val', '0');
+ $objWriter->writeAttribute('val', $chart->getRoundedCorners() ? '1' : '0');
$objWriter->endElement();
$this->writeAlternateContent($objWriter);
@@ -68,34 +69,26 @@ class Chart extends WriterPart
$this->writeTitle($objWriter, $chart->getTitle());
$objWriter->startElement('c:autoTitleDeleted');
- $objWriter->writeAttribute('val', '0');
+ $objWriter->writeAttribute('val', (string) (int) $chart->getAutoTitleDeleted());
$objWriter->endElement();
$objWriter->startElement('c:view3D');
- $rotX = $chart->getRotX();
- if (is_int($rotX)) {
- $objWriter->startElement('c:rotX');
- $objWriter->writeAttribute('val', "$rotX");
- $objWriter->endElement();
- }
- $rotY = $chart->getRotY();
- if (is_int($rotY)) {
- $objWriter->startElement('c:rotY');
- $objWriter->writeAttribute('val', "$rotY");
- $objWriter->endElement();
- }
- $rAngAx = $chart->getRAngAx();
- if (is_int($rAngAx)) {
- $objWriter->startElement('c:rAngAx');
- $objWriter->writeAttribute('val', "$rAngAx");
- $objWriter->endElement();
- }
- $perspective = $chart->getPerspective();
- if (is_int($perspective)) {
- $objWriter->startElement('c:perspective');
- $objWriter->writeAttribute('val', "$perspective");
- $objWriter->endElement();
+ $surface2D = false;
+ $plotArea = $chart->getPlotArea();
+ if ($plotArea !== null) {
+ $seriesArray = $plotArea->getPlotGroup();
+ foreach ($seriesArray as $series) {
+ if ($series->getPlotType() === DataSeries::TYPE_SURFACECHART) {
+ $surface2D = true;
+
+ break;
+ }
+ }
}
+ $this->writeView3D($objWriter, $chart->getRotX(), 'c:rotX', $surface2D, 90);
+ $this->writeView3D($objWriter, $chart->getRotY(), 'c:rotY', $surface2D);
+ $this->writeView3D($objWriter, $chart->getRAngAx(), 'c:rAngAx', $surface2D);
+ $this->writeView3D($objWriter, $chart->getPerspective(), 'c:perspective', $surface2D);
$objWriter->endElement(); // view3D
$this->writePlotArea($objWriter, $chart->getPlotArea(), $chart->getXAxisLabel(), $chart->getYAxisLabel(), $chart->getChartAxisX(), $chart->getChartAxisY());
@@ -114,16 +107,34 @@ class Chart extends WriterPart
$objWriter->writeAttribute('val', '0');
$objWriter->endElement();
- $objWriter->endElement();
+ $objWriter->endElement(); // c:chart
+ if ($chart->getNoFill()) {
+ $objWriter->startElement('c:spPr');
+ $objWriter->startElement('a:noFill');
+ $objWriter->endElement(); // a:noFill
+ $objWriter->endElement(); // c:spPr
+ }
$this->writePrintSettings($objWriter);
- $objWriter->endElement();
+ $objWriter->endElement(); // c:chartSpace
// Return
return $objWriter->getData();
}
+ private function writeView3D(XMLWriter $objWriter, ?int $value, string $tag, bool $surface2D, int $default = 0): void
+ {
+ if ($value === null && $surface2D) {
+ $value = $default;
+ }
+ if ($value !== null) {
+ $objWriter->startElement($tag);
+ $objWriter->writeAttribute('val', "$value");
+ $objWriter->endElement();
+ }
+ }
+
/**
* Write Chart Title.
*/
@@ -222,8 +233,6 @@ class Chart extends WriterPart
if ($plotArea === null) {
return;
}
- $majorGridlines = ($yAxis === null) ? null : $yAxis->getMajorGridlines();
- $minorGridlines = ($yAxis === null) ? null : $yAxis->getMinorGridlines();
$id1 = $id2 = $id3 = '0';
$this->seriesIndex = 0;
@@ -356,8 +365,35 @@ class Chart extends WriterPart
$this->writeSerAxis($objWriter, $id2, $id3);
}
}
+ $stops = $plotArea->getGradientFillStops();
+ if ($plotArea->getNoFill() || !empty($stops)) {
+ $objWriter->startElement('c:spPr');
+ if ($plotArea->getNoFill()) {
+ $objWriter->startElement('a:noFill');
+ $objWriter->endElement(); // a:noFill
+ }
+ if (!empty($stops)) {
+ $objWriter->startElement('a:gradFill');
+ $objWriter->startElement('a:gsLst');
+ foreach ($stops as $stop) {
+ $objWriter->startElement('a:gs');
+ $objWriter->writeAttribute('pos', (string) (Properties::PERCENTAGE_MULTIPLIER * (float) $stop[0]));
+ $this->writeColor($objWriter, $stop[1], false);
+ $objWriter->endElement(); // a:gs
+ }
+ $objWriter->endElement(); // a:gsLst
+ $angle = $plotArea->getGradientFillAngle();
+ if ($angle !== null) {
+ $objWriter->startElement('a:lin');
+ $objWriter->writeAttribute('ang', Properties::angleToXml($angle));
+ $objWriter->endElement(); // a:lin
+ }
+ $objWriter->endElement(); // a:gradFill
+ }
+ $objWriter->endElement(); // c:spPr
+ }
- $objWriter->endElement();
+ $objWriter->endElement(); // c:plotArea
}
private function writeDataLabelsBool(XMLWriter $objWriter, string $name, ?bool $value): void
@@ -420,6 +456,17 @@ class Chart extends WriterPart
$objWriter->endElement(); // c:txPr
}
+ if ($chartLayout->getNumFmtCode() !== '') {
+ $objWriter->startElement('c:numFmt');
+ $objWriter->writeAttribute('formatCode', $chartLayout->getnumFmtCode());
+ $objWriter->writeAttribute('sourceLinked', (string) (int) $chartLayout->getnumFmtLinked());
+ $objWriter->endElement(); // c:numFmt
+ }
+ if ($chartLayout->getDLblPos() !== '') {
+ $objWriter->startElement('c:dLblPos');
+ $objWriter->writeAttribute('val', $chartLayout->getDLblPos());
+ $objWriter->endElement(); // c:dLblPos
+ }
$this->writeDataLabelsBool($objWriter, 'showLegendKey', $chartLayout->getShowLegendKey());
$this->writeDataLabelsBool($objWriter, 'showVal', $chartLayout->getShowVal());
$this->writeDataLabelsBool($objWriter, 'showCatName', $chartLayout->getShowCatName());
@@ -441,13 +488,14 @@ class Chart extends WriterPart
private function writeCategoryAxis(XMLWriter $objWriter, ?Title $xAxisLabel, $id1, $id2, $isMultiLevelSeries, Axis $yAxis): void
{
// N.B. writeCategoryAxis may be invoked with the last parameter($yAxis) using $xAxis for ScatterChart, etc
- // In that case, xAxis is NOT a category.
- if ($yAxis->getAxisType() !== '') {
- $objWriter->startElement('c:' . $yAxis->getAxisType());
+ // In that case, xAxis may contain values like the yAxis, or it may be a date axis (LINECHART).
+ $axisType = $yAxis->getAxisType();
+ if ($axisType !== '') {
+ $objWriter->startElement("c:$axisType");
} elseif ($yAxis->getAxisIsNumericFormat()) {
- $objWriter->startElement('c:valAx');
+ $objWriter->startElement('c:' . Axis::AXIS_TYPE_VALUE);
} else {
- $objWriter->startElement('c:catAx');
+ $objWriter->startElement('c:' . Axis::AXIS_TYPE_CATEGORY);
}
$majorGridlines = $yAxis->getMajorGridlines();
$minorGridlines = $yAxis->getMinorGridlines();
@@ -477,7 +525,7 @@ class Chart extends WriterPart
$objWriter->endElement(); // c:scaling
$objWriter->startElement('c:delete');
- $objWriter->writeAttribute('val', '0');
+ $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('hidden') ?? '0');
$objWriter->endElement();
$objWriter->startElement('c:axPos');
@@ -558,6 +606,23 @@ class Chart extends WriterPart
$objWriter->endElement();
}
+ $textRotation = $yAxis->getAxisOptionsProperty('textRotation');
+ if (is_numeric($textRotation)) {
+ $objWriter->startElement('c:txPr');
+ $objWriter->startElement('a:bodyPr');
+ $objWriter->writeAttribute('rot', Properties::angleToXml((float) $textRotation));
+ $objWriter->endElement(); // a:bodyPr
+ $objWriter->startElement('a:lstStyle');
+ $objWriter->endElement(); // a:lstStyle
+ $objWriter->startElement('a:p');
+ $objWriter->startElement('a:pPr');
+ $objWriter->startElement('a:defRPr');
+ $objWriter->endElement(); // a:defRPr
+ $objWriter->endElement(); // a:pPr
+ $objWriter->endElement(); // a:p
+ $objWriter->endElement(); // c:txPr
+ }
+
$objWriter->startElement('c:spPr');
$this->writeColor($objWriter, $yAxis->getFillColorObject());
$this->writeEffects($objWriter, $yAxis);
@@ -588,7 +653,8 @@ class Chart extends WriterPart
}
$objWriter->startElement('c:auto');
- $objWriter->writeAttribute('val', '1');
+ // LineChart with dateAx wants '0'
+ $objWriter->writeAttribute('val', ($axisType === Axis::AXIS_TYPE_DATE) ? '0' : '1');
$objWriter->endElement();
$objWriter->startElement('c:lblAlgn');
@@ -599,6 +665,30 @@ class Chart extends WriterPart
$objWriter->writeAttribute('val', '100');
$objWriter->endElement();
+ if ($axisType === Axis::AXIS_TYPE_DATE) {
+ $property = 'baseTimeUnit';
+ $propertyVal = $yAxis->getAxisOptionsProperty($property);
+ if (!empty($propertyVal)) {
+ $objWriter->startElement("c:$property");
+ $objWriter->writeAttribute('val', $propertyVal);
+ $objWriter->endElement();
+ }
+ $property = 'majorTimeUnit';
+ $propertyVal = $yAxis->getAxisOptionsProperty($property);
+ if (!empty($propertyVal)) {
+ $objWriter->startElement("c:$property");
+ $objWriter->writeAttribute('val', $propertyVal);
+ $objWriter->endElement();
+ }
+ $property = 'minorTimeUnit';
+ $propertyVal = $yAxis->getAxisOptionsProperty($property);
+ if (!empty($propertyVal)) {
+ $objWriter->startElement("c:$property");
+ $objWriter->writeAttribute('val', $propertyVal);
+ $objWriter->endElement();
+ }
+ }
+
if ($isMultiLevelSeries) {
$objWriter->startElement('c:noMultiLvlLbl');
$objWriter->writeAttribute('val', '0');
@@ -617,7 +707,7 @@ class Chart extends WriterPart
*/
private function writeValueAxis(XMLWriter $objWriter, ?Title $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, Axis $xAxis): void
{
- $objWriter->startElement('c:valAx');
+ $objWriter->startElement('c:' . Axis::AXIS_TYPE_VALUE);
$majorGridlines = $xAxis->getMajorGridlines();
$minorGridlines = $xAxis->getMinorGridlines();
@@ -650,7 +740,7 @@ class Chart extends WriterPart
$objWriter->endElement(); // c:scaling
$objWriter->startElement('c:delete');
- $objWriter->writeAttribute('val', '0');
+ $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('hidden') ?? '0');
$objWriter->endElement();
$objWriter->startElement('c:axPos');
@@ -733,6 +823,23 @@ class Chart extends WriterPart
$objWriter->endElement();
}
+ $textRotation = $xAxis->getAxisOptionsProperty('textRotation');
+ if (is_numeric($textRotation)) {
+ $objWriter->startElement('c:txPr');
+ $objWriter->startElement('a:bodyPr');
+ $objWriter->writeAttribute('rot', Properties::angleToXml((float) $textRotation));
+ $objWriter->endElement(); // a:bodyPr
+ $objWriter->startElement('a:lstStyle');
+ $objWriter->endElement(); // a:lstStyle
+ $objWriter->startElement('a:p');
+ $objWriter->startElement('a:pPr');
+ $objWriter->startElement('a:defRPr');
+ $objWriter->endElement(); // a:defRPr
+ $objWriter->endElement(); // a:pPr
+ $objWriter->endElement(); // a:p
+ $objWriter->endElement(); // c:txPr
+ }
+
$objWriter->startElement('c:spPr');
$this->writeColor($objWriter, $xAxis->getFillColorObject());
$this->writeLineStyles($objWriter, $xAxis);
@@ -875,10 +982,6 @@ class Chart extends WriterPart
$objWriter->writeAttribute('val', "$val");
$objWriter->endElement(); // c:idx
- $objWriter->startElement('c:bubble3D');
- $objWriter->writeAttribute('val', '0');
- $objWriter->endElement(); // c:bubble3D
-
$objWriter->startElement('c:spPr');
$this->writeColor($objWriter, $fillColor);
$objWriter->endElement(); // c:spPr
@@ -906,8 +1009,8 @@ class Chart extends WriterPart
$objWriter->endElement();
}
- if ($plotGroup->getPlotGrouping() !== null) {
- $plotGroupingType = $plotGroup->getPlotGrouping();
+ $plotGroupingType = $plotGroup->getPlotGrouping();
+ if ($plotGroupingType !== null && $groupType !== DataSeries::TYPE_SURFACECHART && $groupType !== DataSeries::TYPE_SURFACECHART_3D) {
$objWriter->startElement('c:grouping');
$objWriter->writeAttribute('val', $plotGroupingType);
$objWriter->endElement();
@@ -1000,7 +1103,7 @@ class Chart extends WriterPart
$objWriter->endElement(); // a:ln
}
}
- $nofill = $groupType == DataSeries::TYPE_STOCKCHART || ($groupType === DataSeries::TYPE_SCATTERCHART && !$plotSeriesValues->getScatterLines());
+ $nofill = $groupType === DataSeries::TYPE_STOCKCHART || (($groupType === DataSeries::TYPE_SCATTERCHART || $groupType === DataSeries::TYPE_LINECHART) && !$plotSeriesValues->getScatterLines());
if ($callLineStyles) {
$this->writeLineStyles($objWriter, $plotSeriesValues, $nofill);
$this->writeEffects($objWriter, $plotSeriesValues);
@@ -1045,6 +1148,88 @@ class Chart extends WriterPart
$objWriter->writeAttribute('val', '0');
$objWriter->endElement();
}
+ // Trendlines
+ if ($plotSeriesValues !== false) {
+ foreach ($plotSeriesValues->getTrendLines() as $trendLine) {
+ $trendLineType = $trendLine->getTrendLineType();
+ $order = $trendLine->getOrder();
+ $period = $trendLine->getPeriod();
+ $dispRSqr = $trendLine->getDispRSqr();
+ $dispEq = $trendLine->getDispEq();
+ $forward = $trendLine->getForward();
+ $backward = $trendLine->getBackward();
+ $intercept = $trendLine->getIntercept();
+ $name = $trendLine->getName();
+ $trendLineColor = $trendLine->getLineColor(); // ChartColor
+
+ $objWriter->startElement('c:trendline'); // N.B. lowercase 'ell'
+ if ($name !== '') {
+ $objWriter->startElement('c:name');
+ $objWriter->writeRawData($name);
+ $objWriter->endElement(); // c:name
+ }
+ $objWriter->startElement('c:spPr');
+
+ if (!$trendLineColor->isUsable()) {
+ // use dataSeriesValues line color as a backup if $trendLineColor is null
+ $dsvLineColor = $plotSeriesValues->getLineColor();
+ if ($dsvLineColor->isUsable()) {
+ $trendLine
+ ->getLineColor()
+ ->setColorProperties($dsvLineColor->getValue(), $dsvLineColor->getAlpha(), $dsvLineColor->getType());
+ }
+ } // otherwise, hope Excel does the right thing
+
+ $this->writeLineStyles($objWriter, $trendLine, false); // suppress noFill
+
+ $objWriter->endElement(); // spPr
+
+ $objWriter->startElement('c:trendlineType'); // N.B lowercase 'ell'
+ $objWriter->writeAttribute('val', $trendLineType);
+ $objWriter->endElement(); // trendlineType
+ if ($backward !== 0.0) {
+ $objWriter->startElement('c:backward');
+ $objWriter->writeAttribute('val', "$backward");
+ $objWriter->endElement(); // c:backward
+ }
+ if ($forward !== 0.0) {
+ $objWriter->startElement('c:forward');
+ $objWriter->writeAttribute('val', "$forward");
+ $objWriter->endElement(); // c:forward
+ }
+ if ($intercept !== 0.0) {
+ $objWriter->startElement('c:intercept');
+ $objWriter->writeAttribute('val', "$intercept");
+ $objWriter->endElement(); // c:intercept
+ }
+ if ($trendLineType == TrendLine::TRENDLINE_POLYNOMIAL) {
+ $objWriter->startElement('c:order');
+ $objWriter->writeAttribute('val', $order);
+ $objWriter->endElement(); // order
+ }
+ if ($trendLineType == TrendLine::TRENDLINE_MOVING_AVG) {
+ $objWriter->startElement('c:period');
+ $objWriter->writeAttribute('val', $period);
+ $objWriter->endElement(); // period
+ }
+ $objWriter->startElement('c:dispRSqr');
+ $objWriter->writeAttribute('val', $dispRSqr ? '1' : '0');
+ $objWriter->endElement();
+ $objWriter->startElement('c:dispEq');
+ $objWriter->writeAttribute('val', $dispEq ? '1' : '0');
+ $objWriter->endElement();
+ if ($groupType === DataSeries::TYPE_SCATTERCHART || $groupType === DataSeries::TYPE_LINECHART) {
+ $objWriter->startElement('c:trendlineLbl');
+ $objWriter->startElement('c:numFmt');
+ $objWriter->writeAttribute('formatCode', 'General');
+ $objWriter->writeAttribute('sourceLinked', '0');
+ $objWriter->endElement(); // numFmt
+ $objWriter->endElement(); // trendlineLbl
+ }
+
+ $objWriter->endElement(); // trendline
+ }
+ }
// Category Labels
$plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesIdx);
@@ -1052,13 +1237,11 @@ class Chart extends WriterPart
$catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries();
if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) {
- if ($plotGroup->getPlotStyle() !== null) {
- $plotStyle = $plotGroup->getPlotStyle();
- if ($plotStyle) {
- $objWriter->startElement('c:explosion');
- $objWriter->writeAttribute('val', '25');
- $objWriter->endElement();
- }
+ $plotStyle = $plotGroup->getPlotStyle();
+ if (is_numeric($plotStyle)) {
+ $objWriter->startElement('c:explosion');
+ $objWriter->writeAttribute('val', $plotStyle);
+ $objWriter->endElement();
}
}
@@ -1569,7 +1752,18 @@ class Chart extends WriterPart
if (is_numeric($alpha)) {
$objWriter->startElement('a:alpha');
$objWriter->writeAttribute('val', ChartColor::alphaToXml((int) $alpha));
- $objWriter->endElement();
+ $objWriter->endElement(); // a:alpha
+ }
+ $brightness = $chartColor->getBrightness();
+ if (is_numeric($brightness)) {
+ $brightness = (int) $brightness;
+ $lumOff = 100 - $brightness;
+ $objWriter->startElement('a:lumMod');
+ $objWriter->writeAttribute('val', ChartColor::alphaToXml($brightness));
+ $objWriter->endElement(); // a:lumMod
+ $objWriter->startElement('a:lumOff');
+ $objWriter->writeAttribute('val', ChartColor::alphaToXml($lumOff));
+ $objWriter->endElement(); // a:lumOff
}
$objWriter->endElement(); //a:srgbClr/schemeClr/prstClr
if ($solidFill) {
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php
index ea0f1faa6..5045e8f38 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php
@@ -165,7 +165,7 @@ class Comments extends WriterPart
// Metadata
[$column, $row] = Coordinate::indexesFromString($cellReference);
$id = 1024 + $column + $row;
- $id = substr($id, 0, 4);
+ $id = substr("$id", 0, 4);
// v:shape
$objWriter->startElement('v:shape');
@@ -223,10 +223,10 @@ class Comments extends WriterPart
$objWriter->writeElement('x:AutoFill', 'False');
// x:Row
- $objWriter->writeElement('x:Row', ($row - 1));
+ $objWriter->writeElement('x:Row', (string) ($row - 1));
// x:Column
- $objWriter->writeElement('x:Column', ($column - 1));
+ $objWriter->writeElement('x:Column', (string) ($column - 1));
$objWriter->endElement();
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php
index b8285fcbe..b3338c07b 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php
@@ -118,7 +118,7 @@ class DefinedNames
$range[1] = Coordinate::absoluteCoordinate($range[1]);
$range = implode(':', $range);
- $this->objWriter->writeRawData('\'' . str_replace("'", "''", $worksheet->getTitle() ?? '') . '\'!' . $range);
+ $this->objWriter->writeRawData('\'' . str_replace("'", "''", $worksheet->getTitle()) . '\'!' . $range);
$this->objWriter->endElement();
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php
index 43ce442fe..cb8758c2b 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php
@@ -56,7 +56,7 @@ class DocProps extends WriterPart
// Variant
$objWriter->startElement('vt:variant');
- $objWriter->writeElement('vt:i4', $spreadsheet->getSheetCount());
+ $objWriter->writeElement('vt:i4', (string) $spreadsheet->getSheetCount());
$objWriter->endElement();
$objWriter->endElement();
@@ -68,7 +68,7 @@ class DocProps extends WriterPart
// Vector
$objWriter->startElement('vt:vector');
- $objWriter->writeAttribute('size', $spreadsheet->getSheetCount());
+ $objWriter->writeAttribute('size', (string) $spreadsheet->getSheetCount());
$objWriter->writeAttribute('baseType', 'lpstr');
$sheetCount = $spreadsheet->getSheetCount();
@@ -207,7 +207,7 @@ class DocProps extends WriterPart
$objWriter->startElement('property');
$objWriter->writeAttribute('fmtid', '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}');
- $objWriter->writeAttribute('pid', $key + 2);
+ $objWriter->writeAttribute('pid', (string) ($key + 2));
$objWriter->writeAttribute('name', $customProperty);
switch ($propertyType) {
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php
index 238fb5bf6..99fa2d34a 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php
@@ -67,12 +67,13 @@ class Rels extends WriterPart
'xl/workbook.xml'
);
// a custom UI in workbook ?
+ $target = $spreadsheet->getRibbonXMLData('target');
if ($spreadsheet->hasRibbon()) {
$this->writeRelationShip(
$objWriter,
5,
'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility',
- $spreadsheet->getRibbonXMLData('target')
+ is_string($target) ? $target : ''
);
}
@@ -284,7 +285,7 @@ class Rels extends WriterPart
return $objWriter->getData();
}
- private function writeUnparsedRelationship(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $worksheet, XMLWriter $objWriter, $relationship, $type): void
+ private function writeUnparsedRelationship(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $worksheet, XMLWriter $objWriter, string $relationship, string $type): void
{
$unparsedLoadedData = $worksheet->getParent()->getUnparsedLoadedData();
if (!isset($unparsedLoadedData['sheets'][$worksheet->getCodeName()][$relationship])) {
@@ -448,7 +449,7 @@ class Rels extends WriterPart
/**
* Write Override content type.
*
- * @param int $id Relationship ID. rId will be prepended!
+ * @param int|string $id Relationship ID. rId will be prepended!
* @param string $type Relationship type
* @param string $target Relationship target
* @param string $targetMode Relationship target mode
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
index 8b293bc19..078f940ac 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php
@@ -66,7 +66,7 @@ class StringTable extends WriterPart
/**
* Write string table to XML format.
*
- * @param string[] $stringTable
+ * @param (string|RichText)[] $stringTable
*
* @return string XML Output
*/
@@ -86,13 +86,13 @@ class StringTable extends WriterPart
// String table
$objWriter->startElement('sst');
$objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
- $objWriter->writeAttribute('uniqueCount', count($stringTable));
+ $objWriter->writeAttribute('uniqueCount', (string) count($stringTable));
// Loop through string table
foreach ($stringTable as $textElement) {
$objWriter->startElement('si');
- if (!$textElement instanceof RichText) {
+ if (!($textElement instanceof RichText)) {
$textToWrite = StringHelper::controlCharacterPHP2OOXML($textElement);
$objWriter->startElement('t');
if ($textToWrite !== trim($textToWrite)) {
@@ -100,7 +100,7 @@ class StringTable extends WriterPart
}
$objWriter->writeRawData($textToWrite);
$objWriter->endElement();
- } elseif ($textElement instanceof RichText) {
+ } else {
$this->writeRichText($objWriter, $textElement);
}
@@ -130,14 +130,16 @@ class StringTable extends WriterPart
$objWriter->startElement($prefix . 'r');
// rPr
- if ($element instanceof Run) {
+ if ($element instanceof Run && $element->getFont() !== null) {
// rPr
$objWriter->startElement($prefix . 'rPr');
// rFont
- $objWriter->startElement($prefix . 'rFont');
- $objWriter->writeAttribute('val', $element->getFont()->getName());
- $objWriter->endElement();
+ if ($element->getFont()->getName() !== null) {
+ $objWriter->startElement($prefix . 'rFont');
+ $objWriter->writeAttribute('val', $element->getFont()->getName());
+ $objWriter->endElement();
+ }
// Bold
$objWriter->startElement($prefix . 'b');
@@ -166,19 +168,25 @@ class StringTable extends WriterPart
$objWriter->endElement();
// Color
- $objWriter->startElement($prefix . 'color');
- $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB());
- $objWriter->endElement();
+ if ($element->getFont()->getColor()->getARGB() !== null) {
+ $objWriter->startElement($prefix . 'color');
+ $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB());
+ $objWriter->endElement();
+ }
// Size
- $objWriter->startElement($prefix . 'sz');
- $objWriter->writeAttribute('val', $element->getFont()->getSize());
- $objWriter->endElement();
+ if ($element->getFont()->getSize() !== null) {
+ $objWriter->startElement($prefix . 'sz');
+ $objWriter->writeAttribute('val', (string) $element->getFont()->getSize());
+ $objWriter->endElement();
+ }
// Underline
- $objWriter->startElement($prefix . 'u');
- $objWriter->writeAttribute('val', $element->getFont()->getUnderline());
- $objWriter->endElement();
+ if ($element->getFont()->getUnderline() !== null) {
+ $objWriter->startElement($prefix . 'u');
+ $objWriter->writeAttribute('val', $element->getFont()->getUnderline());
+ $objWriter->endElement();
+ }
$objWriter->endElement();
}
@@ -201,10 +209,10 @@ class StringTable extends WriterPart
*/
public function writeRichTextForCharts(XMLWriter $objWriter, $richText = null, $prefix = ''): void
{
- if (!$richText instanceof RichText) {
+ if (!($richText instanceof RichText)) {
$textRun = $richText;
$richText = new RichText();
- $run = $richText->createTextRun($textRun);
+ $run = $richText->createTextRun($textRun ?? '');
$run->setFont(null);
}
@@ -226,9 +234,9 @@ class StringTable extends WriterPart
}
// Bold
- $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? 1 : 0));
+ $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? '1' : '0'));
// Italic
- $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? 1 : 0));
+ $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? '1' : '0'));
// Underline
$underlineType = $element->getFont()->getUnderline();
switch ($underlineType) {
@@ -241,7 +249,9 @@ class StringTable extends WriterPart
break;
}
- $objWriter->writeAttribute('u', $underlineType);
+ if ($underlineType !== null) {
+ $objWriter->writeAttribute('u', $underlineType);
+ }
// Strikethrough
$objWriter->writeAttribute('strike', ($element->getFont()->getStriketype() ?: 'noStrike'));
// Superscript/subscript
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php
index cb2e38504..0442c25d4 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php
@@ -5,6 +5,7 @@ namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Borders;
use PhpOffice\PhpSpreadsheet\Style\Conditional;
@@ -40,7 +41,7 @@ class Style extends WriterPart
// numFmts
$objWriter->startElement('numFmts');
- $objWriter->writeAttribute('count', $this->getParentWriter()->getNumFmtHashTable()->count());
+ $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getNumFmtHashTable()->count());
// numFmt
for ($i = 0; $i < $this->getParentWriter()->getNumFmtHashTable()->count(); ++$i) {
@@ -51,54 +52,63 @@ class Style extends WriterPart
// fonts
$objWriter->startElement('fonts');
- $objWriter->writeAttribute('count', $this->getParentWriter()->getFontHashTable()->count());
+ $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getFontHashTable()->count());
// font
for ($i = 0; $i < $this->getParentWriter()->getFontHashTable()->count(); ++$i) {
- $this->writeFont($objWriter, $this->getParentWriter()->getFontHashTable()->getByIndex($i));
+ $thisfont = $this->getParentWriter()->getFontHashTable()->getByIndex($i);
+ if ($thisfont !== null) {
+ $this->writeFont($objWriter, $thisfont);
+ }
}
$objWriter->endElement();
// fills
$objWriter->startElement('fills');
- $objWriter->writeAttribute('count', $this->getParentWriter()->getFillHashTable()->count());
+ $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getFillHashTable()->count());
// fill
for ($i = 0; $i < $this->getParentWriter()->getFillHashTable()->count(); ++$i) {
- $this->writeFill($objWriter, $this->getParentWriter()->getFillHashTable()->getByIndex($i));
+ $thisfill = $this->getParentWriter()->getFillHashTable()->getByIndex($i);
+ if ($thisfill !== null) {
+ $this->writeFill($objWriter, $thisfill);
+ }
}
$objWriter->endElement();
// borders
$objWriter->startElement('borders');
- $objWriter->writeAttribute('count', $this->getParentWriter()->getBordersHashTable()->count());
+ $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getBordersHashTable()->count());
// border
for ($i = 0; $i < $this->getParentWriter()->getBordersHashTable()->count(); ++$i) {
- $this->writeBorder($objWriter, $this->getParentWriter()->getBordersHashTable()->getByIndex($i));
+ $thisborder = $this->getParentWriter()->getBordersHashTable()->getByIndex($i);
+ if ($thisborder !== null) {
+ $this->writeBorder($objWriter, $thisborder);
+ }
}
$objWriter->endElement();
// cellStyleXfs
$objWriter->startElement('cellStyleXfs');
- $objWriter->writeAttribute('count', 1);
+ $objWriter->writeAttribute('count', '1');
// xf
$objWriter->startElement('xf');
- $objWriter->writeAttribute('numFmtId', 0);
- $objWriter->writeAttribute('fontId', 0);
- $objWriter->writeAttribute('fillId', 0);
- $objWriter->writeAttribute('borderId', 0);
+ $objWriter->writeAttribute('numFmtId', '0');
+ $objWriter->writeAttribute('fontId', '0');
+ $objWriter->writeAttribute('fillId', '0');
+ $objWriter->writeAttribute('borderId', '0');
$objWriter->endElement();
$objWriter->endElement();
// cellXfs
$objWriter->startElement('cellXfs');
- $objWriter->writeAttribute('count', count($spreadsheet->getCellXfCollection()));
+ $objWriter->writeAttribute('count', (string) count($spreadsheet->getCellXfCollection()));
// xf
foreach ($spreadsheet->getCellXfCollection() as $cellXf) {
@@ -109,24 +119,27 @@ class Style extends WriterPart
// cellStyles
$objWriter->startElement('cellStyles');
- $objWriter->writeAttribute('count', 1);
+ $objWriter->writeAttribute('count', '1');
// cellStyle
$objWriter->startElement('cellStyle');
$objWriter->writeAttribute('name', 'Normal');
- $objWriter->writeAttribute('xfId', 0);
- $objWriter->writeAttribute('builtinId', 0);
+ $objWriter->writeAttribute('xfId', '0');
+ $objWriter->writeAttribute('builtinId', '0');
$objWriter->endElement();
$objWriter->endElement();
// dxfs
$objWriter->startElement('dxfs');
- $objWriter->writeAttribute('count', $this->getParentWriter()->getStylesConditionalHashTable()->count());
+ $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getStylesConditionalHashTable()->count());
// dxf
for ($i = 0; $i < $this->getParentWriter()->getStylesConditionalHashTable()->count(); ++$i) {
- $this->writeCellStyleDxf($objWriter, $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i)->getStyle());
+ $thisstyle = $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i);
+ if ($thisstyle !== null) {
+ $this->writeCellStyleDxf($objWriter, $thisstyle->getStyle());
+ }
}
$objWriter->endElement();
@@ -171,17 +184,19 @@ class Style extends WriterPart
// gradientFill
$objWriter->startElement('gradientFill');
- $objWriter->writeAttribute('type', $fill->getFillType());
- $objWriter->writeAttribute('degree', $fill->getRotation());
+ $objWriter->writeAttribute('type', (string) $fill->getFillType());
+ $objWriter->writeAttribute('degree', (string) $fill->getRotation());
// stop
$objWriter->startElement('stop');
$objWriter->writeAttribute('position', '0');
// color
- $objWriter->startElement('color');
- $objWriter->writeAttribute('rgb', $fill->getStartColor()->getARGB());
- $objWriter->endElement();
+ if ($fill->getStartColor()->getARGB() !== null) {
+ $objWriter->startElement('color');
+ $objWriter->writeAttribute('rgb', $fill->getStartColor()->getARGB());
+ $objWriter->endElement();
+ }
$objWriter->endElement();
@@ -190,9 +205,11 @@ class Style extends WriterPart
$objWriter->writeAttribute('position', '1');
// color
- $objWriter->startElement('color');
- $objWriter->writeAttribute('rgb', $fill->getEndColor()->getARGB());
- $objWriter->endElement();
+ if ($fill->getEndColor()->getARGB() !== null) {
+ $objWriter->startElement('color');
+ $objWriter->writeAttribute('rgb', $fill->getEndColor()->getARGB());
+ $objWriter->endElement();
+ }
$objWriter->endElement();
@@ -220,7 +237,7 @@ class Style extends WriterPart
// patternFill
$objWriter->startElement('patternFill');
- $objWriter->writeAttribute('patternType', $fill->getFillType());
+ $objWriter->writeAttribute('patternType', (string) $fill->getFillType());
if (self::writePatternColors($fill)) {
// fgColor
@@ -360,20 +377,20 @@ class Style extends WriterPart
{
// xf
$objWriter->startElement('xf');
- $objWriter->writeAttribute('xfId', 0);
- $objWriter->writeAttribute('fontId', (int) $this->getParentWriter()->getFontHashTable()->getIndexForHashCode($style->getFont()->getHashCode()));
+ $objWriter->writeAttribute('xfId', '0');
+ $objWriter->writeAttribute('fontId', (string) (int) $this->getParentWriter()->getFontHashTable()->getIndexForHashCode($style->getFont()->getHashCode()));
if ($style->getQuotePrefix()) {
- $objWriter->writeAttribute('quotePrefix', 1);
+ $objWriter->writeAttribute('quotePrefix', '1');
}
if ($style->getNumberFormat()->getBuiltInFormatCode() === false) {
- $objWriter->writeAttribute('numFmtId', (int) ($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($style->getNumberFormat()->getHashCode()) + 164));
+ $objWriter->writeAttribute('numFmtId', (string) (int) ($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($style->getNumberFormat()->getHashCode()) + 164));
} else {
- $objWriter->writeAttribute('numFmtId', (int) $style->getNumberFormat()->getBuiltInFormatCode());
+ $objWriter->writeAttribute('numFmtId', (string) (int) $style->getNumberFormat()->getBuiltInFormatCode());
}
- $objWriter->writeAttribute('fillId', (int) $this->getParentWriter()->getFillHashTable()->getIndexForHashCode($style->getFill()->getHashCode()));
- $objWriter->writeAttribute('borderId', (int) $this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($style->getBorders()->getHashCode()));
+ $objWriter->writeAttribute('fillId', (string) (int) $this->getParentWriter()->getFillHashTable()->getIndexForHashCode($style->getFill()->getHashCode()));
+ $objWriter->writeAttribute('borderId', (string) (int) $this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($style->getBorders()->getHashCode()));
// Apply styles?
$objWriter->writeAttribute('applyFont', ($spreadsheet->getDefaultStyle()->getFont()->getHashCode() != $style->getFont()->getHashCode()) ? '1' : '0');
@@ -387,25 +404,31 @@ class Style extends WriterPart
// alignment
$objWriter->startElement('alignment');
- $objWriter->writeAttribute('horizontal', $style->getAlignment()->getHorizontal());
- $objWriter->writeAttribute('vertical', $style->getAlignment()->getVertical());
+ $vertical = Alignment::VERTICAL_ALIGNMENT_FOR_XLSX[$style->getAlignment()->getVertical()] ?? '';
+ $horizontal = Alignment::HORIZONTAL_ALIGNMENT_FOR_XLSX[$style->getAlignment()->getHorizontal()] ?? '';
+ if ($horizontal !== '') {
+ $objWriter->writeAttribute('horizontal', $horizontal);
+ }
+ if ($vertical !== '') {
+ $objWriter->writeAttribute('vertical', $vertical);
+ }
$textRotation = 0;
if ($style->getAlignment()->getTextRotation() >= 0) {
$textRotation = $style->getAlignment()->getTextRotation();
- } elseif ($style->getAlignment()->getTextRotation() < 0) {
+ } else {
$textRotation = 90 - $style->getAlignment()->getTextRotation();
}
- $objWriter->writeAttribute('textRotation', $textRotation);
+ $objWriter->writeAttribute('textRotation', (string) $textRotation);
$objWriter->writeAttribute('wrapText', ($style->getAlignment()->getWrapText() ? 'true' : 'false'));
$objWriter->writeAttribute('shrinkToFit', ($style->getAlignment()->getShrinkToFit() ? 'true' : 'false'));
if ($style->getAlignment()->getIndent() > 0) {
- $objWriter->writeAttribute('indent', $style->getAlignment()->getIndent());
+ $objWriter->writeAttribute('indent', (string) $style->getAlignment()->getIndent());
}
if ($style->getAlignment()->getReadOrder() > 0) {
- $objWriter->writeAttribute('readingOrder', $style->getAlignment()->getReadOrder());
+ $objWriter->writeAttribute('readingOrder', (string) $style->getAlignment()->getReadOrder());
}
$objWriter->endElement();
@@ -443,21 +466,23 @@ class Style extends WriterPart
// alignment
$objWriter->startElement('alignment');
- if ($style->getAlignment()->getHorizontal() !== null) {
- $objWriter->writeAttribute('horizontal', $style->getAlignment()->getHorizontal());
+ $horizontal = Alignment::HORIZONTAL_ALIGNMENT_FOR_XLSX[$style->getAlignment()->getHorizontal()] ?? '';
+ if ($horizontal) {
+ $objWriter->writeAttribute('horizontal', $horizontal);
}
- if ($style->getAlignment()->getVertical() !== null) {
- $objWriter->writeAttribute('vertical', $style->getAlignment()->getVertical());
+ $vertical = Alignment::VERTICAL_ALIGNMENT_FOR_XLSX[$style->getAlignment()->getVertical()] ?? '';
+ if ($vertical) {
+ $objWriter->writeAttribute('vertical', $vertical);
}
if ($style->getAlignment()->getTextRotation() !== null) {
$textRotation = 0;
if ($style->getAlignment()->getTextRotation() >= 0) {
$textRotation = $style->getAlignment()->getTextRotation();
- } elseif ($style->getAlignment()->getTextRotation() < 0) {
+ } else {
$textRotation = 90 - $style->getAlignment()->getTextRotation();
}
- $objWriter->writeAttribute('textRotation', $textRotation);
+ $objWriter->writeAttribute('textRotation', (string) $textRotation);
}
$objWriter->endElement();
@@ -465,7 +490,7 @@ class Style extends WriterPart
$this->writeBorder($objWriter, $style->getBorders());
// protection
- if (($style->getProtection()->getLocked() !== null) || ($style->getProtection()->getHidden() !== null)) {
+ if ((!empty($style->getProtection()->getLocked())) || (!empty($style->getProtection()->getHidden()))) {
if (
$style->getProtection()->getLocked() !== Protection::PROTECTION_INHERIT ||
$style->getProtection()->getHidden() !== Protection::PROTECTION_INHERIT
@@ -503,11 +528,13 @@ class Style extends WriterPart
$objWriter->writeAttribute('style', $border->getBorderStyle());
// color
- $objWriter->startElement('color');
- $objWriter->writeAttribute('rgb', $border->getColor()->getARGB());
- $objWriter->endElement();
+ if ($border->getColor()->getARGB() !== null) {
+ $objWriter->startElement('color');
+ $objWriter->writeAttribute('rgb', $border->getColor()->getARGB());
+ $objWriter->endElement();
- $objWriter->endElement();
+ $objWriter->endElement();
+ }
}
}
@@ -516,15 +543,15 @@ class Style extends WriterPart
*
* @param int $id Number Format identifier
*/
- private function writeNumFmt(XMLWriter $objWriter, NumberFormat $numberFormat, $id = 0): void
+ private function writeNumFmt(XMLWriter $objWriter, ?NumberFormat $numberFormat, $id = 0): void
{
// Translate formatcode
- $formatCode = $numberFormat->getFormatCode();
+ $formatCode = ($numberFormat === null) ? null : $numberFormat->getFormatCode();
// numFmt
if ($formatCode !== null) {
$objWriter->startElement('numFmt');
- $objWriter->writeAttribute('numFmtId', ($id + 164));
+ $objWriter->writeAttribute('numFmtId', (string) ($id + 164));
$objWriter->writeAttribute('formatCode', $formatCode);
$objWriter->endElement();
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php
index f9d7197d7..7d08388da 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php
@@ -104,14 +104,14 @@ class Workbook extends WriterPart
// workbookView
$objWriter->startElement('workbookView');
- $objWriter->writeAttribute('activeTab', $spreadsheet->getActiveSheetIndex());
+ $objWriter->writeAttribute('activeTab', (string) $spreadsheet->getActiveSheetIndex());
$objWriter->writeAttribute('autoFilterDateGrouping', ($spreadsheet->getAutoFilterDateGrouping() ? 'true' : 'false'));
- $objWriter->writeAttribute('firstSheet', $spreadsheet->getFirstSheetIndex());
+ $objWriter->writeAttribute('firstSheet', (string) $spreadsheet->getFirstSheetIndex());
$objWriter->writeAttribute('minimized', ($spreadsheet->getMinimized() ? 'true' : 'false'));
$objWriter->writeAttribute('showHorizontalScroll', ($spreadsheet->getShowHorizontalScroll() ? 'true' : 'false'));
$objWriter->writeAttribute('showSheetTabs', ($spreadsheet->getShowSheetTabs() ? 'true' : 'false'));
$objWriter->writeAttribute('showVerticalScroll', ($spreadsheet->getShowVerticalScroll() ? 'true' : 'false'));
- $objWriter->writeAttribute('tabRatio', $spreadsheet->getTabRatio());
+ $objWriter->writeAttribute('tabRatio', (string) $spreadsheet->getTabRatio());
$objWriter->writeAttribute('visibility', $spreadsheet->getVisibility());
$objWriter->endElement();
@@ -157,9 +157,9 @@ class Workbook extends WriterPart
$objWriter->writeAttribute('calcId', '999999');
$objWriter->writeAttribute('calcMode', 'auto');
// fullCalcOnLoad isn't needed if we've recalculating for the save
- $objWriter->writeAttribute('calcCompleted', ($recalcRequired) ? 1 : 0);
- $objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? 0 : 1);
- $objWriter->writeAttribute('forceFullCalc', ($recalcRequired) ? 0 : 1);
+ $objWriter->writeAttribute('calcCompleted', ($recalcRequired) ? '1' : '0');
+ $objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? '0' : '1');
+ $objWriter->writeAttribute('forceFullCalc', ($recalcRequired) ? '0' : '1');
$objWriter->endElement();
}
@@ -200,7 +200,7 @@ class Workbook extends WriterPart
// Write sheet
$objWriter->startElement('sheet');
$objWriter->writeAttribute('name', $worksheetName);
- $objWriter->writeAttribute('sheetId', $worksheetId);
+ $objWriter->writeAttribute('sheetId', (string) $worksheetId);
if ($sheetState !== 'visible' && $sheetState != '') {
$objWriter->writeAttribute('state', $sheetState);
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
index f6c0c035c..1aa4f1ca3 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
@@ -28,7 +28,7 @@ class Worksheet extends WriterPart
*
* @return string XML Output
*/
- public function writeWorksheet(PhpspreadsheetWorksheet $worksheet, $stringTable = null, $includeCharts = false)
+ public function writeWorksheet(PhpspreadsheetWorksheet $worksheet, $stringTable = [], $includeCharts = false)
{
// Create XML writer
$objWriter = null;
@@ -149,7 +149,7 @@ class Worksheet extends WriterPart
}
$autoFilterRange = $worksheet->getAutoFilter()->getRange();
if (!empty($autoFilterRange)) {
- $objWriter->writeAttribute('filterMode', 1);
+ $objWriter->writeAttribute('filterMode', '1');
if (!$worksheet->getAutoFilter()->getEvaluated()) {
$worksheet->getAutoFilter()->showHideRows();
}
@@ -158,7 +158,7 @@ class Worksheet extends WriterPart
// tabColor
if ($worksheet->isTabColorSet()) {
$objWriter->startElement('tabColor');
- $objWriter->writeAttribute('rgb', $worksheet->getTabColor()->getARGB());
+ $objWriter->writeAttribute('rgb', $worksheet->getTabColor()->getARGB() ?? '');
$objWriter->endElement();
}
@@ -218,7 +218,7 @@ class Worksheet extends WriterPart
// Show zeros (Excel also writes this attribute only if set to false)
if ($worksheet->getSheetView()->getShowZeros() === false) {
- $objWriter->writeAttribute('showZeros', 0);
+ $objWriter->writeAttribute('showZeros', '0');
}
// View Layout Type
@@ -252,7 +252,7 @@ class Worksheet extends WriterPart
// Pane
$pane = '';
if ($worksheet->getFreezePane()) {
- [$xSplit, $ySplit] = Coordinate::coordinateFromString($worksheet->getFreezePane() ?? '');
+ [$xSplit, $ySplit] = Coordinate::coordinateFromString($worksheet->getFreezePane());
$xSplit = Coordinate::columnIndexFromString($xSplit);
--$xSplit;
--$ySplit;
@@ -261,7 +261,7 @@ class Worksheet extends WriterPart
$pane = 'topRight';
$objWriter->startElement('pane');
if ($xSplit > 0) {
- $objWriter->writeAttribute('xSplit', $xSplit);
+ $objWriter->writeAttribute('xSplit', "$xSplit");
}
if ($ySplit > 0) {
$objWriter->writeAttribute('ySplit', $ySplit);
@@ -334,7 +334,7 @@ class Worksheet extends WriterPart
$outlineLevelRow = $dimension->getOutlineLevel();
}
}
- $objWriter->writeAttribute('outlineLevelRow', (int) $outlineLevelRow);
+ $objWriter->writeAttribute('outlineLevelRow', (string) (int) $outlineLevelRow);
// Outline level - column
$outlineLevelCol = 0;
@@ -343,7 +343,7 @@ class Worksheet extends WriterPart
$outlineLevelCol = $dimension->getOutlineLevel();
}
}
- $objWriter->writeAttribute('outlineLevelCol', (int) $outlineLevelCol);
+ $objWriter->writeAttribute('outlineLevelCol', (string) (int) $outlineLevelCol);
$objWriter->endElement();
}
@@ -363,8 +363,8 @@ class Worksheet extends WriterPart
foreach ($worksheet->getColumnDimensions() as $colDimension) {
// col
$objWriter->startElement('col');
- $objWriter->writeAttribute('min', Coordinate::columnIndexFromString($colDimension->getColumnIndex()));
- $objWriter->writeAttribute('max', Coordinate::columnIndexFromString($colDimension->getColumnIndex()));
+ $objWriter->writeAttribute('min', (string) Coordinate::columnIndexFromString($colDimension->getColumnIndex()));
+ $objWriter->writeAttribute('max', (string) Coordinate::columnIndexFromString($colDimension->getColumnIndex()));
if ($colDimension->getWidth() < 0) {
// No width set, apply default of 10
@@ -396,11 +396,11 @@ class Worksheet extends WriterPart
// Outline level
if ($colDimension->getOutlineLevel() > 0) {
- $objWriter->writeAttribute('outlineLevel', $colDimension->getOutlineLevel());
+ $objWriter->writeAttribute('outlineLevel', (string) $colDimension->getOutlineLevel());
}
// Style
- $objWriter->writeAttribute('style', $colDimension->getXfIndex());
+ $objWriter->writeAttribute('style', (string) $colDimension->getXfIndex());
$objWriter->endElement();
}
@@ -423,7 +423,7 @@ class Worksheet extends WriterPart
$objWriter->writeAttribute('algorithmName', $protection->getAlgorithm());
$objWriter->writeAttribute('hashValue', $protection->getPassword());
$objWriter->writeAttribute('saltValue', $protection->getSalt());
- $objWriter->writeAttribute('spinCount', $protection->getSpinCount());
+ $objWriter->writeAttribute('spinCount', (string) $protection->getSpinCount());
} elseif ($protection->getPassword() !== '') {
$objWriter->writeAttribute('password', $protection->getPassword());
}
@@ -447,7 +447,7 @@ class Worksheet extends WriterPart
$objWriter->endElement();
}
- private static function writeAttributeIf(XMLWriter $objWriter, $condition, string $attr, string $val): void
+ private static function writeAttributeIf(XMLWriter $objWriter, ?bool $condition, string $attr, string $val): void
{
if ($condition) {
$objWriter->writeAttribute($attr, $val);
@@ -461,7 +461,7 @@ class Worksheet extends WriterPart
}
}
- private static function writeElementIf(XMLWriter $objWriter, $condition, string $attr, string $val): void
+ private static function writeElementIf(XMLWriter $objWriter, bool $condition, string $attr, string $val): void
{
if ($condition) {
$objWriter->writeElement($attr, $val);
@@ -503,7 +503,7 @@ class Worksheet extends WriterPart
private static function writeTimePeriodCondElements(XMLWriter $objWriter, Conditional $conditional, string $cellCoordinate): void
{
$txt = $conditional->getText();
- if ($txt !== null) {
+ if (!empty($txt)) {
$objWriter->writeAttribute('timePeriod', $txt);
if (empty($conditional->getConditions())) {
if ($conditional->getOperatorType() == Conditional::TIMEPERIOD_TODAY) {
@@ -536,7 +536,7 @@ class Worksheet extends WriterPart
private static function writeTextCondElements(XMLWriter $objWriter, Conditional $conditional, string $cellCoordinate): void
{
$txt = $conditional->getText();
- if ($txt !== null) {
+ if (!empty($txt)) {
$objWriter->writeAttribute('text', $txt);
if (empty($conditional->getConditions())) {
if ($conditional->getOperatorType() == Conditional::OPERATOR_CONTAINSTEXT) {
@@ -568,7 +568,7 @@ class Worksheet extends WriterPart
$objWriter->writeAttribute($attrKey, $val);
}
$minCfvo = $dataBar->getMinimumConditionalFormatValueObject();
- if ($minCfvo) {
+ if ($minCfvo !== null) {
$objWriter->startElementNs($prefix, 'cfvo', null);
$objWriter->writeAttribute('type', $minCfvo->getType());
if ($minCfvo->getCellFormula()) {
@@ -578,7 +578,7 @@ class Worksheet extends WriterPart
}
$maxCfvo = $dataBar->getMaximumConditionalFormatValueObject();
- if ($maxCfvo) {
+ if ($maxCfvo !== null) {
$objWriter->startElementNs($prefix, 'cfvo', null);
$objWriter->writeAttribute('type', $maxCfvo->getType());
if ($maxCfvo->getCellFormula()) {
@@ -600,9 +600,8 @@ class Worksheet extends WriterPart
$objWriter->endElement(); //end conditionalFormatting
}
- private static function writeDataBarElements(XMLWriter $objWriter, $dataBar): void
+ private static function writeDataBarElements(XMLWriter $objWriter, ?ConditionalDataBar $dataBar): void
{
- /** @var ConditionalDataBar $dataBar */
if ($dataBar) {
$objWriter->startElement('dataBar');
self::writeAttributeIf($objWriter, null !== $dataBar->getShowValue(), 'showValue', $dataBar->getShowValue() ? '1' : '0');
@@ -669,7 +668,7 @@ class Worksheet extends WriterPart
'dxfId',
(string) $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode())
);
- $objWriter->writeAttribute('priority', $id++);
+ $objWriter->writeAttribute('priority', (string) $id++);
self::writeAttributeif(
$objWriter,
@@ -724,7 +723,7 @@ class Worksheet extends WriterPart
if (!empty($dataValidationCollection)) {
$dataValidationCollection = Coordinate::mergeRangesInCollection($dataValidationCollection);
$objWriter->startElement('dataValidations');
- $objWriter->writeAttribute('count', count($dataValidationCollection));
+ $objWriter->writeAttribute('count', (string) count($dataValidationCollection));
foreach ($dataValidationCollection as $coordinate => $dv) {
$objWriter->startElement('dataValidation');
@@ -922,11 +921,11 @@ class Worksheet extends WriterPart
$rules = $column->getRules();
if (count($rules) > 0) {
$objWriter->startElement('filterColumn');
- $objWriter->writeAttribute('colId', $worksheet->getAutoFilter()->getColumnOffset($columnID));
+ $objWriter->writeAttribute('colId', (string) $worksheet->getAutoFilter()->getColumnOffset($columnID));
$objWriter->startElement($column->getFilterType());
if ($column->getJoin() == Column::AUTOFILTER_COLUMN_JOIN_AND) {
- $objWriter->writeAttribute('and', 1);
+ $objWriter->writeAttribute('and', '1');
}
foreach ($rules as $rule) {
@@ -936,7 +935,7 @@ class Worksheet extends WriterPart
($rule->getValue() === '')
) {
// Filter rule for Blanks
- $objWriter->writeAttribute('blank', 1);
+ $objWriter->writeAttribute('blank', '1');
} elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {
// Dynamic Filter Rule
$objWriter->writeAttribute('type', $rule->getGrouping());
@@ -1019,24 +1018,24 @@ class Worksheet extends WriterPart
{
// pageSetup
$objWriter->startElement('pageSetup');
- $objWriter->writeAttribute('paperSize', $worksheet->getPageSetup()->getPaperSize());
+ $objWriter->writeAttribute('paperSize', (string) $worksheet->getPageSetup()->getPaperSize());
$objWriter->writeAttribute('orientation', $worksheet->getPageSetup()->getOrientation());
if ($worksheet->getPageSetup()->getScale() !== null) {
- $objWriter->writeAttribute('scale', $worksheet->getPageSetup()->getScale());
+ $objWriter->writeAttribute('scale', (string) $worksheet->getPageSetup()->getScale());
}
if ($worksheet->getPageSetup()->getFitToHeight() !== null) {
- $objWriter->writeAttribute('fitToHeight', $worksheet->getPageSetup()->getFitToHeight());
+ $objWriter->writeAttribute('fitToHeight', (string) $worksheet->getPageSetup()->getFitToHeight());
} else {
$objWriter->writeAttribute('fitToHeight', '0');
}
if ($worksheet->getPageSetup()->getFitToWidth() !== null) {
- $objWriter->writeAttribute('fitToWidth', $worksheet->getPageSetup()->getFitToWidth());
+ $objWriter->writeAttribute('fitToWidth', (string) $worksheet->getPageSetup()->getFitToWidth());
} else {
$objWriter->writeAttribute('fitToWidth', '0');
}
- if ($worksheet->getPageSetup()->getFirstPageNumber() !== null) {
- $objWriter->writeAttribute('firstPageNumber', $worksheet->getPageSetup()->getFirstPageNumber());
+ if (!empty($worksheet->getPageSetup()->getFirstPageNumber())) {
+ $objWriter->writeAttribute('firstPageNumber', (string) $worksheet->getPageSetup()->getFirstPageNumber());
$objWriter->writeAttribute('useFirstPageNumber', '1');
}
$objWriter->writeAttribute('pageOrder', $worksheet->getPageSetup()->getPageOrder());
@@ -1089,8 +1088,8 @@ class Worksheet extends WriterPart
// rowBreaks
if (!empty($aRowBreaks)) {
$objWriter->startElement('rowBreaks');
- $objWriter->writeAttribute('count', count($aRowBreaks));
- $objWriter->writeAttribute('manualBreakCount', count($aRowBreaks));
+ $objWriter->writeAttribute('count', (string) count($aRowBreaks));
+ $objWriter->writeAttribute('manualBreakCount', (string) count($aRowBreaks));
foreach ($aRowBreaks as $cell) {
$coords = Coordinate::coordinateFromString($cell);
@@ -1107,14 +1106,14 @@ class Worksheet extends WriterPart
// Second, write column breaks
if (!empty($aColumnBreaks)) {
$objWriter->startElement('colBreaks');
- $objWriter->writeAttribute('count', count($aColumnBreaks));
- $objWriter->writeAttribute('manualBreakCount', count($aColumnBreaks));
+ $objWriter->writeAttribute('count', (string) count($aColumnBreaks));
+ $objWriter->writeAttribute('manualBreakCount', (string) count($aColumnBreaks));
foreach ($aColumnBreaks as $cell) {
$coords = Coordinate::coordinateFromString($cell);
$objWriter->startElement('brk');
- $objWriter->writeAttribute('id', Coordinate::columnIndexFromString($coords[0]) - 1);
+ $objWriter->writeAttribute('id', (string) (Coordinate::columnIndexFromString($coords[0]) - 1));
$objWriter->writeAttribute('man', '1');
$objWriter->endElement();
}
@@ -1155,58 +1154,61 @@ class Worksheet extends WriterPart
$currentRow = 0;
while ($currentRow++ < $highestRow) {
- // Get row dimension
- $rowDimension = $worksheet->getRowDimension($currentRow);
+ $isRowSet = isset($cellsByRow[$currentRow]);
+ if ($isRowSet || $worksheet->rowDimensionExists($currentRow)) {
+ // Get row dimension
+ $rowDimension = $worksheet->getRowDimension($currentRow);
- // Write current row?
- $writeCurrentRow = isset($cellsByRow[$currentRow]) || $rowDimension->getRowHeight() >= 0 || $rowDimension->getVisible() === false || $rowDimension->getCollapsed() === true || $rowDimension->getOutlineLevel() > 0 || $rowDimension->getXfIndex() !== null;
+ // Write current row?
+ $writeCurrentRow = $isRowSet || $rowDimension->getRowHeight() >= 0 || $rowDimension->getVisible() === false || $rowDimension->getCollapsed() === true || $rowDimension->getOutlineLevel() > 0 || $rowDimension->getXfIndex() !== null;
- if ($writeCurrentRow) {
- // Start a new row
- $objWriter->startElement('row');
- $objWriter->writeAttribute('r', $currentRow);
- $objWriter->writeAttribute('spans', '1:' . $colCount);
+ if ($writeCurrentRow) {
+ // Start a new row
+ $objWriter->startElement('row');
+ $objWriter->writeAttribute('r', "$currentRow");
+ $objWriter->writeAttribute('spans', '1:' . $colCount);
- // Row dimensions
- if ($rowDimension->getRowHeight() >= 0) {
- $objWriter->writeAttribute('customHeight', '1');
- $objWriter->writeAttribute('ht', StringHelper::formatNumber($rowDimension->getRowHeight()));
- }
-
- // Row visibility
- if (!$rowDimension->getVisible() === true) {
- $objWriter->writeAttribute('hidden', 'true');
- }
-
- // Collapsed
- if ($rowDimension->getCollapsed() === true) {
- $objWriter->writeAttribute('collapsed', 'true');
- }
-
- // Outline level
- if ($rowDimension->getOutlineLevel() > 0) {
- $objWriter->writeAttribute('outlineLevel', $rowDimension->getOutlineLevel());
- }
-
- // Style
- if ($rowDimension->getXfIndex() !== null) {
- $objWriter->writeAttribute('s', $rowDimension->getXfIndex());
- $objWriter->writeAttribute('customFormat', '1');
- }
-
- // Write cells
- if (isset($cellsByRow[$currentRow])) {
- // We have a comma-separated list of column names (with a trailing entry); split to an array
- $columnsInRow = explode(',', $cellsByRow[$currentRow]);
- array_pop($columnsInRow);
- foreach ($columnsInRow as $column) {
- // Write cell
- $this->writeCell($objWriter, $worksheet, "{$column}{$currentRow}", $aFlippedStringTable);
+ // Row dimensions
+ if ($rowDimension->getRowHeight() >= 0) {
+ $objWriter->writeAttribute('customHeight', '1');
+ $objWriter->writeAttribute('ht', StringHelper::formatNumber($rowDimension->getRowHeight()));
}
- }
- // End row
- $objWriter->endElement();
+ // Row visibility
+ if (!$rowDimension->getVisible() === true) {
+ $objWriter->writeAttribute('hidden', 'true');
+ }
+
+ // Collapsed
+ if ($rowDimension->getCollapsed() === true) {
+ $objWriter->writeAttribute('collapsed', 'true');
+ }
+
+ // Outline level
+ if ($rowDimension->getOutlineLevel() > 0) {
+ $objWriter->writeAttribute('outlineLevel', (string) $rowDimension->getOutlineLevel());
+ }
+
+ // Style
+ if ($rowDimension->getXfIndex() !== null) {
+ $objWriter->writeAttribute('s', (string) $rowDimension->getXfIndex());
+ $objWriter->writeAttribute('customFormat', '1');
+ }
+
+ // Write cells
+ if (isset($cellsByRow[$currentRow])) {
+ // We have a comma-separated list of column names (with a trailing entry); split to an array
+ $columnsInRow = explode(',', $cellsByRow[$currentRow]);
+ array_pop($columnsInRow);
+ foreach ($columnsInRow as $column) {
+ // Write cell
+ $this->writeCell($objWriter, $worksheet, "{$column}{$currentRow}", $aFlippedStringTable);
+ }
+ }
+
+ // End row
+ $objWriter->endElement();
+ }
}
}
@@ -1226,7 +1228,7 @@ class Worksheet extends WriterPart
StringHelper::controlCharacterPHP2OOXML(htmlspecialchars($cellValue, Settings::htmlEntityFlags()))
);
$objWriter->endElement();
- } elseif ($cellValue instanceof RichText) {
+ } else {
$objWriter->startElement('is');
$this->getParentWriter()->getWriterPartstringtable()->writeRichText($objWriter, $cellValue);
$objWriter->endElement();
@@ -1260,7 +1262,7 @@ class Worksheet extends WriterPart
$cellValue = $cellValue . '.0';
}
}
- $objWriter->writeElement('v', $cellValue);
+ $objWriter->writeElement('v', "$cellValue");
}
private function writeCellBoolean(XMLWriter $objWriter, string $mappedType, bool $cellValue): void
@@ -1329,7 +1331,7 @@ class Worksheet extends WriterPart
// Sheet styles
$xfi = $pCell->getXfIndex();
- self::writeAttributeIf($objWriter, $xfi, 's', $xfi);
+ self::writeAttributeIf($objWriter, (bool) $xfi, 's', "$xfi");
// If cell value is supplied, write cell value
$cellValue = $pCell->getValue();
@@ -1446,7 +1448,6 @@ class Worksheet extends WriterPart
/** @var Conditional $conditional */
foreach ($conditionalStyles as $conditional) {
$dataBar = $conditional->getDataBar();
- // @phpstan-ignore-next-line
if ($dataBar && $dataBar->getConditionalFormattingRuleExt()) {
$conditionalFormattingRuleExtList[] = $dataBar->getConditionalFormattingRuleExt();
}
diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php
index 6fc0c66a5..a1bdf96a5 100644
--- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php
+++ b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php
@@ -144,6 +144,9 @@ class Xlfn
. '|call'
. '|let'
. '|register[.]id'
+ . '|textafter'
+ . '|textbefore'
+ . '|textsplit'
. '|valuetotext'
. ')(?=\\s*[(])/i';
diff --git a/vendor/psr/cache/CHANGELOG.md b/vendor/psr/cache/CHANGELOG.md
deleted file mode 100644
index 58ddab05a..000000000
--- a/vendor/psr/cache/CHANGELOG.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file, in reverse chronological order by release.
-
-## 1.0.1 - 2016-08-06
-
-### Fixed
-
-- Make spacing consistent in phpdoc annotations php-fig/cache#9 - chalasr
-- Fix grammar in phpdoc annotations php-fig/cache#10 - chalasr
-- Be more specific in docblocks that `getItems()` and `deleteItems()` take an array of strings (`string[]`) compared to just `array` php-fig/cache#8 - GrahamCampbell
-- For `expiresAt()` and `expiresAfter()` in CacheItemInterface fix docblock to specify null as a valid parameters as well as an implementation of DateTimeInterface php-fig/cache#7 - GrahamCampbell
-
-## 1.0.0 - 2015-12-11
-
-Initial stable release; reflects accepted PSR-6 specification
diff --git a/vendor/psr/cache/LICENSE.txt b/vendor/psr/cache/LICENSE.txt
deleted file mode 100644
index b1c2c97b9..000000000
--- a/vendor/psr/cache/LICENSE.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 PHP Framework Interoperability Group
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/vendor/psr/cache/README.md b/vendor/psr/cache/README.md
deleted file mode 100644
index c8706ceea..000000000
--- a/vendor/psr/cache/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-PSR Cache
-=========
-
-This repository holds all interfaces defined by
-[PSR-6](http://www.php-fig.org/psr/psr-6/).
-
-Note that this is not a Cache implementation of its own. It is merely an
-interface that describes a Cache implementation. See the specification for more
-details.
diff --git a/vendor/psr/cache/composer.json b/vendor/psr/cache/composer.json
deleted file mode 100644
index e828fec94..000000000
--- a/vendor/psr/cache/composer.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "psr/cache",
- "description": "Common interface for caching libraries",
- "keywords": ["psr", "psr-6", "cache"],
- "license": "MIT",
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "require": {
- "php": ">=5.3.0"
- },
- "autoload": {
- "psr-4": {
- "Psr\\Cache\\": "src/"
- }
- },
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- }
-}
diff --git a/vendor/psr/cache/src/CacheException.php b/vendor/psr/cache/src/CacheException.php
deleted file mode 100644
index e27f22f8d..000000000
--- a/vendor/psr/cache/src/CacheException.php
+++ /dev/null
@@ -1,10 +0,0 @@
- 'think\\app\\Service',
diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php
index 693749f22..bce5c4a84 100644
--- a/vendor/symfony/polyfill-mbstring/Mbstring.php
+++ b/vendor/symfony/polyfill-mbstring/Mbstring.php
@@ -80,7 +80,7 @@ final class Mbstring
public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
{
- if (\is_array($fromEncoding) || ($fromEncoding !== null && false !== strpos($fromEncoding, ','))) {
+ if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {
$fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
} else {
$fromEncoding = self::getEncoding($fromEncoding);
@@ -102,7 +102,7 @@ final class Mbstring
$fromEncoding = 'Windows-1252';
}
if ('UTF-8' !== $fromEncoding) {
- $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s);
+ $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
}
return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s);
@@ -113,7 +113,7 @@ final class Mbstring
$fromEncoding = 'UTF-8';
}
- return \iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
+ return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
}
public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)
@@ -130,7 +130,7 @@ final class Mbstring
public static function mb_decode_mimeheader($s)
{
- return \iconv_mime_decode($s, 2, self::$internalEncoding);
+ return iconv_mime_decode($s, 2, self::$internalEncoding);
}
public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
@@ -140,7 +140,7 @@ final class Mbstring
public static function mb_decode_numericentity($s, $convmap, $encoding = null)
{
- if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
+ if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);
return null;
@@ -150,7 +150,7 @@ final class Mbstring
return false;
}
- if (null !== $encoding && !is_scalar($encoding)) {
+ if (null !== $encoding && !\is_scalar($encoding)) {
trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);
return ''; // Instead of null (cf. mb_encode_numericentity).
@@ -166,10 +166,10 @@ final class Mbstring
if ('UTF-8' === $encoding) {
$encoding = null;
if (!preg_match('//u', $s)) {
- $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
}
} else {
- $s = \iconv($encoding, 'UTF-8//IGNORE', $s);
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
}
$cnt = floor(\count($convmap) / 4) * 4;
@@ -195,12 +195,12 @@ final class Mbstring
return $s;
}
- return \iconv('UTF-8', $encoding.'//IGNORE', $s);
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
}
public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
{
- if (null !== $s && !is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
+ if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) {
trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING);
return null;
@@ -210,13 +210,13 @@ final class Mbstring
return false;
}
- if (null !== $encoding && !is_scalar($encoding)) {
+ if (null !== $encoding && !\is_scalar($encoding)) {
trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING);
return null; // Instead of '' (cf. mb_decode_numericentity).
}
- if (null !== $is_hex && !is_scalar($is_hex)) {
+ if (null !== $is_hex && !\is_scalar($is_hex)) {
trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING);
return null;
@@ -232,10 +232,10 @@ final class Mbstring
if ('UTF-8' === $encoding) {
$encoding = null;
if (!preg_match('//u', $s)) {
- $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
}
} else {
- $s = \iconv($encoding, 'UTF-8//IGNORE', $s);
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
}
static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4];
@@ -265,7 +265,7 @@ final class Mbstring
return $result;
}
- return \iconv('UTF-8', $encoding.'//IGNORE', $result);
+ return iconv('UTF-8', $encoding.'//IGNORE', $result);
}
public static function mb_convert_case($s, $mode, $encoding = null)
@@ -280,10 +280,10 @@ final class Mbstring
if ('UTF-8' === $encoding) {
$encoding = null;
if (!preg_match('//u', $s)) {
- $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s);
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
}
} else {
- $s = \iconv($encoding, 'UTF-8//IGNORE', $s);
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
}
if (\MB_CASE_TITLE == $mode) {
@@ -343,7 +343,7 @@ final class Mbstring
return $s;
}
- return \iconv('UTF-8', $encoding.'//IGNORE', $s);
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
}
public static function mb_internal_encoding($encoding = null)
@@ -354,7 +354,7 @@ final class Mbstring
$normalizedEncoding = self::getEncoding($encoding);
- if ('UTF-8' === $normalizedEncoding || false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) {
+ if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) {
self::$internalEncoding = $normalizedEncoding;
return true;
@@ -413,7 +413,7 @@ final class Mbstring
$encoding = self::$internalEncoding;
}
- return self::mb_detect_encoding($var, [$encoding]) || false !== @\iconv($encoding, $encoding, $var);
+ return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var);
}
public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
@@ -488,7 +488,7 @@ final class Mbstring
return \strlen($s);
}
- return @\iconv_strlen($s, $encoding);
+ return @iconv_strlen($s, $encoding);
}
public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
@@ -509,7 +509,7 @@ final class Mbstring
return 0;
}
- return \iconv_strpos($haystack, $needle, $offset, $encoding);
+ return iconv_strpos($haystack, $needle, $offset, $encoding);
}
public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
@@ -533,7 +533,7 @@ final class Mbstring
}
$pos = '' !== $needle || 80000 > \PHP_VERSION_ID
- ? \iconv_strrpos($haystack, $needle, $encoding)
+ ? iconv_strrpos($haystack, $needle, $encoding)
: self::mb_strlen($haystack, $encoding);
return false !== $pos ? $offset + $pos : false;
@@ -541,7 +541,7 @@ final class Mbstring
public static function mb_str_split($string, $split_length = 1, $encoding = null)
{
- if (null !== $string && !is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) {
+ if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) {
trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING);
return null;
@@ -550,6 +550,7 @@ final class Mbstring
if (1 > $split_length = (int) $split_length) {
if (80000 > \PHP_VERSION_ID) {
trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING);
+
return false;
}
@@ -617,7 +618,7 @@ final class Mbstring
}
if ($start < 0) {
- $start = \iconv_strlen($s, $encoding) + $start;
+ $start = iconv_strlen($s, $encoding) + $start;
if ($start < 0) {
$start = 0;
}
@@ -626,13 +627,13 @@ final class Mbstring
if (null === $length) {
$length = 2147483647;
} elseif ($length < 0) {
- $length = \iconv_strlen($s, $encoding) + $length - $start;
+ $length = iconv_strlen($s, $encoding) + $length - $start;
if ($length < 0) {
return '';
}
}
- return (string) \iconv_substr($s, $start, $length, $encoding);
+ return (string) iconv_substr($s, $start, $length, $encoding);
}
public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
@@ -657,7 +658,7 @@ final class Mbstring
$pos = strrpos($haystack, $needle);
} else {
$needle = self::mb_substr($needle, 0, 1, $encoding);
- $pos = \iconv_strrpos($haystack, $needle, $encoding);
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
}
return self::getSubpart($pos, $part, $haystack, $encoding);
@@ -736,12 +737,12 @@ final class Mbstring
$encoding = self::getEncoding($encoding);
if ('UTF-8' !== $encoding) {
- $s = \iconv($encoding, 'UTF-8//IGNORE', $s);
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
}
$s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
- return ($wide << 1) + \iconv_strlen($s, 'UTF-8');
+ return ($wide << 1) + iconv_strlen($s, 'UTF-8');
}
public static function mb_substr_count($haystack, $needle, $encoding = null)
diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json
index 9cd2e924e..44895536b 100644
--- a/vendor/symfony/polyfill-mbstring/composer.json
+++ b/vendor/symfony/polyfill-mbstring/composer.json
@@ -31,7 +31,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php
index 5e20d5bf8..7bf96c996 100644
--- a/vendor/symfony/polyfill-php72/Php72.php
+++ b/vendor/symfony/polyfill-php72/Php72.php
@@ -83,7 +83,7 @@ final class Php72
'SunOS' => 'Solaris',
];
- return isset($map[\PHP_OS]) ? $map[\PHP_OS] : 'Unknown';
+ return $map[\PHP_OS] ?? 'Unknown';
}
public static function spl_object_id($object)
@@ -96,7 +96,7 @@ final class Php72
}
// On 32-bit systems, PHP_INT_SIZE is 4,
- return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1)));
+ return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1));
}
public static function sapi_windows_vt100_support($stream, $enable = null)
@@ -167,7 +167,7 @@ final class Php72
self::$hashMask = (int) substr(ob_get_clean(), 17);
}
- self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1)));
+ self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1));
}
public static function mb_chr($code, $encoding = null)
diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json
index 4eac690e0..5f17af343 100644
--- a/vendor/symfony/polyfill-php72/composer.json
+++ b/vendor/symfony/polyfill-php72/composer.json
@@ -25,7 +25,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php
index 7ea6d2772..2b955423f 100644
--- a/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php
+++ b/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php
@@ -1,5 +1,14 @@
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
#[Attribute(Attribute::TARGET_CLASS)]
final class Attribute
{
diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php
index 72f10812b..bd1212f6e 100644
--- a/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php
+++ b/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php
@@ -1,6 +1,15 @@
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) {
class PhpToken extends Symfony\Polyfill\Php80\PhpToken
{
}
diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php
index 77e037cb5..7c62d7508 100644
--- a/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php
+++ b/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php
@@ -1,5 +1,14 @@
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
if (\PHP_VERSION_ID < 80000) {
interface Stringable
{
diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php
index 37937cbfa..01c6c6c8a 100644
--- a/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php
+++ b/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php
@@ -1,5 +1,14 @@
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
if (\PHP_VERSION_ID < 80000) {
class UnhandledMatchError extends Error
{
diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php b/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php
index a3a9b88b0..783dbc28c 100644
--- a/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php
+++ b/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php
@@ -1,5 +1,14 @@
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
if (\PHP_VERSION_ID < 80000) {
class ValueError extends Error
{
diff --git a/vendor/symfony/polyfill-php80/composer.json b/vendor/symfony/polyfill-php80/composer.json
index cd3e9b65f..bd9a3262a 100644
--- a/vendor/symfony/polyfill-php80/composer.json
+++ b/vendor/symfony/polyfill-php80/composer.json
@@ -30,7 +30,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-main": "1.26-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
diff --git a/vendor/symfony/var-dumper/Resources/bin/var-dump-server b/vendor/symfony/var-dumper/Resources/bin/var-dump-server
index 98c813a06..f398fcef7 100755
--- a/vendor/symfony/var-dumper/Resources/bin/var-dump-server
+++ b/vendor/symfony/var-dumper/Resources/bin/var-dump-server
@@ -10,6 +10,10 @@
* file that was distributed with this source code.
*/
+if ('cli' !== PHP_SAPI) {
+ throw new Exception('This script must be run from the command line.');
+}
+
/**
* Starts a dump server to collect and output dumps on a single place with multiple formats support.
*
diff --git a/vendor/topthink/framework/README.md b/vendor/topthink/framework/README.md
index aa16486e7..08893cd4f 100644
--- a/vendor/topthink/framework/README.md
+++ b/vendor/topthink/framework/README.md
@@ -1,6 +1,6 @@

-ThinkPHP 6.0
+ThinkPHP 6.1
===============
[](https://travis-ci.org/top-think/framework)
@@ -11,9 +11,8 @@ ThinkPHP 6.0
[](http://www.php.net/)
[](https://packagist.org/packages/topthink/framework)
-ThinkPHP6.0底层架构采用PHP7.1改写和进一步优化。
-[官方应用服务市场](https://market.topthink.com) | [`ThinkAPI`——官方统一API服务](https://docs.topthink.com/think-api/)
+[官方服务](https://www.topthink.com) | [`ThinkAPI`——官方统一API](https://doc.topthink.com/think-api)
## 主要新特性
@@ -35,7 +34,7 @@ ThinkPHP6.0底层架构采用PHP7.1改写和进一步优化。
* 统一和精简大量用法
-> ThinkPHP6.0的运行环境要求PHP7.2+,兼容PHP8.1
+> ThinkPHP6.1的运行环境要求PHP7.2.5+,兼容PHP8.1
## 安装
diff --git a/vendor/topthink/framework/composer.json b/vendor/topthink/framework/composer.json
index 90793d3f1..b5cd915b7 100644
--- a/vendor/topthink/framework/composer.json
+++ b/vendor/topthink/framework/composer.json
@@ -22,8 +22,6 @@
"php": ">=7.2.5",
"ext-json": "*",
"ext-mbstring": "*",
- "league/flysystem": "^1.1.4",
- "league/flysystem-cached-adapter": "^1.0",
"psr/log": "~1.0",
"psr/container": "~1.0",
"psr/simple-cache": "^1.0",
diff --git a/vendor/topthink/framework/src/think/App.php b/vendor/topthink/framework/src/think/App.php
index b189cd954..c7453b6a3 100644
--- a/vendor/topthink/framework/src/think/App.php
+++ b/vendor/topthink/framework/src/think/App.php
@@ -39,7 +39,7 @@ use think\initializer\RegisterService;
*/
class App extends Container
{
- const VERSION = '6.0.13LTS';
+ const VERSION = '6.1.0';
/**
* 应用调试模式
@@ -152,7 +152,6 @@ class App extends Container
'session' => Session::class,
'validate' => Validate::class,
'view' => View::class,
- 'filesystem' => Filesystem::class,
'think\DbManager' => Db::class,
'think\LogManager' => Log::class,
'think\CacheManager' => Cache::class,
diff --git a/vendor/topthink/framework/src/think/Console.php b/vendor/topthink/framework/src/think/Console.php
index 389d104d5..27f12baad 100644
--- a/vendor/topthink/framework/src/think/Console.php
+++ b/vendor/topthink/framework/src/think/Console.php
@@ -117,9 +117,9 @@ class Console
*/
protected function makeRequest()
{
- $uri = $this->app->config->get('app.url', 'http://localhost');
+ $url = $this->app->config->get('app.url', 'http://localhost');
- $components = parse_url($uri);
+ $components = parse_url($url);
$server = $_SERVER;
@@ -127,6 +127,7 @@ class Console
$server = array_merge($server, [
'SCRIPT_FILENAME' => $components['path'],
'SCRIPT_NAME' => $components['path'],
+ 'REQUEST_URI' => $components['path'],
]);
}
@@ -150,8 +151,6 @@ class Console
$server['HTTP_HOST'] .= ':' . $components['port'];
}
- $server['REQUEST_URI'] = $uri;
-
/** @var Request $request */
$request = $this->app->make('request');
diff --git a/vendor/topthink/framework/src/think/Filesystem.php b/vendor/topthink/framework/src/think/Filesystem.php
deleted file mode 100644
index 0aee929f5..000000000
--- a/vendor/topthink/framework/src/think/Filesystem.php
+++ /dev/null
@@ -1,89 +0,0 @@
-
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think;
-
-use InvalidArgumentException;
-use think\filesystem\Driver;
-use think\filesystem\driver\Local;
-use think\helper\Arr;
-
-/**
- * Class Filesystem
- * @package think
- * @mixin Driver
- * @mixin Local
- */
-class Filesystem extends Manager
-{
- protected $namespace = '\\think\\filesystem\\driver\\';
-
- /**
- * @param null|string $name
- * @return Driver
- */
- public function disk(string $name = null): Driver
- {
- return $this->driver($name);
- }
-
- protected function resolveType(string $name)
- {
- return $this->getDiskConfig($name, 'type', 'local');
- }
-
- protected function resolveConfig(string $name)
- {
- return $this->getDiskConfig($name);
- }
-
- /**
- * 获取缓存配置
- * @access public
- * @param null|string $name 名称
- * @param mixed $default 默认值
- * @return mixed
- */
- public function getConfig(string $name = null, $default = null)
- {
- if (!is_null($name)) {
- return $this->app->config->get('filesystem.' . $name, $default);
- }
-
- return $this->app->config->get('filesystem');
- }
-
- /**
- * 获取磁盘配置
- * @param string $disk
- * @param null $name
- * @param null $default
- * @return array
- */
- public function getDiskConfig($disk, $name = null, $default = null)
- {
- if ($config = $this->getConfig("disks.{$disk}")) {
- return Arr::get($config, $name, $default);
- }
-
- throw new InvalidArgumentException("Disk [$disk] not found.");
- }
-
- /**
- * 默认驱动
- * @return string|null
- */
- public function getDefaultDriver()
- {
- return $this->getConfig('default');
- }
-}
diff --git a/vendor/topthink/framework/src/think/Lang.php b/vendor/topthink/framework/src/think/Lang.php
index 5f16c464b..b89108482 100644
--- a/vendor/topthink/framework/src/think/Lang.php
+++ b/vendor/topthink/framework/src/think/Lang.php
@@ -287,58 +287,4 @@ class Lang
return $value;
}
- /**
- * 自动侦测设置获取语言选择
- * @deprecated
- * @access public
- * @param Request $request
- * @return string
- */
- public function detect(Request $request): string
- {
- // 自动侦测设置获取语言选择
- $langSet = '';
-
- if ($request->get($this->config['detect_var'])) {
- // url中设置了语言变量
- $langSet = strtolower($request->get($this->config['detect_var']));
- } elseif ($request->header($this->config['header_var'])) {
- // Header中设置了语言变量
- $langSet = strtolower($request->header($this->config['header_var']));
- } elseif ($request->cookie($this->config['cookie_var'])) {
- // Cookie中设置了语言变量
- $langSet = strtolower($request->cookie($this->config['cookie_var']));
- } elseif ($request->server('HTTP_ACCEPT_LANGUAGE')) {
- // 自动侦测浏览器语言
- $match = preg_match('/^([a-z\d\-]+)/i', $request->server('HTTP_ACCEPT_LANGUAGE'), $matches);
- if ($match) {
- $langSet = strtolower($matches[1]);
- if (isset($this->config['accept_language'][$langSet])) {
- $langSet = $this->config['accept_language'][$langSet];
- }
- }
- }
-
- if (empty($this->config['allow_lang_list']) || in_array($langSet, $this->config['allow_lang_list'])) {
- // 合法的语言
- $this->range = $langSet;
- }
-
- return $this->range;
- }
-
- /**
- * 保存当前语言到Cookie
- * @deprecated
- * @access public
- * @param Cookie $cookie Cookie对象
- * @return void
- */
- public function saveToCookie(Cookie $cookie)
- {
- if ($this->config['use_cookie']) {
- $cookie->set($this->config['cookie_var'], $this->range);
- }
- }
-
}
diff --git a/vendor/topthink/framework/src/think/facade/Filesystem.php b/vendor/topthink/framework/src/think/facade/Filesystem.php
deleted file mode 100644
index 53706a841..000000000
--- a/vendor/topthink/framework/src/think/facade/Filesystem.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\facade;
-
-use think\Facade;
-use think\filesystem\Driver;
-
-/**
- * Class Filesystem
- * @package think\facade
- * @mixin \think\Filesystem
- * @method static Driver disk(string $name = null) ,null|string
- * @method static mixed getConfig(null|string $name = null, mixed $default = null) 获取缓存配置
- * @method static array getDiskConfig(string $disk, null $name = null, null $default = null) 获取磁盘配置
- * @method static string|null getDefaultDriver() 默认驱动
- */
-class Filesystem extends Facade
-{
- protected static function getFacadeClass()
- {
- return 'filesystem';
- }
-}
diff --git a/vendor/topthink/framework/src/think/filesystem/CacheStore.php b/vendor/topthink/framework/src/think/filesystem/CacheStore.php
deleted file mode 100644
index 0a62399e0..000000000
--- a/vendor/topthink/framework/src/think/filesystem/CacheStore.php
+++ /dev/null
@@ -1,54 +0,0 @@
-
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\filesystem;
-
-use League\Flysystem\Cached\Storage\AbstractCache;
-use Psr\SimpleCache\CacheInterface;
-
-class CacheStore extends AbstractCache
-{
- protected $store;
-
- protected $key;
-
- protected $expire;
-
- public function __construct(CacheInterface $store, $key = 'flysystem', $expire = null)
- {
- $this->key = $key;
- $this->store = $store;
- $this->expire = $expire;
- }
-
- /**
- * Store the cache.
- */
- public function save()
- {
- $contents = $this->getForStorage();
-
- $this->store->set($this->key, $contents, $this->expire);
- }
-
- /**
- * Load the cache.
- */
- public function load()
- {
- $contents = $this->store->get($this->key);
-
- if (!is_null($contents)) {
- $this->setFromStorage($contents);
- }
- }
-}
diff --git a/vendor/topthink/framework/src/think/filesystem/Driver.php b/vendor/topthink/framework/src/think/filesystem/Driver.php
deleted file mode 100644
index 0e61cf439..000000000
--- a/vendor/topthink/framework/src/think/filesystem/Driver.php
+++ /dev/null
@@ -1,144 +0,0 @@
-
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\filesystem;
-
-use League\Flysystem\AdapterInterface;
-use League\Flysystem\Adapter\AbstractAdapter;
-use League\Flysystem\Cached\CachedAdapter;
-use League\Flysystem\Cached\Storage\Memory as MemoryStore;
-use League\Flysystem\Filesystem;
-use RuntimeException;
-use think\Cache;
-use think\File;
-
-/**
- * Class Driver
- * @package think\filesystem
- * @mixin Filesystem
- */
-abstract class Driver
-{
-
- /** @var Cache */
- protected $cache;
-
- /** @var Filesystem */
- protected $filesystem;
-
- /**
- * 配置参数
- * @var array
- */
- protected $config = [];
-
- public function __construct(Cache $cache, array $config)
- {
- $this->cache = $cache;
- $this->config = array_merge($this->config, $config);
-
- $adapter = $this->createAdapter();
- $this->filesystem = $this->createFilesystem($adapter);
- }
-
- protected function createCacheStore($config)
- {
- if (true === $config) {
- return new MemoryStore;
- }
-
- return new CacheStore(
- $this->cache->store($config['store']),
- $config['prefix'] ?? 'flysystem',
- $config['expire'] ?? null
- );
- }
-
- abstract protected function createAdapter(): AdapterInterface;
-
- protected function createFilesystem(AdapterInterface $adapter): Filesystem
- {
- if (!empty($this->config['cache'])) {
- $adapter = new CachedAdapter($adapter, $this->createCacheStore($this->config['cache']));
- }
-
- $config = array_intersect_key($this->config, array_flip(['visibility', 'disable_asserts', 'url']));
-
- return new Filesystem($adapter, count($config) > 0 ? $config : null);
- }
-
- /**
- * 获取文件完整路径
- * @param string $path
- * @return string
- */
- public function path(string $path): string
- {
- $adapter = $this->filesystem->getAdapter();
-
- if ($adapter instanceof AbstractAdapter) {
- return $adapter->applyPathPrefix($path);
- }
-
- return $path;
- }
-
- protected function concatPathToUrl($url, $path)
- {
- return rtrim($url, '/') . '/' . ltrim($path, '/');
- }
-
- public function url(string $path): string
- {
- throw new RuntimeException('This driver does not support retrieving URLs.');
- }
-
- /**
- * 保存文件
- * @param string $path 路径
- * @param File $file 文件
- * @param null|string|\Closure $rule 文件名规则
- * @param array $options 参数
- * @return bool|string
- */
- public function putFile(string $path, File $file, $rule = null, array $options = [])
- {
- return $this->putFileAs($path, $file, $file->hashName($rule), $options);
- }
-
- /**
- * 指定文件名保存文件
- * @param string $path 路径
- * @param File $file 文件
- * @param string $name 文件名
- * @param array $options 参数
- * @return bool|string
- */
- public function putFileAs(string $path, File $file, string $name, array $options = [])
- {
- $stream = fopen($file->getRealPath(), 'r');
- $path = trim($path . '/' . $name, '/');
-
- $result = $this->putStream($path, $stream, $options);
-
- if (is_resource($stream)) {
- fclose($stream);
- }
-
- return $result ? $path : false;
- }
-
- public function __call($method, $parameters)
- {
- return $this->filesystem->$method(...$parameters);
- }
-}
diff --git a/vendor/topthink/framework/src/think/filesystem/driver/Local.php b/vendor/topthink/framework/src/think/filesystem/driver/Local.php
deleted file mode 100644
index 57493356d..000000000
--- a/vendor/topthink/framework/src/think/filesystem/driver/Local.php
+++ /dev/null
@@ -1,59 +0,0 @@
-
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\filesystem\driver;
-
-use League\Flysystem\AdapterInterface;
-use League\Flysystem\Adapter\Local as LocalAdapter;
-use think\filesystem\Driver;
-
-class Local extends Driver
-{
- /**
- * 配置参数
- * @var array
- */
- protected $config = [
- 'root' => '',
- ];
-
- protected function createAdapter(): AdapterInterface
- {
- $permissions = $this->config['permissions'] ?? [];
-
- $links = ($this->config['links'] ?? null) === 'skip'
- ? LocalAdapter::SKIP_LINKS
- : LocalAdapter::DISALLOW_LINKS;
-
- return new LocalAdapter(
- $this->config['root'],
- LOCK_EX,
- $links,
- $permissions
- );
- }
-
- /**
- * 获取文件访问地址
- * @param string $path 文件路径
- * @return string
- */
- public function url(string $path): string
- {
- $path = str_replace('\\', '/', $path);
-
- if (isset($this->config['url'])) {
- return $this->concatPathToUrl($this->config['url'], $path);
- }
- return parent::url($path);
- }
-}
diff --git a/vendor/topthink/framework/src/think/middleware/LoadLangPack.php b/vendor/topthink/framework/src/think/middleware/LoadLangPack.php
index d6bf6a462..af0324b83 100644
--- a/vendor/topthink/framework/src/think/middleware/LoadLangPack.php
+++ b/vendor/topthink/framework/src/think/middleware/LoadLangPack.php
@@ -70,33 +70,35 @@ class LoadLangPack
if ($request->get($this->config['detect_var'])) {
// url中设置了语言变量
- $langSet = strtolower($request->get($this->config['detect_var']));
+ $langSet = $request->get($this->config['detect_var']);
} elseif ($request->header($this->config['header_var'])) {
// Header中设置了语言变量
- $langSet = strtolower($request->header($this->config['header_var']));
+ $langSet = $request->header($this->config['header_var']);
} elseif ($request->cookie($this->config['cookie_var'])) {
// Cookie中设置了语言变量
- $langSet = strtolower($request->cookie($this->config['cookie_var']));
+ $langSet = $request->cookie($this->config['cookie_var']);
} elseif ($request->server('HTTP_ACCEPT_LANGUAGE')) {
// 自动侦测浏览器语言
- $match = preg_match('/^([a-z\d\-]+)/i', $request->server('HTTP_ACCEPT_LANGUAGE'), $matches);
- if ($match) {
- $langSet = strtolower($matches[1]);
- if (isset($this->config['accept_language'][$langSet])) {
- $langSet = $this->config['accept_language'][$langSet];
- }
+ $langSet = $request->server('HTTP_ACCEPT_LANGUAGE');
+ }
+
+ if (preg_match('/^([a-z\d\-]+)/i', $langSet, $matches)) {
+ $langSet = strtolower($matches[1]);
+ if (isset($this->config['accept_language'][$langSet])) {
+ $langSet = $this->config['accept_language'][$langSet];
}
+ } else {
+ $langSet = $this->lang->getLangSet();
}
if (empty($this->config['allow_lang_list']) || in_array($langSet, $this->config['allow_lang_list'])) {
// 合法的语言
- $range = $langSet;
- $this->lang->setLangSet($range);
+ $this->lang->setLangSet($langSet);
} else {
- $range = $this->lang->getLangSet();
+ $langSet = $this->lang->getLangSet();
}
- return $range;
+ return $langSet;
}
/**
diff --git a/vendor/topthink/framework/tests/FilesystemTest.php b/vendor/topthink/framework/tests/FilesystemTest.php
deleted file mode 100644
index df5ffe209..000000000
--- a/vendor/topthink/framework/tests/FilesystemTest.php
+++ /dev/null
@@ -1,131 +0,0 @@
-app = m::mock(App::class)->makePartial();
- Container::setInstance($this->app);
- $this->app->shouldReceive('make')->with(App::class)->andReturn($this->app);
- $this->config = m::mock(Config::class);
- $this->config->shouldReceive('get')->with('filesystem.default', null)->andReturn('local');
- $this->app->shouldReceive('get')->with('config')->andReturn($this->config);
- $this->filesystem = new Filesystem($this->app);
-
- $this->root = vfsStream::setup('rootDir');
- }
-
- protected function tearDown(): void
- {
- m::close();
- }
-
- public function testDisk()
- {
- $this->config->shouldReceive('get')->with('filesystem.disks.local', null)->andReturn([
- 'type' => 'local',
- 'root' => $this->root->url(),
- ]);
-
- $this->config->shouldReceive('get')->with('filesystem.disks.foo', null)->andReturn([
- 'type' => 'local',
- 'root' => $this->root->url(),
- ]);
-
- $this->assertInstanceOf(Local::class, $this->filesystem->disk());
-
- $this->assertInstanceOf(Local::class, $this->filesystem->disk('foo'));
- }
-
- public function testCache()
- {
- $this->config->shouldReceive('get')->with('filesystem.disks.local', null)->andReturn([
- 'type' => 'local',
- 'root' => $this->root->url(),
- 'cache' => true,
- ]);
-
- $this->assertInstanceOf(Local::class, $this->filesystem->disk());
-
- $this->config->shouldReceive('get')->with('filesystem.disks.cache', null)->andReturn([
- 'type' => NullDriver::class,
- 'root' => $this->root->url(),
- 'cache' => [
- 'store' => 'flysystem',
- ],
- ]);
-
- $cache = m::mock(Cache::class);
-
- $cacheDriver = m::mock(File::class);
-
- $cache->shouldReceive('store')->once()->with('flysystem')->andReturn($cacheDriver);
-
- $this->app->shouldReceive('make')->with(Cache::class)->andReturn($cache);
-
- $cacheDriver->shouldReceive('get')->with('flysystem')->once()->andReturn(null);
-
- $cacheDriver->shouldReceive('set')->withAnyArgs();
-
- $this->filesystem->disk('cache')->put('test.txt', 'aa');
- }
-
- public function testPutFile()
- {
- $root = vfsStream::setup('rootDir', null, [
- 'foo.jpg' => 'hello',
- ]);
-
- $this->config->shouldReceive('get')->with('filesystem.disks.local', null)->andReturn([
- 'type' => NullDriver::class,
- 'root' => $root->url(),
- 'cache' => true,
- ]);
-
- $file = m::mock(\think\File::class);
-
- $file->shouldReceive('hashName')->with(null)->once()->andReturn('foo.jpg');
-
- $file->shouldReceive('getRealPath')->once()->andReturn($root->getChild('foo.jpg')->url());
-
- $this->filesystem->putFile('test', $file);
- }
-}
-
-class NullDriver extends Driver
-{
- protected function createAdapter(): AdapterInterface
- {
- return new NullAdapter();
- }
-}
diff --git a/vendor/topthink/think-multi-app/composer.json b/vendor/topthink/think-multi-app/composer.json
index 92d620eb1..82606c1ef 100644
--- a/vendor/topthink/think-multi-app/composer.json
+++ b/vendor/topthink/think-multi-app/composer.json
@@ -10,7 +10,7 @@
],
"require": {
"php": ">=7.1.0",
- "topthink/framework": "^6.0.0"
+ "topthink/framework": "^6.0"
},
"autoload": {
"psr-4": {
diff --git a/vendor/topthink/think-multi-app/src/Url.php b/vendor/topthink/think-multi-app/src/Url.php
index 7bd6057f9..df415ad6e 100644
--- a/vendor/topthink/think-multi-app/src/Url.php
+++ b/vendor/topthink/think-multi-app/src/Url.php
@@ -42,15 +42,17 @@ class Url extends UrlBuild
// 解析到控制器
$url = substr($url, 1);
} elseif ('' === $url) {
- $url = $this->getAppName() . '/' . $request->controller() . '/' . $request->action();
+ $url = $request->controller() . '/' . $request->action();
+ if (!$this->app->http->isBind()) {
+ $url = $this->getAppName() . '/' . $url;
+ }
} else {
// 解析到 应用/控制器/操作
$controller = $request->controller();
- $app = $this->getAppName();
$path = explode('/', $url);
$action = array_pop($path);
$controller = empty($path) ? $controller : array_pop($path);
- $app = empty($path) ? $app : array_pop($path);
+ $app = empty($path) ? $this->getAppName() : array_pop($path);
$url = $controller . '/' . $action;
$bind = $this->app->config->get('app.domain_bind', []);
@@ -58,7 +60,7 @@ class Url extends UrlBuild
isset($bind[$_SERVER['SERVER_NAME']]) && $domain = $_SERVER['SERVER_NAME'];
$domain = is_bool($domain) ? $key : $domain;
- } else {
+ } elseif (!$this->app->http->isBind()) {
$url = $app . '/' . $url;
}
}
diff --git a/vendor/topthink/think-trace/composer.json b/vendor/topthink/think-trace/composer.json
index 5af58545e..172a2d3c6 100644
--- a/vendor/topthink/think-trace/composer.json
+++ b/vendor/topthink/think-trace/composer.json
@@ -10,7 +10,7 @@
],
"require": {
"php": ">=7.1.0",
- "topthink/framework": "^6.0.0"
+ "topthink/framework": "^6.0"
},
"autoload": {
"psr-4": {