Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
46 / 46
100.00% covered (success)
100.00%
13 / 13
CRAP
100.00% covered (success)
100.00%
1 / 1
HTML
100.00% covered (success)
100.00%
46 / 46
100.00% covered (success)
100.00%
13 / 13
22
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 save
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getContent
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
6
 getEditCallback
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setEditCallback
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 isPdf
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getNotes
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 addNote
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getDefaultGenericFont
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setDefaultGenericFont
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getDefaultWhiteSpace
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setDefaultWhiteSpace
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 escapeHTML
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3/**
4 * This file is part of PHPWord - A pure PHP library for reading and writing
5 * word processing documents.
6 *
7 * PHPWord is free software distributed under the terms of the GNU Lesser
8 * General Public License version 3 as published by the Free Software Foundation.
9 *
10 * For the full copyright and license information, please read the LICENSE
11 * file that was distributed with this source code. For the full list of
12 * contributors, visit https://github.com/PHPOffice/PHPWord/contributors.
13 *
14 * @see         https://github.com/PHPOffice/PHPWord
15 *
16 * @license     http://www.gnu.org/licenses/lgpl.txt LGPL version 3
17 */
18
19namespace PhpOffice\PhpWord\Writer;
20
21use PhpOffice\PhpWord\PhpWord;
22use PhpOffice\PhpWord\Settings;
23use PhpOffice\PhpWord\Shared\Validate;
24use PhpOffice\PhpWord\Style\Font;
25
26/**
27 * HTML writer.
28 *
29 * Not supported: PreserveText, PageBreak, Object
30 *
31 * @since 0.10.0
32 */
33class HTML extends AbstractWriter implements WriterInterface
34{
35    /**
36     * Is the current writer creating PDF?
37     *
38     * @var bool
39     */
40    protected $isPdf = false;
41
42    /**
43     * Footnotes and endnotes collection.
44     *
45     * @var array
46     */
47    protected $notes = [];
48
49    /**
50     * Callback for editing generated html.
51     *
52     * @var null|callable
53     */
54    private $editCallback;
55
56    /**
57     * Default generic name for default font for html.
58     *
59     * @var string
60     */
61    private $defaultGenericFont = '';
62
63    /**
64     * Default white space style for html.
65     *
66     * @var string
67     */
68    private $defaultWhiteSpace = '';
69
70    /**
71     * Create new instance.
72     */
73    public function __construct(?PhpWord $phpWord = null)
74    {
75        $this->setPhpWord($phpWord);
76
77        $this->parts = ['Head', 'Body'];
78        foreach ($this->parts as $partName) {
79            $partClass = 'PhpOffice\\PhpWord\\Writer\\HTML\\Part\\' . $partName;
80            if (class_exists($partClass)) {
81                /** @var HTML\Part\AbstractPart $part Type hint */
82                $part = new $partClass();
83                $part->setParentWriter($this);
84                $this->writerParts[strtolower($partName)] = $part;
85            }
86        }
87    }
88
89    /**
90     * Save PhpWord to file.
91     */
92    public function save(string $filename): void
93    {
94        $this->writeFile($this->openFile($filename), $this->getContent());
95    }
96
97    /**
98     * Get content.
99     *
100     * @return string
101     *
102     * @since 0.11.0
103     */
104    public function getContent()
105    {
106        $content = '';
107
108        $content .= '<!DOCTYPE html>' . PHP_EOL;
109        $content .= '<!-- Generated by PHPWord -->' . PHP_EOL;
110        $langtext = '';
111        $phpWord = $this->getPhpWord();
112        $lang = $phpWord->getSettings()->getThemeFontLang();
113        if (!empty($lang)) {
114            $lang2 = $lang->getLatin();
115            if (!$lang2) {
116                $lang2 = $lang->getEastAsia();
117            }
118            if (!$lang2) {
119                $lang2 = $lang->getBidirectional();
120            }
121            if ($lang2) {
122                $langtext = " lang='" . $lang2 . "'";
123            }
124        }
125        $content .= "<html$langtext>" . PHP_EOL;
126        $content .= $this->getWriterPart('Head')->write();
127        $content .= $this->getWriterPart('Body')->write();
128        $content .= '</html>' . PHP_EOL;
129
130        // Trigger a callback for editing the entire HTML
131        $callback = $this->editCallback;
132        if ($callback !== null) {
133            $content = $callback($content);
134        }
135
136        return $content;
137    }
138
139    /**
140     * Return the callback to edit the entire HTML.
141     */
142    public function getEditCallback(): ?callable
143    {
144        return $this->editCallback;
145    }
146
147    /**
148     * Set a callback to edit the entire HTML.
149     *
150     * The callback must accept the HTML as string as first parameter,
151     * and it must return the edited HTML as string.
152     */
153    public function setEditCallback(?callable $callback): self
154    {
155        $this->editCallback = $callback;
156
157        return $this;
158    }
159
160    /**
161     * Get is PDF.
162     *
163     * @return bool
164     */
165    public function isPdf()
166    {
167        return $this->isPdf;
168    }
169
170    /**
171     * Get notes.
172     *
173     * @return array
174     */
175    public function getNotes()
176    {
177        return $this->notes;
178    }
179
180    /**
181     * Add note.
182     *
183     * @param int $noteId
184     * @param string $noteMark
185     */
186    public function addNote($noteId, $noteMark): void
187    {
188        $this->notes[$noteId] = $noteMark;
189    }
190
191    /**
192     * Get generic name for default font for html.
193     */
194    public function getDefaultGenericFont(): string
195    {
196        return $this->defaultGenericFont;
197    }
198
199    /**
200     * Set generic name for default font for html.
201     */
202    public function setDefaultGenericFont(string $value): self
203    {
204        $this->defaultGenericFont = Validate::validateCSSGenericFont($value);
205
206        return $this;
207    }
208
209    /**
210     * Get default white space style for html.
211     */
212    public function getDefaultWhiteSpace(): string
213    {
214        return $this->defaultWhiteSpace;
215    }
216
217    /**
218     * Set default white space style for html.
219     */
220    public function setDefaultWhiteSpace(string $value): self
221    {
222        $this->defaultWhiteSpace = Validate::validateCSSWhiteSpace($value);
223
224        return $this;
225    }
226
227    /**
228     * Escape string or not depending on setting.
229     */
230    public function escapeHTML(string $txt): string
231    {
232        if (Settings::isOutputEscapingEnabled()) {
233            return htmlspecialchars($txt, ENT_QUOTES | (defined('ENT_SUBSTITUTE') ? ENT_SUBSTITUTE : 0), 'UTF-8');
234        }
235
236        return $txt;
237    }
238}