Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
98.67% covered (success)
98.67%
74 / 75
85.71% covered (warning)
85.71%
6 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
Field
98.67% covered (success)
98.67%
74 / 75
85.71% covered (warning)
85.71%
6 / 7
24
0.00% covered (danger)
0.00%
0 / 1
 write
100.00% covered (success)
100.00%
19 / 19
100.00% covered (success)
100.00%
1 / 1
9
 writeReference
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 writeIndexMark
88.89% covered (warning)
88.89%
8 / 9
0.00% covered (danger)
0.00%
0 / 1
2.01
 writeIndex
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 startSpan
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 endSpan
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 writeDefault
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
1 / 1
7
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// Native ODF mappings are used where PHPWord fields have an equivalent. Fields
19// without a meaningful ODF equivalent are intentionally omitted.
20
21namespace PhpOffice\PhpWord\Writer\ODText\Element;
22
23/**
24 * Field element writer.
25 *
26 * @since 0.11.0
27 */
28class Field extends Text
29{
30    /**
31     * Write field element.
32     */
33    public function write(): void
34    {
35        $element = $this->getElement();
36        if (!$element instanceof \PhpOffice\PhpWord\Element\Field) {
37            return;
38        }
39
40        $type = strtolower($element->getType());
41        switch ($type) {
42            case 'date':
43            case 'page':
44            case 'numpages':
45            case 'filename':
46                $this->writeDefault($element, $type);
47
48                break;
49            case 'ref':
50                $this->writeReference($element);
51
52                break;
53            case 'xe':
54                $this->writeIndexMark($element);
55
56                break;
57            case 'index':
58                $this->writeIndex($element);
59
60                break;
61        }
62    }
63
64    private function writeReference(\PhpOffice\PhpWord\Element\Field $element): void
65    {
66        $properties = $element->getProperties();
67        $options = $element->getOptions();
68
69        $this->startSpan($element);
70        $xmlWriter = $this->getXmlWriter();
71        $xmlWriter->startElement('text:reference-ref');
72        $xmlWriter->writeAttribute('text:ref-name', $properties['name'] ?? '');
73        $xmlWriter->writeAttribute('text:reference-format', in_array('p', $options) ? 'page' : 'text');
74        $xmlWriter->endElement();
75        $this->endSpan();
76    }
77
78    private function writeIndexMark(\PhpOffice\PhpWord\Element\Field $element): void
79    {
80        $this->startSpan($element);
81        $xmlWriter = $this->getXmlWriter();
82        $xmlWriter->startElement('text:alphabetical-index-mark');
83        $text = $element->getText();
84        if ($text instanceof \PhpOffice\PhpWord\Element\TextRun) {
85            $text = $text->getText();
86        }
87        $xmlWriter->writeAttribute('text:string-value', $text ?? '');
88        $xmlWriter->endElement();
89        $this->endSpan();
90    }
91
92    private function writeIndex(\PhpOffice\PhpWord\Element\Field $element): void
93    {
94        $xmlWriter = $this->getXmlWriter();
95        $xmlWriter->startElement('text:alphabetical-index');
96        $xmlWriter->writeAttribute('text:name', 'Alphabetical Index');
97        $xmlWriter->startElement('text:index-body');
98        $xmlWriter->endElement();
99        $xmlWriter->endElement();
100    }
101
102    private function startSpan(\PhpOffice\PhpWord\Element\Field $element): void
103    {
104        $xmlWriter = $this->getXmlWriter();
105        $xmlWriter->startElement('text:span');
106
107        $fstyle = $element->getFontStyle();
108        if (is_string($fstyle)) {
109            $xmlWriter->writeAttribute('text:style-name', $fstyle);
110        }
111    }
112
113    private function endSpan(): void
114    {
115        $this->getXmlWriter()->endElement();
116    }
117
118    private function writeDefault(\PhpOffice\PhpWord\Element\Field $element, $type): void
119    {
120        $xmlWriter = $this->getXmlWriter();
121
122        $this->startSpan($element);
123
124        switch ($type) {
125            case 'date':
126                $xmlWriter->startElement('text:date');
127                $xmlWriter->writeAttribute('text:fixed', 'false');
128                $xmlWriter->endElement();
129
130                break;
131            case 'page':
132                $xmlWriter->startElement('text:page-number');
133                $xmlWriter->writeAttribute('text:fixed', 'false');
134                $xmlWriter->endElement();
135
136                break;
137            case 'numpages':
138                $xmlWriter->startElement('text:page-count');
139                $xmlWriter->endElement();
140
141                break;
142            case 'filename':
143                $xmlWriter->startElement('text:file-name');
144                $xmlWriter->writeAttribute('text:fixed', 'false');
145                $options = $element->getOptions();
146                if ($options != null && in_array('Path', $options)) {
147                    $xmlWriter->writeAttribute('text:display', 'full');
148                } else {
149                    $xmlWriter->writeAttribute('text:display', 'name');
150                }
151                $xmlWriter->endElement();
152
153                break;
154        }
155        $this->endSpan();
156    }
157}