Change behaviour of `set...` function of boolean properties; Some bug fixing based on Scrutinizer; New `Row` Word2007 style writer

This commit is contained in:
Ivan Lanin 2014-05-13 11:05:12 +07:00
parent 4b1a16006d
commit 8745c5ee30
25 changed files with 251 additions and 148 deletions

View File

@ -18,7 +18,7 @@ tools:
enabled: true enabled: true
timeout: 900 timeout: 900
php_sim: php_sim:
min_mass: 30 min_mass: 16
php_pdepend: true php_pdepend: true
php_analyzer: true php_analyzer: true
sensiolabs_security_checker: true sensiolabs_security_checker: true

View File

@ -42,6 +42,7 @@ This release marked the change of PHPWord license from LGPL 2.1 to LGPL 3; new r
- QA: Add `.scrutinizer.yml` and include `composer.lock` for preparation to Scrutinizer - @ivanlanin GH-186 - QA: Add `.scrutinizer.yml` and include `composer.lock` for preparation to Scrutinizer - @ivanlanin GH-186
- Writer: Refactor writer parts using composite pattern - @ivanlanin - Writer: Refactor writer parts using composite pattern - @ivanlanin
- Docs: Show code quality and test code coverage badge on README - Docs: Show code quality and test code coverage badge on README
- Style: Change behaviour of `set...` function of boolean properties; when none is defined, assumed true - @ivanlanin
## 0.10.0 - 4 May 2014 ## 0.10.0 - 4 May 2014

View File

@ -8,11 +8,12 @@
<rule ref="rulesets/design.xml/ExitExpression" /> <rule ref="rulesets/design.xml/ExitExpression" />
<rule ref="rulesets/design.xml/EvalExpression" /> <rule ref="rulesets/design.xml/EvalExpression" />
<rule ref="rulesets/design.xml/GotoStatement" /> <rule ref="rulesets/design.xml/GotoStatement" />
<rule ref="rulesets/design.xml/NumberOfChildren" />
<rule ref="rulesets/design.xml/DepthOfInheritance" /> <rule ref="rulesets/design.xml/DepthOfInheritance" />
<rule ref="rulesets/design.xml/CouplingBetweenObjects"> <rule ref="rulesets/design.xml/CouplingBetweenObjects" />
<rule ref="rulesets/design.xml/NumberOfChildren">
<!-- AbstractElement and AbstractStyle still needs a lot of children classes -->
<properties> <properties>
<property name="minimum" value="15" /> <property name="minimum" value="20" />
</properties> </properties>
</rule> </rule>
<rule ref="rulesets/unusedcode.xml" /> <rule ref="rulesets/unusedcode.xml" />

View File

@ -51,7 +51,7 @@ for($i = 1; $i <= 8; $i++) {
// 3. colspan (gridSpan) and rowspan (vMerge) // 3. colspan (gridSpan) and rowspan (vMerge)
$section->addTextBreak(1); $section->addPageBreak();
$section->addText("Table with colspan and rowspan", $header); $section->addText("Table with colspan and rowspan", $header);
$styleTable = array('borderSize' => 6, 'borderColor' => '999999'); $styleTable = array('borderSize' => 6, 'borderColor' => '999999');

View File

@ -8,7 +8,7 @@ $phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection(); $section = $phpWord->addSection();
// In section // In section
$textbox = $section->addTextBox(array('align' => 'left', 'width' => 400, 'height' => 150, 'borderSize' => 1, 'borderColor' => '#FF0000')); $textbox = $section->addTextBox(array('align' => 'center', 'width' => 400, 'height' => 150, 'borderSize' => 1, 'borderColor' => '#FF0000'));
$textbox->addText('Text box content in section.'); $textbox->addText('Text box content in section.');
$textbox->addText('Another line.'); $textbox->addText('Another line.');
$cell = $textbox->addTable()->addRow()->addCell(); $cell = $textbox->addTable()->addRow()->addCell();
@ -22,7 +22,7 @@ $textbox->addText('Textbox inside table');
// Inside header with textrun // Inside header with textrun
$header = $section->addHeader(); $header = $section->addHeader();
$textbox = $header->addTextBox(array('align' => 'center', 'width' => 600, 'borderSize' => 1, 'borderColor' => '#00FF00')); $textbox = $header->addTextBox(array('width' => 600, 'borderSize' => 1, 'borderColor' => '#00FF00'));
$textrun = $textbox->addTextRun(); $textrun = $textbox->addTextRun();
$textrun->addText('TextBox in header. TextBox can contain a TextRun '); $textrun->addText('TextBox in header. TextBox can contain a TextRun ');
$textrun->addText('with bold text', array('bold' => true)); $textrun->addText('with bold text', array('bold' => true));

View File

@ -219,7 +219,13 @@ class Html
$text = $cNode->nodeValue; $text = $cNode->nodeValue;
} }
} }
$object->addListItem($text, $data['listdepth'], $styles['fontStyle'], $styles['listStyle'], $styles['paragraphStyle']); $object->addListItem(
$text,
$data['listdepth'],
$styles['fontStyle'],
$styles['listStyle'],
$styles['paragraphStyle']
);
} }
} }

