diff --git a/docs/changes/1.x/1.4.0.md b/docs/changes/1.x/1.4.0.md
index 1c1557a940..32f5ba47c9 100644
--- a/docs/changes/1.x/1.4.0.md
+++ b/docs/changes/1.x/1.4.0.md
@@ -8,6 +8,7 @@
- Writer ODText: Support for ListItemRun by [@Progi1984](https://github.com/Progi1984) fixing [#2159](https://github.com/PHPOffice/PHPWord/issues/2159), [#2620](https://github.com/PHPOffice/PHPWord/issues/2620) in [#2669](https://github.com/PHPOffice/PHPWord/pull/2669)
- Writer HTML: Support for vAlign in Tables by [@SpraxDev](https://github.com/SpraxDev) in [#2675](https://github.com/PHPOffice/PHPWord/pull/2675)
+- Writer Word2007: Support for padding in Table Cell by [@Azamat8405](https://github.com/Azamat8405) in [#2697](https://github.com/PHPOffice/PHPWord/pull/2697)
- Added support for PHP 8.4 by [@Progi1984](https://github.com/Progi1984) in [#2660](https://github.com/PHPOffice/PHPWord/pull/2660)
- Autoload : Allow to use PHPWord without Composer fixing [#2543](https://github.com/PHPOffice/PHPWord/issues/2543), [#2552](https://github.com/PHPOffice/PHPWord/issues/2552), [#2716](https://github.com/PHPOffice/PHPWord/issues/2716), [#2717](https://github.com/PHPOffice/PHPWord/issues/2717) in [#2722](https://github.com/PHPOffice/PHPWord/pull/2722)
@@ -16,10 +17,17 @@
- Writer ODText: Support for images inside a textRun by [@Progi1984](https://github.com/Progi1984) fixing [#2240](https://github.com/PHPOffice/PHPWord/issues/2240) in [#2668](https://github.com/PHPOffice/PHPWord/pull/2668)
- Allow vAlign and vMerge on Style\Cell to be set to null by [@SpraxDev](https://github.com/SpraxDev) fixing [#2673](https://github.com/PHPOffice/PHPWord/issues/2673) in [#2676](https://github.com/PHPOffice/PHPWord/pull/2676)
- Reader HTML: Support for differents size units for table by [@Progi1984](https://github.com/Progi1984) fixing [#2384](https://github.com/PHPOffice/PHPWord/issues/2384), [#2701](https://github.com/PHPOffice/PHPWord/issues/2701) in [#2725](https://github.com/PHPOffice/PHPWord/pull/2725)
+- Reader Word2007 : Respect paragraph indent units by [@tugmaks](https://github.com/tugmaks) & [@Progi1984](https://github.com/Progi1984) fixing [#507](https://github.com/PHPOffice/PHPWord/issues/507) in [#2726](https://github.com/PHPOffice/PHPWord/pull/2726)
+- Reader Word2007 : Support Header elements within Title elements by [@SpraxDev](https://github.com/SpraxDev) fixing [#2616](https://github.com/PHPOffice/PHPWord/issues/2616), [#2426](https://github.com/PHPOffice/PHPWord/issues/2426) in [#2674](https://github.com/PHPOffice/PHPWord/pull/2674)
### Miscellaneous
- Bump dompdf/dompdf from 2.0.4 to 3.0.0 by [@dependabot](https://github.com/dependabot) fixing [#2621](https://github.com/PHPOffice/PHPWord/issues/2621) in [#2666](https://github.com/PHPOffice/PHPWord/pull/2666)
- Add test case to make sure vMerge defaults to 'continue' by [@SpraxDev](https://github.com/SpraxDev) in [#2677](https://github.com/PHPOffice/PHPWord/pull/2677)
+### Deprecations
+- Deprecate `PhpOffice\PhpWord\Style\Paragraph::getIndent()` : Use `PhpOffice\PhpWord\Style\Paragraph::getIndentLeft()`
+- Deprecate `PhpOffice\PhpWord\Style\Paragraph::setHanging()` : Use `PhpOffice\PhpWord\Style\Paragraph::setIndentHanging()`
+- Deprecate `PhpOffice\PhpWord\Style\Paragraph::setIndent()` : Use `PhpOffice\PhpWord\Style\Paragraph::setIndentLeft()`
+
### BC Breaks
diff --git a/src/PhpWord/Element/AbstractContainer.php b/src/PhpWord/Element/AbstractContainer.php
index f989e1069c..f311d68206 100644
--- a/src/PhpWord/Element/AbstractContainer.php
+++ b/src/PhpWord/Element/AbstractContainer.php
@@ -254,7 +254,7 @@ private function checkValidity($method)
'Footnote' => ['Section', 'TextRun', 'Cell', 'ListItemRun'],
'Endnote' => ['Section', 'TextRun', 'Cell'],
'PreserveText' => ['Section', 'Header', 'Footer', 'Cell'],
- 'Title' => ['Section', 'Cell'],
+ 'Title' => ['Section', 'Cell', 'Header'],
'TOC' => ['Section'],
'PageBreak' => ['Section'],
'Chart' => ['Section', 'Cell'],
diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php
index 42788a70bb..f342a50ec5 100644
--- a/src/PhpWord/Reader/Word2007/AbstractPart.php
+++ b/src/PhpWord/Reader/Word2007/AbstractPart.php
@@ -662,8 +662,10 @@ protected function readParagraphStyle(XMLReader $xmlReader, DOMElement $domNode)
'alignment' => [self::READ_VALUE, 'w:jc'],
'basedOn' => [self::READ_VALUE, 'w:basedOn'],
'next' => [self::READ_VALUE, 'w:next'],
- 'indent' => [self::READ_VALUE, 'w:ind', 'w:left'],
- 'hanging' => [self::READ_VALUE, 'w:ind', 'w:hanging'],
+ 'indentLeft' => [self::READ_VALUE, 'w:ind', 'w:left'],
+ 'indentRight' => [self::READ_VALUE, 'w:ind', 'w:right'],
+ 'indentHanging' => [self::READ_VALUE, 'w:ind', 'w:hanging'],
+ 'indentFirstLine' => [self::READ_VALUE, 'w:ind', 'w:firstLine'],
'spaceAfter' => [self::READ_VALUE, 'w:spacing', 'w:after'],
'spaceBefore' => [self::READ_VALUE, 'w:spacing', 'w:before'],
'widowControl' => [self::READ_FALSE, 'w:widowControl'],
diff --git a/src/PhpWord/Shared/Html.php b/src/PhpWord/Shared/Html.php
index dfe6a1d48e..a809495ad6 100644
--- a/src/PhpWord/Shared/Html.php
+++ b/src/PhpWord/Shared/Html.php
@@ -931,6 +931,58 @@ protected static function parseStyleDeclarations(array $selectors, array $styles
$styles['spaceAfter'] = Converter::cssToTwip($value);
break;
+
+ case 'padding':
+ $valueTop = $valueRight = $valueBottom = $valueLeft = null;
+ $cValue = preg_replace('# +#', ' ', trim($value));
+ $paddingArr = explode(' ', $cValue);
+ $countParams = count($paddingArr);
+ if ($countParams == 1) {
+ $valueTop = $valueRight = $valueBottom = $valueLeft = $paddingArr[0];
+ } elseif ($countParams == 2) {
+ $valueTop = $valueBottom = $paddingArr[0];
+ $valueRight = $valueLeft = $paddingArr[1];
+ } elseif ($countParams == 3) {
+ $valueTop = $paddingArr[0];
+ $valueRight = $valueLeft = $paddingArr[1];
+ $valueBottom = $paddingArr[2];
+ } elseif ($countParams == 4) {
+ $valueTop = $paddingArr[0];
+ $valueRight = $paddingArr[1];
+ $valueBottom = $paddingArr[2];
+ $valueLeft = $paddingArr[3];
+ }
+ if ($valueTop !== null) {
+ $styles['paddingTop'] = Converter::cssToTwip($valueTop);
+ }
+ if ($valueRight !== null) {
+ $styles['paddingRight'] = Converter::cssToTwip($valueRight);
+ }
+ if ($valueBottom !== null) {
+ $styles['paddingBottom'] = Converter::cssToTwip($valueBottom);
+ }
+ if ($valueLeft !== null) {
+ $styles['paddingLeft'] = Converter::cssToTwip($valueLeft);
+ }
+
+ break;
+ case 'padding-top':
+ $styles['paddingTop'] = Converter::cssToTwip($value);
+
+ break;
+ case 'padding-right':
+ $styles['paddingRight'] = Converter::cssToTwip($value);
+
+ break;
+ case 'padding-bottom':
+ $styles['paddingBottom'] = Converter::cssToTwip($value);
+
+ break;
+ case 'padding-left':
+ $styles['paddingLeft'] = Converter::cssToTwip($value);
+
+ break;
+
case 'border-color':
self::mapBorderColor($styles, $value);
diff --git a/src/PhpWord/Style/AbstractStyle.php b/src/PhpWord/Style/AbstractStyle.php
index 7efe67d30f..5a553c43c4 100644
--- a/src/PhpWord/Style/AbstractStyle.php
+++ b/src/PhpWord/Style/AbstractStyle.php
@@ -332,12 +332,11 @@ protected function setEnumVal($value = null, $enum = [], $default = null)
* Set object value.
*
* @param mixed $value
- * @param string $styleName
* @param mixed &$style
*
* @return mixed
*/
- protected function setObjectVal($value, $styleName, &$style)
+ protected function setObjectVal($value, string $styleName, &$style)
{
$styleClass = substr(static::class, 0, (int) strrpos(static::class, '\\')) . '\\' . $styleName;
if (is_array($value)) {
diff --git a/src/PhpWord/Style/Cell.php b/src/PhpWord/Style/Cell.php
index f102bfa862..e2b59f417d 100644
--- a/src/PhpWord/Style/Cell.php
+++ b/src/PhpWord/Style/Cell.php
@@ -74,6 +74,26 @@ class Cell extends Border
*/
private $vAlign;
+ /**
+ * @var null|int
+ */
+ private $paddingTop;
+
+ /**
+ * @var null|int
+ */
+ private $paddingBottom;
+
+ /**
+ * @var null|int
+ */
+ private $paddingLeft;
+
+ /**
+ * @var null|int
+ */
+ private $paddingRight;
+
/**
* Text Direction.
*
@@ -357,4 +377,84 @@ public function getNoWrap(): bool
{
return $this->noWrap;
}
+
+ /**
+ * Get style padding-top.
+ */
+ public function getPaddingTop(): ?int
+ {
+ return $this->paddingTop;
+ }
+
+ /**
+ * Set style padding-top.
+ *
+ * @return $this
+ */
+ public function setPaddingTop(int $value): self
+ {
+ $this->paddingTop = $value;
+
+ return $this;
+ }
+
+ /**
+ * Get style padding-bottom.
+ */
+ public function getPaddingBottom(): ?int
+ {
+ return $this->paddingBottom;
+ }
+
+ /**
+ * Set style padding-bottom.
+ *
+ * @return $this
+ */
+ public function setPaddingBottom(int $value): self
+ {
+ $this->paddingBottom = $value;
+
+ return $this;
+ }
+
+ /**
+ * Get style padding-left.
+ */
+ public function getPaddingLeft(): ?int
+ {
+ return $this->paddingLeft;
+ }
+
+ /**
+ * Set style padding-left.
+ *
+ * @return $this
+ */
+ public function setPaddingLeft(int $value): self
+ {
+ $this->paddingLeft = $value;
+
+ return $this;
+ }
+
+ /**
+ * Get style padding-right.
+ */
+ public function getPaddingRight(): ?int
+ {
+ return $this->paddingRight;
+ }
+
+ /**
+ * Set style padding-right.
+ *
+ * @return $this
+ */
+ public function setPaddingRight(int $value): self
+ {
+ $this->paddingRight = $value;
+
+ return $this;
+ }
}
diff --git a/src/PhpWord/Style/Indentation.php b/src/PhpWord/Style/Indentation.php
index 22b8f44c0b..c2032dd22f 100644
--- a/src/PhpWord/Style/Indentation.php
+++ b/src/PhpWord/Style/Indentation.php
@@ -29,30 +29,30 @@ class Indentation extends AbstractStyle
/**
* Left indentation (twip).
*
- * @var float|int
+ * @var null|float
*/
private $left = 0;
/**
* Right indentation (twip).
*
- * @var float|int
+ * @var null|float
*/
private $right = 0;
/**
* Additional first line indentation (twip).
*
- * @var float|int
+ * @var null|float
*/
private $firstLine = 0;
/**
* Indentation removed from first line (twip).
*
- * @var float|int
+ * @var null|float
*/
- private $hanging;
+ private $hanging = 0;
/**
* Create a new instance.
@@ -66,96 +66,72 @@ public function __construct($style = [])
/**
* Get left.
- *
- * @return float|int
*/
- public function getLeft()
+ public function getLeft(): ?float
{
return $this->left;
}
/**
* Set left.
- *
- * @param float|int $value
- *
- * @return self
*/
- public function setLeft($value)
+ public function setLeft(?float $value): self
{
- $this->left = $this->setNumericVal($value, $this->left);
+ $this->left = $this->setNumericVal($value);
return $this;
}
/**
* Get right.
- *
- * @return float|int
*/
- public function getRight()
+ public function getRight(): ?float
{
return $this->right;
}
/**
* Set right.
- *
- * @param float|int $value
- *
- * @return self
*/
- public function setRight($value)
+ public function setRight(?float $value): self
{
- $this->right = $this->setNumericVal($value, $this->right);
+ $this->right = $this->setNumericVal($value);
return $this;
}
/**
* Get first line.
- *
- * @return float|int
*/
- public function getFirstLine()
+ public function getFirstLine(): ?float
{
return $this->firstLine;
}
/**
* Set first line.
- *
- * @param float|int $value
- *
- * @return self
*/
- public function setFirstLine($value)
+ public function setFirstLine(?float $value): self
{
- $this->firstLine = $this->setNumericVal($value, $this->firstLine);
+ $this->firstLine = $this->setNumericVal($value);
return $this;
}
/**
* Get hanging.
- *
- * @return float|int
*/
- public function getHanging()
+ public function getHanging(): ?float
{
return $this->hanging;
}
/**
* Set hanging.
- *
- * @param float|int $value
- *
- * @return self
*/
- public function setHanging($value = null)
+ public function setHanging(?float $value = null): self
{
- $this->hanging = $this->setNumericVal($value, $this->hanging);
+ $this->hanging = $this->setNumericVal($value);
return $this;
}
diff --git a/src/PhpWord/Style/Paragraph.php b/src/PhpWord/Style/Paragraph.php
index 0da5e586de..db777f2cac 100644
--- a/src/PhpWord/Style/Paragraph.php
+++ b/src/PhpWord/Style/Paragraph.php
@@ -307,74 +307,132 @@ public function setNext($value = null)
return $this;
}
+ /**
+ * Get hanging.
+ */
+ public function getHanging(): ?float
+ {
+ return $this->getChildStyleValue($this->indentation, 'hanging');
+ }
+
/**
* Get indentation.
*
- * @return null|Indentation
+ * @deprecated 1.4.0 Use getIndentLeft
*/
- public function getIndentation()
+ public function getIndent(): ?float
+ {
+ return $this->getChildStyleValue($this->indentation, 'left');
+ }
+
+ /**
+ * Get indentation.
+ */
+ public function getIndentation(): ?Indentation
{
return $this->indentation;
}
/**
- * Set shading.
- *
- * @param mixed $value
- *
- * @return self
+ * Get firstLine.
*/
- public function setIndentation($value = null)
+ public function getIndentFirstLine(): ?float
{
- $this->setObjectVal($value, 'Indentation', $this->indentation);
+ return $this->getChildStyleValue($this->indentation, 'firstLine');
+ }
- return $this;
+ /**
+ * Get left indentation.
+ */
+ public function getIndentLeft(): ?float
+ {
+ return $this->getChildStyleValue($this->indentation, 'left');
}
/**
- * Get indentation.
+ * Get right indentation.
+ */
+ public function getIndentRight(): ?float
+ {
+ return $this->getChildStyleValue($this->indentation, 'right');
+ }
+
+ /**
+ * Set hanging.
*
- * @return int
+ * @deprecated 1.4.0 Use setIndentHanging
*/
- public function getIndent()
+ public function setHanging(?float $value = null): self
{
- return $this->getChildStyleValue($this->indentation, 'left');
+ return $this->setIndentation(['hanging' => $value]);
}
/**
* Set indentation.
*
- * @param int $value
- *
- * @return self
+ * @deprecated 1.4.0 Use setIndentLeft
*/
- public function setIndent($value = null)
+ public function setIndent(?float $value = null): self
{
return $this->setIndentation(['left' => $value]);
}
/**
- * Get hanging.
+ * Set indentation.
*
- * @return int
+ * @param array{
+ * left?:null|float|int|numeric-string,
+ * right?:null|float|int|numeric-string,
+ * hanging?:null|float|int|numeric-string,
+ * firstLine?:null|float|int|numeric-string
+ * } $value
*/
- public function getHanging()
+ public function setIndentation(array $value = []): self
{
- return $this->getChildStyleValue($this->indentation, 'hanging');
+ $value = array_map(function ($indent) {
+ if (is_string($indent) || is_numeric($indent)) {
+ $indent = $this->setFloatVal($indent);
+ }
+
+ return $indent;
+ }, $value);
+ $this->setObjectVal($value, 'Indentation', $this->indentation);
+
+ return $this;
}
/**
- * Set hanging.
- *
- * @param int $value
- *
- * @return self
+ * Set hanging indentation.
*/
- public function setHanging($value = null)
+ public function setIndentHanging(?float $value = null): self
{
return $this->setIndentation(['hanging' => $value]);
}
+ /**
+ * Set firstline indentation.
+ */
+ public function setIndentFirstLine(?float $value = null): self
+ {
+ return $this->setIndentation(['firstLine' => $value]);
+ }
+
+ /**
+ * Set left indentation.
+ */
+ public function setIndentLeft(?float $value = null): self
+ {
+ return $this->setIndentation(['left' => $value]);
+ }
+
+ /**
+ * Set right indentation.
+ */
+ public function setIndentRight(?float $value = null): self
+ {
+ return $this->setIndentation(['right' => $value]);
+ }
+
/**
* Get spacing.
*
diff --git a/src/PhpWord/Writer/Word2007/Style/Cell.php b/src/PhpWord/Writer/Word2007/Style/Cell.php
index ea6fba6d7c..bb0d6d71b0 100644
--- a/src/PhpWord/Writer/Word2007/Style/Cell.php
+++ b/src/PhpWord/Writer/Word2007/Style/Cell.php
@@ -55,6 +55,40 @@ public function write(): void
$xmlWriter->endElement(); // w:tcW
}
+ $paddingTop = $style->getPaddingTop();
+ $paddingLeft = $style->getPaddingLeft();
+ $paddingBottom = $style->getPaddingBottom();
+ $paddingRight = $style->getPaddingRight();
+
+ if ($paddingTop !== null || $paddingLeft !== null || $paddingBottom !== null || $paddingRight !== null) {
+ $xmlWriter->startElement('w:tcMar');
+ if ($paddingTop !== null) {
+ $xmlWriter->startElement('w:top');
+ $xmlWriter->writeAttribute('w:w', $paddingTop);
+ $xmlWriter->writeAttribute('w:type', \PhpOffice\PhpWord\SimpleType\TblWidth::TWIP);
+ $xmlWriter->endElement(); // w:top
+ }
+ if ($paddingLeft !== null) {
+ $xmlWriter->startElement('w:start');
+ $xmlWriter->writeAttribute('w:w', $paddingLeft);
+ $xmlWriter->writeAttribute('w:type', \PhpOffice\PhpWord\SimpleType\TblWidth::TWIP);
+ $xmlWriter->endElement(); // w:start
+ }
+ if ($paddingBottom !== null) {
+ $xmlWriter->startElement('w:bottom');
+ $xmlWriter->writeAttribute('w:w', $paddingBottom);
+ $xmlWriter->writeAttribute('w:type', \PhpOffice\PhpWord\SimpleType\TblWidth::TWIP);
+ $xmlWriter->endElement(); // w:bottom
+ }
+ if ($paddingRight !== null) {
+ $xmlWriter->startElement('w:end');
+ $xmlWriter->writeAttribute('w:w', $paddingRight);
+ $xmlWriter->writeAttribute('w:type', \PhpOffice\PhpWord\SimpleType\TblWidth::TWIP);
+ $xmlWriter->endElement(); // w:end
+ }
+ $xmlWriter->endElement(); // w:tcMar
+ }
+
// Text direction
$textDir = $style->getTextDirection();
$xmlWriter->writeElementIf(null !== $textDir, 'w:textDirection', 'w:val', $textDir);
diff --git a/tests/PhpWordTests/Reader/Word2007/StyleTest.php b/tests/PhpWordTests/Reader/Word2007/StyleTest.php
index 006e6ff01f..347c0350f9 100644
--- a/tests/PhpWordTests/Reader/Word2007/StyleTest.php
+++ b/tests/PhpWordTests/Reader/Word2007/StyleTest.php
@@ -18,6 +18,8 @@
namespace PhpOffice\PhpWordTests\Reader\Word2007;
+use Generator;
+use PhpOffice\PhpWord\Element\TextRun;
use PhpOffice\PhpWord\SimpleType\Border;
use PhpOffice\PhpWord\SimpleType\TblWidth;
use PhpOffice\PhpWord\SimpleType\VerticalJc;
@@ -221,7 +223,7 @@ public function testReadPosition(): void
$phpWord = $this->getDocumentFromString(['document' => $documentXml]);
$elements = $phpWord->getSection(0)->getElements();
- /** @var \PhpOffice\PhpWord\Element\TextRun $elements */
+ /** @var TextRun $elements */
$textRun = $elements[0];
self::assertInstanceOf('PhpOffice\PhpWord\Element\TextRun', $textRun);
self::assertInstanceOf('PhpOffice\PhpWord\Element\Text', $textRun->getElement(0));
@@ -282,7 +284,7 @@ public function testReadHidden(): void
$phpWord = $this->getDocumentFromString(['document' => $documentXml]);
$elements = $phpWord->getSection(0)->getElements();
- /** @var \PhpOffice\PhpWord\Element\TextRun $elements */
+ /** @var TextRun $elements */
$textRun = $elements[0];
self::assertInstanceOf('PhpOffice\PhpWord\Element\TextRun', $textRun);
self::assertInstanceOf('PhpOffice\PhpWord\Element\Text', $textRun->getElement(0));
@@ -328,4 +330,45 @@ public function testPageVerticalAlign(): void
$sectionStyle = $phpWord->getSection(0)->getStyle();
self::assertEquals(VerticalJc::CENTER, $sectionStyle->getVAlign());
}
+
+ /**
+ * @dataProvider providerIndentation
+ */
+ public function testIndentation(string $indent, float $left, float $right, ?float $hanging, float $firstLine): void
+ {
+ $documentXml = "
+
+ $indent
+
+
+ 1.
+
+ ";
+
+ $phpWord = $this->getDocumentFromString(['document' => $documentXml]);
+
+ $section = $phpWord->getSection(0);
+ $textRun = $section->getElements()[0];
+ self::assertInstanceOf(TextRun::class, $textRun);
+
+ $paragraphStyle = $textRun->getParagraphStyle();
+ self::assertInstanceOf(Style\Paragraph::class, $paragraphStyle);
+
+ $indentation = $paragraphStyle->getIndentation();
+ self::assertSame($left, $indentation->getLeft());
+ self::assertSame($right, $indentation->getRight());
+ self::assertSame($hanging, $indentation->getHanging());
+ self::assertSame($firstLine, $indentation->getFirstLine());
+ }
+
+ /**
+ * @return Generator
+ */
+ public static function providerIndentation()
+ {
+ yield ['', 709.00, 488.00, 10.0, 490.00];
+ yield ['', 0, 0, 10.0, 490.00];
+ yield ['', 709.00, 0, 0, 0];
+ yield ['', 0, 488.00, 0, 0];
+ }
}
diff --git a/tests/PhpWordTests/Shared/HtmlTest.php b/tests/PhpWordTests/Shared/HtmlTest.php
index bc0899a8ac..d6bfa4c30b 100644
--- a/tests/PhpWordTests/Shared/HtmlTest.php
+++ b/tests/PhpWordTests/Shared/HtmlTest.php
@@ -25,6 +25,7 @@
use PhpOffice\PhpWord\Element\TextRun;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\Settings;
+use PhpOffice\PhpWord\Shared\Converter;
use PhpOffice\PhpWord\Shared\Html;
use PhpOffice\PhpWord\SimpleType\Jc;
use PhpOffice\PhpWord\SimpleType\LineSpacingRule;
@@ -323,6 +324,66 @@ public function testParseLineHeight(): void
self::assertEquals(LineSpacingRule::AUTO, $doc->getElementAttribute('/w:document/w:body/w:p[5]/w:pPr/w:spacing', 'w:lineRule'));
}
+ public function testParseCellPaddingStyle(): void
+ {
+ $phpWord = new PhpWord();
+ $section = $phpWord->addSection();
+
+ $top = 10;
+ $right = 11;
+ $bottom = 12;
+ $left = 13;
+
+ $testValTop = Converter::pixelToTwip($top);
+ $testValRight = Converter::pixelToTwip($right);
+ $testValBottom = Converter::pixelToTwip($bottom);
+ $testValLeft = Converter::pixelToTwip($left);
+
+ $html = '
+
+
+ full |
+ mix |
+ top |
+ bottom |
+ left |
+
+
+
';
+ Html::addHtml($section, $html);
+
+ $doc = TestHelperDOCX::getDocument($phpWord, 'Word2007');
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:tcPr/w:tcMar/w:top';
+ self::assertTrue($doc->elementExists($path));
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:tcPr/w:tcMar/w:bottom';
+ self::assertTrue($doc->elementExists($path));
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:tcPr/w:tcMar/w:end';
+ self::assertTrue($doc->elementExists($path));
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:tcPr/w:tcMar/w:start';
+ self::assertTrue($doc->elementExists($path));
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc[2]/w:tcPr/w:tcMar/w:end';
+ self::assertTrue($doc->elementExists($path));
+ self::assertEquals($testValRight, $doc->getElementAttribute($path, 'w:w'));
+ self::assertEquals(TblWidth::TWIP, $doc->getElementAttribute($path, 'w:type'));
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc[3]/w:tcPr/w:tcMar/w:top';
+ self::assertTrue($doc->elementExists($path));
+ self::assertEquals($testValTop, $doc->getElementAttribute($path, 'w:w'));
+ self::assertEquals(TblWidth::TWIP, $doc->getElementAttribute($path, 'w:type'));
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc[4]/w:tcPr/w:tcMar/w:bottom';
+ self::assertTrue($doc->elementExists($path));
+ self::assertEquals($testValBottom, $doc->getElementAttribute($path, 'w:w'));
+ self::assertEquals(TblWidth::TWIP, $doc->getElementAttribute($path, 'w:type'));
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc[5]/w:tcPr/w:tcMar/w:start';
+ self::assertTrue($doc->elementExists($path));
+ self::assertEquals($testValLeft, $doc->getElementAttribute($path, 'w:w'));
+ self::assertEquals(TblWidth::TWIP, $doc->getElementAttribute($path, 'w:type'));
+ }
+
/**
* Test text-indent style.
*/
diff --git a/tests/PhpWordTests/Style/CellTest.php b/tests/PhpWordTests/Style/CellTest.php
index cd4ae7f85b..9015d0feea 100644
--- a/tests/PhpWordTests/Style/CellTest.php
+++ b/tests/PhpWordTests/Style/CellTest.php
@@ -90,4 +90,25 @@ public function testBorderSize(): void
$object->setStyleValue('borderSize', $value);
self::assertEquals($expected, $object->getBorderSize());
}
+
+ /**
+ * Test cell padding.
+ */
+ public function testPadding(): void
+ {
+ $object = new Cell();
+ $methods = [
+ 'paddingTop' => 10,
+ 'paddingBottom' => 20,
+ 'paddingLeft' => 30,
+ 'paddingRight' => 40,
+ ];
+
+ foreach ($methods as $methodName => $methodValue) {
+ $object->setStyleValue($methodName, $methodValue);
+ $getterName = 'get' . ucfirst($methodName);
+
+ self::assertEquals($methodValue, $object->$getterName());
+ }
+ }
}
diff --git a/tests/PhpWordTests/Style/ParagraphTest.php b/tests/PhpWordTests/Style/ParagraphTest.php
index f99107a93b..6a6e777cfc 100644
--- a/tests/PhpWordTests/Style/ParagraphTest.php
+++ b/tests/PhpWordTests/Style/ParagraphTest.php
@@ -144,6 +144,155 @@ public function testTabs(): void
self::assertCount(2, $object->getTabs());
}
+ public function testHanging(): void
+ {
+ $rand = mt_rand(0, 255);
+
+ $object = new Paragraph();
+ self::assertNull($object->getHanging());
+ self::assertInstanceOf(Paragraph::class, $object->setHanging($rand));
+ self::assertEquals($rand, $object->getHanging());
+ self::assertInstanceOf(Paragraph::class, $object->setHanging(null));
+ self::assertNull($object->getHanging());
+ self::assertInstanceOf(Paragraph::class, $object->setHanging($rand));
+ self::assertEquals($rand, $object->getHanging());
+ self::assertInstanceOf(Paragraph::class, $object->setHanging());
+ self::assertNull($object->getHanging());
+ }
+
+ public function testIndent(): void
+ {
+ $rand = mt_rand(0, 255);
+
+ $object = new Paragraph();
+ self::assertNull($object->getIndent());
+ self::assertInstanceOf(Paragraph::class, $object->setIndent($rand));
+ self::assertEquals($rand, $object->getIndent());
+ self::assertInstanceOf(Paragraph::class, $object->setIndent(null));
+ self::assertNull($object->getIndent());
+ self::assertInstanceOf(Paragraph::class, $object->setIndent($rand));
+ self::assertEquals($rand, $object->getIndent());
+ self::assertInstanceOf(Paragraph::class, $object->setIndent());
+ self::assertNull($object->getIndent());
+ }
+
+ public function testIndentation(): void
+ {
+ $rand = mt_rand(0, 255);
+ $rand2 = mt_rand(0, 255);
+
+ $object = new Paragraph();
+ self::assertNull($object->getIndentation());
+ // Set Basic indentation
+ self::assertInstanceOf(Paragraph::class, $object->setIndentation([]));
+ self::assertNotNull($object->getIndentation());
+ self::assertEquals(0, $object->getIndentation()->getLeft());
+ self::assertEquals(0, $object->getIndentation()->getRight());
+ self::assertEquals(0, $object->getIndentation()->getHanging());
+ self::assertEquals(0, $object->getIndentation()->getFirstLine());
+ // Set indentation : left
+ self::assertInstanceOf(Paragraph::class, $object->setIndentation([
+ 'left' => $rand,
+ ]));
+ self::assertNotNull($object->getIndentation());
+ self::assertEquals($rand, $object->getIndentation()->getLeft());
+ self::assertEquals(0, $object->getIndentation()->getRight());
+ self::assertEquals(0, $object->getIndentation()->getHanging());
+ self::assertEquals(0, $object->getIndentation()->getFirstLine());
+ // Set indentation : right
+ self::assertInstanceOf(Paragraph::class, $object->setIndentation([
+ 'right' => $rand,
+ ]));
+ self::assertNotNull($object->getIndentation());
+ self::assertEquals($rand, $object->getIndentation()->getLeft());
+ self::assertEquals($rand, $object->getIndentation()->getRight());
+ self::assertEquals(0, $object->getIndentation()->getHanging());
+ self::assertEquals(0, $object->getIndentation()->getFirstLine());
+ // Set indentation : hanging
+ self::assertInstanceOf(Paragraph::class, $object->setIndentation([
+ 'hanging' => $rand,
+ ]));
+ self::assertNotNull($object->getIndentation());
+ self::assertEquals($rand, $object->getIndentation()->getLeft());
+ self::assertEquals($rand, $object->getIndentation()->getRight());
+ self::assertEquals($rand, $object->getIndentation()->getHanging());
+ self::assertEquals(0, $object->getIndentation()->getFirstLine());
+ // Set indentation : firstline
+ self::assertInstanceOf(Paragraph::class, $object->setIndentation([
+ 'firstline' => $rand,
+ ]));
+ self::assertNotNull($object->getIndentation());
+ self::assertEquals($rand, $object->getIndentation()->getLeft());
+ self::assertEquals($rand, $object->getIndentation()->getRight());
+ self::assertEquals($rand, $object->getIndentation()->getHanging());
+ self::assertEquals($rand, $object->getIndentation()->getFirstLine());
+ // Replace indentation : left & firstline
+ self::assertInstanceOf(Paragraph::class, $object->setIndentation([
+ 'left' => $rand2,
+ 'firstline' => $rand2,
+ ]));
+ self::assertNotNull($object->getIndentation());
+ self::assertEquals($rand2, $object->getIndentation()->getLeft());
+ self::assertEquals($rand, $object->getIndentation()->getRight());
+ self::assertEquals($rand, $object->getIndentation()->getHanging());
+ self::assertEquals($rand2, $object->getIndentation()->getFirstLine());
+ // Replace indentation : N/A
+ self::assertInstanceOf(Paragraph::class, $object->setIndentation());
+ self::assertNotNull($object->getIndentation());
+ self::assertEquals($rand2, $object->getIndentation()->getLeft());
+ self::assertEquals($rand, $object->getIndentation()->getRight());
+ self::assertEquals($rand, $object->getIndentation()->getHanging());
+ self::assertEquals($rand2, $object->getIndentation()->getFirstLine());
+ }
+
+ public function testIndentFirstLine(): void
+ {
+ $rand = mt_rand(0, 255);
+
+ $object = new Paragraph();
+ self::assertNull($object->getIndentFirstLine());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentFirstLine($rand));
+ self::assertEquals($rand, $object->getIndentFirstLine());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentFirstLine(null));
+ self::assertNull($object->getIndentFirstLine());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentFirstLine($rand));
+ self::assertEquals($rand, $object->getIndentFirstLine());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentFirstLine());
+ self::assertNull($object->getIndentFirstLine());
+ }
+
+ public function testIndentLeft(): void
+ {
+ $rand = mt_rand(0, 255);
+
+ $object = new Paragraph();
+ self::assertNull($object->getIndentLeft());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentLeft($rand));
+ self::assertEquals($rand, $object->getIndentLeft());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentLeft(null));
+ self::assertNull($object->getIndentLeft());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentLeft($rand));
+ self::assertEquals($rand, $object->getIndentLeft());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentLeft());
+ self::assertNull($object->getIndentLeft());
+ }
+
+ public function testIndentRight(): void
+ {
+ $rand = mt_rand(0, 255);
+
+ $object = new Paragraph();
+ self::assertNull($object->getIndentRight());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentRight($rand));
+ self::assertEquals($rand, $object->getIndentRight());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentRight(null));
+ self::assertNull($object->getIndentRight());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentRight($rand));
+ self::assertEquals($rand, $object->getIndentRight());
+ self::assertInstanceOf(Paragraph::class, $object->setIndentRight());
+ self::assertNull($object->getIndentRight());
+ }
+
/**
* Line height.
*/
diff --git a/tests/PhpWordTests/Writer/Word2007/Style/TableCellTest.php b/tests/PhpWordTests/Writer/Word2007/Style/TableCellTest.php
new file mode 100644
index 0000000000..bd3f587b75
--- /dev/null
+++ b/tests/PhpWordTests/Writer/Word2007/Style/TableCellTest.php
@@ -0,0 +1,86 @@
+addSection();
+ $table = $section->addTable();
+ $table->addRow();
+
+ $testValTop = Converter::pixelToTwip(10);
+ $testValRight = Converter::pixelToTwip(11);
+ $testValBottom = Converter::pixelToTwip(12);
+ $testValLeft = Converter::pixelToTwip(13);
+
+ $cellStyle = [
+ 'paddingTop' => $testValTop,
+ 'paddingRight' => $testValRight,
+ 'paddingBottom' => $testValBottom,
+ 'paddingLeft' => $testValLeft,
+ ];
+ $table->addCell(null, $cellStyle)->addText('Some text');
+ $doc = TestHelperDOCX::getDocument($phpWord, 'Word2007');
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc/w:tcPr/w:tcMar/w:top';
+ self::assertTrue($doc->elementExists($path));
+ self::assertEquals($testValTop, $doc->getElementAttribute($path, 'w:w'));
+ self::assertEquals(TblWidth::TWIP, $doc->getElementAttribute($path, 'w:type'));
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc/w:tcPr/w:tcMar/w:start';
+ self::assertTrue($doc->elementExists($path));
+ self::assertEquals($testValLeft, $doc->getElementAttribute($path, 'w:w'));
+ self::assertEquals(TblWidth::TWIP, $doc->getElementAttribute($path, 'w:type'));
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc/w:tcPr/w:tcMar/w:bottom';
+ self::assertTrue($doc->elementExists($path));
+ self::assertEquals($testValBottom, $doc->getElementAttribute($path, 'w:w'));
+ self::assertEquals(TblWidth::TWIP, $doc->getElementAttribute($path, 'w:type'));
+
+ $path = '/w:document/w:body/w:tbl/w:tr/w:tc/w:tcPr/w:tcMar/w:end';
+ self::assertTrue($doc->elementExists($path));
+ self::assertEquals($testValRight, $doc->getElementAttribute($path, 'w:w'));
+ self::assertEquals(TblWidth::TWIP, $doc->getElementAttribute($path, 'w:type'));
+ }
+}