Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
63.83% covered (warning)
63.83%
30 / 47
40.00% covered (danger)
40.00%
2 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
ContentXhtml
63.83% covered (warning)
63.83%
30 / 47
40.00% covered (danger)
40.00%
2 / 5
36.08
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getXmlWriter
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 write
83.87% covered (warning)
83.87%
26 / 31
0.00% covered (danger)
0.00%
0 / 1
9.34
 writeTextElement
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
42
 writeTextRun
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace PhpOffice\PhpWord\Writer\EPub3\Part;
4
5use PhpOffice\PhpWord\Element\AbstractElement;
6use PhpOffice\PhpWord\Element\Text;
7use PhpOffice\PhpWord\Element\TextRun;
8use PhpOffice\PhpWord\PhpWord;
9use XMLWriter;
10
11/**
12 * Class for EPub3 content.xhtml part.
13 */
14class ContentXhtml extends AbstractPart
15{
16    /**
17     * PHPWord object.
18     *
19     * @var ?PhpWord
20     */
21    private $phpWord;
22
23    /**
24     * Constructor.
25     */
26    public function __construct(?PhpWord $phpWord = null)
27    {
28        $this->phpWord = $phpWord;
29    }
30
31    /**
32     * Get XML Writer.
33     *
34     * @return XMLWriter
35     */
36    protected function getXmlWriter()
37    {
38        $xmlWriter = new XMLWriter();
39        $xmlWriter->openMemory();
40
41        return $xmlWriter;
42    }
43
44    /**
45     * Write part content.
46     */
47    public function write(): string
48    {
49        if ($this->phpWord === null) {
50            throw new \PhpOffice\PhpWord\Exception\Exception('No PhpWord assigned.');
51        }
52
53        $xmlWriter = $this->getXmlWriter();
54
55        $xmlWriter->startDocument('1.0', 'UTF-8');
56        $xmlWriter->startElement('html');
57        $xmlWriter->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
58        $xmlWriter->writeAttribute('xmlns:epub', 'http://www.idpf.org/2007/ops');
59        $xmlWriter->startElement('head');
60        $xmlWriter->writeElement('title', $this->phpWord->getDocInfo()->getTitle() ?: 'Untitled');
61        $xmlWriter->endElement(); // head
62        $xmlWriter->startElement('body');
63
64        // Write sections content
65        foreach ($this->phpWord->getSections() as $section) {
66            $xmlWriter->startElement('div');
67            $xmlWriter->writeAttribute('class', 'section');
68
69            foreach ($section->getElements() as $element) {
70                if ($element instanceof TextRun) {
71                    $xmlWriter->startElement('p');
72                    $this->writeTextRun($element, $xmlWriter);
73                    $xmlWriter->endElement(); // p
74                } elseif (method_exists($element, 'getText')) {
75                    $text = $element->getText();
76                    $xmlWriter->startElement('p');
77                    if ($text instanceof TextRun) {
78                        $this->writeTextRun($text, $xmlWriter);
79                    } elseif ($text !== null) {
80                        $xmlWriter->text((string) $text);
81                    }
82                    $xmlWriter->endElement(); // p
83                }
84            }
85
86            $xmlWriter->endElement(); // div
87        }
88
89        $xmlWriter->endElement(); // body
90        $xmlWriter->endElement(); // html
91
92        return $xmlWriter->outputMemory(true);
93    }
94
95    protected function writeTextElement(AbstractElement $textElement, XMLWriter $xmlWriter): void
96    {
97        if ($textElement instanceof Text) {
98            $text = $textElement->getText();
99            if ($text !== null) {
100                $xmlWriter->text((string) $text);
101            }
102        } elseif (method_exists($textElement, 'getText')) {
103            $text = $textElement->getText();
104            if ($text instanceof TextRun) {
105                $this->writeTextRun($text, $xmlWriter);
106            } elseif ($text !== null) {
107                $xmlWriter->text((string) $text);
108            }
109        }
110    }
111
112    protected function writeTextRun(TextRun $textRun, XMLWriter $xmlWriter): void
113    {
114        foreach ($textRun->getElements() as $element) {
115            $this->writeTextElement($element, $xmlWriter);
116        }
117    }
118}