diff --git a/src/PhpWord/Writer/RTF/Element/Text.php b/src/PhpWord/Writer/RTF/Element/Text.php index 56c922a4..83ade9d2 100644 --- a/src/PhpWord/Writer/RTF/Element/Text.php +++ b/src/PhpWord/Writer/RTF/Element/Text.php @@ -18,7 +18,7 @@ namespace PhpOffice\PhpWord\Writer\RTF\Element; use PhpOffice\PhpWord\PhpWord; -use PhpOffice\PhpWord\Style\Font; +use PhpOffice\PhpWord\Style\Font as FontStyle; use PhpOffice\PhpWord\Style; /** @@ -64,56 +64,81 @@ class Text extends Element $this->parentWriter->setLastParagraphStyle(); } - if ($fontStyle instanceof Font) { - if ($fontStyle->getColor() != null) { - $idxColor = array_search($fontStyle->getColor(), $this->parentWriter->getColorTable()); - if ($idxColor !== false) { - $rtfText .= '\cf' . ($idxColor + 1); - } - } else { - $rtfText .= '\cf0'; - } - if ($fontStyle->getName() != null) { - $idxFont = array_search($fontStyle->getName(), $this->parentWriter->getFontTable()); - if ($idxFont !== false) { - $rtfText .= '\f' . $idxFont; - } - } else { - $rtfText .= '\f0'; - } - if ($fontStyle->isBold()) { - $rtfText .= '\b'; - } - if ($fontStyle->isItalic()) { - $rtfText .= '\i'; - } - if ($fontStyle->getSize()) { - $rtfText .= '\fs' . ($fontStyle->getSize() * 2); - } + if ($fontStyle instanceof FontStyle) { + $rtfText .= $this->writeFontStyleBegin($fontStyle); } if ($this->parentWriter->getLastParagraphStyle() != '' || $fontStyle) { $rtfText .= ' '; } $rtfText .= $this->element->getText(); - - if ($fontStyle instanceof Font) { - $rtfText .= '\cf0'; - $rtfText .= '\f0'; - - if ($fontStyle->isBold()) { - $rtfText .= '\b0'; - } - if ($fontStyle->isItalic()) { - $rtfText .= '\i0'; - } - if ($fontStyle->getSize()) { - $rtfText .= '\fs' . (PhpWord::DEFAULT_FONT_SIZE * 2); - } + if ($fontStyle instanceof FontStyle) { + $rtfText .= $this->writeFontStyleEnd($fontStyle); } - if (!$this->withoutP) { $rtfText .= '\par' . PHP_EOL; } + + return $rtfText; + } + + /** + * Write font style beginning + * + * @return string + */ + private function writeFontStyleBegin(FontStyle $style) + { + $rtfText = ''; + if ($style->getColor() != null) { + $idxColor = array_search($style->getColor(), $this->parentWriter->getColorTable()); + if ($idxColor !== false) { + $rtfText .= '\cf' . ($idxColor + 1); + } + } else { + $rtfText .= '\cf0'; + } + if ($style->getName() != null) { + $idxFont = array_search($style->getName(), $this->parentWriter->getFontTable()); + if ($idxFont !== false) { + $rtfText .= '\f' . $idxFont; + } + } else { + $rtfText .= '\f0'; + } + if ($style->isBold()) { + $rtfText .= '\b'; + } + if ($style->isItalic()) { + $rtfText .= '\i'; + } + if ($style->getSize()) { + $rtfText .= '\fs' . ($style->getSize() * 2); + } + + return $rtfText; + } + + /** + * Write font style ending + * + * @return string + */ + private function writeFontStyleEnd(FontStyle $style) + { + $rtfText = ''; + $rtfText .= '\cf0'; + $rtfText .= '\f0'; + + if ($style->isBold()) { + $rtfText .= '\b0'; + } + if ($style->isItalic()) { + $rtfText .= '\i0'; + } + if ($style->getSize()) { + $rtfText .= '\fs' . (PhpWord::DEFAULT_FONT_SIZE * 2); + } + return $rtfText; } } diff --git a/src/PhpWord/Writer/Word2007/Element/Table.php b/src/PhpWord/Writer/Word2007/Element/Table.php index c8c65816..07863979 100644 --- a/src/PhpWord/Writer/Word2007/Element/Table.php +++ b/src/PhpWord/Writer/Word2007/Element/Table.php @@ -17,7 +17,9 @@ namespace PhpOffice\PhpWord\Writer\Word2007\Element; -use PhpOffice\PhpWord\Style\Cell; +use PhpOffice\PhpWord\Element\Cell as CellElement; +use PhpOffice\PhpWord\Element\Row as RowElement; +use PhpOffice\PhpWord\Style\Cell as CellStyle; use PhpOffice\PhpWord\Style\Table as TableStyle; use PhpOffice\PhpWord\Writer\Word2007\Style\Cell as CellStyleWriter; use PhpOffice\PhpWord\Writer\Word2007\Style\Table as TableStyleWriter; @@ -89,51 +91,66 @@ class Table extends Element // Table rows for ($i = 0; $i < $rowCount; $i++) { - $row = $rows[$i]; - $height = $row->getHeight(); - $rowStyle = $row->getStyle(); - - $this->xmlWriter->startElement('w:tr'); - if (!is_null($height) || $rowStyle->isTblHeader() || $rowStyle->isCantSplit()) { - $this->xmlWriter->startElement('w:trPr'); - if (!is_null($height)) { - $this->xmlWriter->startElement('w:trHeight'); - $this->xmlWriter->writeAttribute('w:val', $height); - $this->xmlWriter->writeAttribute('w:hRule', ($rowStyle->isExactHeight() ? 'exact' : 'atLeast')); - $this->xmlWriter->endElement(); - } - if ($rowStyle->isTblHeader()) { - $this->xmlWriter->startElement('w:tblHeader'); - $this->xmlWriter->writeAttribute('w:val', '1'); - $this->xmlWriter->endElement(); - } - if ($rowStyle->isCantSplit()) { - $this->xmlWriter->startElement('w:cantSplit'); - $this->xmlWriter->writeAttribute('w:val', '1'); - $this->xmlWriter->endElement(); - } - $this->xmlWriter->endElement(); - } - foreach ($row->getCells() as $cell) { - $cellStyle = $cell->getStyle(); - $width = $cell->getWidth(); - $this->xmlWriter->startElement('w:tc'); - $this->xmlWriter->startElement('w:tcPr'); - $this->xmlWriter->startElement('w:tcW'); - $this->xmlWriter->writeAttribute('w:w', $width); - $this->xmlWriter->writeAttribute('w:type', 'dxa'); - $this->xmlWriter->endElement(); // w:tcW - if ($cellStyle instanceof Cell) { - $styleWriter = new CellStyleWriter($this->xmlWriter, $cellStyle); - $styleWriter->write(); - } - $this->xmlWriter->endElement(); // w:tcPr - $this->parentWriter->writeContainerElements($this->xmlWriter, $cell); - $this->xmlWriter->endElement(); // w:tc - } - $this->xmlWriter->endElement(); // w:tr + $this->writeRow($rows[$i]); } $this->xmlWriter->endElement(); } } + + /** + * Write row + */ + private function writeRow(RowElement $row) + { + $height = $row->getHeight(); + $rowStyle = $row->getStyle(); + + $this->xmlWriter->startElement('w:tr'); + if (!is_null($height) || $rowStyle->isTblHeader() || $rowStyle->isCantSplit()) { + $this->xmlWriter->startElement('w:trPr'); + if (!is_null($height)) { + $this->xmlWriter->startElement('w:trHeight'); + $this->xmlWriter->writeAttribute('w:val', $height); + $this->xmlWriter->writeAttribute('w:hRule', ($rowStyle->isExactHeight() ? 'exact' : 'atLeast')); + $this->xmlWriter->endElement(); + } + if ($rowStyle->isTblHeader()) { + $this->xmlWriter->startElement('w:tblHeader'); + $this->xmlWriter->writeAttribute('w:val', '1'); + $this->xmlWriter->endElement(); + } + if ($rowStyle->isCantSplit()) { + $this->xmlWriter->startElement('w:cantSplit'); + $this->xmlWriter->writeAttribute('w:val', '1'); + $this->xmlWriter->endElement(); + } + $this->xmlWriter->endElement(); + } + foreach ($row->getCells() as $cell) { + $this->writeCell($cell); + } + $this->xmlWriter->endElement(); // w:tr + } + + /** + * Write cell + */ + private function writeCell(CellElement $cell) + { + $cellStyle = $cell->getStyle(); + + $this->xmlWriter->startElement('w:tc'); + $this->xmlWriter->startElement('w:tcPr'); + $this->xmlWriter->startElement('w:tcW'); + $this->xmlWriter->writeAttribute('w:w', $cell->getWidth()); + $this->xmlWriter->writeAttribute('w:type', 'dxa'); + $this->xmlWriter->endElement(); // w:tcW + if ($cellStyle instanceof CellStyle) { + $styleWriter = new CellStyleWriter($this->xmlWriter, $cellStyle); + $styleWriter->write(); + } + $this->xmlWriter->endElement(); // w:tcPr + $this->parentWriter->writeContainerElements($this->xmlWriter, $cell); + $this->xmlWriter->endElement(); // w:tc + } } diff --git a/src/PhpWord/Writer/Word2007/Part/Numbering.php b/src/PhpWord/Writer/Word2007/Part/Numbering.php index 6f042b4a..2678ac55 100644 --- a/src/PhpWord/Writer/Word2007/Part/Numbering.php +++ b/src/PhpWord/Writer/Word2007/Part/Numbering.php @@ -17,9 +17,10 @@ namespace PhpOffice\PhpWord\Writer\Word2007\Part; +use PhpOffice\PhpWord\Shared\XMLWriter; +use PhpOffice\PhpWord\Style; use PhpOffice\PhpWord\Style\Numbering as NumberingStyle; use PhpOffice\PhpWord\Style\NumberingLevel; -use PhpOffice\PhpWord\Style; /** * Word2007 numbering part writer: word/numbering.xml @@ -66,76 +67,8 @@ class Numbering extends AbstractPart $xmlWriter->endElement(); // w:multiLevelType if (is_array($levels)) { - foreach ($levels as $levelNum => $levelObject) { - if ($levelObject instanceof NumberingLevel) { - $tabPos = $levelObject->getTabPos(); - $left = $levelObject->getLeft(); - $hanging = $levelObject->getHanging(); - $font = $levelObject->getFont(); - $hint = $levelObject->getHint(); - - $xmlWriter->startElement('w:lvl'); - $xmlWriter->writeAttribute('w:ilvl', $levelNum); - - // Numbering level properties - $properties = array( - 'start' => 'start', - 'format' => 'numFmt', - 'restart' => 'lvlRestart', - 'suffix' => 'suff', - 'text' => 'lvlText', - 'align' => 'lvlJc' - ); - foreach ($properties as $property => $nodeName) { - $getMethod = "get{$property}"; - if (!is_null($levelObject->$getMethod())) { - $xmlWriter->startElement("w:{$nodeName}"); - $xmlWriter->writeAttribute('w:val', $levelObject->$getMethod()); - $xmlWriter->endElement(); // w:start - } - } - - // Paragraph styles - if (!is_null($tabPos) || !is_null($left) || !is_null($hanging)) { - $xmlWriter->startElement('w:pPr'); - if (!is_null($tabPos)) { - $xmlWriter->startElement('w:tabs'); - $xmlWriter->startElement('w:tab'); - $xmlWriter->writeAttribute('w:val', 'num'); - $xmlWriter->writeAttribute('w:pos', $tabPos); - $xmlWriter->endElement(); // w:tab - $xmlWriter->endElement(); // w:tabs - } - if (!is_null($left) || !is_null($hanging)) { - $xmlWriter->startElement('w:ind'); - if (!is_null($left)) { - $xmlWriter->writeAttribute('w:left', $left); - } - if (!is_null($hanging)) { - $xmlWriter->writeAttribute('w:hanging', $hanging); - } - $xmlWriter->endElement(); // w:ind - } - $xmlWriter->endElement(); // w:pPr - } - - // Font styles - if (!is_null($font) || !is_null($hint)) { - $xmlWriter->startElement('w:rPr'); - $xmlWriter->startElement('w:rFonts'); - if (!is_null($font)) { - $xmlWriter->writeAttribute('w:ascii', $font); - $xmlWriter->writeAttribute('w:hAnsi', $font); - $xmlWriter->writeAttribute('w:cs', $font); - } - if (!is_null($hint)) { - $xmlWriter->writeAttribute('w:hint', $hint); - } - $xmlWriter->endElement(); // w:rFonts - $xmlWriter->endElement(); // w:rPr - } - $xmlWriter->endElement(); // w:lvl - } + foreach ($levels as $level) { + $this->writeLevel($xmlWriter, $level); } } $xmlWriter->endElement(); // w:abstractNum @@ -159,6 +92,80 @@ class Numbering extends AbstractPart return $xmlWriter->getData(); } + /** + * Write level + */ + private function writeLevel(XMLWriter $xmlWriter, NumberingLevel $level) + { + $tabPos = $level->getTabPos(); + $left = $level->getLeft(); + $hanging = $level->getHanging(); + $font = $level->getFont(); + $hint = $level->getHint(); + + $xmlWriter->startElement('w:lvl'); + $xmlWriter->writeAttribute('w:ilvl', $level->getLevel()); + + // Numbering level properties + $properties = array( + 'start' => 'start', + 'format' => 'numFmt', + 'restart' => 'lvlRestart', + 'suffix' => 'suff', + 'text' => 'lvlText', + 'align' => 'lvlJc' + ); + foreach ($properties as $property => $nodeName) { + $getMethod = "get{$property}"; + if (!is_null($level->$getMethod())) { + $xmlWriter->startElement("w:{$nodeName}"); + $xmlWriter->writeAttribute('w:val', $level->$getMethod()); + $xmlWriter->endElement(); // w:start + } + } + + // Paragraph styles + if (!is_null($tabPos) || !is_null($left) || !is_null($hanging)) { + $xmlWriter->startElement('w:pPr'); + if (!is_null($tabPos)) { + $xmlWriter->startElement('w:tabs'); + $xmlWriter->startElement('w:tab'); + $xmlWriter->writeAttribute('w:val', 'num'); + $xmlWriter->writeAttribute('w:pos', $tabPos); + $xmlWriter->endElement(); // w:tab + $xmlWriter->endElement(); // w:tabs + } + if (!is_null($left) || !is_null($hanging)) { + $xmlWriter->startElement('w:ind'); + if (!is_null($left)) { + $xmlWriter->writeAttribute('w:left', $left); + } + if (!is_null($hanging)) { + $xmlWriter->writeAttribute('w:hanging', $hanging); + } + $xmlWriter->endElement(); // w:ind + } + $xmlWriter->endElement(); // w:pPr + } + + // Font styles + if (!is_null($font) || !is_null($hint)) { + $xmlWriter->startElement('w:rPr'); + $xmlWriter->startElement('w:rFonts'); + if (!is_null($font)) { + $xmlWriter->writeAttribute('w:ascii', $font); + $xmlWriter->writeAttribute('w:hAnsi', $font); + $xmlWriter->writeAttribute('w:cs', $font); + } + if (!is_null($hint)) { + $xmlWriter->writeAttribute('w:hint', $hint); + } + $xmlWriter->endElement(); // w:rFonts + $xmlWriter->endElement(); // w:rPr + } + $xmlWriter->endElement(); // w:lvl + } + /** * Get random hexadecimal number value *