Skip to content

Commit 559a798

Browse files
committed
Refactor: Apply composite design pattern to ODText/OpenDocument writer
1 parent b7480d8 commit 559a798

File tree

11 files changed

+347
-260
lines changed

11 files changed

+347
-260
lines changed

src/PhpWord/Writer/ODText/Content.php

Lines changed: 3 additions & 252 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,11 @@
1212
use PhpOffice\PhpWord\Media;
1313
use PhpOffice\PhpWord\Style;
1414
use PhpOffice\PhpWord\PhpWord;
15-
use PhpOffice\PhpWord\Element\Image;
16-
use PhpOffice\PhpWord\Element\Link;
17-
use PhpOffice\PhpWord\Element\ListItem;
18-
use PhpOffice\PhpWord\Element\Object;
19-
use PhpOffice\PhpWord\Element\PageBreak;
20-
use PhpOffice\PhpWord\Element\Table;
21-
use PhpOffice\PhpWord\Element\Text;
22-
use PhpOffice\PhpWord\Element\TextBreak;
23-
use PhpOffice\PhpWord\Element\TextRun;
24-
use PhpOffice\PhpWord\Element\Title;
2515
use PhpOffice\PhpWord\Exception\Exception;
26-
use PhpOffice\PhpWord\Shared\Drawing;
2716
use PhpOffice\PhpWord\Shared\XMLWriter;
2817
use PhpOffice\PhpWord\Style\Font;
2918
use PhpOffice\PhpWord\Style\Paragraph;
19+
use PhpOffice\PhpWord\Writer\ODText\Element\Element as ElementWriter;
3020