View File

@ -152,13 +152,13 @@ abstract class AbstractStyle
} }
/** /**
* Set boolean value * Set bool value
* *
* @param mixed $value * @param bool $value
* @param boolean|null $default * @param bool $default
* @return boolean|null * @return bool
*/ */
protected function setBoolVal($value, $default = null) protected function setBoolVal($value, $default)
{ {
if (!is_bool($value)) { if (!is_bool($value)) {
$value = $default; $value = $default;
@ -184,7 +184,7 @@ abstract class AbstractStyle
} }
/** /**
* Set float value: Convert string that contains only numeric into integer * Set integer value: Convert string that contains only numeric into integer
* *
* @param mixed $value * @param mixed $value
* @param int|null $default * @param int|null $default

View File

@ -333,7 +333,7 @@ class Font extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setBold($value = false) public function setBold($value = true)
{ {
$this->bold = $this->setBoolVal($value, $this->bold); $this->bold = $this->setBoolVal($value, $this->bold);
@ -356,7 +356,7 @@ class Font extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setItalic($value = false) public function setItalic($value = true)
{ {
$this->italic = $this->setBoolVal($value, $this->italic); $this->italic = $this->setBoolVal($value, $this->italic);
@ -402,7 +402,7 @@ class Font extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setSuperScript($value = false) public function setSuperScript($value = true)
{ {
$this->superScript = $this->setBoolVal($value, $this->superScript); $this->superScript = $this->setBoolVal($value, $this->superScript);
$this->toggleFalse($this->subScript, $this->superScript); $this->toggleFalse($this->subScript, $this->superScript);
@ -426,13 +426,10 @@ class Font extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setSubScript($value = false) public function setSubScript($value = true)
{ {
$this->subScript = $this->setBoolVal($value, $this->subScript); $this->subScript = $this->setBoolVal($value, $this->subScript);
$this->toggleFalse($this->subScript, $this->superScript); $this->toggleFalse($this->subScript, $this->superScript);
if ($this->subScript) {
$this->superScript = false;
}
return $this; return $this;
} }
@ -453,7 +450,7 @@ class Font extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setStrikethrough($value = false) public function setStrikethrough($value = true)
{ {
$this->strikethrough = $this->setBoolVal($value, $this->strikethrough); $this->strikethrough = $this->setBoolVal($value, $this->strikethrough);
$this->toggleFalse($this->doubleStrikethrough, $this->strikethrough); $this->toggleFalse($this->doubleStrikethrough, $this->strikethrough);
@ -477,7 +474,7 @@ class Font extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setDoubleStrikethrough($value = false) public function setDoubleStrikethrough($value = true)
{ {
$this->doubleStrikethrough = $this->setBoolVal($value, $this->doubleStrikethrough); $this->doubleStrikethrough = $this->setBoolVal($value, $this->doubleStrikethrough);
$this->toggleFalse($this->strikethrough, $this->doubleStrikethrough); $this->toggleFalse($this->strikethrough, $this->doubleStrikethrough);
@ -501,7 +498,7 @@ class Font extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setSmallCaps($value = false) public function setSmallCaps($value = true)
{ {
$this->smallCaps = $this->setBoolVal($value, $this->smallCaps); $this->smallCaps = $this->setBoolVal($value, $this->smallCaps);
$this->toggleFalse($this->allCaps, $this->smallCaps); $this->toggleFalse($this->allCaps, $this->smallCaps);
@ -525,7 +522,7 @@ class Font extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setAllCaps($value = false) public function setAllCaps($value = true)
{ {
$this->allCaps = $this->setBoolVal($value, $this->allCaps); $this->allCaps = $this->setBoolVal($value, $this->allCaps);
$this->toggleFalse($this->smallCaps, $this->allCaps); $this->toggleFalse($this->smallCaps, $this->allCaps);

View File

@ -94,9 +94,9 @@ class Image extends AbstractStyle
/** /**
* Alignment * Alignment
* *
* @var string * @var \PhpOffice\PhpWord\Style\Alignment
*/ */
private $align; private $alignment;
/** /**
* Margin Top * Margin Top
@ -154,8 +154,18 @@ class Image extends AbstractStyle
*/ */
private $posVerticalRel = self::POSITION_RELATIVE_TO_LINE; private $posVerticalRel = self::POSITION_RELATIVE_TO_LINE;
/**
* Create new instance
*/
public function __construct()
{
$this->alignment = new Alignment();
}
/** /**
* Get width * Get width
*
* @return int
*/ */
public function getWidth() public function getWidth()
{ {
@ -166,14 +176,19 @@ class Image extends AbstractStyle
* Set width * Set width
* *
* @param int $value * @param int $value
* @return self
*/ */
public function setWidth($value = null) public function setWidth($value = null)
{ {
$this->width = $value; $this->width = $value;
return $this;
} }
/** /**
* Get height * Get height
*
* @return int
*/ */
public function getHeight() public function getHeight()
{ {
@ -184,32 +199,40 @@ class Image extends AbstractStyle
* Set height * Set height
* *
* @param int $value * @param int $value
* @return self
*/ */
public function setHeight($value = null) public function setHeight($value = null)
{ {
$this->height = $value; $this->height = $value;
return $this;
} }
/** /**
* Get alignment * Get alignment
*
* @return string
*/ */
public function getAlign() public function getAlign()
{ {
return $this->align; return $this->alignment->getValue();
} }
/** /**
* Set alignment * Set alignment
* *
* @param string $value * @param string $value
* @return self
*/ */
public function setAlign($value = null) public function setAlign($value = null)
{ {
$this->align = $value; $this->alignment->setValue($value);
return $this;
} }
/** /**
* Get Margin Top * Get margin top
* *
* @return int * @return int
*/ */
@ -219,7 +242,7 @@ class Image extends AbstractStyle
} }
/** /**
* Set Margin Top * Set margin top
* *
* @param int $value * @param int $value
* @return self * @return self
@ -227,11 +250,12 @@ class Image extends AbstractStyle
public function setMarginTop($value = null) public function setMarginTop($value = null)
{ {
$this->marginTop = $value; $this->marginTop = $value;
return $this; return $this;
} }
/** /**
* Get Margin Left * Get margin left
* *
* @return int * @return int
*/ */
@ -241,7 +265,7 @@ class Image extends AbstractStyle
} }
/** /**
* Set Margin Left * Set margin left
* *
* @param int $value * @param int $value
* @return self * @return self
@ -249,6 +273,7 @@ class Image extends AbstractStyle
public function setMarginLeft($value = null) public function setMarginLeft($value = null)
{ {
$this->marginLeft = $value; $this->marginLeft = $value;
return $this; return $this;
} }

View File

@ -420,7 +420,7 @@ class Paragraph extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setKeepNext($value = false) public function setKeepNext($value = true)
{ {
$this->keepNext = $this->setBoolVal($value, $this->keepNext); $this->keepNext = $this->setBoolVal($value, $this->keepNext);
@ -443,7 +443,7 @@ class Paragraph extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setKeepLines($value = false) public function setKeepLines($value = true)
{ {
$this->keepLines = $this->setBoolVal($value, $this->keepLines); $this->keepLines = $this->setBoolVal($value, $this->keepLines);
@ -466,7 +466,7 @@ class Paragraph extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setPageBreakBefore($value = false) public function setPageBreakBefore($value = true)
{ {
$this->pageBreakBefore = $this->setBoolVal($value, $this->pageBreakBefore); $this->pageBreakBefore = $this->setBoolVal($value, $this->pageBreakBefore);

View File

@ -68,7 +68,7 @@ class Row extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setTblHeader($value = false) public function setTblHeader($value = true)
{ {
$this->tblHeader = $this->setBoolVal($value, $this->tblHeader); $this->tblHeader = $this->setBoolVal($value, $this->tblHeader);
@ -91,7 +91,7 @@ class Row extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setCantSplit($value = false) public function setCantSplit($value = true)
{ {
$this->cantSplit = $this->setBoolVal($value, $this->cantSplit); $this->cantSplit = $this->setBoolVal($value, $this->cantSplit);
@ -114,7 +114,7 @@ class Row extends AbstractStyle
* @param bool $value * @param bool $value
* @return self * @return self
*/ */
public function setExactHeight($value = false) public function setExactHeight($value = true)
{ {
$this->exactHeight = $this->setBoolVal($value, $this->exactHeight); $this->exactHeight = $this->setBoolVal($value, $this->exactHeight);

View File

@ -24,6 +24,13 @@ namespace PhpOffice\PhpWord\Writer\HTML\Element;
*/ */
class Container extends AbstractElement class Container extends AbstractElement
{ {
/**
* Namespace; Can't use __NAMESPACE__ in inherited class (RTF)
*
* @var string
*/
protected $namespace = 'PhpOffice\\PhpWord\\Writer\\HTML\\Element';
/** /**
* Write container * Write container
* *
@ -40,8 +47,10 @@ class Container extends AbstractElement
$content = ''; $content = '';
$elements = $container->getElements(); $elements = $container->getElements();
$elementClass = '';
foreach ($elements as $element) { foreach ($elements as $element) {
$writerClass = str_replace('\\Element', '\\Writer\\HTML\\Element', get_class($element)); $elementClass = get_class($element);
$writerClass = str_replace('PhpOffice\\PhpWord\\Element', $this->namespace, $elementClass);
if (class_exists($writerClass)) { if (class_exists($writerClass)) {
$writer = new $writerClass($this->parentWriter, $element, $withoutP); $writer = new $writerClass($this->parentWriter, $element, $withoutP);
$content .= $writer->write(); $content .= $writer->write();

View File

@ -25,29 +25,9 @@ namespace PhpOffice\PhpWord\Writer\RTF\Element;
class Container extends \PhpOffice\PhpWord\Writer\HTML\Element\Container class Container extends \PhpOffice\PhpWord\Writer\HTML\Element\Container
{ {
/** /**
* Write container * Namespace; Can't use __NAMESPACE__ in inherited class (RTF)
* *
* @return string * @var string
*/ */
public function write() protected $namespace = 'PhpOffice\\PhpWord\\Writer\\RTF\\Element';
{
$container = $this->element;
if (!$container instanceof \PhpOffice\PhpWord\Element\AbstractContainer) {
return;
}
$containerClass = substr(get_class($container), strrpos(get_class($container), '\\') + 1);
$withoutP = in_array($containerClass, array('TextRun', 'Footnote', 'Endnote')) ? true : false;
$content = '';
$elements = $container->getElements();
foreach ($elements as $element) {
$writerClass = str_replace('\\Element', '\\Writer\\RTF\\Element', get_class($element));
if (class_exists($writerClass)) {
$writer = new $writerClass($this->parentWriter, $element, $withoutP);
$content .= $writer->write();
}
}
return $content;
}
} }

View File

@ -18,7 +18,6 @@
namespace PhpOffice\PhpWord\Writer\RTF\Style; namespace PhpOffice\PhpWord\Writer\RTF\Style;
use PhpOffice\PhpWord\Style\Alignment; use PhpOffice\PhpWord\Style\Alignment;
use PhpOffice\PhpWord\Style\Paragraph as ParagraphStyle;
/** /**
* RTF paragraph style writer * RTF paragraph style writer

View File

@ -38,25 +38,23 @@ class Container extends AbstractElement
*/ */
public function write() public function write()
{ {
$xmlWriter = $this->getXmlWriter();
$container = $this->getElement(); $container = $this->getElement();
if (!$container instanceof \PhpOffice\PhpWord\Element\AbstractContainer) { if (!$container instanceof \PhpOffice\PhpWord\Element\AbstractContainer) {
return; return;
} }
$containerClass = substr(get_class($container), strrpos(get_class($container), '\\') + 1); $containerClass = substr(get_class($container), strrpos(get_class($container), '\\') + 1);
$withoutP = in_array($containerClass, array('TextRun', 'Footnote', 'Endnote', 'ListItemRun')) ? true : false; $withoutP = in_array($containerClass, array('TextRun', 'Footnote', 'Endnote', 'ListItemRun')) ? true : false;
$xmlWriter = $this->getXmlWriter();
// Loop through elements // Loop through elements
$elements = $container->getElements(); $elements = $container->getElements();
$elementClass = ''; $elementClass = '';
if (count($elements) > 0) { foreach ($elements as $element) {
foreach ($elements as $element) { $elementClass = get_class($element);
$elementClass = get_class($element); $writerClass = str_replace('PhpOffice\\PhpWord\\Element', $this->namespace, $elementClass);
$writerClass = str_replace('PhpOffice\\PhpWord\\Element', $this->namespace, $elementClass); if (class_exists($writerClass)) {
if (class_exists($writerClass)) { $writer = new $writerClass($xmlWriter, $element, $withoutP);
$writer = new $writerClass($xmlWriter, $element, $withoutP); $writer->write();
$writer->write();
}
} }
} }

View File

@ -57,15 +57,8 @@ class Image extends AbstractElement
if (!$this->withoutP) { if (!$this->withoutP) {
$xmlWriter->startElement('w:p'); $xmlWriter->startElement('w:p');
if (!is_null($style->getAlign())) { $styleWriter->writeAlignment();
$xmlWriter->startElement('w:pPr');
$xmlWriter->startElement('w:jc');
$xmlWriter->writeAttribute('w:val', $style->getAlign());
$xmlWriter->endElement(); // w:jc
$xmlWriter->endElement(); // w:pPr
}
} }
$xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:r');
$xmlWriter->startElement('w:pict'); $xmlWriter->startElement('w:pict');
$xmlWriter->startElement('v:shape'); $xmlWriter->startElement('v:shape');

View File

@ -17,6 +17,8 @@
namespace PhpOffice\PhpWord\Writer\Word2007\Element; namespace PhpOffice\PhpWord\Writer\Word2007\Element;
use PhpOffice\PhpWord\Writer\Word2007\Style\Image as ImageStyleWriter;
/** /**
* Object element writer * Object element writer
* *
@ -40,17 +42,11 @@ class Object extends AbstractElement
$shapeId = md5($rIdObject . '_' . $rIdImage); $shapeId = md5($rIdObject . '_' . $rIdImage);
$objectId = $element->getRelationId() + 1325353440; $objectId = $element->getRelationId() + 1325353440;
$style = $element->getStyle(); $style = $element->getStyle();
$align = $style->getAlign(); $styleWriter = new ImageStyleWriter($xmlWriter, $style);
if (!$this->withoutP) { if (!$this->withoutP) {
$xmlWriter->startElement('w:p'); $xmlWriter->startElement('w:p');
} $styleWriter->writeAlignment();
if (!is_null($align)) {
$xmlWriter->startElement('w:pPr');
$xmlWriter->startElement('w:jc');
$xmlWriter->writeAttribute('w:val', $align);
$xmlWriter->endElement();
$xmlWriter->endElement();
} }
$xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:r');
$xmlWriter->startElement('w:object'); $xmlWriter->startElement('w:object');

View File

@ -21,8 +21,10 @@ use PhpOffice\PhpWord\Element\Cell as CellElement;
use PhpOffice\PhpWord\Element\Row as RowElement; use PhpOffice\PhpWord\Element\Row as RowElement;
use PhpOffice\PhpWord\Shared\XMLWriter; use PhpOffice\PhpWord\Shared\XMLWriter;
use PhpOffice\PhpWord\Style\Cell as CellStyle; use PhpOffice\PhpWord\Style\Cell as CellStyle;
use PhpOffice\PhpWord\Style\Row as RowStyle;
use PhpOffice\PhpWord\Style\Table as TableStyle; use PhpOffice\PhpWord\Style\Table as TableStyle;
use PhpOffice\PhpWord\Writer\Word2007\Style\Cell as CellStyleWriter; use PhpOffice\PhpWord\Writer\Word2007\Style\Cell as CellStyleWriter;
use PhpOffice\PhpWord\Writer\Word2007\Style\Row as RowStyleWriter;
use PhpOffice\PhpWord\Writer\Word2007\Style\Table as TableStyleWriter; use PhpOffice\PhpWord\Writer\Word2007\Style\Table as TableStyleWriter;
/** /**
@ -109,33 +111,21 @@ class Table extends AbstractElement
*/ */
private function writeRow(XMLWriter $xmlWriter, RowElement $row) private function writeRow(XMLWriter $xmlWriter, RowElement $row)
{ {
$height = $row->getHeight();
$rowStyle = $row->getStyle();
$xmlWriter->startElement('w:tr'); $xmlWriter->startElement('w:tr');
if (!is_null($height) || $rowStyle->isTblHeader() || $rowStyle->isCantSplit()) {
$xmlWriter->startElement('w:trPr'); // Write style
if (!is_null($height)) { $rowStyle = $row->getStyle();
$xmlWriter->startElement('w:trHeight'); if ($rowStyle instanceof RowStyle) {
$xmlWriter->writeAttribute('w:val', $height); $styleWriter = new RowStyleWriter($xmlWriter, $rowStyle);
$xmlWriter->writeAttribute('w:hRule', ($rowStyle->isExactHeight() ? 'exact' : 'atLeast')); $styleWriter->setHeight($row->getHeight());
$xmlWriter->endElement(); $styleWriter->write();
}
if ($rowStyle->isTblHeader()) {
$xmlWriter->startElement('w:tblHeader');
$xmlWriter->writeAttribute('w:val', '1');
$xmlWriter->endElement();
}
if ($rowStyle->isCantSplit()) {
$xmlWriter->startElement('w:cantSplit');
$xmlWriter->writeAttribute('w:val', '1');
$xmlWriter->endElement();
}
$xmlWriter->endElement();
} }
// Write cells
foreach ($row->getCells() as $cell) { foreach ($row->getCells() as $cell) {
$this->writeCell($xmlWriter, $cell); $this->writeCell($xmlWriter, $cell);
} }
$xmlWriter->endElement(); // w:tr $xmlWriter->endElement(); // w:tr
} }
@ -144,20 +134,18 @@ class Table extends AbstractElement
*/ */
private function writeCell(XMLWriter $xmlWriter, CellElement $cell) private function writeCell(XMLWriter $xmlWriter, CellElement $cell)
{ {
$cellStyle = $cell->getStyle();
$xmlWriter->startElement('w:tc'); $xmlWriter->startElement('w:tc');
$xmlWriter->startElement('w:tcPr');
$xmlWriter->startElement('w:tcW'); // Write style
$xmlWriter->writeAttribute('w:w', $cell->getWidth()); $cellStyle = $cell->getStyle();
$xmlWriter->writeAttribute('w:type', 'dxa');
$xmlWriter->endElement(); // w:tcW
if ($cellStyle instanceof CellStyle) { if ($cellStyle instanceof CellStyle) {
$styleWriter = new CellStyleWriter($xmlWriter, $cellStyle); $styleWriter = new CellStyleWriter($xmlWriter, $cellStyle);
$styleWriter->setWidth($cell->getWidth());
$styleWriter->write(); $styleWriter->write();
} }
$xmlWriter->endElement(); // w:tcPr
// Write content
$containerWriter = new Container($xmlWriter, $cell); $containerWriter = new Container($xmlWriter, $cell);
$containerWriter->write(); $containerWriter->write();

View File

@ -41,13 +41,7 @@ class TextBox extends AbstractElement
if (!$this->withoutP) { if (!$this->withoutP) {
$xmlWriter->startElement('w:p'); $xmlWriter->startElement('w:p');
if (!is_null($style->getAlign())) { $styleWriter->writeAlignment();
$xmlWriter->startElement('w:pPr');
$xmlWriter->startElement('w:jc');
$xmlWriter->writeAttribute('w:val', $style->getAlign());
$xmlWriter->endElement(); // w:jc
$xmlWriter->endElement(); // w:pPr
}
} }
$xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:r');

View File

@ -26,6 +26,11 @@ use PhpOffice\PhpWord\Style\Cell as CellStyle;
*/ */
class Cell extends AbstractStyle class Cell extends AbstractStyle
{ {
/**
* @var int Cell width
*/
private $width;
/** /**
* Write style * Write style
*/ */
@ -37,6 +42,14 @@ class Cell extends AbstractStyle
} }
$xmlWriter = $this->getXmlWriter(); $xmlWriter = $this->getXmlWriter();
$xmlWriter->startElement('w:tcPr');
// Width
$xmlWriter->startElement('w:tcW');
$xmlWriter->writeAttribute('w:w', $this->width);
$xmlWriter->writeAttribute('w:type', 'dxa');
$xmlWriter->endElement(); // w:tcW
// Text direction // Text direction
$textDir = $style->getTextDirection(); $textDir = $style->getTextDirection();
$xmlWriter->writeElementIf(!is_null($textDir), 'w:textDirection', 'w:val', $textDir); $xmlWriter->writeElementIf(!is_null($textDir), 'w:textDirection', 'w:val', $textDir);
@ -70,5 +83,17 @@ class Cell extends AbstractStyle
$vMerge = $style->getVMerge(); $vMerge = $style->getVMerge();
$xmlWriter->writeElementIf(!is_null($gridSpan), 'w:gridSpan', 'w:val', $gridSpan); $xmlWriter->writeElementIf(!is_null($gridSpan), 'w:gridSpan', 'w:val', $gridSpan);
$xmlWriter->writeElementIf(!is_null($vMerge), 'w:vMerge', 'w:val', $vMerge); $xmlWriter->writeElementIf(!is_null($vMerge), 'w:vMerge', 'w:val', $vMerge);
$xmlWriter->endElement(); // w:tcPr
}
/**
* Set width
*
* @param int $value
*/
public function setWidth($value = null)
{
$this->width = $value;
} }
} }

View File

@ -17,6 +17,7 @@
namespace PhpOffice\PhpWord\Writer\Word2007\Style; namespace PhpOffice\PhpWord\Writer\Word2007\Style;
use PhpOffice\PhpWord\Style\Alignment as AlignmentStyle;
use PhpOffice\PhpWord\Style\Image as ImageStyle; use PhpOffice\PhpWord\Style\Image as ImageStyle;
/** /**
@ -45,23 +46,6 @@ class Image extends AbstractStyle
$this->writeStyle($style); $this->writeStyle($style);
} }
/**
* Write w10 wrapping
*
* @return array
*/
public function writeW10Wrap()
{
if (is_null($this->w10wrap)) {
return;
}
$xmlWriter = $this->getXmlWriter();
$xmlWriter->startElement('w10:wrap');
$xmlWriter->writeAttribute('type', $this->w10wrap);
$xmlWriter->endElement(); // w10:wrap
}
/** /**
* Write style attribute * Write style attribute
*/ */
@ -117,6 +101,38 @@ class Image extends AbstractStyle
$xmlWriter->writeAttribute('style', $imageStyle); $xmlWriter->writeAttribute('style', $imageStyle);
} }
/**
* Write alignment
*/
public function writeAlignment()
{
$style = $this->getStyle();
if (!$style instanceof \PhpOffice\PhpWord\Style\Image) {
return;
}
$xmlWriter = $this->getXmlWriter();
$xmlWriter->startElement('w:pPr');
$styleWriter = new Alignment($xmlWriter, new AlignmentStyle(array('value' => $style->getAlign())));
$styleWriter->write();
$xmlWriter->endElement(); // w:pPr
}
/**
* Write w10 wrapping
*/
public function writeW10Wrap()
{
if (is_null($this->w10wrap)) {
return;
}
$xmlWriter = $this->getXmlWriter();
$xmlWriter->startElement('w10:wrap');
$xmlWriter->writeAttribute('type', $this->w10wrap);
$xmlWriter->endElement(); // w10:wrap
}
/** /**
* Get element style * Get element style
* *

View File

@ -0,0 +1,68 @@
<?php
/**
* This file is part of PHPWord - A pure PHP library for reading and writing
* word processing documents.
*
* PHPWord is free software distributed under the terms of the GNU Lesser
* General Public License version 3 as published by the Free Software Foundation.
*
* For the full copyright and license information, please read the LICENSE
* file that was distributed with this source code. For the full list of
* contributors, visit https://github.com/PHPOffice/PHPWord/contributors.
*
* @link https://github.com/PHPOffice/PHPWord
* @copyright 2010-2014 PHPWord contributors
* @license http://www.gnu.org/licenses/lgpl.txt LGPL version 3
*/
namespace PhpOffice\PhpWord\Writer\Word2007\Style;
use PhpOffice\PhpWord\Style\Row as RowStyle;
/**
* Row style writer
*
* @since 0.11.0
*/
class Row extends AbstractStyle
{
/**
* @var int Row height
*/
private $height;
/**
* Write style
*/
public function write()
{
$style = $this->getStyle();
if (!$style instanceof \PhpOffice\PhpWord\Style\Row) {
return;
}
$xmlWriter = $this->getXmlWriter();
$xmlWriter->startElement('w:trPr');
if ($this->height !== null) {
$xmlWriter->startElement('w:trHeight');
$xmlWriter->writeAttribute('w:val', $this->height);
$xmlWriter->writeAttribute('w:hRule', ($style->isExactHeight() ? 'exact' : 'atLeast'));
$xmlWriter->endElement();
}
$xmlWriter->writeElementIf($style->isTblHeader(), 'w:tblHeader', 'w:val', '1');
$xmlWriter->writeElementIf($style->isCantSplit(), 'w:cantSplit', 'w:val', '1');
$xmlWriter->endElement(); // w:trPr
}
/**
* Set height
*
* @param int $value
*/
public function setHeight($value = null)
{
$this->height = $value;
}
}

View File

@ -59,17 +59,21 @@ class FontTest extends \PHPUnit_Framework_TestCase
'size' => PhpWord::DEFAULT_FONT_SIZE, 'size' => PhpWord::DEFAULT_FONT_SIZE,
'bold' => false, 'bold' => false,
'italic' => false, 'italic' => false,
'underline' => Font::UNDERLINE_NONE,
'superScript' => false, 'superScript' => false,
'subScript' => false, 'subScript' => false,
'underline' => Font::UNDERLINE_NONE,
'strikethrough' => false, 'strikethrough' => false,
'doubleStrikethrough' => false,
'smallCaps' => false,
'allCaps' => false,
'doubleStrikethrough' => false,
'color' => PhpWord::DEFAULT_FONT_COLOR, 'color' => PhpWord::DEFAULT_FONT_COLOR,
'fgColor' => null, 'fgColor' => null,
'bgColor' => null, 'bgColor' => null,
'hint' => PhpWord::DEFAULT_FONT_CONTENT_TYPE, 'hint' => PhpWord::DEFAULT_FONT_CONTENT_TYPE,
); );
foreach ($attributes as $key => $default) { foreach ($attributes as $key => $default) {
$get = "get{$key}"; $get = is_bool($default) ? "is{$key}" : "get{$key}";
$object->setStyleValue("$key", null); $object->setStyleValue("$key", null);
$this->assertEquals($default, $object->$get()); $this->assertEquals($default, $object->$get());
$object->setStyleValue("$key", ''); $object->setStyleValue("$key", '');
@ -89,10 +93,13 @@ class FontTest extends \PHPUnit_Framework_TestCase
'size' => 9, 'size' => 9,
'bold' => true, 'bold' => true,
'italic' => true, 'italic' => true,
'underline' => Font::UNDERLINE_HEAVY,
'superScript' => true, 'superScript' => true,
'subScript' => false, 'subScript' => false,
'underline' => Font::UNDERLINE_HEAVY,
'strikethrough' => true, 'strikethrough' => true,
'doubleStrikethrough' => false,
'smallCaps' => true,
'allCaps' => false,
'color' => '999999', 'color' => '999999',
'fgColor' => Font::FGCOLOR_YELLOW, 'fgColor' => Font::FGCOLOR_YELLOW,
'bgColor' => 'FFFF00', 'bgColor' => 'FFFF00',
@ -101,7 +108,7 @@ class FontTest extends \PHPUnit_Framework_TestCase
); );
$object->setStyleByArray($attributes); $object->setStyleByArray($attributes);
foreach ($attributes as $key => $value) { foreach ($attributes as $key => $value) {
$get = "get{$key}"; $get = is_bool($value) ? "is{$key}" : "get{$key}";
$this->assertEquals($value, $object->$get()); $this->assertEquals($value, $object->$get());
} }
} }

