Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
71 / 71
100.00% covered (success)
100.00%
19 / 19
CRAP
100.00% covered (success)
100.00%
1 / 1
PhpWord
100.00% covered (success)
100.00%
71 / 71
100.00% covered (success)
100.00%
19 / 19
31
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
3
 __call
100.00% covered (success)
100.00%
21 / 21
100.00% covered (success)
100.00%
1 / 1
6
 getDocInfo
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getCompatibility
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSettings
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSections
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSection
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 addSection
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 sortSections
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getDefaultFontName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setDefaultFontName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getDefaultAsianFontName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setDefaultAsianFontName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setDefaultFontColor
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getDefaultFontColor
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getDefaultFontSize
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setDefaultFontSize
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setDefaultParagraphStyle
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 save
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
2
 createSection
n/a
0 / 0
n/a
0 / 0
1
 getDocumentProperties
n/a
0 / 0
n/a
0 / 0
1
 setDocumentProperties
n/a
0 / 0
n/a
0 / 0
1
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;
20
21use BadMethodCallException;
22use PhpOffice\PhpWord\Element\Section;
23use PhpOffice\PhpWord\Exception\Exception;
24
25/**
26 * PHPWord main class.
27 *
28 * @method Collection\Titles getTitles()
29 * @method Collection\Footnotes getFootnotes()
30 * @method Collection\Endnotes getEndnotes()
31 * @method Collection\Charts getCharts()
32 * @method Collection\Comments getComments()
33 * @method int addBookmark(Element\Bookmark $bookmark)
34 * @method int addTitle(Element\Title $title)
35 * @method int addFootnote(Element\Footnote $footnote)
36 * @method int addEndnote(Element\Endnote $endnote)
37 * @method int addChart(Element\Chart $chart)
38 * @method int addComment(Element\Comment $comment)
39 * @method Style\Paragraph addParagraphStyle(string $styleName, mixed $styles)
40 * @method Style\Font addFontStyle(string $styleName, mixed $fontStyle, mixed $paragraphStyle = null)
41 * @method Style\Font addLinkStyle(string $styleName, mixed $styles)
42 * @method Style\Font addTitleStyle(mixed $depth, mixed $fontStyle, mixed $paragraphStyle = null)
43 * @method Style\Table addTableStyle(string $styleName, mixed $styleTable, mixed $styleFirstRow = null)
44 * @method Style\Numbering addNumberingStyle(string $styleName, mixed $styles)
45 */
46class PhpWord
47{
48    /**
49     * Collection of sections.
50     *
51     * @var Section[]
52     */
53    private $sections = [];
54
55    /**
56     * Collections.
57     *
58     * @var array
59     */
60    private $collections = [];
61
62    /**
63     * Metadata.
64     *
65     * @var array
66     *
67     * @since 0.12.0
68     */
69    private $metadata = [];
70
71    /**
72     * Create new instance.
73     *
74     * Collections are created dynamically
75     */
76    public function __construct()
77    {
78        // Reset Media and styles
79        Media::resetElements();
80        Style::resetStyles();
81        Settings::setDefaultRtl(null);
82
83        // Collection
84        $collections = ['Bookmarks', 'Titles', 'Footnotes', 'Endnotes', 'Charts', 'Comments'];
85        foreach ($collections as $collection) {
86            $class = 'PhpOffice\\PhpWord\\Collection\\' . $collection;
87            $this->collections[$collection] = new $class();
88        }
89
90        // Metadata
91        $metadata = ['DocInfo', 'Settings', 'Compatibility'];
92        foreach ($metadata as $meta) {
93            $class = 'PhpOffice\\PhpWord\\Metadata\\' . $meta;
94            $this->metadata[$meta] = new $class();
95        }
96    }
97
98    /**
99     * Dynamic function call to reduce static dependency.
100     *
101     * @since 0.12.0
102     *
103     * @param mixed $function
104     * @param mixed $args
105     *
106     * @return mixed
107     */
108    public function __call($function, $args)
109    {
110        $function = strtolower($function);
111
112        $getCollection = [];
113        $addCollection = [];
114        $addStyle = [];
115
116        $collections = ['Bookmark', 'Title', 'Footnote', 'Endnote', 'Chart', 'Comment'];
117        foreach ($collections as $collection) {
118            $getCollection[] = strtolower("get{$collection}s");
119            $addCollection[] = strtolower("add{$collection}");
120        }
121
122        $styles = ['Paragraph', 'Font', 'Table', 'Numbering', 'Link', 'Title'];
123        foreach ($styles as $style) {
124            $addStyle[] = strtolower("add{$style}Style");
125        }
126
127        // Run get collection method
128        if (in_array($function, $getCollection)) {
129            $key = ucfirst(str_replace('get', '', $function));
130
131            return $this->collections[$key];
132        }
133
134        // Run add collection item method
135        if (in_array($function, $addCollection)) {
136            $key = ucfirst(str_replace('add', '', $function) . 's');
137
138            $collectionObject = $this->collections[$key];
139
140            return $collectionObject->addItem($args[0] ?? null);
141        }
142
143        // Run add style method
144        if (in_array($function, $addStyle)) {
145            return forward_static_call_array(['PhpOffice\\PhpWord\\Style', $function], $args);
146        }
147
148        // Exception
149        throw new BadMethodCallException("Method $function is not defined.");
150    }
151
152    /**
153     * Get document properties object.
154     *
155     * @return Metadata\DocInfo
156     */
157    public function getDocInfo()
158    {
159        return $this->metadata['DocInfo'];
160    }
161
162    /**
163     * Get compatibility.
164     *
165     * @return Metadata\Compatibility
166     *
167     * @since 0.12.0
168     */
169    public function getCompatibility()
170    {
171        return $this->metadata['Compatibility'];
172    }
173
174    /**
175     * Get compatibility.
176     *
177     * @return Metadata\Settings
178     *
179     * @since 0.14.0
180     */
181    public function getSettings()
182    {
183        return $this->metadata['Settings'];
184    }
185
186    /**
187     * Get all sections.
188     *
189     * @return Section[]
190     */
191    public function getSections()
192    {
193        return $this->sections;
194    }
195
196    /**
197     * Returns the section at the requested position.
198     *
199     * @param int $index
200     *
201     * @return null|Section
202     */
203    public function getSection($index)
204    {
205        if (array_key_exists($index, $this->sections)) {
206            return $this->sections[$index];
207        }
208
209        return null;
210    }
211
212    /**
213     * Create new section.
214     *
215     * @param null|array|string $style
216     *
217     * @return Section
218     */
219    public function addSection($style = null)
220    {
221        $section = new Section(count($this->sections) + 1, $style);
222        $section->setPhpWord($this);
223        $this->sections[] = $section;
224
225        return $section;
226    }
227
228    /**
229     * Sorts the sections using the callable passed.
230     *
231     * @see http://php.net/manual/en/function.usort.php for usage
232     *
233     * @param callable $sorter
234     */
235    public function sortSections($sorter): void
236    {
237        usort($this->sections, $sorter);
238    }
239
240    /**
241     * Get default font name.
242     *
243     * @return string
244     */
245    public function getDefaultFontName()
246    {
247        return Settings::getDefaultFontName();
248    }
249
250    /**
251     * Set default font name.
252     *
253     * @param string $fontName
254     */
255    public function setDefaultFontName($fontName): void
256    {
257        Settings::setDefaultFontName($fontName);
258    }
259
260    /**
261     * Get default asian font name.
262     */
263    public function getDefaultAsianFontName(): string
264    {
265        return Settings::getDefaultAsianFontName();
266    }
267
268    /**
269     * Set default asian font name.
270     *
271     * @param string $fontName
272     */
273    public function setDefaultAsianFontName($fontName): void
274    {
275        Settings::setDefaultAsianFontName($fontName);
276    }
277
278    /**
279     * Set default font color.
280     */
281    public function setDefaultFontColor(string $fontColor): void
282    {
283        Settings::setDefaultFontColor($fontColor);
284    }
285
286    /**
287     * Get default font color.
288     */
289    public function getDefaultFontColor(): string
290    {
291        return Settings::getDefaultFontColor();
292    }
293
294    /**
295     * Get default font size.
296     *
297     * @return int
298     */
299    public function getDefaultFontSize()
300    {
301        return Settings::getDefaultFontSize();
302    }
303
304    /**
305     * Set default font size.
306     *
307     * @param int $fontSize
308     */
309    public function setDefaultFontSize($fontSize): void
310    {
311        Settings::setDefaultFontSize($fontSize);
312    }
313
314    /**
315     * Set default paragraph style definition to styles.xml.
316     *
317     * @param array $styles Paragraph style definition
318     *
319     * @return Style\Paragraph
320     */
321    public function setDefaultParagraphStyle($styles)
322    {
323        return Style::setDefaultParagraphStyle($styles);
324    }
325
326    /**
327     * Save to file or download.
328     *
329     * All exceptions should already been handled by the writers
330     *
331     * @param string $filename
332     * @param string $format
333     * @param bool $download
334     *
335     * @return bool
336     */
337    public function save($filename, $format = 'Word2007', $download = false)
338    {
339        $mime = [
340            'Word2007' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
341            'ODText' => 'application/vnd.oasis.opendocument.text',
342            'RTF' => 'application/rtf',
343            'HTML' => 'text/html',
344            'PDF' => 'application/pdf',
345        ];
346
347        $writer = IOFactory::createWriter($this, $format);
348
349        if ($download === true) {
350            header('Content-Description: File Transfer');
351            header('Content-Disposition: attachment; filename="' . $filename . '"');
352            header('Content-Type: ' . $mime[$format]);
353            header('Content-Transfer-Encoding: binary');
354            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
355            header('Expires: 0');
356            $filename = 'php://output'; // Change filename to force download
357        }
358
359        $writer->save($filename);
360
361        return true;
362    }
363
364    /**
365     * Create new section.
366     *
367     * @deprecated 0.10.0
368     *
369     * @param array $settings
370     *
371     * @return Section
372     *
373     * @codeCoverageIgnore
374     */
375    public function createSection($settings = null)
376    {
377        return $this->addSection($settings);
378    }
379
380    /**
381     * Get document properties object.
382     *
383     * @deprecated 0.12.0
384     *
385     * @return Metadata\DocInfo
386     *
387     * @codeCoverageIgnore
388     */
389    public function getDocumentProperties()
390    {
391        return $this->getDocInfo();
392    }
393
394    /**
395     * Set document properties object.
396     *
397     * @deprecated 0.12.0
398     *
399     * @param Metadata\DocInfo $documentProperties
400     *
401     * @return self
402     *
403     * @codeCoverageIgnore
404     */
405    public function setDocumentProperties($documentProperties)
406    {
407        $this->metadata['Document'] = $documentProperties;
408
409        return $this;
410    }
411}