3121
/**
3222
* ODText content part writer
@@ -90,27 +80,8 @@ public function writeContent(PhpWord $phpWord = null)
9080

9181
// $xmlWriter->startElement('text:section');
9282
foreach ($elements as $element) {
93-
if ($element instanceof Text) {
94-
$this->writeText($xmlWriter, $element);
95-
} elseif ($element instanceof TextRun) {
96-
$this->writeTextRun($xmlWriter, $element);
97-
} elseif ($element instanceof Link) {
98-
$this->writeLink($xmlWriter, $element);
99-
} elseif ($element instanceof Title) {
100-
$this->writeTitle($xmlWriter, $element);
101-
} elseif ($element instanceof ListItem) {
102-
$this->writeListItem($xmlWriter, $element);
103-
} elseif ($element instanceof TextBreak) {
104-
$this->writeTextBreak($xmlWriter);
105-
} elseif ($element instanceof PageBreak) {
106-
$this->writePageBreak($xmlWriter);
107-
} elseif ($element instanceof Table) {
108-
$this->writeTable($xmlWriter, $element);
109-
} elseif ($element instanceof Image) {
110-
$this->writeImage($xmlWriter, $element);
111-
} elseif ($element instanceof Object) {
112-
$this->writeObject($xmlWriter, $element);
113-
}
83+
$elementWriter = new ElementWriter($xmlWriter, $this, $element, false);
84+
$elementWriter->write();
11485
}
11586
// $xmlWriter->endElement(); // text:section
11687
}
@@ -122,226 +93,6 @@ public function writeContent(PhpWord $phpWord = null)
12293
return $xmlWriter->getData();
12394
}
12495

125-
/**
126-
* Write text
127-
*
128-
* @param XMLWriter $xmlWriter
129-
* @param Text $text
130-
* @param bool $withoutP
131-
*/
132-
protected function writeText(XMLWriter $xmlWriter, Text $text, $withoutP = false)
133-
{
134-
$styleFont = $text->getFontStyle();
135-
$styleParagraph = $text->getParagraphStyle();
136-
137-
// @todo Commented for TextRun. Should really checkout this value
138-
// $SfIsObject = ($styleFont instanceof Font) ? true : false;
139-
$SfIsObject = false;
140-
141-
if ($SfIsObject) {
142-
// Don't never be the case, because I browse all sections for cleaning all styles not declared
143-
throw new Exception('PhpWord : $SfIsObject wouldn\'t be an object');
144-
} else {
145-
if (!$withoutP) {
146-
$xmlWriter->startElement('text:p'); // text:p
147-
}
148-
if (empty($styleFont)) {
149-
if (empty($styleParagraph)) {
150-
$xmlWriter->writeAttribute('text:style-name', 'P1');
151-
} elseif (is_string($styleParagraph)) {
152-
$xmlWriter->writeAttribute('text:style-name', $styleParagraph);
153-
}
154-
$xmlWriter->writeRaw($text->getText());
155-
} else {
156-
if (empty($styleParagraph)) {
157-
$xmlWriter->writeAttribute('text:style-name', 'Standard');
158-
} elseif (is_string($styleParagraph)) {
159-
$xmlWriter->writeAttribute('text:style-name', $styleParagraph);
160-
}
161-
// text:span
162-
$xmlWriter->startElement('text:span');
163-
if (is_string($styleFont)) {
164-
$xmlWriter->writeAttribute('text:style-name', $styleFont);
165-
}
166-
$xmlWriter->writeRaw($text->getText());
167-
$xmlWriter->endElement();
168-
}
169-
if (!$withoutP) {
170-
$xmlWriter->endElement(); // text:p
171-
}
172-
}
173-
}
174-
175-
/**
176-
* Write TextRun section
177-
*
178-
* @param XMLWriter $xmlWriter
179-
* @param TextRun $textrun
180-
* @todo Enable all other section types
181-
*/
182-
protected function writeTextRun(XMLWriter $xmlWriter, TextRun $textrun)
183-
{
184-
$elements = $textrun->getElements();
185-
$xmlWriter->startElement('text:p');
186-
if (count($elements) > 0) {
187-
foreach ($elements as $element) {
188-
if ($element instanceof Text) {
189-
$this->writeText($xmlWriter, $element, true);
190-
}
191-
}
192-
}
193-
$xmlWriter->endElement();
194-
}
195-
196-
/**
197-
* Write link element
198-
*
199-
* @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
200-
*/
201-
protected function writeLink(XMLWriter $xmlWriter, Link $link)
202-
{
203-
$this->writeUnsupportedElement($xmlWriter, 'Link');
204-
}
205-
206-
/**
207-
* Write title element
208-
*/
209-
protected function writeTitle(XMLWriter $xmlWriter, Title $title)
210-
{
211-
$this->writeUnsupportedElement($xmlWriter, 'Title');
212-
}
213-
214-
/**
215-
* Write list item
216-
*/
217-
protected function writeListItem(XMLWriter $xmlWriter, ListItem $listItem)
218-
{
219-
$this->writeUnsupportedElement($xmlWriter, 'ListItem');
220-
}
221-
222-
/**
223-
* Write text break
224-
*/
225-
protected function writeTextBreak(XMLWriter $xmlWriter)
226-
{
227-
$xmlWriter->startElement('text:p');
228-
$xmlWriter->writeAttribute('text:style-name', 'Standard');
229-
$xmlWriter->endElement();
230-
}
231-
232-
/**
233-
* Write page break
234-
*/
235-
protected function writePageBreak(XMLWriter $xmlWriter)
236-
{
237-
$this->writeUnsupportedElement($xmlWriter, 'PageBreak');
238-
}
239-
240-
/**
241-
* Write table
242-
*/
243-
protected function writeTable(XMLWriter $xmlWriter, Table $table)
244-
{
245-
$rows = $table->getRows();
246-
$rowCount = count($rows);
247-
$colCount = $table->countColumns();
248-
if ($rowCount > 0) {
249-
$xmlWriter->startElement('table:table');
250-
$xmlWriter->writeAttribute('table:name', $table->getElementId());
251-
$xmlWriter->writeAttribute('table:style', $table->getElementId());
252-
253-
$xmlWriter->startElement('table:table-column');
254-
$xmlWriter->writeAttribute('table:number-columns-repeated', $colCount);
255-
$xmlWriter->endElement(); // table:table-column
256-
257-
foreach ($rows as $row) {
258-
$xmlWriter->startElement('table:table-row');
259-
foreach ($row->getCells() as $cell) {
260-
$xmlWriter->startElement('table:table-cell');
261-
$xmlWriter->writeAttribute('office:value-type', 'string');
262-
$elements = $cell->getElements();
263-
if (count($elements) > 0) {
264-
foreach ($elements as $element) {
265-
if ($element instanceof Text) {
266-
$this->writeText($xmlWriter, $element);
267-
} elseif ($element instanceof TextRun) {
268-
$this->writeTextRun($xmlWriter, $element);
269-
} elseif ($element instanceof ListItem) {
270-
$this->writeListItem($xmlWriter, $element);
271-
} elseif ($element instanceof TextBreak) {
272-
$this->writeTextBreak($xmlWriter);
273-
} elseif ($element instanceof Image) {
274-
$this->writeImage($xmlWriter, $element);
275-
} elseif ($element instanceof Object) {
276-
$this->writeObject($xmlWriter, $element);
277-
}
278-
}
279-
} else {
280-
$this->writeTextBreak($xmlWriter);
281-
}
282-
$xmlWriter->endElement(); // table:table-cell
283-
}
284-
$xmlWriter->endElement(); // table:table-row
285-
}
286-
$xmlWriter->endElement(); // table:table
287-
}
288-
}
289-
290-
/**
291-
* Write image
292-
*/
293-
protected function writeImage(XMLWriter $xmlWriter, Image $element)
294-
{
295-
$mediaIndex = $element->getMediaIndex();
296-
$target = 'Pictures/' . $element->getTarget();
297-
$style = $element->getStyle();
298-
$width = Drawing::pixelsToCentimeters($style->getWidth());
299-
$height = Drawing::pixelsToCentimeters($style->getHeight());
300-
301-
$xmlWriter->startElement('text:p');
302-
$xmlWriter->writeAttribute('text:style-name', 'Standard');
303-
304-
$xmlWriter->startElement('draw:frame');
305-
$xmlWriter->writeAttribute('draw:style-name', 'fr' . $mediaIndex);
306-
$xmlWriter->writeAttribute('draw:name', $element->getElementId());
307-
$xmlWriter->writeAttribute('text:anchor-type', 'as-char');
308-
$xmlWriter->writeAttribute('svg:width', $width . 'cm');
309-
$xmlWriter->writeAttribute('svg:height', $height . 'cm');
310-
$xmlWriter->writeAttribute('draw:z-index', $mediaIndex);
311-
312-
$xmlWriter->startElement('draw:image');
313-
$xmlWriter->writeAttribute('xlink:href', $target);
314-
$xmlWriter->writeAttribute('xlink:type', 'simple');
315-
$xmlWriter->writeAttribute('xlink:show', 'embed');
316-
$xmlWriter->writeAttribute('xlink:actuate', 'onLoad');
317-
$xmlWriter->endElement(); // draw:image
318-
319-
$xmlWriter->endElement(); // draw:frame
320-
321-
$xmlWriter->endElement(); // text:p
322-
}
323-
324-
/**
325-
* Write object
326-
*/
327-
protected function writeObject(XMLWriter $xmlWriter, Object $element)
328-
{
329-
$this->writeUnsupportedElement($xmlWriter, 'Object');
330-
}
331-
332-
/**
333-
* Write unsupported element
334-
*
335-
* @param \PhpOffice\PhpWord\Shared\XMLWriter $xmlWriter
336-
* @param string $element
337-
*/
338-
private function writeUnsupportedElement(XMLWriter $xmlWriter, $element)
339-
{
340-
$xmlWriter->startElement('text:p');
341-
$xmlWriter->writeRaw($element);
342-
$xmlWriter->endElement();
343-
}
344-
34596
/**
34697
* Write automatic styles
34798
*/
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
/**
3+
* PHPWord
4+
*
5+
* @link https://github.com/PHPOffice/PHPWord
6+
* @copyright 2014 PHPWord
7+
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
8+
*/
9+
10+
namespace PhpOffice\PhpWord\Writer\ODText\Element;
11+
12+
use PhpOffice\PhpWord\Element\AbstractElement;
13+
use PhpOffice\PhpWord\Shared\XMLWriter;
14+
use PhpOffice\PhpWord\Writer\ODText\AbstractWriterPart;
15+
16+
/**
17+
* Generic element writer
18+
*
19+
* @since 0.10.0
20+
*/
21+
class Element
22+
{
23+
/**
24+
* XML writer
25+
*
26+
* @var \PhpOffice\PhpWord\Shared\XMLWriter
27+
*/
28+
protected $xmlWriter;
29+
30+
/**
31+
* Parent writer
32+
*
33+
* @var \PhpOffice\PhpWord\Writer\ODText\AbstractWriterPart
34+
*/
35+
protected $parentWriter;
36+
37+
/**
38+
* Element
39+
*
40+
* @var \PhpOffice\PhpWord\Element\AbstractElement
41+
*/
42+
protected $element;
43+
44+
/**
45+
* Without paragraph
46+
*
47+
* @var bool
48+
*/
49+
protected $withoutP = false;
50+
51+
/**
52+
* Create new instance
53+
*
54+
* @param bool $withoutP
55+
*/
56+
public function __construct(XMLWriter $xmlWriter, AbstractWriterPart $parentWriter, AbstractElement $element, $withoutP = false)
57+
{
58+
$this->xmlWriter = $xmlWriter;
59+
$this->parentWriter = $parentWriter;
60+
$this->element = $element;
61+
$this->withoutP = $withoutP;
62+
}
63+
64+
/**
65+
* Write element
66+
*
67+
* @return string
68+
*/
69+
public function write()
70+
{
71+
$elmName = str_replace('PhpOffice\\PhpWord\\Element\\', '', get_class($this->element));
72+
$elmWriterClass = 'PhpOffice\\PhpWord\\Writer\\ODText\\Element\\' . $elmName;
73+
if (class_exists($elmWriterClass) === true) {
74+
$elmWriter = new $elmWriterClass($this->xmlWriter, $this->parentWriter, $this->element, $this->withoutP);
75+
$elmWriter->write();
76+
}
77+
}
78+
}

0 commit comments

Comments
 (0)