View File

@ -179,7 +179,7 @@ class DocumentTest extends \PHPUnit_Framework_TestCase
$textrun->addTextBreak(); $textrun->addTextBreak();
$textrun = $section->addTextRun($aStyle); $textrun = $section->addTextRun($aStyle);
$textrun->addLink('http://test.com'); $textrun->addLink('http://test.com');
$textrun->addImage($imageSrc, array('align' => 'top')); $textrun->addImage($imageSrc, array('align' => 'center'));
$textrun->addFootnote(); $textrun->addFootnote();
$doc = TestHelperDOCX::getDocument($phpWord); $doc = TestHelperDOCX::getDocument($phpWord);

View File

@ -30,7 +30,7 @@ class StyleTest extends \PHPUnit_Framework_TestCase
{ {
$styles = array( $styles = array(
'Alignment', 'Cell', 'Font', 'Image', 'Indentation', 'LineNumbering', 'Alignment', 'Cell', 'Font', 'Image', 'Indentation', 'LineNumbering',
'Paragraph', 'Section', 'Shading', 'Spacing', 'Tab', 'Table', 'TextBox' 'Paragraph', 'Row', 'Section', 'Shading', 'Spacing', 'Tab', 'Table', 'TextBox'
); );
foreach ($styles as $style) { foreach ($styles as $style) {
$objectClass = 'PhpOffice\\PhpWord\\Writer\\Word2007\\Style\\' . $style; $objectClass = 'PhpOffice\\PhpWord\\Writer\\Word2007\\Style\\' . $style;