From c4e8fdac846c8052919ca09f68de51f9e47cdf4d Mon Sep 17 00:00:00 2001 From: Ivan Lanin Date: Tue, 6 May 2014 22:08:39 +0700 Subject: [PATCH] Refactoring for code quality improvement (based on Scrutinizer) --- src/PhpWord/Element/Title.php | 2 +- src/PhpWord/Style/Table.php | 36 +++ src/PhpWord/Writer/Word2007/Element/TOC.php | 245 +++++++++++--------- src/PhpWord/Writer/Word2007/Style/Table.php | 40 +--- 4 files changed, 182 insertions(+), 141 deletions(-) diff --git a/src/PhpWord/Element/Title.php b/src/PhpWord/Element/Title.php index a2dbba8b..481f061b 100644 --- a/src/PhpWord/Element/Title.php +++ b/src/PhpWord/Element/Title.php @@ -138,7 +138,7 @@ class Title extends AbstractElement */ public function setAnchor($anchor) { - $anchor = null; + $this->anchor = $anchor; } /** diff --git a/src/PhpWord/Style/Table.php b/src/PhpWord/Style/Table.php index 7aa108bf..d636b765 100644 --- a/src/PhpWord/Style/Table.php +++ b/src/PhpWord/Style/Table.php @@ -441,4 +441,40 @@ class Table extends Border return $this; } + + /** + * Has borders? + * + * @return bool + */ + public function hasBorders() + { + $hasBorders = false; + $borders = $this->getBorderSize(); + for ($i = 0; $i < 6; $i++) { + if (!is_null($borders[$i])) { + $hasBorders = true; + } + } + + return $hasBorders; + } + + /** + * Has margins? + * + * @return bool + */ + public function hasMargins() + { + $hasMargins = false; + $margins = $this->getCellMargin(); + for ($i = 0; $i < 4; $i++) { + if (!is_null($margins[$i])) { + $hasMargins = true; + } + } + + return $hasMargins; + } } diff --git a/src/PhpWord/Writer/Word2007/Element/TOC.php b/src/PhpWord/Writer/Word2007/Element/TOC.php index 5c2496cb..1ebde1a9 100644 --- a/src/PhpWord/Writer/Word2007/Element/TOC.php +++ b/src/PhpWord/Writer/Word2007/Element/TOC.php @@ -35,117 +35,13 @@ class TOC extends Element public function write() { $titles = $this->element->getTitles(); - $tocStyle = $this->element->getStyleTOC(); - $fontStyle = $this->element->getStyleFont(); - $isObject = ($fontStyle instanceof Font) ? true : false; + $writeFieldMark = true; - $tocFieldWritten = false; foreach ($titles as $title) { - $indent = ($title->getDepth() - 1) * $tocStyle->getIndent(); - $anchor = '_Toc' . ($title->getBookmarkId() + 252634154); - - $this->xmlWriter->startElement('w:p'); - - // Style - $this->xmlWriter->startElement('w:pPr'); - - // Paragraph - if ($isObject && !is_null($fontStyle->getParagraphStyle())) { - $styleWriter = new ParagraphStyleWriter($this->xmlWriter, $fontStyle->getParagraphStyle()); - $styleWriter->write(); + $this->writeTitle($title, $writeFieldMark); + if ($writeFieldMark) { + $writeFieldMark = false; } - - // Font - if (!empty($fontStyle) && !$isObject) { - $this->xmlWriter->startElement('w:rPr'); - $this->xmlWriter->startElement('w:rStyle'); - $this->xmlWriter->writeAttribute('w:val', $fontStyle); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); // w:rPr - } - - // Tab - $this->xmlWriter->startElement('w:tabs'); - $styleWriter = new TabStyleWriter($this->xmlWriter, $tocStyle); - $styleWriter->write(); - $this->xmlWriter->endElement(); - - // Indent - if ($indent > 0) { - $this->xmlWriter->startElement('w:ind'); - $this->xmlWriter->writeAttribute('w:left', $indent); - $this->xmlWriter->endElement(); - } - - $this->xmlWriter->endElement(); // w:pPr - - if ($tocFieldWritten !== true) { - $tocFieldWritten = true; - $minDepth = $this->element->getMinDepth(); - $maxDepth = $this->element->getMaxDepth(); - - $this->xmlWriter->startElement('w:r'); - $this->xmlWriter->startElement('w:fldChar'); - $this->xmlWriter->writeAttribute('w:fldCharType', 'begin'); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - - $this->xmlWriter->startElement('w:r'); - $this->xmlWriter->startElement('w:instrText'); - $this->xmlWriter->writeAttribute('xml:space', 'preserve'); - $this->xmlWriter->writeRaw("TOC \o {$minDepth}-{$maxDepth} \h \z \u"); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - - $this->xmlWriter->startElement('w:r'); - $this->xmlWriter->startElement('w:fldChar'); - $this->xmlWriter->writeAttribute('w:fldCharType', 'separate'); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - } - - $this->xmlWriter->startElement('w:hyperlink'); - $this->xmlWriter->writeAttribute('w:anchor', $anchor); - $this->xmlWriter->writeAttribute('w:history', '1'); - - $this->xmlWriter->startElement('w:r'); - - if ($isObject) { - $styleWriter = new FontStyleWriter($this->xmlWriter, $fontStyle); - $styleWriter->write(); - } - - $this->xmlWriter->startElement('w:t'); - $this->xmlWriter->writeRaw($title->getText()); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - - $this->xmlWriter->startElement('w:r'); - $this->xmlWriter->writeElement('w:tab', null); - $this->xmlWriter->endElement(); - - $this->xmlWriter->startElement('w:r'); - $this->xmlWriter->startElement('w:fldChar'); - $this->xmlWriter->writeAttribute('w:fldCharType', 'begin'); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - - $this->xmlWriter->startElement('w:r'); - $this->xmlWriter->startElement('w:instrText'); - $this->xmlWriter->writeAttribute('xml:space', 'preserve'); - $this->xmlWriter->writeRaw('PAGEREF ' . $anchor . ' \h'); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - - $this->xmlWriter->startElement('w:r'); - $this->xmlWriter->startElement('w:fldChar'); - $this->xmlWriter->writeAttribute('w:fldCharType', 'end'); - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - - $this->xmlWriter->endElement(); // w:hyperlink - - $this->xmlWriter->endElement(); // w:p } $this->xmlWriter->startElement('w:p'); @@ -156,4 +52,137 @@ class TOC extends Element $this->xmlWriter->endElement(); $this->xmlWriter->endElement(); } + + /** + * Write title + */ + private function writeTitle($title, $writeFieldMark) + { + $tocStyle = $this->element->getStyleTOC(); + $fontStyle = $this->element->getStyleFont(); + $isObject = ($fontStyle instanceof Font) ? true : false; + $anchor = '_Toc' . ($title->getBookmarkId() + 252634154); + $indent = ($title->getDepth() - 1) * $tocStyle->getIndent(); + + $this->xmlWriter->startElement('w:p'); + + // Write style and field mark + $this->writeStyle($indent); + if ($writeFieldMark) { + $this->writeFieldMark(); + } + + // Hyperlink + $this->xmlWriter->startElement('w:hyperlink'); + $this->xmlWriter->writeAttribute('w:anchor', $anchor); + $this->xmlWriter->writeAttribute('w:history', '1'); + + // Title text + $this->xmlWriter->startElement('w:r'); + if ($isObject) { + $styleWriter = new FontStyleWriter($this->xmlWriter, $fontStyle); + $styleWriter->write(); + } + $this->xmlWriter->startElement('w:t'); + $this->xmlWriter->writeRaw($title->getText()); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); // w:r + + $this->xmlWriter->startElement('w:r'); + $this->xmlWriter->writeElement('w:tab', null); + $this->xmlWriter->endElement(); + + $this->xmlWriter->startElement('w:r'); + $this->xmlWriter->startElement('w:fldChar'); + $this->xmlWriter->writeAttribute('w:fldCharType', 'begin'); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); + + $this->xmlWriter->startElement('w:r'); + $this->xmlWriter->startElement('w:instrText'); + $this->xmlWriter->writeAttribute('xml:space', 'preserve'); + $this->xmlWriter->writeRaw('PAGEREF ' . $anchor . ' \h'); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); + + $this->xmlWriter->startElement('w:r'); + $this->xmlWriter->startElement('w:fldChar'); + $this->xmlWriter->writeAttribute('w:fldCharType', 'end'); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); + + $this->xmlWriter->endElement(); // w:hyperlink + + $this->xmlWriter->endElement(); // w:p + } + + /** + * Write style + */ + private function writeStyle($indent) + { + $tocStyle = $this->element->getStyleTOC(); + $fontStyle = $this->element->getStyleFont(); + $isObject = ($fontStyle instanceof Font) ? true : false; + + $this->xmlWriter->startElement('w:pPr'); + + // Paragraph + if ($isObject && !is_null($fontStyle->getParagraphStyle())) { + $styleWriter = new ParagraphStyleWriter($this->xmlWriter, $fontStyle->getParagraphStyle()); + $styleWriter->write(); + } + + // Font + if (!empty($fontStyle) && !$isObject) { + $this->xmlWriter->startElement('w:rPr'); + $this->xmlWriter->startElement('w:rStyle'); + $this->xmlWriter->writeAttribute('w:val', $fontStyle); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); // w:rPr + } + + // Tab + $this->xmlWriter->startElement('w:tabs'); + $styleWriter = new TabStyleWriter($this->xmlWriter, $tocStyle); + $styleWriter->write(); + $this->xmlWriter->endElement(); + + // Indent + if ($indent > 0) { + $this->xmlWriter->startElement('w:ind'); + $this->xmlWriter->writeAttribute('w:left', $indent); + $this->xmlWriter->endElement(); + } + + $this->xmlWriter->endElement(); // w:pPr + } + + /** + * Write TOC Field + */ + private function writeFieldMark() + { + $minDepth = $this->element->getMinDepth(); + $maxDepth = $this->element->getMaxDepth(); + + $this->xmlWriter->startElement('w:r'); + $this->xmlWriter->startElement('w:fldChar'); + $this->xmlWriter->writeAttribute('w:fldCharType', 'begin'); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); + + $this->xmlWriter->startElement('w:r'); + $this->xmlWriter->startElement('w:instrText'); + $this->xmlWriter->writeAttribute('xml:space', 'preserve'); + $this->xmlWriter->writeRaw("TOC \o {$minDepth}-{$maxDepth} \h \z \u"); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); + + $this->xmlWriter->startElement('w:r'); + $this->xmlWriter->startElement('w:fldChar'); + $this->xmlWriter->writeAttribute('w:fldCharType', 'separate'); + $this->xmlWriter->endElement(); + $this->xmlWriter->endElement(); + } } diff --git a/src/PhpWord/Writer/Word2007/Style/Table.php b/src/PhpWord/Writer/Word2007/Style/Table.php index 4bc3e5f6..08100118 100644 --- a/src/PhpWord/Writer/Word2007/Style/Table.php +++ b/src/PhpWord/Writer/Word2007/Style/Table.php @@ -40,30 +40,14 @@ class Table extends AbstractStyle return; } - $brdCol = $this->style->getBorderColor(); - $brdSz = $this->style->getBorderSize(); - $cellMargin = $this->style->getCellMargin(); + $hasBorders = $this->style->hasBorders(); + $hasMargins = $this->style->hasMargins(); - // If any of the borders/margins is set, process them - $hasBorders = false; - for ($i = 0; $i < 6; $i++) { - if (!is_null($brdSz[$i])) { - $hasBorders = true; - break; - } - } - $hasMargins = false; - for ($i = 0; $i < 4; $i++) { - if (!is_null($cellMargin[$i])) { - $hasMargins = true; - break; - } - } if ($hasMargins || $hasBorders) { $this->xmlWriter->startElement('w:tblPr'); if ($hasMargins) { $mbWriter = new MarginBorder($this->xmlWriter); - $mbWriter->setSizes($cellMargin); + $mbWriter->setSizes($this->style->getCellMargin()); $this->xmlWriter->startElement('w:tblCellMar'); $mbWriter->write(); @@ -71,8 +55,8 @@ class Table extends AbstractStyle } if ($hasBorders) { $mbWriter = new MarginBorder($this->xmlWriter); - $mbWriter->setSizes($brdSz); - $mbWriter->setColors($brdCol); + $mbWriter->setSizes($this->style->getBorderSize()); + $mbWriter->setColors($this->style->getBorderColor()); $this->xmlWriter->startElement('w:tblBorders'); $mbWriter->write(); @@ -123,18 +107,10 @@ class Table extends AbstractStyle } // Borders - $brdSz = $style->getBorderSize(); - $brdCol = $style->getBorderColor(); - $hasBorders = false; - for ($i = 0; $i < 6; $i++) { - if (!is_null($brdSz[$i])) { - $hasBorders = true; - } - } - if ($hasBorders) { + if ($style->hasBorders()) { $mbWriter = new MarginBorder($this->xmlWriter); - $mbWriter->setSizes($brdSz); - $mbWriter->setColors($brdCol); + $mbWriter->setSizes($style->getBorderSize()); + $mbWriter->setColors($style->getBorderColor()); $this->xmlWriter->startElement('w:tcBorders'); $mbWriter->write();