.
\ No newline at end of file
diff --git a/inc/vendor/openlss/lib-array2xml/COPYING LESSER b/inc/vendor/openlss/lib-array2xml/COPYING LESSER
new file mode 100644
index 0000000..02bbb60
--- /dev/null
+++ b/inc/vendor/openlss/lib-array2xml/COPYING LESSER
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
\ No newline at end of file
diff --git a/inc/vendor/openlss/lib-array2xml/LSS/Array2XML.php b/inc/vendor/openlss/lib-array2xml/LSS/Array2XML.php
new file mode 100644
index 0000000..581f313
--- /dev/null
+++ b/inc/vendor/openlss/lib-array2xml/LSS/Array2XML.php
@@ -0,0 +1,205 @@
+.
+ */
+namespace LSS;
+
+use \DomDocument;
+use \Exception;
+
+/**
+ * Array2XML: A class to convert array in PHP to XML
+ * It also takes into account attributes names unlike SimpleXML in PHP
+ * It returns the XML in form of DOMDocument class for further manipulation.
+ * It throws exception if the tag name or attribute name has illegal chars.
+ *
+ * Author : Lalit Patel
+ * Website: http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes
+ * License: Apache License 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Version: 0.1 (10 July 2011)
+ * Version: 0.2 (16 August 2011)
+ * - replaced htmlentities() with htmlspecialchars() (Thanks to Liel Dulev)
+ * - fixed a edge case where root node has a false/null/0 value. (Thanks to Liel Dulev)
+ * Version: 0.3 (22 August 2011)
+ * - fixed tag sanitize regex which didn't allow tagnames with single character.
+ * Version: 0.4 (18 September 2011)
+ * - Added support for CDATA section using @cdata instead of @value.
+ * Version: 0.5 (07 December 2011)
+ * - Changed logic to check numeric array indices not starting from 0.
+ * Version: 0.6 (04 March 2012)
+ * - Code now doesn't @cdata to be placed in an empty array
+ * Version: 0.7 (24 March 2012)
+ * - Reverted to version 0.5
+ * Version: 0.8 (02 May 2012)
+ * - Removed htmlspecialchars() before adding to text node or attributes.
+ * Version: 0.11 (28 October 2015)
+ * - Fixed typos; Added support for plain insertion of XML trough @xml.
+ *
+ * Usage:
+ * $xml = Array2XML::createXML('root_node_name', $php_array);
+ * echo $xml->saveXML();
+ */
+class Array2XML {
+
+ /**
+ * @var DOMDocument
+ */
+ private static $xml = null;
+ private static $encoding = 'UTF-8';
+
+ /**
+ * Initialize the root XML node [optional]
+ * @param $version
+ * @param $encoding
+ * @param $format_output
+ */
+ public static function init($version = '1.0', $encoding = 'UTF-8', $format_output = true) {
+ self::$xml = new DomDocument($version, $encoding);
+ self::$xml->formatOutput = $format_output;
+ self::$encoding = $encoding;
+ }
+
+ /**
+ * Convert an Array to XML
+ * @param string $node_name - name of the root node to be converted
+ * @param array $arr - aray to be converterd
+ * @return DomDocument
+ */
+ public static function &createXML($node_name, $arr = array()) {
+ $xml = self::getXMLRoot();
+ $xml->appendChild(self::convert($node_name, $arr));
+
+ self::$xml = null; // clear the xml node in the class for 2nd time use.
+ return $xml;
+ }
+
+ /**
+ * Convert an Array to XML.
+ *
+ * @param string $node_name
+ * Name of the root node to be converted.
+ * @param array $arr
+ * Array to be converted.
+ *
+ * @throws \Exception
+ *
+ * @return \DOMNode
+ */
+ private static function &convert($node_name, $arr = array()) {
+
+ //print_arr($node_name);
+ $xml = self::getXMLRoot();
+ $node = $xml->createElement($node_name);
+
+ if (is_array($arr)) {
+ // get the attributes first.;
+ if (isset($arr['@attributes'])) {
+ foreach ($arr['@attributes'] as $key => $value) {
+ if (!self::isValidTagName($key)) {
+ throw new Exception('[Array2XML] Illegal character in attribute name. attribute: ' . $key . ' in node: ' . $node_name);
+ }
+ $node->setAttribute($key, self::bool2str($value));
+ }
+ unset($arr['@attributes']); //remove the key from the array once done.
+ }
+
+ // check if it has a value stored in @value, if yes store the value and return
+ // else check if its directly stored as string
+ if (isset($arr['@value'])) {
+ $node->appendChild($xml->createTextNode(self::bool2str($arr['@value'])));
+ unset($arr['@value']); //remove the key from the array once done.
+ //return from recursion, as a note with value cannot have child nodes.
+ return $node;
+ } else if (isset($arr['@cdata'])) {
+ $node->appendChild($xml->createCDATASection(self::bool2str($arr['@cdata'])));
+ unset($arr['@cdata']); //remove the key from the array once done.
+ //return from recursion, as a note with cdata cannot have child nodes.
+ return $node;
+ }
+ else if (isset($arr['@xml'])) {
+ $fragment = $xml->createDocumentFragment();
+ $fragment->appendXML($arr['@xml']);
+ $node->appendChild($fragment);
+ unset($arr['@xml']);
+ return $node;
+ }
+ }
+
+ //create subnodes using recursion
+ if (is_array($arr)) {
+ // recurse to get the node for that key
+ foreach ($arr as $key => $value) {
+ if (!self::isValidTagName($key)) {
+ throw new Exception('[Array2XML] Illegal character in tag name. tag: ' . $key . ' in node: ' . $node_name);
+ }
+ if (is_array($value) && is_numeric(key($value))) {
+ // MORE THAN ONE NODE OF ITS KIND;
+ // if the new array is numeric index, means it is array of nodes of the same kind
+ // it should follow the parent key name
+ foreach ($value as $k => $v) {
+ $node->appendChild(self::convert($key, $v));
+ }
+ } else {
+ // ONLY ONE NODE OF ITS KIND
+ $node->appendChild(self::convert($key, $value));
+ }
+ unset($arr[$key]); //remove the key from the array once done.
+ }
+ }
+
+ // after we are done with all the keys in the array (if it is one)
+ // we check if it has any text value, if yes, append it.
+ if (!is_array($arr)) {
+ $node->appendChild($xml->createTextNode(self::bool2str($arr)));
+ }
+
+ return $node;
+ }
+
+ /*
+ * Get the root XML node, if there isn't one, create it.
+ */
+ private static function getXMLRoot() {
+ if (empty(self::$xml)) {
+ self::init();
+ }
+ return self::$xml;
+ }
+
+ /*
+ * Get string representation of boolean value
+ */
+ private static function bool2str($v) {
+ //convert boolean to text value.
+ $v = $v === true ? 'true' : $v;
+ $v = $v === false ? 'false' : $v;
+ return $v;
+ }
+
+ /*
+ * Check if the tag name or attribute name contains illegal characters
+ * Ref: http://www.w3.org/TR/xml/#sec-common-syn
+ */
+ private static function isValidTagName($tag) {
+ $pattern = '/^[a-z_]+[a-z0-9\:\-\.\_]*[^:]*$/i';
+ return preg_match($pattern, $tag, $matches) && $matches[0] == $tag;
+ }
+}
+
diff --git a/inc/vendor/openlss/lib-array2xml/LSS/XML2Array.php b/inc/vendor/openlss/lib-array2xml/LSS/XML2Array.php
new file mode 100644
index 0000000..31ce04b
--- /dev/null
+++ b/inc/vendor/openlss/lib-array2xml/LSS/XML2Array.php
@@ -0,0 +1,169 @@
+.
+ */
+namespace LSS;
+use \DOMDocument;
+use \Exception;
+
+/**
+ * XML2Array: A class to convert XML to array in PHP
+ * It returns the array which can be converted back to XML using the Array2XML script
+ * It takes an XML string or a DOMDocument object as an input.
+ *
+ * See Array2XML: http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes
+ *
+ * Author : Lalit Patel
+ * Website: http://www.lalit.org/lab/convert-xml-to-array-in-php-xml2array
+ * License: Apache License 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Version: 0.1 (07 Dec 2011)
+ * Version: 0.2 (04 Mar 2012)
+ * Fixed typo 'DomDocument' to 'DOMDocument'
+ *
+ * Usage:
+ * $array = XML2Array::createArray($xml);
+ */
+
+class XML2Array {
+
+ protected static $xml = null;
+ protected static $encoding = 'UTF-8';
+ protected static $prefix_attributes = '@';
+
+ /**
+ * Initialize the root XML node [optional]
+ * @param $version
+ * @param $encoding
+ * @param $format_output
+ */
+ public static function init($version = '1.0', $encoding = 'UTF-8', $format_output = true) {
+ self::$xml = new DOMDocument($version, $encoding);
+ self::$xml->formatOutput = $format_output;
+ self::$encoding = $encoding;
+ }
+
+ /**
+ * Convert an XML to Array
+ * @param string $node_name - name of the root node to be converted
+ * @param int - Bitwise OR of the libxml option constants see @link http://php.net/manual/zh/libxml.constants.php
+ * @param array $arr - aray to be converterd
+ * @return DOMDocument
+ */
+ public static function &createArray($input_xml, $options = 0) {
+ $xml = self::getXMLRoot();
+ if(is_string($input_xml)) {
+ $parsed = $xml->loadXML($input_xml, $options);
+ if(!$parsed) {
+ throw new Exception('[XML2Array] Error parsing the XML string.');
+ }
+ } else {
+ if(get_class($input_xml) != 'DOMDocument') {
+ throw new Exception('[XML2Array] The input XML object should be of type: DOMDocument.');
+ }
+ $xml = self::$xml = $input_xml;
+ }
+ $array[$xml->documentElement->tagName] = self::convert($xml->documentElement);
+ self::$xml = null; // clear the xml node in the class for 2nd time use.
+ return $array;
+ }
+
+ /**
+ * Convert an Array to XML
+ * @param mixed $node - XML as a string or as an object of DOMDocument
+ * @return mixed
+ */
+ protected static function &convert($node) {
+ $output = array();
+
+ switch ($node->nodeType) {
+ case XML_CDATA_SECTION_NODE:
+ $output[static::$prefix_attributes.'cdata'] = trim($node->textContent);
+ break;
+
+ case XML_TEXT_NODE:
+ $output = trim($node->textContent);
+ break;
+
+ case XML_ELEMENT_NODE:
+
+ // for each child node, call the covert function recursively
+ for ($i=0, $m=$node->childNodes->length; $i<$m; $i++) {
+ $child = $node->childNodes->item($i);
+ $v = self::convert($child);
+ if(isset($child->tagName)) {
+ $t = $child->tagName;
+
+ // avoid fatal error if the content looks like 'You are being redirected.'
+ if(isset($output) && !is_array($output)) {
+ continue;
+ }
+ // assume more nodes of same kind are coming
+ if(!isset($output[$t])) {
+ $output[$t] = array();
+ }
+ $output[$t][] = $v;
+ } else {
+ //check if it is not an empty text node
+ if($v !== '') {
+ $output = $v;
+ }
+ }
+ }
+
+ if(is_array($output)) {
+ // if only one node of its kind, assign it directly instead if array($value);
+ foreach ($output as $t => $v) {
+ if(is_array($v) && count($v)==1) {
+ $output[$t] = $v[0];
+ }
+ }
+ if(empty($output)) {
+ //for empty nodes
+ $output = '';
+ }
+ }
+
+ // loop through the attributes and collect them
+ if($node->attributes->length) {
+ $a = array();
+ foreach($node->attributes as $attrName => $attrNode) {
+ $a[$attrName] = (string) $attrNode->value;
+ }
+ // if its an leaf node, store the value in @value instead of directly storing it.
+ if(!is_array($output)) {
+ $output = array(static::$prefix_attributes.'value' => $output);
+ }
+ $output[static::$prefix_attributes.'attributes'] = $a;
+ }
+ break;
+ }
+ return $output;
+ }
+
+ /*
+ * Get the root XML node, if there isn't one, create it.
+ */
+ protected static function getXMLRoot(){
+ if(empty(self::$xml)) {
+ self::init();
+ }
+ return self::$xml;
+ }
+}
diff --git a/inc/vendor/openlss/lib-array2xml/README.md b/inc/vendor/openlss/lib-array2xml/README.md
new file mode 100644
index 0000000..50b6293
--- /dev/null
+++ b/inc/vendor/openlss/lib-array2xml/README.md
@@ -0,0 +1,69 @@
+lib-array2xml
+=============
+
+Array2XML conversion library credit to lalit.org
+
+Usage
+----
+```php
+//create XML
+$xml = Array2XML::createXML('root_node_name', $php_array);
+echo $xml->saveXML();
+
+//create Array
+$array = XML2Array::createArray($xml);
+print_r($array);
+```
+
+Array2XML
+----
+
+@xml example:
+```php
+// Build the array that should be transformed into a XML object.
+$array = [
+ 'title' => 'A title',
+ 'body' => [
+ '@xml' => 'The content for the news item
',
+ ],
+];
+
+// Use the Array2XML object to transform it.
+$xml = Array2XML::createXML('news', $array);
+echo $xml->saveXML();
+```
+This will result in the following.
+```xml
+
+
+ A title
+
+
+
+ The content for the news item
+
+
+
+
+```
+
+Reference
+----
+More complete references can be found here
+ http://www.lalit.org/lab/convert-xml-to-array-in-php-xml2array/
+ http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes/
+
+## Changelog
+
+### 0.5.1
+* Fix fata error when the array passed is empty fixed by pull request #6
+
+### 0.5.0
+* add second parameter to XML2Array::createArray for DOMDocument::load, e.g: LIBXML_NOCDATA
+* change method visibility from private to protected for overloading
+* Merge pull request #5 to add child xml
+* Merge pull request #4 to change method visibility and add second parameter for load.
+
+
+### 0.1.0
+* Initial Release
diff --git a/inc/vendor/openlss/lib-array2xml/composer.json b/inc/vendor/openlss/lib-array2xml/composer.json
new file mode 100644
index 0000000..0a514c9
--- /dev/null
+++ b/inc/vendor/openlss/lib-array2xml/composer.json
@@ -0,0 +1,33 @@
+{
+ "name": "openlss/lib-array2xml"
+ ,"homepage": "http://openlss.org"
+ ,"description": "Array2XML conversion library credit to lalit.org"
+ ,"license": "Apache-2.0"
+ ,"type": "library"
+ ,"keywords": [
+ "array"
+ ,"xml"
+ ,"xml conversion"
+ ,"array conversion"
+ ]
+ ,"authors": [
+ {
+ "name": "Bryan Tong"
+ ,"email": "contact@nullivex.com"
+ ,"homepage": "http://bryantong.com"
+ }
+ ,{
+ "name": "Tony Butler"
+ ,"email": "spudz76@gmail.com"
+ ,"homepage": "http://openlss.org"
+ }
+ ]
+ ,"require": {
+ "php": ">=5.3.2"
+ }
+ ,"autoload": {
+ "psr-0": {
+ "LSS": ""
+ }
+ }
+}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/CHANGELOG.md b/inc/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
index 42e6fc2..3cd3e9a 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
+++ b/inc/vendor/phpoffice/phpspreadsheet/CHANGELOG.md
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
+## [1.4.1] - 2018-09-30
+
+### Fixed
+
+- Remove locale from formatting string - [#644](https://github.com/PHPOffice/PhpSpreadsheet/pull/644)
+- Allow iterators to go out of bounds with prev - [#587](https://github.com/PHPOffice/PhpSpreadsheet/issues/587)
+- Fix warning when reading xlsx without styles - [#631](https://github.com/PHPOffice/PhpSpreadsheet/pull/631)
+- Fix broken sample links on windows due to $baseDir having backslash - [#653](https://github.com/PHPOffice/PhpSpreadsheet/pull/653)
+
## [1.4.0] - 2018-08-06
### Added
diff --git a/inc/vendor/phpoffice/phpspreadsheet/composer.json b/inc/vendor/phpoffice/phpspreadsheet/composer.json
index 4a08707..ce228ad 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/composer.json
+++ b/inc/vendor/phpoffice/phpspreadsheet/composer.json
@@ -61,7 +61,7 @@
"suggest": {
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
"dompdf/dompdf": "Option for rendering PDF with PDF Writer",
- "tecnick.com/tcpdf": "Option for rendering PDF with PDF Writer",
+ "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer",
"jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers"
},
"autoload": {
diff --git a/inc/vendor/phpoffice/phpspreadsheet/docs/topics/memory_saving.md b/inc/vendor/phpoffice/phpspreadsheet/docs/topics/memory_saving.md
index e6b744f..c7f9a0c 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/docs/topics/memory_saving.md
+++ b/inc/vendor/phpoffice/phpspreadsheet/docs/topics/memory_saving.md
@@ -43,7 +43,7 @@ usage of PhpSpreadsheet.
## Common use cases
PhpSpreadsheet does not ship with alternative cache implementation. It is up to
-you to select the most appropriate implementation for your environnement. You
+you to select the most appropriate implementation for your environment. You
can either implement [PSR-16](http://www.php-fig.org/psr/psr-16/) from scratch,
or use [pre-existing libraries](https://packagist.org/search/?q=psr-16).
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php
index 54e0e29..e199c80 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php
@@ -82,7 +82,7 @@ class Sample
$files = [];
foreach ($regex as $file) {
- $file = str_replace($baseDir . '/', '', $file[0]);
+ $file = str_replace(str_replace('\\', '/', $baseDir) . '/', '', str_replace('\\', '/', $file[0]));
$info = pathinfo($file);
$category = str_replace('_', ' ', $info['dirname']);
$name = str_replace('_', ' ', preg_replace('/(|\.php)/', '', $info['filename']));
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php
index 3416c35..e6803c7 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php
@@ -1127,7 +1127,7 @@ class Xls extends BaseReader
// TODO: Why is there no BSE Index? Is this a new Office Version? Password protected field?
// More likely : a uncompatible picture
if (!$BSEindex) {
- continue;
+ continue 2;
}
$BSECollection = $escherWorkbook->getDggContainer()->getBstoreContainer()->getBSECollection();
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php
index c6e8512..a770985 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php
@@ -643,7 +643,7 @@ class Xlsx extends BaseReader
$excel->addCellXf($objStyle);
}
- foreach ($xmlStyles->cellStyleXfs->xf as $xf) {
+ foreach (isset($xmlStyles->cellStyleXfs->xf) ? $xmlStyles->cellStyleXfs->xf : [] as $xf) {
$numFmt = NumberFormat::FORMAT_GENERAL;
if ($numFmts && $xf['numFmtId']) {
$tmpNumFmt = self::getArrayItem($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]"));
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php
index d78c079..2e9ec25 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php
@@ -320,7 +320,7 @@ class OLE
break;
default:
- continue;
+ break;
}
fseek($fh, 1, SEEK_CUR);
$pps->Type = $type;
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php
index 63ef20a..dc52a84 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php
@@ -691,6 +691,9 @@ class NumberFormat extends Supervisor
// Strip #
$format = preg_replace('/\\#/', '0', $format);
+ // Remove locale code [$-###]
+ $format = preg_replace('/\[\$\-.*\]/', '', $format);
+
$n = '/\\[[^\\]]+\\]/';
$m = preg_replace($n, '', $format);
$number_regex = '/(0+)(\\.?)(0*)/';
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php
index a4cdb6f..7e8f040 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php
@@ -153,10 +153,6 @@ class ColumnCellIterator extends CellIterator
*/
public function prev()
{
- if ($this->currentRow <= $this->startRow) {
- throw new PhpSpreadsheetException("Row is already at the beginning of range ({$this->startRow} - {$this->endRow})");
- }
-
do {
--$this->currentRow;
} while (($this->onlyExistingCells) &&
@@ -171,7 +167,7 @@ class ColumnCellIterator extends CellIterator
*/
public function valid()
{
- return $this->currentRow <= $this->endRow;
+ return $this->currentRow <= $this->endRow && $this->currentRow >= $this->startRow;
}
/**
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php
index 6fdfe3b..d2b57aa 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php
@@ -157,14 +157,9 @@ class ColumnIterator implements \Iterator
/**
* Set the iterator to its previous value.
- *
- * @throws PhpSpreadsheetException
*/
public function prev()
{
- if ($this->currentColumnIndex <= $this->startColumnIndex) {
- throw new PhpSpreadsheetException('Column is already at the beginning of range (' . Coordinate::stringFromColumnIndex($this->endColumnIndex) . ' - ' . Coordinate::stringFromColumnIndex($this->endColumnIndex) . ')');
- }
--$this->currentColumnIndex;
}
@@ -175,6 +170,6 @@ class ColumnIterator implements \Iterator
*/
public function valid()
{
- return $this->currentColumnIndex <= $this->endColumnIndex;
+ return $this->currentColumnIndex <= $this->endColumnIndex && $this->currentColumnIndex >= $this->startColumnIndex;
}
}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php
index 311808c..d8797a3 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php
@@ -25,7 +25,7 @@ class Iterator implements \Iterator
*
* @param Spreadsheet $subject
*/
- public function __construct(Spreadsheet $subject = null)
+ public function __construct(Spreadsheet $subject)
{
// Set subject
$this->subject = $subject;
@@ -82,6 +82,6 @@ class Iterator implements \Iterator
*/
public function valid()
{
- return $this->position < $this->subject->getSheetCount();
+ return $this->position < $this->subject->getSheetCount() && $this->position >= 0;
}
}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php
index 23d9b9f..59ef329 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php
@@ -155,9 +155,6 @@ class RowCellIterator extends CellIterator
*/
public function prev()
{
- if ($this->currentColumnIndex <= $this->startColumnIndex) {
- throw new PhpSpreadsheetException('Column is already at the beginning of range (' . Coordinate::stringFromColumnIndex($this->endColumnIndex) . ' - ' . Coordinate::stringFromColumnIndex($this->endColumnIndex) . ')');
- }
do {
--$this->currentColumnIndex;
} while (($this->onlyExistingCells) && (!$this->worksheet->cellExistsByColumnAndRow($this->currentColumnIndex, $this->rowIndex)) && ($this->currentColumnIndex >= $this->startColumnIndex));
@@ -170,7 +167,7 @@ class RowCellIterator extends CellIterator
*/
public function valid()
{
- return $this->currentColumnIndex <= $this->endColumnIndex;
+ return $this->currentColumnIndex <= $this->endColumnIndex && $this->currentColumnIndex >= $this->startColumnIndex;
}
/**
diff --git a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php
index 70b7b8f..433cea6 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php
@@ -152,15 +152,9 @@ class RowIterator implements \Iterator
/**
* Set the iterator to its previous value.
- *
- * @throws PhpSpreadsheetException
*/
public function prev()
{
- if ($this->position <= $this->startRow) {
- throw new PhpSpreadsheetException("Row is already at the beginning of range ({$this->startRow} - {$this->endRow})");
- }
-
--$this->position;
}
@@ -171,6 +165,6 @@ class RowIterator implements \Iterator
*/
public function valid()
{
- return $this->position <= $this->endRow;
+ return $this->position <= $this->endRow && $this->position >= $this->startRow;
}
}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/ColumnCellIteratorTest.php b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/ColumnCellIteratorTest.php
index 46880e2..3975674 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/ColumnCellIteratorTest.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/ColumnCellIteratorTest.php
@@ -78,9 +78,8 @@ class ColumnCellIteratorTest extends TestCase
public function testPrevOutOfRange()
{
- $this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
-
$iterator = new ColumnCellIterator($this->mockWorksheet, 'A', 2, 4);
$iterator->prev();
+ self::assertFalse($iterator->valid());
}
}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/ColumnIteratorTest.php b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/ColumnIteratorTest.php
index 7285961..04c626d 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/ColumnIteratorTest.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/ColumnIteratorTest.php
@@ -77,9 +77,8 @@ class ColumnIteratorTest extends TestCase
public function testPrevOutOfRange()
{
- $this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
-
$iterator = new ColumnIterator($this->mockWorksheet, 'B', 'D');
$iterator->prev();
+ self::assertFalse($iterator->valid());
}
}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/IteratorTest.php b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/IteratorTest.php
new file mode 100644
index 0000000..80a2d78
--- /dev/null
+++ b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/IteratorTest.php
@@ -0,0 +1,28 @@
+createSheet();
+ $spreadsheet->createSheet();
+
+ $iterator = new Iterator($spreadsheet);
+ $columnIndexResult = 0;
+ self::assertEquals($columnIndexResult, $iterator->key());
+
+ foreach ($iterator as $key => $column) {
+ self::assertEquals($columnIndexResult++, $key);
+ self::assertInstanceOf(Worksheet::class, $column);
+ }
+ self::assertSame(3, $columnIndexResult);
+ }
+}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/RowCellIteratorTest.php b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/RowCellIteratorTest.php
index 9346d0a..a10c7aa 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/RowCellIteratorTest.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/RowCellIteratorTest.php
@@ -80,9 +80,8 @@ class RowCellIteratorTest extends TestCase
public function testPrevOutOfRange()
{
- $this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
-
$iterator = new RowCellIterator($this->mockWorksheet, 2, 'B', 'D');
$iterator->prev();
+ self::assertFalse($iterator->valid());
}
}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/RowIteratorTest.php b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/RowIteratorTest.php
index 63e26b3..cb0b12d 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/RowIteratorTest.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/tests/PhpSpreadsheetTests/Worksheet/RowIteratorTest.php
@@ -75,9 +75,8 @@ class RowIteratorTest extends TestCase
public function testPrevOutOfRange()
{
- $this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
-
$iterator = new RowIterator($this->mockWorksheet, 2, 4);
$iterator->prev();
+ self::assertFalse($iterator->valid());
}
}
diff --git a/inc/vendor/phpoffice/phpspreadsheet/tests/data/Style/NumberFormat.php b/inc/vendor/phpoffice/phpspreadsheet/tests/data/Style/NumberFormat.php
index 196fa2c..a7584ee 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/tests/data/Style/NumberFormat.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/tests/data/Style/NumberFormat.php
@@ -186,4 +186,24 @@ return [
-1234567.8899999999,
'0000:00.00',
],
+ [
+ '18.952',
+ 18.952,
+ '[$-409]General',
+ ],
+ [
+ '9.98',
+ 9.98,
+ '[$-409]#,##0.00;-#,##0.00',
+ ],
+ [
+ '18.952',
+ 18.952,
+ '[$-1010409]General',
+ ],
+ [
+ '9.98',
+ 9.98,
+ '[$-1010409]#,##0.00;-#,##0.00',
+ ],
];
diff --git a/inc/vendor/phpoffice/phpspreadsheet/tests/data/Style/NumberFormatDates.php b/inc/vendor/phpoffice/phpspreadsheet/tests/data/Style/NumberFormatDates.php
index 5b74fbe..be8dc96 100644
--- a/inc/vendor/phpoffice/phpspreadsheet/tests/data/Style/NumberFormatDates.php
+++ b/inc/vendor/phpoffice/phpspreadsheet/tests/data/Style/NumberFormatDates.php
@@ -62,4 +62,14 @@ return [
43270.603472222,
'hh:mm:ss\ AM/PM',
],
+ [
+ '8/20/2018',
+ 43332,
+ '[$-409]m/d/yyyy',
+ ],
+ [
+ '8/20/2018',
+ 43332,
+ '[$-1010409]m/d/yyyy',
+ ],
];
diff --git a/inc/vendor/tecnickcom/tcpdf/CHANGELOG.TXT b/inc/vendor/tecnickcom/tcpdf/CHANGELOG.TXT
index fc0bb41..3bdae3e 100644
--- a/inc/vendor/tecnickcom/tcpdf/CHANGELOG.TXT
+++ b/inc/vendor/tecnickcom/tcpdf/CHANGELOG.TXT
@@ -1,4 +1,13 @@
-6.2.20
+6.2.25
+ - Fix support for image URLs.
+
+6.2.24
+ - Support remote urls when checking if file exists.
+
+6.2.23
+ - Simplify file_exists function.
+
+6.2.22
- Fix for security vulnerability: Using the phar:// wrapper it was possible to trigger the unserialization of user provided data.
6.2.19
diff --git a/inc/vendor/tecnickcom/tcpdf/composer.json b/inc/vendor/tecnickcom/tcpdf/composer.json
index df1e50d..1f19dfd 100644
--- a/inc/vendor/tecnickcom/tcpdf/composer.json
+++ b/inc/vendor/tecnickcom/tcpdf/composer.json
@@ -1,6 +1,6 @@
{
"name": "tecnickcom/tcpdf",
- "version": "6.2.22",
+ "version": "6.2.26",
"homepage": "http://www.tcpdf.org/",
"type": "library",
"description": "TCPDF is a PHP class for generating PDF documents and barcodes.",
diff --git a/inc/vendor/tecnickcom/tcpdf/include/sRGB.icc b/inc/vendor/tecnickcom/tcpdf/include/sRGB.icc
index 71e3383..1d8f741 100644
Binary files a/inc/vendor/tecnickcom/tcpdf/include/sRGB.icc and b/inc/vendor/tecnickcom/tcpdf/include/sRGB.icc differ
diff --git a/inc/vendor/tecnickcom/tcpdf/include/tcpdf_fonts.php b/inc/vendor/tecnickcom/tcpdf/include/tcpdf_fonts.php
index 211a236..9242ca4 100644
--- a/inc/vendor/tecnickcom/tcpdf/include/tcpdf_fonts.php
+++ b/inc/vendor/tecnickcom/tcpdf/include/tcpdf_fonts.php
@@ -2003,7 +2003,11 @@ class TCPDF_FONTS {
$chars = str_split($str);
$carr = array_map('ord', $chars);
}
- $currentfont['subsetchars'] += array_fill_keys($carr, true);
+ if (is_array($currentfont['subsetchars']) && is_array($carr)) {
+ $currentfont['subsetchars'] += array_fill_keys($carr, true);
+ } else {
+ $currentfont['subsetchars'] = array_merge($currentfont['subsetchars'], $carr);
+ }
return $carr;
}
diff --git a/inc/vendor/tecnickcom/tcpdf/include/tcpdf_static.php b/inc/vendor/tecnickcom/tcpdf/include/tcpdf_static.php
index b010f7a..df1b28e 100644
--- a/inc/vendor/tecnickcom/tcpdf/include/tcpdf_static.php
+++ b/inc/vendor/tecnickcom/tcpdf/include/tcpdf_static.php
@@ -55,7 +55,7 @@ class TCPDF_STATIC {
* Current TCPDF version.
* @private static
*/
- private static $tcpdf_version = '6.2.22';
+ private static $tcpdf_version = '6.2.26';
/**
* String alias for total number of pages.
@@ -1821,6 +1821,31 @@ class TCPDF_STATIC {
return fopen($filename, $mode);
}
+ /**
+ * Check if the URL exist.
+ * @param url (string) URL to check.
+ * @return Returns TRUE if the URL exists; FALSE otherwise.
+ * @public static
+ */
+ public static function url_exists($url) {
+ $crs = curl_init();
+ curl_setopt($crs, CURLOPT_URL, $url);
+ curl_setopt($crs, CURLOPT_NOBODY, true);
+ curl_setopt($crs, CURLOPT_FAILONERROR, true);
+ if ((ini_get('open_basedir') == '') && (!ini_get('safe_mode'))) {
+ curl_setopt($crs, CURLOPT_FOLLOWLOCATION, true);
+ }
+ curl_setopt($crs, CURLOPT_CONNECTTIMEOUT, 5);
+ curl_setopt($crs, CURLOPT_TIMEOUT, 30);
+ curl_setopt($crs, CURLOPT_SSL_VERIFYPEER, false);
+ curl_setopt($crs, CURLOPT_SSL_VERIFYHOST, false);
+ curl_setopt($crs, CURLOPT_USERAGENT, 'tc-lib-file');
+ curl_exec($crs);
+ $code = curl_getinfo($crs, CURLINFO_HTTP_CODE);
+ curl_close($crs);
+ return ($code == 200);
+ }
+
/**
* Wrapper for file_exists.
* Checks whether a file or directory exists.
@@ -1830,20 +1855,11 @@ class TCPDF_STATIC {
* @public static
*/
public static function file_exists($filename) {
- if (strpos($filename, '://') > 0) {
- $wrappers = stream_get_wrappers();
- foreach ($wrappers as $wrapper) {
- if (($wrapper === 'http') || ($wrapper === 'https')) {
- continue;
- }
- if (stripos($filename, $wrapper.'://') === 0) {
- return false;
- }
- }
+ if (preg_match('|^https?://|', $filename) == 1) {
+ return self::url_exists($filename);
}
- if (!@file_exists($filename)) {
- // try to encode spaces on filename
- $filename = str_replace(' ', '%20', $filename);
+ if (strpos($filename, '://')) {
+ return false; // only support http and https wrappers for security reasons
}
return @file_exists($filename);
}
diff --git a/inc/vendor/tecnickcom/tcpdf/tcpdf.php b/inc/vendor/tecnickcom/tcpdf/tcpdf.php
index b2c8ceb..24ef434 100644
--- a/inc/vendor/tecnickcom/tcpdf/tcpdf.php
+++ b/inc/vendor/tecnickcom/tcpdf/tcpdf.php
@@ -1,7 +1,7 @@
* @package com.tecnick.tcpdf
* @author Nicola Asuni
- * @version 6.2.22
+ * @version 6.2.26
*/
// TCPDF configuration
@@ -128,7 +128,7 @@ require_once(dirname(__FILE__).'/include/tcpdf_static.php');
* TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.
* @package com.tecnick.tcpdf
* @brief PHP class for generating PDF documents without requiring external extensions.
- * @version 6.2.22
+ * @version 6.2.26
* @author Nicola Asuni - info@tecnick.com
* @IgnoreAnnotation("protected")
* @IgnoreAnnotation("public")
@@ -5769,10 +5769,9 @@ class TCPDF {
$this->resetLastH();
}
if (!TCPDF_STATIC::empty_string($y)) {
- $this->SetY($y);
- } else {
- $y = $this->GetY();
+ $this->SetY($y); // set y in order to convert negative y values to positive ones
}
+ $y = $this->GetY();
$resth = 0;
if (($h > 0) AND $this->inPageBody() AND (($y + $h + $mc_margin['T'] + $mc_margin['B']) > $this->PageBreakTrigger)) {
// spit cell in more pages/columns
@@ -9648,7 +9647,7 @@ class TCPDF {
protected function _putcatalog() {
// put XMP
$xmpobj = $this->_putXMP();
- // if required, add standard sRGB_IEC61966-2.1 blackscaled ICC colour profile
+ // if required, add standard sRGB ICC colour profile
if ($this->pdfa_mode OR $this->force_srgb) {
$iccobj = $this->_newobj();
$icc = file_get_contents(dirname(__FILE__).'/include/sRGB.icc');
@@ -18818,102 +18817,124 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
break;
}
case 'img': {
- if (!empty($tag['attribute']['src'])) {
- if ($tag['attribute']['src'][0] === '@') {
- // data stream
- $tag['attribute']['src'] = '@'.base64_decode(substr($tag['attribute']['src'], 1));
- $type = '';
- } else {
- // get image type
- $type = TCPDF_IMAGES::getImageFileType($tag['attribute']['src']);
- }
- if (!isset($tag['width'])) {
- $tag['width'] = 0;
- }
- if (!isset($tag['height'])) {
- $tag['height'] = 0;
- }
- //if (!isset($tag['attribute']['align'])) {
- // the only alignment supported is "bottom"
- // further development is required for other modes.
- $tag['attribute']['align'] = 'bottom';
- //}
- switch($tag['attribute']['align']) {
- case 'top': {
- $align = 'T';
- break;
- }
- case 'middle': {
- $align = 'M';
- break;
- }
- case 'bottom': {
- $align = 'B';
- break;
- }
- default: {
- $align = 'B';
- break;
- }
- }
- $prevy = $this->y;
- $xpos = $this->x;
- $imglink = '';
- if (isset($this->HREF['url']) AND !TCPDF_STATIC::empty_string($this->HREF['url'])) {
- $imglink = $this->HREF['url'];
- if ($imglink[0] == '#') {
- // convert url to internal link
- $lnkdata = explode(',', $imglink);
- if (isset($lnkdata[0])) {
- $page = intval(substr($lnkdata[0], 1));
- if (empty($page) OR ($page <= 0)) {
- $page = $this->page;
- }
- if (isset($lnkdata[1]) AND (strlen($lnkdata[1]) > 0)) {
- $lnky = floatval($lnkdata[1]);
- } else {
- $lnky = 0;
- }
- $imglink = $this->AddLink();
- $this->SetLink($imglink, $lnky, $page);
+ if (empty($tag['attribute']['src'])) {
+ break;
+ }
+ $imgsrc = $tag['attribute']['src'];
+ if ($imgsrc[0] === '@') {
+ // data stream
+ $imgsrc = '@'.base64_decode(substr($imgsrc, 1));
+ $type = '';
+ } else {
+ if (($imgsrc[0] === '/') AND !empty($_SERVER['DOCUMENT_ROOT']) AND ($_SERVER['DOCUMENT_ROOT'] != '/')) {
+ // fix image path
+ $findroot = strpos($imgsrc, $_SERVER['DOCUMENT_ROOT']);
+ if (($findroot === false) OR ($findroot > 1)) {
+ if (substr($_SERVER['DOCUMENT_ROOT'], -1) == '/') {
+ $imgsrc = substr($_SERVER['DOCUMENT_ROOT'], 0, -1).$imgsrc;
+ } else {
+ $imgsrc = $_SERVER['DOCUMENT_ROOT'].$imgsrc;
}
}
- }
- $border = 0;
- if (isset($tag['border']) AND !empty($tag['border'])) {
- // currently only support 1 (frame) or a combination of 'LTRB'
- $border = $tag['border'];
- }
- $iw = '';
- if (isset($tag['width'])) {
- $iw = $this->getHTMLUnitToUnits($tag['width'], ($tag['fontsize'] / $this->k), 'px', false);
- }
- $ih = '';
- if (isset($tag['height'])) {
- $ih = $this->getHTMLUnitToUnits($tag['height'], ($tag['fontsize'] / $this->k), 'px', false);
- }
- if (($type == 'eps') OR ($type == 'ai')) {
- $this->ImageEps($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, $imglink, true, $align, '', $border, true);
- } elseif ($type == 'svg') {
- $this->ImageSVG($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, $imglink, $align, '', $border, true);
- } else {
- $this->Image($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, '', $imglink, $align, false, 300, '', false, false, $border, false, false, true);
- }
- switch($align) {
- case 'T': {
- $this->y = $prevy;
- break;
+ $imgsrc = urldecode($imgsrc);
+ $testscrtype = @parse_url($imgsrc);
+ if (empty($testscrtype['query'])) {
+ // convert URL to server path
+ $imgsrc = str_replace(K_PATH_URL, K_PATH_MAIN, $imgsrc);
+ } elseif (preg_match('|^https?://|', $imgsrc) !== 1) {
+ // convert URL to server path
+ $imgsrc = str_replace(K_PATH_MAIN, K_PATH_URL, $imgsrc);
}
- case 'M': {
- $this->y = (($this->img_rb_y + $prevy - ($this->getCellHeight($tag['fontsize'] / $this->k))) / 2);
- break;
- }
- case 'B': {
- $this->y = $this->img_rb_y - ($this->getCellHeight($tag['fontsize'] / $this->k) - ($this->getFontDescent($tag['fontname'], $tag['fontstyle'], $tag['fontsize']) * $this->cell_height_ratio));
- break;
+ }
+ // get image type
+ $type = TCPDF_IMAGES::getImageFileType($imgsrc);
+ }
+ if (!isset($tag['width'])) {
+ $tag['width'] = 0;
+ }
+ if (!isset($tag['height'])) {
+ $tag['height'] = 0;
+ }
+ //if (!isset($tag['attribute']['align'])) {
+ // the only alignment supported is "bottom"
+ // further development is required for other modes.
+ $tag['attribute']['align'] = 'bottom';
+ //}
+ switch($tag['attribute']['align']) {
+ case 'top': {
+ $align = 'T';
+ break;
+ }
+ case 'middle': {
+ $align = 'M';
+ break;
+ }
+ case 'bottom': {
+ $align = 'B';
+ break;
+ }
+ default: {
+ $align = 'B';
+ break;
+ }
+ }
+ $prevy = $this->y;
+ $xpos = $this->x;
+ $imglink = '';
+ if (isset($this->HREF['url']) AND !TCPDF_STATIC::empty_string($this->HREF['url'])) {
+ $imglink = $this->HREF['url'];
+ if ($imglink[0] == '#') {
+ // convert url to internal link
+ $lnkdata = explode(',', $imglink);
+ if (isset($lnkdata[0])) {
+ $page = intval(substr($lnkdata[0], 1));
+ if (empty($page) OR ($page <= 0)) {
+ $page = $this->page;
+ }
+ if (isset($lnkdata[1]) AND (strlen($lnkdata[1]) > 0)) {
+ $lnky = floatval($lnkdata[1]);
+ } else {
+ $lnky = 0;
+ }
+ $imglink = $this->AddLink();
+ $this->SetLink($imglink, $lnky, $page);
}
}
}
+ $border = 0;
+ if (isset($tag['border']) AND !empty($tag['border'])) {
+ // currently only support 1 (frame) or a combination of 'LTRB'
+ $border = $tag['border'];
+ }
+ $iw = '';
+ if (isset($tag['width'])) {
+ $iw = $this->getHTMLUnitToUnits($tag['width'], ($tag['fontsize'] / $this->k), 'px', false);
+ }
+ $ih = '';
+ if (isset($tag['height'])) {
+ $ih = $this->getHTMLUnitToUnits($tag['height'], ($tag['fontsize'] / $this->k), 'px', false);
+ }
+ if (($type == 'eps') OR ($type == 'ai')) {
+ $this->ImageEps($imgsrc, $xpos, $this->y, $iw, $ih, $imglink, true, $align, '', $border, true);
+ } elseif ($type == 'svg') {
+ $this->ImageSVG($imgsrc, $xpos, $this->y, $iw, $ih, $imglink, $align, '', $border, true);
+ } else {
+ $this->Image($imgsrc, $xpos, $this->y, $iw, $ih, '', $imglink, $align, false, 300, '', false, false, $border, false, false, true);
+ }
+ switch($align) {
+ case 'T': {
+ $this->y = $prevy;
+ break;
+ }
+ case 'M': {
+ $this->y = (($this->img_rb_y + $prevy - ($this->getCellHeight($tag['fontsize'] / $this->k))) / 2);
+ break;
+ }
+ case 'B': {
+ $this->y = $this->img_rb_y - ($this->getCellHeight($tag['fontsize'] / $this->k) - ($this->getFontDescent($tag['fontname'], $tag['fontstyle'], $tag['fontsize']) * $this->cell_height_ratio));
+ break;
+ }
+ }
break;
}
case 'dl': {
@@ -24207,9 +24228,12 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
}
$img = urldecode($img);
$testscrtype = @parse_url($img);
- if (!isset($testscrtype['query']) OR empty($testscrtype['query'])) {
+ if (empty($testscrtype['query'])) {
// convert URL to server path
$img = str_replace(K_PATH_URL, K_PATH_MAIN, $img);
+ } elseif (preg_match('|^https?://|', $img) !== 1) {
+ // convert server path to URL
+ $img = str_replace(K_PATH_MAIN, K_PATH_URL, $img);
}
}
// get image type