From 1c3735fc080645324924a4a2639ea7e8378007ff Mon Sep 17 00:00:00 2001 From: Ivan Lanin Date: Thu, 15 May 2014 11:46:28 +0700 Subject: [PATCH] Refactor table and font styles to reduce duplication --- .scrutinizer.yml | 1 - src/PhpWord/Style/Font.php | 47 ++++------ src/PhpWord/Style/Table.php | 93 ++++++++++++------- .../Tests/Writer/Word2007/Part/StylesTest.php | 19 ++-- 4 files changed, 85 insertions(+), 75 deletions(-) diff --git a/.scrutinizer.yml b/.scrutinizer.yml index ded9a39f..a35530a9 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -17,7 +17,6 @@ tools: enabled: true timeout: 900 php_sim: - enabled: true min_mass: 40 php_pdepend: true php_analyzer: true diff --git a/src/PhpWord/Style/Font.php b/src/PhpWord/Style/Font.php index a4d56dd4..f56a4789 100644 --- a/src/PhpWord/Style/Font.php +++ b/src/PhpWord/Style/Font.php @@ -404,10 +404,7 @@ class Font extends AbstractStyle */ public function setSuperScript($value = true) { - $this->superScript = $this->setBoolVal($value, $this->superScript); - $this->toggleFalse($this->subScript, $this->superScript); - - return $this; + return $this->setPairedProperty($this->superScript, $this->subScript, $value); } /** @@ -428,10 +425,7 @@ class Font extends AbstractStyle */ public function setSubScript($value = true) { - $this->subScript = $this->setBoolVal($value, $this->subScript); - $this->toggleFalse($this->subScript, $this->superScript); - - return $this; + return $this->setPairedProperty($this->subScript, $this->superScript, $value); } /** @@ -452,10 +446,7 @@ class Font extends AbstractStyle */ public function setStrikethrough($value = true) { - $this->strikethrough = $this->setBoolVal($value, $this->strikethrough); - $this->toggleFalse($this->doubleStrikethrough, $this->strikethrough); - - return $this; + return $this->setPairedProperty($this->strikethrough, $this->doubleStrikethrough, $value); } /** @@ -476,10 +467,7 @@ class Font extends AbstractStyle */ public function setDoubleStrikethrough($value = true) { - $this->doubleStrikethrough = $this->setBoolVal($value, $this->doubleStrikethrough); - $this->toggleFalse($this->strikethrough, $this->doubleStrikethrough); - - return $this; + return $this->setPairedProperty($this->doubleStrikethrough, $this->strikethrough, $value); } /** @@ -500,10 +488,7 @@ class Font extends AbstractStyle */ public function setSmallCaps($value = true) { - $this->smallCaps = $this->setBoolVal($value, $this->smallCaps); - $this->toggleFalse($this->allCaps, $this->smallCaps); - - return $this; + return $this->setPairedProperty($this->smallCaps, $this->allCaps, $value); } /** @@ -524,10 +509,7 @@ class Font extends AbstractStyle */ public function setAllCaps($value = true) { - $this->allCaps = $this->setBoolVal($value, $this->allCaps); - $this->toggleFalse($this->smallCaps, $this->allCaps); - - return $this; + return $this->setPairedProperty($this->allCaps, $this->smallCaps, $value); } /** @@ -648,16 +630,21 @@ class Font extends AbstractStyle } /** - * Toggle $target property to false when $source true + * Set $property value and set $pairProperty = false when $value = true * - * @param bool|null $target Target property - * @param bool $sourceValue + * @param bool $property + * @param bool $pair + * @param bool $value + * @return self */ - private function toggleFalse(&$target, $sourceValue) + private function setPairedProperty(&$property, &$pairProperty, $value) { - if ($sourceValue == true) { - $target = false; + $property = $this->setBoolVal($value, $property); + if ($value == true) { + $pairProperty = false; } + + return $this; } /** diff --git a/src/PhpWord/Style/Table.php b/src/PhpWord/Style/Table.php index 4559e677..32821793 100644 --- a/src/PhpWord/Style/Table.php +++ b/src/PhpWord/Style/Table.php @@ -124,7 +124,8 @@ class Table extends Border { $this->alignment = new Alignment(); - if ($firstRowStyle !== null && is_array($firstRowStyle)) { + // Clone first row from table style, but with certain properties disabled + if ($firstRowStyle !== null && is_array($firstRowStyle)) { $this->firstRow = clone $this; unset($this->firstRow->firstRow); unset($this->firstRow->borderInsideHSize); @@ -257,7 +258,7 @@ class Table extends Border */ public function getBorderInsideHSize() { - return isset($this->borderInsideHSize) ? $this->borderInsideHSize : null; + return $this->getTableOnlyProperty('borderInsideHSize'); } /** @@ -268,9 +269,7 @@ class Table extends Border */ public function setBorderInsideHSize($value = null) { - $this->borderInsideHSize = $this->setNumericVal($value, $this->borderInsideHSize); - - return $this; + return $this->setTableOnlyProperty('borderInsideHSize', $value); } /** @@ -280,7 +279,7 @@ class Table extends Border */ public function getBorderInsideHColor() { - return isset($this->borderInsideHColor) ? $this->borderInsideHColor : null; + return $this->getTableOnlyProperty('borderInsideHColor'); } /** @@ -291,9 +290,7 @@ class Table extends Border */ public function setBorderInsideHColor($value = null) { - $this->borderInsideHColor = $value ; - - return $this; + return $this->setTableOnlyProperty('borderInsideHColor', $value, false); } /** @@ -303,7 +300,7 @@ class Table extends Border */ public function getBorderInsideVSize() { - return isset($this->borderInsideVSize) ? $this->borderInsideVSize : null; + return $this->getTableOnlyProperty('borderInsideVSize'); } /** @@ -314,9 +311,7 @@ class Table extends Border */ public function setBorderInsideVSize($value = null) { - $this->borderInsideVSize = $this->setNumericVal($value, $this->borderInsideVSize); - - return $this; + return $this->setTableOnlyProperty('borderInsideVSize', $value); } /** @@ -326,7 +321,7 @@ class Table extends Border */ public function getBorderInsideVColor() { - return isset($this->borderInsideVColor) ? $this->borderInsideVColor : null; + return $this->getTableOnlyProperty('borderInsideVColor'); } /** @@ -337,9 +332,7 @@ class Table extends Border */ public function setBorderInsideVColor($value = null) { - $this->borderInsideVColor = $value; - - return $this; + return $this->setTableOnlyProperty('borderInsideVColor', $value, false); } /** @@ -349,7 +342,7 @@ class Table extends Border */ public function getCellMarginTop() { - return $this->cellMarginTop; + return $this->getTableOnlyProperty('cellMarginTop'); } /** @@ -360,9 +353,7 @@ class Table extends Border */ public function setCellMarginTop($value = null) { - $this->cellMarginTop = $this->setNumericVal($value, $this->cellMarginTop); - - return $this; + return $this->setTableOnlyProperty('cellMarginTop', $value); } /** @@ -372,7 +363,7 @@ class Table extends Border */ public function getCellMarginLeft() { - return $this->cellMarginLeft; + return $this->getTableOnlyProperty('cellMarginLeft'); } /** @@ -383,9 +374,7 @@ class Table extends Border */ public function setCellMarginLeft($value = null) { - $this->cellMarginLeft = $this->setNumericVal($value, $this->cellMarginLeft); - - return $this; + return $this->setTableOnlyProperty('cellMarginLeft', $value); } /** @@ -395,7 +384,7 @@ class Table extends Border */ public function getCellMarginRight() { - return $this->cellMarginRight; + return $this->getTableOnlyProperty('cellMarginRight'); } /** @@ -406,9 +395,7 @@ class Table extends Border */ public function setCellMarginRight($value = null) { - $this->cellMarginRight = $this->setNumericVal($value, $this->cellMarginRight); - - return $this; + return $this->setTableOnlyProperty('cellMarginRight', $value); } /** @@ -418,7 +405,7 @@ class Table extends Border */ public function getCellMarginBottom() { - return $this->cellMarginBottom; + return $this->getTableOnlyProperty('cellMarginBottom'); } /** @@ -429,9 +416,7 @@ class Table extends Border */ public function setCellMarginBottom($value = null) { - $this->cellMarginBottom = $this->setNumericVal($value, $this->cellMarginBottom); - - return $this; + return $this->setTableOnlyProperty('cellMarginBottom', $value); } /** @@ -569,4 +554,46 @@ class Table extends Border return $this; } + + /** + * Get table style only property by checking if firstRow is set + * + * This is necessary since firstRow style is cloned from table style but + * without certain properties activated, e.g. margins + * + * @param string $property + * @return int|string|null + */ + private function getTableOnlyProperty($property) + { + if (isset($this->firstRow)) { + return $this->$property; + } + + return null; + } + + /** + * Set table style only property by checking if firstRow is set + * + * This is necessary since firstRow style is cloned from table style but + * without certain properties activated, e.g. margins + * + * @param string $property + * @param int|string $value + * @param bool $isNumeric + * @return self + */ + private function setTableOnlyProperty($property, $value, $isNumeric = true) + { + if (isset($this->firstRow)) { + if ($isNumeric) { + $this->$property = $this->setNumericVal($value, $this->$property); + } else { + $this->$property = $value; + } + } + + return $this; + } } diff --git a/tests/PhpWord/Tests/Writer/Word2007/Part/StylesTest.php b/tests/PhpWord/Tests/Writer/Word2007/Part/StylesTest.php index 795d3e8a..103caa81 100644 --- a/tests/PhpWord/Tests/Writer/Word2007/Part/StylesTest.php +++ b/tests/PhpWord/Tests/Writer/Word2007/Part/StylesTest.php @@ -49,22 +49,19 @@ class StylesTest extends \PHPUnit_Framework_TestCase $rStyle = array('size' => 20); $tStyle = array( 'bgColor' => 'FF0000', - 'cellMarginTop' => 120, - 'cellMarginBottom' => 120, - 'cellMarginLeft' => 120, - 'cellMarginRight' => 120, - 'borderTopSize' => 120, - 'borderBottomSize' => 120, - 'borderLeftSize' => 120, - 'borderRightSize' => 120, - 'borderInsideHSize' => 120, - 'borderInsideVSize' => 120, + 'cellMargin' => 120, + 'borderSize' => 120, + ); + $firstRowStyle = array( + 'bgColor' => '0000FF', + 'borderSize' => 120, + 'borderColor' => '00FF00', ); $phpWord->setDefaultParagraphStyle($pStyle); $phpWord->addParagraphStyle('Base Style', $pBase); $phpWord->addParagraphStyle('New Style', $pNew); $phpWord->addFontStyle('New Style', $rStyle, $pStyle); - $phpWord->addTableStyle('Table Style', $tStyle, $tStyle); + $phpWord->addTableStyle('Table Style', $tStyle, $firstRowStyle); $phpWord->addTitleStyle(1, $rStyle, $pStyle); $doc = TestHelperDOCX::getDocument($phpWord);