diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 961f014978..b6ab5b310f 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -44,20 +44,23 @@ jobs: phpstan: name: PHP Static Analysis runs-on: ubuntu-latest - continue-on-error: true + strategy: + fail-fast: false + matrix: + php: ['7.1', '7.2', '7.3', '7.4', '8.0'] #, '8.1' steps: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '7.4' + php-version: ${{ matrix.php }} extensions: gd, xml, zip - uses: actions/checkout@v2 - name: Composer Install run: composer install --ansi --prefer-dist --no-interaction --no-progress - #- name: Run phpstan - # run: ./vendor/bin/phpstan analyse -c phpstan.neon.dist + - name: Run phpstan + run: ./vendor/bin/phpstan analyse -c phpstan.neon.dist phpunit: name: PHPUnit diff --git a/composer.json b/composer.json index 4e1fb39911..d0b98fc3bd 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,8 @@ "require-dev": { "phpunit/phpunit": ">=7.0", "phpdocumentor/phpdocumentor":"^2.0|^3.0", - "phpmd/phpmd": "2.*" + "phpmd/phpmd": "2.*", + "phpstan/phpstan": "^0.12.88" }, "suggest": { "ext-gd": "Required to add images" diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 0000000000..907a6c7f9d --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,29 @@ +parameters: + level: 6 + bootstrapFiles: + - tests/bootstrap.php + paths: + - src + - tests + reportUnmatchedIgnoredErrors: false + ignoreErrors: + ## Relative to PHPExcel + - '#^Call to static method createWriter\(\) on an unknown class PHPExcel_IOFactory\.#' + - '#^Call to static method stringFromColumnIndex\(\) on an unknown class PHPExcel_Cell\.#' + ## Relative to Common + - '#^Parameter \#1 \$pValue of static method PhpOffice\\Common\\Drawing\:\:angleToDegrees\(\) expects int, string given\.#' + - '#^Parameter \#1 \$pValue of static method PhpOffice\\Common\\Drawing\:\:centimetersToPixels\(\) expects int, string given\.#' + - '#^Parameter \#1 \$pValue of static method PhpOffice\\Common\\Drawing\:\:degreesToAngle\(\) expects int, float given\.#' + - '#^Parameter \#1 \$pValue of static method PhpOffice\\Common\\Drawing\:\:emuToPixels\(\) expects int, float given\.#' + - '#^Parameter \#1 \$pValue of static method PhpOffice\\Common\\Drawing\:\:emuToPixels\(\) expects int, string given\.#' + - '#^Parameter \#1 \$pValue of static method PhpOffice\\Common\\Drawing\:\:pixelsToCentimeters\(\) expects int, float given\.#' + - '#^Parameter \#1 \$pValue of static method PhpOffice\\Common\\Drawing\:\:pixelsToEmu\(\) expects int, float given\.#' + ## PHP 8.0 & GdImage + - '#^Parameter \#1 \$value of method PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd::setImageResource\(\) expects resource\|null, GdImage\|false given\.#' + - '#^Parameter \#1 \$image of function imagesx expects GdImage, resource given\.#' + - '#^Parameter \#1 \$image of function imagesy expects GdImage, resource given\.#' + - '#^Parameter \#1 \$image of function imagealphablending expects GdImage, resource given\.#' + - '#^Parameter \#1 \$image of function imagesavealpha expects GdImage, resource given\.#' + + ## Remove after remove ArrayObject + treatPhpDocTypesAsCertain: false diff --git a/src/PhpPresentation/AbstractShape.php b/src/PhpPresentation/AbstractShape.php index 9c588df707..d6914a9dbe 100644 --- a/src/PhpPresentation/AbstractShape.php +++ b/src/PhpPresentation/AbstractShape.php @@ -19,6 +19,7 @@ use PhpOffice\PhpPresentation\Shape\Hyperlink; use PhpOffice\PhpPresentation\Shape\Placeholder; +use PhpOffice\PhpPresentation\Style\Border; use PhpOffice\PhpPresentation\Style\Fill; use PhpOffice\PhpPresentation\Style\Shadow; @@ -30,7 +31,7 @@ abstract class AbstractShape implements ComparableInterface /** * Container * - * @var \PhpOffice\PhpPresentation\ShapeContainerInterface + * @var ShapeContainerInterface|null */ protected $container; @@ -63,16 +64,14 @@ abstract class AbstractShape implements ComparableInterface protected $height; /** - * Fill - * - * @var \PhpOffice\PhpPresentation\Style\Fill + * @var Fill|null */ private $fill; /** * Border * - * @var \PhpOffice\PhpPresentation\Style\Border + * @var Border */ private $border; @@ -86,27 +85,24 @@ abstract class AbstractShape implements ComparableInterface /** * Shadow * - * @var \PhpOffice\PhpPresentation\Style\Shadow + * @var Shadow|null */ protected $shadow; /** - * Hyperlink - * - * @var \PhpOffice\PhpPresentation\Shape\Hyperlink + * @var Hyperlink|null */ protected $hyperlink; /** - * PlaceHolder - * @var \PhpOffice\PhpPresentation\Shape\Placeholder + * @var Placeholder|null */ protected $placeholder; /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -115,17 +111,10 @@ abstract class AbstractShape implements ComparableInterface */ public function __construct() { - // Initialise values - $this->container = null; - $this->offsetX = 0; - $this->offsetY = 0; - $this->width = 0; - $this->height = 0; - $this->rotation = 0; - $this->fill = new Style\Fill(); - $this->border = new Style\Border(); - $this->shadow = new Style\Shadow(); - + $this->offsetX = $this->offsetY = $this->width = $this->height = $this->rotation = 0; + $this->fill = new Fill(); + $this->shadow = new Shadow(); + $this->border = new Border(); $this->border->setLineStyle(Style\Border::LINE_NONE); } @@ -143,9 +132,9 @@ public function __clone() /** * Get Container, Slide or Group * - * @return \PhpOffice\PhpPresentation\ShapeContainerInterface + * @return ShapeContainerInterface|null */ - public function getContainer() + public function getContainer(): ?ShapeContainerInterface { return $this->container; } @@ -153,22 +142,22 @@ public function getContainer() /** * Set Container, Slide or Group * - * @param \PhpOffice\PhpPresentation\ShapeContainerInterface $pValue - * @param bool $pOverrideOld If a Slide has already been assigned, overwrite it and remove image from old Slide? + * @param ShapeContainerInterface $pValue + * @param bool $pOverrideOld If a Slide has already been assigned, overwrite it and remove image from old Slide? * @throws \Exception * @return $this */ public function setContainer(ShapeContainerInterface $pValue = null, $pOverrideOld = false) { if (is_null($this->container)) { - // Add drawing to \PhpOffice\PhpPresentation\ShapeContainerInterface + // Add drawing to ShapeContainerInterface $this->container = $pValue; if (!is_null($this->container)) { $this->container->getShapeCollection()->append($this); } } else { if ($pOverrideOld) { - // Remove drawing from old \PhpOffice\PhpPresentation\ShapeContainerInterface + // Remove drawing from old ShapeContainerInterface $iterator = $this->container->getShapeCollection()->getIterator(); while ($iterator->valid()) { @@ -183,7 +172,11 @@ public function setContainer(ShapeContainerInterface $pValue = null, $pOverrideO // Set new \PhpOffice\PhpPresentation\Slide $this->setContainer($pValue); } else { - throw new \Exception("A \PhpOffice\PhpPresentation\ShapeContainerInterface has already been assigned. Shapes can only exist on one \PhpOffice\PhpPresentation\ShapeContainerInterface."); + throw new \Exception(sprintf( + 'A %s has already been assigned. Shapes can only exist on one %s.', + ShapeContainerInterface::class, + ShapeContainerInterface::class + )); } } @@ -195,7 +188,7 @@ public function setContainer(ShapeContainerInterface $pValue = null, $pOverrideO * * @return int */ - public function getOffsetX() + public function getOffsetX(): int { return $this->offsetX; } @@ -203,10 +196,10 @@ public function getOffsetX() /** * Set OffsetX * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setOffsetX($pValue = 0) + public function setOffsetX(int $pValue = 0) { $this->offsetX = $pValue; @@ -226,10 +219,10 @@ public function getOffsetY() /** * Set OffsetY * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setOffsetY($pValue = 0) + public function setOffsetY(int $pValue = 0) { $this->offsetY = $pValue; @@ -249,10 +242,10 @@ public function getWidth() /** * Set Width * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setWidth($pValue = 0) + public function setWidth(int $pValue = 0) { $this->width = $pValue; return $this; @@ -271,10 +264,10 @@ public function getHeight() /** * Set Height * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setHeight($pValue = 0) + public function setHeight(int $pValue = 0) { $this->height = $pValue; return $this; @@ -283,12 +276,11 @@ public function setHeight($pValue = 0) /** * Set width and height with proportional resize * - * @param int $width - * @param int $height - * @example $objDrawing->setWidthAndHeight(160,120); - * @return $this + * @param int $width + * @param int $height + * @return self */ - public function setWidthAndHeight($width = 0, $height = 0) + public function setWidthAndHeight(int $width = 0, int $height = 0) { $this->width = $width; $this->height = $height; @@ -308,7 +300,7 @@ public function getRotation() /** * Set Rotation * - * @param int $pValue + * @param int $pValue * @return $this */ public function setRotation($pValue = 0) @@ -318,50 +310,41 @@ public function setRotation($pValue = 0) } /** - * Get Fill - * - * @return \PhpOffice\PhpPresentation\Style\Fill + * @return Fill|null */ - public function getFill() + public function getFill(): ?Fill { return $this->fill; } /** - * Set Fill - * @param \PhpOffice\PhpPresentation\Style\Fill $pValue - * @return \PhpOffice\PhpPresentation\AbstractShape + * @param Fill|null $pValue + * @return self */ - public function setFill(Fill $pValue = null) + public function setFill(Fill $pValue = null): self { $this->fill = $pValue; return $this; } /** - * Get Border - * - * @return \PhpOffice\PhpPresentation\Style\Border + * @return Border */ - public function getBorder() + public function getBorder(): Border { return $this->border; } /** - * Get Shadow - * - * @return \PhpOffice\PhpPresentation\Style\Shadow + * @return Shadow|null */ - public function getShadow() + public function getShadow(): ?Shadow { return $this->shadow; } /** - * Set Shadow - * - * @param \PhpOffice\PhpPresentation\Style\Shadow $pValue + * @param Shadow|null $pValue * @throws \Exception * @return $this */ @@ -384,10 +367,10 @@ public function hasHyperlink() /** * Get Hyperlink * - * @return \PhpOffice\PhpPresentation\Shape\Hyperlink + * @return Hyperlink * @throws \Exception */ - public function getHyperlink() + public function getHyperlink(): Hyperlink { if (is_null($this->hyperlink)) { $this->hyperlink = new Hyperlink(); @@ -398,11 +381,11 @@ public function getHyperlink() /** * Set Hyperlink * - * @param \PhpOffice\PhpPresentation\Shape\Hyperlink $pHyperlink + * @param Hyperlink|null $pHyperlink * @throws \Exception - * @return $this + * @return self */ - public function setHyperlink(Hyperlink $pHyperlink = null) + public function setHyperlink(Hyperlink $pHyperlink = null): self { $this->hyperlink = $pHyperlink; return $this; @@ -413,7 +396,7 @@ public function setHyperlink(Hyperlink $pHyperlink = null) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5((is_object($this->container) ? $this->container->getHashCode() : '') . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->rotation . (is_null($this->getFill()) ? '' : $this->getFill()->getHashCode()) . (is_null($this->shadow) ? '' : $this->shadow->getHashCode()) . (is_null($this->hyperlink) ? '' : $this->hyperlink->getHashCode()) . __CLASS__); } @@ -424,9 +407,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -437,19 +420,21 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } - public function isPlaceholder() + public function isPlaceholder(): bool { return !is_null($this->placeholder); } - public function getPlaceholder() + public function getPlaceholder(): ?Placeholder { if (!$this->isPlaceholder()) { return null; @@ -458,10 +443,10 @@ public function getPlaceholder() } /** - * @param \PhpOffice\PhpPresentation\Shape\Placeholder $placeholder - * @return $this + * @param Placeholder $placeholder + * @return self */ - public function setPlaceHolder(Placeholder $placeholder) + public function setPlaceHolder(Placeholder $placeholder): self { $this->placeholder = $placeholder; return $this; diff --git a/src/PhpPresentation/Autoloader.php b/src/PhpPresentation/Autoloader.php index beeac584d3..4de49a72c6 100644 --- a/src/PhpPresentation/Autoloader.php +++ b/src/PhpPresentation/Autoloader.php @@ -30,7 +30,7 @@ class Autoloader * * @return void */ - public static function register() + public static function register(): void { spl_autoload_register(array(new self(), 'autoload')); } @@ -40,7 +40,7 @@ public static function register() * * @param string $class */ - public static function autoload($class) + public static function autoload(string $class): void { $prefixLength = strlen(self::NAMESPACE_PREFIX); if (0 === strncmp(self::NAMESPACE_PREFIX, $class, $prefixLength)) { diff --git a/src/PhpPresentation/ComparableInterface.php b/src/PhpPresentation/ComparableInterface.php index 87eae2c1bc..3844f4a96f 100644 --- a/src/PhpPresentation/ComparableInterface.php +++ b/src/PhpPresentation/ComparableInterface.php @@ -27,7 +27,7 @@ interface ComparableInterface * * @return string Hash code */ - public function getHashCode(); + public function getHashCode(): string; /** * Get hash index @@ -35,9 +35,9 @@ public function getHashCode(); * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex(); + public function getHashIndex(): ?int; /** * Set hash index @@ -45,7 +45,8 @@ public function getHashIndex(); * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value); + public function setHashIndex(int $value); } diff --git a/src/PhpPresentation/DocumentLayout.php b/src/PhpPresentation/DocumentLayout.php index 3c40b8ce1e..92943382da 100644 --- a/src/PhpPresentation/DocumentLayout.php +++ b/src/PhpPresentation/DocumentLayout.php @@ -51,6 +51,8 @@ class DocumentLayout * Absolute distances are specified in English Metric Units (EMUs), * occasionally referred to as A units; there are 360000 EMUs per * centimeter, 914400 EMUs per inch, 12700 EMUs per point. + * + * @var array> */ private $dimension = array( self::LAYOUT_SCREEN_4X3 => array('cx' => 9144000, 'cy' => 6858000), @@ -98,7 +100,7 @@ public function __construct() * * @return string */ - public function getDocumentLayout() + public function getDocumentLayout(): string { return $this->layout; } @@ -106,11 +108,11 @@ public function getDocumentLayout() /** * Set Document Layout * - * @param array|string $pValue - * @param boolean $isLandscape - * @return \PhpOffice\PhpPresentation\DocumentLayout + * @param array|string $pValue + * @param boolean $isLandscape + * @return self */ - public function setDocumentLayout($pValue = self::LAYOUT_SCREEN_4X3, $isLandscape = true) + public function setDocumentLayout($pValue = self::LAYOUT_SCREEN_4X3, $isLandscape = true): self { switch ($pValue) { case self::LAYOUT_SCREEN_4X3: @@ -149,9 +151,9 @@ public function setDocumentLayout($pValue = self::LAYOUT_SCREEN_4X3, $isLandscap * Get Document Layout cx * * @param string $unit - * @return integer + * @return float */ - public function getCX($unit = self::UNIT_EMU) + public function getCX(string $unit = self::UNIT_EMU): float { return $this->convertUnit($this->dimensionX, self::UNIT_EMU, $unit); } @@ -160,9 +162,9 @@ public function getCX($unit = self::UNIT_EMU) * Get Document Layout cy * * @param string $unit - * @return integer + * @return float */ - public function getCY($unit = self::UNIT_EMU) + public function getCY(string $unit = self::UNIT_EMU): float { return $this->convertUnit($this->dimensionY, self::UNIT_EMU, $unit); } @@ -172,9 +174,9 @@ public function getCY($unit = self::UNIT_EMU) * * @param float $value * @param string $unit - * @return DocumentLayout + * @return self */ - public function setCX($value, $unit = self::UNIT_EMU) + public function setCX(float $value, string $unit = self::UNIT_EMU): self { $this->layout = self::LAYOUT_CUSTOM; $this->dimensionX = $this->convertUnit($value, $unit, self::UNIT_EMU); @@ -186,9 +188,9 @@ public function setCX($value, $unit = self::UNIT_EMU) * * @param float $value * @param string $unit - * @return DocumentLayout + * @return self */ - public function setCY($value, $unit = self::UNIT_EMU) + public function setCY(float $value, string $unit = self::UNIT_EMU): self { $this->layout = self::LAYOUT_CUSTOM; $this->dimensionY = $this->convertUnit($value, $unit, self::UNIT_EMU); @@ -202,7 +204,7 @@ public function setCY($value, $unit = self::UNIT_EMU) * @param string $toUnit * @return float */ - protected function convertUnit($value, $fromUnit, $toUnit) + protected function convertUnit(float $value, string $fromUnit, string $toUnit): float { // Convert from $fromUnit to EMU switch ($fromUnit) { diff --git a/src/PhpPresentation/DocumentProperties.php b/src/PhpPresentation/DocumentProperties.php index c9344fed25..b178103e06 100644 --- a/src/PhpPresentation/DocumentProperties.php +++ b/src/PhpPresentation/DocumentProperties.php @@ -123,7 +123,7 @@ public function getCreator() /** * Set Creator * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setCreator($pValue = '') @@ -146,7 +146,7 @@ public function getLastModifiedBy() /** * Set Last Modified By * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setLastModifiedBy($pValue = '') @@ -195,7 +195,7 @@ public function getModified() /** * Set Modified * - * @param int $pValue + * @param int $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setModified($pValue = null) @@ -221,7 +221,7 @@ public function getTitle() /** * Set Title * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setTitle($pValue = '') @@ -244,7 +244,7 @@ public function getDescription() /** * Set Description * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setDescription($pValue = '') @@ -267,7 +267,7 @@ public function getSubject() /** * Set Subject * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setSubject($pValue = '') @@ -290,7 +290,7 @@ public function getKeywords() /** * Set Keywords * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setKeywords($pValue = '') @@ -313,7 +313,7 @@ public function getCategory() /** * Set Category * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setCategory($pValue = '') @@ -336,7 +336,7 @@ public function getCompany() /** * Set Company * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\DocumentProperties */ public function setCompany($pValue = '') diff --git a/src/PhpPresentation/GeometryCalculator.php b/src/PhpPresentation/GeometryCalculator.php index 2315e395a5..4b191d0933 100644 --- a/src/PhpPresentation/GeometryCalculator.php +++ b/src/PhpPresentation/GeometryCalculator.php @@ -28,10 +28,10 @@ class GeometryCalculator /** * Calculate X and Y offsets for a set of shapes within a container such as a slide or group. * - * @param \PhpOffice\PhpPresentation\ShapeContainerInterface $container - * @return array + * @param ShapeContainerInterface $container + * @return array */ - public static function calculateOffsets(ShapeContainerInterface $container) + public static function calculateOffsets(ShapeContainerInterface $container): array { $offsets = array(self::X => 0, self::Y => 0); @@ -61,24 +61,25 @@ public static function calculateOffsets(ShapeContainerInterface $container) /** * Calculate X and Y extents for a set of shapes within a container such as a slide or group. * - * @param \PhpOffice\PhpPresentation\ShapeContainerInterface $container - * @return array + * @param ShapeContainerInterface $container + * @return array */ - public static function calculateExtents(ShapeContainerInterface $container) + public static function calculateExtents(ShapeContainerInterface $container): array { + /** @var array $extents */ $extents = array(self::X => 0, self::Y => 0); if ($container !== null && count($container->getShapeCollection()) != 0) { $shapes = $container->getShapeCollection(); if ($shapes[0] !== null) { - $extents[self::X] = $shapes[0]->getOffsetX() + $shapes[0]->getWidth(); - $extents[self::Y] = $shapes[0]->getOffsetY() + $shapes[0]->getHeight(); + $extents[self::X] = (int) ($shapes[0]->getOffsetX() + $shapes[0]->getWidth()); + $extents[self::Y] = (int) ($shapes[0]->getOffsetY() + $shapes[0]->getHeight()); } foreach ($shapes as $shape) { if ($shape !== null) { - $extentX = $shape->getOffsetX() + $shape->getWidth(); - $extentY = $shape->getOffsetY() + $shape->getHeight(); + $extentX = (int) ($shape->getOffsetX() + $shape->getWidth()); + $extentY = (int) ($shape->getOffsetY() + $shape->getHeight()); if ($extentX > $extents[self::X]) { $extents[self::X] = $extentX; diff --git a/src/PhpPresentation/HashTable.php b/src/PhpPresentation/HashTable.php index a1efc21347..c903694dfb 100644 --- a/src/PhpPresentation/HashTable.php +++ b/src/PhpPresentation/HashTable.php @@ -17,6 +17,8 @@ namespace PhpOffice\PhpPresentation; +use PhpOffice\PhpPresentation\ComparableInterface; + /** * \PhpOffice\PhpPresentation\HashTable */ @@ -25,46 +27,35 @@ class HashTable /** * HashTable elements * - * @var array + * @var array */ public $items = array(); /** * HashTable key map * - * @var array + * @var array */ public $keyMap = array(); /** * Create a new \PhpOffice\PhpPresentation\HashTable * - * @param \PhpOffice\PhpPresentation\ComparableInterface[] $pSource Optional source array to create HashTable from + * @param array $pSource Optional source array to create HashTable from * @throws \Exception */ - public function __construct(array $pSource = null) + public function __construct(array $pSource = []) { - if (!is_null($pSource)) { - // Create HashTable - $this->addFromSource($pSource); - } + $this->addFromSource($pSource); } /** * Add HashTable items from source * - * @param \PhpOffice\PhpPresentation\ComparableInterface[] $pSource Source array to create HashTable from - * @throws \Exception + * @param array $pSource Source array to create HashTable from */ - public function addFromSource($pSource = null) + public function addFromSource(array $pSource = []): void { - // Check if an array was passed - if ($pSource == null) { - return; - } elseif (!is_array($pSource)) { - throw new \Exception('Invalid array parameter passed.'); - } - foreach ($pSource as $item) { $this->add($item); } @@ -73,25 +64,22 @@ public function addFromSource($pSource = null) /** * Add HashTable item * - * @param \PhpOffice\PhpPresentation\ComparableInterface $pSource Item to add + * @param ComparableInterface $pSource Item to add */ - public function add(ComparableInterface $pSource) + public function add(ComparableInterface $pSource): void { // Determine hashcode $hashIndex = $pSource->getHashIndex(); $hashCode = $pSource->getHashCode(); - - if (is_null($hashIndex)) { - $hashCode = $pSource->getHashCode(); - } elseif (isset($this->keyMap[$hashIndex])) { + if (isset($this->keyMap[$hashIndex])) { $hashCode = $this->keyMap[$hashIndex]; } // Add value if (!isset($this->items[$hashCode])) { $this->items[$hashCode] = $pSource; - $index = count($this->items) - 1; - $this->keyMap[$index] = $hashCode; + $index = count($this->items) - 1; + $this->keyMap[$index] = $hashCode; $pSource->setHashIndex($index); } else { $pSource->setHashIndex($this->items[$hashCode]->getHashIndex()); @@ -101,10 +89,10 @@ public function add(ComparableInterface $pSource) /** * Remove HashTable item * - * @param \PhpOffice\PhpPresentation\ComparableInterface $pSource Item to remove + * @param ComparableInterface $pSource Item to remove * @throws \Exception */ - public function remove(ComparableInterface $pSource) + public function remove(ComparableInterface $pSource): void { if (isset($this->items[$pSource->getHashCode()])) { unset($this->items[$pSource->getHashCode()]); @@ -125,9 +113,8 @@ public function remove(ComparableInterface $pSource) /** * Clear HashTable - * */ - public function clear() + public function clear(): void { $this->items = array(); $this->keyMap = array(); @@ -138,7 +125,7 @@ public function clear() * * @return int */ - public function count() + public function count(): int { return count($this->items); } @@ -146,22 +133,23 @@ public function count() /** * Get index for hash code * - * @param string $pHashCode - * @return int Index + * @param string $pHashCode + * @return int Index (-1 if not found) */ - public function getIndexForHashCode($pHashCode = '') + public function getIndexForHashCode(string $pHashCode = ''): int { - return array_search($pHashCode, $this->keyMap); + $index = array_search($pHashCode, $this->keyMap); + return $index === false ? -1 : $index; } /** * Get by index * - * @param int $pIndex - * @return \PhpOffice\PhpPresentation\ComparableInterface + * @param int $pIndex + * @return ComparableInterface|null * */ - public function getByIndex($pIndex = 0) + public function getByIndex(int $pIndex = 0): ?ComparableInterface { if (isset($this->keyMap[$pIndex])) { return $this->getByHashCode($this->keyMap[$pIndex]); @@ -173,11 +161,11 @@ public function getByIndex($pIndex = 0) /** * Get by hashcode * - * @param string $pHashCode - * @return \PhpOffice\PhpPresentation\ComparableInterface + * @param string $pHashCode + * @return ComparableInterface|null * */ - public function getByHashCode($pHashCode = '') + public function getByHashCode(string $pHashCode = ''): ?ComparableInterface { if (isset($this->items[$pHashCode])) { return $this->items[$pHashCode]; @@ -189,9 +177,9 @@ public function getByHashCode($pHashCode = '') /** * HashTable to array * - * @return \PhpOffice\PhpPresentation\ComparableInterface[] + * @return array */ - public function toArray() + public function toArray(): array { return $this->items; } diff --git a/src/PhpPresentation/IOFactory.php b/src/PhpPresentation/IOFactory.php index 84cb3756e7..3d552fec36 100644 --- a/src/PhpPresentation/IOFactory.php +++ b/src/PhpPresentation/IOFactory.php @@ -17,6 +17,10 @@ namespace PhpOffice\PhpPresentation; +use PhpOffice\PhpPresentation\Reader\ReaderInterface; +use PhpOffice\PhpPresentation\Writer\WriterInterface; +use ReflectionClass; + /** * IOFactory */ @@ -25,7 +29,7 @@ class IOFactory /** * Autoresolve classes * - * @var array + * @var array */ private static $autoResolveClasses = array('Serialized', 'ODPresentation', 'PowerPoint97', 'PowerPoint2007'); @@ -34,10 +38,10 @@ class IOFactory * * @param PhpPresentation $phpPresentation * @param string $name - * @return \PhpOffice\PhpPresentation\Writer\WriterInterface + * @return WriterInterface * @throws \Exception */ - public static function createWriter(PhpPresentation $phpPresentation, $name = 'PowerPoint2007') + public static function createWriter(PhpPresentation $phpPresentation, string $name = 'PowerPoint2007'): WriterInterface { $class = 'PhpOffice\\PhpPresentation\\Writer\\' . $name; return self::loadClass($class, $name, 'writer', $phpPresentation); @@ -46,11 +50,11 @@ public static function createWriter(PhpPresentation $phpPresentation, $name = 'P /** * Create reader * - * @param string $name - * @return \PhpOffice\PhpPresentation\Reader\ReaderInterface + * @param string $name + * @return ReaderInterface * @throws \Exception */ - public static function createReader($name = '') + public static function createReader(string $name = ''): ReaderInterface { $class = 'PhpOffice\\PhpPresentation\\Reader\\' . $name; return self::loadClass($class, $name, 'reader'); @@ -59,11 +63,11 @@ public static function createReader($name = '') /** * Loads PhpPresentation from file using automatic \PhpOffice\PhpPresentation\Reader\ReaderInterface resolution * - * @param string $pFilename + * @param string $pFilename * @return PhpPresentation * @throws \Exception */ - public static function load($pFilename) + public static function load(string $pFilename): PhpPresentation { // Try loading using self::$autoResolveClasses foreach (self::$autoResolveClasses as $autoResolveClass) { @@ -82,11 +86,11 @@ public static function load($pFilename) * @param string $class * @param string $name * @param string $type - * @param \PhpOffice\PhpPresentation\PhpPresentation $phpPresentation + * @param PhpPresentation|null $phpPresentation * @return mixed * @throws \ReflectionException */ - private static function loadClass($class, $name, $type, PhpPresentation $phpPresentation = null) + private static function loadClass(string $class, string $name, string $type, PhpPresentation $phpPresentation = null) { if (class_exists($class) && self::isConcreteClass($class)) { if (is_null($phpPresentation)) { @@ -106,9 +110,9 @@ private static function loadClass($class, $name, $type, PhpPresentation $phpPres * @return bool * @throws \ReflectionException */ - private static function isConcreteClass($class) + private static function isConcreteClass(string $class): bool { - $reflection = new \ReflectionClass($class); + $reflection = new ReflectionClass($class); return !$reflection->isAbstract() && !$reflection->isInterface(); } diff --git a/src/PhpPresentation/PhpPresentation.php b/src/PhpPresentation/PhpPresentation.php index 172babe12c..517cd4336e 100644 --- a/src/PhpPresentation/PhpPresentation.php +++ b/src/PhpPresentation/PhpPresentation.php @@ -17,6 +17,7 @@ namespace PhpOffice\PhpPresentation; +use ArrayObject; use PhpOffice\PhpPresentation\Slide; use PhpOffice\PhpPresentation\Slide\Iterator; use PhpOffice\PhpPresentation\Slide\SlideMaster; @@ -29,28 +30,28 @@ class PhpPresentation /** * Document properties * - * @var \PhpOffice\PhpPresentation\DocumentProperties + * @var DocumentProperties */ protected $documentProperties; /** * Presentation properties * - * @var \PhpOffice\PhpPresentation\PresentationProperties + * @var PresentationProperties */ protected $presentationProps; /** * Document layout * - * @var \PhpOffice\PhpPresentation\DocumentLayout + * @var DocumentLayout */ protected $layout; /** * Collection of Slide objects * - * @var \PhpOffice\PhpPresentation\Slide[] + * @var array */ protected $slideCollection = array(); @@ -63,7 +64,7 @@ class PhpPresentation /** * Collection of Master Slides - * @var \ArrayObject|\PhpOffice\PhpPresentation\Slide\SlideMaster[] + * @var array|ArrayObject */ protected $slideMasters; @@ -88,10 +89,10 @@ public function __construct() /** * Get properties * - * @return \PhpOffice\PhpPresentation\DocumentProperties + * @return DocumentProperties * @deprecated for getDocumentProperties */ - public function getProperties() + public function getProperties(): DocumentProperties { return $this->getDocumentProperties(); } @@ -99,11 +100,11 @@ public function getProperties() /** * Set properties * - * @param \PhpOffice\PhpPresentation\DocumentProperties $value + * @param DocumentProperties $value * @deprecated for setDocumentProperties - * @return PhpPresentation + * @return self */ - public function setProperties(DocumentProperties $value) + public function setProperties(DocumentProperties $value): self { return $this->setDocumentProperties($value); } @@ -111,9 +112,9 @@ public function setProperties(DocumentProperties $value) /** * Get properties * - * @return \PhpOffice\PhpPresentation\DocumentProperties + * @return DocumentProperties */ - public function getDocumentProperties() + public function getDocumentProperties(): DocumentProperties { return $this->documentProperties; } @@ -121,10 +122,10 @@ public function getDocumentProperties() /** * Set properties * - * @param \PhpOffice\PhpPresentation\DocumentProperties $value - * @return PhpPresentation + * @param DocumentProperties $value + * @return self */ - public function setDocumentProperties(DocumentProperties $value) + public function setDocumentProperties(DocumentProperties $value): self { $this->documentProperties = $value; @@ -134,9 +135,9 @@ public function setDocumentProperties(DocumentProperties $value) /** * Get presentation properties * - * @return \PhpOffice\PhpPresentation\PresentationProperties + * @return PresentationProperties */ - public function getPresentationProperties() + public function getPresentationProperties(): PresentationProperties { return $this->presentationProps; } @@ -144,10 +145,10 @@ public function getPresentationProperties() /** * Set presentation properties * - * @param \PhpOffice\PhpPresentation\PresentationProperties $value + * @param PresentationProperties $value * @return PhpPresentation */ - public function setPresentationProperties(PresentationProperties $value) + public function setPresentationProperties(PresentationProperties $value): self { $this->presentationProps = $value; return $this; @@ -156,9 +157,9 @@ public function setPresentationProperties(PresentationProperties $value) /** * Get layout * - * @return \PhpOffice\PhpPresentation\DocumentLayout + * @return DocumentLayout */ - public function getLayout() + public function getLayout(): DocumentLayout { return $this->layout; } @@ -166,10 +167,10 @@ public function getLayout() /** * Set layout * - * @param \PhpOffice\PhpPresentation\DocumentLayout $value - * @return PhpPresentation + * @param DocumentLayout $value + * @return self */ - public function setLayout(DocumentLayout $value) + public function setLayout(DocumentLayout $value): self { $this->layout = $value; @@ -179,9 +180,9 @@ public function setLayout(DocumentLayout $value) /** * Get active slide * - * @return \PhpOffice\PhpPresentation\Slide + * @return Slide */ - public function getActiveSlide() + public function getActiveSlide(): Slide { return $this->slideCollection[$this->activeSlideIndex]; } @@ -189,10 +190,10 @@ public function getActiveSlide() /** * Create slide and add it to this presentation * - * @return \PhpOffice\PhpPresentation\Slide + * @return Slide * @throws \Exception */ - public function createSlide() + public function createSlide(): Slide { $newSlide = new Slide($this); $this->addSlide($newSlide); @@ -202,11 +203,11 @@ public function createSlide() /** * Add slide * - * @param \PhpOffice\PhpPresentation\Slide $slide + * @param Slide $slide * @throws \Exception - * @return \PhpOffice\PhpPresentation\Slide + * @return Slide */ - public function addSlide(Slide $slide = null) + public function addSlide(Slide $slide): Slide { $this->slideCollection[] = $slide; @@ -216,11 +217,11 @@ public function addSlide(Slide $slide = null) /** * Remove slide by index * - * @param int $index Slide index + * @param int $index Slide index * @throws \Exception - * @return PhpPresentation + * @return self */ - public function removeSlideByIndex($index = 0) + public function removeSlideByIndex(int $index = 0): self { if ($index > count($this->slideCollection) - 1) { throw new \Exception("Slide index is out of bounds."); @@ -233,11 +234,11 @@ public function removeSlideByIndex($index = 0) /** * Get slide by index * - * @param int $index Slide index - * @return \PhpOffice\PhpPresentation\Slide + * @param int $index Slide index + * @return Slide * @throws \Exception */ - public function getSlide($index = 0) + public function getSlide(int $index = 0): Slide { if ($index > count($this->slideCollection) - 1) { throw new \Exception("Slide index is out of bounds."); @@ -248,9 +249,9 @@ public function getSlide($index = 0) /** * Get all slides * - * @return \PhpOffice\PhpPresentation\Slide[] + * @return array */ - public function getAllSlides() + public function getAllSlides(): array { return $this->slideCollection; } @@ -258,20 +259,21 @@ public function getAllSlides() /** * Get index for slide * - * @param \PhpOffice\PhpPresentation\Slide\AbstractSlide $slide - * @return int + * @param Slide\AbstractSlide $slide + * @return int|null * @throws \Exception */ - public function getIndex(Slide\AbstractSlide $slide) + public function getIndex(Slide\AbstractSlide $slide): ?int { - $index = null; + if (empty($this->slideCollection)) { + return null; + } foreach ($this->slideCollection as $key => $value) { if ($value->getHashCode() == $slide->getHashCode()) { - $index = $key; - break; + return $key; } } - return $index; + return null; } /** @@ -279,7 +281,7 @@ public function getIndex(Slide\AbstractSlide $slide) * * @return int */ - public function getSlideCount() + public function getSlideCount(): int { return count($this->slideCollection); } @@ -289,7 +291,7 @@ public function getSlideCount() * * @return int Active slide index */ - public function getActiveSlideIndex() + public function getActiveSlideIndex(): int { return $this->activeSlideIndex; } @@ -297,11 +299,11 @@ public function getActiveSlideIndex() /** * Set active slide index * - * @param int $index Active slide index + * @param int $index Active slide index * @throws \Exception - * @return \PhpOffice\PhpPresentation\Slide + * @return Slide */ - public function setActiveSlideIndex($index = 0) + public function setActiveSlideIndex(int $index = 0): Slide { if ($index > count($this->slideCollection) - 1) { throw new \Exception("Active slide index is out of bounds."); @@ -314,11 +316,11 @@ public function setActiveSlideIndex($index = 0) /** * Add external slide * - * @param \PhpOffice\PhpPresentation\Slide $slide External slide to add + * @param Slide $slide External slide to add * @throws \Exception - * @return \PhpOffice\PhpPresentation\Slide + * @return Slide */ - public function addExternalSlide(Slide $slide) + public function addExternalSlide(Slide $slide): Slide { $slide->rebindParent($this); @@ -330,9 +332,9 @@ public function addExternalSlide(Slide $slide) /** * Get slide iterator * - * @return \PhpOffice\PhpPresentation\Slide\Iterator + * @return Iterator */ - public function getSlideIterator() + public function getSlideIterator(): Iterator { return new Iterator($this); } @@ -340,10 +342,10 @@ public function getSlideIterator() /** * Create a masterslide and add it to this presentation * - * @return \PhpOffice\PhpPresentation\Slide\SlideMaster + * @return SlideMaster * @throws \Exception */ - public function createMasterSlide() + public function createMasterSlide(): SlideMaster { $newMasterSlide = new SlideMaster($this); $this->addMasterSlide($newMasterSlide); @@ -353,11 +355,11 @@ public function createMasterSlide() /** * Add masterslide * - * @param \PhpOffice\PhpPresentation\Slide\SlideMaster $slide - * @return \PhpOffice\PhpPresentation\Slide\SlideMaster + * @param SlideMaster $slide + * @return SlideMaster * @throws \Exception */ - public function addMasterSlide(SlideMaster $slide = null) + public function addMasterSlide(SlideMaster $slide): SlideMaster { $this->slideMasters[] = $slide; @@ -370,7 +372,7 @@ public function addMasterSlide(SlideMaster $slide = null) * @return PhpPresentation * @throws \Exception */ - public function copy() + public function copy(): PhpPresentation { $copied = clone $this; @@ -389,7 +391,7 @@ public function copy() * @return PresentationProperties * @deprecated for getPresentationProperties()->markAsFinal() */ - public function markAsFinal($state = true) + public function markAsFinal(bool $state = true): PresentationProperties { return $this->getPresentationProperties()->markAsFinal($state); } @@ -399,7 +401,7 @@ public function markAsFinal($state = true) * @return bool * @deprecated for getPresentationProperties()->isMarkedAsFinal() */ - public function isMarkedAsFinal() + public function isMarkedAsFinal(): bool { return $this->getPresentationProperties()->isMarkedAsFinal(); } @@ -410,7 +412,7 @@ public function isMarkedAsFinal() * @return PresentationProperties * @deprecated for getPresentationProperties()->setZoom() */ - public function setZoom($zoom = 1.0) + public function setZoom(float $zoom = 1.0): PresentationProperties { return $this->getPresentationProperties()->setZoom($zoom); } @@ -420,13 +422,13 @@ public function setZoom($zoom = 1.0) * @return float * @deprecated for getPresentationProperties()->getZoom() */ - public function getZoom() + public function getZoom(): float { return $this->getPresentationProperties()->getZoom(); } /** - * @return \ArrayObject|Slide\SlideMaster[] + * @return array|ArrayObject */ public function getAllMasterSlides() { @@ -434,12 +436,12 @@ public function getAllMasterSlides() } /** - * @param \ArrayObject|Slide\SlideMaster[] $slideMasters - * @return $this + * @param array|ArrayObject $slideMasters + * @return self */ - public function setAllMasterSlides($slideMasters = array()) + public function setAllMasterSlides($slideMasters = array()): self { - if ($slideMasters instanceof \ArrayObject || is_array($slideMasters)) { + if ($slideMasters instanceof ArrayObject || is_array($slideMasters)) { $this->slideMasters = $slideMasters; } return $this; diff --git a/src/PhpPresentation/PresentationProperties.php b/src/PhpPresentation/PresentationProperties.php index 69da1a386f..d879dec47f 100644 --- a/src/PhpPresentation/PresentationProperties.php +++ b/src/PhpPresentation/PresentationProperties.php @@ -31,6 +31,9 @@ class PresentationProperties public const VIEW_SLIDE_SORTER = 'sldSorterView'; public const VIEW_SLIDE_THUMBNAIL = 'sldThumbnailView'; + /** + * @var array + */ protected $arrayView = array( self::VIEW_HANDOUT, self::VIEW_NOTES, @@ -42,8 +45,8 @@ class PresentationProperties self::VIEW_SLIDE_THUMBNAIL, ); - /* - * @var boolean + /** + * @var bool */ protected $isLoopUntilEsc = false; @@ -53,7 +56,7 @@ class PresentationProperties */ protected $markAsFinal = false; - /* + /** * @var string */ protected $thumbnail; @@ -62,35 +65,33 @@ class PresentationProperties * Zoom * @var float */ - protected $zoom = 1; + protected $zoom = 1.0; - /* + /** * @var string */ protected $lastView = self::VIEW_SLIDE; - /* - * @var boolean + /** + * @var bool */ protected $isCommentVisible = false; /** * @return bool */ - public function isLoopContinuouslyUntilEsc() + public function isLoopContinuouslyUntilEsc(): bool { return $this->isLoopUntilEsc; } /** * @param bool $value - * @return \PhpOffice\PhpPresentation\PresentationProperties + * @return self */ - public function setLoopContinuouslyUntilEsc($value = false) + public function setLoopContinuouslyUntilEsc(bool $value = false): self { - if (is_bool($value)) { - $this->isLoopUntilEsc = $value; - } + $this->isLoopUntilEsc = $value; return $this; } @@ -119,13 +120,11 @@ public function setThumbnailPath($path = '') /** * Mark a document as final * @param bool $state - * @return PresentationProperties + * @return self */ - public function markAsFinal($state = true) + public function markAsFinal(bool $state = true): self { - if (is_bool($state)) { - $this->markAsFinal = $state; - } + $this->markAsFinal = $state; return $this; } @@ -141,13 +140,11 @@ public function isMarkedAsFinal() /** * Set the zoom of the document (in percentage) * @param float $zoom - * @return PresentationProperties + * @return self */ - public function setZoom($zoom = 1.0) + public function setZoom(float $zoom = 1.0): self { - if (is_numeric($zoom)) { - $this->zoom = (float)$zoom; - } + $this->zoom = $zoom; return $this; } @@ -155,7 +152,7 @@ public function setZoom($zoom = 1.0) * Return the zoom (in percentage) * @return float */ - public function getZoom() + public function getZoom(): float { return $this->zoom; } @@ -182,20 +179,18 @@ public function getLastView() /** * @param bool $value - * @return $this + * @return self */ - public function setCommentVisible($value = false) + public function setCommentVisible(bool $value = false): self { - if (is_bool($value)) { - $this->isCommentVisible = $value; - } + $this->isCommentVisible = $value; return $this; } /** - * @return string + * @return bool */ - public function isCommentVisible() + public function isCommentVisible(): bool { return $this->isCommentVisible; } diff --git a/src/PhpPresentation/Reader/ODPresentation.php b/src/PhpPresentation/Reader/ODPresentation.php index 73eb53d6ca..d122f1c4a0 100644 --- a/src/PhpPresentation/Reader/ODPresentation.php +++ b/src/PhpPresentation/Reader/ODPresentation.php @@ -17,6 +17,8 @@ namespace PhpOffice\PhpPresentation\Reader; +use DateTime; +use DOMElement; use ZipArchive; use PhpOffice\Common\XMLReader; use PhpOffice\Common\Drawing as CommonDrawing; @@ -59,15 +61,19 @@ class ODPresentation implements ReaderInterface * @var \PhpOffice\Common\XMLReader */ protected $oXMLReader; + /** + * @var int + */ + protected $levelParagraph = 0; /** * Can the current \PhpOffice\PhpPresentation\Reader\ReaderInterface read the file? * - * @param string $pFilename + * @param string $pFilename * @throws \Exception * @return boolean */ - public function canRead($pFilename) + public function canRead(string $pFilename): bool { return $this->fileSupportsUnserializePhpPresentation($pFilename); } @@ -75,11 +81,11 @@ public function canRead($pFilename) /** * Does a file support UnserializePhpPresentation ? * - * @param string $pFilename + * @param string $pFilename * @throws \Exception * @return boolean */ - public function fileSupportsUnserializePhpPresentation($pFilename = '') + public function fileSupportsUnserializePhpPresentation(string $pFilename = ''): bool { // Check if file exists if (!file_exists($pFilename)) { @@ -101,11 +107,11 @@ public function fileSupportsUnserializePhpPresentation($pFilename = '') /** * Loads PhpPresentation Serialized file * - * @param string $pFilename + * @param string $pFilename * @return \PhpOffice\PhpPresentation\PhpPresentation * @throws \Exception */ - public function load($pFilename) + public function load(string $pFilename): PhpPresentation { // Unserialize... First make sure the file supports it! if (!$this->fileSupportsUnserializePhpPresentation($pFilename)) { @@ -118,7 +124,7 @@ public function load($pFilename) /** * Load PhpPresentation Serialized file * - * @param string $pFilename + * @param string $pFilename * @return \PhpOffice\PhpPresentation\PhpPresentation * @throws \Exception */ @@ -149,7 +155,7 @@ protected function loadFile($pFilename) /** * Read Document Properties */ - protected function loadDocumentProperties() + protected function loadDocumentProperties(): void { $arrayProperties = array( '/office:document-meta/office:meta/meta:initial-creator' => 'setCreator', @@ -164,14 +170,16 @@ protected function loadDocumentProperties() $oProperties = $this->oPhpPresentation->getDocumentProperties(); foreach ($arrayProperties as $path => $property) { $oElement = $this->oXMLReader->getElement($path); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { + $value = $oElement->nodeValue; if (in_array($property, array('setCreated', 'setModified'))) { - $oDateTime = new \DateTime(); - $oDateTime->createFromFormat(\DateTime::W3C, $oElement->nodeValue); - $oProperties->{$property}($oDateTime->getTimestamp()); - } else { - $oProperties->{$property}($oElement->nodeValue); + $dateTime = DateTime::createFromFormat(DateTime::W3C, $value); + if (!$dateTime) { + $dateTime = new DateTime(); + } + $value = $dateTime->getTimestamp(); } + $oProperties->{$property}($value); } } } @@ -179,15 +187,15 @@ protected function loadDocumentProperties() /** * Extract all slides */ - protected function loadSlides() + protected function loadSlides(): void { foreach ($this->oXMLReader->getElements('/office:document-content/office:automatic-styles/*') as $oElement) { - if ($oElement->hasAttribute('style:name')) { + if ($oElement instanceof DOMElement && $oElement->hasAttribute('style:name')) { $this->loadStyle($oElement); } } foreach ($this->oXMLReader->getElements('/office:document-content/office:body/office:presentation/draw:page') as $oElement) { - if ($oElement->nodeName == 'draw:page') { + if ($oElement instanceof DOMElement && $oElement->nodeName == 'draw:page') { $this->loadSlide($oElement); } } @@ -195,16 +203,16 @@ protected function loadSlides() /** * Extract style - * @param \DOMElement $nodeStyle + * @param DOMElement $nodeStyle * @return bool * @throws \Exception */ - protected function loadStyle(\DOMElement $nodeStyle) + protected function loadStyle(DOMElement $nodeStyle) { $keyStyle = $nodeStyle->getAttribute('style:name'); $nodeDrawingPageProps = $this->oXMLReader->getElement('style:drawing-page-properties', $nodeStyle); - if ($nodeDrawingPageProps instanceof \DOMElement) { + if ($nodeDrawingPageProps instanceof DOMElement) { // Read Background Color if ($nodeDrawingPageProps->hasAttribute('draw:fill-color') && $nodeDrawingPageProps->getAttribute('draw:fill') == 'solid') { $oBackground = new \PhpOffice\PhpPresentation\Slide\Background\Color(); @@ -227,7 +235,7 @@ protected function loadStyle(\DOMElement $nodeStyle) } $nodeGraphicProps = $this->oXMLReader->getElement('style:graphic-properties', $nodeStyle); - if ($nodeGraphicProps instanceof \DOMElement) { + if ($nodeGraphicProps instanceof DOMElement) { // Read Shadow if ($nodeGraphicProps->hasAttribute('draw:shadow') && $nodeGraphicProps->getAttribute('draw:shadow') == 'visible') { $oShadow = new Shadow(); @@ -239,16 +247,16 @@ protected function loadStyle(\DOMElement $nodeStyle) $oShadow->setAlpha(100 - (int)substr($nodeGraphicProps->getAttribute('draw:shadow-opacity'), 0, -1)); } if ($nodeGraphicProps->hasAttribute('draw:shadow-offset-x') && $nodeGraphicProps->hasAttribute('draw:shadow-offset-y')) { - $offsetX = substr($nodeGraphicProps->getAttribute('draw:shadow-offset-x'), 0, -2); - $offsetY = substr($nodeGraphicProps->getAttribute('draw:shadow-offset-y'), 0, -2); + $offsetX = (float) substr($nodeGraphicProps->getAttribute('draw:shadow-offset-x'), 0, -2); + $offsetY = (float) substr($nodeGraphicProps->getAttribute('draw:shadow-offset-y'), 0, -2); $distance = 0; if ($offsetX != 0) { $distance = ($offsetX < 0 ? $offsetX * -1 : $offsetX); } elseif ($offsetY != 0) { $distance = ($offsetY < 0 ? $offsetY * -1 : $offsetY); } - $oShadow->setDirection(rad2deg(atan2($offsetY, $offsetX))); - $oShadow->setDistance(CommonDrawing::centimetersToPixels($distance)); + $oShadow->setDirection((int) rad2deg(atan2($offsetY, $offsetX))); + $oShadow->setDistance((int) round(CommonDrawing::centimetersToPixels($distance))); } } // Read Fill @@ -274,7 +282,7 @@ protected function loadStyle(\DOMElement $nodeStyle) } $nodeTextProperties = $this->oXMLReader->getElement('style:text-properties', $nodeStyle); - if ($nodeTextProperties instanceof \DOMElement) { + if ($nodeTextProperties instanceof DOMElement) { $oFont = new Font(); if ($nodeTextProperties->hasAttribute('fo:color')) { $oFont->getColor()->setRGB(substr($nodeTextProperties->getAttribute('fo:color'), -6)); @@ -286,12 +294,12 @@ protected function loadStyle(\DOMElement $nodeStyle) $oFont->setBold(true); } if ($nodeTextProperties->hasAttribute('fo:font-size')) { - $oFont->setSize(substr($nodeTextProperties->getAttribute('fo:font-size'), 0, -2)); + $oFont->setSize((int) substr($nodeTextProperties->getAttribute('fo:font-size'), 0, -2)); } } $nodeParagraphProps = $this->oXMLReader->getElement('style:paragraph-properties', $nodeStyle); - if ($nodeParagraphProps instanceof \DOMElement) { + if ($nodeParagraphProps instanceof DOMElement) { $oAlignment = new Alignment(); if ($nodeParagraphProps->hasAttribute('fo:text-align')) { $oAlignment->setHorizontal($nodeParagraphProps->getAttribute('fo:text-align')); @@ -304,29 +312,32 @@ protected function loadStyle(\DOMElement $nodeStyle) $oAlignment = new Alignment(); $oBullet = new Bullet(); $oBullet->setBulletType(Bullet::TYPE_NONE); - if ($oNodeListLevel->hasAttribute('text:level')) { - $oAlignment->setLevel((int) $oNodeListLevel->getAttribute('text:level') - 1); - } - if ($oNodeListLevel->hasAttribute('text:bullet-char')) { - $oBullet->setBulletChar($oNodeListLevel->getAttribute('text:bullet-char')); - $oBullet->setBulletType(Bullet::TYPE_BULLET); - } - - $oNodeListProperties = $this->oXMLReader->getElement('style:list-level-properties', $oNodeListLevel); - if ($oNodeListProperties instanceof \DOMElement) { - if ($oNodeListProperties->hasAttribute('text:min-label-width')) { - $oAlignment->setIndent((int)round(CommonDrawing::centimetersToPixels(substr($oNodeListProperties->getAttribute('text:min-label-width'), 0, -2)))); + if ($oNodeListLevel instanceof DOMElement) { + if ($oNodeListLevel->hasAttribute('text:level')) { + $oAlignment->setLevel((int) $oNodeListLevel->getAttribute('text:level') - 1); } - if ($oNodeListProperties->hasAttribute('text:space-before')) { - $iSpaceBefore = CommonDrawing::centimetersToPixels(substr($oNodeListProperties->getAttribute('text:space-before'), 0, -2)); - $iMarginLeft = $iSpaceBefore + $oAlignment->getIndent(); - $oAlignment->setMarginLeft($iMarginLeft); + if ($oNodeListLevel->hasAttribute('text:bullet-char')) { + $oBullet->setBulletChar($oNodeListLevel->getAttribute('text:bullet-char')); + $oBullet->setBulletType(Bullet::TYPE_BULLET); } - } - $oNodeTextProperties = $this->oXMLReader->getElement('style:text-properties', $oNodeListLevel); - if ($oNodeTextProperties instanceof \DOMElement) { - if ($oNodeTextProperties->hasAttribute('fo:font-family')) { - $oBullet->setBulletFont($oNodeTextProperties->getAttribute('fo:font-family')); + + $oNodeListProperties = $this->oXMLReader->getElement('style:list-level-properties', $oNodeListLevel); + if ($oNodeListProperties instanceof DOMElement) { + if ($oNodeListProperties->hasAttribute('text:min-label-width')) { + $oAlignment->setIndent((int)round(CommonDrawing::centimetersToPixels(substr($oNodeListProperties->getAttribute('text:min-label-width'), 0, -2)))); + } + if ($oNodeListProperties->hasAttribute('text:space-before')) { + $iSpaceBefore = (int) CommonDrawing::centimetersToPixels(substr($oNodeListProperties->getAttribute('text:space-before'), 0, -2)); + $iMarginLeft = $iSpaceBefore + $oAlignment->getIndent(); + $oAlignment->setMarginLeft($iMarginLeft); + } + } + + $oNodeTextProperties = $this->oXMLReader->getElement('style:text-properties', $oNodeListLevel); + if ($oNodeTextProperties instanceof DOMElement) { + if ($oNodeTextProperties->hasAttribute('fo:font-family')) { + $oBullet->setBulletFont($oNodeTextProperties->getAttribute('fo:font-family')); + } } } @@ -352,11 +363,11 @@ protected function loadStyle(\DOMElement $nodeStyle) /** * Read Slide * - * @param \DOMElement $nodeSlide + * @param DOMElement $nodeSlide * @return bool * @throws \Exception */ - protected function loadSlide(\DOMElement $nodeSlide) + protected function loadSlide(DOMElement $nodeSlide): bool { // Core $this->oPhpPresentation->createSlide(); @@ -371,13 +382,15 @@ protected function loadSlide(\DOMElement $nodeSlide) } } foreach ($this->oXMLReader->getElements('draw:frame', $nodeSlide) as $oNodeFrame) { - if ($this->oXMLReader->getElement('draw:image', $oNodeFrame)) { - $this->loadShapeDrawing($oNodeFrame); - continue; - } - if ($this->oXMLReader->getElement('draw:text-box', $oNodeFrame)) { - $this->loadShapeRichText($oNodeFrame); - continue; + if ($oNodeFrame instanceof DOMElement) { + if ($this->oXMLReader->getElement('draw:image', $oNodeFrame)) { + $this->loadShapeDrawing($oNodeFrame); + continue; + } + if ($this->oXMLReader->getElement('draw:text-box', $oNodeFrame)) { + $this->loadShapeRichText($oNodeFrame); + continue; + } } } return true; @@ -386,17 +399,17 @@ protected function loadSlide(\DOMElement $nodeSlide) /** * Read Shape Drawing * - * @param \DOMElement $oNodeFrame + * @param DOMElement $oNodeFrame * @throws \Exception */ - protected function loadShapeDrawing(\DOMElement $oNodeFrame) + protected function loadShapeDrawing(DOMElement $oNodeFrame): void { // Core $oShape = new Gd(); $oShape->getShadow()->setVisible(false); $oNodeImage = $this->oXMLReader->getElement('draw:image', $oNodeFrame); - if ($oNodeImage instanceof \DOMElement) { + if ($oNodeImage instanceof DOMElement) { if ($oNodeImage->hasAttribute('xlink:href')) { $sFilename = $oNodeImage->getAttribute('xlink:href'); // svm = StarView Metafile @@ -433,10 +446,10 @@ protected function loadShapeDrawing(\DOMElement $oNodeFrame) /** * Read Shape RichText * - * @param \DOMElement $oNodeFrame + * @param DOMElement $oNodeFrame * @throws \Exception */ - protected function loadShapeRichText(\DOMElement $oNodeFrame) + protected function loadShapeRichText(DOMElement $oNodeFrame): void { // Core $oShape = $this->oPhpPresentation->getActiveSlide()->createRichTextShape(); @@ -449,11 +462,13 @@ protected function loadShapeRichText(\DOMElement $oNodeFrame) foreach ($this->oXMLReader->getElements('draw:text-box/*', $oNodeFrame) as $oNodeParagraph) { $this->levelParagraph = 0; - if ($oNodeParagraph->nodeName == 'text:p') { - $this->readParagraph($oShape, $oNodeParagraph); - } - if ($oNodeParagraph->nodeName == 'text:list') { - $this->readList($oShape, $oNodeParagraph); + if ($oNodeParagraph instanceof DOMElement) { + if ($oNodeParagraph->nodeName == 'text:p') { + $this->readParagraph($oShape, $oNodeParagraph); + } + if ($oNodeParagraph->nodeName == 'text:list') { + $this->readList($oShape, $oNodeParagraph); + } } } @@ -462,15 +477,13 @@ protected function loadShapeRichText(\DOMElement $oNodeFrame) } } - protected $levelParagraph = 0; - /** * Read Paragraph * @param RichText $oShape - * @param \DOMElement $oNodeParent + * @param DOMElement $oNodeParent * @throws \Exception */ - protected function readParagraph(RichText $oShape, \DOMElement $oNodeParent) + protected function readParagraph(RichText $oShape, DOMElement $oNodeParent): void { $oParagraph = $oShape->createParagraph(); $oDomList = $this->oXMLReader->getElements('text:span', $oNodeParent); @@ -482,17 +495,19 @@ protected function readParagraph(RichText $oShape, \DOMElement $oNodeParent) } } foreach ($oDomList as $oNodeRichTextElement) { - $this->readParagraphItem($oParagraph, $oNodeRichTextElement); + if ($oNodeRichTextElement instanceof DOMElement) { + $this->readParagraphItem($oParagraph, $oNodeRichTextElement); + } } } /** * Read Paragraph Item * @param Paragraph $oParagraph - * @param \DOMElement $oNodeParent + * @param DOMElement $oNodeParent * @throws \Exception */ - protected function readParagraphItem(Paragraph $oParagraph, \DOMElement $oNodeParent) + protected function readParagraphItem(Paragraph $oParagraph, DOMElement $oNodeParent): void { if ($this->oXMLReader->elementExists('text:line-break', $oNodeParent)) { $oParagraph->createBreak(); @@ -505,7 +520,7 @@ protected function readParagraphItem(Paragraph $oParagraph, \DOMElement $oNodePa } } $oTextRunLink = $this->oXMLReader->getElement('text:a', $oNodeParent); - if ($oTextRunLink instanceof \DOMElement) { + if ($oTextRunLink instanceof DOMElement) { $oTextRun->setText($oTextRunLink->nodeValue); if ($oTextRunLink->hasAttribute('xlink:href')) { $oTextRun->getHyperlink()->setUrl($oTextRunLink->getAttribute('xlink:href')); @@ -520,19 +535,21 @@ protected function readParagraphItem(Paragraph $oParagraph, \DOMElement $oNodePa * Read List * * @param RichText $oShape - * @param \DOMElement $oNodeParent + * @param DOMElement $oNodeParent * @throws \Exception */ - protected function readList(RichText $oShape, \DOMElement $oNodeParent) + protected function readList(RichText $oShape, DOMElement $oNodeParent): void { foreach ($this->oXMLReader->getElements('text:list-item/*', $oNodeParent) as $oNodeListItem) { - if ($oNodeListItem->nodeName == 'text:p') { - $this->readListItem($oShape, $oNodeListItem, $oNodeParent); - } - if ($oNodeListItem->nodeName == 'text:list') { - $this->levelParagraph++; - $this->readList($oShape, $oNodeListItem); - $this->levelParagraph--; + if ($oNodeListItem instanceof DOMElement) { + if ($oNodeListItem->nodeName == 'text:p') { + $this->readListItem($oShape, $oNodeListItem, $oNodeParent); + } + if ($oNodeListItem->nodeName == 'text:list') { + $this->levelParagraph++; + $this->readList($oShape, $oNodeListItem); + $this->levelParagraph--; + } } } } @@ -540,11 +557,11 @@ protected function readList(RichText $oShape, \DOMElement $oNodeParent) /** * Read List Item * @param RichText $oShape - * @param \DOMElement $oNodeParent - * @param \DOMElement $oNodeParagraph + * @param DOMElement $oNodeParent + * @param DOMElement $oNodeParagraph * @throws \Exception */ - protected function readListItem(RichText $oShape, \DOMElement $oNodeParent, \DOMElement $oNodeParagraph) + protected function readListItem(RichText $oShape, DOMElement $oNodeParent, DOMElement $oNodeParagraph): void { $oParagraph = $oShape->createParagraph(); if ($oNodeParagraph->hasAttribute('text:style-name')) { @@ -555,17 +572,19 @@ protected function readListItem(RichText $oShape, \DOMElement $oNodeParent, \DOM } } foreach ($this->oXMLReader->getElements('text:span', $oNodeParent) as $oNodeRichTextElement) { - $this->readParagraphItem($oParagraph, $oNodeRichTextElement); + if ($oNodeRichTextElement instanceof DOMElement) { + $this->readParagraphItem($oParagraph, $oNodeRichTextElement); + } } } /** * Load file 'styles.xml' */ - protected function loadStylesFile() + protected function loadStylesFile(): void { foreach ($this->oXMLReader->getElements('/office:document-styles/office:styles/*') as $oElement) { - if ($oElement->nodeName == 'draw:fill-image') { + if ($oElement instanceof DOMElement && $oElement->nodeName == 'draw:fill-image') { $this->arrayCommonStyles[$oElement->getAttribute('draw:name')] = array( 'type' => 'image', 'path' => $oElement->hasAttribute('xlink:href') ? $oElement->getAttribute('xlink:href') : null diff --git a/src/PhpPresentation/Reader/PowerPoint2007.php b/src/PhpPresentation/Reader/PowerPoint2007.php index aa3b847acc..1fc4b8e2a9 100644 --- a/src/PhpPresentation/Reader/PowerPoint2007.php +++ b/src/PhpPresentation/Reader/PowerPoint2007.php @@ -17,6 +17,10 @@ namespace PhpOffice\PhpPresentation\Reader; +use DateTime; +use DOMElement; +use DOMNode; +use DOMNodeList; use PhpOffice\PhpPresentation\DocumentLayout; use PhpOffice\PhpPresentation\PhpPresentation; use PhpOffice\PhpPresentation\Shape\Placeholder; @@ -25,6 +29,7 @@ use PhpOffice\PhpPresentation\Shape\Table\Cell; use PhpOffice\PhpPresentation\Slide; use PhpOffice\PhpPresentation\Slide\AbstractSlide; +use PhpOffice\PhpPresentation\Slide\Note; use PhpOffice\PhpPresentation\Slide\SlideLayout; use PhpOffice\PhpPresentation\Slide\SlideMaster; use PhpOffice\PhpPresentation\Shape\Drawing\Gd; @@ -62,11 +67,11 @@ class PowerPoint2007 implements ReaderInterface * @var SlideLayout[] */ protected $arraySlideLayouts = array(); - /* + /** * @var string */ protected $filename; - /* + /** * @var string */ protected $fileRels; @@ -74,11 +79,11 @@ class PowerPoint2007 implements ReaderInterface /** * Can the current \PhpOffice\PhpPresentation\Reader\ReaderInterface read the file? * - * @param string $pFilename + * @param string $pFilename * @throws \Exception * @return boolean */ - public function canRead($pFilename) + public function canRead(string $pFilename): bool { return $this->fileSupportsUnserializePhpPresentation($pFilename); } @@ -86,11 +91,11 @@ public function canRead($pFilename) /** * Does a file support UnserializePhpPresentation ? * - * @param string $pFilename + * @param string $pFilename * @throws \Exception * @return boolean */ - public function fileSupportsUnserializePhpPresentation($pFilename = '') + public function fileSupportsUnserializePhpPresentation(string $pFilename = ''): bool { // Check if file exists if (!file_exists($pFilename)) { @@ -112,11 +117,11 @@ public function fileSupportsUnserializePhpPresentation($pFilename = '') /** * Loads PhpPresentation Serialized file * - * @param string $pFilename - * @return \PhpOffice\PhpPresentation\PhpPresentation + * @param string $pFilename + * @return PhpPresentation * @throws \Exception */ - public function load($pFilename) + public function load(string $pFilename): PhpPresentation { // Unserialize... First make sure the file supports it! if (!$this->fileSupportsUnserializePhpPresentation($pFilename)) { @@ -129,11 +134,11 @@ public function load($pFilename) /** * Load PhpPresentation Serialized file * - * @param string $pFilename - * @return \PhpOffice\PhpPresentation\PhpPresentation + * @param string $pFilename + * @return PhpPresentation * @throws \Exception */ - protected function loadFile($pFilename) + protected function loadFile(string $pFilename): PhpPresentation { $this->oPhpPresentation = new PhpPresentation(); $this->oPhpPresentation->removeSlideByIndex(); @@ -168,21 +173,22 @@ protected function loadFile($pFilename) /** * Read Document Layout - * @param $sPart + * @param string $sPart */ - protected function loadDocumentLayout($sPart) + protected function loadDocumentLayout(string $sPart): void { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { foreach ($xmlReader->getElements('/p:presentation/p:sldSz') as $oElement) { - if (!($oElement instanceof \DOMElement)) { + if (!($oElement instanceof DOMElement)) { continue; } $type = $oElement->getAttribute('type'); $oLayout = $this->oPhpPresentation->getLayout(); if ($type == DocumentLayout::LAYOUT_CUSTOM) { - $oLayout->setCX($oElement->getAttribute('cx')); - $oLayout->setCY($oElement->getAttribute('cy')); + $oLayout->setCX((float) $oElement->getAttribute('cx')); + $oLayout->setCY((float) $oElement->getAttribute('cy')); } else { $oLayout->setDocumentLayout($type, true); if ($oElement->getAttribute('cx') < $oElement->getAttribute('cy')) { @@ -197,9 +203,10 @@ protected function loadDocumentLayout($sPart) * Read Document Properties * @param string $sPart */ - protected function loadDocumentProperties($sPart) + protected function loadDocumentProperties(string $sPart): void { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { $arrayProperties = array( '/cp:coreProperties/dc:creator' => 'setCreator', @@ -215,11 +222,10 @@ protected function loadDocumentProperties($sPart) $oProperties = $this->oPhpPresentation->getDocumentProperties(); foreach ($arrayProperties as $path => $property) { $oElement = $xmlReader->getElement($path); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('xsi:type') && $oElement->getAttribute('xsi:type') == 'dcterms:W3CDTF') { - $oDateTime = new \DateTime(); - $oDateTime->createFromFormat(\DateTime::W3C, $oElement->nodeValue); - $oProperties->{$property}($oDateTime->getTimestamp()); + $dateTime = DateTime::createFromFormat(DateTime::W3C, $oElement->nodeValue); + $oProperties->{$property}($dateTime->getTimestamp()); } else { $oProperties->{$property}($oElement->nodeValue); } @@ -232,10 +238,11 @@ protected function loadDocumentProperties($sPart) * Read Custom Properties * @param string $sPart */ - protected function loadCustomProperties($sPart) + protected function loadCustomProperties(string $sPart): void { $xmlReader = new XMLReader(); $sPart = str_replace(' xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"', '', $sPart); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { $pathMarkAsFinal = '/Properties/property[@pid="2"][@fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"][@name="_MarkAsFinal"]/vt:bool'; if (is_object($oElement = $xmlReader->getElement($pathMarkAsFinal))) { @@ -250,13 +257,14 @@ protected function loadCustomProperties($sPart) * Read View Properties * @param string $sPart */ - protected function loadViewProperties($sPart) + protected function loadViewProperties(string $sPart): void { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { $pathZoom = '/p:viewPr/p:slideViewPr/p:cSldViewPr/p:cViewPr/p:scale/a:sx'; $oElement = $xmlReader->getElement($pathZoom); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('d') && $oElement->hasAttribute('n')) { $this->oPhpPresentation->getPresentationProperties()->setZoom($oElement->getAttribute('n') / $oElement->getAttribute('d')); } @@ -266,12 +274,13 @@ protected function loadViewProperties($sPart) /** * Extract all slides - * @param $sPart + * @param string $sPart * @throws \Exception */ - protected function loadSlides($sPart) + protected function loadSlides(string $sPart): void { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { $fileRels = 'ppt/_rels/presentation.xml.rels'; $this->loadRels($fileRels); @@ -279,7 +288,7 @@ protected function loadSlides($sPart) $this->loadMasterSlides($xmlReader, $fileRels); // Continue with loading the slides foreach ($xmlReader->getElements('/p:presentation/p:sldIdLst/p:sldId') as $oElement) { - if (!($oElement instanceof \DOMElement)) { + if (!($oElement instanceof DOMElement)) { continue; } $rId = $oElement->getAttribute('r:id'); @@ -307,11 +316,11 @@ protected function loadSlides($sPart) * @param string $fileRels * @throws \Exception */ - protected function loadMasterSlides(XMLReader $xmlReader, $fileRels) + protected function loadMasterSlides(XMLReader $xmlReader, string $fileRels): void { // Get all the MasterSlide Id's from the presentation.xml file foreach ($xmlReader->getElements('/p:presentation/p:sldMasterIdLst/p:sldMasterId') as $oElement) { - if (!($oElement instanceof \DOMElement)) { + if (!($oElement instanceof DOMElement)) { continue; } $rId = $oElement->getAttribute('r:id'); @@ -334,9 +343,10 @@ protected function loadMasterSlides(XMLReader $xmlReader, $fileRels) * @param string $baseFile * @throws \Exception */ - protected function loadSlide($sPart, $baseFile) + protected function loadSlide(string $sPart, string $baseFile): void { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { // Core $oSlide = $this->oPhpPresentation->createSlide(); @@ -345,9 +355,9 @@ protected function loadSlide($sPart, $baseFile) // Background $oElement = $xmlReader->getElement('/p:sld/p:cSld/p:bg/p:bgPr'); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { $oElementColor = $xmlReader->getElement('a:solidFill/a:srgbClr', $oElement); - if ($oElementColor instanceof \DOMElement) { + if ($oElementColor instanceof DOMElement) { // Color $oColor = new Color(); $oColor->setRGB($oElementColor->hasAttribute('val') ? $oElementColor->getAttribute('val') : null); @@ -359,7 +369,7 @@ protected function loadSlide($sPart, $baseFile) $oSlide->setBackground($oBackground); } $oElementColor = $xmlReader->getElement('a:solidFill/a:schemeClr', $oElement); - if ($oElementColor instanceof \DOMElement) { + if ($oElementColor instanceof DOMElement) { // Color $oColor = new SchemeColor(); $oColor->setValue($oElementColor->hasAttribute('val') ? $oElementColor->getAttribute('val') : null); @@ -371,7 +381,7 @@ protected function loadSlide($sPart, $baseFile) $oSlide->setBackground($oBackground); } $oElementImage = $xmlReader->getElement('a:blipFill/a:blip', $oElement); - if ($oElementImage instanceof \DOMElement) { + if ($oElementImage instanceof DOMElement) { $relImg = $this->arrayRels['ppt/slides/_rels/' . $baseFile . '.rels'][$oElementImage->getAttribute('r:embed')]; if (is_array($relImg)) { // File @@ -400,9 +410,7 @@ protected function loadSlide($sPart, $baseFile) // Shapes $arrayElements = $xmlReader->getElements('/p:sld/p:cSld/p:spTree/*'); - if ($arrayElements) { - $this->loadSlideShapes($oSlide, $arrayElements, $xmlReader); - } + $this->loadSlideShapes($oSlide, $arrayElements, $xmlReader); // Layout $oSlide = $this->oPhpPresentation->getActiveSlide(); @@ -423,9 +431,10 @@ protected function loadSlide($sPart, $baseFile) * @param string $baseFile * @throws \Exception */ - protected function loadMasterSlide($sPart, $baseFile) + protected function loadMasterSlide(string $sPart, string $baseFile): void { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { // Core $oSlideMaster = $this->oPhpPresentation->createMasterSlide(); @@ -434,15 +443,14 @@ protected function loadMasterSlide($sPart, $baseFile) // Background $oElement = $xmlReader->getElement('/p:sldMaster/p:cSld/p:bg'); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { $this->loadSlideBackground($xmlReader, $oElement, $oSlideMaster); } // Shapes $arrayElements = $xmlReader->getElements('/p:sldMaster/p:cSld/p:spTree/*'); - if ($arrayElements) { - $this->loadSlideShapes($oSlideMaster, $arrayElements, $xmlReader); - } + $this->loadSlideShapes($oSlideMaster, $arrayElements, $xmlReader); + // Header & Footer // ColorMapping @@ -457,72 +465,70 @@ protected function loadMasterSlide($sPart, $baseFile) // TextStyles $arrayElementTxStyles = $xmlReader->getElements('/p:sldMaster/p:txStyles/*'); - if ($arrayElementTxStyles) { - foreach ($arrayElementTxStyles as $oElementTxStyle) { - $arrayElementsLvl = $xmlReader->getElements('/p:sldMaster/p:txStyles/' . $oElementTxStyle->nodeName . '/*'); - foreach ($arrayElementsLvl as $oElementLvl) { - if (!($oElementLvl instanceof \DOMElement) || $oElementLvl->nodeName == 'a:extLst') { - continue; - } - $oRTParagraph = new Paragraph(); + foreach ($arrayElementTxStyles as $oElementTxStyle) { + $arrayElementsLvl = $xmlReader->getElements('/p:sldMaster/p:txStyles/' . $oElementTxStyle->nodeName . '/*'); + foreach ($arrayElementsLvl as $oElementLvl) { + if (!($oElementLvl instanceof DOMElement) || $oElementLvl->nodeName == 'a:extLst') { + continue; + } + $oRTParagraph = new Paragraph(); - if ($oElementLvl->nodeName == 'a:defPPr') { - $level = 0; - } else { - $level = str_replace('a:lvl', '', $oElementLvl->nodeName); - $level = str_replace('pPr', '', $level); - } + if ($oElementLvl->nodeName == 'a:defPPr') { + $level = 0; + } else { + $level = str_replace('a:lvl', '', $oElementLvl->nodeName); + $level = str_replace('pPr', '', $level); + } - if ($oElementLvl->hasAttribute('algn')) { - $oRTParagraph->getAlignment()->setHorizontal($oElementLvl->getAttribute('algn')); - } - if ($oElementLvl->hasAttribute('marL')) { - $val = $oElementLvl->getAttribute('marL'); - $val = CommonDrawing::emuToPixels($val); - $oRTParagraph->getAlignment()->setMarginLeft($val); - } - if ($oElementLvl->hasAttribute('marR')) { - $val = $oElementLvl->getAttribute('marR'); - $val = CommonDrawing::emuToPixels($val); - $oRTParagraph->getAlignment()->setMarginRight($val); + if ($oElementLvl->hasAttribute('algn')) { + $oRTParagraph->getAlignment()->setHorizontal($oElementLvl->getAttribute('algn')); + } + if ($oElementLvl->hasAttribute('marL')) { + $val = $oElementLvl->getAttribute('marL'); + $val = CommonDrawing::emuToPixels($val); + $oRTParagraph->getAlignment()->setMarginLeft($val); + } + if ($oElementLvl->hasAttribute('marR')) { + $val = $oElementLvl->getAttribute('marR'); + $val = CommonDrawing::emuToPixels($val); + $oRTParagraph->getAlignment()->setMarginRight($val); + } + if ($oElementLvl->hasAttribute('indent')) { + $val = $oElementLvl->getAttribute('indent'); + $val = CommonDrawing::emuToPixels($val); + $oRTParagraph->getAlignment()->setIndent($val); + } + $oElementLvlDefRPR = $xmlReader->getElement('a:defRPr', $oElementLvl); + if ($oElementLvlDefRPR instanceof DOMElement) { + if ($oElementLvlDefRPR->hasAttribute('sz')) { + $oRTParagraph->getFont()->setSize($oElementLvlDefRPR->getAttribute('sz') / 100); } - if ($oElementLvl->hasAttribute('indent')) { - $val = $oElementLvl->getAttribute('indent'); - $val = CommonDrawing::emuToPixels($val); - $oRTParagraph->getAlignment()->setIndent($val); + if ($oElementLvlDefRPR->hasAttribute('b') && $oElementLvlDefRPR->getAttribute('b') == 1) { + $oRTParagraph->getFont()->setBold(true); } - $oElementLvlDefRPR = $xmlReader->getElement('a:defRPr', $oElementLvl); - if ($oElementLvlDefRPR instanceof \DOMElement) { - if ($oElementLvlDefRPR->hasAttribute('sz')) { - $oRTParagraph->getFont()->setSize($oElementLvlDefRPR->getAttribute('sz') / 100); - } - if ($oElementLvlDefRPR->hasAttribute('b') && $oElementLvlDefRPR->getAttribute('b') == 1) { - $oRTParagraph->getFont()->setBold(true); - } - if ($oElementLvlDefRPR->hasAttribute('i') && $oElementLvlDefRPR->getAttribute('i') == 1) { - $oRTParagraph->getFont()->setItalic(true); - } + if ($oElementLvlDefRPR->hasAttribute('i') && $oElementLvlDefRPR->getAttribute('i') == 1) { + $oRTParagraph->getFont()->setItalic(true); } - $oElementSchemeColor = $xmlReader->getElement('a:defRPr/a:solidFill/a:schemeClr', $oElementLvl); - if ($oElementSchemeColor instanceof \DOMElement) { - if ($oElementSchemeColor->hasAttribute('val')) { - $oSchemeColor = new SchemeColor(); - $oSchemeColor->setValue($oElementSchemeColor->getAttribute('val')); - $oRTParagraph->getFont()->setColor($oSchemeColor); - } + } + $oElementSchemeColor = $xmlReader->getElement('a:defRPr/a:solidFill/a:schemeClr', $oElementLvl); + if ($oElementSchemeColor instanceof DOMElement) { + if ($oElementSchemeColor->hasAttribute('val')) { + $oSchemeColor = new SchemeColor(); + $oSchemeColor->setValue($oElementSchemeColor->getAttribute('val')); + $oRTParagraph->getFont()->setColor($oSchemeColor); } + } - switch ($oElementTxStyle->nodeName) { - case 'p:bodyStyle': - $oSlideMaster->getTextStyles()->setBodyStyleAtLvl($oRTParagraph, $level); - break; - case 'p:otherStyle': - $oSlideMaster->getTextStyles()->setOtherStyleAtLvl($oRTParagraph, $level); - break; - case 'p:titleStyle': - $oSlideMaster->getTextStyles()->setTitleStyleAtLvl($oRTParagraph, $level); - break; - } + switch ($oElementTxStyle->nodeName) { + case 'p:bodyStyle': + $oSlideMaster->getTextStyles()->setBodyStyleAtLvl($oRTParagraph, $level); + break; + case 'p:otherStyle': + $oSlideMaster->getTextStyles()->setOtherStyleAtLvl($oRTParagraph, $level); + break; + case 'p:titleStyle': + $oSlideMaster->getTextStyles()->setTitleStyleAtLvl($oRTParagraph, $level); + break; } } } @@ -540,7 +546,7 @@ protected function loadMasterSlide($sPart, $baseFile) // Load the Layoutslide foreach ($xmlReader->getElements('/p:sldMaster/p:sldLayoutIdLst/p:sldLayoutId') as $oElement) { - if (!($oElement instanceof \DOMElement)) { + if (!($oElement instanceof DOMElement)) { continue; } $rId = $oElement->getAttribute('r:id'); @@ -567,9 +573,10 @@ protected function loadMasterSlide($sPart, $baseFile) * @return SlideLayout|null * @throws \Exception */ - protected function loadLayoutSlide($sPart, $baseFile, SlideMaster $oSlideMaster) + protected function loadLayoutSlide(string $sPart, string $baseFile, SlideMaster $oSlideMaster): ?SlideLayout { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { // Core $oSlideLayout = new SlideLayout($oSlideMaster); @@ -577,19 +584,19 @@ protected function loadLayoutSlide($sPart, $baseFile, SlideMaster $oSlideMaster) // Name $oElement = $xmlReader->getElement('/p:sldLayout/p:cSld'); - if ($oElement instanceof \DOMElement && $oElement->hasAttribute('name')) { + if ($oElement instanceof DOMElement && $oElement->hasAttribute('name')) { $oSlideLayout->setLayoutName($oElement->getAttribute('name')); } // Background $oElement = $xmlReader->getElement('/p:sldLayout/p:cSld/p:bg'); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { $this->loadSlideBackground($xmlReader, $oElement, $oSlideLayout); } // ColorMapping $oElement = $xmlReader->getElement('/p:sldLayout/p:clrMapOvr/a:overrideClrMapping'); - if ($oElement instanceof \DOMElement && $oElement->hasAttributes()) { + if ($oElement instanceof DOMElement && $oElement->hasAttributes()) { $colorMap = array(); foreach ($oElement->attributes as $attr) { $colorMap[$attr->nodeName] = $attr->nodeValue; @@ -599,12 +606,11 @@ protected function loadLayoutSlide($sPart, $baseFile, SlideMaster $oSlideMaster) // Shapes $oElements = $xmlReader->getElements('/p:sldLayout/p:cSld/p:spTree/*'); - if ($oElements) { - $this->loadSlideShapes($oSlideLayout, $oElements, $xmlReader); - } + $this->loadSlideShapes($oSlideLayout, $oElements, $xmlReader); $this->arraySlideLayouts[$baseFile] = &$oSlideLayout; return $oSlideLayout; } + /** @phpstan-ignore-next-line */ return null; } @@ -612,17 +618,18 @@ protected function loadLayoutSlide($sPart, $baseFile, SlideMaster $oSlideMaster) * @param string $sPart * @param SlideMaster $oSlideMaster */ - protected function loadTheme($sPart, SlideMaster $oSlideMaster) + protected function loadTheme(string $sPart, SlideMaster $oSlideMaster): void { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { $oElements = $xmlReader->getElements('/a:theme/a:themeElements/a:clrScheme/*'); - if ($oElements) { - foreach ($oElements as $oElement) { + foreach ($oElements as $oElement) { + if ($oElement instanceof DOMElement) { $oSchemeColor = new SchemeColor(); $oSchemeColor->setValue(str_replace('a:', '', $oElement->tagName)); $colorElement = $xmlReader->getElement('*', $oElement); - if ($colorElement instanceof \DOMElement) { + if ($colorElement instanceof DOMElement) { if ($colorElement->hasAttribute('lastClr')) { $oSchemeColor->setRGB($colorElement->getAttribute('lastClr')); } elseif ($colorElement->hasAttribute('val')) { @@ -637,15 +644,15 @@ protected function loadTheme($sPart, SlideMaster $oSlideMaster) /** * @param XMLReader $xmlReader - * @param \DOMElement $oElement + * @param DOMElement $oElement * @param AbstractSlide $oSlide * @throws \Exception */ - protected function loadSlideBackground(XMLReader $xmlReader, \DOMElement $oElement, AbstractSlide $oSlide) + protected function loadSlideBackground(XMLReader $xmlReader, DOMElement $oElement, AbstractSlide $oSlide): void { // Background color $oElementColor = $xmlReader->getElement('p:bgPr/a:solidFill/a:srgbClr', $oElement); - if ($oElementColor instanceof \DOMElement) { + if ($oElementColor instanceof DOMElement) { // Color $oColor = new Color(); $oColor->setRGB($oElementColor->hasAttribute('val') ? $oElementColor->getAttribute('val') : null); @@ -658,7 +665,7 @@ protected function loadSlideBackground(XMLReader $xmlReader, \DOMElement $oEleme // Background scheme color $oElementSchemeColor = $xmlReader->getElement('p:bgRef/a:schemeClr', $oElement); - if ($oElementSchemeColor instanceof \DOMElement) { + if ($oElementSchemeColor instanceof DOMElement) { // Color $oColor = new SchemeColor(); $oColor->setValue($oElementSchemeColor->hasAttribute('val') ? $oElementSchemeColor->getAttribute('val') : null); @@ -671,7 +678,7 @@ protected function loadSlideBackground(XMLReader $xmlReader, \DOMElement $oEleme // Background image $oElementImage = $xmlReader->getElement('p:bgPr/a:blipFill/a:blip', $oElement); - if ($oElementImage instanceof \DOMElement) { + if ($oElementImage instanceof DOMElement) { $relImg = $this->arrayRels[$oSlide->getRelsIndex()][$oElementImage->getAttribute('r:embed')]; if (is_array($relImg)) { // File @@ -702,27 +709,26 @@ protected function loadSlideBackground(XMLReader $xmlReader, \DOMElement $oEleme * @param Slide $oSlide * @throws \Exception */ - protected function loadSlideNote($baseFile, Slide $oSlide) + protected function loadSlideNote(string $baseFile, Slide $oSlide): void { $sPart = $this->oZip->getFromName('ppt/notesSlides/' . $baseFile); $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { $oNote = $oSlide->getNote(); $arrayElements = $xmlReader->getElements('/p:notes/p:cSld/p:spTree/*'); - if ($arrayElements) { - $this->loadSlideShapes($oNote, $arrayElements, $xmlReader); - } + $this->loadSlideShapes($oNote, $arrayElements, $xmlReader); } } /** * @param XMLReader $document - * @param \DOMElement $node + * @param DOMElement $node * @param AbstractSlide $oSlide * @throws \Exception */ - protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, AbstractSlide $oSlide) + protected function loadShapeDrawing(XMLReader $document, DOMElement $node, AbstractSlide $oSlide): void { // Core $oShape = new Gd(); @@ -731,7 +737,7 @@ protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, Abst $fileRels = $oSlide->getRelsIndex(); $oElement = $document->getElement('p:nvPicPr/p:cNvPr', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { $oShape->setName($oElement->hasAttribute('name') ? $oElement->getAttribute('name') : ''); $oShape->setDescription($oElement->hasAttribute('descr') ? $oElement->getAttribute('descr') : ''); @@ -748,7 +754,7 @@ protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, Abst } $oElement = $document->getElement('p:blipFill/a:blip', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('r:embed') && isset($this->arrayRels[$fileRels][$oElement->getAttribute('r:embed')]['Target'])) { $pathImage = 'ppt/slides/' . $this->arrayRels[$fileRels][$oElement->getAttribute('r:embed')]['Target']; $pathImage = explode('/', $pathImage); @@ -770,20 +776,20 @@ protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, Abst } $oElement = $document->getElement('p:spPr', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { $oFill = $this->loadStyleFill($document, $oElement); $oShape->setFill($oFill); } $oElement = $document->getElement('p:spPr/a:xfrm', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('rot')) { $oShape->setRotation(CommonDrawing::angleToDegrees($oElement->getAttribute('rot'))); } } $oElement = $document->getElement('p:spPr/a:xfrm/a:off', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('x')) { $oShape->setOffsetX(CommonDrawing::emuToPixels($oElement->getAttribute('x'))); } @@ -793,7 +799,7 @@ protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, Abst } $oElement = $document->getElement('p:spPr/a:xfrm/a:ext', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('cx')) { $oShape->setWidth(CommonDrawing::emuToPixels($oElement->getAttribute('cx'))); } @@ -803,11 +809,11 @@ protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, Abst } $oElement = $document->getElement('p:spPr/a:effectLst', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { $oShape->getShadow()->setVisible(true); $oSubElement = $document->getElement('a:outerShdw', $oElement); - if ($oSubElement instanceof \DOMElement) { + if ($oSubElement instanceof DOMElement) { if ($oSubElement->hasAttribute('blurRad')) { $oShape->getShadow()->setBlurRadius(CommonDrawing::emuToPixels($oSubElement->getAttribute('blurRad'))); } @@ -823,7 +829,7 @@ protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, Abst } $oSubElement = $document->getElement('a:outerShdw/a:srgbClr', $oElement); - if ($oSubElement instanceof \DOMElement) { + if ($oSubElement instanceof DOMElement) { if ($oSubElement->hasAttribute('val')) { $oColor = new Color(); $oColor->setRGB($oSubElement->getAttribute('val')); @@ -832,7 +838,7 @@ protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, Abst } $oSubElement = $document->getElement('a:outerShdw/a:srgbClr/a:alpha', $oElement); - if ($oSubElement instanceof \DOMElement) { + if ($oSubElement instanceof DOMElement) { if ($oSubElement->hasAttribute('val')) { $oShape->getShadow()->setAlpha((int)$oSubElement->getAttribute('val') / 1000); } @@ -844,11 +850,11 @@ protected function loadShapeDrawing(XMLReader $document, \DOMElement $node, Abst /** * @param XMLReader $document - * @param \DOMElement $node + * @param DOMElement $node * @param AbstractSlide $oSlide * @throws \Exception */ - protected function loadShapeRichText(XMLReader $document, \DOMElement $node, $oSlide) + protected function loadShapeRichText(XMLReader $document, DOMElement $node, AbstractSlide $oSlide): void { if (!$document->elementExists('p:txBody/a:p/a:r', $node)) { return; @@ -862,12 +868,12 @@ protected function loadShapeRichText(XMLReader $document, \DOMElement $node, $oS } $oElement = $document->getElement('p:spPr/a:xfrm', $node); - if ($oElement instanceof \DOMElement && $oElement->hasAttribute('rot')) { + if ($oElement instanceof DOMElement && $oElement->hasAttribute('rot')) { $oShape->setRotation(CommonDrawing::angleToDegrees($oElement->getAttribute('rot'))); } $oElement = $document->getElement('p:spPr/a:xfrm/a:off', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('x')) { $oShape->setOffsetX(CommonDrawing::emuToPixels($oElement->getAttribute('x'))); } @@ -877,7 +883,7 @@ protected function loadShapeRichText(XMLReader $document, \DOMElement $node, $oS } $oElement = $document->getElement('p:spPr/a:xfrm/a:ext', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('cx')) { $oShape->setWidth(CommonDrawing::emuToPixels($oElement->getAttribute('cx'))); } @@ -887,7 +893,7 @@ protected function loadShapeRichText(XMLReader $document, \DOMElement $node, $oS } $oElement = $document->getElement('p:nvSpPr/p:nvPr/p:ph', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('type')) { $placeholder = new Placeholder($oElement->getAttribute('type')); $oShape->setPlaceHolder($placeholder); @@ -896,7 +902,9 @@ protected function loadShapeRichText(XMLReader $document, \DOMElement $node, $oS $arrayElements = $document->getElements('p:txBody/a:p', $node); foreach ($arrayElements as $oElement) { - $this->loadParagraph($document, $oElement, $oShape); + if ($oElement instanceof DOMElement) { + $this->loadParagraph($document, $oElement, $oShape); + } } if (count($oShape->getParagraphs()) > 0) { @@ -906,18 +914,18 @@ protected function loadShapeRichText(XMLReader $document, \DOMElement $node, $oS /** * @param XMLReader $document - * @param \DOMElement $node + * @param DOMElement $node * @param AbstractSlide $oSlide * @throws \Exception */ - protected function loadShapeTable(XMLReader $document, \DOMElement $node, AbstractSlide $oSlide) + protected function loadShapeTable(XMLReader $document, DOMElement $node, AbstractSlide $oSlide): void { $this->fileRels = $oSlide->getRelsIndex(); $oShape = $oSlide->createTableShape(); $oElement = $document->getElement('p:cNvPr', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('name')) { $oShape->setName($oElement->getAttribute('name')); } @@ -927,7 +935,7 @@ protected function loadShapeTable(XMLReader $document, \DOMElement $node, Abstra } $oElement = $document->getElement('p:xfrm/a:off', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('x')) { $oShape->setOffsetX(CommonDrawing::emuToPixels($oElement->getAttribute('x'))); } @@ -937,7 +945,7 @@ protected function loadShapeTable(XMLReader $document, \DOMElement $node, Abstra } $oElement = $document->getElement('p:xfrm/a:ext', $node); - if ($oElement instanceof \DOMElement) { + if ($oElement instanceof DOMElement) { if ($oElement->hasAttribute('cx')) { $oShape->setWidth(CommonDrawing::emuToPixels($oElement->getAttribute('cx'))); } @@ -950,14 +958,14 @@ protected function loadShapeTable(XMLReader $document, \DOMElement $node, Abstra $oShape->setNumColumns($arrayElements->length); $oShape->createRow(); foreach ($arrayElements as $key => $oElement) { - if ($oElement instanceof \DOMElement && $oElement->getAttribute('w')) { + if ($oElement instanceof DOMElement && $oElement->getAttribute('w')) { $oShape->getRow(0)->getCell($key)->setWidth(CommonDrawing::emuToPixels($oElement->getAttribute('w'))); } } $arrayElements = $document->getElements('a:graphic/a:graphicData/a:tbl/a:tr', $node); foreach ($arrayElements as $keyRow => $oElementRow) { - if (!($oElementRow instanceof \DOMElement)) { + if (!($oElementRow instanceof DOMElement)) { continue; } $oRow = $oShape->getRow($keyRow, true); @@ -969,24 +977,26 @@ protected function loadShapeTable(XMLReader $document, \DOMElement $node, Abstra } $arrayElementsCell = $document->getElements('a:tc', $oElementRow); foreach ($arrayElementsCell as $keyCell => $oElementCell) { - if (!($oElementCell instanceof \DOMElement)) { + if (!($oElementCell instanceof DOMElement)) { continue; } $oCell = $oRow->getCell($keyCell); $oCell->setParagraphs(array()); if ($oElementCell->hasAttribute('gridSpan')) { - $oCell->setColSpan($oElementCell->getAttribute('gridSpan')); + $oCell->setColSpan((int) $oElementCell->getAttribute('gridSpan')); } if ($oElementCell->hasAttribute('rowSpan')) { - $oCell->setRowSpan($oElementCell->getAttribute('rowSpan')); + $oCell->setRowSpan((int) $oElementCell->getAttribute('rowSpan')); } foreach ($document->getElements('a:txBody/a:p', $oElementCell) as $oElementPara) { - $this->loadParagraph($document, $oElementPara, $oCell); + if ($oElementPara instanceof DOMElement) { + $this->loadParagraph($document, $oElementPara, $oCell); + } } $oElementTcPr = $document->getElement('a:tcPr', $oElementCell); - if ($oElementTcPr instanceof \DOMElement) { + if ($oElementTcPr instanceof DOMElement) { $numParagraphs = count($oCell->getParagraphs()); if ($numParagraphs > 0) { if ($oElementTcPr->hasAttribute('vert')) { @@ -996,16 +1006,16 @@ protected function loadShapeTable(XMLReader $document, \DOMElement $node, Abstra $oCell->getParagraph(0)->getAlignment()->setVertical($oElementTcPr->getAttribute('anchor')); } if ($oElementTcPr->hasAttribute('marB')) { - $oCell->getParagraph(0)->getAlignment()->setMarginBottom($oElementTcPr->getAttribute('marB')); + $oCell->getParagraph(0)->getAlignment()->setMarginBottom((int) $oElementTcPr->getAttribute('marB')); } if ($oElementTcPr->hasAttribute('marL')) { - $oCell->getParagraph(0)->getAlignment()->setMarginLeft($oElementTcPr->getAttribute('marL')); + $oCell->getParagraph(0)->getAlignment()->setMarginLeft((int) $oElementTcPr->getAttribute('marL')); } if ($oElementTcPr->hasAttribute('marR')) { - $oCell->getParagraph(0)->getAlignment()->setMarginRight($oElementTcPr->getAttribute('marR')); + $oCell->getParagraph(0)->getAlignment()->setMarginRight((int) $oElementTcPr->getAttribute('marR')); } if ($oElementTcPr->hasAttribute('marT')) { - $oCell->getParagraph(0)->getAlignment()->setMarginTop($oElementTcPr->getAttribute('marT')); + $oCell->getParagraph(0)->getAlignment()->setMarginTop((int) $oElementTcPr->getAttribute('marT')); } } @@ -1016,27 +1026,27 @@ protected function loadShapeTable(XMLReader $document, \DOMElement $node, Abstra $oBorders = new Borders(); $oElementBorderL = $document->getElement('a:lnL', $oElementTcPr); - if ($oElementBorderL instanceof \DOMElement) { + if ($oElementBorderL instanceof DOMElement) { $this->loadStyleBorder($document, $oElementBorderL, $oBorders->getLeft()); } $oElementBorderR = $document->getElement('a:lnR', $oElementTcPr); - if ($oElementBorderR instanceof \DOMElement) { + if ($oElementBorderR instanceof DOMElement) { $this->loadStyleBorder($document, $oElementBorderR, $oBorders->getRight()); } $oElementBorderT = $document->getElement('a:lnT', $oElementTcPr); - if ($oElementBorderT instanceof \DOMElement) { + if ($oElementBorderT instanceof DOMElement) { $this->loadStyleBorder($document, $oElementBorderT, $oBorders->getTop()); } $oElementBorderB = $document->getElement('a:lnB', $oElementTcPr); - if ($oElementBorderB instanceof \DOMElement) { + if ($oElementBorderB instanceof DOMElement) { $this->loadStyleBorder($document, $oElementBorderB, $oBorders->getBottom()); } $oElementBorderDiagDown = $document->getElement('a:lnTlToBr', $oElementTcPr); - if ($oElementBorderDiagDown instanceof \DOMElement) { + if ($oElementBorderDiagDown instanceof DOMElement) { $this->loadStyleBorder($document, $oElementBorderDiagDown, $oBorders->getDiagonalDown()); } $oElementBorderDiagUp = $document->getElement('a:lnBlToTr', $oElementTcPr); - if ($oElementBorderDiagUp instanceof \DOMElement) { + if ($oElementBorderDiagUp instanceof DOMElement) { $this->loadStyleBorder($document, $oElementBorderDiagUp, $oBorders->getDiagonalUp()); } $oCell->setBorders($oBorders); @@ -1047,18 +1057,18 @@ protected function loadShapeTable(XMLReader $document, \DOMElement $node, Abstra /** * @param XMLReader $document - * @param \DOMElement $oElement + * @param DOMElement $oElement * @param Cell|RichText $oShape * @throws \Exception */ - protected function loadParagraph(XMLReader $document, \DOMElement $oElement, $oShape) + protected function loadParagraph(XMLReader $document, DOMElement $oElement, $oShape): void { // Core $oParagraph = $oShape->createParagraph(); $oParagraph->setRichTextElements(array()); $oSubElement = $document->getElement('a:pPr', $oElement); - if ($oSubElement instanceof \DOMElement) { + if ($oSubElement instanceof DOMElement) { if ($oSubElement->hasAttribute('algn')) { $oParagraph->getAlignment()->setHorizontal($oSubElement->getAttribute('algn')); } @@ -1075,26 +1085,26 @@ protected function loadParagraph(XMLReader $document, \DOMElement $oElement, $oS $oParagraph->getAlignment()->setIndent(CommonDrawing::emuToPixels($oSubElement->getAttribute('indent'))); } if ($oSubElement->hasAttribute('lvl')) { - $oParagraph->getAlignment()->setLevel($oSubElement->getAttribute('lvl')); + $oParagraph->getAlignment()->setLevel((int) $oSubElement->getAttribute('lvl')); } $oParagraph->getBulletStyle()->setBulletType(Bullet::TYPE_NONE); $oElementBuFont = $document->getElement('a:buFont', $oSubElement); - if ($oElementBuFont instanceof \DOMElement) { + if ($oElementBuFont instanceof DOMElement) { if ($oElementBuFont->hasAttribute('typeface')) { $oParagraph->getBulletStyle()->setBulletFont($oElementBuFont->getAttribute('typeface')); } } $oElementBuChar = $document->getElement('a:buChar', $oSubElement); - if ($oElementBuChar instanceof \DOMElement) { + if ($oElementBuChar instanceof DOMElement) { $oParagraph->getBulletStyle()->setBulletType(Bullet::TYPE_BULLET); if ($oElementBuChar->hasAttribute('char')) { $oParagraph->getBulletStyle()->setBulletChar($oElementBuChar->getAttribute('char')); } } $oElementBuAutoNum = $document->getElement('a:buAutoNum', $oSubElement); - if ($oElementBuAutoNum instanceof \DOMElement) { + if ($oElementBuAutoNum instanceof DOMElement) { $oParagraph->getBulletStyle()->setBulletType(Bullet::TYPE_NUMERIC); if ($oElementBuAutoNum->hasAttribute('type')) { $oParagraph->getBulletStyle()->setBulletNumericStyle($oElementBuAutoNum->getAttribute('type')); @@ -1104,13 +1114,13 @@ protected function loadParagraph(XMLReader $document, \DOMElement $oElement, $oS } } $oElementBuClr = $document->getElement('a:buClr', $oSubElement); - if ($oElementBuClr instanceof \DOMElement) { + if ($oElementBuClr instanceof DOMElement) { $oColor = new Color(); /** * @todo Create protected for reading Color */ $oElementColor = $document->getElement('a:srgbClr', $oElementBuClr); - if ($oElementColor instanceof \DOMElement) { + if ($oElementColor instanceof DOMElement) { $oColor->setRGB($oElementColor->hasAttribute('val') ? $oElementColor->getAttribute('val') : null); } $oParagraph->getBulletStyle()->setBulletColor($oColor); @@ -1118,6 +1128,9 @@ protected function loadParagraph(XMLReader $document, \DOMElement $oElement, $oS } $arraySubElements = $document->getElements('(a:r|a:br)', $oElement); foreach ($arraySubElements as $oSubElement) { + if (!($oSubElement instanceof DOMElement)) { + continue; + } if ($oSubElement->tagName == 'a:br') { $oParagraph->createBreak(); } @@ -1172,11 +1185,11 @@ protected function loadParagraph(XMLReader $document, \DOMElement $oElement, $oS /** * @param XMLReader $xmlReader - * @param \DOMElement $oElement + * @param DOMElement $oElement * @param Border $oBorder * @throws \Exception */ - protected function loadStyleBorder(XMLReader $xmlReader, \DOMElement $oElement, Border $oBorder) + protected function loadStyleBorder(XMLReader $xmlReader, DOMElement $oElement, Border $oBorder): void { if ($oElement->hasAttribute('w')) { $oBorder->setLineWidth($oElement->getAttribute('w') / 12700); @@ -1186,32 +1199,32 @@ protected function loadStyleBorder(XMLReader $xmlReader, \DOMElement $oElement, } $oElementNoFill = $xmlReader->getElement('a:noFill', $oElement); - if ($oElementNoFill instanceof \DOMElement && $oBorder->getLineStyle() == Border::LINE_SINGLE) { + if ($oElementNoFill instanceof DOMElement && $oBorder->getLineStyle() == Border::LINE_SINGLE) { $oBorder->setLineStyle(Border::LINE_NONE); } $oElementColor = $xmlReader->getElement('a:solidFill/a:srgbClr', $oElement); - if ($oElementColor instanceof \DOMElement) { + if ($oElementColor instanceof DOMElement) { $oBorder->setColor($this->loadStyleColor($xmlReader, $oElementColor)); } $oElementDashStyle = $xmlReader->getElement('a:prstDash', $oElement); - if ($oElementDashStyle instanceof \DOMElement && $oElementDashStyle->hasAttribute('val')) { + if ($oElementDashStyle instanceof DOMElement && $oElementDashStyle->hasAttribute('val')) { $oBorder->setDashStyle($oElementDashStyle->getAttribute('val')); } } /** * @param XMLReader $xmlReader - * @param \DOMElement $oElement + * @param DOMElement $oElement * @return Color */ - protected function loadStyleColor(XMLReader $xmlReader, \DOMElement $oElement) + protected function loadStyleColor(XMLReader $xmlReader, DOMElement $oElement): Color { $oColor = new Color(); $oColor->setRGB($oElement->getAttribute('val')); $oElementAlpha = $xmlReader->getElement('a:alpha', $oElement); - if ($oElementAlpha instanceof \DOMElement && $oElementAlpha->hasAttribute('val')) { + if ($oElementAlpha instanceof DOMElement && $oElementAlpha->hasAttribute('val')) { $alpha = strtoupper(dechex((($oElementAlpha->getAttribute('val') / 1000) / 100) * 255)); $oColor->setRGB($oElement->getAttribute('val'), $alpha); } @@ -1220,30 +1233,30 @@ protected function loadStyleColor(XMLReader $xmlReader, \DOMElement $oElement) /** * @param XMLReader $xmlReader - * @param \DOMElement $oElement + * @param DOMElement $oElement * @return null|Fill * @throws \Exception */ - protected function loadStyleFill(XMLReader $xmlReader, \DOMElement $oElement) + protected function loadStyleFill(XMLReader $xmlReader, DOMElement $oElement): ?Fill { // Gradient fill $oElementFill = $xmlReader->getElement('a:gradFill', $oElement); - if ($oElementFill instanceof \DOMElement) { + if ($oElementFill instanceof DOMElement) { $oFill = new Fill(); $oFill->setFillType(Fill::FILL_GRADIENT_LINEAR); $oElementColor = $xmlReader->getElement('a:gsLst/a:gs[@pos="0"]/a:srgbClr', $oElementFill); - if ($oElementColor instanceof \DOMElement && $oElementColor->hasAttribute('val')) { + if ($oElementColor instanceof DOMElement && $oElementColor->hasAttribute('val')) { $oFill->setStartColor($this->loadStyleColor($xmlReader, $oElementColor)); } $oElementColor = $xmlReader->getElement('a:gsLst/a:gs[@pos="100000"]/a:srgbClr', $oElementFill); - if ($oElementColor instanceof \DOMElement && $oElementColor->hasAttribute('val')) { + if ($oElementColor instanceof DOMElement && $oElementColor->hasAttribute('val')) { $oFill->setEndColor($this->loadStyleColor($xmlReader, $oElementColor)); } $oRotation = $xmlReader->getElement('a:lin', $oElementFill); - if ($oRotation instanceof \DOMElement && $oRotation->hasAttribute('ang')) { + if ($oRotation instanceof DOMElement && $oRotation->hasAttribute('ang')) { $oFill->setRotation(CommonDrawing::angleToDegrees($oRotation->getAttribute('ang'))); } return $oFill; @@ -1251,12 +1264,12 @@ protected function loadStyleFill(XMLReader $xmlReader, \DOMElement $oElement) // Solid fill $oElementFill = $xmlReader->getElement('a:solidFill', $oElement); - if ($oElementFill instanceof \DOMElement) { + if ($oElementFill instanceof DOMElement) { $oFill = new Fill(); $oFill->setFillType(Fill::FILL_SOLID); $oElementColor = $xmlReader->getElement('a:srgbClr', $oElementFill); - if ($oElementColor instanceof \DOMElement) { + if ($oElementColor instanceof DOMElement) { $oFill->setStartColor($this->loadStyleColor($xmlReader, $oElementColor)); } return $oFill; @@ -1267,14 +1280,15 @@ protected function loadStyleFill(XMLReader $xmlReader, \DOMElement $oElement) /** * @param string $fileRels */ - protected function loadRels($fileRels) + protected function loadRels(string $fileRels): void { $sPart = $this->oZip->getFromName($fileRels); if ($sPart !== false) { $xmlReader = new XMLReader(); + /** @phpstan-ignore-next-line */ if ($xmlReader->getDomFromString($sPart)) { foreach ($xmlReader->getElements('*') as $oNode) { - if (!($oNode instanceof \DOMElement)) { + if (!($oNode instanceof DOMElement)) { continue; } $this->arrayRels[$fileRels][$oNode->getAttribute('Id')] = array( @@ -1287,15 +1301,18 @@ protected function loadRels($fileRels) } /** - * @param $oSlide - * @param \DOMNodeList $oElements + * @param AbstractSlide|Note $oSlide + * @param DOMNodeList $oElements * @param XMLReader $xmlReader * @throws \Exception * @internal param $baseFile */ - protected function loadSlideShapes($oSlide, $oElements, $xmlReader) + protected function loadSlideShapes($oSlide, DOMNodeList $oElements, XMLReader $xmlReader): void { foreach ($oElements as $oNode) { + if (!($oNode instanceof DOMElement)) { + continue; + } switch ($oNode->tagName) { case 'p:graphicFrame': $this->loadShapeTable($xmlReader, $oNode, $oSlide); diff --git a/src/PhpPresentation/Reader/PowerPoint97.php b/src/PhpPresentation/Reader/PowerPoint97.php index f8b3626a62..070eb076a6 100644 --- a/src/PhpPresentation/Reader/PowerPoint97.php +++ b/src/PhpPresentation/Reader/PowerPoint97.php @@ -268,7 +268,7 @@ class PowerPoint97 implements ReaderInterface public const RT_VISUALSHAPEATOM = 0x2AFB; /** - * @var http://msdn.microsoft.com/en-us/library/dd926394(v=office.12).aspx + * @link http://msdn.microsoft.com/en-us/library/dd926394(v=office.12).aspx */ public const SL_BIGOBJECT = 0x0000000F; public const SL_BLANK = 0x00000010; @@ -287,18 +287,22 @@ class PowerPoint97 implements ReaderInterface /** * Array with Fonts + * @var array */ private $arrayFonts = array(); /** * Array with Hyperlinks + * @var array> */ private $arrayHyperlinks = array(); /** * Array with Notes + * @var array */ private $arrayNotes = array(); /** * Array with Pictures + * @var array */ private $arrayPictures = array(); /** @@ -308,7 +312,7 @@ class PowerPoint97 implements ReaderInterface private $offsetToCurrentEdit; /** * A structure that specifies a compressed table of sequential persist object identifiers and stream offsets to associated persist objects. - * @var int[] + * @var array */ private $rgPersistDirEntry; /** @@ -322,8 +326,7 @@ class PowerPoint97 implements ReaderInterface */ private $oPhpPresentation; /** - * Group Object - * @var Group + * @var Group|null */ private $oCurrentGroup; /** @@ -360,18 +363,18 @@ class PowerPoint97 implements ReaderInterface */ private $inMainType; /** - * @var integer + * @var int|null */ private $currentNote; /** * Can the current \PhpOffice\PhpPresentation\Reader\ReaderInterface read the file? * - * @param string $pFilename + * @param string $pFilename * @throws \Exception * @return boolean */ - public function canRead($pFilename) + public function canRead(string $pFilename): bool { return $this->fileSupportsUnserializePhpPresentation($pFilename); } @@ -379,11 +382,11 @@ public function canRead($pFilename) /** * Does a file support UnserializePhpPresentation ? * - * @param string $pFilename + * @param string $pFilename * @throws \Exception * @return boolean */ - public function fileSupportsUnserializePhpPresentation($pFilename = '') + public function fileSupportsUnserializePhpPresentation(string $pFilename = ''): bool { // Check if file exists if (!file_exists($pFilename)) { @@ -404,11 +407,11 @@ public function fileSupportsUnserializePhpPresentation($pFilename = '') /** * Loads PhpPresentation Serialized file * - * @param string $pFilename - * @return \PhpOffice\PhpPresentation\PhpPresentation + * @param string $pFilename + * @return PhpPresentation * @throws \Exception */ - public function load($pFilename) + public function load(string $pFilename): PhpPresentation { // Unserialize... First make sure the file supports it! if (!$this->fileSupportsUnserializePhpPresentation($pFilename)) { @@ -421,11 +424,11 @@ public function load($pFilename) /** * Load PhpPresentation Serialized file * - * @param string $pFilename - * @return \PhpOffice\PhpPresentation\PhpPresentation + * @param string $pFilename + * @return PhpPresentation * @throws \Exception */ - private function loadFile($pFilename) + private function loadFile(string $pFilename): PhpPresentation { $this->oPhpPresentation = new PhpPresentation(); $this->oPhpPresentation->removeSlideByIndex(); @@ -447,7 +450,7 @@ private function loadFile($pFilename) * @param string $pFilename * @throws \Exception */ - private function loadOLE($pFilename) + private function loadOLE(string $pFilename): void { // OLE reader $oOLE = new OLERead(); @@ -473,7 +476,7 @@ private function loadOLE($pFilename) * Stream Pictures * @link http://msdn.microsoft.com/en-us/library/dd920746(v=office.12).aspx */ - private function loadPicturesStream() + private function loadPicturesStream(): void { $stream = $this->streamPictures; @@ -504,7 +507,7 @@ private function loadPicturesStream() * Stream Current User * @link http://msdn.microsoft.com/en-us/library/dd908567(v=office.12).aspx */ - private function loadCurrentUserStream() + private function loadCurrentUserStream(): void { $pos = 0; @@ -602,7 +605,7 @@ private function loadCurrentUserStream() * Stream Powerpoint Document * @link http://msdn.microsoft.com/en-us/library/dd921564(v=office.12).aspx */ - private function loadPowerpointDocumentStream() + private function loadPowerpointDocumentStream(): void { $this->readRecordUserEditAtom($this->streamPowerpointDocument, $this->offsetToCurrentEdit); @@ -636,9 +639,9 @@ private function loadPowerpointDocumentStream() * Read a record header * @param string $stream * @param integer $pos - * @return array + * @return array */ - private function loadRecordHeader($stream, $pos) + private function loadRecordHeader(string $stream, int $pos): array { $rec = self::getInt2d($stream, $pos); $recType = self::getInt2d($stream, $pos + 2); @@ -658,7 +661,7 @@ private function loadRecordHeader($stream, $pos) * @param int $pos * @return int */ - public static function getInt1d($data, $pos) + public static function getInt1d(string $data, int $pos): int { return ord($data[$pos]); } @@ -670,7 +673,7 @@ public static function getInt1d($data, $pos) * @param int $pos * @return int */ - public static function getInt2d($data, $pos) + public static function getInt2d(string $data, int $pos): int { return ord($data[$pos]) | (ord($data[$pos+1]) << 8); } @@ -682,7 +685,7 @@ public static function getInt2d($data, $pos) * @param int $pos * @return int */ - public static function getInt4d($data, $pos) + public static function getInt4d(string $data, int $pos): int { // FIX: represent numbers correctly on 64-bit system // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 @@ -701,11 +704,11 @@ public static function getInt4d($data, $pos) * A container record that specifies the animation and sound information for a shape. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd772900(v=office.12).aspx */ - private function readRecordAnimationInfoContainer($stream, $pos) + private function readRecordAnimationInfoContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -730,7 +733,7 @@ private function readRecordAnimationInfoContainer($stream, $pos) * @throws \Exception * @link http://msdn.microsoft.com/en-us/library/dd947357(v=office.12).aspx */ - private function readRecordDocumentContainer($stream, $pos) + private function readRecordDocumentContainer(string $stream, int $pos): void { $documentAtom = $this->loadRecordHeader($stream, $pos); $pos += 8; @@ -813,7 +816,7 @@ private function readRecordDocumentContainer($stream, $pos) } break; default: - throw new \Exception('Feature not implemented (l.'.__LINE__.' : '.dechex($childRec['recType'].')')); + throw new \Exception('Feature not implemented (l.'.__LINE__.' : ' . dechex((int) $childRec['recType']).')'); } } while ($exObjList['recLen'] > 0); } @@ -1013,11 +1016,11 @@ private function readRecordDocumentContainer($stream, $pos) * An atom record that specifies information about a slide. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd923801(v=office.12).aspx */ - private function readRecordDrawingContainer($stream, $pos) + private function readRecordDrawingContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1034,7 +1037,12 @@ private function readRecordDrawingContainer($stream, $pos) return $arrayReturn; } - private function readRecordDrawingGroupContainer($stream, $pos) + /** + * @param string $stream + * @param int $pos + * @return array + */ + private function readRecordDrawingGroupContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1053,10 +1061,10 @@ private function readRecordDrawingGroupContainer($stream, $pos) * An atom record that specifies a reference to an external object. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd910388(v=office.12).aspx */ - private function readRecordExObjRefAtom($stream, $pos) + private function readRecordExObjRefAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1077,10 +1085,10 @@ private function readRecordExObjRefAtom($stream, $pos) * An atom record that specifies a type of action to be performed. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd953300(v=office.12).aspx */ - private function readRecordInteractiveInfoAtom($stream, $pos) + private function readRecordInteractiveInfoAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1120,10 +1128,10 @@ private function readRecordInteractiveInfoAtom($stream, $pos) * An atom record that specifies the name of a macro, a file name, or a named show. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd925121(v=office.12).aspx */ - private function readRecordMacroNameAtom($stream, $pos) + private function readRecordMacroNameAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1144,10 +1152,10 @@ private function readRecordMacroNameAtom($stream, $pos) * A container record that specifies what actions to perform when interacting with an object by means of a mouse click. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd952348(v=office.12).aspx */ - private function readRecordMouseClickInteractiveInfoContainer($stream, $pos) + private function readRecordMouseClickInteractiveInfoContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1175,11 +1183,11 @@ private function readRecordMouseClickInteractiveInfoContainer($stream, $pos) * A container record that specifies what actions to perform when interacting with an object by moving the mouse cursor over it. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd925811(v=office.12).aspx */ - private function readRecordMouseOverInteractiveInfoContainer($stream, $pos) + private function readRecordMouseOverInteractiveInfoContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1201,11 +1209,11 @@ private function readRecordMouseOverInteractiveInfoContainer($stream, $pos) * The OfficeArtBlip record specifies BLIP file data. * @param string $stream * @param integer $pos - * @return array + * @return array{'length': int, 'picture': null|string} * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd910081(v=office.12).aspx */ - private function readRecordOfficeArtBlip($stream, $pos) + private function readRecordOfficeArtBlip(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1236,7 +1244,7 @@ private function readRecordOfficeArtBlip($stream, $pos) $arrayReturn['length'] += $data['recLen']; break; default: - throw new \Exception('Feature not implemented (l.'.__LINE__.' : '.dechex($data['recType'].')')); + throw new \Exception('Feature not implemented (l.'.__LINE__.' : '.dechex((int) $data['recType']).')'); } } @@ -1247,10 +1255,10 @@ private function readRecordOfficeArtBlip($stream, $pos) * The OfficeArtChildAnchor record specifies four signed integers that specify the anchor for the shape that contains this record. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd922720(v=office.12).aspx */ - private function readRecordOfficeArtChildAnchor($stream, $pos) + private function readRecordOfficeArtChildAnchor(string $stream, int $pos) { $arrayReturn = array( 'length' => 0 @@ -1278,11 +1286,11 @@ private function readRecordOfficeArtChildAnchor($stream, $pos) * An atom record that specifies the location of a shape. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd922797(v=office.12).aspx */ - private function readRecordOfficeArtClientAnchor($stream, $pos) + private function readRecordOfficeArtClientAnchor(string $stream, int $pos) { $arrayReturn = array( 'length' => 0 @@ -1317,11 +1325,11 @@ private function readRecordOfficeArtClientAnchor($stream, $pos) * A container record that specifies text related data for a shape. * @param string $stream * @param integer $pos - * @return array + * @return array{'length': int, 'text': string, 'numParts': int, 'numTexts': int, 'hyperlink': array>, 'part': array} * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd910958(v=office.12).aspx */ - private function readRecordOfficeArtClientTextbox($stream, $pos) + private function readRecordOfficeArtClientTextbox(string $stream, int $pos) { $arrayReturn = array( 'length' => 0, @@ -1465,11 +1473,11 @@ private function readRecordOfficeArtClientTextbox($stream, $pos) * The OfficeArtSpContainer record specifies a shape container. * @param string $stream * @param integer $pos - * @return array + * @return array{'length': int, 'shape': null|AbstractShape} * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd943794(v=office.12).aspx */ - private function readRecordOfficeArtSpContainer($stream, $pos) + private function readRecordOfficeArtSpContainer(string $stream, int $pos) { $arrayReturn = array( 'length' => 0, @@ -1583,6 +1591,7 @@ private function readRecordOfficeArtSpContainer($stream, $pos) $start = 0; $lastLevel = -1; $lastMarginLeft = 0; + /** @phpstan-ignore-next-line */ for ($inc = 1; $inc <= $clientTextbox['numParts']; $inc++) { if ($clientTextbox['numParts'] == $clientTextbox['numTexts'] && isset($clientTextbox['text'.$inc])) { if (isset($clientTextbox['text'.$inc]['bulletChar'])) { @@ -1613,7 +1622,7 @@ private function readRecordOfficeArtSpContainer($stream, $pos) $sHyperlinkURL = ''; if (empty($sText)) { // Is there a hyperlink ? - if (isset($clientTextbox['hyperlink']) && is_array($clientTextbox['hyperlink']) && !empty($clientTextbox['hyperlink'])) { + if (!empty($clientTextbox['hyperlink'])) { foreach ($clientTextbox['hyperlink'] as $itmHyperlink) { if ($itmHyperlink['start'] == $start && ($itmHyperlink['end'] - $itmHyperlink['start']) == $clientTextbox['part'.$inc]['partLength']) { $sText = $this->arrayHyperlinks[$itmHyperlink['id']]['text']; @@ -1728,7 +1737,7 @@ private function readRecordOfficeArtSpContainer($stream, $pos) * @param string $stream * @param integer $pos * @param boolean $bInGroup - * @return array + * @return array * @throws \Exception * @link : https://msdn.microsoft.com/en-us/library/dd910416(v=office.12).aspx */ @@ -1801,11 +1810,11 @@ private function readRecordOfficeArtSpgrContainer($stream, $pos, $bInGroup = fal * The OfficeArtTertiaryFOPT record specifies a table of OfficeArtRGFOPTE records,. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd950206(v=office.12).aspx */ - private function readRecordOfficeArtTertiaryFOPT($stream, $pos) + private function readRecordOfficeArtTertiaryFOPT(string $stream, int $pos) { $arrayReturn = array( 'length' => 0, @@ -1866,11 +1875,11 @@ private function readRecordOfficeArtTertiaryFOPT($stream, $pos) * The OfficeArtDgContainer record specifies the container for all the file records for the objects in a drawing. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link : https://msdn.microsoft.com/en-us/library/dd924455(v=office.12).aspx */ - private function readRecordOfficeArtDgContainer($stream, $pos) + private function readRecordOfficeArtDgContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1906,10 +1915,10 @@ private function readRecordOfficeArtDgContainer($stream, $pos) * The OfficeArtFDG record specifies the number of shapes, the drawing identifier, and the shape identifier of the last shape in a drawing. * @param string $stream * @param integer $pos - * @return array + * @return array * @link : https://msdn.microsoft.com/en-us/library/dd946757(v=office.12).aspx */ - private function readRecordOfficeArtFDG($stream, $pos) + private function readRecordOfficeArtFDG(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -1930,10 +1939,10 @@ private function readRecordOfficeArtFDG($stream, $pos) * The OfficeArtFOPT record specifies a table of OfficeArtRGFOPTE records. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd943404(v=office.12).aspx */ - private function readRecordOfficeArtFOPT($stream, $pos) + private function readRecordOfficeArtFOPT(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2099,17 +2108,17 @@ private function readRecordOfficeArtFOPT($stream, $pos) case 0x0181: // Fill : fillColor //@link : http://msdn.microsoft.com/en-us/library/dd921332(v=office.12).aspx - $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); - $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); - $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); + $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, '0', STR_PAD_LEFT); // echo 'fillColor : '.$strColor.EOL; break; case 0x0183: // Fill : fillBackColor //@link : http://msdn.microsoft.com/en-us/library/dd950634(v=office.12).aspx - $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); - $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); - $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); + $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, '0', STR_PAD_LEFT); // echo 'fillBackColor : '.$strColor.EOL; break; case 0x0193: @@ -2129,9 +2138,9 @@ private function readRecordOfficeArtFOPT($stream, $pos) case 0x01C0: // Line Style : lineColor //@link : http://msdn.microsoft.com/en-us/library/dd920397(v=office.12).aspx - $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); - $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); - $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, STR_PAD_LEFT, '0'); + $strColor = str_pad(dechex(($opt['op'] >> 0) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= str_pad(dechex(($opt['op'] >> 8) & bindec('11111111')), 2, '0', STR_PAD_LEFT); + $strColor .= str_pad(dechex(($opt['op'] >> 16) & bindec('11111111')), 2, '0', STR_PAD_LEFT); $arrayReturn['lineColor'] = $strColor; break; case 0x01C1: @@ -2218,10 +2227,10 @@ private function readRecordOfficeArtFOPT($stream, $pos) * The OfficeArtFPSPL record specifies the former hierarchical position of the containing object that is either a shape or a group of shapes. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd947479(v=office.12).aspx */ - private function readRecordOfficeArtFPSPL($stream, $pos) + private function readRecordOfficeArtFPSPL(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2240,10 +2249,10 @@ private function readRecordOfficeArtFPSPL($stream, $pos) * The OfficeArtFSP record specifies an instance of a shape. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd925898(v=office.12).aspx */ - private function readRecordOfficeArtFSP($stream, $pos) + private function readRecordOfficeArtFSP(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2270,10 +2279,10 @@ private function readRecordOfficeArtFSP($stream, $pos) * The OfficeArtFSPGR record specifies the coordinate system of the group shape that the anchors of the child shape are expressed in. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd925381(v=office.12).aspx */ - private function readRecordOfficeArtFSPGR($stream, $pos) + private function readRecordOfficeArtFSPGR(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2299,10 +2308,10 @@ private function readRecordOfficeArtFSPGR($stream, $pos) * The OfficeArtSecondaryFOPT record specifies a table of OfficeArtRGFOPTE records. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd950259(v=office.12).aspx */ - private function readRecordOfficeArtSecondaryFOPT($stream, $pos) + private function readRecordOfficeArtSecondaryFOPT(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2322,11 +2331,11 @@ private function readRecordOfficeArtSecondaryFOPT($stream, $pos) * A container record that specifies information about a shape. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link : https://msdn.microsoft.com/en-us/library/dd950927(v=office.12).aspx */ - private function readRecordOfficeArtClientData($stream, $pos) + private function readRecordOfficeArtClientData(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2408,7 +2417,7 @@ private function readRecordOfficeArtClientData($stream, $pos) * @param integer $pos * @throws \Exception */ - private function readRecordPersistDirectoryAtom($stream, $pos) + private function readRecordPersistDirectoryAtom(string $stream, int $pos): void { $rHeader = $this->loadRecordHeader($stream, $pos); $pos += 8; @@ -2439,9 +2448,9 @@ private function readRecordPersistDirectoryAtom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd904856(v=office.12).aspx - * @return array + * @return array */ - private function readRecordPerSlideHeadersFootersContainer($stream, $pos) + private function readRecordPerSlideHeadersFootersContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2463,9 +2472,9 @@ private function readRecordPerSlideHeadersFootersContainer($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd923930(v=office.12).aspx - * @return array + * @return array */ - private function readRecordPlaceholderAtom($stream, $pos) + private function readRecordPlaceholderAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2487,9 +2496,9 @@ private function readRecordPlaceholderAtom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd904899(v=office.12).aspx - * @return array + * @return array */ - private function readRecordRecolorInfoAtom($stream, $pos) + private function readRecordRecolorInfoAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2511,9 +2520,9 @@ private function readRecordRecolorInfoAtom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd910800(v=office.12).aspx - * @return array + * @return array */ - private function readRecordRoundTripHFPlaceholder12Atom($stream, $pos) + private function readRecordRoundTripHFPlaceholder12Atom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2535,9 +2544,9 @@ private function readRecordRoundTripHFPlaceholder12Atom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd772926(v=office.12).aspx - * @return array + * @return array */ - private function readRecordRoundTripShapeId12Atom($stream, $pos) + private function readRecordRoundTripShapeId12Atom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2559,9 +2568,9 @@ private function readRecordRoundTripShapeId12Atom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd923801(v=office.12).aspx - * @return array + * @return array */ - private function readRecordRoundTripSlideSyncInfo12Container($stream, $pos) + private function readRecordRoundTripSlideSyncInfo12Container(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2583,9 +2592,9 @@ private function readRecordRoundTripSlideSyncInfo12Container($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd908949(v=office.12).aspx - * @return array + * @return array */ - private function readRecordShapeFlags10Atom($stream, $pos) + private function readRecordShapeFlags10Atom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2607,9 +2616,9 @@ private function readRecordShapeFlags10Atom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd925824(v=office.12).aspx - * @return array + * @return array */ - private function readRecordShapeFlagsAtom($stream, $pos) + private function readRecordShapeFlagsAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2631,9 +2640,9 @@ private function readRecordShapeFlagsAtom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd911033(v=office.12).aspx - * @return array + * @return array */ - private function readRecordShapeProgBinaryTagContainer($stream, $pos) + private function readRecordShapeProgBinaryTagContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2654,11 +2663,11 @@ private function readRecordShapeProgBinaryTagContainer($stream, $pos) * A container record that specifies programmable tags with additional shape data. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd911266(v=office.12).aspx */ - private function readRecordShapeProgTagsContainer($stream, $pos) + private function readRecordShapeProgTagsContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2693,10 +2702,10 @@ private function readRecordShapeProgTagsContainer($stream, $pos) * An atom record that specifies information about a slide. * @param string $stream * @param integer $pos - * @return array + * @return array * @link https://msdn.microsoft.com/en-us/library/dd923801(v=office.12).aspx */ - private function readRecordSlideAtom($stream, $pos) + private function readRecordSlideAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2735,7 +2744,7 @@ private function readRecordSlideAtom($stream, $pos) * @throws \Exception * @link http://msdn.microsoft.com/en-us/library/dd946323(v=office.12).aspx */ - private function readRecordSlideContainer($stream, $pos) + private function readRecordSlideContainer(string $stream, int $pos): void { // Core $this->oPhpPresentation->createSlide(); @@ -2787,9 +2796,9 @@ private function readRecordSlideContainer($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd906297(v=office.12).aspx - * @return array + * @return array{'length': int, 'slideName': string} */ - private function readRecordSlideNameAtom($stream, $pos) + private function readRecordSlideNameAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2817,9 +2826,9 @@ private function readRecordSlideNameAtom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd945703(v=office.12).aspx - * @return array + * @return array */ - private function readRecordSlideNumberMCAtom($stream, $pos) + private function readRecordSlideNumberMCAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2841,9 +2850,9 @@ private function readRecordSlideNumberMCAtom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd951946(v=office.12).aspx - * @return array + * @return array */ - private function readRecordSlideProgTagsContainer($stream, $pos) + private function readRecordSlideProgTagsContainer(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2865,9 +2874,9 @@ private function readRecordSlideProgTagsContainer($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd949420(v=office.12).aspx - * @return array + * @return array */ - private function readRecordSlideSchemeColorSchemeAtom($stream, $pos) + private function readRecordSlideSchemeColorSchemeAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2897,9 +2906,9 @@ private function readRecordSlideSchemeColorSchemeAtom($stream, $pos) * @param string $stream * @param integer $pos * @link https://msdn.microsoft.com/en-us/library/dd943408(v=office.12).aspx - * @return array + * @return array */ - private function readRecordSlideShowSlideInfoAtom($stream, $pos) + private function readRecordSlideShowSlideInfoAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -2923,7 +2932,7 @@ private function readRecordSlideShowSlideInfoAtom($stream, $pos) * @param integer $pos * @throws \Exception */ - private function readRecordUserEditAtom($stream, $pos) + private function readRecordUserEditAtom(string $stream, int $pos): void { $rHeader = $this->loadRecordHeader($stream, $pos); $pos += 8; @@ -2976,11 +2985,11 @@ private function readRecordUserEditAtom($stream, $pos) * @param string $stream * @param int $pos * @param int $strLenRT - * @return array + * @return array{'length': int, 'strLenRT': int, 'partLength': int, 'bold': bool, 'italic': bool, 'underline': bool, 'fontName': string, 'fontSize': int, 'color': Color} * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd945870(v=office.12).aspx */ - private function readStructureTextCFRun($stream, $pos, $strLenRT) + private function readStructureTextCFRun(string $stream, int $pos, int $strLenRT): array { $arrayReturn = array( 'length' => 0, @@ -3074,9 +3083,9 @@ private function readStructureTextCFRun($stream, $pos, $strLenRT) $arrayReturn['length'] += 1; if ($index == 0xFE) { - $strColor = str_pad(dechex($red), 2, STR_PAD_LEFT, '0'); - $strColor .= str_pad(dechex($green), 2, STR_PAD_LEFT, '0'); - $strColor .= str_pad(dechex($blue), 2, STR_PAD_LEFT, '0'); + $strColor = str_pad(dechex($red), 2, '0', STR_PAD_LEFT); + $strColor .= str_pad(dechex($green), 2, '0', STR_PAD_LEFT); + $strColor .= str_pad(dechex($blue), 2, '0', STR_PAD_LEFT); $arrayReturn['color'] = new Color('FF'.$strColor); } @@ -3093,11 +3102,11 @@ private function readStructureTextCFRun($stream, $pos, $strLenRT) * @param string $stream * @param integer $pos * @param integer $strLenRT - * @return array + * @return array{'length': int, 'strLenRT': int, 'alignH': string, 'bulletChar': string, 'leftMargin': int, 'indent': int} * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd923535(v=office.12).aspx */ - private function readStructureTextPFRun($stream, $pos, $strLenRT) + private function readStructureTextPFRun(string $stream, int $pos, int $strLenRT): array { $arrayReturn = array( 'length' => 0, @@ -3177,9 +3186,9 @@ private function readStructureTextPFRun($stream, $pos, $strLenRT) $arrayReturn['length'] += 1; if ($index == 0xFE) { - // $strColor = str_pad(dechex($red), 2, STR_PAD_LEFT, '0'); - // $strColor .= str_pad(dechex($green), 2, STR_PAD_LEFT, '0'); - // $strColor .= str_pad(dechex($blue), 2, STR_PAD_LEFT, '0'); + // $strColor = str_pad(dechex($red), 2, '0', STR_PAD_LEFT); + // $strColor .= str_pad(dechex($green), 2, '0', STR_PAD_LEFT); + // $strColor .= str_pad(dechex($blue), 2, '0', STR_PAD_LEFT); } } if ($masksData['align'] == 1) { @@ -3259,12 +3268,12 @@ private function readStructureTextPFRun($stream, $pos, $strLenRT) * A structure that specifies language and spelling information for a run of text. * @param string $stream * @param integer $pos - * @param string $strLenRT - * @return array + * @param int $strLenRT + * @return array * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd909603(v=office.12).aspx */ - private function readStructureTextSIRun($stream, $pos, $strLenRT) + private function readStructureTextSIRun(string $stream, int $pos, int $strLenRT): array { $arrayReturn = array( 'length' => 0, @@ -3321,11 +3330,11 @@ private function readStructureTextSIRun($stream, $pos, $strLenRT) * A structure that specifies tabbing, margins, and indentation for text. * @param string $stream * @param integer $pos - * @return array + * @return array * @throws \Exception * @link https://msdn.microsoft.com/en-us/library/dd922749(v=office.12).aspx */ - private function readStructureTextRuler($stream, $pos) + private function readStructureTextRuler(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, @@ -3415,11 +3424,11 @@ private function readStructureTextRuler($stream, $pos) } /** - * @param $stream + * @param string $stream * @param int $pos * @throws \Exception */ - private function readRecordNotesContainer($stream, $pos) + private function readRecordNotesContainer(string $stream, int $pos): void { // notesAtom $notesAtom = $this->readRecordNotesAtom($stream, $pos); @@ -3436,12 +3445,12 @@ private function readRecordNotesContainer($stream, $pos) } /** - * @param $stream + * @param string $stream * @param int $pos - * @return array + * @return array * @throws \Exception */ - private function readRecordNotesAtom($stream, $pos) + private function readRecordNotesAtom(string $stream, int $pos): array { $arrayReturn = array( 'length' => 0, diff --git a/src/PhpPresentation/Reader/ReaderInterface.php b/src/PhpPresentation/Reader/ReaderInterface.php index c5149e99c7..d95772d80c 100644 --- a/src/PhpPresentation/Reader/ReaderInterface.php +++ b/src/PhpPresentation/Reader/ReaderInterface.php @@ -17,6 +17,8 @@ namespace PhpOffice\PhpPresentation\Reader; +use PhpOffice\PhpPresentation\PhpPresentation; + /** * Reader interface */ @@ -25,17 +27,17 @@ interface ReaderInterface /** * Can the current \PhpOffice\PhpPresentation\Reader\ReaderInterface read the file? * - * @param string $pFilename + * @param string $pFilename * @return boolean */ - public function canRead($pFilename); + public function canRead(string $pFilename): bool; /** * Loads PhpPresentation from file * - * @param string $pFilename - * @return \PhpOffice\PhpPresentation\PhpPresentation + * @param string $pFilename + * @return PhpPresentation * @throws \Exception */ - public function load($pFilename); + public function load(string $pFilename): PhpPresentation; } diff --git a/src/PhpPresentation/Reader/Serialized.php b/src/PhpPresentation/Reader/Serialized.php index 7349ecdd3d..a3d9c617cd 100644 --- a/src/PhpPresentation/Reader/Serialized.php +++ b/src/PhpPresentation/Reader/Serialized.php @@ -17,8 +17,12 @@ namespace PhpOffice\PhpPresentation\Reader; +use Exception; use PhpOffice\Common\File; +use PhpOffice\PhpPresentation\PhpPresentation; +use PhpOffice\PhpPresentation\Shape\Drawing\File as DrawingFile; use PhpOffice\PhpPresentation\Shape\Drawing\AbstractDrawingAdapter; +use ZipArchive; /** * Serialized format reader @@ -28,11 +32,11 @@ class Serialized implements ReaderInterface /** * Can the current \PhpOffice\PhpPresentation\Reader\ReaderInterface read the file? * - * @param string $pFilename + * @param string $pFilename * @throws \Exception * @return boolean */ - public function canRead($pFilename) + public function canRead(string $pFilename): bool { return $this->fileSupportsUnserializePhpPresentation($pFilename); } @@ -40,11 +44,11 @@ public function canRead($pFilename) /** * Does a file support UnserializePhpPresentation ? * - * @param string $pFilename + * @param string $pFilename * @throws \Exception * @return boolean */ - public function fileSupportsUnserializePhpPresentation($pFilename = '') + public function fileSupportsUnserializePhpPresentation(string $pFilename = ''): bool { // Check if file exists if (!file_exists($pFilename)) { @@ -58,11 +62,11 @@ public function fileSupportsUnserializePhpPresentation($pFilename = '') /** * Loads PhpPresentation Serialized file * - * @param string $pFilename - * @return \PhpOffice\PhpPresentation\PhpPresentation + * @param string $pFilename + * @return PhpPresentation * @throws \Exception */ - public function load($pFilename) + public function load(string $pFilename): PhpPresentation { // Check if file exists if (!file_exists($pFilename)) { @@ -80,34 +84,44 @@ public function load($pFilename) /** * Load PhpPresentation Serialized file * - * @param string $pFilename - * @return \PhpOffice\PhpPresentation\PhpPresentation + * @param string $pFilename + * @return PhpPresentation */ - private function loadSerialized($pFilename) + private function loadSerialized(string $pFilename): PhpPresentation { - $oArchive = new \ZipArchive(); - if ($oArchive->open($pFilename) === true) { - $xmlContent = $oArchive->getFromName('PhpPresentation.xml'); + $oArchive = new ZipArchive(); + if ($oArchive->open($pFilename) !== true) { + throw new Exception(''); + } + + $xmlContent = $oArchive->getFromName('PhpPresentation.xml'); + if (empty($xmlContent)) { + throw new Exception(sprintf( + 'The file %s in the serialized file %s is malformed', + 'PhpPresentation.xml', + $pFilename + )); + } - if (!empty($xmlContent)) { - $xmlData = simplexml_load_string($xmlContent); - $file = unserialize(base64_decode((string) $xmlData->data)); + $xmlData = simplexml_load_string($xmlContent); + $file = unserialize(base64_decode((string) $xmlData->data)); - // Update media links - for ($i = 0; $i < $file->getSlideCount(); ++$i) { - for ($j = 0; $j < $file->getSlide($i)->getShapeCollection()->count(); ++$j) { - if ($file->getSlide($i)->getShapeCollection()->offsetGet($j) instanceof AbstractDrawingAdapter) { - $imgTemp = $file->getSlide($i)->getShapeCollection()->offsetGet($j); - $imgTemp->setPath('zip://' . $pFilename . '#media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME), false); - } + // Update media links + for ($i = 0; $i < $file->getSlideCount(); ++$i) { + for ($j = 0; $j < $file->getSlide($i)->getShapeCollection()->count(); ++$j) { + if ($file->getSlide($i)->getShapeCollection()->offsetGet($j) instanceof AbstractDrawingAdapter) { + $imgTemp = $file->getSlide($i)->getShapeCollection()->offsetGet($j); + $imgPath = 'zip://' . $pFilename . '#media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME); + if ($imgTemp instanceof DrawingFile) { + $imgTemp->setPath($imgPath, false); + } else { + $imgTemp->setPath($imgPath); } } - - $oArchive->close(); - return $file; } } - return null; + $oArchive->close(); + return $file; } } diff --git a/src/PhpPresentation/Shape/AbstractGraphic.php b/src/PhpPresentation/Shape/AbstractGraphic.php index 38623c964a..ffdfba1521 100644 --- a/src/PhpPresentation/Shape/AbstractGraphic.php +++ b/src/PhpPresentation/Shape/AbstractGraphic.php @@ -116,7 +116,7 @@ public function getName() /** * Set Name * - * @param string $pValue + * @param string $pValue * @return $this */ public function setName($pValue = '') @@ -138,7 +138,7 @@ public function getDescription() /** * Set Description * - * @param string $pValue + * @param string $pValue * @return $this */ public function setDescription($pValue = '') @@ -151,10 +151,10 @@ public function setDescription($pValue = '') /** * Set Width * - * @param int $pValue - * @return \PhpOffice\PhpPresentation\Shape\AbstractGraphic + * @param int $pValue + * @return self */ - public function setWidth($pValue = 0) + public function setWidth(int $pValue = 0) { // Resize proportional? if ($this->resizeProportional && $pValue != 0 && $this->width != 0) { @@ -171,10 +171,10 @@ public function setWidth($pValue = 0) /** * Set Height * - * @param int $pValue - * @return \PhpOffice\PhpPresentation\Shape\AbstractGraphic + * @param int $pValue + * @return self */ - public function setHeight($pValue = 0) + public function setHeight(int $pValue = 0) { // Resize proportional? if ($this->resizeProportional && $pValue != 0 && $this->height != 0) { @@ -191,11 +191,11 @@ public function setHeight($pValue = 0) /** * Set width and height with proportional resize * @author Vincent@luo MSN:kele_100@hotmail.com - * @param int $width - * @param int $height - * @return \PhpOffice\PhpPresentation\Shape\AbstractGraphic + * @param int $width + * @param int $height + * @return self */ - public function setWidthAndHeight($width = 0, $height = 0) + public function setWidthAndHeight(int $width = 0, int $height = 0) { $xratio = $width / $this->width; $yratio = $height / $this->height; @@ -225,10 +225,10 @@ public function isResizeProportional() /** * Set ResizeProportional * - * @param boolean $pValue - * @return \PhpOffice\PhpPresentation\Shape\AbstractGraphic + * @param boolean $pValue + * @return self */ - public function setResizeProportional($pValue = true) + public function setResizeProportional($pValue = true): self { $this->resizeProportional = $pValue; @@ -240,7 +240,7 @@ public function setResizeProportional($pValue = true) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->name . $this->description . parent::getHashCode() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Chart.php b/src/PhpPresentation/Shape/Chart.php index f254a3907a..7946c4d7c1 100644 --- a/src/PhpPresentation/Shape/Chart.php +++ b/src/PhpPresentation/Shape/Chart.php @@ -141,7 +141,7 @@ public function hasIncludedSpreadsheet() /** * Include spreadsheet for editing data? Requires PHPExcel in the same folder as PhpPresentation * - * @param boolean $value + * @param boolean $value * @return \PhpOffice\PhpPresentation\Shape\Chart */ public function setIncludeSpreadsheet($value = false) @@ -165,7 +165,7 @@ public function getIndexedFilename() * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5(parent::getHashCode() . $this->title->getHashCode() . $this->legend->getHashCode() . $this->plotArea->getHashCode() . $this->view3D->getHashCode() . ($this->includeSpreadsheet ? 1 : 0) . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Chart/Axis.php b/src/PhpPresentation/Shape/Chart/Axis.php index abd5d21779..7ebd8e0e8d 100644 --- a/src/PhpPresentation/Shape/Chart/Axis.php +++ b/src/PhpPresentation/Shape/Chart/Axis.php @@ -56,12 +56,12 @@ class Axis implements ComparableInterface private $font; /** - * @var Gridlines + * @var Gridlines|null */ protected $majorGridlines; /** - * @var Gridlines + * @var Gridlines|null */ protected $minorGridlines; @@ -130,7 +130,7 @@ public function getTitle() /** * Set Title * - * @param string $value + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\Chart\Axis */ public function setTitle($value = 'Axis Title') @@ -153,7 +153,7 @@ public function getFont() /** * Set font * - * @param \PhpOffice\PhpPresentation\Style\Font $pFont Font + * @param \PhpOffice\PhpPresentation\Style\Font $pFont Font * @throws \Exception * @return \PhpOffice\PhpPresentation\Shape\Chart\Axis */ @@ -176,7 +176,7 @@ public function getFormatCode() /** * Set Format Code * - * @param string $value + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\Chart\Axis */ public function setFormatCode($value = '') @@ -223,36 +223,36 @@ public function setMaxBounds($maxBounds = null) } /** - * @return Gridlines + * @return Gridlines|null */ - public function getMajorGridlines() + public function getMajorGridlines(): ?Gridlines { return $this->majorGridlines; } /** * @param Gridlines $majorGridlines - * @return Axis + * @return self */ - public function setMajorGridlines(Gridlines $majorGridlines) + public function setMajorGridlines(Gridlines $majorGridlines): self { $this->majorGridlines = $majorGridlines; return $this; } /** - * @return Gridlines + * @return Gridlines|null */ - public function getMinorGridlines() + public function getMinorGridlines(): ?Gridlines { return $this->minorGridlines; } /** * @param Gridlines $minorGridlines - * @return Axis + * @return self */ - public function setMinorGridlines(Gridlines $minorGridlines) + public function setMinorGridlines(Gridlines $minorGridlines): self { $this->minorGridlines = $minorGridlines; return $this; @@ -353,7 +353,7 @@ public function setOutline(Outline $outline) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->title . $this->formatCode . __CLASS__); } @@ -361,7 +361,7 @@ public function getHashCode() /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -371,9 +371,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -384,10 +384,10 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; return $this; diff --git a/src/PhpPresentation/Shape/Chart/Legend.php b/src/PhpPresentation/Shape/Chart/Legend.php index 3412c8ee7e..fd374e4c13 100644 --- a/src/PhpPresentation/Shape/Chart/Legend.php +++ b/src/PhpPresentation/Shape/Chart/Legend.php @@ -80,7 +80,7 @@ class Legend implements ComparableInterface /** * Font * - * @var \PhpOffice\PhpPresentation\Style\Font + * @var Font|null */ private $font; @@ -129,7 +129,7 @@ public function isVisible() /** * Set Visible * - * @param boolean $value + * @param boolean $value * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend */ public function setVisible($value = true) @@ -151,7 +151,7 @@ public function getPosition() /** * Set Position * - * @param string $value + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend */ public function setPosition($value = self::POSITION_RIGHT) @@ -165,7 +165,7 @@ public function setPosition($value = self::POSITION_RIGHT) * * @return float */ - public function getOffsetX() + public function getOffsetX(): float { return $this->offsetX; } @@ -173,12 +173,12 @@ public function getOffsetX() /** * Set OffsetX (as a fraction of the chart) * - * @param float|int $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend + * @param float $pValue + * @return self */ - public function setOffsetX($value = 0) + public function setOffsetX(float $pValue = 0): self { - $this->offsetX = (float)$value; + $this->offsetX = $pValue; return $this; } @@ -187,7 +187,7 @@ public function setOffsetX($value = 0) * * @return float */ - public function getOffsetY() + public function getOffsetY(): float { return $this->offsetY; } @@ -195,12 +195,12 @@ public function getOffsetY() /** * Set OffsetY (as a fraction of the chart) * - * @param float|int $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend + * @param float $pValue + * @return self */ - public function setOffsetY($value = 0) + public function setOffsetY(float $pValue = 0): self { - $this->offsetY = (float)$value; + $this->offsetY = $pValue; return $this; } @@ -209,7 +209,7 @@ public function setOffsetY($value = 0) * * @return float */ - public function getWidth() + public function getWidth(): float { return $this->width; } @@ -217,12 +217,12 @@ public function getWidth() /** * Set Width (as a fraction of the chart) * - * @param float|int $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend + * @param float $pValue + * @return self */ - public function setWidth($value = 0) + public function setWidth(float $pValue = 0): self { - $this->width = (float)$value; + $this->width = $pValue; return $this; } @@ -231,7 +231,7 @@ public function setWidth($value = 0) * * @return float */ - public function getHeight() + public function getHeight(): float { return $this->height; } @@ -239,21 +239,21 @@ public function getHeight() /** * Set Height (as a fraction of the chart) * - * @param float|int $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend + * @param float $value + * @return self */ - public function setHeight($value = 0) + public function setHeight(float $value = 0): self { - $this->height = (float)$value; + $this->height = $value; return $this; } /** * Get font * - * @return \PhpOffice\PhpPresentation\Style\Font + * @return Font|null */ - public function getFont() + public function getFont(): ?Font { return $this->font; } @@ -261,11 +261,11 @@ public function getFont() /** * Set font * - * @param \PhpOffice\PhpPresentation\Style\Font $pFont Font + * @param Font|null $pFont Font * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend + * @return self */ - public function setFont(Font $pFont = null) + public function setFont(Font $pFont = null): self { $this->font = $pFont; return $this; @@ -284,7 +284,7 @@ public function getBorder() /** * Set Border * - * @param \PhpOffice\PhpPresentation\Style\Border $border + * @param \PhpOffice\PhpPresentation\Style\Border $border * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend */ public function setBorder(Border $border) @@ -306,7 +306,7 @@ public function getFill() /** * Set Fill * - * @param \PhpOffice\PhpPresentation\Style\Fill $fill + * @param \PhpOffice\PhpPresentation\Style\Fill $fill * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend */ public function setFill(Fill $fill) @@ -328,7 +328,7 @@ public function getAlignment() /** * Set alignment * - * @param \PhpOffice\PhpPresentation\Style\Alignment $alignment + * @param \PhpOffice\PhpPresentation\Style\Alignment $alignment * @return \PhpOffice\PhpPresentation\Shape\Chart\Legend */ public function setAlignment(Alignment $alignment) @@ -342,7 +342,7 @@ public function setAlignment(Alignment $alignment) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->position . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->font->getHashCode() . $this->border->getHashCode() . $this->fill->getHashCode() . $this->alignment->getHashCode() . ($this->visible ? 't' : 'f') . __CLASS__); } @@ -350,7 +350,7 @@ public function getHashCode() /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -360,9 +360,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -373,10 +373,10 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index * @return Legend */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; return $this; diff --git a/src/PhpPresentation/Shape/Chart/Marker.php b/src/PhpPresentation/Shape/Chart/Marker.php index 7744b69c60..2bb3d6913b 100644 --- a/src/PhpPresentation/Shape/Chart/Marker.php +++ b/src/PhpPresentation/Shape/Chart/Marker.php @@ -33,6 +33,9 @@ class Marker public const SYMBOL_TRIANGLE = 'triangle'; public const SYMBOL_X = 'x'; + /** + * @var array + */ public static $arraySymbol = array( self::SYMBOL_CIRCLE, self::SYMBOL_DASH, @@ -59,16 +62,16 @@ class Marker /** * @return string */ - public function getSymbol() + public function getSymbol(): string { return $this->symbol; } /** * @param string $symbol - * @return $this + * @return self */ - public function setSymbol($symbol = self::SYMBOL_NONE) + public function setSymbol(string $symbol = self::SYMBOL_NONE): self { $this->symbol = $symbol; return $this; @@ -77,16 +80,16 @@ public function setSymbol($symbol = self::SYMBOL_NONE) /** * @return int */ - public function getSize() + public function getSize(): int { return $this->size; } /** * @param int $size - * @return $this + * @return self */ - public function setSize($size = 5) + public function setSize(int $size = 5): self { $this->size = $size; return $this; diff --git a/src/PhpPresentation/Shape/Chart/PlotArea.php b/src/PhpPresentation/Shape/Chart/PlotArea.php index 910835d50d..a2771911d9 100644 --- a/src/PhpPresentation/Shape/Chart/PlotArea.php +++ b/src/PhpPresentation/Shape/Chart/PlotArea.php @@ -28,21 +28,21 @@ class PlotArea implements ComparableInterface /** * Type * - * @var \PhpOffice\PhpPresentation\Shape\Chart\Type\AbstractType + * @var null|AbstractType */ private $type; /** * Axis X * - * @var \PhpOffice\PhpPresentation\Shape\Chart\Axis + * @var Axis */ private $axisX; /** * Axis Y * - * @var \PhpOffice\PhpPresentation\Shape\Chart\Axis + * @var Axis */ private $axisY; @@ -74,12 +74,8 @@ class PlotArea implements ComparableInterface */ private $height = 0; - /** - * Create a new \PhpOffice\PhpPresentation\Shape\Chart\PlotArea instance - */ public function __construct() { - $this->type = null; $this->axisX = new Axis(); $this->axisY = new Axis(); } @@ -91,12 +87,10 @@ public function __clone() } /** - * Get type - * * @return AbstractType * @throws \Exception */ - public function getType() + public function getType(): AbstractType { if (is_null($this->type)) { throw new \Exception('Chart type has not been set.'); @@ -106,12 +100,10 @@ public function getType() } /** - * Set type - * - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\AbstractType $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\PlotArea + * @param AbstractType $value + * @return self */ - public function setType(Type\AbstractType $value) + public function setType(AbstractType $value): self { $this->type = $value; @@ -121,9 +113,9 @@ public function setType(Type\AbstractType $value) /** * Get Axis X * - * @return \PhpOffice\PhpPresentation\Shape\Chart\Axis + * @return Axis */ - public function getAxisX() + public function getAxisX(): Axis { return $this->axisX; } @@ -131,9 +123,9 @@ public function getAxisX() /** * Get Axis Y * - * @return \PhpOffice\PhpPresentation\Shape\Chart\Axis + * @return Axis */ - public function getAxisY() + public function getAxisY(): Axis { return $this->axisY; } @@ -143,7 +135,7 @@ public function getAxisY() * * @return float */ - public function getOffsetX() + public function getOffsetX(): float { return $this->offsetX; } @@ -151,12 +143,12 @@ public function getOffsetX() /** * Set OffsetX (as a fraction of the chart) * - * @param float|int $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\PlotArea + * @param float $pValue + * @return self */ - public function setOffsetX($value = 0) + public function setOffsetX(float $pValue = 0): self { - $this->offsetX = (float)$value; + $this->offsetX = $pValue; return $this; } @@ -166,7 +158,7 @@ public function setOffsetX($value = 0) * * @return float */ - public function getOffsetY() + public function getOffsetY(): float { return $this->offsetY; } @@ -174,12 +166,12 @@ public function getOffsetY() /** * Set OffsetY (as a fraction of the chart) * - * @param float|int $value + * @param float $pValue * @return \PhpOffice\PhpPresentation\Shape\Chart\PlotArea */ - public function setOffsetY($value = 0) + public function setOffsetY(float $pValue = 0): self { - $this->offsetY = (float)$value; + $this->offsetY = $pValue; return $this; } @@ -189,7 +181,7 @@ public function setOffsetY($value = 0) * * @return float */ - public function getWidth() + public function getWidth(): float { return $this->width; } @@ -197,12 +189,12 @@ public function getWidth() /** * Set Width (as a fraction of the chart) * - * @param float|int $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\PlotArea + * @param int $pValue + * @return self */ - public function setWidth($value = 0) + public function setWidth(int $pValue = 0): self { - $this->width = (float)$value; + $this->width = $pValue; return $this; } @@ -212,7 +204,7 @@ public function setWidth($value = 0) * * @return float */ - public function getHeight() + public function getHeight(): float { return $this->height; } @@ -220,12 +212,12 @@ public function getHeight() /** * Set Height (as a fraction of the chart) * - * @param float|int $value + * @param float $value * @return \PhpOffice\PhpPresentation\Shape\Chart\PlotArea */ - public function setHeight($value = 0) + public function setHeight(float $value = 0): self { - $this->height = (float)$value; + $this->height = $value; return $this; } @@ -235,7 +227,7 @@ public function setHeight($value = 0) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5((is_null($this->type) ? 'null' : $this->type->getHashCode()) . $this->axisX->getHashCode() . $this->axisY->getHashCode() . $this->offsetX . $this->offsetY . $this->width . $this->height . __CLASS__); } @@ -243,7 +235,7 @@ public function getHashCode() /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -253,9 +245,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -266,10 +258,10 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index * @return PlotArea */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; return $this; diff --git a/src/PhpPresentation/Shape/Chart/Series.php b/src/PhpPresentation/Shape/Chart/Series.php index fce0be2161..3562343e92 100644 --- a/src/PhpPresentation/Shape/Chart/Series.php +++ b/src/PhpPresentation/Shape/Chart/Series.php @@ -22,9 +22,6 @@ use PhpOffice\PhpPresentation\Style\Font; use PhpOffice\PhpPresentation\Style\Outline; -/** - * \PhpOffice\PhpPresentation\Shape\Chart\Series - */ class Series implements ComparableInterface { /* Label positions */ @@ -40,7 +37,7 @@ class Series implements ComparableInterface /** * DataPointFills (key/value) - * @var array + * @var array */ protected $dataPointFills = array(); @@ -51,25 +48,21 @@ class Series implements ComparableInterface protected $DlblNumFormat = ''; /** - * Separator - * @var string + * @var string|null */ - protected $separator = null; + protected $separator; /** - * Fill - * @var \PhpOffice\PhpPresentation\Style\Fill + * @var Fill|null */ protected $fill; /** - * Font - * @var \PhpOffice\PhpPresentation\Style\Font + * @var Font|null */ protected $font; /** - * Label position * @var string */ protected $labelPosition = 'ctr'; @@ -80,7 +73,7 @@ class Series implements ComparableInterface protected $marker; /** - * @var Outline + * @var Outline|null */ protected $outline; @@ -98,7 +91,7 @@ class Series implements ComparableInterface /** * Show Legend Key - * @var boolean + * @var bool */ private $showLegendKey = false; @@ -128,23 +121,21 @@ class Series implements ComparableInterface /** * Values (key/value) - * @var array + * @var array */ private $values = array(); /** * Hash index - * @var string + * @var int */ private $hashIndex; /** - * Create a new \PhpOffice\PhpPresentation\Shape\Chart\Series instance - * - * @param string $title Title - * @param array $values Values + * @param string $title + * @param array $values */ - public function __construct($title = 'Series Title', $values = array()) + public function __construct(string $title = 'Series Title', array $values = array()) { $this->fill = new Fill(); $this->font = new Font(); @@ -160,7 +151,7 @@ public function __construct($title = 'Series Title', $values = array()) * * @return string */ - public function getTitle() + public function getTitle(): string { return $this->title; } @@ -168,10 +159,10 @@ public function getTitle() /** * Set Title * - * @param string $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param string $value + * @return self */ - public function setTitle($value = 'Series Title') + public function setTitle(string $value = 'Series Title'): self { $this->title = $value; @@ -183,7 +174,7 @@ public function setTitle($value = 'Series Title') * * @return string */ - public function getDlblNumFormat() + public function getDlblNumFormat(): string { return $this->DlblNumFormat; } @@ -191,9 +182,9 @@ public function getDlblNumFormat() /** * Has Data Label NumFormat * - * @return string + * @return bool */ - public function hasDlblNumFormat() + public function hasDlblNumFormat(): bool { return !empty($this->DlblNumFormat); } @@ -201,44 +192,38 @@ public function hasDlblNumFormat() /** * Set Data Label NumFormat * - * @param string $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param string $value + * @return self */ - public function setDlblNumFormat($value = '') + public function setDlblNumFormat(string $value = ''): self { $this->DlblNumFormat = $value; return $this; } /** - * Get Fill - * - * @return \PhpOffice\PhpPresentation\Style\Fill + * @return Fill */ - public function getFill() + public function getFill(): ?Fill { return $this->fill; } /** - * Set Fill - * - * @param \PhpOffice\PhpPresentation\Style\Fill $fill - * @return Series + * @param Fill|null $fill + * @return self */ - public function setFill(Fill $fill = null) + public function setFill(Fill $fill = null): self { $this->fill = $fill; return $this; } /** - * Get DataPointFill - * - * @param int $dataPointIndex Data point index. - * @return \PhpOffice\PhpPresentation\Style\Fill + * @param int $dataPointIndex Data point index. + * @return Fill */ - public function getDataPointFill($dataPointIndex) + public function getDataPointFill(int $dataPointIndex): Fill { if (!isset($this->dataPointFills[$dataPointIndex])) { $this->dataPointFills[$dataPointIndex] = new Fill(); @@ -248,11 +233,9 @@ public function getDataPointFill($dataPointIndex) } /** - * Get DataPointFills - * * @return Fill[] */ - public function getDataPointFills() + public function getDataPointFills(): array { return $this->dataPointFills; } @@ -260,9 +243,9 @@ public function getDataPointFills() /** * Get Values * - * @return array + * @return array */ - public function getValues() + public function getValues(): array { return $this->values; } @@ -270,12 +253,12 @@ public function getValues() /** * Set Values * - * @param array $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param array $values + * @return self */ - public function setValues($value = array()) + public function setValues(array $values = array()): self { - $this->values = $value; + $this->values = $values; return $this; } @@ -283,11 +266,11 @@ public function setValues($value = array()) /** * Add Value * - * @param mixed $key - * @param mixed $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param string $key + * @param string $value + * @return self */ - public function addValue($key, $value) + public function addValue(string $key, string $value): self { $this->values[$key] = $value; @@ -299,7 +282,7 @@ public function addValue($key, $value) * * @return boolean */ - public function hasShowSeriesName() + public function hasShowSeriesName(): bool { return $this->showSeriesName; } @@ -307,10 +290,10 @@ public function hasShowSeriesName() /** * Set ShowSeriesName * - * @param boolean $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param boolean $value + * @return self */ - public function setShowSeriesName($value) + public function setShowSeriesName(bool $value): self { $this->showSeriesName = $value; @@ -322,7 +305,7 @@ public function setShowSeriesName($value) * * @return boolean */ - public function hasShowCategoryName() + public function hasShowCategoryName(): bool { return $this->showCategoryName; } @@ -330,10 +313,10 @@ public function hasShowCategoryName() /** * Set ShowCategoryName * - * @param boolean $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param boolean $value + * @return self */ - public function setShowCategoryName($value) + public function setShowCategoryName(bool $value): self { $this->showCategoryName = $value; @@ -343,9 +326,9 @@ public function setShowCategoryName($value) /** * Get ShowValue * - * @return boolean + * @return bool */ - public function hasShowLegendKey() + public function hasShowLegendKey(): bool { return $this->showLegendKey; } @@ -353,12 +336,12 @@ public function hasShowLegendKey() /** * Set ShowValue * - * @param boolean $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param bool $value + * @return self */ - public function setShowLegendKey($value) + public function setShowLegendKey(bool $value): self { - $this->showLegendKey = (bool)$value; + $this->showLegendKey = $value; return $this; } @@ -368,7 +351,7 @@ public function setShowLegendKey($value) * * @return boolean */ - public function hasShowValue() + public function hasShowValue(): bool { return $this->showValue; } @@ -376,10 +359,10 @@ public function hasShowValue() /** * Set ShowValue * - * @param boolean $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param boolean $value + * @return self */ - public function setShowValue($value) + public function setShowValue(bool $value): self { $this->showValue = $value; @@ -391,7 +374,7 @@ public function setShowValue($value) * * @return boolean */ - public function hasShowPercentage() + public function hasShowPercentage(): bool { return $this->showPercentage; } @@ -399,10 +382,10 @@ public function hasShowPercentage() /** * Set ShowPercentage * - * @param boolean $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param boolean $value + * @return self */ - public function setShowPercentage($value) + public function setShowPercentage(bool $value): self { $this->showPercentage = $value; @@ -410,31 +393,27 @@ public function setShowPercentage($value) } /** - * Get ShowLeaderLines - * * @return boolean */ - public function hasShowSeparator() + public function hasShowSeparator(): bool { return !is_null($this->separator); } /** - * Set Separator - * @param string $pValue - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param string|null $pValue + * @return self */ - public function setSeparator($pValue) + public function setSeparator(?string $pValue): self { $this->separator = $pValue; return $this; } /** - * Get Separator - * @return string + * @return string|null */ - public function getSeparator() + public function getSeparator(): ?string { return $this->separator; } @@ -444,7 +423,7 @@ public function getSeparator() * * @return boolean */ - public function hasShowLeaderLines() + public function hasShowLeaderLines(): bool { return $this->showLeaderLines; } @@ -452,8 +431,8 @@ public function hasShowLeaderLines() /** * Set ShowLeaderLines * - * @param boolean $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param boolean $value + * @return self */ public function setShowLeaderLines($value) { @@ -465,9 +444,9 @@ public function setShowLeaderLines($value) /** * Get font * - * @return \PhpOffice\PhpPresentation\Style\Font + * @return Font */ - public function getFont() + public function getFont(): ?Font { return $this->font; } @@ -475,11 +454,10 @@ public function getFont() /** * Set font * - * @param \PhpOffice\PhpPresentation\Style\Font $pFont Font - * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param Font|null $pFont Font + * @return self */ - public function setFont(Font $pFont = null) + public function setFont(Font $pFont = null): self { $this->font = $pFont; @@ -491,7 +469,7 @@ public function setFont(Font $pFont = null) * * @return string */ - public function getLabelPosition() + public function getLabelPosition(): string { return $this->labelPosition; } @@ -499,10 +477,10 @@ public function getLabelPosition() /** * Set label position * - * @param string $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param string $value + * @return self */ - public function setLabelPosition($value) + public function setLabelPosition(string $value): self { $this->labelPosition = $value; @@ -512,34 +490,34 @@ public function setLabelPosition($value) /** * @return Marker */ - public function getMarker() + public function getMarker(): Marker { return $this->marker; } /** * @param Marker $marker - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @return self */ - public function setMarker(Marker $marker) + public function setMarker(Marker $marker): self { $this->marker = $marker; return $this; } /** - * @return Outline + * @return Outline|null */ - public function getOutline() + public function getOutline(): ?Outline { return $this->outline; } /** - * @param Outline $outline - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param Outline|null $outline + * @return self */ - public function setOutline(Outline $outline) + public function setOutline(?Outline $outline): self { $this->outline = $outline; return $this; @@ -550,7 +528,7 @@ public function setOutline(Outline $outline) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5((is_null($this->fill) ? 'null' : $this->fill->getHashCode()) . (is_null($this->font) ? 'null' : $this->font->getHashCode()) . var_export($this->values, true) . var_export($this, true) . __CLASS__); } @@ -561,9 +539,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -574,10 +552,10 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param int $value Hash index + * @return self */ - public function setHashIndex($value) + public function setHashIndex(int $value): self { $this->hashIndex = $value; return $this; diff --git a/src/PhpPresentation/Shape/Chart/Title.php b/src/PhpPresentation/Shape/Chart/Title.php index b5ac6e0060..560697c088 100644 --- a/src/PhpPresentation/Shape/Chart/Title.php +++ b/src/PhpPresentation/Shape/Chart/Title.php @@ -85,7 +85,7 @@ class Title implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -113,7 +113,7 @@ public function isVisible() /** * Set Visible * - * @param boolean $value + * @param boolean $value * @return \PhpOffice\PhpPresentation\Shape\Chart\Title */ public function setVisible($value = true) @@ -136,7 +136,7 @@ public function getText() /** * Set Text * - * @param string $value + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\Chart\Title */ public function setText($value = null) @@ -151,7 +151,7 @@ public function setText($value = null) * * @return float */ - public function getOffsetX() + public function getOffsetX(): float { return $this->offsetX; } @@ -159,10 +159,10 @@ public function getOffsetX() /** * Set OffsetX (as a fraction of the chart) * - * @param float $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Title + * @param float $value + * @return self */ - public function setOffsetX($value = 0.01) + public function setOffsetX(float $value = 0.01): self { $this->offsetX = $value; @@ -174,7 +174,7 @@ public function setOffsetX($value = 0.01) * * @return float */ - public function getOffsetY() + public function getOffsetY(): float { return $this->offsetY; } @@ -182,12 +182,12 @@ public function getOffsetY() /** * Set OffsetY (as a fraction of the chart) * - * @param float $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Title + * @param float $pValue + * @return self */ - public function setOffsetY($value = 0.01) + public function setOffsetY(float $pValue = 0.01): self { - $this->offsetY = $value; + $this->offsetY = $pValue; return $this; } @@ -197,7 +197,7 @@ public function setOffsetY($value = 0.01) * * @return float */ - public function getWidth() + public function getWidth(): float { return $this->width; } @@ -205,12 +205,12 @@ public function getWidth() /** * Set Width (as a fraction of the chart) * - * @param float|int $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Title + * @param float $pValue + * @return self */ - public function setWidth($value = 0) + public function setWidth(float $pValue = 0): self { - $this->width = (float)$value; + $this->width = $pValue; return $this; } @@ -220,7 +220,7 @@ public function setWidth($value = 0) * * @return float */ - public function getHeight() + public function getHeight(): float { return $this->height; } @@ -228,12 +228,12 @@ public function getHeight() /** * Set Height (as a fraction of the chart) * - * @param float|int $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Title + * @param float $value + * @return self */ - public function setHeight($value = 0) + public function setHeight(float $value = 0): self { - $this->height = (float)$value; + $this->height = $value; return $this; } @@ -241,9 +241,9 @@ public function setHeight($value = 0) /** * Get font * - * @return \PhpOffice\PhpPresentation\Style\Font + * @return Font|null */ - public function getFont() + public function getFont(): ?Font { return $this->font; } @@ -251,11 +251,11 @@ public function getFont() /** * Set font * - * @param \PhpOffice\PhpPresentation\Style\Font $pFont Font + * @param Font|null $pFont Font * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\Chart\Title + * @return self */ - public function setFont(Font $pFont = null) + public function setFont(Font $pFont = null): self { $this->font = $pFont; @@ -275,7 +275,7 @@ public function getAlignment() /** * Set alignment * - * @param \PhpOffice\PhpPresentation\Style\Alignment $alignment + * @param \PhpOffice\PhpPresentation\Style\Alignment $alignment * @return \PhpOffice\PhpPresentation\Shape\Chart\Title */ public function setAlignment(Alignment $alignment) @@ -290,7 +290,7 @@ public function setAlignment(Alignment $alignment) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->text . $this->offsetX . $this->offsetY . $this->width . $this->height . $this->font->getHashCode() . $this->alignment->getHashCode() . ($this->visible ? 't' : 'f') . __CLASS__); } @@ -301,9 +301,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -314,10 +314,10 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index * @return Title */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; return $this; diff --git a/src/PhpPresentation/Shape/Chart/Type/AbstractType.php b/src/PhpPresentation/Shape/Chart/Type/AbstractType.php index df3b123611..e7ab625d1a 100644 --- a/src/PhpPresentation/Shape/Chart/Type/AbstractType.php +++ b/src/PhpPresentation/Shape/Chart/Type/AbstractType.php @@ -42,23 +42,21 @@ abstract class AbstractType implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; /** - * Data - * - * @var array + * @var array */ - private $data = array(); + private $series = array(); /** * Has Axis X? * * @return boolean */ - public function hasAxisX() + public function hasAxisX(): bool { return $this->hasAxisX; } @@ -68,7 +66,7 @@ public function hasAxisX() * * @return boolean */ - public function hasAxisY() + public function hasAxisY(): bool { return $this->hasAxisY; } @@ -79,9 +77,9 @@ public function hasAxisY() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -92,10 +90,10 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index * @return AbstractType */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; return $this; @@ -104,34 +102,34 @@ public function setHashIndex($value) /** * Add Series * - * @param \PhpOffice\PhpPresentation\Shape\Chart\Series $value + * @param Series $value * @return $this */ public function addSeries(Series $value) { - $this->data[] = $value; + $this->series[] = $value; return $this; } /** * Get Series * - * @return \PhpOffice\PhpPresentation\Shape\Chart\Series[] + * @return array */ - public function getSeries() + public function getSeries(): array { - return $this->data; + return $this->series; } /** * Set Series * - * @param array $value Array of \PhpOffice\PhpPresentation\Shape\Chart\Series + * @param array $series * @return $this */ - public function setSeries($value = array()) + public function setSeries(array $series = array()) { - $this->data = $value; + $this->series = $series; return $this; } @@ -139,8 +137,9 @@ public function setSeries($value = array()) * Get Data * * @deprecated getSeries + * @return array */ - public function getData() + public function getData(): array { return $this->getSeries(); } @@ -149,10 +148,10 @@ public function getData() * Set Data * * @deprecated setSeries - * @param array $value + * @param array $value * @return AbstractType */ - public function setData($value = array()) + public function setData(array $value = array()) { return $this->setSeries($value); } @@ -163,9 +162,9 @@ public function setData($value = array()) public function __clone() { $arrayClone = array(); - foreach ($this->data as $itemSeries) { + foreach ($this->series as $itemSeries) { $arrayClone[] = clone $itemSeries; } - $this->data = $arrayClone; + $this->series = $arrayClone; } } diff --git a/src/PhpPresentation/Shape/Chart/Type/AbstractTypeBar.php b/src/PhpPresentation/Shape/Chart/Type/AbstractTypeBar.php index 329adfecea..088fb722c0 100644 --- a/src/PhpPresentation/Shape/Chart/Type/AbstractTypeBar.php +++ b/src/PhpPresentation/Shape/Chart/Type/AbstractTypeBar.php @@ -129,7 +129,7 @@ public function setGapWidthPercent($gapWidthPercent) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hash = ''; foreach ($this->getSeries() as $series) { diff --git a/src/PhpPresentation/Shape/Chart/Type/AbstractTypePie.php b/src/PhpPresentation/Shape/Chart/Type/AbstractTypePie.php index 52a960777a..acda19a380 100644 --- a/src/PhpPresentation/Shape/Chart/Type/AbstractTypePie.php +++ b/src/PhpPresentation/Shape/Chart/Type/AbstractTypePie.php @@ -34,17 +34,17 @@ public function __construct() /** * Explosion of the Pie * - * @var integer + * @var int */ protected $explosion = 0; /** * Set explosion * - * @param integer $value - * @return \PhpOffice\PhpPresentation\Shape\Chart\Type\AbstractTypePie + * @param int $value + * @return self */ - public function setExplosion($value = 0) + public function setExplosion(int $value = 0): self { $this->explosion = $value; return $this; @@ -53,9 +53,9 @@ public function setExplosion($value = 0) /** * Get orientation * - * @return string + * @return int */ - public function getExplosion() + public function getExplosion(): int { return $this->explosion; } @@ -65,7 +65,7 @@ public function getExplosion() * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hash = ''; foreach ($this->getSeries() as $series) { diff --git a/src/PhpPresentation/Shape/Chart/Type/Area.php b/src/PhpPresentation/Shape/Chart/Type/Area.php index fdfc5aaed3..bb0419f907 100644 --- a/src/PhpPresentation/Shape/Chart/Type/Area.php +++ b/src/PhpPresentation/Shape/Chart/Type/Area.php @@ -29,7 +29,7 @@ class Area extends AbstractType implements ComparableInterface * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hash = ''; foreach ($this->getSeries() as $series) { diff --git a/src/PhpPresentation/Shape/Chart/Type/Bar.php b/src/PhpPresentation/Shape/Chart/Type/Bar.php index da44e04c68..67af6e30e8 100644 --- a/src/PhpPresentation/Shape/Chart/Type/Bar.php +++ b/src/PhpPresentation/Shape/Chart/Type/Bar.php @@ -29,7 +29,7 @@ class Bar extends AbstractTypeBar implements ComparableInterface * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5(parent::getHashCode() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Chart/Type/Bar3D.php b/src/PhpPresentation/Shape/Chart/Type/Bar3D.php index 540a53069f..e07a096055 100644 --- a/src/PhpPresentation/Shape/Chart/Type/Bar3D.php +++ b/src/PhpPresentation/Shape/Chart/Type/Bar3D.php @@ -29,7 +29,7 @@ class Bar3D extends AbstractTypeBar implements ComparableInterface * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5(parent::getHashCode() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Chart/Type/Doughnut.php b/src/PhpPresentation/Shape/Chart/Type/Doughnut.php index 5f30a51588..896502e06a 100644 --- a/src/PhpPresentation/Shape/Chart/Type/Doughnut.php +++ b/src/PhpPresentation/Shape/Chart/Type/Doughnut.php @@ -60,7 +60,7 @@ public function setHoleSize($holeSize = 50) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5(parent::getHashCode() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Chart/Type/Line.php b/src/PhpPresentation/Shape/Chart/Type/Line.php index 9be7a7852e..eabdaf114a 100644 --- a/src/PhpPresentation/Shape/Chart/Type/Line.php +++ b/src/PhpPresentation/Shape/Chart/Type/Line.php @@ -29,7 +29,7 @@ class Line extends AbstractType implements ComparableInterface * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hash = ''; foreach ($this->getSeries() as $series) { diff --git a/src/PhpPresentation/Shape/Chart/Type/Pie.php b/src/PhpPresentation/Shape/Chart/Type/Pie.php index a1c0d57e57..b88d6a710d 100644 --- a/src/PhpPresentation/Shape/Chart/Type/Pie.php +++ b/src/PhpPresentation/Shape/Chart/Type/Pie.php @@ -29,7 +29,7 @@ class Pie extends AbstractTypePie implements ComparableInterface * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5(parent::getHashCode() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Chart/Type/Pie3D.php b/src/PhpPresentation/Shape/Chart/Type/Pie3D.php index b7bc6bb294..7ebb274b47 100644 --- a/src/PhpPresentation/Shape/Chart/Type/Pie3D.php +++ b/src/PhpPresentation/Shape/Chart/Type/Pie3D.php @@ -29,7 +29,7 @@ class Pie3D extends AbstractTypePie implements ComparableInterface * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5(parent::getHashCode() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Chart/Type/Scatter.php b/src/PhpPresentation/Shape/Chart/Type/Scatter.php index ba1fa3b9b0..bd4dde037b 100644 --- a/src/PhpPresentation/Shape/Chart/Type/Scatter.php +++ b/src/PhpPresentation/Shape/Chart/Type/Scatter.php @@ -29,7 +29,7 @@ class Scatter extends AbstractType implements ComparableInterface * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hash = ''; foreach ($this->getSeries() as $series) { diff --git a/src/PhpPresentation/Shape/Chart/View3D.php b/src/PhpPresentation/Shape/Chart/View3D.php index 80ffea6e3d..315e673833 100644 --- a/src/PhpPresentation/Shape/Chart/View3D.php +++ b/src/PhpPresentation/Shape/Chart/View3D.php @@ -55,7 +55,7 @@ class View3D implements ComparableInterface /** * Height Percent * - * @var int + * @var int|null */ private $heightPercent = 100; @@ -69,7 +69,7 @@ class View3D implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -93,7 +93,7 @@ public function getRotationX() /** * Set Rotation X (-90 to 90) * - * @param int $pValue + * @param int $pValue * @return \PhpOffice\PhpPresentation\Shape\Chart\View3D */ public function setRotationX($pValue = 0) @@ -116,7 +116,7 @@ public function getRotationY() /** * Set Rotation Y (-90 to 90) * - * @param int $pValue + * @param int $pValue * @return \PhpOffice\PhpPresentation\Shape\Chart\View3D */ public function setRotationY($pValue = 0) @@ -139,7 +139,7 @@ public function hasRightAngleAxes() /** * Set RightAngleAxes * - * @param boolean $value + * @param boolean $value * @return \PhpOffice\PhpPresentation\Shape\Chart\View3D */ public function setRightAngleAxes($value = true) @@ -162,7 +162,7 @@ public function getPerspective() /** * Set Perspective (0 to 100) * - * @param int $value + * @param int $value * @return \PhpOffice\PhpPresentation\Shape\Chart\View3D */ public function setPerspective($value = 30) @@ -185,10 +185,10 @@ public function getHeightPercent() /** * Set HeightPercent (5 to 500) * - * @param int $value - * @return $this + * @param int|null $value + * @return self */ - public function setHeightPercent($value = 100) + public function setHeightPercent(?int $value = 100): self { $this->heightPercent = $value; @@ -198,9 +198,9 @@ public function setHeightPercent($value = 100) /** * Get DepthPercent * - * @return int + * @return int|null */ - public function getDepthPercent() + public function getDepthPercent(): ?int { return $this->depthPercent; } @@ -208,7 +208,7 @@ public function getDepthPercent() /** * Set DepthPercent (20 to 2000) * - * @param int $value + * @param int $value * @return $this */ public function setDepthPercent($value = 100) @@ -223,7 +223,7 @@ public function setDepthPercent($value = 100) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->rotationX . $this->rotationY . ($this->rightAngleAxes ? 't' : 'f') . $this->perspective . $this->heightPercent . $this->depthPercent . __CLASS__); } @@ -234,9 +234,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -247,10 +247,10 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index * @return View3D */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; return $this; diff --git a/src/PhpPresentation/Shape/Comment.php b/src/PhpPresentation/Shape/Comment.php index 9dfe73ff37..cf29aaad15 100644 --- a/src/PhpPresentation/Shape/Comment.php +++ b/src/PhpPresentation/Shape/Comment.php @@ -27,7 +27,7 @@ class Comment extends AbstractShape implements ComparableInterface { /** - * @var Author + * @var Author|null */ protected $author; @@ -48,18 +48,18 @@ public function __construct() } /** - * @return Author + * @return Author|null */ - public function getAuthor() + public function getAuthor(): ?Author { return $this->author; } /** * @param Author $author - * @return Comment + * @return self */ - public function setAuthor(Author $author) + public function setAuthor(Author $author): self { $this->author = $author; return $this; @@ -104,7 +104,7 @@ public function setText($text = '') /** * Comment has not height * - * @return null + * @return int|null */ public function getHeight() { @@ -114,10 +114,10 @@ public function getHeight() /** * Set Height * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setHeight($pValue = 0) + public function setHeight(int $pValue = 0) { return $this; } @@ -125,7 +125,7 @@ public function setHeight($pValue = 0) /** * Comment has not width * - * @return null + * @return int|null */ public function getWidth() { @@ -135,10 +135,10 @@ public function getWidth() /** * Set Width * - * @param int $pValue - * @return $this + * @param int $pValue + * @return self */ - public function setWidth($pValue = 0) + public function setWidth(int $pValue = 0) { return $this; } diff --git a/src/PhpPresentation/Shape/Comment/Author.php b/src/PhpPresentation/Shape/Comment/Author.php index 3c0ba2abff..7f3383b106 100644 --- a/src/PhpPresentation/Shape/Comment/Author.php +++ b/src/PhpPresentation/Shape/Comment/Author.php @@ -78,7 +78,7 @@ public function setName($name) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->getInitials() . $this->getName() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Drawing.php b/src/PhpPresentation/Shape/Drawing.php deleted file mode 100644 index 30a05b537e..0000000000 --- a/src/PhpPresentation/Shape/Drawing.php +++ /dev/null @@ -1,28 +0,0 @@ - */ protected $arrayMimeExtension = array( 'image/jpeg' => 'jpg', @@ -25,6 +25,11 @@ class Base64 extends AbstractDrawingAdapter 'image/gif' => 'gif', ); + /** + * @var string + */ + protected $path; + /** * Base64 constructor. */ @@ -32,21 +37,22 @@ public function __construct() { parent::__construct(); $this->uniqueName = md5(rand(0, 9999) . time() . rand(0, 9999)); + $this->data = ''; } /** - * @return mixed + * @return string */ - public function getData() + public function getData(): string { return $this->data; } /** - * @param mixed $data - * @return Base64 + * @param string $data + * @return self */ - public function setData($data) + public function setData(string $data): self { $this->data = $data; return $this; @@ -55,7 +61,7 @@ public function setData($data) /** * @return string */ - public function getContents() + public function getContents(): string { list(, $imageContents) = explode(';', $this->getData()); list(, $imageContents) = explode(',', $imageContents); @@ -66,7 +72,7 @@ public function getContents() * @return string * @throws \Exception */ - public function getExtension() + public function getExtension(): string { list($data, ) = explode(';', $this->getData()); list(, $mime) = explode(':', $data); @@ -81,7 +87,7 @@ public function getExtension() * @return string * @throws \Exception */ - public function getIndexedFilename() + public function getIndexedFilename(): string { return $this->uniqueName . $this->getImageIndex() . '.' . $this->getExtension(); } @@ -89,7 +95,7 @@ public function getIndexedFilename() /** * @return string */ - public function getMimeType() + public function getMimeType(): string { $sImage = $this->getContents(); if (!function_exists('getimagesizefromstring')) { @@ -100,4 +106,21 @@ public function getMimeType() } return image_type_to_mime_type($image[2]); } + + /** + * Get Path + * + * @return string + */ + public function getPath(): string + { + return $this->path; + } + + public function setPath(string $path): self + { + $this->path = $path; + + return $this; + } } diff --git a/src/PhpPresentation/Shape/Drawing/File.php b/src/PhpPresentation/Shape/Drawing/File.php index e92098803b..1ef56e2baf 100644 --- a/src/PhpPresentation/Shape/Drawing/File.php +++ b/src/PhpPresentation/Shape/Drawing/File.php @@ -9,14 +9,14 @@ class File extends AbstractDrawingAdapter /** * @var string */ - protected $path; + protected $path = ''; /** * Get Path * * @return string */ - public function getPath() + public function getPath(): string { return $this->path; } @@ -24,12 +24,12 @@ public function getPath() /** * Set Path * - * @param string $pValue File path - * @param boolean $pVerifyFile Verify file + * @param string $pValue File path + * @param boolean $pVerifyFile Verify file * @throws \Exception * @return \PhpOffice\PhpPresentation\Shape\Drawing\File */ - public function setPath($pValue = '', $pVerifyFile = true) + public function setPath(string $pValue = '', $pVerifyFile = true): self { if ($pVerifyFile) { if (!file_exists($pValue)) { @@ -50,7 +50,7 @@ public function setPath($pValue = '', $pVerifyFile = true) /** * @return string */ - public function getContents() + public function getContents(): string { return CommonFile::fileGetContents($this->getPath()); } @@ -59,7 +59,7 @@ public function getContents() /** * @return string */ - public function getExtension() + public function getExtension(): string { return pathinfo($this->getPath(), PATHINFO_EXTENSION); } @@ -68,7 +68,7 @@ public function getExtension() * @throws \Exception * @return string */ - public function getMimeType() + public function getMimeType(): string { if (!CommonFile::fileExists($this->getPath())) { throw new \Exception('File '.$this->getPath().' does not exist'); @@ -80,7 +80,7 @@ public function getMimeType() /** * @return string */ - public function getIndexedFilename() + public function getIndexedFilename(): string { $output = str_replace('.' . $this->getExtension(), '', pathinfo($this->getPath(), PATHINFO_FILENAME)); $output .= $this->getImageIndex(); diff --git a/src/PhpPresentation/Shape/Drawing/Gd.php b/src/PhpPresentation/Shape/Drawing/Gd.php index 6687507117..770c37a56e 100644 --- a/src/PhpPresentation/Shape/Drawing/Gd.php +++ b/src/PhpPresentation/Shape/Drawing/Gd.php @@ -2,6 +2,8 @@ namespace PhpOffice\PhpPresentation\Shape\Drawing; +use GdImage; + class Gd extends AbstractDrawingAdapter { /* Rendering functions */ @@ -66,7 +68,7 @@ public function getImageResource() /** * Set image resource * - * @param $value resource + * @param resource $value * @return $this */ public function setImageResource($value = null) @@ -95,7 +97,7 @@ public function getRenderingFunction() /** * Set rendering function * - * @param string $value + * @param string $value * @return $this */ public function setRenderingFunction($value = self::RENDERING_DEFAULT) @@ -109,7 +111,7 @@ public function setRenderingFunction($value = self::RENDERING_DEFAULT) * * @return string */ - public function getMimeType() + public function getMimeType(): string { return $this->mimeType; } @@ -117,7 +119,7 @@ public function getMimeType() /** * Set mime type * - * @param string $value + * @param string $value * @return $this */ public function setMimeType($value = self::MIMETYPE_DEFAULT) @@ -129,7 +131,7 @@ public function setMimeType($value = self::MIMETYPE_DEFAULT) /** * @return string */ - public function getContents() + public function getContents(): string { ob_start(); if ($this->getMimeType() === self::MIMETYPE_DEFAULT) { @@ -145,7 +147,7 @@ public function getContents() /** * @return string */ - public function getExtension() + public function getExtension(): string { $extension = strtolower($this->getMimeType()); $extension = explode('/', $extension); @@ -156,8 +158,30 @@ public function getExtension() /** * @return string */ - public function getIndexedFilename() + public function getIndexedFilename(): string { return $this->uniqueName . $this->getImageIndex() . '.' . $this->getExtension(); } + + /** + * @var string + */ + protected $path; + + /** + * Get Path + * + * @return string + */ + public function getPath(): string + { + return $this->path; + } + + public function setPath(string $path): self + { + $this->path = $path; + + return $this; + } } diff --git a/src/PhpPresentation/Shape/Drawing/ZipFile.php b/src/PhpPresentation/Shape/Drawing/ZipFile.php index 769f1d9ffd..349d16a168 100644 --- a/src/PhpPresentation/Shape/Drawing/ZipFile.php +++ b/src/PhpPresentation/Shape/Drawing/ZipFile.php @@ -16,7 +16,7 @@ class ZipFile extends AbstractDrawingAdapter * * @return string */ - public function getPath() + public function getPath(): string { return $this->path; } @@ -24,10 +24,10 @@ public function getPath() /** * Set Path * - * @param string $pValue File path + * @param string $pValue File path * @return \PhpOffice\PhpPresentation\Shape\Drawing\ZipFile */ - public function setPath($pValue = '') + public function setPath(string $pValue = ''): self { $this->path = $pValue; return $this; @@ -37,7 +37,7 @@ public function setPath($pValue = '') * @return string * @throws \Exception */ - public function getContents() + public function getContents(): string { if (!CommonFile::fileExists($this->getZipFileOut())) { throw new \Exception('File '.$this->getZipFileOut().' does not exist'); @@ -55,7 +55,7 @@ public function getContents() /** * @return string */ - public function getExtension() + public function getExtension(): string { return pathinfo($this->getZipFileIn(), PATHINFO_EXTENSION); } @@ -64,7 +64,7 @@ public function getExtension() * @return string * @throws \Exception */ - public function getMimeType() + public function getMimeType(): string { if (!CommonFile::fileExists($this->getZipFileOut())) { throw new \Exception('File '.$this->getZipFileOut().' does not exist'); @@ -83,7 +83,7 @@ public function getMimeType() /** * @return string */ - public function getIndexedFilename() + public function getIndexedFilename(): string { $output = pathinfo($this->getZipFileIn(), PATHINFO_FILENAME); $output = str_replace('.' . $this->getExtension(), '', $output); @@ -93,14 +93,14 @@ public function getIndexedFilename() return $output; } - protected function getZipFileOut() + protected function getZipFileOut(): string { $path = str_replace('zip://', '', $this->getPath()); $path = explode('#', $path); return empty($path[0]) ? '' : $path[0]; } - protected function getZipFileIn() + protected function getZipFileIn(): string { $path = str_replace('zip://', '', $this->getPath()); $path = explode('#', $path); diff --git a/src/PhpPresentation/Shape/Group.php b/src/PhpPresentation/Shape/Group.php index 5a4faf967f..c14e7d99cd 100644 --- a/src/PhpPresentation/Shape/Group.php +++ b/src/PhpPresentation/Shape/Group.php @@ -17,9 +17,10 @@ namespace PhpOffice\PhpPresentation\Shape; +use ArrayObject; use PhpOffice\PhpPresentation\AbstractShape; use PhpOffice\PhpPresentation\GeometryCalculator; -use PHPOffice\PhpPresentation\ShapeContainerInterface; +use PhpOffice\PhpPresentation\ShapeContainerInterface; use PhpOffice\PhpPresentation\Shape\Drawing; use PhpOffice\PhpPresentation\Shape\RichText; use PhpOffice\PhpPresentation\Shape\Table; @@ -29,9 +30,9 @@ class Group extends AbstractShape implements ShapeContainerInterface /** * Collection of shapes * - * @var \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] + * @var array|ArrayObject */ - private $shapeCollection = null; + private $shapeCollection; /** * Extent X @@ -51,19 +52,15 @@ public function __construct() { parent::__construct(); - // For logic purposes. - $this->offsetX = null; - $this->offsetY = null; - // Shape collection - $this->shapeCollection = new \ArrayObject(); + $this->shapeCollection = new ArrayObject(); } /** - * Get collection of shapes - * - * @return \ArrayObject|AbstractShape[] - */ + * Get collection of shapes + * + * @return array|ArrayObject + */ public function getShapeCollection() { return $this->shapeCollection; @@ -72,8 +69,8 @@ public function getShapeCollection() /** * Add shape to slide * - * @param \PhpOffice\PhpPresentation\AbstractShape $shape - * @return \PhpOffice\PhpPresentation\AbstractShape + * @param AbstractShape $shape + * @return AbstractShape * @throws \Exception */ public function addShape(AbstractShape $shape) @@ -88,9 +85,9 @@ public function addShape(AbstractShape $shape) * * @return int */ - public function getOffsetX() + public function getOffsetX(): int { - if ($this->offsetX === null) { + if (empty($this->offsetX)) { $offsets = GeometryCalculator::calculateOffsets($this); $this->offsetX = $offsets[GeometryCalculator::X]; $this->offsetY = $offsets[GeometryCalculator::Y]; @@ -102,10 +99,10 @@ public function getOffsetX() /** * Ignores setting the X Offset, preserving the default behavior. * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setOffsetX($pValue = 0) + public function setOffsetX(int $pValue = 0) { return $this; } @@ -115,9 +112,9 @@ public function setOffsetX($pValue = 0) * * @return int */ - public function getOffsetY() + public function getOffsetY(): int { - if ($this->offsetY === null) { + if (empty($this->offsetY)) { $offsets = GeometryCalculator::calculateOffsets($this); $this->offsetX = $offsets[GeometryCalculator::X]; $this->offsetY = $offsets[GeometryCalculator::Y]; @@ -129,10 +126,10 @@ public function getOffsetY() /** * Ignores setting the Y Offset, preserving the default behavior. * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setOffsetY($pValue = 0) + public function setOffsetY(int $pValue = 0) { return $this; } @@ -142,7 +139,7 @@ public function setOffsetY($pValue = 0) * * @return int */ - public function getExtentX() + public function getExtentX(): int { if ($this->extentX === null) { $extents = GeometryCalculator::calculateExtents($this); @@ -158,7 +155,7 @@ public function getExtentX() * * @return int */ - public function getExtentY() + public function getExtentY(): int { if ($this->extentY === null) { $extents = GeometryCalculator::calculateExtents($this); @@ -172,10 +169,10 @@ public function getExtentY() /** * Ignores setting the width, preserving the default behavior. * - * @param int $pValue - * @return $this + * @param int $pValue + * @return self */ - public function setWidth($pValue = 0) + public function setWidth(int $pValue = 0) { return $this; } @@ -183,10 +180,10 @@ public function setWidth($pValue = 0) /** * Ignores setting the height, preserving the default behavior. * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setHeight($pValue = 0) + public function setHeight(int $pValue = 0) { return $this; } @@ -208,10 +205,10 @@ public function createRichTextShape() /** * Create line shape * - * @param int $fromX Starting point x offset - * @param int $fromY Starting point y offset - * @param int $toX Ending point x offset - * @param int $toY Ending point y offset + * @param int $fromX Starting point x offset + * @param int $fromY Starting point y offset + * @param int $toX Ending point x offset + * @param int $toY Ending point y offset * @return \PhpOffice\PhpPresentation\Shape\Line * @throws \Exception */ @@ -254,7 +251,7 @@ public function createDrawingShape() /** * Create table shape * - * @param int $columns Number of columns + * @param int $columns Number of columns * @return \PhpOffice\PhpPresentation\Shape\Table * @throws \Exception */ diff --git a/src/PhpPresentation/Shape/Hyperlink.php b/src/PhpPresentation/Shape/Hyperlink.php index 0a95507760..0b3138c7b3 100644 --- a/src/PhpPresentation/Shape/Hyperlink.php +++ b/src/PhpPresentation/Shape/Hyperlink.php @@ -53,15 +53,15 @@ class Hyperlink /** * Hash index * - * @var string + * @var int */ private $hashIndex; /** * Create a new \PhpOffice\PhpPresentation\Shape\Hyperlink * - * @param string $pUrl Url to link the shape to - * @param string $pTooltip Tooltip to display on the hyperlink + * @param string $pUrl Url to link the shape to + * @param string $pTooltip Tooltip to display on the hyperlink * @throws \Exception */ public function __construct($pUrl = '', $pTooltip = '') @@ -84,7 +84,7 @@ public function getUrl() /** * Set URL * - * @param string $value + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\Hyperlink */ public function setUrl($value = '') @@ -107,7 +107,7 @@ public function getTooltip() /** * Set tooltip * - * @param string $value + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\Hyperlink */ public function setTooltip($value = '') @@ -130,7 +130,7 @@ public function getSlideNumber() /** * Set slide number * - * @param int $value + * @param int $value * @return \PhpOffice\PhpPresentation\Shape\Hyperlink */ public function setSlideNumber($value = 1) @@ -156,7 +156,7 @@ public function isInternal() * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->url . $this->tooltip . __CLASS__); } @@ -167,9 +167,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -180,10 +180,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Shape/Line.php b/src/PhpPresentation/Shape/Line.php index e9a7a074c4..5a7502dafe 100644 --- a/src/PhpPresentation/Shape/Line.php +++ b/src/PhpPresentation/Shape/Line.php @@ -50,7 +50,7 @@ public function __construct($fromX, $fromY, $toX, $toY) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->getBorder()->getLineStyle() . parent::getHashCode() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/Media.php b/src/PhpPresentation/Shape/Media.php index 75ee723186..1186a7b138 100644 --- a/src/PhpPresentation/Shape/Media.php +++ b/src/PhpPresentation/Shape/Media.php @@ -28,7 +28,7 @@ class Media extends File implements ComparableInterface /** * @return string */ - public function getMimeType() + public function getMimeType(): string { switch (strtolower($this->getExtension())) { case 'mp4': diff --git a/src/PhpPresentation/Shape/MemoryDrawing.php b/src/PhpPresentation/Shape/MemoryDrawing.php deleted file mode 100644 index e4b5c7a17b..0000000000 --- a/src/PhpPresentation/Shape/MemoryDrawing.php +++ /dev/null @@ -1,28 +0,0 @@ -type = $type; } /** - * @return mixed + * @return string */ - public function getType() + public function getType(): string { return $this->type; } /** - * @param mixed $type - * @return Placeholder + * @param string $type + * @return self */ - public function setType($type) + public function setType(string $type): self { $this->type = $type; return $this; } /** - * @return int + * @return int|null */ - public function getIdx() + public function getIdx(): ?int { return $this->idx; } /** * @param int $idx - * @return Placeholder + * @return self */ - public function setIdx($idx) + public function setIdx(int $idx): self { $this->idx = $idx; return $this; diff --git a/src/PhpPresentation/Shape/RichText.php b/src/PhpPresentation/Shape/RichText.php index 81d5d8d3fa..0d8d78a910 100644 --- a/src/PhpPresentation/Shape/RichText.php +++ b/src/PhpPresentation/Shape/RichText.php @@ -44,7 +44,7 @@ class RichText extends AbstractShape implements ComparableInterface /** * Rich text paragraphs * - * @var \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] + * @var array */ private $richTextParagraphs; @@ -134,25 +134,25 @@ class RichText extends AbstractShape implements ComparableInterface /** * Horizontal Auto Shrink - * @var boolean + * @var bool|null */ private $autoShrinkHorizontal; /** * Vertical Auto Shrink - * @var boolean + * @var bool|null */ private $autoShrinkVertical; /** * The percentage of the original font size to which the text is scaled - * @var float + * @var float|null */ private $fontScale; /** * The percentage of the reduction of the line spacing - * @var float + * @var float|null */ private $lnSpcReduction; @@ -182,11 +182,9 @@ public function getActiveParagraphIndex() } /** - * Get active paragraph - * - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return Paragraph */ - public function getActiveParagraph() + public function getActiveParagraph(): Paragraph { return $this->richTextParagraphs[$this->activeParagraph]; } @@ -194,11 +192,11 @@ public function getActiveParagraph() /** * Set active paragraph * - * @param int $index + * @param int $index * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return Paragraph */ - public function setActiveParagraph($index = 0) + public function setActiveParagraph(int $index = 0): Paragraph { if ($index >= count($this->richTextParagraphs)) { throw new \Exception("Invalid paragraph count."); @@ -212,11 +210,11 @@ public function setActiveParagraph($index = 0) /** * Get paragraph * - * @param int $index + * @param int $index * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return Paragraph */ - public function getParagraph($index = 0) + public function getParagraph(int $index = 0): Paragraph { if ($index >= count($this->richTextParagraphs)) { throw new \Exception("Invalid paragraph count."); @@ -228,10 +226,10 @@ public function getParagraph($index = 0) /** * Create paragraph * - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return Paragraph * @throws \Exception */ - public function createParagraph() + public function createParagraph(): Paragraph { $numParagraphs = count($this->richTextParagraphs); if ($numParagraphs > 0) { @@ -258,7 +256,7 @@ public function createParagraph() /** * Add text * - * @param \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface $pText Rich text element + * @param \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface $pText Rich text element * @throws \Exception * @return \PhpOffice\PhpPresentation\Shape\RichText */ @@ -272,7 +270,7 @@ public function addText(TextElementInterface $pText = null) /** * Create text (can not be formatted !) * - * @param string $pText Text + * @param string $pText Text * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElement * @throws \Exception */ @@ -295,7 +293,7 @@ public function createBreak() /** * Create text run (can be formatted) * - * @param string $pText Text + * @param string $pText Text * @return \PhpOffice\PhpPresentation\Shape\RichText\Run * @throws \Exception */ @@ -314,7 +312,7 @@ public function getPlainText() // Return value $returnValue = ''; - // Loop trough all \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + // Loop trough all Paragraph foreach ($this->richTextParagraphs as $p) { $returnValue .= $p->getPlainText(); } @@ -334,11 +332,9 @@ public function __toString() } /** - * Get paragraphs - * - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] + * @return array */ - public function getParagraphs() + public function getParagraphs(): array { return $this->richTextParagraphs; } @@ -346,16 +342,12 @@ public function getParagraphs() /** * Set paragraphs * - * @param \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] $paragraphs Array of paragraphs + * @param array $paragraphs Array of paragraphs * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText + * @return self */ - public function setParagraphs($paragraphs = null) + public function setParagraphs(array $paragraphs = []): self { - if (!is_array($paragraphs)) { - throw new \Exception("Invalid \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] array passed."); - } - $this->richTextParagraphs = $paragraphs; $this->activeParagraph = count($this->richTextParagraphs) - 1; return $this; @@ -374,7 +366,7 @@ public function getWrap() /** * Set text wrapping * - * @param $value string + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setWrap($value = self::WRAP_SQUARE) @@ -397,9 +389,9 @@ public function getAutoFit() /** * Get pourcentage of fontScale * - * @return float + * @return float|null */ - public function getFontScale() + public function getFontScale(): ?float { return $this->fontScale; } @@ -407,9 +399,9 @@ public function getFontScale() /** * Get pourcentage of the line space reduction * - * @return float + * @return float|null */ - public function getLineSpaceReduction() + public function getLineSpaceReduction(): ?float { return $this->lnSpcReduction; } @@ -417,9 +409,9 @@ public function getLineSpaceReduction() /** * Set autofit * - * @param $value string - * @param $fontScale float - * @param $lnSpcReduction float + * @param string $value + * @param float|null $fontScale + * @param float|null $lnSpcReduction * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setAutoFit($value = self::AUTOFIT_DEFAULT, $fontScale = null, $lnSpcReduction = null) @@ -450,7 +442,7 @@ public function getHorizontalOverflow() /** * Set horizontal overflow * - * @param $value string + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setHorizontalOverflow($value = self::OVERFLOW_OVERFLOW) @@ -473,7 +465,7 @@ public function getVerticalOverflow() /** * Set vertical overflow * - * @param $value string + * @param string $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setVerticalOverflow($value = self::OVERFLOW_OVERFLOW) @@ -496,7 +488,7 @@ public function isUpright() /** * Set vertical * - * @param $value boolean + * @param boolean $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setUpright($value = false) @@ -519,7 +511,7 @@ public function isVertical() /** * Set vertical * - * @param $value boolean + * @param boolean $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setVertical($value = false) @@ -542,7 +534,7 @@ public function getColumns() /** * Set columns * - * @param $value int + * @param int $value * @throws \Exception * @return \PhpOffice\PhpPresentation\Shape\RichText */ @@ -570,7 +562,7 @@ public function getInsetBottom() /** * Set bottom inset * - * @param $value float + * @param float $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setInsetBottom($value = 4.8) @@ -593,7 +585,7 @@ public function getInsetLeft() /** * Set left inset * - * @param $value float + * @param float $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setInsetLeft($value = 9.6) @@ -616,7 +608,7 @@ public function getInsetRight() /** * Set left inset * - * @param $value float + * @param float $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setInsetRight($value = 9.6) @@ -639,7 +631,7 @@ public function getInsetTop() /** * Set top inset * - * @param $value float + * @param float $value * @return \PhpOffice\PhpPresentation\Shape\RichText */ public function setInsetTop($value = 4.8) @@ -650,45 +642,39 @@ public function setInsetTop($value = 4.8) } /** - * Set horizontal auto shrink - * @param bool $value - * @return RichText + * @param bool|null $value + * @return self */ - public function setAutoShrinkHorizontal($value = null) + public function setAutoShrinkHorizontal(bool $value = null): self { - if (is_bool($value)) { - $this->autoShrinkHorizontal = $value; - } + $this->autoShrinkHorizontal = $value; return $this; } /** - * Get horizontal auto shrink - * @return bool + * @return bool|null */ - public function hasAutoShrinkHorizontal() + public function hasAutoShrinkHorizontal(): ?bool { return $this->autoShrinkHorizontal; } /** * Set vertical auto shrink - * @param bool $value + * @param bool|null $value * @return RichText */ - public function setAutoShrinkVertical($value = null) + public function setAutoShrinkVertical(bool $value = null): self { - if (is_bool($value)) { - $this->autoShrinkVertical = $value; - } + $this->autoShrinkVertical = $value; return $this; } /** * Set vertical auto shrink - * @return bool + * @return bool|null */ - public function hasAutoShrinkVertical() + public function hasAutoShrinkVertical(): ?bool { return $this->autoShrinkVertical; } @@ -698,7 +684,7 @@ public function hasAutoShrinkVertical() * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hashElements = ''; foreach ($this->richTextParagraphs as $element) { diff --git a/src/PhpPresentation/Shape/RichText/BreakElement.php b/src/PhpPresentation/Shape/RichText/BreakElement.php index dbd5bb7c3b..68d955a2e1 100644 --- a/src/PhpPresentation/Shape/RichText/BreakElement.php +++ b/src/PhpPresentation/Shape/RichText/BreakElement.php @@ -17,6 +17,8 @@ namespace PhpOffice\PhpPresentation\Shape\RichText; +use PhpOffice\PhpPresentation\Style\Font; + /** * Rich text break */ @@ -42,10 +44,10 @@ public function getText() /** * Set text * - * @param $pText string Text - * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface + * @param string $pText Text value + * @return self */ - public function setText($pText = '') + public function setText($pText = ''): self { return $this; } @@ -53,9 +55,9 @@ public function setText($pText = '') /** * Get font * - * @return \PhpOffice\PhpPresentation\Style\Font + * @return null|Font */ - public function getFont() + public function getFont(): ?Font { return null; } @@ -63,10 +65,10 @@ public function getFont() /** * Set language * - * @param $lang - * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface + * @param string $lang + * @return self */ - public function setLanguage($lang) + public function setLanguage($lang): self { return $this; } @@ -74,9 +76,9 @@ public function setLanguage($lang) /** * Get language * - * @return string Language + * @return null|string */ - public function getLanguage() + public function getLanguage(): ?string { return null; } @@ -86,7 +88,7 @@ public function getLanguage() * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5(__CLASS__); } diff --git a/src/PhpPresentation/Shape/RichText/Paragraph.php b/src/PhpPresentation/Shape/RichText/Paragraph.php index ab64b706ab..42aae99e1b 100644 --- a/src/PhpPresentation/Shape/RichText/Paragraph.php +++ b/src/PhpPresentation/Shape/RichText/Paragraph.php @@ -18,6 +18,7 @@ namespace PhpOffice\PhpPresentation\Shape\RichText; use PhpOffice\PhpPresentation\ComparableInterface; +use PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface; use PhpOffice\PhpPresentation\Style\Alignment; use PhpOffice\PhpPresentation\Style\Bullet; use PhpOffice\PhpPresentation\Style\Font; @@ -30,21 +31,21 @@ class Paragraph implements ComparableInterface /** * Rich text elements * - * @var \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface[] + * @var array */ private $richTextElements; /** * Alignment * - * @var \PhpOffice\PhpPresentation\Style\Alignment + * @var Alignment */ private $alignment; /** * Font * - * @var \PhpOffice\PhpPresentation\Style\Font + * @var Font|null */ private $font; @@ -63,7 +64,7 @@ class Paragraph implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -72,7 +73,6 @@ class Paragraph implements ComparableInterface */ public function __construct() { - // Initialise variables $this->richTextElements = array(); $this->alignment = new Alignment(); $this->font = new Font(); @@ -82,9 +82,9 @@ public function __construct() /** * Get alignment * - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @return Alignment */ - public function getAlignment() + public function getAlignment(): Alignment { return $this->alignment; } @@ -92,10 +92,10 @@ public function getAlignment() /** * Set alignment * - * @param \PhpOffice\PhpPresentation\Style\Alignment $alignment - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @param Alignment $alignment + * @return self */ - public function setAlignment(Alignment $alignment) + public function setAlignment(Alignment $alignment): self { $this->alignment = $alignment; @@ -105,9 +105,9 @@ public function setAlignment(Alignment $alignment) /** * Get font * - * @return \PhpOffice\PhpPresentation\Style\Font + * @return Font|null */ - public function getFont() + public function getFont(): ?Font { return $this->font; } @@ -115,11 +115,11 @@ public function getFont() /** * Set font * - * @param \PhpOffice\PhpPresentation\Style\Font $pFont Font + * @param Font|null $pFont Font * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return self */ - public function setFont(Font $pFont = null) + public function setFont(Font $pFont = null): self { $this->font = $pFont; @@ -129,9 +129,9 @@ public function setFont(Font $pFont = null) /** * Get bullet style * - * @return \PhpOffice\PhpPresentation\Style\Bullet + * @return Bullet|null */ - public function getBulletStyle() + public function getBulletStyle(): ?Bullet { return $this->bulletStyle; } @@ -139,11 +139,11 @@ public function getBulletStyle() /** * Set bullet style * - * @param \PhpOffice\PhpPresentation\Style\Bullet $style + * @param Bullet|null $style * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return self */ - public function setBulletStyle(Bullet $style = null) + public function setBulletStyle(Bullet $style = null): self { $this->bulletStyle = $style; @@ -153,11 +153,11 @@ public function setBulletStyle(Bullet $style = null) /** * Create text (can not be formatted !) * - * @param string $pText Text - * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElement + * @param string $pText Text + * @return TextElement * @throws \Exception */ - public function createText($pText = '') + public function createText(string $pText = ''): TextElement { $objText = new TextElement($pText); $this->addText($objText); @@ -168,11 +168,11 @@ public function createText($pText = '') /** * Add text * - * @param \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface $pText Rich text element + * @param TextElementInterface|null $pText Rich text element * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return self */ - public function addText(TextElementInterface $pText = null) + public function addText(TextElementInterface $pText = null): self { $this->richTextElements[] = $pText; @@ -182,10 +182,10 @@ public function addText(TextElementInterface $pText = null) /** * Create break * - * @return \PhpOffice\PhpPresentation\Shape\RichText\BreakElement + * @return BreakElement * @throws \Exception */ - public function createBreak() + public function createBreak(): BreakElement { $objText = new BreakElement(); $this->addText($objText); @@ -196,11 +196,11 @@ public function createBreak() /** * Create text run (can be formatted) * - * @param string $pText Text - * @return \PhpOffice\PhpPresentation\Shape\RichText\Run + * @param string $pText Text + * @return Run * @throws \Exception */ - public function createTextRun($pText = '') + public function createTextRun(string $pText = ''): Run { $objText = new Run($pText); $objText->setFont(clone $this->font); @@ -224,12 +224,12 @@ public function __toString() * * @return string */ - public function getPlainText() + public function getPlainText(): string { // Return value $returnValue = ''; - // Loop trough all \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface + // Loop trough all TextElementInterface foreach ($this->richTextElements as $text) { if ($text instanceof TextElementInterface) { $returnValue .= $text->getText(); @@ -243,9 +243,9 @@ public function getPlainText() /** * Get Rich Text elements * - * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface[] + * @return array */ - public function getRichTextElements() + public function getRichTextElements(): array { return $this->richTextElements; } @@ -253,15 +253,11 @@ public function getRichTextElements() /** * Set Rich Text elements * - * @param \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface[] $pElements Array of elements - * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @param array $pElements Array of elements + * @return self */ - public function setRichTextElements($pElements = null) + public function setRichTextElements(array $pElements = []): self { - if (!is_array($pElements)) { - throw new \Exception("Invalid \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface[] array passed."); - } $this->richTextElements = $pElements; return $this; } @@ -271,7 +267,7 @@ public function setRichTextElements($pElements = null) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hashElements = ''; foreach ($this->richTextElements as $element) { @@ -287,9 +283,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -300,11 +296,13 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } /** diff --git a/src/PhpPresentation/Shape/RichText/Run.php b/src/PhpPresentation/Shape/RichText/Run.php index 97455c0f11..5d5fdde7fe 100644 --- a/src/PhpPresentation/Shape/RichText/Run.php +++ b/src/PhpPresentation/Shape/RichText/Run.php @@ -46,9 +46,9 @@ public function __construct($pText = '') /** * Get font * - * @return \PhpOffice\PhpPresentation\Style\Font + * @return Font */ - public function getFont() + public function getFont(): Font { return $this->font; } @@ -56,7 +56,7 @@ public function getFont() /** * Set font * - * @param \PhpOffice\PhpPresentation\Style\Font $pFont Font + * @param \PhpOffice\PhpPresentation\Style\Font $pFont Font * @throws \Exception * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface */ @@ -72,7 +72,7 @@ public function setFont(Font $pFont = null) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->getText() . $this->font->getHashCode() . __CLASS__); } diff --git a/src/PhpPresentation/Shape/RichText/TextElement.php b/src/PhpPresentation/Shape/RichText/TextElement.php index e19b9b81c5..854cf0b3e8 100644 --- a/src/PhpPresentation/Shape/RichText/TextElement.php +++ b/src/PhpPresentation/Shape/RichText/TextElement.php @@ -18,6 +18,7 @@ namespace PhpOffice\PhpPresentation\Shape\RichText; use PhpOffice\PhpPresentation\Shape\Hyperlink; +use PhpOffice\PhpPresentation\Style\Font; /** * Rich text text element @@ -39,7 +40,7 @@ class TextElement implements TextElementInterface /** * Hyperlink * - * @var \PhpOffice\PhpPresentation\Shape\Hyperlink + * @var Hyperlink|null */ protected $hyperlink; @@ -67,7 +68,7 @@ public function getText() /** * Set text * - * @param $pText string Text + * @param string $pText Text value * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface */ public function setText($pText = '') @@ -80,30 +81,26 @@ public function setText($pText = '') /** * Get font * - * @return \PhpOffice\PhpPresentation\Style\Font + * @return null|Font */ - public function getFont() + public function getFont(): ?Font { return null; } /** - * Has Hyperlink? - * - * @return boolean + * @return bool */ - public function hasHyperlink() + public function hasHyperlink(): bool { return !is_null($this->hyperlink); } /** - * Get Hyperlink - * - * @return \PhpOffice\PhpPresentation\Shape\Hyperlink + * @return Hyperlink * @throws \Exception */ - public function getHyperlink() + public function getHyperlink(): Hyperlink { if (is_null($this->hyperlink)) { $this->hyperlink = new Hyperlink(); @@ -115,7 +112,7 @@ public function getHyperlink() /** * Set Hyperlink * - * @param \PhpOffice\PhpPresentation\Shape\Hyperlink $pHyperlink + * @param Hyperlink|null $pHyperlink * @throws \Exception * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElement */ @@ -151,7 +148,7 @@ public function setLanguage($language) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->text . (is_null($this->hyperlink) ? '' : $this->hyperlink->getHashCode()) . __CLASS__); } diff --git a/src/PhpPresentation/Shape/RichText/TextElementInterface.php b/src/PhpPresentation/Shape/RichText/TextElementInterface.php index 98302447a5..fb6c203a0e 100644 --- a/src/PhpPresentation/Shape/RichText/TextElementInterface.php +++ b/src/PhpPresentation/Shape/RichText/TextElementInterface.php @@ -32,7 +32,7 @@ public function getText(); /** * Set text * - * @param $pText string Text + * @param string $pText Text value * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface */ public function setText($pText = ''); @@ -60,5 +60,5 @@ public function setLanguage($lang); * * @return string Hash code */ - public function getHashCode(); + public function getHashCode(): string; } diff --git a/src/PhpPresentation/Shape/Table.php b/src/PhpPresentation/Shape/Table.php index 21da32196a..bad2b8f269 100644 --- a/src/PhpPresentation/Shape/Table.php +++ b/src/PhpPresentation/Shape/Table.php @@ -60,12 +60,12 @@ public function __construct($columns = 1) /** * Get row * - * @param int $row Row number - * @param boolean $exceptionAsNull Return a null value instead of an exception? + * @param int $row Row number + * @param boolean $exceptionAsNull Return a null value instead of an exception? * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\Table\Row + * @return Row|null */ - public function getRow($row = 0, $exceptionAsNull = false) + public function getRow($row = 0, $exceptionAsNull = false): ?Row { if (!isset($this->rows[$row])) { if ($exceptionAsNull) { @@ -80,7 +80,7 @@ public function getRow($row = 0, $exceptionAsNull = false) /** * Get rows * - * @return \PhpOffice\PhpPresentation\Shape\Table\Row[] + * @return Row[] */ public function getRows() { @@ -123,7 +123,7 @@ public function setNumColumns($numColumn) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hashElements = ''; foreach ($this->rows as $row) { diff --git a/src/PhpPresentation/Shape/Table/Cell.php b/src/PhpPresentation/Shape/Table/Cell.php index 0a184d2057..45c2de102b 100644 --- a/src/PhpPresentation/Shape/Table/Cell.php +++ b/src/PhpPresentation/Shape/Table/Cell.php @@ -31,7 +31,7 @@ class Cell implements ComparableInterface /** * Rich text paragraphs * - * @var \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] + * @var array */ private $richTextParagraphs; @@ -80,7 +80,7 @@ class Cell implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -115,9 +115,9 @@ public function getActiveParagraphIndex() /** * Get active paragraph * - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return Paragraph */ - public function getActiveParagraph() + public function getActiveParagraph(): Paragraph { return $this->richTextParagraphs[$this->activeParagraph]; } @@ -125,11 +125,11 @@ public function getActiveParagraph() /** * Set active paragraph * - * @param int $index + * @param int $index * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return Paragraph */ - public function setActiveParagraph($index = 0) + public function setActiveParagraph($index = 0): Paragraph { if ($index >= count($this->richTextParagraphs)) { throw new \Exception("Invalid paragraph count."); @@ -143,11 +143,11 @@ public function setActiveParagraph($index = 0) /** * Get paragraph * - * @param int $index + * @param int $index * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return Paragraph */ - public function getParagraph($index = 0) + public function getParagraph($index = 0): Paragraph { if ($index >= count($this->richTextParagraphs)) { throw new \Exception("Invalid paragraph count."); @@ -159,10 +159,10 @@ public function getParagraph($index = 0) /** * Create paragraph * - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + * @return Paragraph * @throws \Exception */ - public function createParagraph() + public function createParagraph(): Paragraph { $this->richTextParagraphs[] = new Paragraph(); $totalRichTextParagraphs = count($this->richTextParagraphs); @@ -183,7 +183,7 @@ public function createParagraph() /** * Add text * - * @param \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface $pText Rich text element + * @param \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface $pText Rich text element * @throws \Exception * @return \PhpOffice\PhpPresentation\Shape\Table\Cell */ @@ -197,7 +197,7 @@ public function addText(TextElementInterface $pText = null) /** * Create text (can not be formatted !) * - * @param string $pText Text + * @param string $pText Text * @return \PhpOffice\PhpPresentation\Shape\RichText\TextElement * @throws \Exception */ @@ -220,7 +220,7 @@ public function createBreak() /** * Create text run (can be formatted) * - * @param string $pText Text + * @param string $pText Text * @return \PhpOffice\PhpPresentation\Shape\RichText\Run * @throws \Exception */ @@ -239,7 +239,7 @@ public function getPlainText() // Return value $returnValue = ''; - // Loop trough all \PhpOffice\PhpPresentation\Shape\RichText\Paragraph + // Loop trough all Paragraph foreach ($this->richTextParagraphs as $p) { $returnValue .= $p->getPlainText(); } @@ -261,7 +261,7 @@ public function __toString() /** * Get paragraphs * - * @return \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] + * @return array */ public function getParagraphs() { @@ -271,15 +271,11 @@ public function getParagraphs() /** * Set paragraphs * - * @param \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] $paragraphs Array of paragraphs - * @throws \Exception + * @param array $paragraphs Array of paragraphs * @return \PhpOffice\PhpPresentation\Shape\Table\Cell */ - public function setParagraphs($paragraphs = null) + public function setParagraphs(array $paragraphs = []): self { - if (!is_array($paragraphs)) { - throw new \Exception("Invalid \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] array passed."); - } $this->richTextParagraphs = $paragraphs; $this->activeParagraph = count($this->richTextParagraphs) - 1; return $this; @@ -298,7 +294,7 @@ public function getFill() /** * Set fill * - * @param \PhpOffice\PhpPresentation\Style\Fill $fill + * @param \PhpOffice\PhpPresentation\Style\Fill $fill * @return \PhpOffice\PhpPresentation\Shape\Table\Cell */ public function setFill(Fill $fill) @@ -321,7 +317,7 @@ public function getBorders() /** * Set borders * - * @param \PhpOffice\PhpPresentation\Style\Borders $borders + * @param \PhpOffice\PhpPresentation\Style\Borders $borders * @return \PhpOffice\PhpPresentation\Shape\Table\Cell */ public function setBorders(Borders $borders) @@ -344,33 +340,29 @@ public function getWidth() /** * Set width * - * @param int $value - * @return \PhpOffice\PhpPresentation\Shape\Table\Cell + * @param int $pValue + * @return self */ - public function setWidth($value = 0) + public function setWidth(int $pValue = 0) { - $this->width = $value; + $this->width = $pValue; return $this; } /** - * Get colSpan - * * @return int */ - public function getColSpan() + public function getColSpan(): int { return $this->colSpan; } /** - * Set colSpan - * - * @param int $value - * @return \PhpOffice\PhpPresentation\Shape\Table\Cell + * @param int $value + * @return self */ - public function setColSpan($value = 0) + public function setColSpan(int $value = 0): self { $this->colSpan = $value; @@ -378,22 +370,18 @@ public function setColSpan($value = 0) } /** - * Get rowSpan - * * @return int */ - public function getRowSpan() + public function getRowSpan(): int { return $this->rowSpan; } /** - * Set rowSpan - * - * @param int $value - * @return \PhpOffice\PhpPresentation\Shape\Table\Cell + * @param int $value + * @return self */ - public function setRowSpan($value = 0) + public function setRowSpan(int $value = 0): self { $this->rowSpan = $value; @@ -405,7 +393,7 @@ public function setRowSpan($value = 0) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hashElements = ''; foreach ($this->richTextParagraphs as $element) { @@ -421,9 +409,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -434,10 +422,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Shape/Table/Row.php b/src/PhpPresentation/Shape/Table/Row.php index 18d4475371..2c8a3d11b1 100644 --- a/src/PhpPresentation/Shape/Table/Row.php +++ b/src/PhpPresentation/Shape/Table/Row.php @@ -56,7 +56,7 @@ class Row implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -80,12 +80,12 @@ public function __construct($columns = 1) /** * Get cell * - * @param int $cell Cell number - * @param boolean $exceptionAsNull Return a null value instead of an exception? + * @param int $cell Cell number + * @param boolean $exceptionAsNull Return a null value instead of an exception? * @throws \Exception - * @return \PhpOffice\PhpPresentation\Shape\Table\Cell + * @return Cell|null */ - public function getCell($cell = 0, $exceptionAsNull = false) + public function getCell($cell = 0, $exceptionAsNull = false): ?Cell { if (!isset($this->cells[$cell])) { if ($exceptionAsNull) { @@ -100,9 +100,9 @@ public function getCell($cell = 0, $exceptionAsNull = false) /** * Get cells * - * @return \PhpOffice\PhpPresentation\Shape\Table\Cell[] + * @return array */ - public function getCells() + public function getCells(): array { return $this->cells; } @@ -136,7 +136,7 @@ public function getFill() /** * Set fill * - * @param \PhpOffice\PhpPresentation\Style\Fill $fill + * @param \PhpOffice\PhpPresentation\Style\Fill $fill * @return \PhpOffice\PhpPresentation\Shape\Table\Row */ public function setFill(Fill $fill) @@ -159,7 +159,7 @@ public function getHeight() /** * Set height * - * @param int $value + * @param int $value * @return \PhpOffice\PhpPresentation\Shape\Table\Row */ public function setHeight($value = 0) @@ -174,7 +174,7 @@ public function setHeight($value = 0) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { $hashElements = ''; foreach ($this->cells as $cell) { @@ -190,9 +190,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -203,10 +203,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/ShapeContainerInterface.php b/src/PhpPresentation/ShapeContainerInterface.php index 4575c749e7..03b64cb7f5 100644 --- a/src/PhpPresentation/ShapeContainerInterface.php +++ b/src/PhpPresentation/ShapeContainerInterface.php @@ -17,6 +17,8 @@ namespace PhpOffice\PhpPresentation; +use ArrayObject; + /** * PhpOffice\PhpPresentation\ShapeContainerInterface */ @@ -25,15 +27,15 @@ interface ShapeContainerInterface /** * Get collection of shapes * - * @return \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] + * @return array|ArrayObject */ public function getShapeCollection(); /** * Add shape to slide * - * @param \PhpOffice\PhpPresentation\AbstractShape $shape - * @return \PhpOffice\PhpPresentation\AbstractShape + * @param AbstractShape $shape + * @return AbstractShape */ public function addShape(AbstractShape $shape); @@ -42,26 +44,32 @@ public function addShape(AbstractShape $shape); * * @return int */ - public function getOffsetX(); + public function getOffsetX(): int; /** * Get Y Offset * * @return int */ - public function getOffsetY(); + public function getOffsetY(): int; /** * Get X Extent * * @return int */ - public function getExtentX(); + public function getExtentX(): int; /** * Get Y Extent * * @return int */ - public function getExtentY(); + public function getExtentY(): int; + + + /** + * @return string + */ + public function getHashCode(): string; } diff --git a/src/PhpPresentation/Slide.php b/src/PhpPresentation/Slide.php index 473d7b73b4..3f5babf9d9 100644 --- a/src/PhpPresentation/Slide.php +++ b/src/PhpPresentation/Slide.php @@ -17,9 +17,6 @@ namespace PhpOffice\PhpPresentation; -use PhpOffice\PhpPresentation\Shape\Chart; -use PhpOffice\PhpPresentation\Shape\RichText; -use PhpOffice\PhpPresentation\Shape\Table; use PhpOffice\PhpPresentation\Slide\AbstractSlide; use PhpOffice\PhpPresentation\Slide\Note; use PhpOffice\PhpPresentation\Slide\SlideLayout; @@ -38,7 +35,7 @@ class Slide extends AbstractSlide implements ComparableInterface, ShapeContainer /** * Slide layout * - * @var SlideLayout + * @var SlideLayout|null */ private $slideLayout; @@ -51,7 +48,7 @@ class Slide extends AbstractSlide implements ComparableInterface, ShapeContainer /** * - * @var \PhpOffice\PhpPresentation\Slide\Note + * @var Note */ private $slideNote; @@ -64,7 +61,7 @@ class Slide extends AbstractSlide implements ComparableInterface, ShapeContainer /** * Name of the title * - * @var string + * @var string|null */ protected $name; @@ -89,14 +86,16 @@ public function __construct(PhpPresentation $pParent = null) $oSlideLayout = reset($arraySlideLayouts); $this->setSlideLayout($oSlideLayout); } + // Set note + $this->setNote(new Note()); } /** * Get slide layout * - * @return SlideLayout + * @return SlideLayout|null */ - public function getSlideLayout() + public function getSlideLayout(): ?SlideLayout { return $this->slideLayout; } @@ -104,10 +103,10 @@ public function getSlideLayout() /** * Set slide layout * - * @param SlideLayout $layout - * @return \PhpOffice\PhpPresentation\Slide + * @param SlideLayout $layout + * @return self */ - public function setSlideLayout(SlideLayout $layout) + public function setSlideLayout(SlideLayout $layout): self { $this->slideLayout = $layout; return $this; @@ -126,7 +125,7 @@ public function getSlideMasterId() /** * Set slide master id * - * @param int $masterId + * @param int $masterId * @return \PhpOffice\PhpPresentation\Slide */ public function setSlideMasterId($masterId = 1) @@ -150,22 +149,19 @@ public function copy() /** * - * @return \PhpOffice\PhpPresentation\Slide\Note + * @return Note */ - public function getNote() + public function getNote(): Note { - if (is_null($this->slideNote)) { - $this->setNote(); - } return $this->slideNote; } /** * - * @param \PhpOffice\PhpPresentation\Slide\Note $note - * @return \PhpOffice\PhpPresentation\Slide + * @param Note|null $note + * @return self */ - public function setNote(Note $note = null) + public function setNote(Note $note = null): self { $this->slideNote = (is_null($note) ? new Note() : $note); $this->slideNote->setParent($this); @@ -177,17 +173,17 @@ public function setNote(Note $note = null) * Get the name of the slide * @return string */ - public function getName() + public function getName(): ?string { return $this->name; } /** * Set the name of the slide - * @param string $name - * @return $this + * @param string|null $name + * @return self */ - public function setName($name = null) + public function setName(?string $name = null): self { $this->name = $name; return $this; @@ -214,7 +210,7 @@ public function setIsVisible($value = true) /** * Add an animation to the slide * - * @param \PhpOffice\PhpPresentation\Slide\Animation + * @param \PhpOffice\PhpPresentation\Slide\Animation $animation * @return Slide */ public function addAnimation($animation) diff --git a/src/PhpPresentation/Slide/AbstractSlide.php b/src/PhpPresentation/Slide/AbstractSlide.php index 388cf81d4c..64083479a8 100644 --- a/src/PhpPresentation/Slide/AbstractSlide.php +++ b/src/PhpPresentation/Slide/AbstractSlide.php @@ -17,6 +17,7 @@ namespace PhpOffice\PhpPresentation\Slide; +use ArrayObject; use PhpOffice\PhpPresentation\AbstractShape; use PhpOffice\PhpPresentation\ComparableInterface; use PhpOffice\PhpPresentation\GeometryCalculator; @@ -28,7 +29,6 @@ use PhpOffice\PhpPresentation\Shape\RichText; use PhpOffice\PhpPresentation\Shape\Table; use PhpOffice\PhpPresentation\ShapeContainerInterface; -use PhpOffice\PhpPresentation\Slide; abstract class AbstractSlide implements ComparableInterface, ShapeContainerInterface { @@ -38,16 +38,16 @@ abstract class AbstractSlide implements ComparableInterface, ShapeContainerInter protected $relsIndex; /** * - * @var \PhpOffice\PhpPresentation\Slide\Transition + * @var Transition|null */ protected $slideTransition; /** * Collection of shapes * - * @var \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] + * @var array|ArrayObject */ - protected $shapeCollection = null; + protected $shapeCollection = []; /** * Extent Y * @@ -81,13 +81,13 @@ abstract class AbstractSlide implements ComparableInterface, ShapeContainerInter /** * Hash index * - * @var string + * @var int */ protected $hashIndex; /** * Parent presentation * - * @var PhpPresentation + * @var PhpPresentation|null */ protected $parent; /** @@ -100,7 +100,7 @@ abstract class AbstractSlide implements ComparableInterface, ShapeContainerInter /** * Get collection of shapes * - * @return \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] + * @return array|ArrayObject */ public function getShapeCollection() { @@ -110,7 +110,7 @@ public function getShapeCollection() /** * Get collection of shapes * - * @param array $shapeCollection + * @param array|ArrayObject $shapeCollection * @return AbstractSlide */ public function setShapeCollection($shapeCollection = array()) @@ -122,8 +122,8 @@ public function setShapeCollection($shapeCollection = array()) /** * Add shape to slide * - * @param \PhpOffice\PhpPresentation\AbstractShape $shape - * @return \PhpOffice\PhpPresentation\AbstractShape + * @param AbstractShape $shape + * @return AbstractShape * @throws \Exception */ public function addShape(AbstractShape $shape) @@ -137,7 +137,7 @@ public function addShape(AbstractShape $shape) * * @return int */ - public function getOffsetX() + public function getOffsetX(): int { if ($this->offsetX === null) { $offsets = GeometryCalculator::calculateOffsets($this); @@ -152,7 +152,7 @@ public function getOffsetX() * * @return int */ - public function getOffsetY() + public function getOffsetY(): int { if ($this->offsetY === null) { $offsets = GeometryCalculator::calculateOffsets($this); @@ -167,7 +167,7 @@ public function getOffsetY() * * @return int */ - public function getExtentX() + public function getExtentX(): int { if ($this->extentX === null) { $extents = GeometryCalculator::calculateExtents($this); @@ -182,7 +182,7 @@ public function getExtentX() * * @return int */ - public function getExtentY() + public function getExtentY(): int { if ($this->extentY === null) { $extents = GeometryCalculator::calculateExtents($this); @@ -197,7 +197,7 @@ public function getExtentY() * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->identifier . __CLASS__); } @@ -208,9 +208,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -221,20 +221,22 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } /** * Create rich text shape * - * @return \PhpOffice\PhpPresentation\Shape\RichText + * @return RichText * @throws \Exception */ - public function createRichTextShape() + public function createRichTextShape(): RichText { $shape = new RichText(); $this->addShape($shape); @@ -244,14 +246,14 @@ public function createRichTextShape() /** * Create line shape * - * @param int $fromX Starting point x offset - * @param int $fromY Starting point y offset - * @param int $toX Ending point x offset - * @param int $toY Ending point y offset - * @return \PhpOffice\PhpPresentation\Shape\Line + * @param int $fromX Starting point x offset + * @param int $fromY Starting point y offset + * @param int $toX Ending point x offset + * @param int $toY Ending point y offset + * @return Line * @throws \Exception */ - public function createLineShape($fromX, $fromY, $toX, $toY) + public function createLineShape(int $fromX, int $fromY, int $toX, int $toY): Line { $shape = new Line($fromX, $fromY, $toX, $toY); $this->addShape($shape); @@ -261,10 +263,10 @@ public function createLineShape($fromX, $fromY, $toX, $toY) /** * Create chart shape * - * @return \PhpOffice\PhpPresentation\Shape\Chart + * @return Chart * @throws \Exception */ - public function createChartShape() + public function createChartShape(): Chart { $shape = new Chart(); $this->addShape($shape); @@ -274,10 +276,10 @@ public function createChartShape() /** * Create drawing shape * - * @return \PhpOffice\PhpPresentation\Shape\Drawing\File + * @return File * @throws \Exception */ - public function createDrawingShape() + public function createDrawingShape(): File { $shape = new File(); $this->addShape($shape); @@ -287,11 +289,11 @@ public function createDrawingShape() /** * Create table shape * - * @param int $columns Number of columns - * @return \PhpOffice\PhpPresentation\Shape\Table + * @param int $columns Number of columns + * @return Table * @throws \Exception */ - public function createTableShape($columns = 1) + public function createTableShape(int $columns = 1): Table { $shape = new Table($columns); $this->addShape($shape); @@ -301,10 +303,10 @@ public function createTableShape($columns = 1) /** * Creates a group within this slide * - * @return \PhpOffice\PhpPresentation\Shape\Group + * @return Group * @throws \Exception */ - public function createGroup() + public function createGroup(): Group { $shape = new Group(); $this->addShape($shape); @@ -314,9 +316,9 @@ public function createGroup() /** * Get parent * - * @return PhpPresentation + * @return PhpPresentation|null */ - public function getParent() + public function getParent(): ?PhpPresentation { return $this->parent; } @@ -324,11 +326,11 @@ public function getParent() /** * Re-bind parent * - * @param \PhpOffice\PhpPresentation\PhpPresentation $parent - * @return \PhpOffice\PhpPresentation\Slide\AbstractSlide + * @param PhpPresentation $parent + * @return AbstractSlide * @throws \Exception */ - public function rebindParent(PhpPresentation $parent) + public function rebindParent(PhpPresentation $parent): AbstractSlide { $this->parent->removeSlideByIndex($this->parent->getIndex($this)); $this->parent = $parent; @@ -336,38 +338,37 @@ public function rebindParent(PhpPresentation $parent) } /** - * @return AbstractBackground + * @return AbstractBackground|null */ - public function getBackground() + public function getBackground(): ?AbstractBackground { return $this->background; } /** * @param AbstractBackground $background - * @return \PhpOffice\PhpPresentation\Slide\AbstractSlide + * @return AbstractSlide */ - public function setBackground(AbstractBackground $background = null) + public function setBackground(AbstractBackground $background = null): AbstractSlide { $this->background = $background; return $this; } /** - * - * @return \PhpOffice\PhpPresentation\Slide\Transition + * @return Transition|null */ - public function getTransition() + public function getTransition(): ?Transition { return $this->slideTransition; } /** * - * @param \PhpOffice\PhpPresentation\Slide\Transition $transition - * @return \PhpOffice\PhpPresentation\Slide\AbstractSlide + * @param Transition|null $transition + * @return self */ - public function setTransition(Transition $transition = null) + public function setTransition(Transition $transition = null): self { $this->slideTransition = $transition; return $this; @@ -376,16 +377,18 @@ public function setTransition(Transition $transition = null) /** * @return string */ - public function getRelsIndex() + public function getRelsIndex(): string { return $this->relsIndex; } /** * @param string $indexName + * @return self */ - public function setRelsIndex($indexName) + public function setRelsIndex(string $indexName): self { $this->relsIndex = $indexName; + return $this; } } diff --git a/src/PhpPresentation/Slide/Animation.php b/src/PhpPresentation/Slide/Animation.php index e3c5243f8e..a343673924 100644 --- a/src/PhpPresentation/Slide/Animation.php +++ b/src/PhpPresentation/Slide/Animation.php @@ -7,7 +7,7 @@ class Animation { /** - * @var array + * @var array */ protected $shapeCollection = array(); @@ -22,15 +22,15 @@ public function addShape(AbstractShape $shape) } /** - * @return array + * @return array */ - public function getShapeCollection() + public function getShapeCollection(): array { return $this->shapeCollection; } /** - * @param array $array + * @param array $array * @return Animation */ public function setShapeCollection(array $array = array()) diff --git a/src/PhpPresentation/Slide/Background/Color.php b/src/PhpPresentation/Slide/Background/Color.php index fb975f62c4..82972da374 100644 --- a/src/PhpPresentation/Slide/Background/Color.php +++ b/src/PhpPresentation/Slide/Background/Color.php @@ -8,24 +8,24 @@ class Color extends AbstractBackground { /** - * @var StyleColor + * @var StyleColor|null */ protected $color; /** * @param StyleColor|null $color - * @return $this + * @return self */ - public function setColor(StyleColor $color = null) + public function setColor(StyleColor $color = null): self { $this->color = $color; return $this; } /** - * @return StyleColor + * @return StyleColor|null */ - public function getColor() + public function getColor(): ?StyleColor { return $this->color; } diff --git a/src/PhpPresentation/Slide/Background/Image.php b/src/PhpPresentation/Slide/Background/Image.php index ca6eb542ce..fc0b30b4e4 100644 --- a/src/PhpPresentation/Slide/Background/Image.php +++ b/src/PhpPresentation/Slide/Background/Image.php @@ -41,12 +41,12 @@ public function getPath() /** * Set Path * - * @param string $pValue File path - * @param boolean $pVerifyFile Verify file + * @param string $pValue File path + * @param boolean $pVerifyFile Verify file * @throws \Exception * @return \PhpOffice\PhpPresentation\Slide\Background\Image */ - public function setPath($pValue = '', $pVerifyFile = true) + public function setPath(string $pValue = '', bool $pVerifyFile = true) { if ($pVerifyFile) { if (!file_exists($pValue)) { @@ -87,7 +87,7 @@ public function getExtension() /** * Get indexed filename (using image index) * - * @param integer $numSlide + * @param string $numSlide * @return string */ public function getIndexedFilename($numSlide) diff --git a/src/PhpPresentation/Slide/Background/SchemeColor.php b/src/PhpPresentation/Slide/Background/SchemeColor.php index 51bba87938..4f5900f939 100644 --- a/src/PhpPresentation/Slide/Background/SchemeColor.php +++ b/src/PhpPresentation/Slide/Background/SchemeColor.php @@ -8,7 +8,7 @@ class SchemeColor extends AbstractBackground { /** - * @var StyleSchemeColor + * @var StyleSchemeColor|null */ protected $schemeColor; @@ -16,16 +16,16 @@ class SchemeColor extends AbstractBackground * @param StyleSchemeColor|null $color * @return $this */ - public function setSchemeColor(StyleSchemeColor $color = null) + public function setSchemeColor(StyleSchemeColor $color = null): self { $this->schemeColor = $color; return $this; } /** - * @return StyleSchemeColor + * @return StyleSchemeColor|null */ - public function getSchemeColor() + public function getSchemeColor(): ?StyleSchemeColor { return $this->schemeColor; } diff --git a/src/PhpPresentation/Slide/Iterator.php b/src/PhpPresentation/Slide/Iterator.php index 66d159d784..d8938ce993 100644 --- a/src/PhpPresentation/Slide/Iterator.php +++ b/src/PhpPresentation/Slide/Iterator.php @@ -17,19 +17,19 @@ namespace PhpOffice\PhpPresentation\Slide; +use IteratorIterator; use PhpOffice\PhpPresentation\PhpPresentation; /** - * \PhpOffice\PhpPresentation\Slide\Iterator - * * Used to iterate slides in PhpPresentation */ -class Iterator extends \IteratorIterator +// @phpstan-ignore-next-line +class Iterator extends IteratorIterator { /** * Presentation to iterate * - * @var \PhpOffice\PhpPresentation\PhpPresentation + * @var PhpPresentation */ private $subject; @@ -45,9 +45,8 @@ class Iterator extends \IteratorIterator * * @param PhpPresentation $subject */ - public function __construct(PhpPresentation $subject = null) + public function __construct(PhpPresentation $subject) { - // Set subject $this->subject = $subject; } diff --git a/src/PhpPresentation/Slide/Note.php b/src/PhpPresentation/Slide/Note.php index fc08636951..c63083d9df 100644 --- a/src/PhpPresentation/Slide/Note.php +++ b/src/PhpPresentation/Slide/Note.php @@ -17,6 +17,7 @@ namespace PhpOffice\PhpPresentation\Slide; +use ArrayObject; use PhpOffice\PhpPresentation\AbstractShape; use PhpOffice\PhpPresentation\ComparableInterface; use PhpOffice\PhpPresentation\GeometryCalculator; @@ -39,9 +40,9 @@ class Note implements ComparableInterface, ShapeContainerInterface /** * Collection of shapes * - * @var \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] + * @var array|ArrayObject */ - private $shapeCollection = null; + private $shapeCollection; /** * Note identifier @@ -53,7 +54,7 @@ class Note implements ComparableInterface, ShapeContainerInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -96,7 +97,7 @@ public function __construct(Slide $pParent = null) $this->parent = $pParent; // Shape collection - $this->shapeCollection = new \ArrayObject(); + $this->shapeCollection = new ArrayObject(); // Set identifier $this->identifier = md5(rand(0, 9999) . time()); @@ -105,7 +106,7 @@ public function __construct(Slide $pParent = null) /** * Get collection of shapes * - * @return \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] + * @return array|ArrayObject */ public function getShapeCollection() { @@ -115,8 +116,8 @@ public function getShapeCollection() /** * Add shape to slide * - * @param \PhpOffice\PhpPresentation\AbstractShape $shape - * @return \PhpOffice\PhpPresentation\AbstractShape + * @param AbstractShape $shape + * @return AbstractShape * @throws \Exception */ public function addShape(AbstractShape $shape) @@ -129,10 +130,10 @@ public function addShape(AbstractShape $shape) /** * Create rich text shape * - * @return \PhpOffice\PhpPresentation\Shape\RichText + * @return RichText * @throws \Exception */ - public function createRichTextShape() + public function createRichTextShape(): RichText { $shape = new RichText(); $this->addShape($shape); @@ -168,7 +169,7 @@ public function setParent(Slide $parent) * * @return int */ - public function getOffsetX() + public function getOffsetX(): int { if ($this->offsetX === null) { $offsets = GeometryCalculator::calculateOffsets($this); @@ -183,7 +184,7 @@ public function getOffsetX() * * @return int */ - public function getOffsetY() + public function getOffsetY(): int { if ($this->offsetY === null) { $offsets = GeometryCalculator::calculateOffsets($this); @@ -198,7 +199,7 @@ public function getOffsetY() * * @return int */ - public function getExtentX() + public function getExtentX(): int { if ($this->extentX === null) { $extents = GeometryCalculator::calculateExtents($this); @@ -213,7 +214,7 @@ public function getExtentX() * * @return int */ - public function getExtentY() + public function getExtentY(): int { if ($this->extentY === null) { $extents = GeometryCalculator::calculateExtents($this); @@ -228,7 +229,7 @@ public function getExtentY() * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->identifier . __CLASS__); } @@ -239,9 +240,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -252,10 +253,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Slide/SlideLayout.php b/src/PhpPresentation/Slide/SlideLayout.php index 8669a5a2ac..44137c79e3 100644 --- a/src/PhpPresentation/Slide/SlideLayout.php +++ b/src/PhpPresentation/Slide/SlideLayout.php @@ -23,6 +23,9 @@ class SlideLayout extends AbstractSlide implements ComparableInterface, ShapeContainerInterface { + /** + * @var SlideMaster + */ protected $slideMaster; /** * Slide relation ID (should not be used by user code!) @@ -45,7 +48,7 @@ class SlideLayout extends AbstractSlide implements ComparableInterface, ShapeCon /** * Slide layout ID (should not be used by user code!) * - * @var int + * @var string|null */ protected $layoutName; /** @@ -73,18 +76,18 @@ public function __construct(SlideMaster $pSlideMaster) } /** - * @return int + * @return string|null */ - public function getLayoutName() + public function getLayoutName(): ?string { return $this->layoutName; } /** - * @param int $layoutName - * @return SlideLayout + * @param string $layoutName + * @return self */ - public function setLayoutName($layoutName) + public function setLayoutName(string $layoutName): self { $this->layoutName = $layoutName; return $this; @@ -93,7 +96,7 @@ public function setLayoutName($layoutName) /** * @return SlideMaster */ - public function getSlideMaster() + public function getSlideMaster(): SlideMaster { return $this->slideMaster; } diff --git a/src/PhpPresentation/Slide/SlideMaster.php b/src/PhpPresentation/Slide/SlideMaster.php index 4566f2b039..03b09ee2f2 100644 --- a/src/PhpPresentation/Slide/SlideMaster.php +++ b/src/PhpPresentation/Slide/SlideMaster.php @@ -52,7 +52,7 @@ class SlideMaster extends AbstractSlide implements ComparableInterface, ShapeCon */ protected $arraySchemeColor = array(); /** - * @var array + * @var array */ protected $defaultSchemeColor = array( 'dk1' => '000000', @@ -72,7 +72,7 @@ class SlideMaster extends AbstractSlide implements ComparableInterface, ShapeCon /** * Create a new slideMaster * - * @param PhpPresentation $pParent + * @param PhpPresentation|null $pParent * @throws \Exception */ public function __construct(PhpPresentation $pParent = null) @@ -115,7 +115,7 @@ public function createSlideLayout() /** * Add slideLayout * - * @param \PhpOffice\PhpPresentation\Slide\SlideLayout $slideLayout + * @param \PhpOffice\PhpPresentation\Slide\SlideLayout $slideLayout * @throws \Exception * @return \PhpOffice\PhpPresentation\Slide\SlideLayout */ diff --git a/src/PhpPresentation/Slide/Transition.php b/src/PhpPresentation/Slide/Transition.php index efbc41e434..1113f5eed8 100644 --- a/src/PhpPresentation/Slide/Transition.php +++ b/src/PhpPresentation/Slide/Transition.php @@ -86,23 +86,23 @@ class Transition */ protected $hasTimeTrigger = false; /** - * @var int + * @var int|null */ protected $advanceTimeTrigger = null; /** - * @var null|self::SPEED_SLOW|self::SPEED_MEDIUM|self::SPEED_FAST + * @var null|string */ protected $speed = null; /** - * @var null|self::TRANSITION_* + * @var null|string */ protected $transitionType = null; + /** - * @var array + * @param string|null $speed + * @return self */ - protected $transitionOptions = array(); - - public function setSpeed($speed = self::SPEED_MEDIUM) + public function setSpeed(?string $speed = self::SPEED_MEDIUM): self { if (in_array($speed, array(self::SPEED_FAST, self::SPEED_MEDIUM, self::SPEED_SLOW))) { $this->speed = $speed; @@ -113,53 +113,48 @@ public function setSpeed($speed = self::SPEED_MEDIUM) return $this; } - public function getSpeed() + public function getSpeed(): ?string { return $this->speed; } - public function setManualTrigger($value = false) + public function setManualTrigger(bool $value = false): self { - if (is_bool($value)) { - $this->hasManualTrigger = $value; - } + $this->hasManualTrigger = $value; return $this; } - public function hasManualTrigger() + public function hasManualTrigger(): bool { return $this->hasManualTrigger; } - public function setTimeTrigger($value = false, $advanceTime = 1000) + public function setTimeTrigger(bool $value = false, int $advanceTime = 1000): self { - if (is_bool($value)) { - $this->hasTimeTrigger = $value; - } - $this->advanceTimeTrigger = null; - if ($this->hasTimeTrigger === true) { - $this->advanceTimeTrigger = (int) $advanceTime; - } + $this->hasTimeTrigger = $value; + $this->advanceTimeTrigger = $value === true ? $advanceTime : null; + return $this; } - public function hasTimeTrigger() + public function hasTimeTrigger(): bool { return $this->hasTimeTrigger; } - public function getAdvanceTimeTrigger() + public function getAdvanceTimeTrigger(): ?int { return $this->advanceTimeTrigger; } - public function setTransitionType($type = null) + public function setTransitionType(string $type = null): self { $this->transitionType = $type; + return $this; } - public function getTransitionType() + public function getTransitionType(): ?string { return $this->transitionType; } diff --git a/src/PhpPresentation/Style/Alignment.php b/src/PhpPresentation/Style/Alignment.php index ac7598ee56..1c7a23b97a 100644 --- a/src/PhpPresentation/Style/Alignment.php +++ b/src/PhpPresentation/Style/Alignment.php @@ -45,6 +45,9 @@ class Alignment implements ComparableInterface public const TEXT_DIRECTION_VERTICAL_270 = 'vert270'; public const TEXT_DIRECTION_STACKED = 'wordArtVert'; + /** + * @var array + */ private $supportedStyles = array( self::HORIZONTAL_GENERAL, self::HORIZONTAL_LEFT, @@ -77,37 +80,37 @@ class Alignment implements ComparableInterface /** * Indent - only possible with horizontal alignment left and right - * @var int + * @var float */ private $indent = 0; /** * Margin left - only possible with horizontal alignment left and right - * @var int + * @var float */ private $marginLeft = 0; /** * Margin right - only possible with horizontal alignment left and right - * @var int + * @var float */ private $marginRight = 0; /** * Margin top - * @var int + * @var float */ private $marginTop = 0; /** * Margin bottom - * @var int + * @var float */ private $marginBottom = 0; /** * Hash index - * @var string + * @var int */ private $hashIndex; @@ -126,7 +129,7 @@ public function __construct() * * @return string */ - public function getHorizontal() + public function getHorizontal(): string { return $this->horizontal; } @@ -134,10 +137,10 @@ public function getHorizontal() /** * Set Horizontal * - * @param string $pValue - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @param string $pValue + * @return self */ - public function setHorizontal($pValue = self::HORIZONTAL_LEFT) + public function setHorizontal(string $pValue = self::HORIZONTAL_LEFT): self { if ($pValue == '') { $pValue = self::HORIZONTAL_LEFT; @@ -152,7 +155,7 @@ public function setHorizontal($pValue = self::HORIZONTAL_LEFT) * * @return string */ - public function getVertical() + public function getVertical(): string { return $this->vertical; } @@ -160,10 +163,10 @@ public function getVertical() /** * Set Vertical * - * @param string $pValue - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @param string $pValue + * @return self */ - public function setVertical($pValue = self::VERTICAL_BASE) + public function setVertical(string $pValue = self::VERTICAL_BASE): self { if ($pValue == '') { $pValue = self::VERTICAL_BASE; @@ -178,7 +181,7 @@ public function setVertical($pValue = self::VERTICAL_BASE) * * @return int */ - public function getLevel() + public function getLevel(): int { return $this->level; } @@ -186,11 +189,11 @@ public function getLevel() /** * Set Level * - * @param int $pValue Ranging 0 - 8 + * @param int $pValue Ranging 0 - 8 * @throws \Exception - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @return self */ - public function setLevel($pValue = 0) + public function setLevel(int $pValue = 0): self { if ($pValue < 0) { throw new \Exception("Invalid value should be more than 0."); @@ -203,9 +206,9 @@ public function setLevel($pValue = 0) /** * Get indent * - * @return int + * @return float */ - public function getIndent() + public function getIndent(): float { return $this->indent; } @@ -213,10 +216,10 @@ public function getIndent() /** * Set indent * - * @param int $pValue - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @param float $pValue + * @return self */ - public function setIndent($pValue = 0) + public function setIndent(float $pValue = 0): self { if ($pValue > 0 && !in_array($this->getHorizontal(), $this->supportedStyles)) { $pValue = 0; // indent not supported @@ -230,9 +233,9 @@ public function setIndent($pValue = 0) /** * Get margin left * - * @return int + * @return float */ - public function getMarginLeft() + public function getMarginLeft(): float { return $this->marginLeft; } @@ -240,10 +243,10 @@ public function getMarginLeft() /** * Set margin left * - * @param int $pValue - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @param float $pValue + * @return self */ - public function setMarginLeft($pValue = 0) + public function setMarginLeft(float $pValue = 0): self { if ($pValue > 0 && !in_array($this->getHorizontal(), $this->supportedStyles)) { $pValue = 0; // margin left not supported @@ -257,9 +260,9 @@ public function setMarginLeft($pValue = 0) /** * Get margin right * - * @return int + * @return float */ - public function getMarginRight() + public function getMarginRight(): float { return $this->marginRight; } @@ -267,10 +270,10 @@ public function getMarginRight() /** * Set margin ight * - * @param int $pValue - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @param float $pValue + * @return self */ - public function setMarginRight($pValue = 0) + public function setMarginRight(float $pValue = 0): self { if ($pValue > 0 && !in_array($this->getHorizontal(), $this->supportedStyles)) { $pValue = 0; // margin right not supported @@ -284,9 +287,9 @@ public function setMarginRight($pValue = 0) /** * Get margin top * - * @return int + * @return float */ - public function getMarginTop() + public function getMarginTop(): float { return $this->marginTop; } @@ -294,10 +297,10 @@ public function getMarginTop() /** * Set margin top * - * @param int $pValue - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @param float $pValue + * @return self */ - public function setMarginTop($pValue = 0) + public function setMarginTop(float $pValue = 0): self { $this->marginTop = $pValue; @@ -307,9 +310,9 @@ public function setMarginTop($pValue = 0) /** * Get margin bottom * - * @return int + * @return float */ - public function getMarginBottom() + public function getMarginBottom(): float { return $this->marginBottom; } @@ -317,10 +320,10 @@ public function getMarginBottom() /** * Set margin bottom * - * @param int $pValue - * @return \PhpOffice\PhpPresentation\Style\Alignment + * @param float $pValue + * @return self */ - public function setMarginBottom($pValue = 0) + public function setMarginBottom(float $pValue = 0): self { $this->marginBottom = $pValue; @@ -330,16 +333,16 @@ public function setMarginBottom($pValue = 0) /** * @return string */ - public function getTextDirection() + public function getTextDirection(): string { return $this->textDirection; } /** * @param string $pValue - * @return Alignment + * @return self */ - public function setTextDirection($pValue = self::TEXT_DIRECTION_HORIZONTAL) + public function setTextDirection(string $pValue = self::TEXT_DIRECTION_HORIZONTAL): self { if (empty($pValue)) { $pValue = self::TEXT_DIRECTION_HORIZONTAL; @@ -353,7 +356,7 @@ public function setTextDirection($pValue = self::TEXT_DIRECTION_HORIZONTAL) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5( $this->horizontal @@ -372,9 +375,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -385,10 +388,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Style/Border.php b/src/PhpPresentation/Style/Border.php index b71e2f387b..9a1baaaec5 100644 --- a/src/PhpPresentation/Style/Border.php +++ b/src/PhpPresentation/Style/Border.php @@ -76,7 +76,7 @@ class Border implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -105,7 +105,7 @@ public function getLineWidth() /** * Set line width (in points) * - * @param int $pValue + * @param int $pValue * @return \PhpOffice\PhpPresentation\Style\Border */ public function setLineWidth($pValue = 1) @@ -128,7 +128,7 @@ public function getLineStyle() /** * Set line style * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\Style\Border */ public function setLineStyle($pValue = self::LINE_SINGLE) @@ -154,7 +154,7 @@ public function getDashStyle() /** * Set dash style * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\Style\Border */ public function setDashStyle($pValue = self::DASH_SOLID) @@ -180,7 +180,7 @@ public function getColor() /** * Set Border Color * - * @param \PhpOffice\PhpPresentation\Style\Color $color + * @param \PhpOffice\PhpPresentation\Style\Color $color * @throws \Exception * @return \PhpOffice\PhpPresentation\Style\Border */ @@ -196,7 +196,7 @@ public function setColor(Color $color = null) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5( $this->lineStyle @@ -213,9 +213,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -226,10 +226,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Style/Borders.php b/src/PhpPresentation/Style/Borders.php index 3d015686f1..08de216ed1 100644 --- a/src/PhpPresentation/Style/Borders.php +++ b/src/PhpPresentation/Style/Borders.php @@ -69,7 +69,7 @@ class Borders implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -154,7 +154,7 @@ public function getDiagonalDown() * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5( $this->getLeft()->getHashCode() @@ -173,9 +173,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -186,10 +186,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Style/Bullet.php b/src/PhpPresentation/Style/Bullet.php index 0109d6d1db..7dca3e4969 100644 --- a/src/PhpPresentation/Style/Bullet.php +++ b/src/PhpPresentation/Style/Bullet.php @@ -111,23 +111,19 @@ class Bullet implements ComparableInterface /** * Bullet numeric start at * - * @var int + * @var int|string */ - private $bulletNumericStartAt = 1; + private $bulletNumericStartAt; /** * Hash index * - * @var string + * @var int */ private $hashIndex; - /** - * Create a new \PhpOffice\PhpPresentation\Style\Bullet - */ public function __construct() { - // Initialise values $this->bulletType = self::TYPE_NONE; $this->bulletFont = 'Calibri'; $this->bulletChar = '-'; @@ -149,7 +145,7 @@ public function getBulletType() /** * Set bullet type * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\Style\Bullet */ public function setBulletType($pValue = self::TYPE_NONE) @@ -172,7 +168,7 @@ public function getBulletFont() /** * Set bullet font * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\Style\Bullet */ public function setBulletFont($pValue = 'Calibri') @@ -198,7 +194,7 @@ public function getBulletChar() /** * Set bullet char * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\Style\Bullet */ public function setBulletChar($pValue = '-') @@ -221,7 +217,7 @@ public function getBulletNumericStyle() /** * Set bullet numeric style * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\Style\Bullet */ public function setBulletNumericStyle($pValue = self::NUMERIC_DEFAULT) @@ -234,7 +230,7 @@ public function setBulletNumericStyle($pValue = self::NUMERIC_DEFAULT) /** * Get bullet numeric start at * - * @return string + * @return int|string */ public function getBulletNumericStartAt() { @@ -259,7 +255,7 @@ public function setBulletNumericStartAt($pValue = 1) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5( $this->bulletType @@ -277,9 +273,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -290,11 +286,13 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } /** diff --git a/src/PhpPresentation/Style/Color.php b/src/PhpPresentation/Style/Color.php index c429a24986..cfcdca5af5 100644 --- a/src/PhpPresentation/Style/Color.php +++ b/src/PhpPresentation/Style/Color.php @@ -46,7 +46,7 @@ class Color implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -74,7 +74,7 @@ public function getARGB() /** * Set ARGB * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\Style\Color */ public function setARGB($pValue = self::COLOR_BLACK) @@ -116,7 +116,7 @@ public function setAlpha($alpha = 100) $alpha = 100; } $alpha = round(($alpha / 100) * 255); - $alpha = dechex($alpha); + $alpha = dechex((int) $alpha); $alpha = str_pad($alpha, 2, '0', STR_PAD_LEFT); $this->argb = $alpha . substr($this->argb, 2); return $this; @@ -139,8 +139,8 @@ public function getRGB() /** * Set RGB * - * @param string $pValue - * @param string $pAlpha + * @param string $pValue + * @param string $pAlpha * @return \PhpOffice\PhpPresentation\Style\Color */ public function setRGB($pValue = '000000', $pAlpha = 'FF') @@ -161,7 +161,7 @@ public function setRGB($pValue = '000000', $pAlpha = 'FF') * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5( $this->argb @@ -175,9 +175,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -188,10 +188,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Style/ColorMap.php b/src/PhpPresentation/Style/ColorMap.php index 10d4f4afd6..15394083cf 100644 --- a/src/PhpPresentation/Style/ColorMap.php +++ b/src/PhpPresentation/Style/ColorMap.php @@ -38,10 +38,13 @@ class ColorMap /** * Mapping - Stores the mapping betweenSlide and theme * - * @var array + * @var array */ protected $mapping = array(); + /** + * @var array + */ public static $mappingDefault = array( self::COLOR_BG1 => 'lt1', self::COLOR_TX1 => 'dk1', @@ -71,9 +74,9 @@ public function __construct() * * @param string $item * @param string $newThemeColor - * @return ColorMap + * @return self */ - public function changeColor($item, $newThemeColor) + public function changeColor(string $item, string $newThemeColor): self { $this->mapping[$item] = $newThemeColor; return $this; @@ -82,10 +85,10 @@ public function changeColor($item, $newThemeColor) /** * Store a new map. For use with the reader * - * @param array $arrayMapping - * @return ColorMap + * @param array $arrayMapping + * @return self */ - public function setMapping(array $arrayMapping = array()) + public function setMapping(array $arrayMapping = array()): self { $this->mapping = $arrayMapping; return $this; @@ -94,9 +97,9 @@ public function setMapping(array $arrayMapping = array()) /** * Get the whole mapping as an array * - * @return array + * @return array */ - public function getMapping() + public function getMapping(): array { return $this->mapping; } diff --git a/src/PhpPresentation/Style/Fill.php b/src/PhpPresentation/Style/Fill.php index 79218e71ce..c76091fc06 100644 --- a/src/PhpPresentation/Style/Fill.php +++ b/src/PhpPresentation/Style/Fill.php @@ -78,7 +78,7 @@ class Fill implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -107,7 +107,7 @@ public function getFillType() /** * Set Fill Type * - * @param string $pValue \PhpOffice\PhpPresentation\Style\Fill fill type + * @param string $pValue \PhpOffice\PhpPresentation\Style\Fill fill type * @return \PhpOffice\PhpPresentation\Style\Fill */ public function setFillType($pValue = self::FILL_NONE) @@ -155,7 +155,7 @@ public function getStartColor() /** * Set Start Color * - * @param \PhpOffice\PhpPresentation\Style\Color $pValue + * @param \PhpOffice\PhpPresentation\Style\Color $pValue * @throws \Exception * @return \PhpOffice\PhpPresentation\Style\Fill */ @@ -181,7 +181,7 @@ public function getEndColor() /** * Set End Color * - * @param \PhpOffice\PhpPresentation\Style\Color $pValue + * @param \PhpOffice\PhpPresentation\Style\Color $pValue * @throws \Exception * @return \PhpOffice\PhpPresentation\Style\Fill */ @@ -197,7 +197,7 @@ public function setEndColor(Color $pValue = null) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5( $this->getFillType() @@ -214,9 +214,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -227,10 +227,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Style/Font.php b/src/PhpPresentation/Style/Font.php index 0ad374e1b8..dd6eda694c 100644 --- a/src/PhpPresentation/Style/Font.php +++ b/src/PhpPresentation/Style/Font.php @@ -54,7 +54,7 @@ class Font implements ComparableInterface /** * Font Size * - * @var float|int + * @var int */ private $size; @@ -103,7 +103,7 @@ class Font implements ComparableInterface /** * Foreground color * - * @var \PhpOffice\PhpPresentation\Style\Color + * @var Color */ private $color; @@ -117,7 +117,7 @@ class Font implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -152,7 +152,7 @@ public function getName() /** * Set Name * - * @param string $pValue + * @param string $pValue * @return \PhpOffice\PhpPresentation\Style\Font */ public function setName($pValue = 'Calibri') @@ -194,9 +194,9 @@ public function setCharacterSpacing($pValue = 0) /** * Get Size * - * @return double + * @return int */ - public function getSize() + public function getSize(): int { return $this->size; } @@ -204,14 +204,11 @@ public function getSize() /** * Set Size * - * @param float|int $pValue - * @return \PhpOffice\PhpPresentation\Style\Font + * @param int $pValue + * @return self */ - public function setSize($pValue = 10) + public function setSize(int $pValue = 10): self { - if ($pValue == '') { - $pValue = 10; - } $this->size = $pValue; return $this; @@ -230,14 +227,11 @@ public function isBold() /** * Set Bold * - * @param boolean $pValue - * @return \PhpOffice\PhpPresentation\Style\Font + * @param bool $pValue + * @return self */ - public function setBold($pValue = false) + public function setBold(bool $pValue = false): self { - if ($pValue == '') { - $pValue = false; - } $this->bold = $pValue; return $this; @@ -256,14 +250,11 @@ public function isItalic() /** * Set Italic * - * @param boolean $pValue - * @return \PhpOffice\PhpPresentation\Style\Font + * @param bool $pValue + * @return self */ - public function setItalic($pValue = false) + public function setItalic(bool $pValue = false): self { - if ($pValue == '') { - $pValue = false; - } $this->italic = $pValue; return $this; @@ -282,15 +273,11 @@ public function isSuperScript() /** * Set SuperScript * - * @param boolean $pValue - * @return \PhpOffice\PhpPresentation\Style\Font + * @param bool $pValue + * @return self */ - public function setSuperScript($pValue = false) + public function setSuperScript(bool $pValue = false): self { - if ($pValue == '') { - $pValue = false; - } - $this->superScript = $pValue; // Set SubScript at false only if SuperScript is true @@ -302,27 +289,19 @@ public function setSuperScript($pValue = false) } /** - * Get SubScript - * - * @return boolean + * @return bool */ - public function isSubScript() + public function isSubScript(): bool { return $this->subScript; } /** - * Set SubScript - * - * @param boolean $pValue - * @return \PhpOffice\PhpPresentation\Style\Font + * @param bool $pValue + * @return self */ - public function setSubScript($pValue = false) + public function setSubScript(bool $pValue = false): self { - if ($pValue == '') { - $pValue = false; - } - $this->subScript = $pValue; // Set SuperScript at false only if SubScript is true @@ -346,7 +325,7 @@ public function getUnderline() /** * Set Underline * - * @param string $pValue \PhpOffice\PhpPresentation\Style\Font underline type + * @param string $pValue \PhpOffice\PhpPresentation\Style\Font underline type * @return \PhpOffice\PhpPresentation\Style\Font */ public function setUnderline($pValue = self::UNDERLINE_NONE) @@ -372,14 +351,11 @@ public function isStrikethrough() /** * Set Strikethrough * - * @param boolean $pValue - * @return \PhpOffice\PhpPresentation\Style\Font + * @param bool $pValue + * @return self */ - public function setStrikethrough($pValue = false) + public function setStrikethrough(bool $pValue = false): self { - if ($pValue == '') { - $pValue = false; - } $this->strikethrough = $pValue; return $this; @@ -388,9 +364,9 @@ public function setStrikethrough($pValue = false) /** * Get Color * - * @return \PhpOffice\PhpPresentation\Style\Color|\PhpOffice\PhpPresentation\Style\SchemeColor + * @return Color */ - public function getColor() + public function getColor(): Color { return $this->color; } @@ -398,15 +374,12 @@ public function getColor() /** * Set Color * - * @param \PhpOffice\PhpPresentation\Style\Color|\PhpOffice\PhpPresentation\Style\SchemeColor $pValue + * @param Color $pValue * @throws \Exception - * @return \PhpOffice\PhpPresentation\Style\Font + * @return self */ - public function setColor($pValue = null) + public function setColor(Color $pValue): self { - if (!$pValue instanceof Color) { - throw new \Exception('$pValue must be an instance of \PhpOffice\PhpPresentation\Style\Color'); - } $this->color = $pValue; return $this; @@ -417,7 +390,7 @@ public function setColor($pValue = null) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5($this->name . $this->size . ($this->bold ? 't' : 'f') . ($this->italic ? 't' : 'f') . ($this->superScript ? 't' : 'f') . ($this->subScript ? 't' : 'f') . $this->underline . ($this->strikethrough ? 't' : 'f') . $this->color->getHashCode() . __CLASS__); } @@ -428,9 +401,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -441,10 +414,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Style/Outline.php b/src/PhpPresentation/Style/Outline.php index 03c7d21d4f..3bb6b5d697 100644 --- a/src/PhpPresentation/Style/Outline.php +++ b/src/PhpPresentation/Style/Outline.php @@ -27,14 +27,10 @@ class Outline */ protected $fill; /** - * @var int + * @var int|null */ protected $width; - - /** - * Outline constructor. - */ public function __construct() { $this->fill = new Fill(); @@ -43,37 +39,37 @@ public function __construct() /** * @return Fill */ - public function getFill() + public function getFill(): Fill { return $this->fill; } /** * @param Fill $fill - * @return Outline + * @return self */ - public function setFill(Fill $fill) + public function setFill(Fill $fill): self { $this->fill = $fill; return $this; } /** - * @return int + * @return int|null */ - public function getWidth() + public function getWidth(): ?int { return $this->width; } /** * Value in points - * @param int $width - * @return Outline + * @param int $pValue + * @return self */ - public function setWidth($width) + public function setWidth(int $pValue = 0): self { - $this->width = intval($width); + $this->width = $pValue; return $this; } } diff --git a/src/PhpPresentation/Style/SchemeColor.php b/src/PhpPresentation/Style/SchemeColor.php index 7b8c7fbab6..36bc23c35b 100644 --- a/src/PhpPresentation/Style/SchemeColor.php +++ b/src/PhpPresentation/Style/SchemeColor.php @@ -19,21 +19,26 @@ class SchemeColor extends Color { + /** + * @var string + */ protected $value; /** * @return string */ - public function getValue() + public function getValue(): string { return $this->value; } /** * @param string $value + * @return self */ - public function setValue($value) + public function setValue(string $value): self { $this->value = $value; + return $this; } } diff --git a/src/PhpPresentation/Style/Shadow.php b/src/PhpPresentation/Style/Shadow.php index cd489be468..684903899a 100644 --- a/src/PhpPresentation/Style/Shadow.php +++ b/src/PhpPresentation/Style/Shadow.php @@ -74,15 +74,11 @@ class Shadow implements ComparableInterface private $alignment; /** - * Color - * - * @var \PhpOffice\PhpPresentation\Style\Color + * @var Color|null */ private $color; /** - * Alpha - * * @var int */ private $alpha; @@ -90,7 +86,7 @@ class Shadow implements ComparableInterface /** * Hash index * - * @var string + * @var int */ private $hashIndex; @@ -114,7 +110,7 @@ public function __construct() * * @return boolean */ - public function isVisible() + public function isVisible(): bool { return $this->visible; } @@ -122,10 +118,10 @@ public function isVisible() /** * Set Visible * - * @param boolean $pValue - * @return $this + * @param bool $pValue + * @return self */ - public function setVisible($pValue = false) + public function setVisible(bool $pValue = false): self { $this->visible = $pValue; @@ -137,7 +133,7 @@ public function setVisible($pValue = false) * * @return int */ - public function getBlurRadius() + public function getBlurRadius(): int { return $this->blurRadius; } @@ -145,10 +141,10 @@ public function getBlurRadius() /** * Set Blur radius * - * @param int $pValue - * @return $this + * @param int $pValue + * @return self */ - public function setBlurRadius($pValue = 6) + public function setBlurRadius(int $pValue = 6): self { $this->blurRadius = $pValue; @@ -160,7 +156,7 @@ public function setBlurRadius($pValue = 6) * * @return int */ - public function getDistance() + public function getDistance(): int { return $this->distance; } @@ -168,10 +164,10 @@ public function getDistance() /** * Set Shadow distance * - * @param int $pValue + * @param int $pValue * @return $this */ - public function setDistance($pValue = 2) + public function setDistance(int $pValue = 2): self { $this->distance = $pValue; @@ -183,7 +179,7 @@ public function setDistance($pValue = 2) * * @return int */ - public function getDirection() + public function getDirection(): int { return $this->direction; } @@ -191,10 +187,10 @@ public function getDirection() /** * Set Shadow direction (in degrees) * - * @param int $pValue - * @return $this + * @param int $pValue + * @return self */ - public function setDirection($pValue = 0) + public function setDirection(int $pValue = 0): self { $this->direction = $pValue; @@ -204,9 +200,9 @@ public function setDirection($pValue = 0) /** * Get Shadow alignment * - * @return int + * @return string */ - public function getAlignment() + public function getAlignment(): string { return $this->alignment; } @@ -214,10 +210,10 @@ public function getAlignment() /** * Set Shadow alignment * - * @param string $pValue - * @return $this + * @param string $pValue + * @return self */ - public function setAlignment($pValue = self::SHADOW_BOTTOM_RIGHT) + public function setAlignment(string $pValue = self::SHADOW_BOTTOM_RIGHT): self { $this->alignment = $pValue; @@ -227,9 +223,9 @@ public function setAlignment($pValue = self::SHADOW_BOTTOM_RIGHT) /** * Get Color * - * @return \PhpOffice\PhpPresentation\Style\Color + * @return Color|null */ - public function getColor() + public function getColor(): ?Color { return $this->color; } @@ -237,11 +233,10 @@ public function getColor() /** * Set Color * - * @param \PhpOffice\PhpPresentation\Style\Color $pValue - * @throws \Exception - * @return $this + * @param Color|null $pValue + * @return self */ - public function setColor(Color $pValue = null) + public function setColor(Color $pValue = null): self { $this->color = $pValue; @@ -253,7 +248,7 @@ public function setColor(Color $pValue = null) * * @return int */ - public function getAlpha() + public function getAlpha(): int { return $this->alpha; } @@ -261,10 +256,10 @@ public function getAlpha() /** * Set Alpha * - * @param int $pValue - * @return $this + * @param int $pValue + * @return self */ - public function setAlpha($pValue = 0) + public function setAlpha(int $pValue = 0): self { $this->alpha = $pValue; @@ -276,7 +271,7 @@ public function setAlpha($pValue = 0) * * @return string Hash code */ - public function getHashCode() + public function getHashCode(): string { return md5(($this->visible ? 't' : 'f') . $this->blurRadius . $this->distance . $this->direction . $this->alignment . $this->color->getHashCode() . $this->alpha . __CLASS__); } @@ -287,9 +282,9 @@ public function getHashCode() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @return string Hash index + * @return int|null Hash index */ - public function getHashIndex() + public function getHashIndex(): ?int { return $this->hashIndex; } @@ -300,10 +295,12 @@ public function getHashIndex() * Note that this index may vary during script execution! Only reliable moment is * while doing a write of a workbook and when changes are not allowed. * - * @param string $value Hash index + * @param int $value Hash index + * @return $this */ - public function setHashIndex($value) + public function setHashIndex(int $value) { $this->hashIndex = $value; + return $this; } } diff --git a/src/PhpPresentation/Style/TextStyle.php b/src/PhpPresentation/Style/TextStyle.php index 2f41c7ae6f..d72f267a31 100644 --- a/src/PhpPresentation/Style/TextStyle.php +++ b/src/PhpPresentation/Style/TextStyle.php @@ -25,15 +25,15 @@ class TextStyle { /** - * @var array + * @var array */ protected $bodyStyle = array(); /** - * @var array + * @var array */ protected $titleStyle = array(); /** - * @var array + * @var array */ protected $otherStyle = array(); @@ -71,15 +71,12 @@ public function __construct($default = true) } /** - * @param $lvl + * @param int|null $lvl * @return bool */ - private function checkLvl($lvl) + private function checkLvl(?int $lvl): bool { - if (!is_int($lvl)) { - return false; - } - if ($lvl > 9) { + if (is_null($lvl) || $lvl > 9) { return false; } return true; @@ -87,10 +84,10 @@ private function checkLvl($lvl) /** * @param RichTextParagraph $style - * @param $lvl - * @return TextStyle + * @param int|null $lvl + * @return self */ - public function setBodyStyleAtLvl(RichTextParagraph $style, $lvl) + public function setBodyStyleAtLvl(RichTextParagraph $style, ?int $lvl): self { if ($this->checkLvl($lvl)) { $this->bodyStyle[$lvl] = $style; @@ -100,10 +97,10 @@ public function setBodyStyleAtLvl(RichTextParagraph $style, $lvl) /** * @param RichTextParagraph $style - * @param $lvl - * @return TextStyle + * @param int|null $lvl + * @return self */ - public function setTitleStyleAtLvl(RichTextParagraph $style, $lvl) + public function setTitleStyleAtLvl(RichTextParagraph $style, ?int $lvl): self { if ($this->checkLvl($lvl)) { $this->titleStyle[$lvl] = $style; @@ -113,10 +110,10 @@ public function setTitleStyleAtLvl(RichTextParagraph $style, $lvl) /** * @param RichTextParagraph $style - * @param $lvl + * @param int|null $lvl * @return TextStyle */ - public function setOtherStyleAtLvl(RichTextParagraph $style, $lvl) + public function setOtherStyleAtLvl(RichTextParagraph $style, ?int $lvl): self { if ($this->checkLvl($lvl)) { $this->otherStyle[$lvl] = $style; @@ -125,10 +122,10 @@ public function setOtherStyleAtLvl(RichTextParagraph $style, $lvl) } /** - * @param $lvl - * @return mixed + * @param int|null $lvl + * @return RichTextParagraph|null */ - public function getBodyStyleAtLvl($lvl) + public function getBodyStyleAtLvl(?int $lvl): ?RichTextParagraph { if ($this->checkLvl($lvl) && !empty($this->bodyStyle[$lvl])) { return $this->bodyStyle[$lvl]; @@ -137,10 +134,10 @@ public function getBodyStyleAtLvl($lvl) } /** - * @param $lvl - * @return mixed + * @param int|null $lvl + * @return RichTextParagraph|null */ - public function getTitleStyleAtLvl($lvl) + public function getTitleStyleAtLvl(?int $lvl): ?RichTextParagraph { if ($this->checkLvl($lvl) && !empty($this->titleStyle[$lvl])) { return $this->titleStyle[$lvl]; @@ -149,10 +146,10 @@ public function getTitleStyleAtLvl($lvl) } /** - * @param $lvl - * @return mixed + * @param int|null $lvl + * @return RichTextParagraph|null */ - public function getOtherStyleAtLvl($lvl) + public function getOtherStyleAtLvl(?int $lvl): ?RichTextParagraph { if ($this->checkLvl($lvl) && !empty($this->otherStyle[$lvl])) { return $this->otherStyle[$lvl]; @@ -161,25 +158,25 @@ public function getOtherStyleAtLvl($lvl) } /** - * @return array + * @return array */ - public function getBodyStyle() + public function getBodyStyle(): array { return $this->bodyStyle; } /** - * @return array + * @return array */ - public function getTitleStyle() + public function getTitleStyle(): array { return $this->titleStyle; } /** - * @return array + * @return array */ - public function getOtherStyle() + public function getOtherStyle(): array { return $this->otherStyle; } diff --git a/src/PhpPresentation/Writer/AbstractWriter.php b/src/PhpPresentation/Writer/AbstractWriter.php index b17dcc138b..faf88083d5 100644 --- a/src/PhpPresentation/Writer/AbstractWriter.php +++ b/src/PhpPresentation/Writer/AbstractWriter.php @@ -2,7 +2,10 @@ namespace PhpOffice\PhpPresentation\Writer; +use ArrayIterator; use PhpOffice\Common\Adapter\Zip\ZipInterface; +use PhpOffice\PhpPresentation\AbstractShape; +use PhpOffice\PhpPresentation\HashTable; use PhpOffice\PhpPresentation\PhpPresentation; use PhpOffice\PhpPresentation\Shape\Chart; use PhpOffice\PhpPresentation\Shape\Drawing\AbstractDrawingAdapter; @@ -13,7 +16,7 @@ abstract class AbstractWriter /** * Private unique hash table * - * @var \PhpOffice\PhpPresentation\HashTable + * @var HashTable */ protected $oDrawingHashTable; @@ -25,16 +28,16 @@ abstract class AbstractWriter protected $oPresentation; /** - * @var ZipInterface + * @var ZipInterface|null */ protected $oZipAdapter; /** * Get drawing hash table * - * @return \PhpOffice\PhpPresentation\HashTable + * @return HashTable */ - public function getDrawingHashTable() + public function getDrawingHashTable(): HashTable { return $this->oDrawingHashTable; } @@ -45,7 +48,7 @@ public function getDrawingHashTable() * @return PhpPresentation * @throws \Exception */ - public function getPhpPresentation() + public function getPhpPresentation(): PhpPresentation { if (empty($this->oPresentation)) { throw new \Exception("No PhpPresentation assigned."); @@ -56,9 +59,9 @@ public function getPhpPresentation() /** * Get PhpPresentation object * - * @param PhpPresentation $pPhpPresentation PhpPresentation object + * @param PhpPresentation|null $pPhpPresentation PhpPresentation object * @throws \Exception - * @return \PhpOffice\PhpPresentation\Writer\AbstractWriter + * @return self */ public function setPhpPresentation(PhpPresentation $pPhpPresentation = null) { @@ -69,18 +72,18 @@ public function setPhpPresentation(PhpPresentation $pPhpPresentation = null) /** * @param ZipInterface $oZipAdapter - * @return $this + * @return self */ - public function setZipAdapter(ZipInterface $oZipAdapter) + public function setZipAdapter(ZipInterface $oZipAdapter): self { $this->oZipAdapter = $oZipAdapter; return $this; } /** - * @return ZipInterface + * @return ZipInterface|null */ - public function getZipAdapter() + public function getZipAdapter(): ?ZipInterface { return $this->oZipAdapter; } @@ -88,10 +91,10 @@ public function getZipAdapter() /** * Get an array of all drawings * - * @return \PhpOffice\PhpPresentation\Shape\AbstractDrawing[] All drawings in PhpPresentation + * @return array * @throws \Exception */ - protected function allDrawings() + protected function allDrawings(): array { // Get an array of all drawings $aDrawings = array(); @@ -118,7 +121,11 @@ protected function allDrawings() return $aDrawings; } - private function iterateCollection(\ArrayIterator $oIterator) + /** + * @param ArrayIterator $oIterator + * @return array + */ + private function iterateCollection(ArrayIterator $oIterator): array { $arrayReturn = array(); if ($oIterator->count() <= 0) { diff --git a/src/PhpPresentation/Writer/ODPresentation.php b/src/PhpPresentation/Writer/ODPresentation.php index bf3b68d941..783d726b3c 100644 --- a/src/PhpPresentation/Writer/ODPresentation.php +++ b/src/PhpPresentation/Writer/ODPresentation.php @@ -20,8 +20,6 @@ use PhpOffice\Common\Adapter\Zip\ZipArchiveAdapter; use PhpOffice\PhpPresentation\HashTable; use PhpOffice\PhpPresentation\PhpPresentation; -use PhpOffice\PhpPresentation\Shape\AbstractDrawing; -use PhpOffice\PhpPresentation\Shape\Table; use DirectoryIterator; /** @@ -71,10 +69,10 @@ public function __construct(PhpPresentation $pPhpPresentation = null) /** * Save PhpPresentation to file * - * @param string $pFilename + * @param string $pFilename * @throws \Exception */ - public function save($pFilename) + public function save(string $pFilename): void { if (empty($pFilename)) { throw new \Exception("Filename is empty"); @@ -155,8 +153,8 @@ public function hasDiskCaching() /** * Set use disk caching where possible? * - * @param boolean $pValue - * @param string $pDirectory Disk caching directory + * @param boolean $pValue + * @param string $pDirectory Disk caching directory * @throws \Exception * @return \PhpOffice\PhpPresentation\Writer\ODPresentation */ diff --git a/src/PhpPresentation/Writer/ODPresentation/Content.php b/src/PhpPresentation/Writer/ODPresentation/Content.php index a59e751cef..c9a2a7853d 100644 --- a/src/PhpPresentation/Writer/ODPresentation/Content.php +++ b/src/PhpPresentation/Writer/ODPresentation/Content.php @@ -15,6 +15,7 @@ use PhpOffice\PhpPresentation\Shape\Group; use PhpOffice\PhpPresentation\Shape\Line; use PhpOffice\PhpPresentation\Shape\RichText\BreakElement; +use PhpOffice\PhpPresentation\Shape\RichText\Paragraph; use PhpOffice\PhpPresentation\Shape\RichText\Run; use PhpOffice\PhpPresentation\Shape\RichText\TextElement; use PhpOffice\PhpPresentation\Shape\RichText; @@ -31,28 +32,28 @@ class Content extends AbstractDecoratorWriter /** * Stores bullet styles for text shapes that include lists. * - * @var [] + * @var array> */ protected $arrStyleBullet = array(); /** * Stores paragraph information for text shapes. * - * @var array + * @var array */ protected $arrStyleParagraph = array(); /** * Stores font styles for text shapes that include lists. * - * @var Run[] + * @var array */ protected $arrStyleTextFont = array(); /** * Used to track the current shape ID. * - * @var integer + * @var int */ protected $shapeId; @@ -60,21 +61,19 @@ class Content extends AbstractDecoratorWriter * @return ZipInterface * @throws \Exception */ - public function render() + public function render(): ZipInterface { $this->getZip()->addFromString('content.xml', $this->writeContent()); return $this->getZip(); } - - /** * Write content file to XML format * - * @return string XML Output + * @return string XML Output * @throws \Exception */ - public function writeContent() + public function writeContent(): string { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); @@ -163,7 +162,7 @@ public function writeContent() $oAlign = $item['oAlign_' . $level]; // text:list-level-style-bullet $objWriter->startElement('text:list-level-style-bullet'); - $objWriter->writeAttribute('text:level', $level + 1); + $objWriter->writeAttribute('text:level', intval($level) + 1); $objWriter->writeAttribute('text:bullet-char', $oStyle->getBulletChar()); // style:list-level-properties $objWriter->startElement('style:list-level-properties'); @@ -324,7 +323,7 @@ public function writeContent() * @param \PhpOffice\Common\XMLWriter $objWriter * @param \PhpOffice\PhpPresentation\Shape\Media $shape */ - public function writeShapeMedia(XMLWriter $objWriter, Media $shape) + public function writeShapeMedia(XMLWriter $objWriter, Media $shape): void { // draw:frame $objWriter->startElement('draw:frame'); @@ -373,7 +372,7 @@ public function writeShapeMedia(XMLWriter $objWriter, Media $shape) * @param AbstractDrawingAdapter $shape * @throws \Exception */ - public function writeShapeDrawing(XMLWriter $objWriter, ShapeDrawing\AbstractDrawingAdapter $shape) + public function writeShapeDrawing(XMLWriter $objWriter, ShapeDrawing\AbstractDrawingAdapter $shape): void { // draw:frame $objWriter->startElement('draw:frame'); @@ -417,11 +416,11 @@ public function writeShapeDrawing(XMLWriter $objWriter, ShapeDrawing\AbstractDra /** * Write text * - * @param \PhpOffice\Common\XMLWriter $objWriter - * @param \PhpOffice\PhpPresentation\Shape\RichText $shape + * @param XMLWriter $objWriter + * @param RichText $shape * @throws \Exception */ - public function writeShapeTxt(XMLWriter $objWriter, RichText $shape) + public function writeShapeTxt(XMLWriter $objWriter, RichText $shape): void { // draw:frame $objWriter->startElement('draw:frame'); @@ -463,7 +462,7 @@ public function writeShapeTxt(XMLWriter $objWriter, RichText $shape) $richtextId = 0; foreach ($richtexts as $richtext) { ++$richtextId; - if ($richtext instanceof TextElement || $richtext instanceof Run) { + if ($richtext instanceof TextElement) { // text:span $objWriter->startElement('text:span'); if ($richtext instanceof Run) { @@ -491,8 +490,8 @@ public function writeShapeTxt(XMLWriter $objWriter, RichText $shape) } $objWriter->endElement(); //=============================================== - // Bullet list - //=============================================== + // Bullet list + //=============================================== } elseif ($paragraph->getBulletStyle()->getBulletType() == 'bullet') { $bCstShpHasBullet = true; // Open the bullet list @@ -527,7 +526,7 @@ public function writeShapeTxt(XMLWriter $objWriter, RichText $shape) $richtextId = 0; foreach ($richtexts as $richtext) { ++$richtextId; - if ($richtext instanceof TextElement || $richtext instanceof Run) { + if ($richtext instanceof TextElement) { // text:span $objWriter->startElement('text:span'); if ($richtext instanceof Run) { @@ -579,7 +578,7 @@ public function writeShapeTxt(XMLWriter $objWriter, RichText $shape) * @param XMLWriter $objWriter * @param Comment $oShape */ - public function writeShapeComment(XMLWriter $objWriter, Comment $oShape) + public function writeShapeComment(XMLWriter $objWriter, Comment $oShape): void { /** * Note : This element is not valid in the Schema 1.2 @@ -603,7 +602,7 @@ public function writeShapeComment(XMLWriter $objWriter, Comment $oShape) * @param XMLWriter $objWriter * @param Line $shape */ - public function writeShapeLine(XMLWriter $objWriter, Line $shape) + public function writeShapeLine(XMLWriter $objWriter, Line $shape): void { // draw:line $objWriter->startElement('draw:line'); @@ -625,7 +624,7 @@ public function writeShapeLine(XMLWriter $objWriter, Line $shape) * @param Table $shape * @throws \Exception */ - public function writeShapeTable(XMLWriter $objWriter, Table $shape) + public function writeShapeTable(XMLWriter $objWriter, Table $shape): void { // draw:frame $objWriter->startElement('draw:frame'); @@ -722,7 +721,7 @@ public function writeShapeTable(XMLWriter $objWriter, Table $shape) * @param Chart $shape * @throws \Exception */ - public function writeShapeChart(XMLWriter $objWriter, Chart $shape) + public function writeShapeChart(XMLWriter $objWriter, Chart $shape): void { $arrayChart = $this->getArrayChart(); $arrayChart[$this->shapeId] = $shape; @@ -755,7 +754,7 @@ public function writeShapeChart(XMLWriter $objWriter, Chart $shape) * @param Group $group * @throws \Exception */ - public function writeShapeGroup(XMLWriter $objWriter, Group $group) + public function writeShapeGroup(XMLWriter $objWriter, Group $group): void { // draw:g $objWriter->startElement('draw:g'); @@ -790,7 +789,7 @@ public function writeShapeGroup(XMLWriter $objWriter, Group $group) * @param XMLWriter $objWriter * @param Group $group */ - public function writeGroupStyle(XMLWriter $objWriter, Group $group) + public function writeGroupStyle(XMLWriter $objWriter, Group $group): void { $shapes = $group->getShapeCollection(); foreach ($shapes as $shape) { @@ -816,10 +815,10 @@ public function writeGroupStyle(XMLWriter $objWriter, Group $group) /** * Write the default style information for a RichText shape * - * @param \PhpOffice\Common\XMLWriter $objWriter - * @param \PhpOffice\PhpPresentation\Shape\RichText $shape + * @param XMLWriter $objWriter + * @param RichText $shape */ - public function writeTxtStyle(XMLWriter $objWriter, RichText $shape) + public function writeTxtStyle(XMLWriter $objWriter, RichText $shape): void { // style:style $objWriter->startElement('style:style'); @@ -927,10 +926,10 @@ public function writeTxtStyle(XMLWriter $objWriter, RichText $shape) /** * Write the default style information for an AbstractDrawingAdapter * - * @param \PhpOffice\Common\XMLWriter $objWriter + * @param XMLWriter $objWriter * @param AbstractDrawingAdapter $shape */ - public function writeDrawingStyle(XMLWriter $objWriter, AbstractDrawingAdapter $shape) + public function writeDrawingStyle(XMLWriter $objWriter, AbstractDrawingAdapter $shape): void { // style:style $objWriter->startElement('style:style'); @@ -955,7 +954,7 @@ public function writeDrawingStyle(XMLWriter $objWriter, AbstractDrawingAdapter $ * @param XMLWriter $objWriter * @param Line $shape */ - public function writeLineStyle(XMLWriter $objWriter, Line $shape) + public function writeLineStyle(XMLWriter $objWriter, Line $shape): void { // style:style $objWriter->startElement('style:style'); @@ -990,7 +989,7 @@ public function writeLineStyle(XMLWriter $objWriter, Line $shape) * @param XMLWriter $objWriter * @param Table $shape */ - public function writeTableStyle(XMLWriter $objWriter, Table $shape) + public function writeTableStyle(XMLWriter $objWriter, Table $shape): void { foreach ($shape->getRows() as $keyRow => $shapeRow) { // style:style @@ -1103,10 +1102,10 @@ public function writeTableStyle(XMLWriter $objWriter, Table $shape) /** * Write the slide note * @param XMLWriter $objWriter - * @param \PhpOffice\PhpPresentation\Slide\Note $note + * @param Note $note * @throws \Exception */ - public function writeSlideNote(XMLWriter $objWriter, Note $note) + public function writeSlideNote(XMLWriter $objWriter, Note $note): void { $shapesNote = $note->getShapeCollection(); if (count($shapesNote) > 0) { @@ -1131,7 +1130,7 @@ public function writeSlideNote(XMLWriter $objWriter, Note $note) * @param Slide $slide * @param int $incPage */ - public function writeStyleSlide(XMLWriter $objWriter, Slide $slide, $incPage) + public function writeStyleSlide(XMLWriter $objWriter, Slide $slide, int $incPage): void { // style:style $objWriter->startElement('style:style'); @@ -1324,11 +1323,11 @@ public function writeStyleSlide(XMLWriter $objWriter, Slide $slide, $incPage) /** * @param XMLWriter $objWriter - * @param Fill $oFill + * @param Fill|null $oFill */ - protected function writeStylePartFill(XMLWriter $objWriter, $oFill) + protected function writeStylePartFill(XMLWriter $objWriter, ?Fill $oFill): void { - if (!($oFill instanceof Fill)) { + if (!$oFill) { return; } switch ($oFill->getFillType()) { @@ -1343,13 +1342,12 @@ protected function writeStylePartFill(XMLWriter $objWriter, $oFill) } } - /** * @param XMLWriter $objWriter * @param Shadow $oShadow * @todo Improve for supporting any direction (https://sinepost.wordpress.com/2012/02/16/theyve-got-atan-you-want-atan2/) */ - protected function writeStylePartShadow(XMLWriter $objWriter, Shadow $oShadow) + protected function writeStylePartShadow(XMLWriter $objWriter, Shadow $oShadow): void { if (!$oShadow->isVisible()) { return; diff --git a/src/PhpPresentation/Writer/ODPresentation/MetaInfManifest.php b/src/PhpPresentation/Writer/ODPresentation/MetaInfManifest.php index 9a263db663..f2481c395c 100644 --- a/src/PhpPresentation/Writer/ODPresentation/MetaInfManifest.php +++ b/src/PhpPresentation/Writer/ODPresentation/MetaInfManifest.php @@ -6,7 +6,6 @@ use PhpOffice\Common\XMLWriter; use PhpOffice\PhpPresentation\Shape\Drawing as ShapeDrawing; use PhpOffice\PhpPresentation\Slide\Background\Image; -use PhpOffice\PhpPresentation\Writer\ODPresentation; class MetaInfManifest extends AbstractDecoratorWriter { @@ -82,7 +81,7 @@ public function render() $objWriter->startElement('manifest:file-entry'); $objWriter->writeAttribute('manifest:media-type', $mimeType); - $objWriter->writeAttribute('manifest:full-path', 'Pictures/' . str_replace(' ', '_', $oBkgImage->getIndexedFilename($numSlide))); + $objWriter->writeAttribute('manifest:full-path', 'Pictures/' . str_replace(' ', '_', $oBkgImage->getIndexedFilename((string) $numSlide))); $objWriter->endElement(); } } diff --git a/src/PhpPresentation/Writer/ODPresentation/ObjectsChart.php b/src/PhpPresentation/Writer/ODPresentation/ObjectsChart.php index 2b827ba211..908f30aa27 100644 --- a/src/PhpPresentation/Writer/ODPresentation/ObjectsChart.php +++ b/src/PhpPresentation/Writer/ODPresentation/ObjectsChart.php @@ -51,7 +51,7 @@ class ObjectsChart extends AbstractDecoratorWriter * @return ZipInterface * @throws \Exception */ - public function render() + public function render(): ZipInterface { foreach ($this->getArrayChart() as $keyChart => $shapeChart) { $content = $this->writeContentPart($shapeChart); @@ -69,7 +69,7 @@ public function render() * @return string * @throws \Exception */ - protected function writeContentPart(Chart $chart) + protected function writeContentPart(Chart $chart): string { $this->xmlContent = new XMLWriter(XMLWriter::STORAGE_MEMORY); @@ -197,7 +197,7 @@ protected function writeContentPart(Chart $chart) * @param Chart $chart * @throws \Exception */ - private function writeAxis(Chart $chart) + private function writeAxis(Chart $chart): void { $chartType = $chart->getPlotArea()->getType(); @@ -239,9 +239,9 @@ private function writeAxis(Chart $chart) } } - protected function writeGridline($oGridlines, $styleName, $chartClass) + protected function writeGridline(?Chart\Gridlines $oGridlines, string $styleName, string $chartClass): void { - if (!($oGridlines instanceof Chart\Gridlines)) { + if (!$oGridlines) { return ; } @@ -256,7 +256,7 @@ protected function writeGridline($oGridlines, $styleName, $chartClass) * @throws \Exception * @todo Set function in \PhpPresentation\Shape\Chart\Axis for defining width and color of the axis */ - protected function writeAxisStyle(Chart $chart) + protected function writeAxisStyle(Chart $chart): void { $chartType = $chart->getPlotArea()->getType(); @@ -348,12 +348,12 @@ protected function writeAxisStyle(Chart $chart) } /** - * @param Chart\Gridlines $oGridlines + * @param Chart\Gridlines|null $oGridlines * @param string $styleName */ - protected function writeGridlineStyle($oGridlines, $styleName) + protected function writeGridlineStyle(?Chart\Gridlines $oGridlines, string $styleName): void { - if (!($oGridlines instanceof Chart\Gridlines)) { + if (!$oGridlines) { return; } // style:style @@ -372,7 +372,7 @@ protected function writeGridlineStyle($oGridlines, $styleName) /** * @param Chart $chart */ - private function writeChartStyle(Chart $chart) + private function writeChartStyle(Chart $chart): void { // style:style $this->xmlContent->startElement('style:style'); @@ -388,7 +388,7 @@ private function writeChartStyle(Chart $chart) $this->xmlContent->endElement(); } - private function writeFloor() + private function writeFloor(): void { // chart:floor $this->xmlContent->startElement('chart:floor'); @@ -397,7 +397,7 @@ private function writeFloor() $this->xmlContent->endElement(); } - private function writeFloorStyle() + private function writeFloorStyle(): void { // style:style $this->xmlContent->startElement('style:style'); @@ -419,7 +419,7 @@ private function writeFloorStyle() /** * @param Chart $chart */ - private function writeLegend(Chart $chart) + private function writeLegend(Chart $chart): void { // chart:legend $this->xmlContent->startElement('chart:legend'); @@ -453,7 +453,7 @@ private function writeLegend(Chart $chart) /** * @param Chart $chart */ - private function writeLegendStyle(Chart $chart) + private function writeLegendStyle(Chart $chart): void { // style:style $this->xmlContent->startElement('style:style'); @@ -480,7 +480,7 @@ private function writeLegendStyle(Chart $chart) * @param Chart $chart * @throws \Exception */ - private function writePlotArea(Chart $chart) + private function writePlotArea(Chart $chart): void { $chartType = $chart->getPlotArea()->getType(); @@ -537,7 +537,7 @@ private function writePlotArea(Chart $chart) * @throws \Exception * @link : http://books.evc-cit.info/odbook/ch08.html#chart-plot-area-section */ - private function writePlotAreaStyle(Chart $chart) + private function writePlotAreaStyle(Chart $chart): void { $chartType = $chart->getPlotArea()->getType(); @@ -591,7 +591,7 @@ private function writePlotAreaStyle(Chart $chart) * @param Chart\Series $series * @throws \Exception */ - private function writeSeries(Chart $chart, Chart\Series $series) + private function writeSeries(Chart $chart, Chart\Series $series): void { $chartType = $chart->getPlotArea()->getType(); @@ -665,7 +665,7 @@ private function writeSeries(Chart $chart, Chart\Series $series) * @param Chart\Series $series * @throws \Exception */ - private function writeSeriesStyle(Chart $chart, Chart\Series $series) + private function writeSeriesStyle(Chart $chart, Chart\Series $series): void { $chartType = $chart->getPlotArea()->getType(); @@ -799,7 +799,7 @@ private function writeSeriesStyle(Chart $chart, Chart\Series $series) /** */ - private function writeTable() + private function writeTable(): void { // table:table $this->xmlContent->startElement('table:table'); @@ -897,7 +897,7 @@ private function writeTable() /** * @param Title $oTitle */ - private function writeTitle(Title $oTitle) + private function writeTitle(Title $oTitle): void { if (!$oTitle->isVisible()) { return; @@ -918,7 +918,7 @@ private function writeTitle(Title $oTitle) /** * @param Title $oTitle */ - private function writeTitleStyle(Title $oTitle) + private function writeTitleStyle(Title $oTitle): void { if (!$oTitle->isVisible()) { return; @@ -939,7 +939,7 @@ private function writeTitleStyle(Title $oTitle) $this->xmlContent->endElement(); } - private function writeWall() + private function writeWall(): void { // chart:wall $this->xmlContent->startElement('chart:wall'); @@ -951,7 +951,7 @@ private function writeWall() * @param Chart $chart * @throws \Exception */ - private function writeWallStyle(Chart $chart) + private function writeWallStyle(Chart $chart): void { $chartType = $chart->getPlotArea()->getType(); diff --git a/src/PhpPresentation/Writer/ODPresentation/Pictures.php b/src/PhpPresentation/Writer/ODPresentation/Pictures.php index baf6f9f406..4e42e327a5 100644 --- a/src/PhpPresentation/Writer/ODPresentation/Pictures.php +++ b/src/PhpPresentation/Writer/ODPresentation/Pictures.php @@ -29,7 +29,7 @@ public function render() // Add background image slide $oBkgImage = $oSlide->getBackground(); if ($oBkgImage instanceof Image) { - $this->getZip()->addFromString('Pictures/'.$oBkgImage->getIndexedFilename($keySlide), file_get_contents($oBkgImage->getPath())); + $this->getZip()->addFromString('Pictures/'.$oBkgImage->getIndexedFilename((string) $keySlide), file_get_contents($oBkgImage->getPath())); } } diff --git a/src/PhpPresentation/Writer/ODPresentation/Styles.php b/src/PhpPresentation/Writer/ODPresentation/Styles.php index 3c7fd72fc2..6c52aeac68 100644 --- a/src/PhpPresentation/Writer/ODPresentation/Styles.php +++ b/src/PhpPresentation/Writer/ODPresentation/Styles.php @@ -2,6 +2,7 @@ namespace PhpOffice\PhpPresentation\Writer\ODPresentation; +use PhpOffice\Common\Adapter\Zip\ZipInterface; use PhpOffice\Common\Drawing as CommonDrawing; use PhpOffice\Common\Text; use PhpOffice\Common\XMLWriter; @@ -17,21 +18,21 @@ class Styles extends AbstractDecoratorWriter /** * Stores font styles draw:gradient nodes * - * @var array + * @var array */ protected $arrayGradient = array(); /** * Stores font styles draw:stroke-dash nodes * - * @var array + * @var array */ protected $arrayStrokeDash = array(); /** - * @return \PhpOffice\Common\Adapter\Zip\ZipInterface + * @return ZipInterface * @throws \Exception */ - public function render() + public function render(): ZipInterface { $this->getZip()->addFromString('styles.xml', $this->writePart()); return $this->getZip(); @@ -40,10 +41,10 @@ public function render() /** * Write Meta file to XML format * - * @return string XML Output + * @return string XML Output * @throws \Exception */ - protected function writePart() + protected function writePart(): string { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); @@ -168,7 +169,7 @@ protected function writePart() * @param XMLWriter $objWriter * @param RichText $shape */ - protected function writeRichTextStyle(XMLWriter $objWriter, RichText $shape) + protected function writeRichTextStyle(XMLWriter $objWriter, RichText $shape): void { $oFill = $shape->getFill(); if ($oFill->getFillType() == Fill::FILL_GRADIENT_LINEAR || $oFill->getFillType() == Fill::FILL_GRADIENT_PATH) { @@ -256,7 +257,7 @@ protected function writeRichTextStyle(XMLWriter $objWriter, RichText $shape) * @param XMLWriter $objWriter * @param Table $shape */ - protected function writeTableStyle(XMLWriter $objWriter, Table $shape) + protected function writeTableStyle(XMLWriter $objWriter, Table $shape): void { foreach ($shape->getRows() as $row) { foreach ($row->getCells() as $cell) { @@ -275,7 +276,7 @@ protected function writeTableStyle(XMLWriter $objWriter, Table $shape) * @param XMLWriter $objWriter * @param Group $group */ - protected function writeGroupStyle(XMLWriter $objWriter, Group $group) + protected function writeGroupStyle(XMLWriter $objWriter, Group $group): void { $shapes = $group->getShapeCollection(); foreach ($shapes as $shape) { @@ -292,7 +293,7 @@ protected function writeGroupStyle(XMLWriter $objWriter, Group $group) * @param XMLWriter $objWriter * @param Fill $oFill */ - protected function writeGradientFill(XMLWriter $objWriter, Fill $oFill) + protected function writeGradientFill(XMLWriter $objWriter, Fill $oFill): void { $objWriter->startElement('draw:gradient'); $objWriter->writeAttribute('draw:name', 'gradient_'.$oFill->getHashCode()); @@ -312,13 +313,13 @@ protected function writeGradientFill(XMLWriter $objWriter, Fill $oFill) * Write the background image style * @param XMLWriter $objWriter * @param Image $oBkgImage - * @param $numSlide + * @param int $numSlide */ - protected function writeBackgroundStyle(XMLWriter $objWriter, Image $oBkgImage, $numSlide) + protected function writeBackgroundStyle(XMLWriter $objWriter, Image $oBkgImage, int $numSlide): void { $objWriter->startElement('draw:fill-image'); - $objWriter->writeAttribute('draw:name', 'background_'.$numSlide); - $objWriter->writeAttribute('xlink:href', 'Pictures/'.str_replace(' ', '_', $oBkgImage->getIndexedFilename($numSlide))); + $objWriter->writeAttribute('draw:name', 'background_'. (string) $numSlide); + $objWriter->writeAttribute('xlink:href', 'Pictures/' .str_replace(' ', '_', $oBkgImage->getIndexedFilename((string) $numSlide))); $objWriter->writeAttribute('xlink:type', 'simple'); $objWriter->writeAttribute('xlink:show', 'embed'); $objWriter->writeAttribute('xlink:actuate', 'onLoad'); diff --git a/src/PhpPresentation/Writer/PowerPoint2007.php b/src/PhpPresentation/Writer/PowerPoint2007.php index 87e5b1bc8d..97dbfd250c 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007.php +++ b/src/PhpPresentation/Writer/PowerPoint2007.php @@ -76,10 +76,10 @@ public function __construct(PhpPresentation $pPhpPresentation = null) /** * Save PhpPresentation to file * - * @param string $pFilename + * @param string $pFilename * @throws \Exception */ - public function save($pFilename) + public function save(string $pFilename): void { if (empty($pFilename)) { throw new \Exception("Filename is empty"); @@ -155,8 +155,8 @@ public function hasDiskCaching() /** * Set use disk caching where possible? * - * @param boolean $pValue - * @param string $pDirectory Disk caching directory + * @param boolean $pValue + * @param string $pDirectory Disk caching directory * @throws \Exception * @return \PhpOffice\PhpPresentation\Writer\PowerPoint2007 */ diff --git a/src/PhpPresentation/Writer/PowerPoint2007/AbstractDecoratorWriter.php b/src/PhpPresentation/Writer/PowerPoint2007/AbstractDecoratorWriter.php index c8d0b7a6d9..f72a0251b1 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/AbstractDecoratorWriter.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/AbstractDecoratorWriter.php @@ -14,25 +14,22 @@ abstract class AbstractDecoratorWriter extends \PhpOffice\PhpPresentation\Writer /** * Write relationship * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param int $pId Relationship ID. rId will be prepended! - * @param string $pType Relationship type - * @param string $pTarget Relationship target - * @param string $pTargetMode Relationship target mode + * @param XMLWriter $objWriter XML Writer + * @param int $pId Relationship ID. rId will be prepended! + * @param string $pType Relationship type + * @param string $pTarget Relationship target + * @param string $pTargetMode Relationship target mode * @throws \Exception */ - protected function writeRelationship(XMLWriter $objWriter, $pId = 1, $pType = '', $pTarget = '', $pTargetMode = '') + protected function writeRelationship(XMLWriter $objWriter, int $pId = 1, string $pType = '', string $pTarget = '', string $pTargetMode = ''): void { if ($pType == '' || $pTarget == '') { throw new \Exception("Invalid parameters passed."); } - if (strpos($pId, 'rId') === false) { - $pId = 'rId' . $pId; - } // Write relationship $objWriter->startElement('Relationship'); - $objWriter->writeAttribute('Id', $pId); + $objWriter->writeAttribute('Id', 'rId' . (string) $pId); $objWriter->writeAttribute('Type', $pType); $objWriter->writeAttribute('Target', $pTarget); @@ -46,12 +43,12 @@ protected function writeRelationship(XMLWriter $objWriter, $pId = 1, $pType = '' /** * Write Border * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Style\Border $pBorder Border - * @param string $pElementName Element name + * @param XMLWriter $objWriter XML Writer + * @param Border $pBorder Border + * @param string $pElementName Element name * @throws \Exception */ - protected function writeBorder(XMLWriter $objWriter, $pBorder, $pElementName = 'L') + protected function writeBorder(XMLWriter $objWriter, Border $pBorder, string $pElementName = 'L'): void { if (!($pBorder instanceof Border)) { return; @@ -118,7 +115,7 @@ protected function writeBorder(XMLWriter $objWriter, $pBorder, $pElementName = ' * @param Color $color * @param int|null $alpha */ - protected function writeColor(XMLWriter $objWriter, Color $color, $alpha = null) + protected function writeColor(XMLWriter $objWriter, Color $color, ?int $alpha = null): void { if (is_null($alpha)) { $alpha = $color->getAlpha(); @@ -139,13 +136,13 @@ protected function writeColor(XMLWriter $objWriter, Color $color, $alpha = null) /** * Write Fill * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Style\Fill $pFill Fill style + * @param XMLWriter $objWriter XML Writer + * @param Fill|null $pFill Fill style * @throws \Exception */ - protected function writeFill(XMLWriter $objWriter, $pFill) + protected function writeFill(XMLWriter $objWriter, ?Fill $pFill): void { - if (! $pFill instanceof Fill) { + if (!$pFill) { return; } @@ -174,11 +171,11 @@ protected function writeFill(XMLWriter $objWriter, $pFill) /** * Write Solid Fill * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Style\Fill $pFill Fill style + * @param XMLWriter $objWriter XML Writer + * @param Fill $pFill Fill style * @throws \Exception */ - protected function writeSolidFill(XMLWriter $objWriter, Fill $pFill) + protected function writeSolidFill(XMLWriter $objWriter, Fill $pFill): void { // a:gradFill $objWriter->startElement('a:solidFill'); @@ -189,11 +186,11 @@ protected function writeSolidFill(XMLWriter $objWriter, Fill $pFill) /** * Write Gradient Fill * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Style\Fill $pFill Fill style + * @param XMLWriter $objWriter XML Writer + * @param Fill $pFill Fill style * @throws \Exception */ - protected function writeGradientFill(XMLWriter $objWriter, Fill $pFill) + protected function writeGradientFill(XMLWriter $objWriter, Fill $pFill): void { // a:gradFill $objWriter->startElement('a:gradFill'); @@ -226,11 +223,11 @@ protected function writeGradientFill(XMLWriter $objWriter, Fill $pFill) /** * Write Pattern Fill * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Style\Fill $pFill Fill style + * @param XMLWriter $objWriter XML Writer + * @param Fill $pFill Fill style * @throws \Exception */ - protected function writePatternFill(XMLWriter $objWriter, Fill $pFill) + protected function writePatternFill(XMLWriter $objWriter, Fill $pFill): void { // a:pattFill $objWriter->startElement('a:pattFill'); @@ -255,12 +252,12 @@ protected function writePatternFill(XMLWriter $objWriter, Fill $pFill) /** * Write Outline * @param XMLWriter $objWriter - * @param Outline $oOutline + * @param Outline|null $oOutline * @throws \Exception */ - protected function writeOutline(XMLWriter $objWriter, $oOutline) + protected function writeOutline(XMLWriter $objWriter, ?Outline $oOutline): void { - if (!$oOutline instanceof Outline) { + if (!$oOutline) { return; } // Width : pts @@ -284,16 +281,18 @@ protected function writeOutline(XMLWriter $objWriter, $oOutline) /** * Determine absolute zip path * - * @param string $path + * @param string $path * @return string */ - protected function absoluteZipPath($path) + protected function absoluteZipPath(string $path): string { - $path = str_replace(array( + $path = str_replace(array( '/', '\\' ), DIRECTORY_SEPARATOR, $path); - $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); + $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), function (string $var) { + return (bool) strlen($var); + }); $absolutes = array(); foreach ($parts as $part) { if ('.' == $part) { diff --git a/src/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php b/src/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php index 035bdca5d8..182f1a8b0b 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/AbstractSlide.php @@ -17,9 +17,11 @@ namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007; +use ArrayObject; use PhpOffice\Common\Drawing as CommonDrawing; use PhpOffice\Common\Text; use PhpOffice\Common\XMLWriter; +use PhpOffice\PhpPresentation\AbstractShape; use PhpOffice\PhpPresentation\Shape\AbstractGraphic; use PhpOffice\PhpPresentation\Shape\Chart as ShapeChart; use PhpOffice\PhpPresentation\Shape\Comment; @@ -31,6 +33,7 @@ use PhpOffice\PhpPresentation\Shape\Placeholder; use PhpOffice\PhpPresentation\Shape\RichText; use PhpOffice\PhpPresentation\Shape\RichText\BreakElement; +use PhpOffice\PhpPresentation\Shape\RichText\Paragraph; use PhpOffice\PhpPresentation\Shape\RichText\Run; use PhpOffice\PhpPresentation\Shape\RichText\TextElement; use PhpOffice\PhpPresentation\Shape\Table as ShapeTable; @@ -47,12 +50,12 @@ abstract class AbstractSlide extends AbstractDecoratorWriter { /** * @param AbstractSlideAlias $pSlideMaster - * @param $objWriter - * @param $relId + * @param XMLWriter $objWriter + * @param int $relId * @return mixed * @throws \Exception */ - protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, $objWriter, $relId) + protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, XMLWriter $objWriter, int $relId) { if ($pSlideMaster->getShapeCollection()->count() > 0) { // Loop trough images and write relationships @@ -116,11 +119,11 @@ protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, $objW /** * @param XMLWriter $objWriter - * @param \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] $shapes + * @param array|ArrayObject $shapes * @param int $shapeId * @throws \Exception */ - protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), &$shapeId = 0) + protected function writeShapeCollection(XMLWriter $objWriter, $shapes = [], &$shapeId = 0): void { if (count($shapes) == 0) { return; @@ -143,7 +146,10 @@ protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), $this->writeShapeGroup($objWriter, $shape, $shapeId); } elseif ($shape instanceof Comment) { } else { - throw new \Exception("Unknown Shape type: {get_class($shape)}"); + throw new \Exception(sprintf( + "Unknown Shape type: %s", + get_class($shape) + )); } } } @@ -151,12 +157,12 @@ protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), /** * Write txt * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\RichText $shape - * @param int $shapeId + * @param XMLWriter $objWriter XML Writer + * @param \PhpOffice\PhpPresentation\Shape\RichText $shape + * @param int $shapeId * @throws \Exception */ - protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId) + protected function writeShapeText(XMLWriter $objWriter, RichText $shape, int $shapeId): void { // p:sp $objWriter->startElement('p:sp'); @@ -303,12 +309,12 @@ protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeI /** * Write table * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Table $shape - * @param int $shapeId + * @param XMLWriter $objWriter XML Writer + * @param \PhpOffice\PhpPresentation\Shape\Table $shape + * @param int $shapeId * @throws \Exception */ - protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $shapeId) + protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, int $shapeId): void { // p:graphicFrame $objWriter->startElement('p:graphicFrame'); @@ -503,12 +509,12 @@ protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $sha /** * Write paragraphs * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] $paragraphs - * @param bool $bIsPlaceholder + * @param XMLWriter $objWriter XML Writer + * @param array $paragraphs + * @param bool $bIsPlaceholder * @throws \Exception */ - protected function writeParagraphs(XMLWriter $objWriter, $paragraphs, $bIsPlaceholder = false) + protected function writeParagraphs(XMLWriter $objWriter, array $paragraphs, bool $bIsPlaceholder = false): void { // Loop trough paragraphs foreach ($paragraphs as $paragraph) { @@ -623,12 +629,12 @@ protected function writeParagraphs(XMLWriter $objWriter, $paragraphs, $bIsPlaceh /** * Write Line Shape * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer + * @param XMLWriter $objWriter XML Writer * @param \PhpOffice\PhpPresentation\Shape\Line $shape - * @param int $shapeId + * @param int $shapeId * @throws \Exception */ - protected function writeShapeLine(XMLWriter $objWriter, Line $shape, $shapeId) + protected function writeShapeLine(XMLWriter $objWriter, Line $shape, int $shapeId): void { // p:sp $objWriter->startElement('p:cxnSp'); @@ -720,7 +726,7 @@ protected function writeShapeLine(XMLWriter $objWriter, Line $shape, $shapeId) * @param XMLWriter $objWriter * @param Shadow $oShadow */ - protected function writeShadow(XMLWriter $objWriter, $oShadow) + protected function writeShadow(XMLWriter $objWriter, Shadow $oShadow): void { if (!($oShadow instanceof Shadow)) { return; @@ -751,11 +757,11 @@ protected function writeShadow(XMLWriter $objWriter, $oShadow) /** * Write hyperlink * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\AbstractShape|\PhpOffice\PhpPresentation\Shape\RichText\TextElement $shape + * @param XMLWriter $objWriter XML Writer + * @param AbstractShape|TextElement $shape * @throws \Exception */ - protected function writeHyperlink(XMLWriter $objWriter, $shape) + protected function writeHyperlink(XMLWriter $objWriter, $shape): void { if (!$shape->hasHyperlink()) { return; @@ -774,9 +780,9 @@ protected function writeHyperlink(XMLWriter $objWriter, $shape) * Write Note Slide * @param Note $pNote * @throws \Exception - * @return string + * @return string */ - protected function writeNote(Note $pNote) + protected function writeNote(Note $pNote): string { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); @@ -1060,11 +1066,11 @@ protected function writeNote(Note $pNote) /** * Write chart * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart $shape - * @param int $shapeId + * @param XMLWriter $objWriter XML Writer + * @param ShapeChart $shape + * @param int $shapeId */ - protected function writeShapeChart(XMLWriter $objWriter, ShapeChart $shape, $shapeId) + protected function writeShapeChart(XMLWriter $objWriter, ShapeChart $shape, int $shapeId): void { // p:graphicFrame $objWriter->startElement('p:graphicFrame'); @@ -1120,12 +1126,12 @@ protected function writeShapeChart(XMLWriter $objWriter, ShapeChart $shape, $sha /** * Write pic * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\AbstractGraphic $shape - * @param int $shapeId + * @param XMLWriter $objWriter XML Writer + * @param AbstractGraphic $shape + * @param int $shapeId * @throws \Exception */ - protected function writeShapePic(XMLWriter $objWriter, AbstractGraphic $shape, $shapeId) + protected function writeShapePic(XMLWriter $objWriter, AbstractGraphic $shape, int $shapeId): void { // p:pic $objWriter->startElement('p:pic'); @@ -1222,12 +1228,12 @@ protected function writeShapePic(XMLWriter $objWriter, AbstractGraphic $shape, $ /** * Write group * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer + * @param XMLWriter $objWriter XML Writer * @param \PhpOffice\PhpPresentation\Shape\Group $group - * @param int $shapeId + * @param int $shapeId * @throws \Exception */ - protected function writeShapeGroup(XMLWriter $objWriter, Group $group, &$shapeId) + protected function writeShapeGroup(XMLWriter $objWriter, Group $group, int &$shapeId): void { // p:grpSp $objWriter->startElement('p:grpSp'); @@ -1277,10 +1283,10 @@ protected function writeShapeGroup(XMLWriter $objWriter, Group $group, &$shapeId } /** - * @param \PhpOffice\PhpPresentation\Slide\AbstractSlide $pSlide - * @param $objWriter + * @param AbstractSlideAlias $pSlide + * @param XMLWriter $objWriter */ - protected function writeSlideBackground(AbstractSlideAlias $pSlide, XMLWriter $objWriter) + protected function writeSlideBackground(AbstractSlideAlias $pSlide, XMLWriter $objWriter): void { if (!($pSlide->getBackground() instanceof Slide\AbstractBackground)) { return; @@ -1350,11 +1356,11 @@ protected function writeSlideBackground(AbstractSlideAlias $pSlide, XMLWriter $o * Write Transition Slide * @link http://officeopenxml.com/prSlide-transitions.php * @param XMLWriter $objWriter - * @param Slide\Transition $transition + * @param Slide\Transition|null $transition */ - protected function writeSlideTransition(XMLWriter $objWriter, $transition) + protected function writeSlideTransition(XMLWriter $objWriter, ?Slide\Transition $transition): void { - if (!$transition instanceof Slide\Transition) { + if (!$transition) { return; } $objWriter->startElement('p:transition'); @@ -1593,13 +1599,13 @@ protected function writeSlideTransition(XMLWriter $objWriter, $transition) $objWriter->endElement(); } - private function getGUID() + private function getGUID(): string { if (function_exists('com_create_guid')) { return com_create_guid(); } else { - mt_srand((float)microtime() * 10000);//optional for php 4.2.0 and up. - $charid = strtoupper(md5(uniqid(rand(), true))); + mt_srand(intval(microtime(true) * 10000)); + $charid = strtoupper(md5(uniqid((string) rand(), true))); $hyphen = chr(45);// "-" $uuid = chr(123)// "{" . substr($charid, 0, 8) . $hyphen diff --git a/src/PhpPresentation/Writer/PowerPoint2007/ContentTypes.php b/src/PhpPresentation/Writer/PowerPoint2007/ContentTypes.php index 34ca83ec80..acb0cc07c4 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/ContentTypes.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/ContentTypes.php @@ -20,6 +20,7 @@ use PhpOffice\PhpPresentation\Shape\Chart as ShapeChart; use PhpOffice\PhpPresentation\Shape\Comment; use PhpOffice\PhpPresentation\Shape\Drawing as ShapeDrawing; +use PhpOffice\PhpPresentation\Shape\Drawing\AbstractDrawingAdapter; use PhpOffice\Common\XMLWriter; use PhpOffice\PhpPresentation\Writer\PowerPoint2007; @@ -67,7 +68,7 @@ public function render() $sldLayoutNr = 0; $sldLayoutId = time() + 689016272; // requires minimum value of 2 147 483 648 foreach ($this->oPresentation->getAllMasterSlides() as $idx => $oSlideMaster) { - $oSlideMaster->setRelsIndex($idx + 1); + $oSlideMaster->setRelsIndex((string) ($idx + 1)); $this->writeOverrideContentType($objWriter, '/ppt/slideMasters/slideMaster' . $oSlideMaster->getRelsIndex() . '.xml', 'application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml'); $this->writeOverrideContentType($objWriter, '/ppt/theme/theme' . $oSlideMaster->getRelsIndex() . '.xml', 'application/vnd.openxmlformats-officedocument.theme+xml'); foreach ($oSlideMaster->getAllSlideLayouts() as $oSlideLayout) { @@ -121,7 +122,7 @@ public function render() if ($shapeIndex instanceof ShapeChart) { // Chart content type $this->writeOverrideContentType($objWriter, '/ppt/charts/chart' . $shapeIndex->getImageIndex() . '.xml', 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'); - } else { + } elseif ($shapeIndex instanceof AbstractDrawingAdapter) { $extension = strtolower($shapeIndex->getExtension()); $mimeType = $shapeIndex->getMimeType(); @@ -143,12 +144,12 @@ public function render() /** * Write Default content type * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param string $pPartname Part name - * @param string $pContentType Content type + * @param XMLWriter $objWriter XML Writer + * @param string $pPartname Part name + * @param string $pContentType Content type * @throws \Exception */ - private function writeDefaultContentType(XMLWriter $objWriter, $pPartname = '', $pContentType = '') + private function writeDefaultContentType(XMLWriter $objWriter, string $pPartname = '', string $pContentType = ''): void { if ($pPartname == '' || $pContentType == '') { throw new \Exception("Invalid parameters passed."); @@ -163,12 +164,12 @@ private function writeDefaultContentType(XMLWriter $objWriter, $pPartname = '', /** * Write Override content type * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param string $pPartname Part name - * @param string $pContentType Content type + * @param XMLWriter $objWriter XML Writer + * @param string $pPartname Part name + * @param string $pContentType Content type * @throws \Exception */ - private function writeOverrideContentType(XMLWriter $objWriter, $pPartname = '', $pContentType = '') + private function writeOverrideContentType(XMLWriter $objWriter, string $pPartname = '', string $pContentType = ''): void { if ($pPartname == '' || $pContentType == '') { throw new \Exception("Invalid parameters passed."); diff --git a/src/PhpPresentation/Writer/PowerPoint2007/DocPropsApp.php b/src/PhpPresentation/Writer/PowerPoint2007/DocPropsApp.php index 5bb8714ec3..773f96a302 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/DocPropsApp.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/DocPropsApp.php @@ -27,7 +27,7 @@ public function render() $objWriter->writeElement('Application', 'Microsoft Office PowerPoint'); // Slides - $objWriter->writeElement('Slides', $this->getPresentation()->getSlideCount()); + $objWriter->writeElement('Slides', (string) $this->getPresentation()->getSlideCount()); // ScaleCrop $objWriter->writeElement('ScaleCrop', 'false'); diff --git a/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/AbstractLayoutPack.php b/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/AbstractLayoutPack.php index 8401aa44ca..83848fce2e 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/AbstractLayoutPack.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/AbstractLayoutPack.php @@ -30,7 +30,7 @@ abstract class AbstractLayoutPack * - masterid * - body * - * @var array + * @var array */ protected $masterSlides = array(); @@ -45,7 +45,7 @@ abstract class AbstractLayoutPack * - target (full path in OpenXML package) * - contents (body) * - * @var array + * @var array> */ protected $masterSlideRels = array(); @@ -56,7 +56,7 @@ abstract class AbstractLayoutPack * - masterid * - body * - * @var array + * @var array */ protected $themes = array(); @@ -71,7 +71,7 @@ abstract class AbstractLayoutPack * - target (full path in OpenXML package) * - contents (body) * - * @var array + * @var array> */ protected $themeRelations = array(); @@ -84,7 +84,7 @@ abstract class AbstractLayoutPack * - name (string) * - body (string) * - * @var array + * @var array */ protected $layouts = array(); @@ -99,16 +99,16 @@ abstract class AbstractLayoutPack * - target (full path in OpenXML package) * - contents (body) * - * @var array + * @var array> */ protected $layoutRelations = array(); /** * Get master slides * - * @return array + * @return array */ - public function getMasterSlides() + public function getMasterSlides(): array { return $this->masterSlides; } @@ -116,9 +116,9 @@ public function getMasterSlides() /** * Get master slide relations * - * @return array + * @return array> */ - public function getMasterSlideRelations() + public function getMasterSlideRelations(): array { return $this->masterSlideRels; } @@ -126,9 +126,9 @@ public function getMasterSlideRelations() /** * Get themes * - * @return array + * @return array */ - public function getThemes() + public function getThemes(): array { return $this->themes; } @@ -136,9 +136,9 @@ public function getThemes() /** * Get theme relations * - * @return array + * @return array> */ - public function getThemeRelations() + public function getThemeRelations(): array { return $this->themeRelations; } @@ -146,7 +146,7 @@ public function getThemeRelations() /** * Get array of slide layouts * - * @return array + * @return array */ public function getLayouts() { @@ -156,9 +156,9 @@ public function getLayouts() /** * Get array of slide layout relations * - * @return array + * @return array> */ - public function getLayoutRelations() + public function getLayoutRelations(): array { return $this->layoutRelations; } @@ -173,10 +173,10 @@ public function getLayoutRelations() * * @param string $name * @param int $masterId - * @return array + * @return array{'id': int, 'masterid': int, 'name': string, 'body': string} * @throws \Exception */ - public function findLayout($name = '', $masterId = 1) + public function findLayout(string $name = '', int $masterId = 1): array { foreach ($this->layouts as $layout) { if ($layout['name'] == $name && $layout['masterid'] == $masterId) { @@ -194,7 +194,7 @@ public function findLayout($name = '', $masterId = 1) * @return int * @throws \Exception */ - public function findLayoutId($name = '') + public function findLayoutId(string $name = ''): int { foreach ($this->layouts as $layoutId => $layout) { if ($layout['name'] == $name) { @@ -209,10 +209,10 @@ public function findLayoutId($name = '') * Find specific slide layout name. * * @param int $idLayout - * @return int + * @return string * @throws \Exception */ - public function findLayoutName($idLayout = null) + public function findLayoutName(int $idLayout): string { foreach ($this->layouts as $layoutId => $layout) { if ($layoutId == $idLayout) { diff --git a/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/PackDefault.php b/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/PackDefault.php index 0df0c01ce5..06310180bd 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/PackDefault.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/PackDefault.php @@ -836,6 +836,7 @@ public function __construct() // Layouts - Layout::TITLE_SLIDE $this->layouts[1] = array( + 'id' => 1, 'masterid' => 1, 'name' => Layout::TITLE_SLIDE, 'body' => ' @@ -1076,6 +1077,7 @@ public function __construct() // Layouts - Layout::TITLE_AND_CONTENT $this->layouts[2] = array( + 'id' => 2, 'masterid' => 1, 'name' => Layout::TITLE_AND_CONTENT, 'body' => ' @@ -1244,6 +1246,7 @@ public function __construct() // Layouts - Layout::SECTION_HEADER $this->layouts[3] = array( + 'id' => 3, 'masterid' => 1, 'name' => Layout::SECTION_HEADER, 'body' => ' @@ -1488,6 +1491,7 @@ public function __construct() // Layouts - Layout::TWO_CONTENT $this->layouts[4] = array( + 'id' => 4, 'masterid' => 1, 'name' => Layout::TWO_CONTENT, 'body' => ' @@ -1774,6 +1778,7 @@ public function __construct() // Layouts - Layout::COMPARISON $this->layouts[5] = array( + 'id' => 5, 'masterid' => 1, 'name' => Layout::COMPARISON, 'body' => ' @@ -2194,6 +2199,7 @@ public function __construct() // Layouts - Layout::TITLE_ONLY $this->layouts[6] = array( + 'id' => 6, 'masterid' => 1, 'name' => Layout::TITLE_ONLY, 'body' => ' @@ -2310,6 +2316,7 @@ public function __construct() // Layouts - Layout::BLANK $this->layouts[7] = array( + 'id' => 7, 'masterid' => 1, 'name' => Layout::BLANK, 'body' => ' @@ -2403,6 +2410,7 @@ public function __construct() // Layouts - Layout::CONTENT_WITH_CAPTION $this->layouts[8] = array( + 'id' => 8, 'masterid' => 1, 'name' => Layout::CONTENT_WITH_CAPTION, 'body' => ' @@ -2678,6 +2686,7 @@ public function __construct() // Layouts - Layout::PICTURE_WITH_CAPTION $this->layouts[9] = array( + 'id' => 9, 'masterid' => 1, 'name' => Layout::PICTURE_WITH_CAPTION, 'body' => ' @@ -2929,6 +2938,7 @@ public function __construct() // Layouts - Layout::TITLE_AND_VERTICAL_TEXT $this->layouts[10] = array( + 'id' => 10, 'masterid' => 1, 'name' => Layout::TITLE_AND_VERTICAL_TEXT, 'body' => ' @@ -3097,6 +3107,7 @@ public function __construct() // Layouts - Layout::VERTICAL_TITLE_AND_TEXT $this->layouts[11] = array( + 'id' => 11, 'masterid' => 1, 'name' => Layout::VERTICAL_TITLE_AND_TEXT, 'body' => ' diff --git a/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/TemplateBased.php b/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/TemplateBased.php index 8112a80f36..052a8ad996 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/TemplateBased.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/LayoutPack/TemplateBased.php @@ -58,9 +58,9 @@ public function __construct($fileName = '') foreach ($presentationRels->Relationship as $presRel) { if ($presRel["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster") { // Found slide master! - $slideMasterId = str_replace('slideMaster', '', basename($presRel["Target"], '.xml')); + $slideMasterId = str_replace('slideMaster', '', basename($presRel["Target"], '.xml')); $this->masterSlides[] = array( - 'masterid' => $slideMasterId, + 'masterid' => (int) $slideMasterId, 'body' => $package->getFromName($this->absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($presRel["Target"]) . "/" . basename($presRel["Target"]))) ); @@ -69,9 +69,9 @@ public function __construct($fileName = '') foreach ($masterRelations->Relationship as $masterRel) { if ($masterRel["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme") { // Found theme! - $themeId = str_replace('theme', '', basename($masterRel["Target"], '.xml')); + $themeId = (int) str_replace('theme', '', basename($masterRel["Target"], '.xml')); $this->themes[$themeId - 1] = array( - 'masterid' => $slideMasterId, + 'masterid' => (int) $slideMasterId, 'body' => $package->getFromName($this->absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($presRel["Target"]) . "/" . dirname($masterRel["Target"]) . "/" . basename($masterRel["Target"]))) ); @@ -96,8 +96,8 @@ public function __construct($fileName = '') // Found slide layout! $layoutId = str_replace('slideLayout', '', basename($masterRel["Target"], '.xml')); $layout = array( - 'id' => $layoutId, - 'masterid' => $slideMasterId, + 'id' => (int) $layoutId, + 'masterid' => (int) $slideMasterId, 'name' => '-unknown-', 'body' => $package->getFromName($this->absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($presRel["Target"]) . "/" . dirname($masterRel["Target"]) . "/" . basename($masterRel["Target"]))) ); @@ -109,7 +109,7 @@ public function __construct($fileName = '') $layoutXml->registerXPathNamespace("p", "http://schemas.openxmlformats.org/presentationml/2006/main"); $slide = $layoutXml->xpath('/p:sldLayout/p:cSld'); $layout['name'] = (string) $slide[0]['name']; - $this->layouts[$layoutId] = $layout; + $this->layouts[(int) $layoutId] = $layout; // Search for slide layout relations $layoutRelations = @simplexml_load_string($package->getFromName($this->absoluteZipPath(dirname($rel["Target"]) . "/" . dirname($presRel["Target"]) . "/" . dirname($masterRel["Target"]) . "/_rels/" . basename($masterRel["Target"]) . ".rels"))); @@ -160,11 +160,11 @@ public function __construct($fileName = '') /** * Compare master slides * - * @param array $firstSlide - * @param array $secondSlide + * @param array $firstSlide + * @param array $secondSlide * @return int */ - public static function cmpMaster($firstSlide, $secondSlide) + public static function cmpMaster(array $firstSlide, array $secondSlide): int { if ($firstSlide['masterid'] == $secondSlide['masterid']) { return 0; @@ -176,16 +176,18 @@ public static function cmpMaster($firstSlide, $secondSlide) /** * Determine absolute zip path * - * @param string $path + * @param string $path * @return string */ - protected function absoluteZipPath($path) + protected function absoluteZipPath(string $path): string { - $path = str_replace(array( + $path = str_replace(array( '/', '\\' ), DIRECTORY_SEPARATOR, $path); - $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); + $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), function (string $var) { + return (bool) strlen($var); + }); $absolutes = array(); foreach ($parts as $part) { if ('.' == $part) { diff --git a/src/PhpPresentation/Writer/PowerPoint2007/PptCharts.php b/src/PhpPresentation/Writer/PowerPoint2007/PptCharts.php index da96dd6e24..6629c2cbdd 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/PptCharts.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/PptCharts.php @@ -2,6 +2,7 @@ namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007; +use PhpOffice\Common\Adapter\Zip\ZipInterface; use PhpOffice\Common\Drawing as CommonDrawing; use PhpOffice\Common\XMLWriter; use PhpOffice\PhpPresentation\PhpPresentation; @@ -24,10 +25,10 @@ class PptCharts extends AbstractDecoratorWriter { /** - * @return \PhpOffice\Common\Adapter\Zip\ZipInterface + * @return ZipInterface * @throws \Exception */ - public function render() + public function render(): ZipInterface { for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) { $shape = $this->getDrawingHashTable()->getByIndex($i); @@ -53,11 +54,11 @@ public function render() /** * Write chart to XML format * - * @param \PhpOffice\PhpPresentation\Shape\Chart $chart - * @return string XML Output + * @param Chart $chart + * @return string XML Output * @throws \Exception */ - public function writeChart(Chart $chart) + public function writeChart(Chart $chart): string { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); @@ -201,13 +202,13 @@ public function writeChart(Chart $chart) /** * Write chart to XML format * - * @param PhpPresentation $presentation - * @param \PhpOffice\PhpPresentation\Shape\Chart $chart - * @param string $tempName - * @return string String output + * @param PhpPresentation $presentation + * @param Chart $chart + * @param string $tempName + * @return string String output * @throws \Exception */ - public function writeSpreadsheet(PhpPresentation $presentation, $chart, $tempName) + public function writeSpreadsheet(PhpPresentation $presentation, Chart $chart, string $tempName): string { // Need output? if (!$chart->hasIncludedSpreadsheet()) { @@ -272,11 +273,11 @@ public function writeSpreadsheet(PhpPresentation $presentation, $chart, $tempNam /** * Write element with value attribute * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer + * @param XMLWriter $objWriter XML Writer * @param string $elementName * @param string $value */ - protected function writeElementWithValAttribute($objWriter, $elementName, $value) + protected function writeElementWithValAttribute(XMLWriter $objWriter, string $elementName, string $value): void { $objWriter->startElement($elementName); $objWriter->writeAttribute('val', $value); @@ -286,12 +287,12 @@ protected function writeElementWithValAttribute($objWriter, $elementName, $value /** * Write single value or reference * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer + * @param XMLWriter $objWriter XML Writer * @param boolean $isReference - * @param mixed $value + * @param string $value * @param string $reference */ - protected function writeSingleValueOrReference($objWriter, $isReference, $value, $reference) + protected function writeSingleValueOrReference(XMLWriter $objWriter, bool $isReference, string $value, string $reference): void { if (!$isReference) { // Value @@ -318,20 +319,17 @@ protected function writeSingleValueOrReference($objWriter, $isReference, $value, /** * Write series value or reference * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer + * @param XMLWriter $objWriter XML Writer * @param boolean $isReference - * @param mixed $values + * @param array $values * @param string $reference */ - protected function writeMultipleValuesOrReference($objWriter, $isReference, $values, $reference) + protected function writeMultipleValuesOrReference(XMLWriter $objWriter, bool $isReference, array $values, string $reference): void { // c:strLit / c:numLit // c:strRef / c:numRef $referenceType = ($isReference ? 'Ref' : 'Lit'); - $dataType = 'str'; - if (is_int($values[0]) || is_float($values[0])) { - $dataType = 'num'; - } + $dataType = is_numeric($values[0]) ? 'num' : 'str'; $objWriter->startElement('c:' . $dataType . $referenceType); $numValues = count($values); @@ -379,11 +377,11 @@ protected function writeMultipleValuesOrReference($objWriter, $isReference, $val /** * Write Title * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Title $subject + * @param XMLWriter $objWriter XML Writer + * @param Title $subject * @throws \Exception */ - protected function writeTitle(XMLWriter $objWriter, Title $subject) + protected function writeTitle(XMLWriter $objWriter, Title $subject): void { // c:title $objWriter->startElement('c:title'); @@ -477,12 +475,12 @@ protected function writeTitle(XMLWriter $objWriter, Title $subject) /** * Write Plot Area * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\PlotArea $subject - * @param \PhpOffice\PhpPresentation\Shape\Chart $chart + * @param XMLWriter $objWriter XML Writer + * @param PlotArea $subject + * @param Chart $chart * @throws \Exception */ - protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, Chart $chart) + protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, Chart $chart): void { // c:plotArea $objWriter->startElement('c:plotArea'); @@ -528,11 +526,11 @@ protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, Chart /** * Write Legend * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Legend $subject + * @param XMLWriter $objWriter XML Writer + * @param Chart\Legend $subject * @throws \Exception */ - protected function writeLegend(XMLWriter $objWriter, Legend $subject) + protected function writeLegend(XMLWriter $objWriter, Legend $subject): void { // c:legend $objWriter->startElement('c:legend'); @@ -627,11 +625,11 @@ protected function writeLegend(XMLWriter $objWriter, Legend $subject) /** * Write Layout * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param mixed $subject + * @param XMLWriter $objWriter XML Writer + * @param Legend|PlotArea|Title $subject * @throws \Exception */ - protected function writeLayout(XMLWriter $objWriter, $subject) + protected function writeLayout(XMLWriter $objWriter, $subject): void { // c:layout $objWriter->startElement('c:layout'); @@ -683,12 +681,12 @@ protected function writeLayout(XMLWriter $objWriter, $subject) /** * Write Type Area * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\Area $subject - * @param boolean $includeSheet + * @param XMLWriter $objWriter XML Writer + * @param Chart\Type\Area $subject + * @param boolean $includeSheet * @throws \Exception */ - protected function writeTypeArea(XMLWriter $objWriter, Area $subject, $includeSheet = false) + protected function writeTypeArea(XMLWriter $objWriter, Area $subject, bool $includeSheet = false): void { // c:lineChart $objWriter->startElement('c:areaChart'); @@ -786,12 +784,12 @@ protected function writeTypeArea(XMLWriter $objWriter, Area $subject, $includeSh /** * Write Type Bar * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar $subject - * @param boolean $includeSheet + * @param XMLWriter $objWriter XML Writer + * @param Chart\Type\Bar $subject + * @param boolean $includeSheet * @throws \Exception */ - protected function writeTypeBar(XMLWriter $objWriter, Bar $subject, $includeSheet = false) + protected function writeTypeBar(XMLWriter $objWriter, Bar $subject, bool $includeSheet = false): void { // c:barChart $objWriter->startElement('c:barChart'); @@ -1004,12 +1002,12 @@ protected function writeTypeBar(XMLWriter $objWriter, Bar $subject, $includeShee /** * Write Type Bar3D * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D $subject - * @param boolean $includeSheet + * @param XMLWriter $objWriter XML Writer + * @param Chart\Type\Bar3D $subject + * @param boolean $includeSheet * @throws \Exception */ - protected function writeTypeBar3D(XMLWriter $objWriter, Bar3D $subject, $includeSheet = false) + protected function writeTypeBar3D(XMLWriter $objWriter, Bar3D $subject, bool $includeSheet = false): void { // c:bar3DChart $objWriter->startElement('c:bar3DChart'); @@ -1198,12 +1196,12 @@ protected function writeTypeBar3D(XMLWriter $objWriter, Bar3D $subject, $include /** * Write Type Pie * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\Doughnut $subject - * @param boolean $includeSheet + * @param XMLWriter $objWriter XML Writer + * @param Doughnut $subject + * @param boolean $includeSheet * @throws \Exception */ - protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, $includeSheet = false) + protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, bool $includeSheet = false): void { // c:pieChart $objWriter->startElement('c:doughnutChart'); @@ -1272,83 +1270,85 @@ protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, $i ++$seriesIndex; } - // c:dLbls - $objWriter->startElement('c:dLbls'); + if (isset($series) && is_object($series) && $series instanceof Chart\Series) { + // c:dLbls + $objWriter->startElement('c:dLbls'); - $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0'); - $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); - $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); - $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); - $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); - $this->writeElementWithValAttribute($objWriter, 'c:showBubbleSize', '0'); - $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); + $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0'); + $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0'); + $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0'); + $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0'); + $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0'); + $this->writeElementWithValAttribute($objWriter, 'c:showBubbleSize', '0'); + $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0'); - if ($series->hasDlblNumFormat()) { - //c:numFmt - $objWriter->startElement('c:numFmt'); - $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat()); - $objWriter->writeAttribute('sourceLinked', '0'); - $objWriter->endElement(); - } + if ($series->hasDlblNumFormat()) { + //c:numFmt + $objWriter->startElement('c:numFmt'); + $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat()); + $objWriter->writeAttribute('sourceLinked', '0'); + $objWriter->endElement(); + } - // c:dLbls\c:txPr - $objWriter->startElement('c:txPr'); - $objWriter->writeElement('a:bodyPr', null); - $objWriter->writeElement('a:lstStyle', null); + // c:dLbls\c:txPr + $objWriter->startElement('c:txPr'); + $objWriter->writeElement('a:bodyPr', null); + $objWriter->writeElement('a:lstStyle', null); - // c:dLbls\c:txPr\a:p - $objWriter->startElement('a:p'); + // c:dLbls\c:txPr\a:p + $objWriter->startElement('a:p'); - // c:dLbls\c:txPr\a:p\a:pPr - $objWriter->startElement('a:pPr'); + // c:dLbls\c:txPr\a:p\a:pPr + $objWriter->startElement('a:pPr'); - // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr - $objWriter->startElement('a:defRPr'); - $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); - $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); - $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); - $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); - $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); - $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); - $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); - - // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:solidFill - $objWriter->startElement('a:solidFill'); - $this->writeColor($objWriter, $series->getFont()->getColor()); - $objWriter->endElement(); + // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr + $objWriter->startElement('a:defRPr'); + $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false')); + $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false')); + $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike')); + $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100)); + $objWriter->writeAttribute('u', $series->getFont()->getUnderline()); + $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000'); + $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000'); - // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:latin - $objWriter->startElement('a:latin'); - $objWriter->writeAttribute('typeface', $series->getFont()->getName()); - $objWriter->endElement(); + // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:solidFill + $objWriter->startElement('a:solidFill'); + $this->writeColor($objWriter, $series->getFont()->getColor()); + $objWriter->endElement(); - // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\ - $objWriter->endElement(); - // c:dLbls\c:txPr\a:p\a:pPr\ - $objWriter->endElement(); + // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:latin + $objWriter->startElement('a:latin'); + $objWriter->writeAttribute('typeface', $series->getFont()->getName()); + $objWriter->endElement(); - // c:dLbls\c:txPr\a:p\a:endParaRPr - $objWriter->startElement('a:endParaRPr'); - $objWriter->writeAttribute('lang', 'en-US'); - $objWriter->writeAttribute('dirty', '0'); - $objWriter->endElement(); + // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\ + $objWriter->endElement(); + // c:dLbls\c:txPr\a:p\a:pPr\ + $objWriter->endElement(); - // c:dLbls\c:txPr\a:p\ - $objWriter->endElement(); - // c:dLbls\c:txPr\ - $objWriter->endElement(); + // c:dLbls\c:txPr\a:p\a:endParaRPr + $objWriter->startElement('a:endParaRPr'); + $objWriter->writeAttribute('lang', 'en-US'); + $objWriter->writeAttribute('dirty', '0'); + $objWriter->endElement(); - $separator = $series->getSeparator(); - if (!empty($separator) && $separator != PHP_EOL) { - // c:dLbls\c:separator - $objWriter->writeElement('c:separator', $separator); - } + // c:dLbls\c:txPr\a:p\ + $objWriter->endElement(); + // c:dLbls\c:txPr\ + $objWriter->endElement(); - // c:dLbls\ - $objWriter->endElement(); + $separator = $series->getSeparator(); + if (!empty($separator) && $separator != PHP_EOL) { + // c:dLbls\c:separator + $objWriter->writeElement('c:separator', $separator); + } + + // c:dLbls\ + $objWriter->endElement(); + } $this->writeElementWithValAttribute($objWriter, 'c:firstSliceAng', '0'); - $this->writeElementWithValAttribute($objWriter, 'c:holeSize', $subject->getHoleSize()); + $this->writeElementWithValAttribute($objWriter, 'c:holeSize', (string) $subject->getHoleSize()); $objWriter->endElement(); } @@ -1356,12 +1356,12 @@ protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, $i /** * Write Type Pie * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie $subject - * @param boolean $includeSheet + * @param XMLWriter $objWriter XML Writer + * @param Pie $subject + * @param boolean $includeSheet * @throws \Exception */ - protected function writeTypePie(XMLWriter $objWriter, Pie $subject, $includeSheet = false) + protected function writeTypePie(XMLWriter $objWriter, Pie $subject, bool $includeSheet = false): void { // c:pieChart $objWriter->startElement('c:pieChart'); @@ -1522,12 +1522,12 @@ protected function writeTypePie(XMLWriter $objWriter, Pie $subject, $includeShee /** * Write Type Pie3D * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D $subject - * @param boolean $includeSheet + * @param XMLWriter $objWriter XML Writer + * @param Pie3D $subject + * @param boolean $includeSheet * @throws \Exception */ - protected function writeTypePie3D(XMLWriter $objWriter, Pie3D $subject, $includeSheet = false) + protected function writeTypePie3D(XMLWriter $objWriter, Pie3D $subject, bool $includeSheet = false): void { // c:pie3DChart $objWriter->startElement('c:pie3DChart'); @@ -1682,12 +1682,12 @@ protected function writeTypePie3D(XMLWriter $objWriter, Pie3D $subject, $include /** * Write Type Line * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\Line $subject - * @param boolean $includeSheet + * @param XMLWriter $objWriter XML Writer + * @param Line $subject + * @param boolean $includeSheet * @throws \Exception */ - protected function writeTypeLine(XMLWriter $objWriter, Line $subject, $includeSheet = false) + protected function writeTypeLine(XMLWriter $objWriter, Line $subject, bool $includeSheet = false): void { // c:lineChart $objWriter->startElement('c:lineChart'); @@ -1852,12 +1852,12 @@ protected function writeTypeLine(XMLWriter $objWriter, Line $subject, $includeSh /** * Write Type Scatter * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter $subject - * @param boolean $includeSheet + * @param XMLWriter $objWriter XML Writer + * @param Chart\Type\Scatter $subject + * @param boolean $includeSheet * @throws \Exception */ - protected function writeTypeScatter(XMLWriter $objWriter, Scatter $subject, $includeSheet = false) + protected function writeTypeScatter(XMLWriter $objWriter, Scatter $subject, bool $includeSheet = false): void { // c:scatterChart $objWriter->startElement('c:scatterChart'); @@ -2031,11 +2031,11 @@ protected function writeTypeScatter(XMLWriter $objWriter, Scatter $subject, $inc /** * Write chart relationships to XML format * - * @param \PhpOffice\PhpPresentation\Shape\Chart $pChart - * @return string XML Output + * @param Chart $pChart + * @return string XML Output * @throws \Exception */ - public function writeChartRelationships(Chart $pChart) + public function writeChartRelationships(Chart $pChart): string { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); @@ -2062,7 +2062,7 @@ public function writeChartRelationships(Chart $pChart) * @param XMLWriter $objWriter * @param Chart\Marker $oMarker */ - protected function writeSeriesMarker(XMLWriter $objWriter, Chart\Marker $oMarker) + protected function writeSeriesMarker(XMLWriter $objWriter, Chart\Marker $oMarker): void { // c:marker $objWriter->startElement('c:marker'); @@ -2096,11 +2096,11 @@ protected function writeSeriesMarker(XMLWriter $objWriter, Chart\Marker $oMarker /** * @param XMLWriter $objWriter * @param Chart\Axis $oAxis - * @param $typeAxis + * @param string $typeAxis * @param Chart\Type\AbstractType $typeChart * @throws \Exception */ - protected function writeAxis(XMLWriter $objWriter, Chart\Axis $oAxis, $typeAxis, Chart\Type\AbstractType $typeChart) + protected function writeAxis(XMLWriter $objWriter, Chart\Axis $oAxis, string $typeAxis, Chart\Type\AbstractType $typeChart): void { if ($typeAxis != Chart\Axis::AXIS_X && $typeAxis != Chart\Axis::AXIS_Y) { return; @@ -2344,7 +2344,7 @@ protected function writeAxis(XMLWriter $objWriter, Chart\Axis $oAxis, $typeAxis, * @param Gridlines $oGridlines * @throws \Exception */ - protected function writeAxisGridlines(XMLWriter $objWriter, Gridlines $oGridlines) + protected function writeAxisGridlines(XMLWriter $objWriter, Gridlines $oGridlines): void { // c:spPr $objWriter->startElement('c:spPr'); diff --git a/src/PhpPresentation/Writer/PowerPoint2007/PptSlideLayouts.php b/src/PhpPresentation/Writer/PowerPoint2007/PptSlideLayouts.php index fe7a694864..bf6284270d 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/PptSlideLayouts.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/PptSlideLayouts.php @@ -36,7 +36,7 @@ public function render() /** * Write slide layout relationships to XML format * - * @param \PhpOffice\PhpPresentation\Slide\SlideLayout $oSlideLayout + * @param \PhpOffice\PhpPresentation\Slide\SlideLayout $oSlideLayout * @return string XML Output * @throws \Exception */ @@ -78,7 +78,7 @@ public function writeSlideLayoutRelationships(SlideLayout $oSlideLayout) /** * Write slide to XML format * - * @param \PhpOffice\PhpPresentation\Slide\SlideLayout $pSlideLayout + * @param \PhpOffice\PhpPresentation\Slide\SlideLayout $pSlideLayout * @return string XML Output * @throws \Exception */ diff --git a/src/PhpPresentation/Writer/PowerPoint2007/PptSlideMasters.php b/src/PhpPresentation/Writer/PowerPoint2007/PptSlideMasters.php index 12a98e49d7..011c4f2306 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/PptSlideMasters.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/PptSlideMasters.php @@ -4,12 +4,7 @@ use PhpOffice\Common\Drawing as CommonDrawing; use PhpOffice\Common\XMLWriter; -use PhpOffice\PhpPresentation\Shape\AbstractDrawing; -use PhpOffice\PhpPresentation\Shape\Chart as ShapeChart; -use PhpOffice\PhpPresentation\Shape\Comment; use PhpOffice\PhpPresentation\Shape\RichText; -use PhpOffice\PhpPresentation\Shape\Table as ShapeTable; -use PhpOffice\PhpPresentation\Slide; use PhpOffice\PhpPresentation\Slide\SlideMaster; use PhpOffice\PhpPresentation\Style\SchemeColor; use PhpOffice\PhpPresentation\Slide\Background\Image; @@ -88,7 +83,7 @@ public function writeSlideMasterRelationships(SlideMaster $oMasterSlide) /** * Write slide to XML format * - * @param \PhpOffice\PhpPresentation\Slide\SlideMaster $pSlide + * @param \PhpOffice\PhpPresentation\Slide\SlideMaster $pSlide * @return string XML Output * @throws \Exception */ diff --git a/src/PhpPresentation/Writer/PowerPoint2007/PptSlides.php b/src/PhpPresentation/Writer/PowerPoint2007/PptSlides.php index 14e73d8f8c..4bc04413d7 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/PptSlides.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/PptSlides.php @@ -40,7 +40,7 @@ public function render() // Add background image slide $oBkgImage = $oSlide->getBackground(); if ($oBkgImage instanceof Image) { - $this->oZip->addFromString('ppt/media/'.$oBkgImage->getIndexedFilename($idx), file_get_contents($oBkgImage->getPath())); + $this->oZip->addFromString('ppt/media/'.$oBkgImage->getIndexedFilename((string) $idx), file_get_contents($oBkgImage->getPath())); } } @@ -50,8 +50,8 @@ public function render() /** * Write slide relationships to XML format * - * @param \PhpOffice\PhpPresentation\Slide $pSlide - * @return string XML Output + * @param Slide $pSlide + * @return string XML Output * @throws \Exception */ protected function writeSlideRelationships(Slide $pSlide) @@ -110,9 +110,9 @@ protected function writeSlideRelationships(Slide $pSlide) if ($iterator2->current() instanceof Media) { // Write relationship for image drawing $iterator2->current()->relationId = 'rId' . $relId; - $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/video', '../media/' . $iterator->current()->getIndexedFilename()); + $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/video', '../media/' . $iterator2->current()->getIndexedFilename()); ++$relId; - $this->writeRelationship($objWriter, $relId, 'http://schemas.microsoft.com/office/2007/relationships/media', '../media/' . $iterator->current()->getIndexedFilename()); + $this->writeRelationship($objWriter, $relId, 'http://schemas.microsoft.com/office/2007/relationships/media', '../media/' . $iterator2->current()->getIndexedFilename()); ++$relId; } elseif ($iterator2->current() instanceof ShapeDrawing\AbstractDrawingAdapter) { // Write relationship for image drawing @@ -138,7 +138,7 @@ protected function writeSlideRelationships(Slide $pSlide) // Write background relationships? $oBackground = $pSlide->getBackground(); if ($oBackground instanceof Image) { - $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', '../media/' . $oBackground->getIndexedFilename($idxSlide)); + $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', '../media/' . $oBackground->getIndexedFilename((string) $idxSlide)); $oBackground->relationId = 'rId' . $relId; ++$relId; } @@ -348,11 +348,11 @@ protected function writeSlideRelationships(Slide $pSlide) /** * Write slide to XML format * - * @param \PhpOffice\PhpPresentation\Slide $pSlide - * @return string XML Output + * @param Slide $pSlide + * @return string XML Output * @throws \Exception */ - public function writeSlide(Slide $pSlide) + public function writeSlide(Slide $pSlide): string { // Create XML writer $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); @@ -503,7 +503,7 @@ public function writeSlide(Slide $pSlide) * @param XMLWriter $objWriter * @param Slide $oSlide */ - protected function writeSlideAnimations(XMLWriter $objWriter, Slide $oSlide) + protected function writeSlideAnimations(XMLWriter $objWriter, Slide $oSlide): void { $arrayAnimations = $oSlide->getAnimations(); if (empty($arrayAnimations)) { @@ -750,12 +750,12 @@ protected function writeSlideAnimations(XMLWriter $objWriter, Slide $oSlide) /** * Write pic * - * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpPresentation\Shape\Drawing\AbstractDrawingAdapter $shape - * @param int $shapeId + * @param XMLWriter $objWriter XML Writer + * @param ShapeDrawing\AbstractDrawingAdapter $shape + * @param int $shapeId * @throws \Exception */ - protected function writeShapeDrawing(XMLWriter $objWriter, ShapeDrawing\AbstractDrawingAdapter $shape, $shapeId) + protected function writeShapeDrawing(XMLWriter $objWriter, ShapeDrawing\AbstractDrawingAdapter $shape, int $shapeId): void { // p:pic $objWriter->startElement('p:pic'); @@ -809,7 +809,7 @@ protected function writeShapeDrawing(XMLWriter $objWriter, ShapeDrawing\Abstract $objWriter->writeAttribute('uri', '{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}'); // p:nvPr > p:extLst > p:ext > p14:media $objWriter->startElement('p14:media'); - $objWriter->writeAttribute('r:embed', ($shape->relationId + 1)); + $objWriter->writeAttribute('r:embed', ((int) $shape->relationId + 1)); $objWriter->writeAttribute('xmlns:p14', 'http://schemas.microsoft.com/office/powerpoint/2010/main'); // p:nvPr > p:extLst > p:ext > ##p14:media $objWriter->endElement(); diff --git a/src/PhpPresentation/Writer/PowerPoint2007/PptTheme.php b/src/PhpPresentation/Writer/PowerPoint2007/PptTheme.php index d6e5ac1054..08de463817 100644 --- a/src/PhpPresentation/Writer/PowerPoint2007/PptTheme.php +++ b/src/PhpPresentation/Writer/PowerPoint2007/PptTheme.php @@ -24,7 +24,7 @@ public function render() /** * Write theme to XML format * - * @param Slide\SlideMaster $oMasterSlide + * @param Slide\SlideMaster $oMasterSlide * @return string XML Output */ protected function writeTheme(Slide\SlideMaster $oMasterSlide) diff --git a/src/PhpPresentation/Writer/Serialized.php b/src/PhpPresentation/Writer/Serialized.php index 6e4aba1bd7..be11ad0e83 100644 --- a/src/PhpPresentation/Writer/Serialized.php +++ b/src/PhpPresentation/Writer/Serialized.php @@ -21,6 +21,7 @@ use PhpOffice\Common\XMLWriter; use PhpOffice\PhpPresentation\PhpPresentation; use PhpOffice\PhpPresentation\Shape\Drawing\AbstractDrawingAdapter; +use PhpOffice\PhpPresentation\Shape\Drawing\File; /** * \PhpOffice\PhpPresentation\Writer\Serialized @@ -45,10 +46,10 @@ public function __construct(PhpPresentation $pPhpPresentation = null) /** * Save PhpPresentation to file * - * @param string $pFilename + * @param string $pFilename * @throws \Exception */ - public function save($pFilename) + public function save(string $pFilename): void { if (empty($pFilename)) { throw new \Exception("Filename is empty."); @@ -70,7 +71,10 @@ public function save($pFilename) for ($j = 0; $j < $oPresentation->getSlide($i)->getShapeCollection()->count(); ++$j) { if ($oPresentation->getSlide($i)->getShapeCollection()->offsetGet($j) instanceof AbstractDrawingAdapter) { $imgTemp = $oPresentation->getSlide($i)->getShapeCollection()->offsetGet($j); - $objZip->addFromString('media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME), file_get_contents($imgTemp->getPath())); + $objZip->addFromString( + 'media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME), + file_get_contents($imgTemp->getPath()) + ); } } } @@ -85,8 +89,8 @@ public function save($pFilename) /** * Serialize PhpPresentation object to XML * - * @param PhpPresentation $pPhpPresentation - * @param string $pFilename + * @param PhpPresentation $pPhpPresentation + * @param string $pFilename * @return string XML Output * @throws \Exception */ @@ -101,7 +105,12 @@ private function writeSerialized(PhpPresentation $pPhpPresentation = null, $pFil for ($j = 0; $j < $pPhpPresentation->getSlide($i)->getShapeCollection()->count(); ++$j) { if ($pPhpPresentation->getSlide($i)->getShapeCollection()->offsetGet($j) instanceof AbstractDrawingAdapter) { $imgTemp = $pPhpPresentation->getSlide($i)->getShapeCollection()->offsetGet($j); - $imgTemp->setPath('zip://' . $pFilename . '#media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME), false); + $imgPath = 'zip://' . $pFilename . '#media/' . $imgTemp->getImageIndex() . '/' . pathinfo($imgTemp->getPath(), PATHINFO_BASENAME); + if ($imgTemp instanceof File) { + $imgTemp->setPath($imgPath, false); + } else { + $imgTemp->setPath($imgPath); + } } } } diff --git a/src/PhpPresentation/Writer/WriterInterface.php b/src/PhpPresentation/Writer/WriterInterface.php index bf63a35cf6..ca04fe7477 100644 --- a/src/PhpPresentation/Writer/WriterInterface.php +++ b/src/PhpPresentation/Writer/WriterInterface.php @@ -25,8 +25,8 @@ interface WriterInterface /** * Save PhpPresentation to file * - * @param string $pFilename + * @param string $pFilename * @throws \Exception */ - public function save($pFilename); + public function save(string $pFilename): void; } diff --git a/tests/PhpPresentation/Tests/AbstractShapeTest.php b/tests/PhpPresentation/Tests/AbstractShapeTest.php index b201804bbd..0a2e44a9e9 100644 --- a/tests/PhpPresentation/Tests/AbstractShapeTest.php +++ b/tests/PhpPresentation/Tests/AbstractShapeTest.php @@ -34,7 +34,7 @@ class AbstractShapeTest extends TestCase /** * Register */ - public function testConstruct() + public function testConstruct(): void { $object = new RichText(); @@ -49,7 +49,7 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->getShadow()); } - public function testFill() + public function testFill(): void { $object = new RichText(); @@ -59,7 +59,7 @@ public function testFill() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getFill()); } - public function testHeight() + public function testHeight(): void { $object = new RichText(); @@ -70,7 +70,7 @@ public function testHeight() $this->assertEquals($value, $object->getHeight()); } - public function testHyperlink() + public function testHyperlink(): void { $object = new RichText(); @@ -84,7 +84,7 @@ public function testHyperlink() $this->assertTrue($object->hasHyperlink()); } - public function testOffsetX() + public function testOffsetX(): void { $object = new RichText(); @@ -95,7 +95,7 @@ public function testOffsetX() $this->assertEquals($value, $object->getOffsetX()); } - public function testOffsetY() + public function testOffsetY(): void { $object = new RichText(); @@ -106,7 +106,7 @@ public function testOffsetY() $this->assertEquals($value, $object->getOffsetY()); } - public function testRotation() + public function testRotation(): void { $object = new RichText(); @@ -117,7 +117,7 @@ public function testRotation() $this->assertEquals($value, $object->getRotation()); } - public function testShadow() + public function testShadow(): void { $object = new RichText(); @@ -127,7 +127,7 @@ public function testShadow() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->getShadow()); } - public function testWidth() + public function testWidth(): void { $object = new RichText(); @@ -138,7 +138,7 @@ public function testWidth() $this->assertEquals($value, $object->getWidth()); } - public function testWidthAndHeight() + public function testWidthAndHeight(): void { $object = new RichText(); @@ -154,7 +154,7 @@ public function testWidthAndHeight() $this->assertEquals($value, $object->getHeight()); } - public function testPlaceholder() + public function testPlaceholder(): void { $object = new RichText(); $this->assertFalse($object->isPlaceholder(), 'Standard Shape should not be a placeholder object'); @@ -177,7 +177,7 @@ public function testPlaceholder() $this->assertEquals('subTitle', $object->getPlaceholder()->getType()); } - public function testContainer() + public function testContainer(): void { $object = new RichText(); $object2 = new RichText(); @@ -201,7 +201,7 @@ public function testContainerException(): void $this->assertInstanceOf('PhpOffice\\PhpPresentation\\AbstractShape', $object->setContainer($oSlide)); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->getContainer()); $this->expectException(\Exception::class); - $this->expectExceptionMessage('A \PhpOffice\PhpPresentation\ShapeContainerInterface has already been assigned. Shapes can only exist on one \PhpOffice\PhpPresentation\ShapeContainerInterface.'); + $this->expectExceptionMessage('A PhpOffice\PhpPresentation\ShapeContainerInterface has already been assigned. Shapes can only exist on one PhpOffice\PhpPresentation\ShapeContainerInterface.'); $object->setContainer(null); } } diff --git a/tests/PhpPresentation/Tests/AutoloaderTest.php b/tests/PhpPresentation/Tests/AutoloaderTest.php index 9351f77e64..f74f5ebea0 100644 --- a/tests/PhpPresentation/Tests/AutoloaderTest.php +++ b/tests/PhpPresentation/Tests/AutoloaderTest.php @@ -28,7 +28,7 @@ class AutoloaderTest extends TestCase /** * Register */ - public function testRegister() + public function testRegister(): void { Autoloader::register(); $this->assertContains( @@ -40,7 +40,7 @@ public function testRegister() /** * Autoload */ - public function testAutoload() + public function testAutoload(): void { $declared = get_declared_classes(); $declaredCount = count($declared); diff --git a/tests/PhpPresentation/Tests/DocumentLayoutTest.php b/tests/PhpPresentation/Tests/DocumentLayoutTest.php index abe8f4f1f7..a354f192bf 100644 --- a/tests/PhpPresentation/Tests/DocumentLayoutTest.php +++ b/tests/PhpPresentation/Tests/DocumentLayoutTest.php @@ -30,7 +30,7 @@ class DocumentLayoutTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new DocumentLayout(); @@ -42,7 +42,7 @@ public function testConstruct() /** * Test set custom layout */ - public function testSetCustomLayout() + public function testSetCustomLayout(): void { $object = new DocumentLayout(); $object->setDocumentLayout(array('cx' => 6858000, 'cy' => 9144000), false); @@ -55,7 +55,7 @@ public function testSetCustomLayout() $this->assertEquals(9144000, $object->getCY()); } - public function testCX() + public function testCX(): void { $value = mt_rand(1, 100000); $object = new DocumentLayout(); @@ -75,7 +75,7 @@ public function testCX() $this->assertEquals($value, $object->getCX(DocumentLayout::UNIT_PIXEL)); } - public function testCY() + public function testCY(): void { $value = mt_rand(1, 100000); $object = new DocumentLayout(); diff --git a/tests/PhpPresentation/Tests/DocumentPropertiesTest.php b/tests/PhpPresentation/Tests/DocumentPropertiesTest.php index 9ad93aa142..7cb99f8890 100644 --- a/tests/PhpPresentation/Tests/DocumentPropertiesTest.php +++ b/tests/PhpPresentation/Tests/DocumentPropertiesTest.php @@ -30,7 +30,7 @@ class DocumentPropertiesTest extends TestCase /** * Test get set value */ - public function testGetSet() + public function testGetSet(): void { $object = new DocumentProperties(); $properties = array( @@ -57,7 +57,7 @@ public function testGetSet() /** * Test get set with null value */ - public function testGetSetNull() + public function testGetSetNull(): void { $object = new DocumentProperties(); $properties = array( diff --git a/tests/PhpPresentation/Tests/HashTableTest.php b/tests/PhpPresentation/Tests/HashTableTest.php index ea2f822055..6cce7f618b 100644 --- a/tests/PhpPresentation/Tests/HashTableTest.php +++ b/tests/PhpPresentation/Tests/HashTableTest.php @@ -30,7 +30,7 @@ class HashTableTest extends TestCase { /** */ - public function testConstructNull() + public function testConstructNull(): void { $object = new HashTable(); @@ -43,7 +43,7 @@ public function testConstructNull() /** */ - public function testConstructSource() + public function testConstructSource(): void { $object = new HashTable(array( new Slide(), @@ -57,44 +57,44 @@ public function testConstructSource() /** */ - public function testAdd() + public function testAdd(): void { $object = new HashTable(); $oSlide = new Slide(); // Add From Source : Null - $this->assertNull($object->addFromSource()); + $object->addFromSource(); // Add From Source : Array - $this->assertNull($object->addFromSource(array($oSlide))); + $object->addFromSource(array($oSlide)); $this->assertIsArray($object->toArray()); $this->assertCount(1, $object->toArray()); // Clear - $this->assertNull($object->clear()); + $object->clear(); $this->assertEmpty($object->toArray()); // Add Object - $this->assertNull($object->add($oSlide)); + $object->add($oSlide); $this->assertCount(1, $object->toArray()); - $this->assertNull($object->clear()); + $object->clear(); // Add Object w/Hash Index $oSlide->setHashIndex(rand(1, 100)); - $this->assertNull($object->add($oSlide)); + $object->add($oSlide); $this->assertCount(1, $object->toArray()); // Add Object w/the same Hash Index - $this->assertNull($object->add($oSlide)); + $object->add($oSlide); $this->assertCount(1, $object->toArray()); } /** */ - public function testIndex() + public function testIndex(): void { $object = new HashTable(); $oSlide1 = new Slide(); $oSlide2 = new Slide(); // Add Object - $this->assertNull($object->add($oSlide1)); - $this->assertNull($object->add($oSlide2)); + $object->add($oSlide1); + $object->add($oSlide2); // Index $this->assertEquals(0, $object->getIndexForHashCode($oSlide1->getHashCode())); $this->assertEquals(1, $object->getIndexForHashCode($oSlide2->getHashCode())); @@ -104,7 +104,7 @@ public function testIndex() /** */ - public function testRemove() + public function testRemove(): void { $object = new HashTable(); $oSlide1 = new Slide(); @@ -112,22 +112,13 @@ public function testRemove() $oSlide3 = new Slide(); // Add Object - $this->assertNull($object->add($oSlide1)); - $this->assertNull($object->add($oSlide2)); - $this->assertNull($object->add($oSlide3)); + $object->add($oSlide1); + $object->add($oSlide2); + $object->add($oSlide3); // Remove - $this->assertNull($object->remove($oSlide2)); + $object->remove($oSlide2); $this->assertCount(2, $object->toArray()); - $this->assertNull($object->remove($oSlide3)); + $object->remove($oSlide3); $this->assertCount(1, $object->toArray()); } - - public function testAddException(): void - { - $object = new HashTable(); - $oSlide = new Slide(); - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Invalid array parameter passed.'); - $object->addFromSource($oSlide); - } } diff --git a/tests/PhpPresentation/Tests/IOFactoryTest.php b/tests/PhpPresentation/Tests/IOFactoryTest.php index 5a666ea937..4e1c9bf3c6 100644 --- a/tests/PhpPresentation/Tests/IOFactoryTest.php +++ b/tests/PhpPresentation/Tests/IOFactoryTest.php @@ -31,7 +31,7 @@ class IOFactoryTest extends TestCase /** * Test create writer */ - public function testCreateWriter() + public function testCreateWriter(): void { $class = 'PhpOffice\\PhpPresentation\\Writer\\PowerPoint2007'; @@ -41,7 +41,7 @@ public function testCreateWriter() /** * Test create reader */ - public function testCreateReader() + public function testCreateReader(): void { $class = 'PhpOffice\\PhpPresentation\\Reader\\ReaderInterface'; @@ -51,14 +51,14 @@ public function testCreateReader() /** * Test load class exception */ - public function testLoadClassException() + public function testLoadClassException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('"" is not a valid reader'); IOFactory::createReader(); } - public function testLoad() + public function testLoad(): void { $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PhpPresentation', IOFactory::load(PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'serialized.phppt')); } @@ -66,7 +66,7 @@ public function testLoad() /** * Test load class exception */ - public function testLoadException() + public function testLoadException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not automatically determine \PhpOffice\PhpPresentation\Reader\ReaderInterface for file.'); diff --git a/tests/PhpPresentation/Tests/PhpPresentationTest.php b/tests/PhpPresentation/Tests/PhpPresentationTest.php index bd9c094a39..e388d03b52 100644 --- a/tests/PhpPresentation/Tests/PhpPresentationTest.php +++ b/tests/PhpPresentation/Tests/PhpPresentationTest.php @@ -33,7 +33,7 @@ class PhpPresentationTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new PhpPresentation(); $slide = $object->getSlide(); @@ -48,7 +48,7 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Iterator', $object->getSlideIterator()); } - public function testProperties() + public function testProperties(): void { $object = new PhpPresentation(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\DocumentProperties', $object->getProperties()); @@ -61,7 +61,7 @@ public function testProperties() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\DocumentProperties', $object->getDocumentProperties()); } - public function testPresentationProperties() + public function testPresentationProperties(): void { $object = new PhpPresentation(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->getPresentationProperties()); @@ -72,7 +72,7 @@ public function testPresentationProperties() /** * Test add external slide */ - public function testAddExternalSlide() + public function testAddExternalSlide(): void { $origin = new PhpPresentation(); $slide = $origin->getSlide(); @@ -85,7 +85,7 @@ public function testAddExternalSlide() /** * Test copy presentation */ - public function testCopy() + public function testCopy(): void { $object = new PhpPresentation(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PhpPresentation', $object->copy()); @@ -94,7 +94,7 @@ public function testCopy() /** * Test remove slide by index exception */ - public function testRemoveSlideByIndexException() + public function testRemoveSlideByIndexException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Slide index is out of bounds.'); @@ -106,7 +106,7 @@ public function testRemoveSlideByIndexException() /** * Test get slide exception */ - public function testGetSlideException() + public function testGetSlideException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Slide index is out of bounds.'); @@ -118,7 +118,7 @@ public function testGetSlideException() /** * Test set active slide index exception */ - public function testSetActiveSlideIndexException() + public function testSetActiveSlideIndexException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Active slide index is out of bounds.'); @@ -130,7 +130,7 @@ public function testSetActiveSlideIndexException() /** * @deprecated */ - public function testMarkAsFinal() + public function testMarkAsFinal(): void { $object = new PhpPresentation(); $this->assertFalse($object->isMarkedAsFinal()); @@ -145,7 +145,7 @@ public function testMarkAsFinal() /** * @deprecated */ - public function testZoom() + public function testZoom(): void { $object = new PhpPresentation(); $this->assertEquals(1, $object->getZoom()); diff --git a/tests/PhpPresentation/Tests/PresentationPropertiesTest.php b/tests/PhpPresentation/Tests/PresentationPropertiesTest.php index c3a05ef6af..f66064912f 100644 --- a/tests/PhpPresentation/Tests/PresentationPropertiesTest.php +++ b/tests/PhpPresentation/Tests/PresentationPropertiesTest.php @@ -27,12 +27,10 @@ */ class PresentationPropertiesTest extends TestCase { - public function testCommentVisible() + public function testCommentVisible(): void { $object = new PresentationProperties(); $this->assertFalse($object->isCommentVisible()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setCommentVisible('AAAA')); - $this->assertFalse($object->isCommentVisible()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setCommentVisible(true)); $this->assertTrue($object->isCommentVisible()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setCommentVisible(false)); @@ -41,12 +39,10 @@ public function testCommentVisible() $this->assertFalse($object->isCommentVisible()); } - public function testLoopUntilEsc() + public function testLoopUntilEsc(): void { $object = new PresentationProperties(); $this->assertFalse($object->isLoopContinuouslyUntilEsc()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setLoopContinuouslyUntilEsc('AAAA')); - $this->assertFalse($object->isLoopContinuouslyUntilEsc()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setLoopContinuouslyUntilEsc(true)); $this->assertTrue($object->isLoopContinuouslyUntilEsc()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setLoopContinuouslyUntilEsc(false)); @@ -55,7 +51,7 @@ public function testLoopUntilEsc() $this->assertFalse($object->isLoopContinuouslyUntilEsc()); } - public function testLastView() + public function testLastView(): void { $object = new PresentationProperties(); $this->assertEquals(PresentationProperties::VIEW_SLIDE, $object->getLastView()); @@ -67,12 +63,10 @@ public function testLastView() $this->assertEquals(PresentationProperties::VIEW_SLIDE, $object->getLastView()); } - public function testMarkAsFinal() + public function testMarkAsFinal(): void { $object = new PresentationProperties(); $this->assertFalse($object->isMarkedAsFinal()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->markAsFinal('AAAA')); - $this->assertFalse($object->isMarkedAsFinal()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->markAsFinal(true)); $this->assertTrue($object->isMarkedAsFinal()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->markAsFinal(false)); @@ -81,7 +75,7 @@ public function testMarkAsFinal() $this->assertTrue($object->isMarkedAsFinal()); } - public function testThumbnail() + public function testThumbnail(): void { $imagePath = PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.'PhpPresentationLogo.png'; @@ -97,12 +91,10 @@ public function testThumbnail() $this->assertEquals($imagePath, $object->getThumbnailPath()); } - public function testZoom() + public function testZoom(): void { $object = new PresentationProperties(); $this->assertEquals(1, $object->getZoom()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setZoom('AAAA')); - $this->assertEquals(1, $object->getZoom()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setZoom(2.3)); $this->assertEquals(2.3, $object->getZoom()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PresentationProperties', $object->setZoom()); diff --git a/tests/PhpPresentation/Tests/Reader/ODPresentationTest.php b/tests/PhpPresentation/Tests/Reader/ODPresentationTest.php index 11f73e8bc8..d6c81f1cce 100644 --- a/tests/PhpPresentation/Tests/Reader/ODPresentationTest.php +++ b/tests/PhpPresentation/Tests/Reader/ODPresentationTest.php @@ -18,6 +18,8 @@ namespace PhpOffice\PhpPresentation\Tests\Reader; use PhpOffice\PhpPresentation\Reader\ODPresentation; +use PhpOffice\PhpPresentation\Shape\Drawing\Gd; +use PhpOffice\PhpPresentation\Shape\RichText; use PhpOffice\PhpPresentation\Style\Alignment; use PhpOffice\PhpPresentation\Style\Bullet; use PHPUnit\Framework\TestCase; @@ -32,7 +34,7 @@ class ODPresentationTest extends TestCase /** * Test can read */ - public function testCanRead() + public function testCanRead(): void { $object = new ODPresentation(); @@ -49,7 +51,7 @@ public function testCanRead() $this->assertTrue($object->canRead($file)); } - public function testLoadFileNotExists() + public function testLoadFileNotExists(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open for reading! File does not exist.'); @@ -58,7 +60,7 @@ public function testLoadFileNotExists() $object->load(''); } - public function testLoadFileBadFormat() + public function testLoadFileBadFormat(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid file format for PhpOffice\PhpPresentation\Reader\ODPresentation:'); @@ -68,7 +70,7 @@ public function testLoadFileBadFormat() $object->load($file); } - public function testFileSupportsNotExists() + public function testFileSupportsNotExists(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open for reading! File does not exist.'); @@ -77,7 +79,7 @@ public function testFileSupportsNotExists() $object->fileSupportsUnserializePhpPresentation(''); } - public function testLoadFile01() + public function testLoadFile01(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_12.odp'; $object = new ODPresentation(); @@ -98,8 +100,9 @@ public function testLoadFile01() $arrayShape = (array) $oSlide1->getShapeCollection(); $this->assertCount(2, $arrayShape); // Slide 1 : Shape 1 + /** @var Gd $oShape */ $oShape = $arrayShape[0]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd', $oShape); + $this->assertInstanceOf(Gd::class, $oShape); $this->assertEquals('PHPPresentation logo', $oShape->getName()); $this->assertEquals('PHPPresentation logo', $oShape->getDescription()); $this->assertEquals(36, $oShape->getHeight()); @@ -109,8 +112,9 @@ public function testLoadFile01() $this->assertEquals(45, $oShape->getShadow()->getDirection()); $this->assertEquals(10, $oShape->getShadow()->getDistance()); // Slide 1 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[1]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(200, $oShape->getHeight()); $this->assertEquals(600, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -144,8 +148,9 @@ public function testLoadFile01() $arrayShape = (array) $oSlide2->getShapeCollection(); $this->assertCount(3, $arrayShape); // Slide 2 : Shape 1 + /** @var Gd $oShape */ $oShape = $arrayShape[0]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd', $oShape); + $this->assertInstanceOf(Gd::class, $oShape); $this->assertEquals('PHPPresentation logo', $oShape->getName()); $this->assertEquals('PHPPresentation logo', $oShape->getDescription()); $this->assertEquals(36, $oShape->getHeight()); @@ -155,8 +160,9 @@ public function testLoadFile01() $this->assertEquals(45, $oShape->getShadow()->getDirection()); $this->assertEquals(10, $oShape->getShadow()->getDistance()); // Slide 2 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[1]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(100, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -175,8 +181,9 @@ public function testLoadFile01() $this->assertEquals(48, $oRichText->getFont()->getSize()); $this->assertEquals('FF000000', $oRichText->getFont()->getColor()->getARGB()); // Slide 2 : Shape 3 + /** @var RichText $oShape */ $oShape = $arrayShape[2]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(600, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -241,8 +248,9 @@ public function testLoadFile01() $arrayShape = (array) $oSlide2->getShapeCollection(); $this->assertCount(3, $arrayShape); // Slide 3 : Shape 1 + /** @var Gd $oShape */ $oShape = $arrayShape[0]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd', $oShape); + $this->assertInstanceOf(Gd::class, $oShape); $this->assertEquals('PHPPresentation logo', $oShape->getName()); $this->assertEquals('PHPPresentation logo', $oShape->getDescription()); $this->assertEquals(36, $oShape->getHeight()); @@ -252,8 +260,9 @@ public function testLoadFile01() $this->assertEquals(45, $oShape->getShadow()->getDirection()); $this->assertEquals(10, $oShape->getShadow()->getDistance()); // Slide 3 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[1]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(100, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -272,8 +281,9 @@ public function testLoadFile01() $this->assertEquals(48, $oRichText->getFont()->getSize()); $this->assertEquals('FF000000', $oRichText->getFont()->getColor()->getARGB()); // Slide 3 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[2]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(600, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -398,8 +408,9 @@ public function testLoadFile01() $arrayShape = (array) $oSlide3->getShapeCollection(); $this->assertCount(3, $arrayShape); // Slide 4 : Shape 1 + /** @var Gd $oShape */ $oShape = $arrayShape[0]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd', $oShape); + $this->assertInstanceOf(Gd::class, $oShape); $this->assertEquals('PHPPresentation logo', $oShape->getName()); $this->assertEquals('PHPPresentation logo', $oShape->getDescription()); $this->assertEquals(36, $oShape->getHeight()); @@ -409,8 +420,9 @@ public function testLoadFile01() $this->assertEquals(45, $oShape->getShadow()->getDirection()); $this->assertEquals(10, $oShape->getShadow()->getDistance()); // Slide 4 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[1]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(100, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -429,8 +441,9 @@ public function testLoadFile01() $this->assertEquals(48, $oRichText->getFont()->getSize()); $this->assertEquals('FF000000', $oShape->getActiveParagraph()->getFont()->getColor()->getARGB()); // Slide 4 : Shape 3 + /** @var RichText $oShape */ $oShape = $arrayShape[2]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(600, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -452,8 +465,9 @@ public function testLoadFile01() $oRichText = $arrayRichText[1]; $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText\\BreakElement', $oRichText); // Slide 4 : Shape 3 : Paragraph 3 + /** @var RichText\Run $oRichText */ $oRichText = $arrayRichText[2]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText\\Run', $oRichText); + $this->assertInstanceOf(RichText\Run::class, $oRichText); $this->assertEquals('https://github.com/PHPOffice/PHPPresentation/', $oRichText->getText()); $this->assertFalse($oRichText->getFont()->isBold()); $this->assertEquals(32, $oRichText->getFont()->getSize()); @@ -463,7 +477,7 @@ public function testLoadFile01() //$this->assertEquals('PHPPresentation', $oRichText->getHyperlink()->getTooltip()); } - public function testSlideName() + public function testSlideName(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/ODP_Slide_Name.odp'; $object = new ODPresentation(); @@ -473,7 +487,7 @@ public function testSlideName() $this->assertEquals('MaDiapo', $oPhpPresentation->getSlide(0)->getName()); } - public function testIssue00141() + public function testIssue00141(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Issue_00141.odp'; $object = new ODPresentation(); @@ -487,8 +501,9 @@ public function testIssue00141() $arrayShape = (array) $oSlide->getShapeCollection(); $this->assertCount(2, $arrayShape); // Slide 1 : Shape 1 + /** @var RichText $oShape */ $oShape = reset($arrayShape); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); // Slide 1 : Shape 1 : Paragraph 1 $oParagraph = $oShape->getParagraph(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText\\Paragraph', $oParagraph); diff --git a/tests/PhpPresentation/Tests/Reader/PowerPoint2007Test.php b/tests/PhpPresentation/Tests/Reader/PowerPoint2007Test.php index e5dff10fbf..b20fed02e6 100644 --- a/tests/PhpPresentation/Tests/Reader/PowerPoint2007Test.php +++ b/tests/PhpPresentation/Tests/Reader/PowerPoint2007Test.php @@ -19,6 +19,8 @@ use PhpOffice\PhpPresentation\DocumentLayout; use PhpOffice\PhpPresentation\Reader\PowerPoint2007; +use PhpOffice\PhpPresentation\Shape\Drawing\Gd; +use PhpOffice\PhpPresentation\Shape\RichText; use PhpOffice\PhpPresentation\Style\Alignment; use PhpOffice\PhpPresentation\Style\Bullet; use PHPUnit\Framework\TestCase; @@ -33,7 +35,7 @@ class PowerPoint2007Test extends TestCase /** * Test can read */ - public function testCanRead() + public function testCanRead(): void { $object = new PowerPoint2007(); @@ -47,7 +49,7 @@ public function testCanRead() $this->assertTrue($object->canRead($file)); } - public function testLoadFileNotExists() + public function testLoadFileNotExists(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open for reading! File does not exist.'); @@ -56,7 +58,7 @@ public function testLoadFileNotExists() $object->load(''); } - public function testLoadFileBadFormat() + public function testLoadFileBadFormat(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid file format for PhpOffice\PhpPresentation\Reader\PowerPoint2007:'); @@ -66,7 +68,7 @@ public function testLoadFileBadFormat() $object->load($file); } - public function testFileSupportsNotExists() + public function testFileSupportsNotExists(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open for reading! File does not exist.'); @@ -75,7 +77,7 @@ public function testFileSupportsNotExists() $object->fileSupportsUnserializePhpPresentation(''); } - public function testLoadFile01() + public function testLoadFile01(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_12.pptx'; $object = new PowerPoint2007(); @@ -102,8 +104,9 @@ public function testLoadFile01() $arrayShape = (array) $oSlide1->getShapeCollection(); $this->assertCount(2, $arrayShape); // Slide 1 : Shape 1 + /** @var Gd $oShape */ $oShape = $arrayShape[0]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd', $oShape); + $this->assertInstanceOf(Gd::class, $oShape); $this->assertEquals('PHPPresentation logo', $oShape->getName()); $this->assertEquals('PHPPresentation logo', $oShape->getDescription()); $this->assertEquals(36, $oShape->getHeight()); @@ -113,8 +116,9 @@ public function testLoadFile01() $this->assertEquals(45, $oShape->getShadow()->getDirection()); $this->assertEquals(10, $oShape->getShadow()->getDistance()); // Slide 1 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[1]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(200, $oShape->getHeight()); $this->assertEquals(600, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -148,8 +152,9 @@ public function testLoadFile01() $arrayShape = (array) $oSlide2->getShapeCollection(); $this->assertCount(3, $arrayShape); // Slide 2 : Shape 1 + /** @var Gd $oShape */ $oShape = $arrayShape[0]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd', $oShape); + $this->assertInstanceOf(Gd::class, $oShape); $this->assertEquals('PHPPresentation logo', $oShape->getName()); $this->assertEquals('PHPPresentation logo', $oShape->getDescription()); $this->assertEquals(36, $oShape->getHeight()); @@ -159,8 +164,9 @@ public function testLoadFile01() $this->assertEquals(45, $oShape->getShadow()->getDirection()); $this->assertEquals(10, $oShape->getShadow()->getDistance()); // Slide 2 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[1]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(100, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -179,8 +185,9 @@ public function testLoadFile01() $this->assertEquals(48, $oRichText->getFont()->getSize()); $this->assertEquals('FF000000', $oRichText->getFont()->getColor()->getARGB()); // Slide 2 : Shape 3 + /** @var RichText $oShape */ $oShape = $arrayShape[2]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(600, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -245,8 +252,9 @@ public function testLoadFile01() $arrayShape = (array) $oSlide2->getShapeCollection(); $this->assertCount(3, $arrayShape); // Slide 3 : Shape 1 + /** @var Gd $oShape */ $oShape = $arrayShape[0]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd', $oShape); + $this->assertInstanceOf(Gd::class, $oShape); $this->assertEquals('PHPPresentation logo', $oShape->getName()); $this->assertEquals('PHPPresentation logo', $oShape->getDescription()); $this->assertEquals(36, $oShape->getHeight()); @@ -256,8 +264,9 @@ public function testLoadFile01() $this->assertEquals(45, $oShape->getShadow()->getDirection()); $this->assertEquals(10, $oShape->getShadow()->getDistance()); // Slide 3 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[1]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(100, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -276,8 +285,9 @@ public function testLoadFile01() $this->assertEquals(48, $oRichText->getFont()->getSize()); $this->assertEquals('FF000000', $oRichText->getFont()->getColor()->getARGB()); // Slide 3 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[2]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(600, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -402,8 +412,9 @@ public function testLoadFile01() $arrayShape = (array) $oSlide3->getShapeCollection(); $this->assertCount(3, $arrayShape); // Slide 4 : Shape 1 + /** @var Gd $oShape */ $oShape = $arrayShape[0]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\Gd', $oShape); + $this->assertInstanceOf(Gd::class, $oShape); $this->assertEquals('PHPPresentation logo', $oShape->getName()); $this->assertEquals('PHPPresentation logo', $oShape->getDescription()); $this->assertEquals(36, $oShape->getHeight()); @@ -413,8 +424,9 @@ public function testLoadFile01() $this->assertEquals(45, $oShape->getShadow()->getDirection()); $this->assertEquals(10, $oShape->getShadow()->getDistance()); // Slide 4 : Shape 2 + /** @var RichText $oShape */ $oShape = $arrayShape[1]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(100, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -433,8 +445,9 @@ public function testLoadFile01() $this->assertEquals(48, $oRichText->getFont()->getSize()); $this->assertEquals('FF000000', $oShape->getActiveParagraph()->getFont()->getColor()->getARGB()); // Slide 4 : Shape 3 + /** @var RichText $oShape */ $oShape = $arrayShape[2]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $oShape); + $this->assertInstanceOf(RichText::class, $oShape); $this->assertEquals(600, $oShape->getHeight()); $this->assertEquals(930, $oShape->getWidth()); $this->assertEquals(10, $oShape->getOffsetX()); @@ -456,8 +469,9 @@ public function testLoadFile01() $oRichText = $arrayRichText[1]; $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText\\BreakElement', $oRichText); // Slide 4 : Shape 3 : Paragraph 3 + /** @var RichText\Run $oRichText */ $oRichText = $arrayRichText[2]; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText\\Run', $oRichText); + $this->assertInstanceOf(RichText\Run::class, $oRichText); $this->assertEquals('https://github.com/PHPOffice/PHPPresentation/', $oRichText->getText()); $this->assertFalse($oRichText->getFont()->isBold()); $this->assertEquals(32, $oRichText->getFont()->getSize()); @@ -467,7 +481,7 @@ public function testLoadFile01() $this->assertEquals('PHPPresentation', $oRichText->getHyperlink()->getTooltip()); } - public function testMarkAsFinal() + public function testMarkAsFinal(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_12.pptx'; $object = new PowerPoint2007(); @@ -483,7 +497,7 @@ public function testMarkAsFinal() $this->assertTrue($oPhpPresentation->getPresentationProperties()->isMarkedAsFinal()); } - public function testZoom() + public function testZoom(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_12.pptx'; $object = new PowerPoint2007(); @@ -499,7 +513,7 @@ public function testZoom() $this->assertEquals(2.68, $oPhpPresentation->getPresentationProperties()->getZoom()); } - public function testSlideLayout() + public function testSlideLayout(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Issue_00150.pptx'; $object = new PowerPoint2007(); diff --git a/tests/PhpPresentation/Tests/Reader/PowerPoint97Test.php b/tests/PhpPresentation/Tests/Reader/PowerPoint97Test.php index 0f4cac3bc7..56a2b8d486 100644 --- a/tests/PhpPresentation/Tests/Reader/PowerPoint97Test.php +++ b/tests/PhpPresentation/Tests/Reader/PowerPoint97Test.php @@ -30,7 +30,7 @@ class PowerPoint97Test extends TestCase /** * Test can read */ - public function testCanRead() + public function testCanRead(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_00_01.ppt'; $object = new PowerPoint97(); @@ -42,7 +42,7 @@ public function testCanRead() /** * Test cant read */ - public function testCantRead() + public function testCantRead(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/serialized.phppt'; $object = new PowerPoint97(); @@ -50,7 +50,7 @@ public function testCantRead() $this->assertFalse($object->canRead($file)); } - public function testLoadFileNotExists() + public function testLoadFileNotExists(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open for reading! File does not exist.'); @@ -59,7 +59,7 @@ public function testLoadFileNotExists() $object->load(''); } - public function testLoadFileBadFormat() + public function testLoadFileBadFormat(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid file format for PhpOffice\PhpPresentation\Reader\PowerPoint97:'); @@ -69,7 +69,7 @@ public function testLoadFileBadFormat() $object->load($file); } - public function testFileSupportsNotExists() + public function testFileSupportsNotExists(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open for reading! File does not exist.'); @@ -78,7 +78,7 @@ public function testFileSupportsNotExists() $object->fileSupportsUnserializePhpPresentation(''); } - public function testLoadFile01() + public function testLoadFile01(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_00_01.ppt'; $object = new PowerPoint97(); @@ -90,7 +90,7 @@ public function testLoadFile01() $this->assertCount(2, $oSlide->getShapeCollection()); } - public function testLoadFile02() + public function testLoadFile02(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_00_02.ppt'; $object = new PowerPoint97(); @@ -111,7 +111,7 @@ public function testLoadFile02() $this->assertCount(3, $oSlide->getShapeCollection()); } - public function testLoadFile03() + public function testLoadFile03(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_00_03.ppt'; $object = new PowerPoint97(); @@ -123,7 +123,7 @@ public function testLoadFile03() $this->assertCount(1, $oSlide->getShapeCollection()); } - public function testLoadFile04() + public function testLoadFile04(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_00_04.ppt'; $object = new PowerPoint97(); diff --git a/tests/PhpPresentation/Tests/Reader/SerializedTest.php b/tests/PhpPresentation/Tests/Reader/SerializedTest.php index b13157f9f0..4f4a29ed84 100644 --- a/tests/PhpPresentation/Tests/Reader/SerializedTest.php +++ b/tests/PhpPresentation/Tests/Reader/SerializedTest.php @@ -30,7 +30,7 @@ class SerializedTest extends TestCase /** * Test can read */ - public function testCanRead() + public function testCanRead(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/serialized.phppt'; $object = new Serialized(); @@ -38,7 +38,7 @@ public function testCanRead() $this->assertTrue($object->canRead($file)); } - public function testLoadFileNotExists() + public function testLoadFileNotExists(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open for reading! File does not exist.'); @@ -47,7 +47,7 @@ public function testLoadFileNotExists() $object->load(''); } - public function testLoadFileBadFormat() + public function testLoadFileBadFormat(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid file format for PhpOffice\PhpPresentation\Reader\Serialized:'); @@ -57,7 +57,7 @@ public function testLoadFileBadFormat() $object->load($file); } - public function testFileSupportsNotExists() + public function testFileSupportsNotExists(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open for reading! File does not exist.'); @@ -66,15 +66,19 @@ public function testFileSupportsNotExists() $object->fileSupportsUnserializePhpPresentation(''); } - public function testLoadSerializedFileNotExists() + public function testLoadSerializedFileNotExists(): void { $file = tempnam(sys_get_temp_dir(), 'PhpPresentation_Serialized'); + + $this->expectException(\Exception::class); + $this->expectExceptionMessage(sprintf('The file PhpPresentation.xml in the serialized file %s is malformed', $file)); + $oArchive = new \ZipArchive(); $oArchive->open($file, \ZipArchive::CREATE); $oArchive->addFromString('PhpPresentation.xml', ''); $oArchive->close(); $object = new Serialized(); - $this->assertNull($object->load($file)); + $object->load($file); } } diff --git a/tests/PhpPresentation/Tests/Shape/AbstractGraphicTest.php b/tests/PhpPresentation/Tests/Shape/AbstractGraphicTest.php index 797aa46012..681bc29b9d 100644 --- a/tests/PhpPresentation/Tests/Shape/AbstractGraphicTest.php +++ b/tests/PhpPresentation/Tests/Shape/AbstractGraphicTest.php @@ -27,7 +27,7 @@ */ class AbstractGraphicTest extends TestCase { - public function testWidthAndHeight() + public function testWidthAndHeight(): void { $min = 10; $max = 20; @@ -60,7 +60,7 @@ public function testWidthAndHeight() $this->assertEquals($min, $stub->getHeight()); } - public function testWidthAndHeight2() + public function testWidthAndHeight2(): void { $min = 10; $max = 20; diff --git a/tests/PhpPresentation/Tests/Shape/Chart/AxisTest.php b/tests/PhpPresentation/Tests/Shape/Chart/AxisTest.php index 1c0acc9ae7..24540757a8 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/AxisTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/AxisTest.php @@ -18,7 +18,9 @@ namespace PhpOffice\PhpPresentation\Tests\Shape\Chart; use PhpOffice\PhpPresentation\Shape\Chart\Axis; +use PhpOffice\PhpPresentation\Shape\Chart\Gridlines; use PhpOffice\PhpPresentation\Style\Font; +use PhpOffice\PhpPresentation\Style\Outline; use PHPUnit\Framework\TestCase; /** @@ -28,7 +30,7 @@ */ class AxisTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Axis(); @@ -38,7 +40,7 @@ public function testConstruct() $this->assertNull($object->getMajorGridlines()); } - public function testBounds() + public function testBounds(): void { $value = mt_rand(0, 100); $object = new Axis(); @@ -56,7 +58,7 @@ public function testBounds() $this->assertNull($object->getMaxBounds()); } - public function testFont() + public function testFont(): void { $object = new Axis(); @@ -66,7 +68,7 @@ public function testFont() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->getFont()); } - public function testFormatCode() + public function testFormatCode(): void { $object = new Axis(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Axis', $object->setFormatCode()); @@ -75,19 +77,20 @@ public function testFormatCode() $this->assertEquals('AAAA', $object->getFormatCode()); } - public function testGridLines() + public function testGridLines(): void { $object = new Axis(); - $oMock = $this->getMockBuilder('PhpOffice\PhpPresentation\Shape\Chart\Gridlines')->getMock(); + /** @var Gridlines $oMock */ + $oMock = $this->getMockBuilder(Gridlines::class)->getMock(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Axis', $object->setMajorGridlines($oMock)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Gridlines', $object->getMajorGridlines()); + $this->assertInstanceOf(Gridlines::class, $object->getMajorGridlines()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Axis', $object->setMinorGridlines($oMock)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Gridlines', $object->getMinorGridlines()); + $this->assertInstanceOf(Gridlines::class, $object->getMinorGridlines()); } - public function testHashIndex() + public function testHashIndex(): void { $object = new Axis(); $value = mt_rand(1, 100); @@ -97,7 +100,7 @@ public function testHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testIsVisible() + public function testIsVisible(): void { $object = new Axis(); $this->assertTrue($object->isVisible()); @@ -107,17 +110,18 @@ public function testIsVisible() $this->assertTrue($object->isVisible()); } - public function testOutline() + public function testOutline(): void { - $oMock = $this->getMockBuilder('PhpOffice\PhpPresentation\Style\\Outline')->getMock(); + /** @var Outline $oMock */ + $oMock = $this->getMockBuilder(Outline::class)->getMock(); $object = new Axis(); - $this->assertInstanceOf('PhpOffice\PhpPresentation\Style\\Outline', $object->getOutline()); + $this->assertInstanceOf(Outline::class, $object->getOutline()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Axis', $object->setOutline($oMock)); - $this->assertInstanceOf('PhpOffice\PhpPresentation\Style\\Outline', $object->getOutline()); + $this->assertInstanceOf(Outline::class, $object->getOutline()); } - public function testTickMark() + public function testTickMark(): void { $value = Axis::TICK_MARK_INSIDE; $object = new Axis(); @@ -135,7 +139,7 @@ public function testTickMark() $this->assertEquals(Axis::TICK_MARK_NONE, $object->getMajorTickMark()); } - public function testTitle() + public function testTitle(): void { $object = new Axis(); $this->assertEquals('Axis Title', $object->getTitle()); @@ -143,7 +147,7 @@ public function testTitle() $this->assertEquals('AAAA', $object->getTitle()); } - public function testUnit() + public function testUnit(): void { $value = mt_rand(0, 100); $object = new Axis(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/GridlinesTest.php b/tests/PhpPresentation/Tests/Shape/Chart/GridlinesTest.php index 4aeff224b5..d7e725cfbe 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/GridlinesTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/GridlinesTest.php @@ -3,25 +3,27 @@ namespace PhpOffice\PhpPresentation\Tests\Shape\Chart; use PhpOffice\PhpPresentation\Shape\Chart\Gridlines; +use PhpOffice\PhpPresentation\Style\Outline; use PHPUnit\Framework\TestCase; class GridlinesTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Gridlines(); - $this->assertInstanceOf('PhpOffice\PhpPresentation\Style\Outline', $object->getOutline()); + $this->assertInstanceOf(Outline::class, $object->getOutline()); } - public function testGetSetOutline() + public function testGetSetOutline(): void { $object = new Gridlines(); - $oStub = $this->getMockBuilder('PhpOffice\PhpPresentation\Style\Outline')->getMock(); + /** @var Outline $oStub */ + $oStub = $this->getMockBuilder(Outline::class)->getMock(); - $this->assertInstanceOf('PhpOffice\PhpPresentation\Style\Outline', $object->getOutline()); + $this->assertInstanceOf(Outline::class, $object->getOutline()); $this->assertInstanceOf('PhpOffice\PhpPresentation\Shape\Chart\Gridlines', $object->setOutline($oStub)); - $this->assertInstanceOf('PhpOffice\PhpPresentation\Style\Outline', $object->getOutline()); + $this->assertInstanceOf(Outline::class, $object->getOutline()); } } diff --git a/tests/PhpPresentation/Tests/Shape/Chart/LegendTest.php b/tests/PhpPresentation/Tests/Shape/Chart/LegendTest.php index 8c44739ddb..f9b4de2ece 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/LegendTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/LegendTest.php @@ -31,7 +31,7 @@ */ class LegendTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Legend(); @@ -41,7 +41,7 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->getAlignment()); } - public function testAlignment() + public function testAlignment(): void { $object = new Legend(); @@ -49,7 +49,7 @@ public function testAlignment() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->getAlignment()); } - public function testBorder() + public function testBorder(): void { $object = new Legend(); @@ -58,7 +58,7 @@ public function testBorder() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Border', $object->getBorder()); } - public function testFill() + public function testFill(): void { $object = new Legend(); @@ -67,7 +67,7 @@ public function testFill() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getFill()); } - public function testFont() + public function testFont(): void { $object = new Legend(); @@ -77,7 +77,7 @@ public function testFont() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->getFont()); } - public function testHashIndex() + public function testHashIndex(): void { $object = new Legend(); $value = mt_rand(1, 100); @@ -87,7 +87,7 @@ public function testHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testHeight() + public function testHeight(): void { $object = new Legend(); $value = mt_rand(0, 100); @@ -98,7 +98,7 @@ public function testHeight() $this->assertEquals($value, $object->getHeight()); } - public function testOffsetX() + public function testOffsetX(): void { $object = new Legend(); $value = mt_rand(0, 100); @@ -109,7 +109,7 @@ public function testOffsetX() $this->assertEquals($value, $object->getOffsetX()); } - public function testOffsetY() + public function testOffsetY(): void { $object = new Legend(); $value = mt_rand(0, 100); @@ -120,7 +120,7 @@ public function testOffsetY() $this->assertEquals($value, $object->getOffsetY()); } - public function testPosition() + public function testPosition(): void { $object = new Legend(); @@ -130,7 +130,7 @@ public function testPosition() $this->assertEquals(Legend::POSITION_BOTTOM, $object->getPosition()); } - public function testVisible() + public function testVisible(): void { $object = new Legend(); @@ -142,7 +142,7 @@ public function testVisible() $this->assertFalse($object->isVisible()); } - public function testWidth() + public function testWidth(): void { $object = new Legend(); $value = mt_rand(0, 100); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/MarkerTest.php b/tests/PhpPresentation/Tests/Shape/Chart/MarkerTest.php index 36b41db48d..ee65189a08 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/MarkerTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/MarkerTest.php @@ -27,7 +27,7 @@ */ class MarkerTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Marker(); @@ -35,17 +35,17 @@ public function testConstruct() $this->assertEquals(5, $object->getSize()); } - public function testSymbol() + public function testSymbol(): void { $object = new Marker(); - $expected = array_rand(Marker::$arraySymbol); + $expected = Marker::$arraySymbol[array_rand(Marker::$arraySymbol)]; $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Marker', $object->setSymbol($expected)); $this->assertEquals($expected, $object->getSymbol()); } - public function testSize() + public function testSize(): void { $object = new Marker(); $value = mt_rand(1, 100); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/PlotAreaTest.php b/tests/PhpPresentation/Tests/Shape/Chart/PlotAreaTest.php index 4d31c93a7a..7419e51c50 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/PlotAreaTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/PlotAreaTest.php @@ -30,7 +30,7 @@ */ class PlotAreaTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new PlotArea(); @@ -38,7 +38,7 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Axis', $object->getAxisY()); } - public function testHashIndex() + public function testHashIndex(): void { $object = new PlotArea(); $value = mt_rand(1, 100); @@ -48,7 +48,7 @@ public function testHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testHeight() + public function testHeight(): void { $object = new PlotArea(); $value = mt_rand(0, 100); @@ -59,7 +59,7 @@ public function testHeight() $this->assertEquals($value, $object->getHeight()); } - public function testOffsetX() + public function testOffsetX(): void { $object = new PlotArea(); $value = mt_rand(0, 100); @@ -70,7 +70,7 @@ public function testOffsetX() $this->assertEquals($value, $object->getOffsetX()); } - public function testOffsetY() + public function testOffsetY(): void { $object = new PlotArea(); $value = mt_rand(0, 100); @@ -81,7 +81,7 @@ public function testOffsetY() $this->assertEquals($value, $object->getOffsetY()); } - public function testType() + public function testType(): void { $object = new PlotArea(); @@ -89,7 +89,7 @@ public function testType() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Type\\AbstractType', $object->getType()); } - public function testTypeException() + public function testTypeException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Chart type has not been set.'); @@ -98,7 +98,7 @@ public function testTypeException() $object->getType(); } - public function testWidth() + public function testWidth(): void { $object = new PlotArea(); $value = mt_rand(0, 100); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/SeriesTest.php b/tests/PhpPresentation/Tests/Shape/Chart/SeriesTest.php index 4f40bfd3de..8027dc3a1c 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/SeriesTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/SeriesTest.php @@ -31,204 +31,201 @@ */ class SeriesTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getFill()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->getFont()); + $this->assertInstanceOf(Fill::class, $object->getFill()); + $this->assertInstanceOf(Font::class, $object->getFont()); $this->assertEquals('Calibri', $object->getFont()->getName()); $this->assertEquals(9, $object->getFont()->getSize()); $this->assertEquals('Series Title', $object->getTitle()); $this->assertIsArray($object->getValues()); $this->assertEmpty($object->getValues()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Marker', $object->getMarker()); + $this->assertInstanceOf(Marker::class, $object->getMarker()); $this->assertNull($object->getOutline()); $this->assertFalse($object->hasShowLegendKey()); } - public function testDataLabelNumFormat() + public function testDataLabelNumFormat(): void { $object = new Series(); $this->assertEmpty($object->getDlblNumFormat()); $this->assertFalse($object->hasDlblNumFormat()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setDlblNumFormat('#%')); + $this->assertInstanceOf(Series::class, $object->setDlblNumFormat('#%')); $this->assertEquals('#%', $object->getDlblNumFormat()); $this->assertTrue($object->hasDlblNumFormat()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setDlblNumFormat()); + $this->assertInstanceOf(Series::class, $object->setDlblNumFormat()); $this->assertEmpty($object->getDlblNumFormat()); $this->assertFalse($object->hasDlblNumFormat()); } - public function testDataPointFills() + public function testDataPointFills(): void { $object = new Series(); $this->assertIsArray($object->getDataPointFills()); $this->assertEmpty($object->getDataPointFills()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getDataPointFill(0)); + $this->assertInstanceOf(Fill::class, $object->getDataPointFill(0)); } - public function testFill() + public function testFill(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setFill()); + $this->assertInstanceOf(Series::class, $object->setFill()); $this->assertNull($object->getFill()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setFill(new Fill())); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getFill()); + $this->assertInstanceOf(Series::class, $object->setFill(new Fill())); + $this->assertInstanceOf(Fill::class, $object->getFill()); } - public function testFont() + public function testFont(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setFont()); + $this->assertInstanceOf(Series::class, $object->setFont()); $this->assertNull($object->getFont()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setFont(new Font())); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->getFont()); + $this->assertInstanceOf(Series::class, $object->setFont(new Font())); + $this->assertInstanceOf(Font::class, $object->getFont()); } - public function testHashIndex() + public function testHashIndex(): void { $object = new Series(); $value = mt_rand(1, 100); $this->assertEmpty($object->getHashIndex()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setHashIndex($value)); + $this->assertInstanceOf(Series::class, $object->setHashIndex($value)); $this->assertEquals($value, $object->getHashIndex()); } - public function testHashCode() + public function testHashCode(): void { $object = new Series(); $this->assertEquals(md5($object->getFill()->getHashCode().$object->getFont()->getHashCode().var_export($object->getValues(), true) . var_export($object, true).get_class($object)), $object->getHashCode()); } - public function testLabelPosition() + public function testLabelPosition(): void { $object = new Series(); $this->assertEmpty($object->getHashIndex()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setLabelPosition(Series::LABEL_INSIDEBASE)); + $this->assertInstanceOf(Series::class, $object->setLabelPosition(Series::LABEL_INSIDEBASE)); $this->assertEquals(Series::LABEL_INSIDEBASE, $object->getLabelPosition()); } - public function testMarker() + public function testMarker(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setMarker(new Marker())); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Marker', $object->getMarker()); + $this->assertInstanceOf(Series::class, $object->setMarker(new Marker())); + $this->assertInstanceOf(Marker::class, $object->getMarker()); } - public function testOutline() + public function testOutline(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setOutline(new Outline())); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Outline', $object->getOutline()); + $this->assertInstanceOf(Series::class, $object->setOutline(new Outline())); + $this->assertInstanceOf(Outline::class, $object->getOutline()); } - public function testShowCategoryName() + public function testShowCategoryName(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowCategoryName(true)); + $this->assertInstanceOf(Series::class, $object->setShowCategoryName(true)); $this->assertTrue($object->hasShowCategoryName()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowCategoryName(false)); + $this->assertInstanceOf(Series::class, $object->setShowCategoryName(false)); $this->assertFalse($object->hasShowCategoryName()); } - public function testShowLeaderLines() + public function testShowLeaderLines(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowLeaderLines(true)); + $this->assertInstanceOf(Series::class, $object->setShowLeaderLines(true)); $this->assertTrue($object->hasShowLeaderLines()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowLeaderLines(false)); + $this->assertInstanceOf(Series::class, $object->setShowLeaderLines(false)); $this->assertFalse($object->hasShowLeaderLines()); } - public function testShowLegendKey() + public function testShowLegendKey(): void { $object = new Series(); $this->assertFalse($object->hasShowLegendKey()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowLegendKey(true)); + $this->assertInstanceOf(Series::class, $object->setShowLegendKey(true)); $this->assertTrue($object->hasShowLegendKey()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowLegendKey(false)); - $this->assertFalse($object->hasShowLegendKey()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowLegendKey(1)); - $this->assertTrue($object->hasShowLegendKey()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowLegendKey(0)); + $this->assertInstanceOf(Series::class, $object->setShowLegendKey(false)); $this->assertFalse($object->hasShowLegendKey()); } - public function testShowPercentage() + public function testShowPercentage(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowPercentage(true)); + $this->assertInstanceOf(Series::class, $object->setShowPercentage(true)); $this->assertTrue($object->hasShowPercentage()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowPercentage(false)); + $this->assertInstanceOf(Series::class, $object->setShowPercentage(false)); $this->assertFalse($object->hasShowPercentage()); } - public function testShowSeparator() + public function testShowSeparator(): void { $value = ';'; $object = new Series(); $this->assertFalse($object->hasShowSeparator()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setSeparator($value)); + $this->assertInstanceOf(Series::class, $object->setSeparator($value)); $this->assertEquals($value, $object->getSeparator()); $this->assertTrue($object->hasShowSeparator()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setSeparator('')); + $this->assertInstanceOf(Series::class, $object->setSeparator('')); $this->assertFalse($object->hasShowPercentage()); } - public function testShowSeriesName() + public function testShowSeriesName(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowSeriesName(true)); + $this->assertInstanceOf(Series::class, $object->setShowSeriesName(true)); $this->assertTrue($object->hasShowSeriesName()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowSeriesName(false)); + $this->assertInstanceOf(Series::class, $object->setShowSeriesName(false)); $this->assertFalse($object->hasShowSeriesName()); } - public function testShowValue() + public function testShowValue(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowValue(true)); + $this->assertInstanceOf(Series::class, $object->setShowValue(true)); $this->assertTrue($object->hasShowValue()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setShowValue(false)); + $this->assertInstanceOf(Series::class, $object->setShowValue(false)); $this->assertFalse($object->hasShowValue()); } - public function testTitle() + public function testTitle(): void { $object = new Series(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setTitle()); + $this->assertInstanceOf(Series::class, $object->setTitle()); $this->assertEquals('Series Title', $object->getTitle()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setTitle('AAAA')); + $this->assertInstanceOf(Series::class, $object->setTitle('AAAA')); $this->assertEquals('AAAA', $object->getTitle()); } - public function testValue() + public function testValue(): void { $object = new Series(); + /** @var array $array */ $array = array( '0' => 'a', '1' => 'b', @@ -238,21 +235,21 @@ public function testValue() $this->assertIsArray($object->getValues()); $this->assertEmpty($object->getValues()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setValues()); + $this->assertInstanceOf(Series::class, $object->setValues()); $this->assertEmpty($object->getValues()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->setValues($array)); + $this->assertInstanceOf(Series::class, $object->setValues($array)); $this->assertCount(count($array), $object->getValues()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $object->addValue(4, 'e')); + $this->assertInstanceOf(Series::class, $object->addValue('4', 'e')); $this->assertCount(count($array) + 1, $object->getValues()); } - public function testClone() + public function testClone(): void { $object = new Series(); $object->setOutline(new Outline()); $clone = clone $object; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Series', $clone); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Outline', $clone->getOutline()); + $this->assertInstanceOf(Series::class, $clone); + $this->assertInstanceOf(Outline::class, $clone->getOutline()); } } diff --git a/tests/PhpPresentation/Tests/Shape/Chart/TitleTest.php b/tests/PhpPresentation/Tests/Shape/Chart/TitleTest.php index 7c326ed8b2..056a7bd735 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/TitleTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/TitleTest.php @@ -29,7 +29,7 @@ */ class TitleTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Title(); @@ -39,7 +39,7 @@ public function testConstruct() $this->assertEquals(18, $object->getFont()->getSize()); } - public function testAlignment() + public function testAlignment(): void { $object = new Title(); @@ -47,7 +47,7 @@ public function testAlignment() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->getAlignment()); } - public function testFont() + public function testFont(): void { $object = new Title(); @@ -57,7 +57,7 @@ public function testFont() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->getFont()); } - public function testHashIndex() + public function testHashIndex(): void { $object = new Title(); $value = mt_rand(1, 100); @@ -67,7 +67,7 @@ public function testHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testHeight() + public function testHeight(): void { $object = new Title(); $value = mt_rand(0, 100); @@ -78,7 +78,7 @@ public function testHeight() $this->assertEquals($value, $object->getHeight()); } - public function testOffsetX() + public function testOffsetX(): void { $object = new Title(); $value = mt_rand(0, 100); @@ -89,7 +89,7 @@ public function testOffsetX() $this->assertEquals($value, $object->getOffsetX()); } - public function testOffsetY() + public function testOffsetY(): void { $object = new Title(); $value = mt_rand(0, 100); @@ -100,7 +100,7 @@ public function testOffsetY() $this->assertEquals($value, $object->getOffsetY()); } - public function testText() + public function testText(): void { $object = new Title(); @@ -110,7 +110,7 @@ public function testText() $this->assertEquals('AAAA', $object->getText()); } - public function testVisible() + public function testVisible(): void { $object = new Title(); @@ -122,7 +122,7 @@ public function testVisible() $this->assertFalse($object->isVisible()); } - public function testWidth() + public function testWidth(): void { $object = new Title(); $value = mt_rand(0, 100); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/AbstractTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/AbstractTest.php index b0cbc77ccc..5bbe626b2b 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/AbstractTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/AbstractTest.php @@ -19,6 +19,7 @@ use PhpOffice\PhpPresentation\Shape\Chart\Series; use PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter; +use PhpOffice\PhpPresentation\Shape\Chart\Type\AbstractType; use PHPUnit\Framework\TestCase; /** @@ -28,7 +29,7 @@ */ class AbstractTest extends TestCase { - public function testAxis() + public function testAxis(): void { $object = new Scatter(); @@ -36,7 +37,7 @@ public function testAxis() $this->assertTrue($object->hasAxisY()); } - public function testHashIndex() + public function testHashIndex(): void { $object = new Scatter(); $value = mt_rand(1, 100); @@ -46,9 +47,10 @@ public function testHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testData() + public function testData(): void { - $stub = $this->getMockForAbstractClass('PhpOffice\\PhpPresentation\\Shape\\Chart\\Type\\AbstractType'); + /** @var AbstractType $stub */ + $stub = $this->getMockForAbstractClass(AbstractType::class); $this->assertEmpty($stub->getData()); $this->assertIsArray($stub->getData()); @@ -56,12 +58,12 @@ public function testData() new Series(), new Series() ); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Type\\AbstractType', $stub->setData($arraySeries)); + $this->assertInstanceOf(AbstractType::class, $stub->setData($arraySeries)); $this->assertIsArray($stub->getData()); $this->assertCount(count($arraySeries), $stub->getData()); } - public function testClone() + public function testClone(): void { $arraySeries = array( new Series(), @@ -70,11 +72,12 @@ public function testClone() new Series(), ); - $stub = $this->getMockForAbstractClass('PhpOffice\\PhpPresentation\\Shape\\Chart\\Type\\AbstractType'); + /** @var AbstractType $stub */ + $stub = $this->getMockForAbstractClass(AbstractType::class); $stub->setData($arraySeries); $clone = clone $stub; - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\Type\\AbstractType', $clone); + $this->assertInstanceOf(AbstractType::class, $clone); $this->assertIsArray($stub->getData()); $this->assertCount(count($arraySeries), $stub->getData()); } diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/AreaTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/AreaTest.php index 2be0d0d25a..0938f3ff5f 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/AreaTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/AreaTest.php @@ -28,7 +28,7 @@ */ class AreaTest extends TestCase { - public function testData() + public function testData(): void { $object = new Area(); @@ -46,7 +46,7 @@ public function testData() $this->assertCount(count($array), $object->getSeries()); } - public function testSeries() + public function testSeries(): void { $object = new Area(); @@ -54,7 +54,7 @@ public function testSeries() $this->assertCount(1, $object->getSeries()); } - public function testHashCode() + public function testHashCode(): void { $oSeries = new Series(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/Bar3DTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/Bar3DTest.php index 0a143431da..fc456f8cf1 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/Bar3DTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/Bar3DTest.php @@ -28,7 +28,7 @@ */ class Bar3DTest extends TestCase { - public function testData() + public function testData(): void { $object = new Bar3D(); @@ -46,7 +46,7 @@ public function testData() $this->assertCount(count($array), $object->getSeries()); } - public function testSeries() + public function testSeries(): void { $object = new Bar3D(); @@ -54,7 +54,7 @@ public function testSeries() $this->assertCount(1, $object->getSeries()); } - public function testBarDirection() + public function testBarDirection(): void { $object = new Bar3D(); $this->assertEquals(Bar3D::DIRECTION_VERTICAL, $object->getBarDirection()); @@ -64,7 +64,7 @@ public function testBarDirection() $this->assertEquals(Bar3D::DIRECTION_VERTICAL, $object->getBarDirection()); } - public function testBarGrouping() + public function testBarGrouping(): void { $object = new Bar3D(); $this->assertEquals(Bar3D::GROUPING_CLUSTERED, $object->getBarGrouping()); @@ -76,7 +76,7 @@ public function testBarGrouping() $this->assertEquals(Bar3D::GROUPING_PERCENTSTACKED, $object->getBarGrouping()); } - public function testGapWidthPercent() + public function testGapWidthPercent(): void { $value = mt_rand(0, 500); $object = new Bar3D(); @@ -89,7 +89,7 @@ public function testGapWidthPercent() $this->assertEquals(500, $object->getGapWidthPercent()); } - public function testHashCode() + public function testHashCode(): void { $oSeries = new Series(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/BarTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/BarTest.php index b386bfcbc6..efc5ae44b1 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/BarTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/BarTest.php @@ -28,7 +28,7 @@ */ class BarTest extends TestCase { - public function testData() + public function testData(): void { $object = new Bar(); @@ -46,7 +46,7 @@ public function testData() $this->assertCount(count($array), $object->getSeries()); } - public function testSeries() + public function testSeries(): void { $object = new Bar(); @@ -54,7 +54,7 @@ public function testSeries() $this->assertCount(1, $object->getSeries()); } - public function testBarDirection() + public function testBarDirection(): void { $object = new Bar(); $this->assertEquals(Bar::DIRECTION_VERTICAL, $object->getBarDirection()); @@ -64,7 +64,7 @@ public function testBarDirection() $this->assertEquals(Bar::DIRECTION_VERTICAL, $object->getBarDirection()); } - public function testBarGrouping() + public function testBarGrouping(): void { $object = new Bar(); $this->assertEquals(Bar::GROUPING_CLUSTERED, $object->getBarGrouping()); @@ -76,7 +76,7 @@ public function testBarGrouping() $this->assertEquals(Bar::GROUPING_PERCENTSTACKED, $object->getBarGrouping()); } - public function testGapWidthPercent() + public function testGapWidthPercent(): void { $value = mt_rand(0, 500); $object = new Bar(); @@ -89,7 +89,7 @@ public function testGapWidthPercent() $this->assertEquals(500, $object->getGapWidthPercent()); } - public function testHashCode() + public function testHashCode(): void { $oSeries = new Series(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/DoughnutTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/DoughnutTest.php index 7425873d3b..588972c897 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/DoughnutTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/DoughnutTest.php @@ -28,7 +28,7 @@ */ class DoughnutTest extends TestCase { - public function testData() + public function testData(): void { $object = new Doughnut(); @@ -46,7 +46,7 @@ public function testData() $this->assertCount(count($array), $object->getSeries()); } - public function testHoleSize() + public function testHoleSize(): void { $rand = mt_rand(10, 90); $object = new Doughnut(); @@ -62,7 +62,7 @@ public function testHoleSize() $this->assertEquals(50, $object->getHoleSize()); } - public function testSeries() + public function testSeries(): void { $object = new Doughnut(); @@ -70,7 +70,7 @@ public function testSeries() $this->assertCount(1, $object->getSeries()); } - public function testHashCode() + public function testHashCode(): void { $oSeries = new Series(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/LineTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/LineTest.php index fdd4fab85b..cdf8520819 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/LineTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/LineTest.php @@ -28,7 +28,7 @@ */ class LineTest extends TestCase { - public function testData() + public function testData(): void { $object = new Line(); @@ -46,7 +46,7 @@ public function testData() $this->assertCount(count($array), $object->getSeries()); } - public function testSerties() + public function testSerties(): void { $object = new Line(); @@ -54,7 +54,7 @@ public function testSerties() $this->assertCount(1, $object->getSeries()); } - public function testHashCode() + public function testHashCode(): void { $oSeries = new Series(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/Pie3DTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/Pie3DTest.php index 3abc084f6a..32dd1244fe 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/Pie3DTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/Pie3DTest.php @@ -28,7 +28,7 @@ */ class Pie3DTest extends TestCase { - public function testData() + public function testData(): void { $object = new Pie3D(); @@ -46,7 +46,7 @@ public function testData() $this->assertCount(count($array), $object->getSeries()); } - public function testSeries() + public function testSeries(): void { $object = new Pie3D(); @@ -54,7 +54,7 @@ public function testSeries() $this->assertCount(1, $object->getSeries()); } - public function testExplosion() + public function testExplosion(): void { $value = mt_rand(0, 100); $object = new Pie3D(); @@ -64,7 +64,7 @@ public function testExplosion() $this->assertEquals($value, $object->getExplosion()); } - public function testHashCode() + public function testHashCode(): void { $oSeries = new Series(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/PieTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/PieTest.php index 94ed8fda0c..1aa62f307e 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/PieTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/PieTest.php @@ -28,7 +28,7 @@ */ class PieTest extends TestCase { - public function testData() + public function testData(): void { $object = new Pie(); @@ -46,7 +46,7 @@ public function testData() $this->assertCount(count($array), $object->getSeries()); } - public function testSeries() + public function testSeries(): void { $object = new Pie(); @@ -55,7 +55,7 @@ public function testSeries() } - public function testHashCode() + public function testHashCode(): void { $oSeries = new Series(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/Type/ScatterTest.php b/tests/PhpPresentation/Tests/Shape/Chart/Type/ScatterTest.php index ca447f1d2f..1ea92f24c1 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/Type/ScatterTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/Type/ScatterTest.php @@ -28,7 +28,7 @@ */ class ScatterTest extends TestCase { - public function testData() + public function testData(): void { $object = new Scatter(); @@ -46,7 +46,7 @@ public function testData() $this->assertCount(count($array), $object->getSeries()); } - public function testSerties() + public function testSerties(): void { $object = new Scatter(); @@ -54,7 +54,7 @@ public function testSerties() $this->assertCount(1, $object->getSeries()); } - public function testHashCode() + public function testHashCode(): void { $oSeries = new Series(); diff --git a/tests/PhpPresentation/Tests/Shape/Chart/View3DTest.php b/tests/PhpPresentation/Tests/Shape/Chart/View3DTest.php index ce85e4fadd..5aab3b110e 100644 --- a/tests/PhpPresentation/Tests/Shape/Chart/View3DTest.php +++ b/tests/PhpPresentation/Tests/Shape/Chart/View3DTest.php @@ -27,7 +27,7 @@ */ class View3DTest extends TestCase { - public function testDepthPercent() + public function testDepthPercent(): void { $object = new View3D(); $value = mt_rand(20, 20000); @@ -38,7 +38,7 @@ public function testDepthPercent() $this->assertEquals($value, $object->getDepthPercent()); } - public function testHashIndex() + public function testHashIndex(): void { $object = new View3D(); $value = mt_rand(1, 100); @@ -48,7 +48,7 @@ public function testHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testHeightPercent() + public function testHeightPercent(): void { $object = new View3D(); $value = mt_rand(5, 500); @@ -59,7 +59,7 @@ public function testHeightPercent() $this->assertEquals($value, $object->getHeightPercent()); } - public function testPerspective() + public function testPerspective(): void { $object = new View3D(); $value = mt_rand(0, 100); @@ -70,7 +70,7 @@ public function testPerspective() $this->assertEquals($value, $object->getPerspective()); } - public function testRightAngleAxes() + public function testRightAngleAxes(): void { $object = new View3D(); @@ -82,7 +82,7 @@ public function testRightAngleAxes() $this->assertFalse($object->hasRightAngleAxes()); } - public function testRotationX() + public function testRotationX(): void { $object = new View3D(); $value = mt_rand(-90, 90); @@ -93,7 +93,7 @@ public function testRotationX() $this->assertEquals($value, $object->getRotationX()); } - public function testRotationY() + public function testRotationY(): void { $object = new View3D(); $value = mt_rand(-90, 90); diff --git a/tests/PhpPresentation/Tests/Shape/ChartTest.php b/tests/PhpPresentation/Tests/Shape/ChartTest.php index bf7a3226f1..ab8448884d 100644 --- a/tests/PhpPresentation/Tests/Shape/ChartTest.php +++ b/tests/PhpPresentation/Tests/Shape/ChartTest.php @@ -27,7 +27,7 @@ */ class ChartTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Chart(); @@ -38,7 +38,7 @@ public function testConstruct() } - public function testClone() + public function testClone(): void { $object = new Chart(); @@ -51,7 +51,7 @@ public function testClone() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Chart\\View3D', $oClone->getView3D()); } - public function testIncludeSpreadsheet() + public function testIncludeSpreadsheet(): void { $object = new Chart(); diff --git a/tests/PhpPresentation/Tests/Shape/Comment/AuthorTest.php b/tests/PhpPresentation/Tests/Shape/Comment/AuthorTest.php index 481a16b924..91e917b687 100644 --- a/tests/PhpPresentation/Tests/Shape/Comment/AuthorTest.php +++ b/tests/PhpPresentation/Tests/Shape/Comment/AuthorTest.php @@ -27,7 +27,7 @@ */ class AuthorTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Author(); @@ -36,7 +36,7 @@ public function testConstruct() $this->assertNull($object->getInitials()); } - public function testGetSetIndex() + public function testGetSetIndex(): void { $expectedVal = mt_rand(1, 100); @@ -46,7 +46,7 @@ public function testGetSetIndex() $this->assertEquals($expectedVal, $object->getIndex()); } - public function testGetSetInitials() + public function testGetSetInitials(): void { $expectedVal = 'AABBCCDD'; @@ -56,7 +56,7 @@ public function testGetSetInitials() $this->assertEquals($expectedVal, $object->getInitials()); } - public function testGetSetName() + public function testGetSetName(): void { $expectedVal = 'AABBCCDD'; diff --git a/tests/PhpPresentation/Tests/Shape/CommentTest.php b/tests/PhpPresentation/Tests/Shape/CommentTest.php index c979f992c1..0d3b8333db 100644 --- a/tests/PhpPresentation/Tests/Shape/CommentTest.php +++ b/tests/PhpPresentation/Tests/Shape/CommentTest.php @@ -18,6 +18,7 @@ namespace PhpOffice\PhpPresentation\Tests\Shape; use PhpOffice\PhpPresentation\Shape\Comment; +use PhpOffice\PhpPresentation\Shape\Comment\Author; use PHPUnit\Framework\TestCase; /** @@ -27,7 +28,7 @@ */ class CommentTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Comment(); @@ -38,45 +39,46 @@ public function testConstruct() $this->assertNull($object->getWidth()); } - public function testGetSetAuthor() + public function testGetSetAuthor(): void { $object = new Comment(); - $oStub = $this->getMockBuilder('PhpOffice\PhpPresentation\Shape\Comment\Author')->getMock(); + /** @var Author $oStub */ + $oStub = $this->getMockBuilder(Author::class)->getMock(); $this->assertNull($object->getAuthor()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Comment', $object->setAuthor($oStub)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Comment\\Author', $object->getAuthor()); + $this->assertInstanceOf(Comment::class, $object->setAuthor($oStub)); + $this->assertInstanceOf(Author::class, $object->getAuthor()); } - public function testGetSetDate() + public function testGetSetDate(): void { $expectedDate = time(); $object = new Comment(); $this->assertIsInt($object->getDate()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Comment', $object->setDate($expectedDate)); + $this->assertInstanceOf(Comment::class, $object->setDate($expectedDate)); $this->assertEquals($expectedDate, $object->getDate()); $this->assertIsInt($object->getDate()); } - public function testGetSetText() + public function testGetSetText(): void { $expectedText = 'AABBCCDD'; $object = new Comment(); $this->assertNull($object->getText()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Comment', $object->setText($expectedText)); + $this->assertInstanceOf(Comment::class, $object->setText($expectedText)); $this->assertEquals($expectedText, $object->getText()); } - public function testGetSetHeightAndWidtg() + public function testGetSetHeightAndWidtg(): void { $object = new Comment(); $this->assertNull($object->getHeight()); $this->assertNull($object->getWidth()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Comment', $object->setHeight(1)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Comment', $object->setWidth(1)); + $this->assertInstanceOf(Comment::class, $object->setHeight(1)); + $this->assertInstanceOf(Comment::class, $object->setWidth(1)); $this->assertNull($object->getHeight()); $this->assertNull($object->getWidth()); } diff --git a/tests/PhpPresentation/Tests/Shape/Drawing/Base64Test.php b/tests/PhpPresentation/Tests/Shape/Drawing/Base64Test.php index ab80194d4b..24c038c9fd 100644 --- a/tests/PhpPresentation/Tests/Shape/Drawing/Base64Test.php +++ b/tests/PhpPresentation/Tests/Shape/Drawing/Base64Test.php @@ -34,25 +34,28 @@ protected function setUp(): void DrawingTest::$getimagesizefromstringExists = true; } + /** + * @var string + */ protected $imageData = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAtAFAAMBIgACEQEDEQH/xAAcAAEAAwEBAQEBAAAAAAAAAAAABAUGAwcCAQj/xABdEAABAwICAwYQCgcGBQIFBQEAAQIDBAUGERIhMQcTFkFR0RQVIjU2VFVhcXORkpOxssEXMjRSU3KBlKHSIzM3QlZ0giRioqPC4aSz0+LwQ2QlY2XD8SZFR4OERv/EABsBAQACAwEBAAAAAAAAAAAAAAADBQIEBgEH/8QAQREAAQMCBAMDCgUDAwQDAQEAAAECAwQREiExUQUTQRRhcSIyM1KBkaGxwfAVIzRC0TZy4QZT8RYkkqIlQ2KCNf/aAAwDAQACEQMRAD8A+eklo7l0f3dnMOklo7l0f3dnMTQddy2bIVeJ25C6SWjuXR/d2cw6SWjuXR/d2cxNA5bNkPMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7t5iaBy2bIMTtzhT0VJSaXQtLDBp5aW9xo3PLlyO4BkiImh5cAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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'; - public function testData() + public function testData(): void { $oDrawing = new Base64(); - $this->assertNull($oDrawing->getData()); + $this->assertEmpty($oDrawing->getData()); $oDrawing->setData($this->imageData); $this->assertNotEmpty($oDrawing->getData()); } - public function testExtension() + public function testExtension(): void { $oDrawing = new Base64(); $oDrawing->setData($this->imageData); $this->assertEquals('jpg', $oDrawing->getExtension()); } - public function testExtensionException() + public function testExtensionException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Type Mime not found : "fake/fake"'); @@ -64,14 +67,14 @@ public function testExtensionException() $oDrawing->getExtension(); } - public function testMimeType() + public function testMimeType(): void { $oDrawing = new Base64(); $oDrawing->setData($this->imageData); $this->assertEquals('image/jpeg', $oDrawing->getMimeType()); } - public function testMimeTypeFunctionNotExists() + public function testMimeTypeFunctionNotExists(): void { DrawingTest::$getimagesizefromstringExists = false; $oDrawing = new Base64(); diff --git a/tests/PhpPresentation/Tests/Shape/Drawing/DrawingTest.php b/tests/PhpPresentation/Tests/Shape/Drawing/DrawingTest.php index deb3e04a8f..e6bf0089b7 100644 --- a/tests/PhpPresentation/Tests/Shape/Drawing/DrawingTest.php +++ b/tests/PhpPresentation/Tests/Shape/Drawing/DrawingTest.php @@ -19,7 +19,7 @@ use PhpOffice\PhpPresentation\Tests\Shape\Drawing\DrawingTest; -function function_exists($function) +function function_exists(string $function): bool { if ($function === 'getimagesizefromstring') { return DrawingTest::$getimagesizefromstringExists; @@ -35,9 +35,12 @@ function function_exists($function) // @codingStandardsIgnoreEnd class DrawingTest extends TestCase { + /** + * @var bool + */ public static $getimagesizefromstringExists = true; - public function testIgnore() + public function testIgnore(): void { } } diff --git a/tests/PhpPresentation/Tests/Shape/Drawing/FileTest.php b/tests/PhpPresentation/Tests/Shape/Drawing/FileTest.php index 209efd2bc9..0b90891ea8 100644 --- a/tests/PhpPresentation/Tests/Shape/Drawing/FileTest.php +++ b/tests/PhpPresentation/Tests/Shape/Drawing/FileTest.php @@ -27,13 +27,13 @@ */ class FileTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new File(); $this->assertEmpty($object->getPath()); } - public function testPathBasic() + public function testPathBasic(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('File not found!'); @@ -42,7 +42,7 @@ public function testPathBasic() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\File', $object->setPath()); } - public function testPathWithoutVerifyFile() + public function testPathWithoutVerifyFile(): void { $object = new File(); @@ -50,7 +50,7 @@ public function testPathWithoutVerifyFile() $this->assertEmpty($object->getPath()); } - public function testPathWithRealFile() + public function testPathWithRealFile(): void { $object = new File(); diff --git a/tests/PhpPresentation/Tests/Shape/Drawing/ZipFileTest.php b/tests/PhpPresentation/Tests/Shape/Drawing/ZipFileTest.php index 76a3ee215e..9c7a960e50 100644 --- a/tests/PhpPresentation/Tests/Shape/Drawing/ZipFileTest.php +++ b/tests/PhpPresentation/Tests/Shape/Drawing/ZipFileTest.php @@ -27,8 +27,19 @@ */ class ZipFileTest extends TestCase { + /** + * @var string + */ protected $fileOk; + + /** + * @var string + */ protected $fileKoZip; + + /** + * @var string + */ protected $fileKoFile; protected function setUp(): void @@ -42,7 +53,7 @@ protected function setUp(): void $this->fileKoFile = 'zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'Sample_01_Simple.pptx#ppt/media/filenotexists.gif'; } - public function testContentsException() + public function testContentsException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('fileNotExist.pptx does not exist'); @@ -52,21 +63,21 @@ public function testContentsException() $oDrawing->getContents(); } - public function testExtension() + public function testExtension(): void { $oDrawing = new ZipFile(); $oDrawing->setPath($this->fileOk); $this->assertEquals('gif', $oDrawing->getExtension()); } - public function testMimeType() + public function testMimeType(): void { $oDrawing = new ZipFile(); $oDrawing->setPath($this->fileOk); $this->assertEquals('image/gif', $oDrawing->getMimeType()); } - public function testMimeTypeFunctionNotExists() + public function testMimeTypeFunctionNotExists(): void { DrawingTest::$getimagesizefromstringExists = false; $oDrawing = new ZipFile(); diff --git a/tests/PhpPresentation/Tests/Shape/GroupTest.php b/tests/PhpPresentation/Tests/Shape/GroupTest.php index 9be88952e2..36f7d29978 100644 --- a/tests/PhpPresentation/Tests/Shape/GroupTest.php +++ b/tests/PhpPresentation/Tests/Shape/GroupTest.php @@ -28,7 +28,7 @@ */ class GroupTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Group(); @@ -41,7 +41,7 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Group', $object->setHeight(rand(1, 100))); } - public function testAdd() + public function testAdd(): void { $object = new Group(); @@ -53,7 +53,7 @@ public function testAdd() $this->assertEquals(5, $object->getShapeCollection()->count()); } - public function testExtentX() + public function testExtentX(): void { $object = new Group(); $line1 = new Line(10, 20, 30, 50); @@ -62,7 +62,7 @@ public function testExtentX() $this->assertEquals(20, $object->getExtentX()); } - public function testExtentY() + public function testExtentY(): void { $object = new Group(); $line1 = new Line(10, 20, 30, 50); @@ -71,7 +71,7 @@ public function testExtentY() $this->assertEquals(30, $object->getExtentY()); } - public function testOffsetX() + public function testOffsetX(): void { $object = new Group(); $line1 = new Line(10, 20, 30, 50); @@ -83,7 +83,7 @@ public function testOffsetX() $this->assertEquals(10, $object->getOffsetX()); } - public function testOffsetY() + public function testOffsetY(): void { $object = new Group(); $line1 = new Line(10, 20, 30, 50); @@ -95,7 +95,7 @@ public function testOffsetY() $this->assertEquals(20, $object->getOffsetY()); } - public function testExtentsAndOffsetsForOneShape() + public function testExtentsAndOffsetsForOneShape(): void { // We record initial values here because // PhpOffice\PhpPresentation\Shape\Line subtracts the offsets @@ -117,7 +117,7 @@ public function testExtentsAndOffsetsForOneShape() $this->assertEquals($extentY, $object->getExtentY()); } - public function testExtentsAndOffsetsForTwoShapes() + public function testExtentsAndOffsetsForTwoShapes(): void { // Since Groups and Slides cache offsets and extents on first // calculation, this test is separate from the above. diff --git a/tests/PhpPresentation/Tests/Shape/HyperlinkTest.php b/tests/PhpPresentation/Tests/Shape/HyperlinkTest.php index 022d07383e..f28f1fde11 100644 --- a/tests/PhpPresentation/Tests/Shape/HyperlinkTest.php +++ b/tests/PhpPresentation/Tests/Shape/HyperlinkTest.php @@ -30,7 +30,7 @@ class HyperlinkTest extends TestCase /** * Test can read */ - public function testConstruct() + public function testConstruct(): void { $object = new Hyperlink(); $this->assertEmpty($object->getUrl()); @@ -48,7 +48,7 @@ public function testConstruct() /** * Test get hash code */ - public function testGetHashCode() + public function testGetHashCode(): void { $object = new Hyperlink(); $this->assertEquals(md5(get_class($object)), $object->getHashCode()); @@ -63,7 +63,7 @@ public function testGetHashCode() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Hyperlink(); $value = mt_rand(1, 100); @@ -71,7 +71,7 @@ public function testSetGetHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testGetSetSlideNumber() + public function testGetSetSlideNumber(): void { $object = new Hyperlink(); @@ -86,7 +86,7 @@ public function testGetSetSlideNumber() $this->assertEquals('ppaction://hlinksldjump', $object->getUrl()); } - public function testGetSetTooltip() + public function testGetSetTooltip(): void { $object = new Hyperlink(); @@ -97,7 +97,7 @@ public function testGetSetTooltip() $this->assertEquals('TEST', $object->getTooltip()); } - public function testGetSetUrl() + public function testGetSetUrl(): void { $object = new Hyperlink(); @@ -108,7 +108,7 @@ public function testGetSetUrl() $this->assertEquals('http://www.github.com', $object->getUrl()); } - public function testIsInternal() + public function testIsInternal(): void { $object = new Hyperlink(); diff --git a/tests/PhpPresentation/Tests/Shape/LineTest.php b/tests/PhpPresentation/Tests/Shape/LineTest.php index 030081d06e..5df80a761e 100644 --- a/tests/PhpPresentation/Tests/Shape/LineTest.php +++ b/tests/PhpPresentation/Tests/Shape/LineTest.php @@ -31,7 +31,7 @@ class LineTest extends TestCase /** * Test can read */ - public function testConstruct() + public function testConstruct(): void { $value = mt_rand(1, 100); $object = new Line($value, $value, $value, $value); diff --git a/tests/PhpPresentation/Tests/Shape/MediaTest.php b/tests/PhpPresentation/Tests/Shape/MediaTest.php index 76c9bcb6b7..f2c9ec3803 100644 --- a/tests/PhpPresentation/Tests/Shape/MediaTest.php +++ b/tests/PhpPresentation/Tests/Shape/MediaTest.php @@ -7,14 +7,14 @@ class MediaTest extends TestCase { - public function testInheritance() + public function testInheritance(): void { $object = new Media(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Drawing\\File', $object); } - public function testMimeType() + public function testMimeType(): void { $object = new Media(); $object->setPath('file.mp4', false); diff --git a/tests/PhpPresentation/Tests/Shape/PlaceholderTest.php b/tests/PhpPresentation/Tests/Shape/PlaceholderTest.php index 7c0bdbaaec..5eb7a02103 100644 --- a/tests/PhpPresentation/Tests/Shape/PlaceholderTest.php +++ b/tests/PhpPresentation/Tests/Shape/PlaceholderTest.php @@ -27,14 +27,14 @@ */ class PlaceholderTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Placeholder(Placeholder::PH_TYPE_BODY); $this->assertEquals(Placeholder::PH_TYPE_BODY, $object->getType()); $this->assertNull($object->getIdx()); } - public function testIdx() + public function testIdx(): void { $value = mt_rand(0, 100); @@ -44,7 +44,7 @@ public function testIdx() $this->assertEquals($value, $object->getIdx()); } - public function testType() + public function testType(): void { $rcPlaceholder = new \ReflectionClass('PhpOffice\PhpPresentation\Shape\Placeholder'); $arrayConstants = $rcPlaceholder->getConstants(); diff --git a/tests/PhpPresentation/Tests/Shape/RichText/BreakElementTest.php b/tests/PhpPresentation/Tests/Shape/RichText/BreakElementTest.php index bcdeb57a89..be53de79e6 100644 --- a/tests/PhpPresentation/Tests/Shape/RichText/BreakElementTest.php +++ b/tests/PhpPresentation/Tests/Shape/RichText/BreakElementTest.php @@ -30,7 +30,7 @@ class BreakElementTest extends TestCase /** * Test can read */ - public function testText() + public function testText(): void { $object = new BreakElement(); $this->assertEquals("\r\n", $object->getText()); @@ -40,13 +40,13 @@ public function testText() $this->assertEquals("\r\n", $object->getText()); } - public function testFont() + public function testFont(): void { $object = new BreakElement(); $this->assertNull($object->getFont()); } - public function testLanguage() + public function testLanguage(): void { $object = new BreakElement(); $this->assertNull($object->getLanguage()); @@ -57,7 +57,7 @@ public function testLanguage() /** * Test get/set hash index */ - public function testHashCode() + public function testHashCode(): void { $object = new BreakElement(); $this->assertEquals(md5(get_class($object)), $object->getHashCode()); diff --git a/tests/PhpPresentation/Tests/Shape/RichText/ParagraphTest.php b/tests/PhpPresentation/Tests/Shape/RichText/ParagraphTest.php index a944a97888..7f0a765cda 100644 --- a/tests/PhpPresentation/Tests/Shape/RichText/ParagraphTest.php +++ b/tests/PhpPresentation/Tests/Shape/RichText/ParagraphTest.php @@ -34,7 +34,7 @@ class ParagraphTest extends TestCase /** * Test can read */ - public function testConstruct() + public function testConstruct(): void { $object = new Paragraph(); $this->assertEmpty($object->getRichTextElements()); @@ -43,7 +43,7 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Bullet', $object->getBulletStyle()); } - public function testAlignment() + public function testAlignment(): void { $object = new Paragraph(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->getAlignment()); @@ -53,7 +53,7 @@ public function testAlignment() /** * Test get/set bullet style */ - public function testBulletStyle() + public function testBulletStyle(): void { $object = new Paragraph(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Bullet', $object->getBulletStyle()); @@ -66,7 +66,7 @@ public function testBulletStyle() /** * Test get/set font */ - public function testFont() + public function testFont(): void { $object = new Paragraph(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->getFont()); @@ -79,7 +79,7 @@ public function testFont() /** * Test get/set hashCode */ - public function testHashCode() + public function testHashCode(): void { $object = new Paragraph(); $oElement = new TextElement(); @@ -90,7 +90,7 @@ public function testHashCode() /** * Test get/set hashIndex */ - public function testHashIndex() + public function testHashIndex(): void { $object = new Paragraph(); $value = mt_rand(1, 100); @@ -101,7 +101,7 @@ public function testHashIndex() /** * Test get/set linespacing */ - public function testLineSpacing() + public function testLineSpacing(): void { $object = new Paragraph(); $valueExpected = mt_rand(1, 100); @@ -113,7 +113,7 @@ public function testLineSpacing() /** * Test get/set richTextElements */ - public function testRichTextElements() + public function testRichTextElements(): void { $object = new Paragraph(); $this->assertIsArray($object->getRichTextElements()); @@ -130,19 +130,10 @@ public function testRichTextElements() $this->assertCount(3, $object->getRichTextElements()); } - public function testRichTextElementsException() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Invalid \PhpOffice\PhpPresentation\Shape\RichText\TextElementInterface[] array passed.'); - - $object = new Paragraph(); - $object->setRichTextElements(1); - } - /** * Test text methods */ - public function testText() + public function testText(): void { $object = new Paragraph(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText\\Paragraph', $object->addText(new TextElement())); diff --git a/tests/PhpPresentation/Tests/Shape/RichText/RunTest.php b/tests/PhpPresentation/Tests/Shape/RichText/RunTest.php index eeb695a676..c379b034d3 100644 --- a/tests/PhpPresentation/Tests/Shape/RichText/RunTest.php +++ b/tests/PhpPresentation/Tests/Shape/RichText/RunTest.php @@ -31,7 +31,7 @@ class RunTest extends TestCase /** * Test can read */ - public function testConstruct() + public function testConstruct(): void { $object = new Run(); $this->assertEquals('', $object->getText()); @@ -42,14 +42,14 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->getFont()); } - public function testFont() + public function testFont(): void { $object = new Run(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText\\Run', $object->setFont(new Font())); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->getFont()); } - public function testLanguage() + public function testLanguage(): void { $object = new Run(); $this->assertNull($object->getLanguage()); @@ -57,7 +57,7 @@ public function testLanguage() $this->assertEquals('en-US', $object->getLanguage()); } - public function testText() + public function testText(): void { $object = new Run(); $this->assertEquals('', $object->getText()); @@ -73,7 +73,7 @@ public function testText() /** * Test get/set hash index */ - public function testHashCode() + public function testHashCode(): void { $object = new Run(); $this->assertEquals(md5($object->getFont()->getHashCode().get_class($object)), $object->getHashCode()); diff --git a/tests/PhpPresentation/Tests/Shape/RichText/TextElementTest.php b/tests/PhpPresentation/Tests/Shape/RichText/TextElementTest.php index 4174721cf1..44d20ee9fa 100644 --- a/tests/PhpPresentation/Tests/Shape/RichText/TextElementTest.php +++ b/tests/PhpPresentation/Tests/Shape/RichText/TextElementTest.php @@ -31,7 +31,7 @@ class TextElementTest extends TestCase /** * Test can read */ - public function testConstruct() + public function testConstruct(): void { $object = new TextElement(); $this->assertEquals('', $object->getText()); @@ -40,13 +40,13 @@ public function testConstruct() $this->assertEquals('AAA', $object->getText()); } - public function testFont() + public function testFont(): void { $object = new TextElement(); $this->assertNull($object->getFont()); } - public function testHyperlink() + public function testHyperlink(): void { $object = new TextElement(); $this->assertFalse($object->hasHyperlink()); @@ -59,7 +59,7 @@ public function testHyperlink() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Hyperlink', $object->getHyperlink()); } - public function testLanguage() + public function testLanguage(): void { $object = new TextElement(); $this->assertNull($object->getLanguage()); @@ -67,7 +67,7 @@ public function testLanguage() $this->assertEquals('en-US', $object->getLanguage()); } - public function testText() + public function testText(): void { $object = new TextElement(); $this->assertEquals('', $object->getText()); @@ -80,7 +80,7 @@ public function testText() /** * Test get/set hash index */ - public function testHashCode() + public function testHashCode(): void { $object = new TextElement(); $this->assertEquals(md5(get_class($object)), $object->getHashCode()); diff --git a/tests/PhpPresentation/Tests/Shape/RichTextTest.php b/tests/PhpPresentation/Tests/Shape/RichTextTest.php index c2629fdf3f..80dba0a5cb 100644 --- a/tests/PhpPresentation/Tests/Shape/RichTextTest.php +++ b/tests/PhpPresentation/Tests/Shape/RichTextTest.php @@ -29,14 +29,14 @@ */ class RichTextTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new RichText(); $this->assertEquals(0, $object->getActiveParagraphIndex()); $this->assertCount(1, $object->getParagraphs()); } - public function testActiveParagraph() + public function testActiveParagraph(): void { $object = new RichText(); $this->assertEquals(0, $object->getActiveParagraphIndex()); @@ -51,7 +51,7 @@ public function testActiveParagraph() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText\\Paragraph', $object->getParagraph($value)); } - public function testActiveParagraphException() + public function testActiveParagraphException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid paragraph count.'); @@ -60,7 +60,7 @@ public function testActiveParagraphException() $object->setActiveParagraph(1000); } - public function testGetParagraphException() + public function testGetParagraphException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid paragraph count.'); @@ -69,7 +69,7 @@ public function testGetParagraphException() $object->getParagraph(1000); } - public function testColumns() + public function testColumns(): void { $object = new RichText(); @@ -78,7 +78,7 @@ public function testColumns() $this->assertEquals($value, $object->getColumns()); } - public function testColumnsException() + public function testColumnsException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Number of columns should be 1-16'); @@ -87,7 +87,7 @@ public function testColumnsException() $object->setColumns(1000); } - public function testParagraphs() + public function testParagraphs(): void { $object = new RichText(); @@ -102,16 +102,7 @@ public function testParagraphs() $this->assertEquals(2, $object->getActiveParagraphIndex()); } - public function testParagraphsException() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Invalid \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] array passed.'); - - $object = new RichText(); - $object->setParagraphs(1000); - } - - public function testText() + public function testText(): void { $object = new RichText(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->addText()); @@ -132,7 +123,7 @@ public function testText() $this->assertEquals('ALPHA'."\r\n".'BETA', (string) $object); } - public function testGetSetAutoFit() + public function testGetSetAutoFit(): void { $object = new RichText(); @@ -143,14 +134,14 @@ public function testGetSetAutoFit() $this->assertEquals(RichText::AUTOFIT_NORMAL, $object->getAutoFit()); } - public function testGetSetHAutoShrink() + public function testGetSetHAutoShrink(): void { $object = new RichText(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkHorizontal()); $this->assertNull($object->hasAutoShrinkHorizontal()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkHorizontal(2)); + $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkHorizontal(null)); $this->assertNull($object->hasAutoShrinkHorizontal()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkHorizontal(true)); @@ -159,14 +150,14 @@ public function testGetSetHAutoShrink() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkHorizontal(false)); $this->assertFalse($object->hasAutoShrinkHorizontal()); } - public function testGetSetVAutoShrink() + public function testGetSetVAutoShrink(): void { $object = new RichText(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkVertical()); $this->assertNull($object->hasAutoShrinkVertical()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkVertical(2)); + $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkVertical(null)); $this->assertNull($object->hasAutoShrinkVertical()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\RichText', $object->setAutoShrinkVertical(true)); @@ -176,7 +167,7 @@ public function testGetSetVAutoShrink() $this->assertFalse($object->hasAutoShrinkVertical()); } - public function testGetSetHOverflow() + public function testGetSetHOverflow(): void { $object = new RichText(); @@ -187,7 +178,7 @@ public function testGetSetHOverflow() $this->assertEquals(RichText::OVERFLOW_CLIP, $object->getHorizontalOverflow()); } - public function testGetSetInset() + public function testGetSetInset(): void { $object = new RichText(); @@ -213,7 +204,7 @@ public function testGetSetInset() $this->assertEquals($value, $object->getInsetTop()); } - public function testGetSetUpright() + public function testGetSetUpright(): void { $object = new RichText(); @@ -227,7 +218,7 @@ public function testGetSetUpright() $this->assertFalse($object->isUpright()); } - public function testGetSetVertical() + public function testGetSetVertical(): void { $object = new RichText(); @@ -241,7 +232,7 @@ public function testGetSetVertical() $this->assertFalse($object->isVertical()); } - public function testGetSetVOverflow() + public function testGetSetVOverflow(): void { $object = new RichText(); @@ -252,7 +243,7 @@ public function testGetSetVOverflow() $this->assertEquals(RichText::OVERFLOW_CLIP, $object->getVerticalOverflow()); } - public function testGetSetWrap() + public function testGetSetWrap(): void { $object = new RichText(); @@ -263,7 +254,7 @@ public function testGetSetWrap() $this->assertEquals(RichText::WRAP_NONE, $object->getWrap()); } - public function testHashCode() + public function testHashCode(): void { $object = new RichText(); diff --git a/tests/PhpPresentation/Tests/Shape/Table/CellTest.php b/tests/PhpPresentation/Tests/Shape/Table/CellTest.php index 7c59ca6a7f..42acac0f83 100644 --- a/tests/PhpPresentation/Tests/Shape/Table/CellTest.php +++ b/tests/PhpPresentation/Tests/Shape/Table/CellTest.php @@ -34,7 +34,7 @@ class CellTest extends TestCase /** * Test can read */ - public function testConstruct() + public function testConstruct(): void { $object = new Cell(); $this->assertEquals(0, $object->getActiveParagraphIndex()); @@ -43,7 +43,7 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Borders', $object->getBorders()); } - public function testActiveParagraph() + public function testActiveParagraph(): void { $object = new Cell(); $this->assertEquals(0, $object->getActiveParagraphIndex()); @@ -63,7 +63,7 @@ public function testActiveParagraph() $this->assertCount(1, $object->getParagraphs()); } - public function testActiveParagraphException() + public function testActiveParagraphException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid paragraph count.'); @@ -72,7 +72,7 @@ public function testActiveParagraphException() $object->setActiveParagraph(1000); } - public function testGetParagraphException() + public function testGetParagraphException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid paragraph count.'); @@ -84,7 +84,7 @@ public function testGetParagraphException() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Cell(); $value = mt_rand(1, 100); @@ -92,7 +92,7 @@ public function testSetGetHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testText() + public function testText(): void { $object = new Cell(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Table\\Cell', $object->addText()); @@ -113,7 +113,7 @@ public function testText() $this->assertEquals('ALPHA'."\r\n".'BETA', (string) $object); } - public function testParagraphs() + public function testParagraphs(): void { $object = new Cell(); @@ -128,16 +128,7 @@ public function testParagraphs() $this->assertEquals(2, $object->getActiveParagraphIndex()); } - public function testParagraphsException() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('Invalid \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] array passed.'); - - $object = new Cell(); - $object->setParagraphs(1000); - } - - public function testGetSetBorders() + public function testGetSetBorders(): void { $object = new Cell(); @@ -145,7 +136,7 @@ public function testGetSetBorders() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Borders', $object->getBorders()); } - public function testGetSetColspan() + public function testGetSetColspan(): void { $object = new Cell(); @@ -157,7 +148,7 @@ public function testGetSetColspan() $this->assertEquals($value, $object->getColSpan()); } - public function testGetSetFill() + public function testGetSetFill(): void { $object = new Cell(); @@ -165,7 +156,7 @@ public function testGetSetFill() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getFill()); } - public function testGetSetRowspan() + public function testGetSetRowspan(): void { $object = new Cell(); @@ -177,7 +168,7 @@ public function testGetSetRowspan() $this->assertEquals($value, $object->getRowSpan()); } - public function testGetSetWidth() + public function testGetSetWidth(): void { $object = new Cell(); diff --git a/tests/PhpPresentation/Tests/Shape/Table/RowTest.php b/tests/PhpPresentation/Tests/Shape/Table/RowTest.php index 415840b3c0..fa90d96a8a 100644 --- a/tests/PhpPresentation/Tests/Shape/Table/RowTest.php +++ b/tests/PhpPresentation/Tests/Shape/Table/RowTest.php @@ -31,7 +31,7 @@ class RowTest extends TestCase /** * Test can read */ - public function testConstruct() + public function testConstruct(): void { $object = new Row(); $this->assertCount(1, $object->getCells()); @@ -43,7 +43,7 @@ public function testConstruct() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getFill()); } - public function testGetCell() + public function testGetCell(): void { $object = new Row(); @@ -51,7 +51,7 @@ public function testGetCell() $this->assertNull($object->getCell(1000, true)); } - public function testGetCellException() + public function testGetCellException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Cell number out of bounds.'); @@ -60,14 +60,14 @@ public function testGetCellException() $object->getCell(1); } - public function testNextCell() + public function testNextCell(): void { $object = new Row(2); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Table\\Cell', $object->nextCell()); } - public function testNextCellException() + public function testNextCellException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Cell count out of bounds.'); @@ -80,7 +80,7 @@ public function testNextCellException() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Row(); $value = mt_rand(1, 100); @@ -88,7 +88,7 @@ public function testSetGetHashIndex() $this->assertEquals($value, $object->getHashIndex()); } - public function testGetSetFill() + public function testGetSetFill(): void { $object = new Row(); @@ -96,7 +96,7 @@ public function testGetSetFill() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getFill()); } - public function testGetSetHeight() + public function testGetSetHeight(): void { $object = new Row(); diff --git a/tests/PhpPresentation/Tests/Shape/TableTest.php b/tests/PhpPresentation/Tests/Shape/TableTest.php index b6a66b3748..69ea97393e 100644 --- a/tests/PhpPresentation/Tests/Shape/TableTest.php +++ b/tests/PhpPresentation/Tests/Shape/TableTest.php @@ -27,14 +27,14 @@ */ class TableTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Table(); $this->assertEmpty($object->getRows()); $this->assertFalse($object->isResizeProportional()); } - public function testNumColums() + public function testNumColums(): void { $value = mt_rand(1, 100); $object = new Table(); @@ -44,7 +44,7 @@ public function testNumColums() $this->assertEquals($value, $object->getNumColumns()); } - public function testRows() + public function testRows(): void { $object = new Table(); @@ -55,7 +55,7 @@ public function testRows() $this->assertNull($object->getRow(1, true)); } - public function testGetRowException() + public function testGetRowException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Row number out of bounds.'); @@ -64,7 +64,7 @@ public function testGetRowException() $object->getRow(); } - public function testHashCode() + public function testHashCode(): void { $object = new Table(); $this->assertEquals(md5(get_class($object)), $object->getHashCode()); diff --git a/tests/PhpPresentation/Tests/Slide/AbstractSlideTest.php b/tests/PhpPresentation/Tests/Slide/AbstractSlideTest.php index ceec729242..67608b0b08 100644 --- a/tests/PhpPresentation/Tests/Slide/AbstractSlideTest.php +++ b/tests/PhpPresentation/Tests/Slide/AbstractSlideTest.php @@ -28,7 +28,7 @@ */ class AbstractSlideTest extends TestCase { - public function testCollection() + public function testCollection(): void { /** @var AbstractSlide $stub */ $stub = $this->getMockForAbstractClass('PhpOffice\\PhpPresentation\\Slide\\AbstractSlide'); diff --git a/tests/PhpPresentation/Tests/Slide/AnimationTest.php b/tests/PhpPresentation/Tests/Slide/AnimationTest.php index 1ef196fa2e..6a80b2e55a 100644 --- a/tests/PhpPresentation/Tests/Slide/AnimationTest.php +++ b/tests/PhpPresentation/Tests/Slide/AnimationTest.php @@ -17,6 +17,7 @@ namespace PhpOffice\PhpPresentation\Tests; +use PhpOffice\PhpPresentation\AbstractShape; use PhpOffice\PhpPresentation\Slide\Animation; use PHPUnit\Framework\TestCase; @@ -27,9 +28,10 @@ */ class AnimationTest extends TestCase { - public function testShape() + public function testShape(): void { - $oStub = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\AbstractShape'); + /** @var AbstractShape $oStub */ + $oStub = $this->getMockForAbstractClass(AbstractShape::class); $object = new Animation(); diff --git a/tests/PhpPresentation/Tests/Slide/Background/ColorTest.php b/tests/PhpPresentation/Tests/Slide/Background/ColorTest.php index 5dd7839a65..9f64af2dae 100644 --- a/tests/PhpPresentation/Tests/Slide/Background/ColorTest.php +++ b/tests/PhpPresentation/Tests/Slide/Background/ColorTest.php @@ -8,7 +8,7 @@ class ColorTest extends TestCase { - public function testColor() + public function testColor(): void { $object = new Color(); diff --git a/tests/PhpPresentation/Tests/Slide/Background/ImageTest.php b/tests/PhpPresentation/Tests/Slide/Background/ImageTest.php index 47015432e2..6665a60761 100644 --- a/tests/PhpPresentation/Tests/Slide/Background/ImageTest.php +++ b/tests/PhpPresentation/Tests/Slide/Background/ImageTest.php @@ -7,12 +7,12 @@ class ImageTest extends TestCase { - public function testColor() + public function testColor(): void { $object = new Image(); $imagePath = PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.'PhpPresentationLogo.png'; - $numSlide = mt_rand(1, 100); + $numSlide = (string) mt_rand(1, 100); $this->assertNull($object->getPath()); $this->assertEmpty($object->getFilename()); @@ -25,14 +25,14 @@ public function testColor() $this->assertEquals('png', $object->getExtension()); $this->assertEquals('background_' . $numSlide . '.png', $object->getIndexedFilename($numSlide)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Background\\Image', $object->setPath(null, false)); - $this->assertNull($object->getPath()); + $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Background\\Image', $object->setPath('', false)); + $this->assertEquals('', $object->getPath()); $this->assertEmpty($object->getFilename()); $this->assertEmpty($object->getExtension()); $this->assertEquals('background_' . $numSlide . '.', $object->getIndexedFilename($numSlide)); } - public function testPathException() + public function testPathException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('File not found :'); diff --git a/tests/PhpPresentation/Tests/Slide/Background/SchemeColorTest.php b/tests/PhpPresentation/Tests/Slide/Background/SchemeColorTest.php index 0689c2faaa..7da7cda099 100644 --- a/tests/PhpPresentation/Tests/Slide/Background/SchemeColorTest.php +++ b/tests/PhpPresentation/Tests/Slide/Background/SchemeColorTest.php @@ -8,7 +8,7 @@ class SchemeColorTest extends TestCase { - public function testBasic() + public function testBasic(): void { $oStyle = new StyleSchemeColor(); diff --git a/tests/PhpPresentation/Tests/Slide/IteratorTest.php b/tests/PhpPresentation/Tests/Slide/IteratorTest.php index 7ed6f53dcc..8524e09d3d 100644 --- a/tests/PhpPresentation/Tests/Slide/IteratorTest.php +++ b/tests/PhpPresentation/Tests/Slide/IteratorTest.php @@ -31,7 +31,7 @@ class IteratorTest extends TestCase { /** */ - public function testMethod() + public function testMethod(): void { $oPhpPresentation = new PhpPresentation(); $oPhpPresentation->addSlide(new Slide()); @@ -40,13 +40,13 @@ public function testMethod() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->current()); $this->assertEquals(0, $object->key()); - $this->assertNull($object->next()); + $object->next(); $this->assertEquals(1, $object->key()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->current()); $this->assertTrue($object->valid()); - $this->assertNull($object->next()); + $object->next(); $this->assertFalse($object->valid()); - $this->assertNull($object->rewind()); + $object->rewind(); $this->assertEquals(0, $object->key()); } } diff --git a/tests/PhpPresentation/Tests/Slide/NoteTest.php b/tests/PhpPresentation/Tests/Slide/NoteTest.php index 41c0553bbe..f242a48045 100644 --- a/tests/PhpPresentation/Tests/Slide/NoteTest.php +++ b/tests/PhpPresentation/Tests/Slide/NoteTest.php @@ -29,7 +29,7 @@ */ class NoteTest extends TestCase { - public function testParent() + public function testParent(): void { $object = new Note(); $this->assertNull($object->getParent()); @@ -40,7 +40,7 @@ public function testParent() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->getParent()); } - public function testExtent() + public function testExtent(): void { $object = new Note(); $this->assertNotNull($object->getExtentX()); @@ -49,13 +49,13 @@ public function testExtent() $this->assertNotNull($object->getExtentY()); } - public function testHashCode() + public function testHashCode(): void { $object = new Note(); $this->assertIsString($object->getHashCode()); } - public function testOffset() + public function testOffset(): void { $object = new Note(); $this->assertNotNull($object->getOffsetX()); @@ -64,7 +64,7 @@ public function testOffset() $this->assertNotNull($object->getOffsetY()); } - public function testShape() + public function testShape(): void { $object = new Note(); $this->assertEquals(0, $object->getShapeCollection()->count()); @@ -79,7 +79,7 @@ public function testShape() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Note(); $value = mt_rand(1, 100); diff --git a/tests/PhpPresentation/Tests/Slide/SlideLayoutTest.php b/tests/PhpPresentation/Tests/Slide/SlideLayoutTest.php index 368d5ee33a..620dbd815f 100644 --- a/tests/PhpPresentation/Tests/Slide/SlideLayoutTest.php +++ b/tests/PhpPresentation/Tests/Slide/SlideLayoutTest.php @@ -18,6 +18,7 @@ namespace PhpOffice\PhpPresentation\Tests; use PhpOffice\PhpPresentation\Slide\SlideLayout; +use PhpOffice\PhpPresentation\Slide\SlideMaster; use PHPUnit\Framework\TestCase; /** @@ -27,9 +28,10 @@ */ class SlideLayoutTest extends TestCase { - public function testBase() + public function testBase(): void { - $mockSlideMaster = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Slide\SlideMaster'); + /** @var SlideMaster $mockSlideMaster */ + $mockSlideMaster = $this->getMockForAbstractClass(SlideMaster::class); $object = new SlideLayout($mockSlideMaster); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\AbstractSlide', $object); @@ -37,10 +39,10 @@ public function testBase() $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\ColorMap', $object->colorMap); } - public function testLayoutName() + public function testLayoutName(): void { - // Mocks - $mockSlideMaster = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Slide\SlideMaster'); + /** @var SlideMaster $mockSlideMaster */ + $mockSlideMaster = $this->getMockForAbstractClass(SlideMaster::class); // Expected $expectedLayoutName = 'Title'.rand(1, 100); @@ -48,17 +50,17 @@ public function testLayoutName() $object = new SlideLayout($mockSlideMaster); $this->assertNull($object->getLayoutName()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\SlideLayout', $object->setLayoutName($expectedLayoutName)); + $this->assertInstanceOf(SlideLayout::class, $object->setLayoutName($expectedLayoutName)); $this->assertEquals($expectedLayoutName, $object->getLayoutName()); } - public function testSlideMaster() + public function testSlideMaster(): void { - // Mocks - $mockSlideMaster = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Slide\SlideMaster'); + /** @var SlideMaster $mockSlideMaster */ + $mockSlideMaster = $this->getMockForAbstractClass(SlideMaster::class); $object = new SlideLayout($mockSlideMaster); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\SlideMaster', $object->getSlideMaster()); + $this->assertInstanceOf(SlideMaster::class, $object->getSlideMaster()); } } diff --git a/tests/PhpPresentation/Tests/Slide/SlideMasterTest.php b/tests/PhpPresentation/Tests/Slide/SlideMasterTest.php index a5e48b0ed8..12e1a1a929 100644 --- a/tests/PhpPresentation/Tests/Slide/SlideMasterTest.php +++ b/tests/PhpPresentation/Tests/Slide/SlideMasterTest.php @@ -17,7 +17,11 @@ namespace PhpOffice\PhpPresentation\Tests; +use PhpOffice\PhpPresentation\Slide\Background\Color; +use PhpOffice\PhpPresentation\Slide\SlideLayout; use PhpOffice\PhpPresentation\Slide\SlideMaster; +use PhpOffice\PhpPresentation\Style\SchemeColor; +use PhpOffice\PhpPresentation\Style\TextStyle; use PHPUnit\Framework\TestCase; /** @@ -27,38 +31,43 @@ */ class SlideMasterTest extends TestCase { - public function testBase() + public function testBase(): void { $object = new SlideMaster(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\AbstractSlide', $object); $this->assertNull($object->getParent()); $this->assertInstanceOf('\\ArrayObject', $object->getShapeCollection()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\ColorMap', $object->colorMap); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Background\\Color', $object->getBackground()); - $this->assertEquals('FFFFFF', $object->getBackground()->getColor()->getRGB()); + /** @var Color $background */ + $background = $object->getBackground(); + $this->assertInstanceOf(Color::class, $background); + $this->assertEquals('FFFFFF', $background->getColor()->getRGB()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->getTextStyles()); } - public function testLayout() + public function testLayout(): void { $object = new SlideMaster(); // Mock Post - $mockSlideLayout = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Slide\SlideLayout', array($object)); + /** @var SlideLayout $mockSlideLayout */ + $mockSlideLayout = $this->getMockForAbstractClass(SlideLayout::class, array($object)); $this->assertEmpty($object->getAllSlideLayouts()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\SlideLayout', $object->createSlideLayout()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\SlideLayout', $object->addSlideLayout($mockSlideLayout)); + $this->assertInstanceOf(SlideLayout::class, $object->createSlideLayout()); + $this->assertInstanceOf(SlideLayout::class, $object->addSlideLayout($mockSlideLayout)); $this->assertCount(2, $object->getAllSlideLayouts()); } - public function testSchemeColors() + public function testSchemeColors(): void { // Mock Pre - $mockSchemeColorAccent1 = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Style\SchemeColor'); + /** @var SchemeColor $mockSchemeColorAccent1 */ + $mockSchemeColorAccent1 = $this->getMockForAbstractClass(SchemeColor::class); $mockSchemeColorAccent1->setValue('accent1'); $mockSchemeColorAccent1->setRGB('ABCDEF'); - $mockSchemeColorNew = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Style\SchemeColor'); + /** @var SchemeColor $mockSchemeColorNew */ + $mockSchemeColorNew = $this->getMockForAbstractClass(SchemeColor::class); $mockSchemeColorNew->setValue('new'); $mockSchemeColorNew->setRGB('ABCDEF'); @@ -74,10 +83,11 @@ public function testSchemeColors() $this->assertCount(13, $object->getAllSchemeColors()); } - public function testTextStyles() + public function testTextStyles(): void { // Mock Pre - $mockTextStyle = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Style\TextStyle'); + /** @var TextStyle $mockTextStyle */ + $mockTextStyle = $this->getMockForAbstractClass(TextStyle::class); $object = new SlideMaster(); diff --git a/tests/PhpPresentation/Tests/Slide/TransitionTest.php b/tests/PhpPresentation/Tests/Slide/TransitionTest.php index 6aa8e99403..d1b53032a1 100644 --- a/tests/PhpPresentation/Tests/Slide/TransitionTest.php +++ b/tests/PhpPresentation/Tests/Slide/TransitionTest.php @@ -27,7 +27,7 @@ */ class TransitionTest extends TestCase { - public function testSpeed() + public function testSpeed(): void { $object = new Transition(); $this->assertNull($object->getSpeed()); @@ -35,11 +35,11 @@ public function testSpeed() $this->assertEquals(Transition::SPEED_MEDIUM, $object->getSpeed()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setSpeed(Transition::SPEED_FAST)); $this->assertEquals(Transition::SPEED_FAST, $object->getSpeed()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setSpeed(rand(1, 1000))); + $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setSpeed('notagoodvalue')); $this->assertNull($object->getSpeed()); } - public function testManualTrigger() + public function testManualTrigger(): void { $object = new Transition(); $this->assertFalse($object->hasManualTrigger()); @@ -47,15 +47,11 @@ public function testManualTrigger() $this->assertFalse($object->hasManualTrigger()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setManualTrigger(true)); $this->assertTrue($object->hasManualTrigger()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setManualTrigger(null)); - $this->assertTrue($object->hasManualTrigger()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setManualTrigger(false)); $this->assertFalse($object->hasManualTrigger()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setManualTrigger(null)); - $this->assertFalse($object->hasManualTrigger()); } - public function testTimeTrigger() + public function testTimeTrigger(): void { $object = new Transition(); $this->assertFalse($object->hasTimeTrigger()); @@ -68,20 +64,12 @@ public function testTimeTrigger() $this->assertTrue($object->hasTimeTrigger()); $this->assertEquals($value, $object->getAdvanceTimeTrigger()); $value = mt_rand(1, 1000); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setTimeTrigger(null, $value)); - $this->assertTrue($object->hasTimeTrigger()); - $this->assertEquals($value, $object->getAdvanceTimeTrigger()); - $value = mt_rand(1, 1000); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setTimeTrigger(false, $value)); $this->assertFalse($object->hasTimeTrigger()); $this->assertNull($object->getAdvanceTimeTrigger()); - $value = mt_rand(1, 1000); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->setTimeTrigger(null, $value)); - $this->assertFalse($object->hasTimeTrigger()); - $this->assertNull($object->getAdvanceTimeTrigger()); } - public function testTransitionType() + public function testTransitionType(): void { $object = new Transition(); $this->assertNull($object->getTransitionType()); diff --git a/tests/PhpPresentation/Tests/SlideTest.php b/tests/PhpPresentation/Tests/SlideTest.php index 3a533bd805..85904c9db9 100644 --- a/tests/PhpPresentation/Tests/SlideTest.php +++ b/tests/PhpPresentation/Tests/SlideTest.php @@ -18,6 +18,8 @@ namespace PhpOffice\PhpPresentation\Tests; use PhpOffice\PhpPresentation\Slide; +use PhpOffice\PhpPresentation\Slide\AbstractBackground; +use PhpOffice\PhpPresentation\Slide\Animation; use PhpOffice\PhpPresentation\Slide\Transition; use PhpOffice\PhpPresentation\PhpPresentation; use PHPUnit\Framework\TestCase; @@ -29,7 +31,7 @@ */ class SlideTest extends TestCase { - public function testExtents() + public function testExtents(): void { $object = new Slide(); $this->assertNotNull($object->getExtentX()); @@ -38,7 +40,7 @@ public function testExtents() $this->assertNotNull($object->getExtentY()); } - public function testOffset() + public function testOffset(): void { $object = new Slide(); $this->assertNotNull($object->getOffsetX()); @@ -47,93 +49,95 @@ public function testOffset() $this->assertNotNull($object->getOffsetY()); } - public function testParent() + public function testParent(): void { $object = new Slide(); $this->assertNull($object->getParent()); $oPhpPresentation = new PhpPresentation(); $object = new Slide($oPhpPresentation); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PhpPresentation', $object->getParent()); + $this->assertInstanceOf(PhpPresentation::class, $object->getParent()); } - public function testSlideMasterId() + public function testSlideMasterId(): void { $value = mt_rand(1, 100); $object = new Slide(); $this->assertEquals(1, $object->getSlideMasterId()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setSlideMasterId()); + $this->assertInstanceOf(Slide::class, $object->setSlideMasterId()); $this->assertEquals(1, $object->getSlideMasterId()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setSlideMasterId($value)); + $this->assertInstanceOf(Slide::class, $object->setSlideMasterId($value)); $this->assertEquals($value, $object->getSlideMasterId()); } - public function testAnimations() + public function testAnimations(): void { - $oStub = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Slide\Animation'); + /** @var Animation $oStub */ + $oStub = $this->getMockForAbstractClass(Animation::class); $object = new Slide(); $this->assertIsArray($object->getAnimations()); $this->assertCount(0, $object->getAnimations()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->addAnimation($oStub)); + $this->assertInstanceOf(Slide::class, $object->addAnimation($oStub)); $this->assertIsArray($object->getAnimations()); $this->assertCount(1, $object->getAnimations()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setAnimations()); + $this->assertInstanceOf(Slide::class, $object->setAnimations()); $this->assertIsArray($object->getAnimations()); $this->assertCount(0, $object->getAnimations()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setAnimations(array($oStub))); + $this->assertInstanceOf(Slide::class, $object->setAnimations(array($oStub))); $this->assertIsArray($object->getAnimations()); $this->assertCount(1, $object->getAnimations()); } - public function testBackground() + public function testBackground(): void { - $oStub = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Slide\AbstractBackground'); + /** @var AbstractBackground $oStub */ + $oStub = $this->getMockForAbstractClass(AbstractBackground::class); $object = new Slide(); $this->assertNull($object->getBackground()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setBackground($oStub)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\AbstractBackground', $object->getBackground()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setBackground()); + $this->assertInstanceOf(Slide::class, $object->setBackground($oStub)); + $this->assertInstanceOf(AbstractBackground::class, $object->getBackground()); + $this->assertInstanceOf(Slide::class, $object->setBackground()); $this->assertNull($object->getBackground()); } - public function testGroup() + public function testGroup(): void { $object = new Slide(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Shape\\Group', $object->createGroup()); } - public function testName() + public function testName(): void { $object = new Slide(); $this->assertNull($object->getName()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setName('AAAA')); + $this->assertInstanceOf(Slide::class, $object->setName('AAAA')); $this->assertEquals('AAAA', $object->getName()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setName()); + $this->assertInstanceOf(Slide::class, $object->setName()); $this->assertNull($object->getName()); } - public function testTransition() + public function testTransition(): void { $object = new Slide(); $oTransition = new Transition(); $this->assertNull($object->getTransition()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setTransition()); + $this->assertInstanceOf(Slide::class, $object->setTransition()); $this->assertNull($object->getTransition()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setTransition($oTransition)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide\\Transition', $object->getTransition()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setTransition(null)); + $this->assertInstanceOf(Slide::class, $object->setTransition($oTransition)); + $this->assertInstanceOf(Transition::class, $object->getTransition()); + $this->assertInstanceOf(Slide::class, $object->setTransition(null)); $this->assertNull($object->getTransition()); } - public function testVisible() + public function testVisible(): void { $object = new Slide(); $this->assertTrue($object->isVisible()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setIsVisible(false)); + $this->assertInstanceOf(Slide::class, $object->setIsVisible(false)); $this->assertFalse($object->isVisible()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Slide', $object->setIsVisible()); + $this->assertInstanceOf(Slide::class, $object->setIsVisible()); $this->assertTrue($object->isVisible()); } } diff --git a/tests/PhpPresentation/Tests/Style/AlignmentTest.php b/tests/PhpPresentation/Tests/Style/AlignmentTest.php index 7cad39df9b..08c7407164 100644 --- a/tests/PhpPresentation/Tests/Style/AlignmentTest.php +++ b/tests/PhpPresentation/Tests/Style/AlignmentTest.php @@ -30,7 +30,7 @@ class AlignmentTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Alignment(); $this->assertEquals(Alignment::HORIZONTAL_LEFT, $object->getHorizontal()); @@ -47,7 +47,7 @@ public function testConstruct() /** * Test get/set horizontal */ - public function testSetGetHorizontal() + public function testSetGetHorizontal(): void { $object = new Alignment(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->setHorizontal('')); @@ -59,10 +59,10 @@ public function testSetGetHorizontal() /** * Test get/set vertical */ - public function testTextDirection() + public function testTextDirection(): void { $object = new Alignment(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->setTextDirection(null)); + $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->setTextDirection('')); $this->assertEquals(Alignment::TEXT_DIRECTION_HORIZONTAL, $object->getTextDirection()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->setTextDirection(Alignment::TEXT_DIRECTION_VERTICAL_90)); $this->assertEquals(Alignment::TEXT_DIRECTION_VERTICAL_90, $object->getTextDirection()); @@ -73,7 +73,7 @@ public function testTextDirection() /** * Test get/set vertical */ - public function testSetGetVertical() + public function testSetGetVertical(): void { $object = new Alignment(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Alignment', $object->setVertical('')); @@ -85,7 +85,7 @@ public function testSetGetVertical() /** * Test get/set min level exception */ - public function testSetGetLevelExceptionMin() + public function testSetGetLevelExceptionMin(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid value should be more than 0.'); @@ -97,7 +97,7 @@ public function testSetGetLevelExceptionMin() /** * Test get/set level */ - public function testSetGetLevel() + public function testSetGetLevel(): void { $object = new Alignment(); $value = mt_rand(1, 8); @@ -108,7 +108,7 @@ public function testSetGetLevel() /** * Test get/set indent */ - public function testSetGetIndent() + public function testSetGetIndent(): void { $object = new Alignment(); // != Alignment::HORIZONTAL_GENERAL @@ -132,7 +132,7 @@ public function testSetGetIndent() /** * Test get/set margin bottom */ - public function testSetGetMarginBottom() + public function testSetGetMarginBottom(): void { $object = new Alignment(); $value = mt_rand(0, 100); @@ -145,7 +145,7 @@ public function testSetGetMarginBottom() /** * Test get/set margin left */ - public function testSetGetMarginLeft() + public function testSetGetMarginLeft(): void { $object = new Alignment(); // != Alignment::HORIZONTAL_GENERAL @@ -169,7 +169,7 @@ public function testSetGetMarginLeft() /** * Test get/set margin right */ - public function testSetGetMarginRight() + public function testSetGetMarginRight(): void { $object = new Alignment(); // != Alignment::HORIZONTAL_GENERAL @@ -193,7 +193,7 @@ public function testSetGetMarginRight() /** * Test get/set margin top */ - public function testSetGetMarginTop() + public function testSetGetMarginTop(): void { $object = new Alignment(); $value = mt_rand(1, 100); @@ -206,9 +206,9 @@ public function testSetGetMarginTop() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { - $value = md5(rand(1, 100)); + $value = rand(1, 100); $object = new Alignment(); $object->setHashIndex($value); diff --git a/tests/PhpPresentation/Tests/Style/BorderTest.php b/tests/PhpPresentation/Tests/Style/BorderTest.php index 2638619639..b79d92dc52 100644 --- a/tests/PhpPresentation/Tests/Style/BorderTest.php +++ b/tests/PhpPresentation/Tests/Style/BorderTest.php @@ -31,7 +31,7 @@ class BorderTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Border(); $this->assertEquals(1, $object->getLineWidth()); @@ -44,7 +44,7 @@ public function testConstruct() /** * Test get/set color */ - public function testSetGetColor() + public function testSetGetColor(): void { $object = new Border(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Border', $object->setColor()); @@ -57,7 +57,7 @@ public function testSetGetColor() /** * Test get/set dash style */ - public function testSetGetDashStyle() + public function testSetGetDashStyle(): void { $object = new Border(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Border', $object->setDashStyle()); @@ -71,7 +71,7 @@ public function testSetGetDashStyle() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Border(); $value = mt_rand(1, 100); @@ -82,7 +82,7 @@ public function testSetGetHashIndex() /** * Test get/set line style */ - public function testSetGetLineStyle() + public function testSetGetLineStyle(): void { $object = new Border(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Border', $object->setLineStyle()); @@ -96,7 +96,7 @@ public function testSetGetLineStyle() /** * Test get/set line width */ - public function testSetGetLineWidth() + public function testSetGetLineWidth(): void { $object = new Border(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Border', $object->setLineWidth()); diff --git a/tests/PhpPresentation/Tests/Style/BordersTest.php b/tests/PhpPresentation/Tests/Style/BordersTest.php index 0d492d44ed..ea79546c73 100644 --- a/tests/PhpPresentation/Tests/Style/BordersTest.php +++ b/tests/PhpPresentation/Tests/Style/BordersTest.php @@ -31,7 +31,7 @@ class BordersTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Borders(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Border', $object->getBottom()); @@ -47,7 +47,7 @@ public function testConstruct() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Borders(); $value = mt_rand(1, 100); @@ -58,7 +58,7 @@ public function testSetGetHashIndex() /** * Test get/set hash code */ - public function testGetHashCode() + public function testGetHashCode(): void { $object = new Borders(); $this->assertEquals( diff --git a/tests/PhpPresentation/Tests/Style/BulletTest.php b/tests/PhpPresentation/Tests/Style/BulletTest.php index 85f1cfc3af..49fe37bb9c 100644 --- a/tests/PhpPresentation/Tests/Style/BulletTest.php +++ b/tests/PhpPresentation/Tests/Style/BulletTest.php @@ -31,7 +31,7 @@ class BulletTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Bullet(); $this->assertEquals(Bullet::TYPE_NONE, $object->getBulletType()); @@ -44,7 +44,7 @@ public function testConstruct() /** * Test get/set bullet char */ - public function testSetGetBulletChar() + public function testSetGetBulletChar(): void { $object = new Bullet(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Bullet', $object->setBulletChar()); @@ -56,7 +56,7 @@ public function testSetGetBulletChar() /** * Test get/set bullet color */ - public function testSetGetBulletColor() + public function testSetGetBulletColor(): void { $object = new Bullet(); @@ -75,7 +75,7 @@ public function testSetGetBulletColor() /** * Test get/set bullet font */ - public function testSetGetBulletFont() + public function testSetGetBulletFont(): void { $object = new Bullet(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Bullet', $object->setBulletFont()); @@ -89,7 +89,7 @@ public function testSetGetBulletFont() /** * Test get/set bullet numeric start at */ - public function testSetGetBulletNumericStartAt() + public function testSetGetBulletNumericStartAt(): void { $object = new Bullet(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Bullet', $object->setBulletNumericStartAt()); @@ -102,7 +102,7 @@ public function testSetGetBulletNumericStartAt() /** * Test get/set bullet numeric style */ - public function testSetGetBulletNumericStyle() + public function testSetGetBulletNumericStyle(): void { $object = new Bullet(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Bullet', $object->setBulletNumericStyle()); @@ -114,7 +114,7 @@ public function testSetGetBulletNumericStyle() /** * Test get/set bullet type */ - public function testSetGetBulletType() + public function testSetGetBulletType(): void { $object = new Bullet(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Bullet', $object->setBulletType()); @@ -126,7 +126,7 @@ public function testSetGetBulletType() /** * Test get/set has index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Bullet(); $value = mt_rand(1, 100); diff --git a/tests/PhpPresentation/Tests/Style/ColorMapTest.php b/tests/PhpPresentation/Tests/Style/ColorMapTest.php index d535151d23..0c96bd9211 100644 --- a/tests/PhpPresentation/Tests/Style/ColorMapTest.php +++ b/tests/PhpPresentation/Tests/Style/ColorMapTest.php @@ -22,14 +22,14 @@ class ColorMapTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new ColorMap(); $this->assertIsArray($object->getMapping()); $this->assertEquals(ColorMap::$mappingDefault, $object->getMapping()); } - public function testMapping() + public function testMapping(): void { $object = new ColorMap(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\ColorMap', $object->setMapping(array())); @@ -41,7 +41,7 @@ public function testMapping() $this->assertEquals(ColorMap::$mappingDefault, $object->getMapping()); } - public function testModifier() + public function testModifier(): void { $object = new ColorMap(); $key = array_rand(ColorMap::$mappingDefault); diff --git a/tests/PhpPresentation/Tests/Style/ColorTest.php b/tests/PhpPresentation/Tests/Style/ColorTest.php index 65045e7575..0128786113 100644 --- a/tests/PhpPresentation/Tests/Style/ColorTest.php +++ b/tests/PhpPresentation/Tests/Style/ColorTest.php @@ -30,7 +30,7 @@ class ColorTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Color(); $this->assertEquals(Color::COLOR_BLACK, $object->getARGB()); @@ -41,7 +41,7 @@ public function testConstruct() /** * Test Alpha */ - public function testAlpha() + public function testAlpha(): void { $randAlpha = mt_rand(0, 100); $object = new Color(); @@ -58,7 +58,7 @@ public function testAlpha() /** * Test get/set ARGB */ - public function testSetGetARGB() + public function testSetGetARGB(): void { $object = new Color(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Color', $object->setARGB()); @@ -72,7 +72,7 @@ public function testSetGetARGB() /** * Test get/set RGB */ - public function testSetGetRGB() + public function testSetGetRGB(): void { $object = new Color(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Color', $object->setRGB()); @@ -92,7 +92,7 @@ public function testSetGetRGB() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Color(); $value = mt_rand(1, 100); diff --git a/tests/PhpPresentation/Tests/Style/FillTest.php b/tests/PhpPresentation/Tests/Style/FillTest.php index a63c1ca166..55aa18e51a 100644 --- a/tests/PhpPresentation/Tests/Style/FillTest.php +++ b/tests/PhpPresentation/Tests/Style/FillTest.php @@ -31,7 +31,7 @@ class FillTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Fill(); $this->assertEquals(Fill::FILL_NONE, $object->getFillType()); @@ -45,7 +45,7 @@ public function testConstruct() /** * Test get/set end color */ - public function testSetGetEndColor() + public function testSetGetEndColor(): void { $object = new Fill(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->setEndColor()); @@ -58,7 +58,7 @@ public function testSetGetEndColor() /** * Test get/set fill type */ - public function testSetGetFillType() + public function testSetGetFillType(): void { $object = new Fill(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->setFillType()); @@ -70,7 +70,7 @@ public function testSetGetFillType() /** * Test get/set rotation */ - public function testSetGetRotation() + public function testSetGetRotation(): void { $object = new Fill(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->setRotation()); @@ -83,7 +83,7 @@ public function testSetGetRotation() /** * Test get/set start color */ - public function testSetGetStartColor() + public function testSetGetStartColor(): void { $object = new Fill(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->setStartColor()); @@ -96,7 +96,7 @@ public function testSetGetStartColor() /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Fill(); $value = mt_rand(1, 100); diff --git a/tests/PhpPresentation/Tests/Style/FontTest.php b/tests/PhpPresentation/Tests/Style/FontTest.php index c0d1b2b032..5bbc3ada80 100644 --- a/tests/PhpPresentation/Tests/Style/FontTest.php +++ b/tests/PhpPresentation/Tests/Style/FontTest.php @@ -31,7 +31,7 @@ class FontTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Font(); $this->assertEquals('Calibri', $object->getName()); @@ -47,41 +47,29 @@ public function testConstruct() $this->assertEquals(Color::COLOR_BLACK, $object->getColor()->getARGB()); } - /** - * Test get/set color - */ - public function testSetGetColorException() - { - $this->expectException(\Exception::class); - $this->expectExceptionMessage('$pValue must be an instance of \PhpOffice\PhpPresentation\Style\Color'); - - $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setColor()); - } - /** * Test get/set Character Spacing */ - public function testSetGetCharacterSpacing() + public function testSetGetCharacterSpacing(): void { $object = new Font(); $this->assertEquals(0, $object->getCharacterSpacing()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setCharacterSpacing(0)); + $this->assertInstanceOf(Font::class, $object->setCharacterSpacing(0)); $this->assertEquals(0, $object->getCharacterSpacing()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setCharacterSpacing(10)); + $this->assertInstanceOf(Font::class, $object->setCharacterSpacing(10)); $this->assertEquals(1000, $object->getCharacterSpacing()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setCharacterSpacing()); + $this->assertInstanceOf(Font::class, $object->setCharacterSpacing()); $this->assertEquals(0, $object->getCharacterSpacing()); } /** * Test get/set color */ - public function testSetGetColor() + public function testSetGetColor(): void { $object = new Font(); $this->assertEquals(Color::COLOR_BLACK, $object->getColor()->getARGB()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setColor(new Color(Color::COLOR_BLUE))); + $this->assertInstanceOf(Font::class, $object->setColor(new Color(Color::COLOR_BLUE))); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Color', $object->getColor()); $this->assertEquals(Color::COLOR_BLUE, $object->getColor()->getARGB()); } @@ -89,156 +77,144 @@ public function testSetGetColor() /** * Test get/set name */ - public function testSetGetName() + public function testSetGetName(): void { $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setName()); + $this->assertInstanceOf(Font::class, $object->setName()); $this->assertEquals('Calibri', $object->getName()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setName('')); + $this->assertInstanceOf(Font::class, $object->setName('')); $this->assertEquals('Calibri', $object->getName()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setName('Arial')); + $this->assertInstanceOf(Font::class, $object->setName('Arial')); $this->assertEquals('Arial', $object->getName()); } /** * Test get/set size */ - public function testSetGetSize() + public function testSetGetSize(): void { $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSize()); - $this->assertEquals(10, $object->getSize()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSize('')); + $this->assertInstanceOf(Font::class, $object->setSize()); $this->assertEquals(10, $object->getSize()); $value = mt_rand(1, 100); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSize($value)); + $this->assertInstanceOf(Font::class, $object->setSize($value)); $this->assertEquals($value, $object->getSize()); } /** * Test get/set underline */ - public function testSetGetUnderline() + public function testSetGetUnderline(): void { $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setUnderline()); + $this->assertInstanceOf(Font::class, $object->setUnderline()); $this->assertEquals(FONT::UNDERLINE_NONE, $object->getUnderline()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setUnderline('')); + $this->assertInstanceOf(Font::class, $object->setUnderline('')); $this->assertEquals(FONT::UNDERLINE_NONE, $object->getUnderline()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setUnderline(FONT::UNDERLINE_DASH)); + $this->assertInstanceOf(Font::class, $object->setUnderline(FONT::UNDERLINE_DASH)); $this->assertEquals(FONT::UNDERLINE_DASH, $object->getUnderline()); } /** * Test get/set bold */ - public function testSetIsBold() + public function testSetIsBold(): void { $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setBold()); + $this->assertInstanceOf(Font::class, $object->setBold()); $this->assertFalse($object->isBold()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setBold('')); + $this->assertInstanceOf(Font::class, $object->setBold(false)); $this->assertFalse($object->isBold()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setBold(false)); - $this->assertFalse($object->isBold()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setBold(true)); + $this->assertInstanceOf(Font::class, $object->setBold(true)); $this->assertTrue($object->isBold()); } /** * Test get/set italic */ - public function testSetIsItalic() + public function testSetIsItalic(): void { $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setItalic()); - $this->assertFalse($object->isItalic()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setItalic('')); + $this->assertInstanceOf(Font::class, $object->setItalic()); $this->assertFalse($object->isItalic()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setItalic(false)); + $this->assertInstanceOf(Font::class, $object->setItalic(false)); $this->assertFalse($object->isItalic()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setItalic(true)); + $this->assertInstanceOf(Font::class, $object->setItalic(true)); $this->assertTrue($object->isItalic()); } /** * Test get/set strikethrough */ - public function testSetIsStriketrough() + public function testSetIsStriketrough(): void { $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setStrikethrough()); + $this->assertInstanceOf(Font::class, $object->setStrikethrough()); $this->assertFalse($object->isStrikethrough()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setStrikethrough('')); + $this->assertInstanceOf(Font::class, $object->setStrikethrough(false)); $this->assertFalse($object->isStrikethrough()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setStrikethrough(false)); - $this->assertFalse($object->isStrikethrough()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setStrikethrough(true)); + $this->assertInstanceOf(Font::class, $object->setStrikethrough(true)); $this->assertTrue($object->isStrikethrough()); } /** * Test get/set subscript */ - public function testSetIsSubScript() + public function testSetIsSubScript(): void { $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript()); - $this->assertFalse($object->isSubScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript('')); + $this->assertInstanceOf(Font::class, $object->setSubScript()); $this->assertFalse($object->isSubScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript(false)); + $this->assertInstanceOf(Font::class, $object->setSubScript(false)); $this->assertFalse($object->isSubScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript(true)); + $this->assertInstanceOf(Font::class, $object->setSubScript(true)); $this->assertTrue($object->isSubScript()); // Test toggle of SubScript - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript(false)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript(false)); + $this->assertInstanceOf(Font::class, $object->setSubScript(false)); + $this->assertInstanceOf(Font::class, $object->setSuperScript(false)); $this->assertFalse($object->isSubScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript(true)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript(true)); + $this->assertInstanceOf(Font::class, $object->setSubScript(true)); + $this->assertInstanceOf(Font::class, $object->setSuperScript(true)); $this->assertFalse($object->isSubScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript(true)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript(false)); + $this->assertInstanceOf(Font::class, $object->setSubScript(true)); + $this->assertInstanceOf(Font::class, $object->setSuperScript(false)); $this->assertTrue($object->isSubScript()); } /** * Test get/set superscript */ - public function testSetIsSuperScript() + public function testSetIsSuperScript(): void { $object = new Font(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript()); - $this->assertFalse($object->isSuperScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript('')); + $this->assertInstanceOf(Font::class, $object->setSuperScript()); $this->assertFalse($object->isSuperScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript(false)); + $this->assertInstanceOf(Font::class, $object->setSuperScript(false)); $this->assertFalse($object->isSuperScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript(true)); + $this->assertInstanceOf(Font::class, $object->setSuperScript(true)); $this->assertTrue($object->isSuperScript()); // Test toggle of SubScript - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript(false)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript(false)); + $this->assertInstanceOf(Font::class, $object->setSuperScript(false)); + $this->assertInstanceOf(Font::class, $object->setSubScript(false)); $this->assertFalse($object->isSuperScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript(true)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript(true)); + $this->assertInstanceOf(Font::class, $object->setSuperScript(true)); + $this->assertInstanceOf(Font::class, $object->setSubScript(true)); $this->assertFalse($object->isSuperScript()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSuperScript(true)); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Font', $object->setSubScript(false)); + $this->assertInstanceOf(Font::class, $object->setSuperScript(true)); + $this->assertInstanceOf(Font::class, $object->setSubScript(false)); $this->assertTrue($object->isSuperScript()); } /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Font(); $value = mt_rand(1, 100); diff --git a/tests/PhpPresentation/Tests/Style/OutlineTest.php b/tests/PhpPresentation/Tests/Style/OutlineTest.php index ebeb75dcfd..81747f1175 100644 --- a/tests/PhpPresentation/Tests/Style/OutlineTest.php +++ b/tests/PhpPresentation/Tests/Style/OutlineTest.php @@ -31,7 +31,7 @@ class OutlineTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Outline(); $this->assertNull($object->getWidth()); @@ -41,7 +41,7 @@ public function testConstruct() /** * Test get/set fill */ - public function testSetGetFill() + public function testSetGetFill(): void { $object = new Outline(); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Fill', $object->getFill()); @@ -52,14 +52,12 @@ public function testSetGetFill() /** * Test get/set width */ - public function testSetGetWidth() + public function testSetGetWidth(): void { $object = new Outline(); $this->assertNull($object->getWidth()); $value = mt_rand(1, 100); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Outline', $object->setWidth($value)); $this->assertEquals($value, $object->getWidth()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Outline', $object->setWidth(1.5)); - $this->assertEquals(1, $object->getWidth()); } } diff --git a/tests/PhpPresentation/Tests/Style/ShadowTest.php b/tests/PhpPresentation/Tests/Style/ShadowTest.php index e82cdee6e2..4c69f23d62 100644 --- a/tests/PhpPresentation/Tests/Style/ShadowTest.php +++ b/tests/PhpPresentation/Tests/Style/ShadowTest.php @@ -31,7 +31,7 @@ class ShadowTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $object = new Shadow(); $this->assertFalse($object->isVisible()); @@ -39,7 +39,7 @@ public function testConstruct() $this->assertEquals(2, $object->getDistance()); $this->assertEquals(0, $object->getDirection()); $this->assertEquals(Shadow::SHADOW_BOTTOM_RIGHT, $object->getAlignment()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Color', $object->getColor()); + $this->assertInstanceOf(Color::class, $object->getColor()); $this->assertEquals(Color::COLOR_BLACK, $object->getColor()->getARGB()); $this->assertEquals(50, $object->getAlpha()); } @@ -47,84 +47,84 @@ public function testConstruct() /** * Test get/set alignment */ - public function testSetGetAlignment() + public function testSetGetAlignment(): void { $object = new Shadow(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setAlignment()); + $this->assertInstanceOf(Shadow::class, $object->setAlignment()); $this->assertEquals(Shadow::SHADOW_BOTTOM_RIGHT, $object->getAlignment()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setAlignment(Shadow::SHADOW_CENTER)); + $this->assertInstanceOf(Shadow::class, $object->setAlignment(Shadow::SHADOW_CENTER)); $this->assertEquals(Shadow::SHADOW_CENTER, $object->getAlignment()); } /** * Test get/set alpha */ - public function testSetGetAlpha() + public function testSetGetAlpha(): void { $object = new Shadow(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setAlpha()); + $this->assertInstanceOf(Shadow::class, $object->setAlpha()); $this->assertEquals(0, $object->getAlpha()); $value = mt_rand(1, 100); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setAlpha($value)); + $this->assertInstanceOf(Shadow::class, $object->setAlpha($value)); $this->assertEquals($value, $object->getAlpha()); } /** * Test get/set blur radius */ - public function testSetGetBlurRadius() + public function testSetGetBlurRadius(): void { $object = new Shadow(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setBlurRadius()); + $this->assertInstanceOf(Shadow::class, $object->setBlurRadius()); $this->assertEquals(6, $object->getBlurRadius()); $value = mt_rand(1, 100); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setBlurRadius($value)); + $this->assertInstanceOf(Shadow::class, $object->setBlurRadius($value)); $this->assertEquals($value, $object->getBlurRadius()); } /** * Test get/set color */ - public function testSetGetColor() + public function testSetGetColor(): void { $object = new Shadow(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setColor()); + $this->assertInstanceOf(Shadow::class, $object->setColor()); $this->assertNull($object->getColor()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setColor(new Color(Color::COLOR_BLUE))); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Color', $object->getColor()); + $this->assertInstanceOf(Shadow::class, $object->setColor(new Color(Color::COLOR_BLUE))); + $this->assertInstanceOf(Color::class, $object->getColor()); $this->assertEquals(Color::COLOR_BLUE, $object->getColor()->getARGB()); } /** * Test get/set direction */ - public function testSetGetDirection() + public function testSetGetDirection(): void { $object = new Shadow(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setDirection()); + $this->assertInstanceOf(Shadow::class, $object->setDirection()); $this->assertEquals(0, $object->getDirection()); $value = mt_rand(1, 100); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setDirection($value)); + $this->assertInstanceOf(Shadow::class, $object->setDirection($value)); $this->assertEquals($value, $object->getDirection()); } /** * Test get/set distance */ - public function testSetGetDistance() + public function testSetGetDistance(): void { $object = new Shadow(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setDistance()); + $this->assertInstanceOf(Shadow::class, $object->setDistance()); $this->assertEquals(2, $object->getDistance()); $value = mt_rand(1, 100); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setDistance($value)); + $this->assertInstanceOf(Shadow::class, $object->setDistance($value)); $this->assertEquals($value, $object->getDistance()); } /** * Test get/set hash index */ - public function testSetGetHashIndex() + public function testSetGetHashIndex(): void { $object = new Shadow(); $value = mt_rand(1, 100); @@ -135,14 +135,14 @@ public function testSetGetHashIndex() /** * Test get/set visible */ - public function testSetIsVisible() + public function testSetIsVisible(): void { $object = new Shadow(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setVisible()); + $this->assertInstanceOf(Shadow::class, $object->setVisible()); $this->assertFalse($object->isVisible()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setVisible(false)); + $this->assertInstanceOf(Shadow::class, $object->setVisible(false)); $this->assertFalse($object->isVisible()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\Shadow', $object->setVisible(true)); + $this->assertInstanceOf(Shadow::class, $object->setVisible(true)); $this->assertTrue($object->isVisible()); } } diff --git a/tests/PhpPresentation/Tests/Style/TextStyleTest.php b/tests/PhpPresentation/Tests/Style/TextStyleTest.php index 51bfbe889d..685eefafb2 100644 --- a/tests/PhpPresentation/Tests/Style/TextStyleTest.php +++ b/tests/PhpPresentation/Tests/Style/TextStyleTest.php @@ -20,15 +20,14 @@ use PhpOffice\PhpPresentation\Shape\RichText\Paragraph; use PhpOffice\PhpPresentation\Style\Alignment; use PhpOffice\PhpPresentation\Style\TextStyle; +use PhpOffice\PhpPresentation\Style\SchemeColor; use PHPUnit\Framework\TestCase; class TextStyleTest extends TestCase { - public function testConstructDefaultTrue() + public function testConstructDefaultTrue(): void { - /** - * @var \PhpOffice\PhpPresentation\Shape\RichText\Paragraph $oParagraph - */ + /** @var TextStyle $object */ $object = new TextStyle(); $arrayBodyStyle = $object->getBodyStyle(); @@ -43,8 +42,10 @@ public function testConstructDefaultTrue() $this->assertEquals((-324900 / 9525), $oParagraph->getAlignment()->getIndent()); $this->assertEquals(0, $oParagraph->getAlignment()->getMarginLeft()); $this->assertEquals(32, $oParagraph->getFont()->getSize()); - $this->assertInstanceOf('PhpOffice\PhpPresentation\Style\SchemeColor', $oParagraph->getFont()->getColor()); - $this->assertEquals('tx1', $oParagraph->getFont()->getColor()->getValue()); + /** @var SchemeColor $color */ + $color = $oParagraph->getFont()->getColor(); + $this->assertInstanceOf(SchemeColor::class, $color); + $this->assertEquals('tx1', $color->getValue()); $arrayOtherStyle = $object->getOtherStyle(); $this->assertIsArray($arrayOtherStyle); @@ -56,8 +57,10 @@ public function testConstructDefaultTrue() $this->assertInstanceOf('PhpOffice\PhpPresentation\Shape\RichText\Paragraph', $oParagraph); $this->assertEquals(Alignment::HORIZONTAL_CENTER, $oParagraph->getAlignment()->getHorizontal()); $this->assertEquals(10, $oParagraph->getFont()->getSize()); - $this->assertInstanceOf('PhpOffice\PhpPresentation\Style\SchemeColor', $oParagraph->getFont()->getColor()); - $this->assertEquals('tx1', $oParagraph->getFont()->getColor()->getValue()); + /** @var SchemeColor $color */ + $color = $oParagraph->getFont()->getColor(); + $this->assertInstanceOf(SchemeColor::class, $color); + $this->assertEquals('tx1', $color->getValue()); $arrayTitleStyle = $object->getTitleStyle(); $this->assertIsArray($arrayTitleStyle); @@ -69,11 +72,13 @@ public function testConstructDefaultTrue() $this->assertInstanceOf('PhpOffice\PhpPresentation\Shape\RichText\Paragraph', $oParagraph); $this->assertEquals(Alignment::HORIZONTAL_CENTER, $oParagraph->getAlignment()->getHorizontal()); $this->assertEquals(44, $oParagraph->getFont()->getSize()); - $this->assertInstanceOf('PhpOffice\PhpPresentation\Style\SchemeColor', $oParagraph->getFont()->getColor()); - $this->assertEquals('lt1', $oParagraph->getFont()->getColor()->getValue()); + /** @var SchemeColor $color */ + $color = $oParagraph->getFont()->getColor(); + $this->assertInstanceOf(SchemeColor::class, $color); + $this->assertEquals('lt1', $color->getValue()); } - public function testConstructDefaultFalse() + public function testConstructDefaultFalse(): void { $object = new TextStyle(false); @@ -85,14 +90,14 @@ public function testConstructDefaultFalse() $this->assertCount(0, $object->getTitleStyle()); } - public function testLevel() + public function testLevel(): void { $value = mt_rand(0, 9); $object = new TextStyle(false); $oParagraph = new Paragraph(); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setBodyStyleAtLvl($oParagraph, '')); - $this->assertNull($object->getBodyStyleAtLvl('')); + $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setBodyStyleAtLvl($oParagraph, null)); + $this->assertNull($object->getBodyStyleAtLvl(null)); $this->assertCount(0, $object->getBodyStyle()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setBodyStyleAtLvl($oParagraph, 10)); $this->assertNull($object->getBodyStyleAtLvl(10)); @@ -101,8 +106,8 @@ public function testLevel() $this->assertInstanceOf('PhpOffice\PhpPresentation\Shape\RichText\Paragraph', $object->getBodyStyleAtLvl($value)); $this->assertCount(1, $object->getBodyStyle()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setOtherStyleAtLvl($oParagraph, '')); - $this->assertNull($object->getOtherStyleAtLvl('')); + $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setOtherStyleAtLvl($oParagraph, null)); + $this->assertNull($object->getOtherStyleAtLvl(null)); $this->assertCount(0, $object->getOtherStyle()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setOtherStyleAtLvl($oParagraph, 10)); $this->assertNull($object->getOtherStyleAtLvl(10)); @@ -111,8 +116,8 @@ public function testLevel() $this->assertInstanceOf('PhpOffice\PhpPresentation\Shape\RichText\Paragraph', $object->getOtherStyleAtLvl($value)); $this->assertCount(1, $object->getOtherStyle()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setTitleStyleAtLvl($oParagraph, '')); - $this->assertNull($object->getTitleStyleAtLvl('')); + $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setTitleStyleAtLvl($oParagraph, null)); + $this->assertNull($object->getTitleStyleAtLvl(null)); $this->assertCount(0, $object->getTitleStyle()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Style\\TextStyle', $object->setTitleStyleAtLvl($oParagraph, 10)); $this->assertNull($object->getTitleStyleAtLvl(10)); diff --git a/tests/PhpPresentation/Tests/Writer/AbstractWriter.php b/tests/PhpPresentation/Tests/Writer/AbstractWriter.php index 2b94d31d91..64eed7b35a 100644 --- a/tests/PhpPresentation/Tests/Writer/AbstractWriter.php +++ b/tests/PhpPresentation/Tests/Writer/AbstractWriter.php @@ -17,6 +17,7 @@ namespace PhpOffice\PhpPresentation\Tests\Writer; +use PhpOffice\PhpPresentation\AbstractShape; use PhpOffice\PhpPresentation\Writer; /** @@ -28,10 +29,10 @@ class AbstractWriter extends Writer\AbstractWriter /** * public wrapper for protected method * - * @return \PhpOffice\PhpPresentation\Shape\AbstractDrawing[] All drawings in PhpPresentation + * @return AbstractShape[] All drawings in PhpPresentation * @throws \Exception */ - public function allDrawings() + public function allDrawings(): array { return parent::allDrawings(); } diff --git a/tests/PhpPresentation/Tests/Writer/AbstractWriterTest.php b/tests/PhpPresentation/Tests/Writer/AbstractWriterTest.php index 98ea647b89..6497bd8dab 100644 --- a/tests/PhpPresentation/Tests/Writer/AbstractWriterTest.php +++ b/tests/PhpPresentation/Tests/Writer/AbstractWriterTest.php @@ -17,7 +17,10 @@ namespace PhpOffice\PhpPresentation\Tests\Writer; +use PhpOffice\Common\Adapter\Zip\ZipInterface; use PhpOffice\PhpPresentation\PhpPresentation; +use PhpOffice\PhpPresentation\Tests\Writer\AbstractWriter as TestAbstractWriter; +use PhpOffice\PhpPresentation\Writer\AbstractWriter; use PHPUnit\Framework\TestCase; require 'AbstractWriter.php'; @@ -32,20 +35,22 @@ class AbstractWriterTest extends TestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { - $oStubWriter = $this->getMockForAbstractClass('PhpOffice\PhpPresentation\Writer\AbstractWriter'); - $oStubZip = $this->getMockForAbstractClass('PhpOffice\Common\Adapter\Zip\ZipInterface'); + /** @var AbstractWriter $oStubWriter */ + $oStubWriter = $this->getMockForAbstractClass(AbstractWriter::class); + /** @var ZipInterface $oStubZip */ + $oStubZip = $this->getMockForAbstractClass(ZipInterface::class); $this->assertNull($oStubWriter->getZipAdapter()); - $this->assertInstanceOf('PhpOffice\\PhpPresentation\\Writer\\AbstractWriter', $oStubWriter->setZipAdapter($oStubZip)); - $this->assertInstanceOf('PhpOffice\\Common\\Adapter\\Zip\\ZipInterface', $oStubWriter->getZipAdapter()); + $this->assertInstanceOf(AbstractWriter::class, $oStubWriter->setZipAdapter($oStubZip)); + $this->assertInstanceOf(ZipInterface::class, $oStubWriter->getZipAdapter()); } /** * Test all drawings method */ - public function testAllDrawingsIncludesMasterSlides() + public function testAllDrawingsIncludesMasterSlides(): void { $presentation = new PhpPresentation(); @@ -56,7 +61,8 @@ public function testAllDrawingsIncludesMasterSlides() $masterSlide = $masterSlides[0]; $masterSlide->createDrawingShape(); - $writer = $this->getMockForAbstractClass('PhpOffice\\PhpPresentation\\Tests\\Writer\\AbstractWriter'); + /** @var TestAbstractWriter $writer */ + $writer = $this->getMockForAbstractClass(TestAbstractWriter::class); $writer->setPhpPresentation($presentation); $drawings = $writer->allDrawings(); diff --git a/tests/PhpPresentation/Tests/Writer/ODPresentation/ContentTest.php b/tests/PhpPresentation/Tests/Writer/ODPresentation/ContentTest.php index d8cbda57c9..8495694ed8 100644 --- a/tests/PhpPresentation/Tests/Writer/ODPresentation/ContentTest.php +++ b/tests/PhpPresentation/Tests/Writer/ODPresentation/ContentTest.php @@ -14,7 +14,6 @@ use PhpOffice\PhpPresentation\Style\Color; use PhpOffice\PhpPresentation\Style\Fill; use PhpOffice\PhpPresentation\Tests\PhpPresentationTestCase; -use PhpOffice\PhpPresentation\Writer\ODPresentation; use PhpOffice\Common\Drawing; /** @@ -26,7 +25,7 @@ class ContentTest extends PhpPresentationTestCase { protected $writerName = 'ODPresentation'; - public function testDrawingWithHyperlink() + public function testDrawingWithHyperlink(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createDrawingShape(); @@ -39,7 +38,7 @@ public function testDrawingWithHyperlink() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testDrawingShapeFill() + public function testDrawingShapeFill(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createDrawingShape(); @@ -61,7 +60,7 @@ public function testDrawingShapeFill() $this->assertZipXmlAttributeEndsWith('content.xml', $element, 'draw:fill-color', $oColor->getRGB()); } - public function testComment() + public function testComment(): void { $expectedName = 'Name'; $expectedText = 'Text'; @@ -87,7 +86,7 @@ public function testComment() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testCommentWithoutAuthor() + public function testCommentWithoutAuthor(): void { $oComment = new Comment(); $this->oPresentation->getActiveSlide()->addShape($oComment); @@ -98,7 +97,7 @@ public function testCommentWithoutAuthor() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testFillGradientLinearRichText() + public function testFillGradientLinearRichText(): void { $oShape = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oShape->getFill()->setFillType(Fill::FILL_GRADIENT_LINEAR)->setStartColor(new Color('FFFF7700'))->setEndColor(new Color('FFFFFFFF')); @@ -113,7 +112,7 @@ public function testFillGradientLinearRichText() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testFillSolidRichText() + public function testFillSolidRichText(): void { $oShape = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oShape->getFill()->setFillType(Fill::FILL_SOLID)->setRotation(90)->setStartColor(new Color('FF4672A8'))->setEndColor(new Color('FF4672A8')); @@ -126,7 +125,7 @@ public function testFillSolidRichText() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testGroup() + public function testGroup(): void { $oShapeGroup = $this->oPresentation->getActiveSlide()->createGroup(); $oShape = $oShapeGroup->createDrawingShape(); @@ -140,7 +139,7 @@ public function testGroup() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testList() + public function testList(): void { $oRichText = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oRichText->getActiveParagraph()->getBulletStyle()->setBulletType(Bullet::TYPE_BULLET); @@ -158,7 +157,7 @@ public function testList() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testInnerList() + public function testInnerList(): void { $oRichText = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oRichText->getActiveParagraph()->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT)->setMarginLeft(25)->setIndent(-25); @@ -186,7 +185,7 @@ public function testInnerList() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testParagraphRichText() + public function testParagraphRichText(): void { $oRichText = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oRichText->createTextRun('Alpha'); @@ -205,7 +204,7 @@ public function testParagraphRichText() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testListWithRichText() + public function testListWithRichText(): void { $oRichText = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oRichText->getActiveParagraph()->getBulletStyle()->setBulletType(Bullet::TYPE_BULLET); @@ -221,7 +220,7 @@ public function testListWithRichText() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testMedia() + public function testMedia(): void { $expectedName = 'MyName'; $expectedWidth = mt_rand(1, 100); @@ -260,7 +259,7 @@ public function testMedia() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testNote() + public function testNote(): void { $oNote = $this->oPresentation->getActiveSlide()->getNote(); $oRichText = $oNote->createRichTextShape()->setHeight(300)->setWidth(600); @@ -273,7 +272,7 @@ public function testNote() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testRichTextAutoShrink() + public function testRichTextAutoShrink(): void { $oRichText1 = $this->oPresentation->getActiveSlide()->createRichTextShape(); @@ -303,7 +302,7 @@ public function testRichTextAutoShrink() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testRichTextRunLanguage() + public function testRichTextRunLanguage(): void { $oRichText = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oRun = $oRichText->createTextRun('MyText'); @@ -323,7 +322,7 @@ public function testRichTextRunLanguage() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testRichTextBorder() + public function testRichTextBorder(): void { $oRichText1 = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oRichText1->getBorder()->setColor(new Color('FF4672A8'))->setDashStyle(Border::DASH_SOLID)->setLineStyle(Border::LINE_NONE); @@ -360,7 +359,7 @@ public function testRichTextBorder() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testRichTextShadow() + public function testRichTextShadow(): void { $randAlpha = mt_rand(0, 100); $oRichText = $this->oPresentation->getActiveSlide()->createRichTextShape(); @@ -405,7 +404,7 @@ public function testRichTextShadow() } } - public function testSlideName() + public function testSlideName(): void { $element = '/office:document-content/office:body/office:presentation/draw:page'; @@ -429,7 +428,7 @@ public function testSlideName() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testStyleAlignment() + public function testStyleAlignment(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText1 = $oSlide->createRichTextShape(); @@ -485,7 +484,7 @@ public function testStyleAlignment() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testStyleFont() + public function testStyleFont(): void { $oRichText = $this->oPresentation->getActiveSlide()->createRichTextShape(); $oRun = $oRichText->createTextRun('Run1'); @@ -500,7 +499,7 @@ public function testStyleFont() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testTable() + public function testTable(): void { $oShape = $this->oPresentation->getActiveSlide()->createTableShape(); $oShape->createRow(); @@ -511,7 +510,7 @@ public function testTable() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testTableEmpty() + public function testTableEmpty(): void { $this->oPresentation->getActiveSlide()->createTableShape(); @@ -521,7 +520,7 @@ public function testTableEmpty() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testTableCellFill() + public function testTableCellFill(): void { $oColor = new Color(); $oColor->setRGB(Color::COLOR_BLUE); @@ -547,7 +546,7 @@ public function testTableCellFill() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTableWithColspan() + public function testTableWithColspan(): void { $value = mt_rand(2, 100); @@ -566,7 +565,7 @@ public function testTableWithColspan() /** * @link : https://github.com/PHPOffice/PHPPresentation/issues/70 */ - public function testTableWithHyperlink() + public function testTableWithHyperlink(): void { $oShape = $this->oPresentation->getActiveSlide()->createTableShape(4); $oShape->setHeight(200)->setWidth(600)->setOffsetX(150)->setOffsetY(300); @@ -583,7 +582,7 @@ public function testTableWithHyperlink() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testTableWithText() + public function testTableWithText(): void { $oRun = new Run(); $oRun->setText('Test'); @@ -603,7 +602,7 @@ public function testTableWithText() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testTransition() + public function testTransition(): void { $value = mt_rand(1000, 5000); @@ -809,7 +808,7 @@ public function testTransition() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testVisibility() + public function testVisibility(): void { $element = '/office:document-content/office:automatic-styles/style:style[@style:name=\'stylePage0\']/style:drawing-page-properties'; diff --git a/tests/PhpPresentation/Tests/Writer/ODPresentation/MetaInfManifestTest.php b/tests/PhpPresentation/Tests/Writer/ODPresentation/MetaInfManifestTest.php index b9da8fcc39..510f412b5d 100644 --- a/tests/PhpPresentation/Tests/Writer/ODPresentation/MetaInfManifestTest.php +++ b/tests/PhpPresentation/Tests/Writer/ODPresentation/MetaInfManifestTest.php @@ -16,7 +16,7 @@ class MetaInfManifestTest extends PhpPresentationTestCase { protected $writerName = 'ODPresentation'; - public function testDrawing() + public function testDrawing(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createDrawingShape(); @@ -29,7 +29,7 @@ public function testDrawing() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testDrawingException() + public function testDrawingException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('does not exist'); @@ -41,7 +41,7 @@ public function testDrawingException() $this->writePresentationFile($this->oPresentation, 'ODPresentation'); } - public function testMemoryDrawing() + public function testMemoryDrawing(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = new Drawing\Gd(); @@ -58,12 +58,12 @@ public function testMemoryDrawing() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testDrawingZip() + public function testDrawingZip(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = new Drawing\ZipFile(); - $oShape->setPath('zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'Sample_01_Simple.pptx#ppt/media/phppowerpoint_logo1.gif', false); + $oShape->setPath('zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'Sample_01_Simple.pptx#ppt/media/phppowerpoint_logo1.gif'); $oSlide->addShape($oShape); $element = '/manifest:manifest/manifest:file-entry[5]'; @@ -72,19 +72,19 @@ public function testDrawingZip() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testDrawingZipException() + public function testDrawingZipException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('does not exist'); $oShape = new Drawing\ZipFile(); - $oShape->setPath('zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'filedoesntexist.zip', false); + $oShape->setPath('zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'filedoesntexist.zip'); $this->oPresentation->getActiveSlide()->addShape($oShape); $this->writePresentationFile($this->oPresentation, 'ODPresentation'); } - public function testDrawingBase64() + public function testDrawingBase64(): void { $oShape = new Drawing\Base64(); $oShape->setData('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAtAFAAMBIgACEQEDEQH/xAAcAAEAAwEBAQEBAAAAAAAAAAAABAUGAwcCAQj/xABdEAABAwICAwYQCgcGBQIFBQEAAQIDBAUGERIhMQcTFkFR0RQVIjU2VFVhcXORkpOxssEXMjRSU3KBlKHSIzM3QlZ0giRioqPC4aSz0+LwQ2QlY2XD8SZFR4OERv/EABsBAQACAwEBAAAAAAAAAAAAAAADBQIEBgEH/8QAQREAAQMCBAMDCgUDAwQDAQEAAAECAwQREiExUQUTQRRhcSIyM1KBkaGxwfAVIzRC0TZy4QZT8RYkkqIlQ2KCNf/aAAwDAQACEQMRAD8A+eklo7l0f3dnMOklo7l0f3dnMTQddy2bIVeJ25C6SWjuXR/d2cw6SWjuXR/d2cxNA5bNkPMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7t5iaBy2bIMTtzhT0VJSaXQtLDBp5aW9xo3PLlyO4BkiImh5cAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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'); @@ -96,7 +96,7 @@ public function testDrawingBase64() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testSlideBackground() + public function testSlideBackground(): void { $oBkgImage = new Image(); $oBkgImage->setPath(PHPPRESENTATION_TESTS_BASE_DIR.'/resources/images/PhpPresentationLogo.png'); @@ -104,7 +104,7 @@ public function testSlideBackground() $element = '/manifest:manifest/manifest:file-entry[5]'; $this->assertZipXmlElementExists('META-INF/manifest.xml', $element); - $this->assertZipXmlAttributeEquals('META-INF/manifest.xml', $element, 'manifest:full-path', 'Pictures/' . str_replace(' ', '_', $oBkgImage->getIndexedFilename(0))); + $this->assertZipXmlAttributeEquals('META-INF/manifest.xml', $element, 'manifest:full-path', 'Pictures/' . str_replace(' ', '_', $oBkgImage->getIndexedFilename((string) 0))); $this->assertIsSchemaOpenDocumentValid('1.2'); } } diff --git a/tests/PhpPresentation/Tests/Writer/ODPresentation/ObjectsChartTest.php b/tests/PhpPresentation/Tests/Writer/ODPresentation/ObjectsChartTest.php index 19cc7e76b7..30c4b3a7fd 100644 --- a/tests/PhpPresentation/Tests/Writer/ODPresentation/ObjectsChartTest.php +++ b/tests/PhpPresentation/Tests/Writer/ODPresentation/ObjectsChartTest.php @@ -30,20 +30,20 @@ class ObjectsChartTest extends PhpPresentationTestCase protected $writerName = 'ODPresentation'; /** - * @var array + * @var array */ protected $seriesData = array( - 'A' => 1, - 'B' => 2, - 'C' => 4, - 'D' => 3, - 'E' => 2, + 'A' => '1', + 'B' => '2', + 'C' => '4', + 'D' => '3', + 'E' => '2', ); - public function testAxisFont() + public function testAxisFont(): void { $oShape = $this->oPresentation->getActiveSlide()->createChartShape(); - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oBar = new Bar(); $oBar->addSeries($oSeries); $oShape->getPlotArea()->setType($oBar); @@ -78,9 +78,9 @@ public function testAxisFont() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testLegend() + public function testLegend(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oLine = new Line(); $oLine->addSeries($oSeries); @@ -150,9 +150,9 @@ public function testLegend() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testSeries() + public function testSeries(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oPie = new Pie(); $oPie->addSeries($oSeries); $oChart = $this->oPresentation->getActiveSlide()->createChartShape(); @@ -212,7 +212,7 @@ public function testSeries() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTitleVisibility() + public function testTitleVisibility(): void { $oShape = $this->oPresentation->getActiveSlide()->createChartShape(); $oLine = new Line(); @@ -238,9 +238,9 @@ public function testTitleVisibility() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeArea() + public function testTypeArea(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->getFill()->setStartColor(new Color('FF93A9CE')); $oArea = new Area(); $oArea->addSeries($oSeries); @@ -264,11 +264,11 @@ public function testTypeArea() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeAxisBounds() + public function testTypeAxisBounds(): void { $value = mt_rand(0, 100); - $oSeries = new Series('Downloads', array('A' => 1, 'B' => 2, 'C' => 4, 'D' => 3, 'E' => 2)); + $oSeries = new Series('Downloads', array('A' => '1', 'B' => '2', 'C' => '4', 'D' => '3', 'E' => '2')); $oSeries->getFill()->setStartColor(new Color('FFAABBCC')); $oLine = new Line(); $oLine->addSeries($oSeries); @@ -317,9 +317,9 @@ public function testTypeAxisBounds() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeBar() + public function testTypeBar(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oSeries->getDataPointFill(0)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FF4672A8')); $oSeries->getDataPointFill(1)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FFAB4744')); @@ -350,10 +350,10 @@ public function testTypeBar() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeBarGroupingStacked() + public function testTypeBarGroupingStacked(): void { $oBar = new Bar(); - $oBar->addSeries(new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2))); + $oBar->addSeries(new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2'))); $oBar->setBarGrouping(Bar::GROUPING_STACKED); $oChart = $this->oPresentation->getActiveSlide()->createChartShape(); $oChart->getPlotArea()->setType($oBar); @@ -369,10 +369,10 @@ public function testTypeBarGroupingStacked() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeBarGroupingPercentStacked() + public function testTypeBarGroupingPercentStacked(): void { $oBar = new Bar(); - $oBar->addSeries(new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2))); + $oBar->addSeries(new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2'))); $oBar->setBarGrouping(Bar::GROUPING_PERCENTSTACKED); $oChart = $this->oPresentation->getActiveSlide()->createChartShape(); $oChart->getPlotArea()->setType($oBar); @@ -388,9 +388,9 @@ public function testTypeBarGroupingPercentStacked() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeBarHorizontal() + public function testTypeBarHorizontal(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oSeries->getDataPointFill(0)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FF4672A8')); $oSeries->getDataPointFill(1)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FFAB4744')); @@ -415,9 +415,9 @@ public function testTypeBarHorizontal() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeBar3D() + public function testTypeBar3D(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oSeries->getDataPointFill(0)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FF4672A8')); $oSeries->getDataPointFill(1)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FFAB4744')); @@ -446,9 +446,9 @@ public function testTypeBar3D() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeBar3DHorizontal() + public function testTypeBar3DHorizontal(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oSeries->getDataPointFill(0)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FF4672A8')); $oSeries->getDataPointFill(1)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FFAB4744')); @@ -475,7 +475,7 @@ public function testTypeBar3DHorizontal() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeDoughnut() + public function testTypeDoughnut(): void { // $randHoleSize = mt_rand(10, 90); $randSeparator = chr(mt_rand(ord('A'), ord('Z'))); @@ -514,9 +514,9 @@ public function testTypeDoughnut() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeLine() + public function testTypeLine(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oLine = new Line(); $oLine->addSeries($oSeries); @@ -551,7 +551,7 @@ public function testTypeLine() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeLineGridlines() + public function testTypeLineGridlines(): void { $arrayTests = array( array( @@ -596,13 +596,7 @@ public function testTypeLineGridlines() $oShape = $this->oPresentation->getActiveSlide()->createChartShape(); $oLine = new Line(); - $oLine->addSeries(new Series('Downloads', array( - 'A' => 1, - 'B' => 2, - 'C' => 4, - 'D' => 3, - 'E' => 2, - ))); + $oLine->addSeries(new Series('Downloads', $this->seriesData)); $oShape->getPlotArea()->setType($oLine); $oGridlines = new Gridlines(); $oGridlines->getOutline()->getFill()->setFillType(Fill::FILL_SOLID)->setStartColor($expectedColor); @@ -627,7 +621,7 @@ public function testTypeLineGridlines() } } - public function testTypeLineMarker() + public function testTypeLineMarker(): void { $expectedSymbol1 = Marker::SYMBOL_PLUS; $expectedSymbol2 = Marker::SYMBOL_DASH; @@ -641,13 +635,7 @@ public function testTypeLineMarker() $oShape = $this->oPresentation->getActiveSlide()->createChartShape(); $oLine = new Line(); - $oSeries = new Series('Downloads', array( - 'A' => 1, - 'B' => 2, - 'C' => 4, - 'D' => 3, - 'E' => 2, - )); + $oSeries = new Series('Downloads', $this->seriesData); $oSeries->getMarker()->setSymbol($expectedSymbol1)->setSize($expectedSize); $oLine->addSeries($oSeries); $oShape->getPlotArea()->setType($oLine); @@ -700,7 +688,7 @@ public function testTypeLineMarker() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeLineSeriesOutline() + public function testTypeLineSeriesOutline(): void { $expectedWidth = mt_rand(1, 100); $expectedWidthCm = number_format(CommonDrawing::pointsToCentimeters($expectedWidth), 3, '.', '').'cm'; @@ -716,13 +704,7 @@ public function testTypeLineSeriesOutline() $oShape = $this->oPresentation->getActiveSlide()->createChartShape(); $oShape->setResizeProportional(false)->setHeight(550)->setWidth(700)->setOffsetX(120)->setOffsetY(80); $oLine = new Line(); - $oSeries = new Series('Downloads', array( - 'A' => 1, - 'B' => 2, - 'C' => 4, - 'D' => 3, - 'E' => 2, - )); + $oSeries = new Series('Downloads', $this->seriesData); $oLine->addSeries($oSeries); $oShape->getPlotArea()->setType($oLine); @@ -749,9 +731,9 @@ public function testTypeLineSeriesOutline() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypePie() + public function testTypePie(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oSeries->getDataPointFill(0)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FF4672A8')); $oSeries->getDataPointFill(1)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FFAB4744')); @@ -780,9 +762,9 @@ public function testTypePie() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypePie3D() + public function testTypePie3D(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oSeries->getDataPointFill(0)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FF4672A8')); $oSeries->getDataPointFill(1)->setFillType(Fill::FILL_SOLID)->setStartColor(new Color('FFAB4744')); @@ -811,11 +793,11 @@ public function testTypePie3D() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypePie3DExplosion() + public function testTypePie3DExplosion(): void { $value = mt_rand(0, 100); - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oPie3D = new Pie3D(); $oPie3D->setExplosion($value); @@ -830,9 +812,9 @@ public function testTypePie3DExplosion() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeScatter() + public function testTypeScatter(): void { - $oSeries = new Series('Series', array('Jan' => 1, 'Feb' => 5, 'Mar' => 2)); + $oSeries = new Series('Series', array('Jan' => '1', 'Feb' => '5', 'Mar' => '2')); $oSeries->setShowSeriesName(true); $oScatter = new Scatter(); $oScatter->addSeries($oSeries); @@ -846,7 +828,7 @@ public function testTypeScatter() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeScatterMarker() + public function testTypeScatterMarker(): void { $expectedSymbol1 = Marker::SYMBOL_PLUS; $expectedSymbol2 = Marker::SYMBOL_DASH; @@ -859,13 +841,7 @@ public function testTypeScatterMarker() $oShape = $this->oPresentation->getActiveSlide()->createChartShape(); $oScatter = new Scatter(); - $oSeries = new Series('Downloads', array( - 'A' => 1, - 'B' => 2, - 'C' => 4, - 'D' => 3, - 'E' => 2, - )); + $oSeries = new Series('Downloads', $this->seriesData); $oSeries->getMarker()->setSymbol($expectedSymbol1)->setSize($expectedSize); $oScatter->addSeries($oSeries); $oShape->getPlotArea()->setType($oScatter); @@ -918,7 +894,7 @@ public function testTypeScatterMarker() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testTypeScatterSeriesOutline() + public function testTypeScatterSeriesOutline(): void { $expectedWidth = mt_rand(1, 100); $expectedWidthCm = number_format(CommonDrawing::pointsToCentimeters($expectedWidth), 3, '.', '').'cm'; @@ -933,13 +909,7 @@ public function testTypeScatterSeriesOutline() $oShape = $this->oPresentation->getActiveSlide()->createChartShape(); $oShape->setResizeProportional(false)->setHeight(550)->setWidth(700)->setOffsetX(120)->setOffsetY(80); $oScatter = new Scatter(); - $oSeries = new Series('Downloads', array( - 'A' => 1, - 'B' => 2, - 'C' => 4, - 'D' => 3, - 'E' => 2, - )); + $oSeries = new Series('Downloads', $this->seriesData); $oScatter->addSeries($oSeries); $oShape->getPlotArea()->setType($oScatter); diff --git a/tests/PhpPresentation/Tests/Writer/ODPresentation/StylesTest.php b/tests/PhpPresentation/Tests/Writer/ODPresentation/StylesTest.php index 69ce130205..e846148700 100644 --- a/tests/PhpPresentation/Tests/Writer/ODPresentation/StylesTest.php +++ b/tests/PhpPresentation/Tests/Writer/ODPresentation/StylesTest.php @@ -18,7 +18,7 @@ class StylesTest extends PhpPresentationTestCase { protected $writerName = 'ODPresentation'; - public function testDocumentLayout() + public function testDocumentLayout(): void { $element = "/office:document-styles/office:automatic-styles/style:page-layout/style:page-layout-properties"; @@ -39,7 +39,7 @@ public function testDocumentLayout() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testCustomDocumentLayout() + public function testCustomDocumentLayout(): void { $oDocumentLayout = new DocumentLayout(); $oDocumentLayout->setDocumentLayout(array('cx' => rand(1, 100),'cy' => rand(1, 100),)); @@ -56,7 +56,7 @@ public function testCustomDocumentLayout() $this->assertIsSchemaOpenDocumentValid('1.2'); } - public function testGradientTable() + public function testGradientTable(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createTableShape(); @@ -70,7 +70,7 @@ public function testGradientTable() $this->assertIsSchemaOpenDocumentNotValid('1.2'); } - public function testStrokeDash() + public function testStrokeDash(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText1 = $oSlide->createRichTextShape(); diff --git a/tests/PhpPresentation/Tests/Writer/ODPresentationTest.php b/tests/PhpPresentation/Tests/Writer/ODPresentationTest.php index 787479ce9f..321968611d 100644 --- a/tests/PhpPresentation/Tests/Writer/ODPresentationTest.php +++ b/tests/PhpPresentation/Tests/Writer/ODPresentationTest.php @@ -18,7 +18,7 @@ class ODPresentationTest extends PhpPresentationTestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { ; $this->oPresentation->getActiveSlide()->createDrawingShape(); @@ -32,7 +32,7 @@ public function testConstruct() /** * Test save */ - public function testSave() + public function testSave(): void { $filename = tempnam(sys_get_temp_dir(), 'PhpPresentation'); $imageFile = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/images/PhpPresentationLogo.png'; @@ -55,7 +55,7 @@ public function testSave() /** * Test get PhpPresentation exception */ - public function testSaveEmpty() + public function testSaveEmpty(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Filename is empty'); @@ -67,7 +67,7 @@ public function testSaveEmpty() /** * Test get PhpPresentation exception */ - public function testGetPhpPresentationException() + public function testGetPhpPresentationException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No PhpPresentation assigned.'); @@ -79,7 +79,7 @@ public function testGetPhpPresentationException() /** * Test set/get disk caching */ - public function testSetGetUseDiskCaching() + public function testSetGetUseDiskCaching(): void { $object = new ODPresentation($this->oPresentation); $this->assertFalse($object->hasDiskCaching()); @@ -92,7 +92,7 @@ public function testSetGetUseDiskCaching() /** * Test set/get disk caching exception */ - public function testSetUseDiskCachingException() + public function testSetUseDiskCachingException(): void { $this->expectException(\Exception::class); @@ -100,7 +100,7 @@ public function testSetUseDiskCachingException() $object->setUseDiskCaching(true, 'foo'); } - public function testFeatureThumbnail() + public function testFeatureThumbnail(): void { $imagePath = PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.'PhpPresentationLogo.png'; diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/CommentAuthorsTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/CommentAuthorsTest.php index 23ed3a4023..d06f8782f2 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/CommentAuthorsTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/CommentAuthorsTest.php @@ -9,7 +9,7 @@ class CommentAuthorsTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testComments() + public function testComments(): void { $expectedElement = '/p:cmAuthorLst/p:cmAuthor'; $expectedName = 'Name'; @@ -30,13 +30,13 @@ public function testComments() $this->assertIsSchemaECMA376Valid(); } - public function testWithoutComment() + public function testWithoutComment(): void { $this->assertZipFileNotExists('ppt/commentAuthors.xml'); $this->assertIsSchemaECMA376Valid(); } - public function testWithoutCommentAuthor() + public function testWithoutCommentAuthor(): void { $oComment = new Comment(); $this->oPresentation->getActiveSlide()->addShape($oComment); @@ -45,7 +45,7 @@ public function testWithoutCommentAuthor() $this->assertIsSchemaECMA376Valid(); } - public function testWithSameAuthor() + public function testWithSameAuthor(): void { $expectedElement = '/p:cmAuthorLst/p:cmAuthor'; diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsAppTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsAppTest.php index 03683ac2e8..c65774abff 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsAppTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsAppTest.php @@ -14,13 +14,13 @@ class DocPropsAppTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testRender() + public function testRender(): void { $this->assertZipFileExists('docProps/app.xml'); $this->assertIsSchemaECMA376Valid(); } - public function testCompany() + public function testCompany(): void { $expected = 'aAbBcDeE'; diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsCoreTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsCoreTest.php index 7fa2041157..01fb7284ac 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsCoreTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsCoreTest.php @@ -8,14 +8,14 @@ class DocPropsCoreTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testRender() + public function testRender(): void { $this->assertZipFileExists('docProps/core.xml'); $this->assertZipXmlElementNotExists('docProps/core.xml', '/cp:coreProperties/cp:contentStatus'); $this->assertIsSchemaECMA376Valid(); } - public function testDocumentProperties() + public function testDocumentProperties(): void { $expected = 'aAbBcDeE'; @@ -43,7 +43,7 @@ public function testDocumentProperties() $this->assertIsSchemaECMA376Valid(); } - public function testMarkAsFinalTrue() + public function testMarkAsFinalTrue(): void { $this->oPresentation->getPresentationProperties()->markAsFinal(true); @@ -52,7 +52,7 @@ public function testMarkAsFinalTrue() $this->assertIsSchemaECMA376Valid(); } - public function testMarkAsFinalFalse() + public function testMarkAsFinalFalse(): void { $this->oPresentation->getPresentationProperties()->markAsFinal(false); diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsCustomTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsCustomTest.php index 879e846ea4..dba9c54b01 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsCustomTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsCustomTest.php @@ -8,14 +8,14 @@ class DocPropsCustomTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testRender() + public function testRender(): void { $this->assertZipFileExists('docProps/custom.xml'); $this->assertZipXmlElementNotExists('docProps/custom.xml', '/Properties/property[@name="_MarkAsFinal"]'); $this->assertIsSchemaECMA376Valid(); } - public function testMarkAsFinalTrue() + public function testMarkAsFinalTrue(): void { $this->oPresentation->getPresentationProperties()->markAsFinal(true); @@ -26,7 +26,7 @@ public function testMarkAsFinalTrue() $this->assertIsSchemaECMA376Valid(); } - public function testMarkAsFinalFalse() + public function testMarkAsFinalFalse(): void { $this->oPresentation->getPresentationProperties()->markAsFinal(false); diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsThumbnailTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsThumbnailTest.php index a19e2038d6..59a31f67e4 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsThumbnailTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/DocPropsThumbnailTest.php @@ -12,13 +12,13 @@ class DocPropsThumbnailTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testRender() + public function testRender(): void { $this->assertZipFileNotExists('docProps/thumbnail.jpeg'); $this->assertIsSchemaECMA376Valid(); } - public function testFeatureThumbnail() + public function testFeatureThumbnail(): void { $imagePath = PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.'PhpPresentationLogo.png'; diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/LayoutPack/TemplateBasedTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/LayoutPack/TemplateBasedTest.php index 3b0afdc523..1c8740b4ac 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/LayoutPack/TemplateBasedTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/LayoutPack/TemplateBasedTest.php @@ -29,7 +29,7 @@ */ class TemplateBasedTest extends TestCase { - public function testFindLayout() + public function testFindLayout(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_00_01.pptx'; $templateBased = new TemplateBased($file); @@ -41,7 +41,7 @@ public function testFindLayout() } } - public function testFindLayoutException() + public function testFindLayoutException(): void { $this->expectException(\Exception::class); @@ -51,7 +51,7 @@ public function testFindLayoutException() $templateBased->findLayout($name); } - public function testFindLayoutId() + public function testFindLayoutId(): void { $file = PHPPRESENTATION_TESTS_BASE_DIR . '/resources/files/Sample_00_01.pptx'; $templateBased = new TemplateBased($file); @@ -63,7 +63,7 @@ public function testFindLayoutId() } } - public function testFindLayoutIdException() + public function testFindLayoutIdException(): void { $this->expectException(\Exception::class); @@ -73,7 +73,7 @@ public function testFindLayoutIdException() $templateBased->findLayoutId($name); } - public function testFindLayoutName() + public function testFindLayoutName(): void { $oLayout = new PackDefault(); foreach ($oLayout->getLayouts() as $keyLayout => $layout) { @@ -82,7 +82,7 @@ public function testFindLayoutName() } } - public function testFindLayoutNameException() + public function testFindLayoutNameException(): void { $this->expectException(\Exception::class); diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptChartsTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptChartsTest.php index 793615cda4..34df109edf 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptChartsTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptChartsTest.php @@ -28,19 +28,19 @@ class PptChartsTest extends PhpPresentationTestCase protected $writerName = 'PowerPoint2007'; /** - * @var array + * @var array */ protected $seriesData = array( - 'A' => 1, - 'B' => 2, - 'C' => 4, - 'D' => 3, - 'E' => 2, + 'A' => '1', + 'B' => '2', + 'C' => '4', + 'D' => '3', + 'E' => '2', ); - public function testPlotAreaBadType() + public function testPlotAreaBadType(): void { - $this->expectException(\Exception::class); + $this->expectException(Exception::class); $this->expectExceptionMessage('The chart type provided could not be rendered'); $oSlide = $this->oPresentation->getActiveSlide(); @@ -53,7 +53,7 @@ public function testPlotAreaBadType() $this->writePresentationFile($this->oPresentation, 'PowerPoint2007'); } - public function testTitleVisibilityTrue() + public function testTitleVisibilityTrue(): void { $element = '/c:chartSpace/c:chart/c:autoTitleDeleted'; @@ -73,7 +73,7 @@ public function testTitleVisibilityTrue() $this->assertIsSchemaECMA376Valid(); } - public function testTitleVisibilityFalse() + public function testTitleVisibilityFalse(): void { $element = '/c:chartSpace/c:chart/c:autoTitleDeleted'; @@ -90,7 +90,7 @@ public function testTitleVisibilityFalse() $this->assertIsSchemaECMA376Valid(); } - public function testAxisFont() + public function testAxisFont(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -131,7 +131,7 @@ public function testAxisFont() $this->assertIsSchemaECMA376Valid(); } - public function testAxisOutline() + public function testAxisOutline(): void { $expectedWidthX = 2; $expectedColorX = 'ABCDEF'; @@ -171,7 +171,7 @@ public function testAxisOutline() $this->assertIsSchemaECMA376Valid(); } - public function testAxisVisibilityFalse() + public function testAxisVisibilityFalse(): void { $element = '/c:chartSpace/c:chart/c:plotArea/c:catAx/c:delete'; @@ -189,7 +189,7 @@ public function testAxisVisibilityFalse() $this->assertIsSchemaECMA376Valid(); } - public function testAxisVisibilityTrue() + public function testAxisVisibilityTrue(): void { $element = '/c:chartSpace/c:chart/c:plotArea/c:catAx/c:delete'; @@ -207,7 +207,7 @@ public function testAxisVisibilityTrue() $this->assertIsSchemaECMA376Valid(); } - public function testTypeArea() + public function testTypeArea(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -228,7 +228,7 @@ public function testTypeArea() $this->assertIsSchemaECMA376Valid(); } - public function testTypeAxisBounds() + public function testTypeAxisBounds(): void { $value = mt_rand(0, 100); @@ -278,7 +278,7 @@ public function testTypeAxisBounds() $this->assertIsSchemaECMA376Valid(); } - public function testTypeAxisTickMark() + public function testTypeAxisTickMark(): void { $value = Axis::TICK_MARK_CROSS; @@ -332,7 +332,7 @@ public function testTypeAxisTickMark() $this->assertIsSchemaECMA376Valid(); } - public function testTypeAxisUnit() + public function testTypeAxisUnit(): void { $value = mt_rand(0, 100); @@ -382,7 +382,7 @@ public function testTypeAxisUnit() $this->assertIsSchemaECMA376Valid(); } - public function testTypeBar() + public function testTypeBar(): void { $valueGapWidthPercent = mt_rand(0, 500); $oSlide = $this->oPresentation->getActiveSlide(); @@ -415,7 +415,7 @@ public function testTypeBar() $this->assertIsSchemaECMA376Valid(); } - public function testTypeBar3D() + public function testTypeBar3D(): void { $valueGapWidthPercent = mt_rand(0, 500); $oSlide = $this->oPresentation->getActiveSlide(); @@ -448,7 +448,7 @@ public function testTypeBar3D() $this->assertIsSchemaECMA376Valid(); } - public function testTypeBar3DSubScript() + public function testTypeBar3DSubScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -465,7 +465,7 @@ public function testTypeBar3DSubScript() $this->assertIsSchemaECMA376Valid(); } - public function testTypeBar3DSuperScript() + public function testTypeBar3DSuperScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -482,7 +482,7 @@ public function testTypeBar3DSuperScript() $this->assertIsSchemaECMA376Valid(); } - public function testTypeDoughnut() + public function testTypeDoughnut(): void { $randHoleSize = mt_rand(10, 90); $randSeparator = chr(rand(ord('A'), ord('Z'))); @@ -537,7 +537,7 @@ public function testTypeDoughnut() $this->assertZipXmlElementEquals('ppt/charts/' . $oShape->getIndexedFilename(), $element, $randSeparator); } - public function testTypeBar3DBarDirection() + public function testTypeBar3DBarDirection(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -555,7 +555,7 @@ public function testTypeBar3DBarDirection() $this->assertIsSchemaECMA376Valid(); } - public function testTypeLine() + public function testTypeLine(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -577,7 +577,7 @@ public function testTypeLine() $this->assertIsSchemaECMA376Valid(); } - public function testTypeLineGridlines() + public function testTypeLineGridlines(): void { $arrayTests = array( array( @@ -614,11 +614,11 @@ public function testTypeLineGridlines() $oShape = $this->oPresentation->getActiveSlide()->createChartShape(); $oLine = new Line(); $oLine->addSeries(new Series('Downloads', array( - 'A' => 1, - 'B' => 2, - 'C' => 4, - 'D' => 3, - 'E' => 2, + 'A' => '1', + 'B' => '2', + 'C' => '4', + 'D' => '3', + 'E' => '2', ))); $oShape->getPlotArea()->setType($oLine); $oGridlines = new Gridlines(); @@ -640,7 +640,7 @@ public function testTypeLineGridlines() } } - public function testTypeLineMarker() + public function testTypeLineMarker(): void { do { $expectedSymbolKey = array_rand(Marker::$arraySymbol); @@ -693,7 +693,7 @@ public function testTypeLineMarker() $this->assertIsSchemaECMA376Valid(); } - public function testTypeLineSeriesOutline() + public function testTypeLineSeriesOutline(): void { $expectedWidth = mt_rand(1, 100); $expectedWidthEmu = Drawing::pixelsToEmu(Drawing::pointsToPixels($expectedWidth)); @@ -729,7 +729,7 @@ public function testTypeLineSeriesOutline() $this->assertIsSchemaECMA376Valid(); } - public function testTypeLineSubScript() + public function testTypeLineSubScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -747,7 +747,7 @@ public function testTypeLineSubScript() $this->assertIsSchemaECMA376Valid(); } - public function testTypeLineSuperScript() + public function testTypeLineSuperScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -765,7 +765,7 @@ public function testTypeLineSuperScript() $this->assertIsSchemaECMA376Valid(); } - public function testTypePie() + public function testTypePie(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -806,7 +806,7 @@ public function testTypePie() $this->assertIsSchemaECMA376Valid(); } - public function testTypePie3D() + public function testTypePie3D(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -835,7 +835,7 @@ public function testTypePie3D() $this->assertIsSchemaECMA376Valid(); } - public function testTypePie3DExplosion() + public function testTypePie3DExplosion(): void { $value = mt_rand(1, 100); @@ -855,7 +855,7 @@ public function testTypePie3DExplosion() $this->assertIsSchemaECMA376Valid(); } - public function testTypePie3DSubScript() + public function testTypePie3DSubScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -873,7 +873,7 @@ public function testTypePie3DSubScript() $this->assertIsSchemaECMA376Valid(); } - public function testTypePie3DSuperScript() + public function testTypePie3DSuperScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -891,7 +891,7 @@ public function testTypePie3DSuperScript() $this->assertIsSchemaECMA376Valid(); } - public function testTypeScatter() + public function testTypeScatter(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -925,7 +925,7 @@ public function testTypeScatter() $this->assertIsSchemaECMA376Valid(); } - public function testTypeScatterMarker() + public function testTypeScatterMarker(): void { do { $expectedSymbol = array_rand(Marker::$arraySymbol); @@ -978,7 +978,7 @@ public function testTypeScatterMarker() $this->assertIsSchemaECMA376Valid(); } - public function testTypeScatterSeparator() + public function testTypeScatterSeparator(): void { $expectedSeparator = ';'; $expectedElement = '/c:chartSpace/c:chart/c:plotArea/c:scatterChart/c:ser/c:dLbls/c:separator'; @@ -1001,7 +1001,7 @@ public function testTypeScatterSeparator() $this->assertIsSchemaECMA376Valid(); } - public function testTypeScatterSeriesOutline() + public function testTypeScatterSeriesOutline(): void { $expectedWidth = mt_rand(1, 100); $expectedWidthEmu = Drawing::pixelsToEmu(Drawing::pointsToPixels($expectedWidth)); @@ -1039,7 +1039,7 @@ public function testTypeScatterSeriesOutline() $this->assertIsSchemaECMA376Valid(); } - public function testTypeScatterSubScript() + public function testTypeScatterSubScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -1057,7 +1057,7 @@ public function testTypeScatterSubScript() $this->assertIsSchemaECMA376Valid(); } - public function testTypeScatterSuperScript() + public function testTypeScatterSuperScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createChartShape(); @@ -1075,7 +1075,7 @@ public function testTypeScatterSuperScript() $this->assertIsSchemaECMA376Valid(); } - public function testView3D() + public function testView3D(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oLine = new Line(); diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptCommentsTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptCommentsTest.php index 84a89f3fd0..daa745d6a3 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptCommentsTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptCommentsTest.php @@ -9,7 +9,7 @@ class PptCommentsTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testComments() + public function testComments(): void { $expectedElement = '/p:cmLst/p:cm'; @@ -23,7 +23,7 @@ public function testComments() $this->assertZipXmlAttributeEquals('ppt/comments/comment1.xml', $expectedElement, 'authorId', 0); $this->assertIsSchemaECMA376Valid(); } - public function testWithoutComment() + public function testWithoutComment(): void { $this->assertZipFileNotExists('ppt/comments/comment1.xml'); $this->assertIsSchemaECMA376Valid(); diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptMediaTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptMediaTest.php index abee1bc22e..4e1595c165 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptMediaTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptMediaTest.php @@ -14,7 +14,7 @@ class PptMediaTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testDrawing() + public function testDrawing(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createDrawingShape(); @@ -24,7 +24,7 @@ public function testDrawing() $this->assertIsSchemaECMA376Valid(); } - public function testDrawingException() + public function testDrawingException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('does not exist'); @@ -36,24 +36,24 @@ public function testDrawingException() $this->writePresentationFile($this->oPresentation, 'PowerPoint2007'); } - public function testDrawingZip() + public function testDrawingZip(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oDrawing = new Drawing\ZipFile(); - $oDrawing->setPath('zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'Sample_01_Simple.pptx#ppt/media/phppowerpoint_logo1.gif', false); + $oDrawing->setPath('zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files' . DIRECTORY_SEPARATOR.'Sample_01_Simple.pptx#ppt/media/phppowerpoint_logo1.gif'); $oSlide->addShape($oDrawing); $this->assertZipFileExists('ppt/media/' . $oDrawing->getIndexedFilename()); $this->assertIsSchemaECMA376Valid(); } - public function testDrawingZipException() + public function testDrawingZipException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('does not exist'); $oDrawing = new Drawing\ZipFile(); - $oDrawing->setPath('zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'filedoesntexist.zip#secondpath', false); + $oDrawing->setPath('zip://'.PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR.'filedoesntexist.zip#secondpath'); $oSlide = $this->oPresentation->getActiveSlide(); $oSlide->addShape($oDrawing); @@ -61,18 +61,18 @@ public function testDrawingZipException() $this->writePresentationFile($this->oPresentation, 'PowerPoint2007'); } - public function testDrawingBase64() + public function testDrawingBase64(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = new Drawing\Base64(); - $oShape->setData('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAtAFAAMBIgACEQEDEQH/xAAcAAEAAwEBAQEBAAAAAAAAAAAABAUGAwcCAQj/xABdEAABAwICAwYQCgcGBQIFBQEAAQIDBAUGERIhMQcTFkFR0RQVIjU2VFVhcXORkpOxssEXMjRSU3KBlKHSIzM3QlZ0giRioqPC4aSz0+LwQ2QlY2XD8SZFR4OERv/EABsBAQACAwEBAAAAAAAAAAAAAAADBQIEBgEH/8QAQREAAQMCBAMDCgUDAwQDAQEAAAECAwQREiExUQUTQRRhcSIyM1KBkaGxwfAVIzRC0TZy4QZT8RYkkqIlQ2KCNf/aAAwDAQACEQMRAD8A+eklo7l0f3dnMOklo7l0f3dnMTQddy2bIVeJ25C6SWjuXR/d2cw6SWjuXR/d2cxNA5bNkPMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7t5iaBy2bIMTtzhT0VJSaXQtLDBp5aW9xo3PLlyO4BkiImh5cAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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', false); + $oShape->setData('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIAtAFAAMBIgACEQEDEQH/xAAcAAEAAwEBAQEBAAAAAAAAAAAABAUGAwcCAQj/xABdEAABAwICAwYQCgcGBQIFBQEAAQIDBAUGERIhMQcTFkFR0RQVIjU2VFVhcXORkpOxssEXMjRSU3KBlKHSIzM3QlZ0giRioqPC4aSz0+LwQ2QlY2XD8SZFR4OERv/EABsBAQACAwEBAAAAAAAAAAAAAAADBQIEBgEH/8QAQREAAQMCBAMDCgUDAwQDAQEAAAECAwQREiExUQUTQRRhcSIyM1KBkaGxwfAVIzRC0TZy4QZT8RYkkqIlQ2KCNf/aAAwDAQACEQMRAD8A+eklo7l0f3dnMOklo7l0f3dnMTQddy2bIVeJ25C6SWjuXR/d2cw6SWjuXR/d2cxNA5bNkPMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7s5iaBy2bIMTtyF0ktHcuj+7s5h0ktHcuj+7t5iaBy2bIMTtzhT0VJSaXQtLDBp5aW9xo3PLlyO4BkiImh5cAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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'); $oSlide->addShape($oShape); $this->assertZipFileExists('ppt/media/' . $oShape->getIndexedFilename()); $this->assertIsSchemaECMA376Valid(); } - public function testMemoryDrawing() + public function testMemoryDrawing(): void { $gdImage = imagecreatetruecolor(140, 20); $textColor = imagecolorallocate($gdImage, 255, 255, 255); diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptPresPropsTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptPresPropsTest.php index fcc07381d8..5d4f047d1e 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptPresPropsTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptPresPropsTest.php @@ -8,7 +8,7 @@ class PptPresPropsTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testRender() + public function testRender(): void { $this->assertZipFileExists('ppt/presProps.xml'); $element = '/p:presentationPr/p:extLst/p:ext'; @@ -17,7 +17,7 @@ public function testRender() $this->assertIsSchemaECMA376Valid(); } - public function testLoopContinuously() + public function testLoopContinuously(): void { $this->assertZipFileExists('ppt/presProps.xml'); $element = '/p:presentationPr/p:showPr'; diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptPresentationTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptPresentationTest.php index 97496d2028..17bfe64ac6 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptPresentationTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptPresentationTest.php @@ -8,7 +8,7 @@ class PptPresentationTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testRender() + public function testRender(): void { $this->assertZipFileExists('ppt/presentation.xml'); $this->assertIsSchemaECMA376Valid(); diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptSlideMastersTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptSlideMastersTest.php index b27584a2a5..dd8c3cd7f0 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptSlideMastersTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptSlideMastersTest.php @@ -2,6 +2,10 @@ namespace PhpPresentation\Tests\Writer\PowerPoint2007; +use ArrayObject; +use DOMDocument; +use DOMElement; +use DOMXPath; use PhpOffice\PhpPresentation\Shape\Drawing\File as ShapeDrawingFile; use PhpOffice\PhpPresentation\Slide\SlideLayout; use PhpOffice\PhpPresentation\Slide\SlideMaster; @@ -15,11 +19,11 @@ */ class PptSlideMastersTest extends TestCase { - public function testWriteSlideMasterRelationships() + public function testWriteSlideMasterRelationships(): void { $writer = new PptSlideMasters(); - /** @var \PHPUnit_Framework_MockObject_MockObject|SlideMaster $slideMaster */ - $slideMaster = $this->getMockBuilder('PhpOffice\\PhpPresentation\\Slide\\SlideMaster') + /** @var \PHPUnit\Framework\MockObject\MockObject|SlideMaster $slideMaster */ + $slideMaster = $this->getMockBuilder(SlideMaster::class) ->setMethods(array('getAllSlideLayouts', 'getRelsIndex', 'getShapeCollection')) ->getMock(); @@ -29,7 +33,7 @@ public function testWriteSlideMasterRelationships() ->method('getAllSlideLayouts') ->will($this->returnValue($layouts)); - $collection = new \ArrayObject(); + $collection = new ArrayObject(); $collection[] = new ShapeDrawingFile(); $collection[] = new ShapeDrawingFile(); $collection[] = new ShapeDrawingFile(); @@ -40,19 +44,20 @@ public function testWriteSlideMasterRelationships() $data = $writer->writeSlideMasterRelationships($slideMaster); - $dom = new \DomDocument(); + $dom = new DOMDocument(); $dom->loadXml($data); - $xpath = new \DomXpath($dom); + $xpath = new DOMXPath($dom); $xpath->registerNamespace('r', 'http://schemas.openxmlformats.org/package/2006/relationships'); $list = $xpath->query('//r:Relationship'); $this->assertEquals(5, $list->length); - $this->assertEquals('rId1', $list->item(0)->getAttribute('Id')); - $this->assertEquals('rId2', $list->item(1)->getAttribute('Id')); - $this->assertEquals('rId3', $list->item(2)->getAttribute('Id')); - $this->assertEquals('rId4', $list->item(3)->getAttribute('Id')); - $this->assertEquals('rId5', $list->item(4)->getAttribute('Id')); + foreach (range(0, 4) as $id) { + /** @var DOMElement $domItem */ + $domItem = $list->item($id); + $this->assertInstanceOf(DOMElement::class, $domItem); + $this->assertEquals('rId' . (string) ($id + 1), $domItem->getAttribute('Id')); + } } } diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptSlidesTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptSlidesTest.php index de7e77dc62..30540758b8 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptSlidesTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptSlidesTest.php @@ -28,7 +28,7 @@ class PptSlideTest extends PhpPresentationTestCase /** * @link https://github.com/PHPOffice/PHPPresentation/issues/42 */ - public function testAlignmentShapeAuto() + public function testAlignmentShapeAuto(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createRichTextShape()->setWidth(400)->setHeight(400)->setOffsetX(100)->setOffsetY(100); @@ -43,7 +43,7 @@ public function testAlignmentShapeAuto() /** * @link https://github.com/PHPOffice/PHPPresentation/issues/42 */ - public function testAlignmentShapeBase() + public function testAlignmentShapeBase(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createRichTextShape()->setWidth(400)->setHeight(400)->setOffsetX(100)->setOffsetY(100); @@ -59,7 +59,7 @@ public function testAlignmentShapeBase() /** * @link https://github.com/PHPOffice/PHPPresentation/issues/35 */ - public function testAlignmentShapeBottom() + public function testAlignmentShapeBottom(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createRichTextShape()->setWidth(400)->setHeight(400)->setOffsetX(100)->setOffsetY(100); @@ -75,7 +75,7 @@ public function testAlignmentShapeBottom() /** * @link https://github.com/PHPOffice/PHPPresentation/issues/35 */ - public function testAlignmentShapeCenter() + public function testAlignmentShapeCenter(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createRichTextShape()->setWidth(400)->setHeight(400)->setOffsetX(100)->setOffsetY(100); @@ -91,7 +91,7 @@ public function testAlignmentShapeCenter() /** * @link https://github.com/PHPOffice/PHPPresentation/issues/35 */ - public function testAlignmentShapeTop() + public function testAlignmentShapeTop(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createRichTextShape()->setWidth(400)->setHeight(400)->setOffsetX(100)->setOffsetY(100); @@ -104,7 +104,7 @@ public function testAlignmentShapeTop() $this->assertIsSchemaECMA376Valid(); } - public function testAnimation() + public function testAnimation(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape1 = $oSlide->createRichTextShape(); @@ -123,7 +123,7 @@ public function testAnimation() $this->assertIsSchemaECMA376Valid(); } - public function testCommentRelationship() + public function testCommentRelationship(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oSlide->addShape(new Comment()); @@ -133,7 +133,7 @@ public function testCommentRelationship() $this->assertIsSchemaECMA376Valid(); } - public function testCommentInGroupRelationship() + public function testCommentInGroupRelationship(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oGroup = new Group(); @@ -145,7 +145,7 @@ public function testCommentInGroupRelationship() $this->assertIsSchemaECMA376Valid(); } - public function testDrawingWithHyperlink() + public function testDrawingWithHyperlink(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createDrawingShape(); @@ -158,7 +158,7 @@ public function testDrawingWithHyperlink() $this->assertIsSchemaECMA376Valid(); } - public function testDrawingShapeBorder() + public function testDrawingShapeBorder(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createDrawingShape(); @@ -171,7 +171,7 @@ public function testDrawingShapeBorder() $this->assertIsSchemaECMA376Valid(); } - public function testDrawingShapeFill() + public function testDrawingShapeFill(): void { $oColor = new Color(Color::COLOR_DARKRED); $oColor->setAlpha(mt_rand(0, 100)); @@ -190,7 +190,7 @@ public function testDrawingShapeFill() $this->assertIsSchemaECMA376Valid(); } - public function testDrawingShapeShadow() + public function testDrawingShapeShadow(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createDrawingShape(); @@ -202,7 +202,7 @@ public function testDrawingShapeShadow() $this->assertIsSchemaECMA376Valid(); } - public function testFillGradientLinearTable() + public function testFillGradientLinearTable(): void { $expected1 = 'E06B20'; $expected2 = strrev($expected1); @@ -228,7 +228,7 @@ public function testFillGradientLinearTable() /** * @link : https://github.com/PHPOffice/PHPPresentation/issues/61 */ - public function testFillGradientLinearRichText() + public function testFillGradientLinearRichText(): void { $expected1 = 'E06B20'; $expected2 = strrev($expected1); @@ -248,7 +248,7 @@ public function testFillGradientLinearRichText() $this->assertIsSchemaECMA376Valid(); } - public function testFillGradientPathTable() + public function testFillGradientPathTable(): void { $expected1 = 'E06B20'; $expected2 = strrev($expected1); @@ -274,7 +274,7 @@ public function testFillGradientPathTable() /** * @link : https://github.com/PHPOffice/PHPPresentation/issues/61 */ - public function testFillGradientPathText() + public function testFillGradientPathText(): void { $expected1 = 'E06B20'; $expected2 = strrev($expected1); @@ -294,7 +294,7 @@ public function testFillGradientPathText() $this->assertIsSchemaECMA376Valid(); } - public function testFillPatternTable() + public function testFillPatternTable(): void { $expected1 = 'E06B20'; $expected2 = strrev($expected1); @@ -317,7 +317,7 @@ public function testFillPatternTable() $this->assertIsSchemaECMA376Valid(); } - public function testFillSolidTable() + public function testFillSolidTable(): void { $expected = 'E06B20'; @@ -339,7 +339,7 @@ public function testFillSolidTable() /** * @link : https://github.com/PHPOffice/PHPPresentation/issues/61 */ - public function testFillSolidText() + public function testFillSolidText(): void { $expected = 'E06B20'; @@ -355,7 +355,7 @@ public function testFillSolidText() $this->assertIsSchemaECMA376Valid(); } - public function testHyperlink() + public function testHyperlink(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -367,7 +367,7 @@ public function testHyperlink() $this->assertIsSchemaECMA376Valid(); } - public function testHyperlinkInternal() + public function testHyperlinkInternal(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -380,7 +380,7 @@ public function testHyperlinkInternal() $this->assertIsSchemaECMA376Valid(); } - public function testListBullet() + public function testListBullet(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -410,7 +410,7 @@ public function testListBullet() $this->assertIsSchemaECMA376Valid(); } - public function testListNumeric() + public function testListNumeric(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -434,7 +434,7 @@ public function testListNumeric() $this->assertIsSchemaECMA376Valid(); } - public function testLine() + public function testLine(): void { $valEmu10 = Drawing::pixelsToEmu(10); $valEmu90 = Drawing::pixelsToEmu(90); @@ -461,7 +461,7 @@ public function testLine() $this->assertIsSchemaECMA376Valid(); } - public function testMedia() + public function testMedia(): void { $expectedName = 'MyName'; $expectedWidth = mt_rand(1, 100); @@ -494,14 +494,14 @@ public function testMedia() $this->assertIsSchemaECMA376Valid(); } - public function testNote() + public function testNote(): void { $oLayout = $this->oPresentation->getLayout(); $oSlide = $this->oPresentation->getActiveSlide(); $oNote = $oSlide->getNote(); $oRichText = $oNote->createRichTextShape() - ->setHeight($oLayout->getCY($oLayout::UNIT_PIXEL)) - ->setWidth($oLayout->getCX($oLayout::UNIT_PIXEL)) + ->setHeight((int) $oLayout->getCY($oLayout::UNIT_PIXEL)) + ->setWidth((int) $oLayout->getCX($oLayout::UNIT_PIXEL)) ->setOffsetX(170) ->setOffsetY(180); $oRichText->createTextRun('testNote'); @@ -543,7 +543,7 @@ public function testNote() $this->assertIsSchemaECMA376Valid(); } - public function testRichTextAutoFitNormal() + public function testRichTextAutoFitNormal(): void { $expectedFontScale = 47.5; $expectedLnSpcReduction = 20; @@ -560,7 +560,7 @@ public function testRichTextAutoFitNormal() $this->assertIsSchemaECMA376Valid(); } - public function testRichTextBreak() + public function testRichTextBreak(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -571,7 +571,7 @@ public function testRichTextBreak() $this->assertIsSchemaECMA376Valid(); } - public function testRichTextHyperlink() + public function testRichTextHyperlink(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -582,7 +582,7 @@ public function testRichTextHyperlink() $this->assertIsSchemaECMA376Valid(); } - public function testRichTextLineSpacing() + public function testRichTextLineSpacing(): void { $expectedLineSpacing = mt_rand(1, 100); @@ -597,7 +597,7 @@ public function testRichTextLineSpacing() $this->assertIsSchemaECMA376Valid(); } - public function testRichTextRunLanguage() + public function testRichTextRunLanguage(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -619,7 +619,7 @@ public function testRichTextRunLanguage() $this->assertIsSchemaECMA376Valid(); } - public function testRichTextShadow() + public function testRichTextShadow(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -631,7 +631,7 @@ public function testRichTextShadow() $this->assertIsSchemaECMA376Valid(); } - public function testRichTextUpright() + public function testRichTextUpright(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -644,7 +644,7 @@ public function testRichTextUpright() $this->assertIsSchemaECMA376Valid(); } - public function testRichTextVertical() + public function testRichTextVertical(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -657,13 +657,13 @@ public function testRichTextVertical() $this->assertIsSchemaECMA376Valid(); } - public function testSlideLayoutExists() + public function testSlideLayoutExists(): void { $this->assertZipFileExists('ppt/slideLayouts/slideLayout1.xml'); $this->assertIsSchemaECMA376Valid(); } - public function testStyleCharacterSpacing() + public function testStyleCharacterSpacing(): void { $element = '/p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:p/a:r/a:rPr'; @@ -684,7 +684,7 @@ public function testStyleCharacterSpacing() $this->assertIsSchemaECMA376Valid(); } - public function testStyleSubScript() + public function testStyleSubScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -697,7 +697,7 @@ public function testStyleSubScript() $this->assertIsSchemaECMA376Valid(); } - public function testStyleSuperScript() + public function testStyleSuperScript(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oRichText = $oSlide->createRichTextShape(); @@ -710,7 +710,7 @@ public function testStyleSuperScript() $this->assertIsSchemaECMA376Valid(); } - public function testTableWithAlignment() + public function testTableWithAlignment(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createTableShape(4); @@ -735,7 +735,7 @@ public function testTableWithAlignment() $this->assertIsSchemaECMA376Valid(); } - public function testTableWithBorder() + public function testTableWithBorder(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createTableShape(4); @@ -774,7 +774,7 @@ public function testTableWithBorder() $this->assertIsSchemaECMA376Valid(); } - public function testTableWithCellMargin() + public function testTableWithCellMargin(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createTableShape(4); @@ -797,7 +797,7 @@ public function testTableWithCellMargin() $this->assertIsSchemaECMA376Valid(); } - public function testTableWithColspan() + public function testTableWithColspan(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createTableShape(4); @@ -813,7 +813,7 @@ public function testTableWithColspan() $this->assertIsSchemaECMA376Valid(); } - public function testTableWithRowspan() + public function testTableWithRowspan(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createTableShape(4); @@ -836,7 +836,7 @@ public function testTableWithRowspan() /** * @link : https://github.com/PHPOffice/PHPPresentation/issues/70 */ - public function testTableWithHyperlink() + public function testTableWithHyperlink(): void { $oSlide = $this->oPresentation->getActiveSlide(); $oShape = $oSlide->createTableShape(4); @@ -853,7 +853,7 @@ public function testTableWithHyperlink() $this->assertIsSchemaECMA376Valid(); } - public function testTransition() + public function testTransition(): void { $value = mt_rand(1000, 5000); $element = '/p:sld/p:transition'; @@ -1049,7 +1049,7 @@ public function testTransition() $this->assertIsSchemaECMA376Valid(); } - public function testVisibility() + public function testVisibility(): void { $expectedElement = '/p:sld'; diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptTablePropsTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptTablePropsTest.php index 5eeac021ad..3e2a782a07 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptTablePropsTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptTablePropsTest.php @@ -8,7 +8,7 @@ class PptTablePropsTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testRender() + public function testRender(): void { $this->assertZipFileExists('ppt/tableStyles.xml'); $element = '/a:tblStyleLst'; diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptViewPropsTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptViewPropsTest.php index 1550aec12d..eb5bbefc34 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptViewPropsTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/PptViewPropsTest.php @@ -9,7 +9,7 @@ class PptViewPropsTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testRender() + public function testRender(): void { $expectedElement = '/p:viewPr'; @@ -20,7 +20,7 @@ public function testRender() $this->assertIsSchemaECMA376Valid(); } - public function testCommentVisible() + public function testCommentVisible(): void { $expectedElement ='/p:viewPr'; @@ -32,7 +32,7 @@ public function testCommentVisible() $this->assertIsSchemaECMA376Valid(); } - public function testLastView() + public function testLastView(): void { $expectedElement ='/p:viewPr'; $expectedLastView = PresentationProperties::VIEW_OUTLINE; diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/RelationshipsTest.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/RelationshipsTest.php index 912e5b8e1e..27f9eaeca9 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007/RelationshipsTest.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007/RelationshipsTest.php @@ -9,7 +9,7 @@ class RelationshipsTest extends PhpPresentationTestCase { protected $writerName = 'PowerPoint2007'; - public function testCommentsAuthors() + public function testCommentsAuthors(): void { $oAuthor = new Comment\Author(); $oComment = new Comment(); diff --git a/tests/PhpPresentation/Tests/Writer/PowerPoint2007Test.php b/tests/PhpPresentation/Tests/Writer/PowerPoint2007Test.php index 7fbf05891e..7f4daa469c 100644 --- a/tests/PhpPresentation/Tests/Writer/PowerPoint2007Test.php +++ b/tests/PhpPresentation/Tests/Writer/PowerPoint2007Test.php @@ -4,6 +4,7 @@ use PhpOffice\PhpPresentation\Tests\PhpPresentationTestCase; use PhpOffice\PhpPresentation\Writer\PowerPoint2007; +use PhpOffice\PhpPresentation\Writer\PowerPoint2007\LayoutPack\AbstractLayoutPack; /** * Test class for PowerPoint2007 @@ -17,7 +18,7 @@ class PowerPoint2007Test extends PhpPresentationTestCase /** * Test create new instance */ - public function testConstruct() + public function testConstruct(): void { $objectPrefix = 'PhpOffice\\PhpPresentation\\Writer\\PowerPoint2007\\'; @@ -31,7 +32,7 @@ public function testConstruct() /** * Test save */ - public function testSave() + public function testSave(): void { $filename = tempnam(sys_get_temp_dir(), 'PhpPresentation'); @@ -46,7 +47,7 @@ public function testSave() /** * Test save with empty filename */ - public function testSaveEmptyException() + public function testSaveEmptyException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Filename is empty'); @@ -58,7 +59,7 @@ public function testSaveEmptyException() /** * Test save with empty assignation */ - public function testSaveUnassignedException() + public function testSaveUnassignedException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No PhpPresentation assigned.'); @@ -70,7 +71,7 @@ public function testSaveUnassignedException() /** * Test get PhpPresentation exception */ - public function testGetPhpPresentationException() + public function testGetPhpPresentationException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No PhpPresentation assigned.'); @@ -82,7 +83,7 @@ public function testGetPhpPresentationException() /** * Test disk caching */ - public function testDiskCaching() + public function testDiskCaching(): void { $object = new PowerPoint2007($this->oPresentation); $this->assertFalse($object->hasDiskCaching()); @@ -99,7 +100,7 @@ public function testDiskCaching() /** * Test set/get disk caching exception */ - public function testCachingException() + public function testCachingException(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Directory does not exist: foo'); @@ -112,20 +113,21 @@ public function testCachingException() * Test LayoutPack * @deprecated 0.7 */ - public function testLayoutPack() + public function testLayoutPack(): void { - $oLayoutPack = $this->getMockBuilder('PhpOffice\\PhpPresentation\\Writer\\PowerPoint2007\\LayoutPack\\AbstractLayoutPack')->getMock(); + /** @var AbstractLayoutPack $oLayoutPack */ + $oLayoutPack = $this->getMockBuilder(AbstractLayoutPack::class)->getMock(); $object = new PowerPoint2007(); - $this->assertInstanceOf("PhpOffice\\PhpPresentation\\Writer\\PowerPoint2007\\LayoutPack\\AbstractLayoutPack", $object->getLayoutPack()); + $this->assertInstanceOf(AbstractLayoutPack::class, $object->getLayoutPack()); $this->assertInstanceOf("PhpOffice\\PhpPresentation\\Writer\\PowerPoint2007", $object->setLayoutPack()); $this->assertNull($object->getLayoutPack()); $this->assertInstanceOf("PhpOffice\\PhpPresentation\\Writer\\PowerPoint2007", $object->setLayoutPack($oLayoutPack)); - $this->assertInstanceOf("PhpOffice\\PhpPresentation\\Writer\\PowerPoint2007\\LayoutPack\\AbstractLayoutPack", $object->getLayoutPack()); + $this->assertInstanceOf(AbstractLayoutPack::class, $object->getLayoutPack()); } - public function testZoom() + public function testZoom(): void { $this->assertZipXmlElementExists('ppt/viewProps.xml', '/p:viewPr/p:slideViewPr/p:cSldViewPr/p:cViewPr/p:scale/a:sx'); $this->assertZipXmlAttributeEquals('ppt/viewProps.xml', '/p:viewPr/p:slideViewPr/p:cSldViewPr/p:cViewPr/p:scale/a:sx', 'n', 100); @@ -148,7 +150,7 @@ public function testZoom() $this->assertIsSchemaECMA376Valid(); } - public function testFeatureThumbnail() + public function testFeatureThumbnail(): void { $imagePath = PHPPRESENTATION_TESTS_BASE_DIR.DIRECTORY_SEPARATOR.'resources'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.'PhpPresentationLogo.png'; diff --git a/tests/PhpPresentation/Tests/Writer/SerializedTest.php b/tests/PhpPresentation/Tests/Writer/SerializedTest.php index c7976162ed..58e27b7f8f 100644 --- a/tests/PhpPresentation/Tests/Writer/SerializedTest.php +++ b/tests/PhpPresentation/Tests/Writer/SerializedTest.php @@ -28,13 +28,13 @@ */ class SerializedTest extends TestCase { - public function testConstruct() + public function testConstruct(): void { $object = new Serialized(new PhpPresentation()); $this->assertInstanceOf('PhpOffice\\PhpPresentation\\PhpPresentation', $object->getPhpPresentation()); } - public function testEmptyConstruct() + public function testEmptyConstruct(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No PhpPresentation assigned.'); @@ -43,7 +43,7 @@ public function testEmptyConstruct() $object->getPhpPresentation(); } - public function testSaveEmpty() + public function testSaveEmpty(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Filename is empty.'); @@ -52,7 +52,7 @@ public function testSaveEmpty() $object->save(''); } - public function testSaveNoObject() + public function testSaveNoObject(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No PhpPresentation assigned.'); @@ -61,7 +61,7 @@ public function testSaveNoObject() $object->save('file.phpppt'); } - public function testSave() + public function testSave(): void { $oPhpPresentation = new PhpPresentation(); $oSlide = $oPhpPresentation->getActiveSlide(); @@ -74,7 +74,7 @@ public function testSave() $this->assertFileExists($file); } - public function testSaveNotExistingDir() + public function testSaveNotExistingDir(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Could not open'); @@ -90,7 +90,7 @@ public function testSaveNotExistingDir() $object->save($file.DIRECTORY_SEPARATOR.'test'.DIRECTORY_SEPARATOR.'test'); } - public function testSaveOverwriting() + public function testSaveOverwriting(): void { $oPhpPresentation = new PhpPresentation(); $oSlide = $oPhpPresentation->getActiveSlide(); diff --git a/tests/PhpPresentation/Tests/_includes/PhpPresentationTestCase.php b/tests/PhpPresentation/Tests/_includes/PhpPresentationTestCase.php index b2b43122e8..0363b9fece 100644 --- a/tests/PhpPresentation/Tests/_includes/PhpPresentationTestCase.php +++ b/tests/PhpPresentation/Tests/_includes/PhpPresentationTestCase.php @@ -2,6 +2,12 @@ namespace PhpOffice\PhpPresentation\Tests; +use DOMDocument; +use DOMElement; +use DOMNode; +use DOMNodeList; +use DOMXPath; +use LibXMLError; use PhpOffice\PhpPresentation\IOFactory; use PhpOffice\PhpPresentation\PhpPresentation; use PHPUnit\Framework\TestCase; @@ -9,7 +15,7 @@ class PhpPresentationTestCase extends TestCase { /** - * @var PhpPresentation + * @var PhpPresentation|null */ protected $oPresentation; @@ -31,21 +37,19 @@ class PhpPresentationTestCase extends TestCase /** * DOMDocument object * - * @var \DOMDocument + * @var DOMDocument|null */ private $xmlDom; /** - * DOMXpath object - * - * @var \DOMXpath + * @var DOMXPath|null */ private $xmlXPath; /** * File name * - * @var string + * @var string|null */ private $xmlFile; @@ -60,7 +64,7 @@ class PhpPresentationTestCase extends TestCase private $xmlDisableEntityLoader; /** - * @var array + * @var array> */ private $arrayOpenDocumentRNG = array( '1.0' => array( @@ -126,7 +130,7 @@ private function deleteDir(string $dir): void rmdir($dir); } - protected function getXmlDom(string $file): \DOMDocument + protected function getXmlDom(string $file): DOMDocument { $baseFile = $file; if (null !== $this->xmlDom && $file === $this->xmlFile) { @@ -137,7 +141,7 @@ protected function getXmlDom(string $file): \DOMDocument $this->xmlFile = $file; $file = $this->workDirectory . '/' . $file; - $this->xmlDom = new \DOMDocument(); + $this->xmlDom = new DOMDocument(); $strContent = file_get_contents($file); // docProps/app.xml if ($baseFile == 'docProps/app.xml') { @@ -155,14 +159,17 @@ protected function getXmlDom(string $file): \DOMDocument return $this->xmlDom; } - private function getXmlNodeList($file, $xpath) + /** + * @return DOMNodeList + */ + private function getXmlNodeList(string $file, string $xpath): DOMNodeList { if ($this->xmlDom === null || $file !== $this->xmlFile) { $this->getXmlDom($file); } if (null === $this->xmlXPath) { - $this->xmlXPath = new \DOMXpath($this->xmlDom); + $this->xmlXPath = new DOMXPath($this->xmlDom); } return $this->xmlXPath->query($xpath); @@ -279,7 +286,10 @@ public function assertZipXmlAttributeEquals($filePath, $xPath, $attribute, $valu { $this->writePresentationFile($this->oPresentation, $this->writerName); $nodeList = $this->getXmlNodeList($filePath, $xPath); - self::assertEquals($value, $nodeList->item(0)->getAttribute($attribute)); + /** @var DOMElement $nodeItem */ + $nodeItem = $nodeList->item(0); + self::assertInstanceOf(DOMElement::class, $nodeItem); + self::assertEquals($value, $nodeItem->getAttribute($attribute)); } /** @@ -292,7 +302,10 @@ public function assertZipXmlAttributeStartsWith($filePath, $xPath, $attribute, $ { $this->writePresentationFile($this->oPresentation, $this->writerName); $nodeList = $this->getXmlNodeList($filePath, $xPath); - self::assertStringStartsWith($value, $nodeList->item(0)->getAttribute($attribute)); + /** @var DOMElement $nodeItem */ + $nodeItem = $nodeList->item(0); + self::assertInstanceOf(DOMElement::class, $nodeItem); + self::assertStringStartsWith($value, $nodeItem->getAttribute($attribute)); } /** @@ -305,7 +318,10 @@ public function assertZipXmlAttributeEndsWith($filePath, $xPath, $attribute, $va { $this->writePresentationFile($this->oPresentation, $this->writerName); $nodeList = $this->getXmlNodeList($filePath, $xPath); - self::assertStringEndsWith($value, $nodeList->item(0)->getAttribute($attribute)); + /** @var DOMElement $nodeItem */ + $nodeItem = $nodeList->item(0); + self::assertInstanceOf(DOMElement::class, $nodeItem); + self::assertStringEndsWith($value, $nodeItem->getAttribute($attribute)); } /** @@ -318,7 +334,10 @@ public function assertZipXmlAttributeContains($filePath, $xPath, $attribute, $va { $this->writePresentationFile($this->oPresentation, $this->writerName); $nodeList = $this->getXmlNodeList($filePath, $xPath); - self::assertStringContainsString($value, $nodeList->item(0)->getAttribute($attribute)); + /** @var DOMElement $nodeItem */ + $nodeItem = $nodeList->item(0); + self::assertInstanceOf(DOMElement::class, $nodeItem); + self::assertStringContainsString($value, $nodeItem->getAttribute($attribute)); } /** @@ -330,7 +349,10 @@ public function assertZipXmlAttributeExists($filePath, $xPath, $attribute): void { $this->writePresentationFile($this->oPresentation, $this->writerName); $nodeList = $this->getXmlNodeList($filePath, $xPath); - self::assertTrue($nodeList->item(0)->hasAttribute($attribute)); + /** @var DOMElement $nodeItem */ + $nodeItem = $nodeList->item(0); + self::assertInstanceOf(DOMElement::class, $nodeItem); + self::assertTrue($nodeItem->hasAttribute($attribute)); } /** @@ -342,7 +364,10 @@ public function assertZipXmlAttributeNotExists($filePath, $xPath, $attribute): v { $this->writePresentationFile($this->oPresentation, $this->writerName); $nodeList = $this->getXmlNodeList($filePath, $xPath); - self::assertFalse($nodeList->item(0)->hasAttribute($attribute)); + /** @var DOMElement $nodeItem */ + $nodeItem = $nodeList->item(0); + self::assertInstanceOf(DOMElement::class, $nodeItem); + self::assertFalse($nodeItem->hasAttribute($attribute)); } public function assertIsSchemaECMA376Valid(): void @@ -365,7 +390,7 @@ public function assertIsSchemaECMA376Valid(): void $dom->schemaValidate(__DIR__ . '/../../../resources/schema/ecma-376/pml.xsd'); $error = libxml_get_last_error(); - if ($error instanceof \LibXMLError) { + if ($error instanceof LibXMLError) { $this->failXmlError($error, $fileName, $xmlSource); } } @@ -407,7 +432,7 @@ public function assertIsSchemaOOXMLValid(): void $dom->schemaValidate(__DIR__ . '/../../../resources/schema/ooxml/pml.xsd'); $error = libxml_get_last_error(); - if ($error instanceof \LibXMLError) { + if ($error instanceof LibXMLError) { $this->failXmlError($error, $fileName, $xmlSource); } } @@ -419,11 +444,10 @@ public function assertIsSchemaOOXMLValid(): void * @param boolean $triggerError * @return boolean */ - public function assertIsSchemaOpenDocumentValid($version = '1.0', $triggerError = true): bool + public function assertIsSchemaOpenDocumentValid(string $version = '1.0', bool $triggerError = true): bool { if (!array_key_exists($version, $this->arrayOpenDocumentRNG)) { self::fail('assertIsSchemaOpenDocumentValid > Use a valid version'); - return false; } // validate all XML files @@ -451,7 +475,7 @@ public function assertIsSchemaOpenDocumentValid($version = '1.0', $triggerError $dom->relaxNGValidate($pathRNG); $error = libxml_get_last_error(); - if ($error instanceof \LibXMLError) { + if ($error instanceof LibXMLError) { if ($triggerError) { $this->failXmlError($error, $fileName, $xmlSource, array('version' => $version)); } @@ -462,7 +486,7 @@ public function assertIsSchemaOpenDocumentValid($version = '1.0', $triggerError return $isValid; } - public function assertIsSchemaOpenDocumentNotValid($version = '1.0'): void + public function assertIsSchemaOpenDocumentNotValid(string $version = '1.0'): void { $isValid = $this->assertIsSchemaOpenDocumentValid($version, false); if ($isValid) { @@ -474,9 +498,9 @@ public function assertIsSchemaOpenDocumentNotValid($version = '1.0'): void * @param \LibXMLError $error * @param string $fileName * @param string $source - * @param array $params + * @param array $params */ - protected function failXmlError(\LibXMLError $error, $fileName, $source, array $params = array()): void + protected function failXmlError(LibXMLError $error, string $fileName, string $source, array $params = array()): void { switch ($error->level) { case LIBXML_ERR_WARNING: