Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.55% covered (success)
96.55%
56 / 58
96.30% covered (success)
96.30%
26 / 27
CRAP
0.00% covered (danger)
0.00%
0 / 1
Paragraph
96.55% covered (success)
96.55%
56 / 58
96.30% covered (success)
96.30%
26 / 27
32
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 __clone
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 getAlignment
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setAlignment
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getFont
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setFont
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getBulletStyle
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setBulletStyle
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 createText
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 addText
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 createBreak
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 createTextRun
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 __toString
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getPlainText
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
3
 getRichTextElements
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setRichTextElements
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getHashCode
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getHashIndex
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setHashIndex
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getLineSpacing
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setLineSpacing
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getLineSpacingMode
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setLineSpacingMode
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 getSpacingBefore
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setSpacingBefore
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getSpacingAfter
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setSpacingAfter
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * This file is part of PHPPresentation - A pure PHP library for reading and writing
4 * presentations documents.
5 *
6 * PHPPresentation is free software distributed under the terms of the GNU Lesser
7 * General Public License version 3 as published by the Free Software Foundation.
8 *
9 * For the full copyright and license information, please read the LICENSE
10 * file that was distributed with this source code. For the full list of
11 * contributors, visit https://github.com/PHPOffice/PHPPresentation/contributors.
12 *
13 * @see        https://github.com/PHPOffice/PHPPresentation
14 *
15 * @license     http://www.gnu.org/licenses/lgpl.txt LGPL version 3
16 */
17
18declare(strict_types=1);
19
20namespace PhpOffice\PhpPresentation\Shape\RichText;
21
22use PhpOffice\PhpPresentation\ComparableInterface;
23use PhpOffice\PhpPresentation\Style\Alignment;
24use PhpOffice\PhpPresentation\Style\Bullet;
25use PhpOffice\PhpPresentation\Style\Font;
26
27/**
28 * \PhpOffice\PhpPresentation\Shape\RichText\Paragraph.
29 */
30class Paragraph implements ComparableInterface
31{
32    public const LINE_SPACING_MODE_PERCENT = 'percent';
33    public const LINE_SPACING_MODE_POINT = 'point';
34
35    /**
36     * Rich text elements.
37     *
38     * @var array<TextElementInterface>
39     */
40    private $richTextElements = [];
41
42    /**
43     * Alignment.
44     *
45     * @var Alignment
46     */
47    private $alignment;
48
49    /**
50     * Font.
51     *
52     * @var null|Font
53     */
54    private $font;
55
56    /**
57     * Bullet style.
58     *
59     * @var Bullet
60     */
61    private $bulletStyle;
62
63    /**
64     * @var int
65     */
66    private $lineSpacing = 100;
67
68    /**
69     * @var string
70     */
71    private $lineSpacingMode = self::LINE_SPACING_MODE_PERCENT;
72
73    /**
74     * @var int
75     */
76    private $spacingBefore = 0;
77
78    /**
79     * @var int
80     */
81    private $spacingAfter = 0;
82
83    /**
84     * Hash index.
85     *
86     * @var int
87     */
88    private $hashIndex;
89
90    /**
91     * Create a new \PhpOffice\PhpPresentation\Shape\RichText\Paragraph instance.
92     */
93    public function __construct()
94    {
95        $this->alignment = new Alignment();
96        $this->font = new Font();
97        $this->bulletStyle = new Bullet();
98    }
99
100    /**
101     * Magic Method : clone.
102     */
103    public function __clone()
104    {
105        // Clone each text
106        foreach ($this->richTextElements as &$rtElement) {
107            $rtElement = clone $rtElement;
108        }
109    }
110
111    /**
112     * Get alignment.
113     */
114    public function getAlignment(): Alignment
115    {
116        return $this->alignment;
117    }
118
119    /**
120     * Set alignment.
121     */
122    public function setAlignment(Alignment $alignment): self
123    {
124        $this->alignment = $alignment;
125
126        return $this;
127    }
128
129    /**
130     * Get font.
131     */
132    public function getFont(): ?Font
133    {
134        return $this->font;
135    }
136
137    /**
138     * Set font.
139     *
140     * @param null|Font $pFont Font
141     */
142    public function setFont(?Font $pFont = null): self
143    {
144        $this->font = $pFont;
145
146        return $this;
147    }
148
149    /**
150     * Get bullet style.
151     */
152    public function getBulletStyle(): ?Bullet
153    {
154        return $this->bulletStyle;
155    }
156
157    /**
158     * Set bullet style.
159     */
160    public function setBulletStyle(?Bullet $style = null): self
161    {
162        $this->bulletStyle = $style;
163
164        return $this;
165    }
166
167    /**
168     * Create text (can not be formatted !).
169     *
170     * @param string $pText Text
171     */
172    public function createText(string $pText = ''): TextElement
173    {
174        $objText = new TextElement($pText);
175        $this->addText($objText);
176
177        return $objText;
178    }
179
180    /**
181     * Add text.
182     *
183     * @param null|TextElementInterface $pText Rich text element
184     */
185    public function addText(?TextElementInterface $pText = null): self
186    {
187        $this->richTextElements[] = $pText;
188
189        return $this;
190    }
191
192    /**
193     * Create break.
194     */
195    public function createBreak(): BreakElement
196    {
197        $objText = new BreakElement();
198        $this->addText($objText);
199
200        return $objText;
201    }
202
203    /**
204     * Create text run (can be formatted).
205     *
206     * @param string $pText Text
207     */
208    public function createTextRun(string $pText = ''): Run
209    {
210        $objText = new Run($pText);
211        $objText->setFont(clone $this->font);
212        $this->addText($objText);
213
214        return $objText;
215    }
216
217    /**
218     * Convert to string.
219     *
220     * @return string
221     */
222    public function __toString()
223    {
224        return $this->getPlainText();
225    }
226
227    /**
228     * Get plain text.
229     */
230    public function getPlainText(): string
231    {
232        // Return value
233        $returnValue = '';
234
235        // Loop trough all TextElementInterface
236        foreach ($this->richTextElements as $text) {
237            if ($text instanceof TextElementInterface) {
238                $returnValue .= $text->getText();
239            }
240        }
241
242        // Return
243        return $returnValue;
244    }
245
246    /**
247     * Get Rich Text elements.
248     *
249     * @return array<TextElementInterface>
250     */
251    public function getRichTextElements(): array
252    {
253        return $this->richTextElements;
254    }
255
256    /**
257     * Set Rich Text elements.
258     *
259     * @param array<TextElementInterface> $pElements Array of elements
260     */
261    public function setRichTextElements(array $pElements = []): self
262    {
263        $this->richTextElements = $pElements;
264
265        return $this;
266    }
267
268    /**
269     * Get hash code.
270     *
271     * @return string Hash code
272     */
273    public function getHashCode(): string
274    {
275        $hashElements = '';
276        foreach ($this->richTextElements as $element) {
277            $hashElements .= $element->getHashCode();
278        }
279
280        return md5($hashElements . $this->font->getHashCode() . __CLASS__);
281    }
282
283    /**
284     * Get hash index.
285     *
286     * Note that this index may vary during script execution! Only reliable moment is
287     * while doing a write of a workbook and when changes are not allowed.
288     *
289     * @return null|int Hash index
290     */
291    public function getHashIndex(): ?int
292    {
293        return $this->hashIndex;
294    }
295
296    /**
297     * Set hash index.
298     *
299     * Note that this index may vary during script execution! Only reliable moment is
300     * while doing a write of a workbook and when changes are not allowed.
301     *
302     * @param int $value Hash index
303     *
304     * @return $this
305     */
306    public function setHashIndex(int $value)
307    {
308        $this->hashIndex = $value;
309
310        return $this;
311    }
312
313    public function getLineSpacing(): int
314    {
315        return $this->lineSpacing;
316    }
317
318    /**
319     * Value in points.
320     *
321     * @param int $lineSpacing
322     */
323    public function setLineSpacing($lineSpacing): self
324    {
325        $this->lineSpacing = $lineSpacing;
326
327        return $this;
328    }
329
330    public function getLineSpacingMode(): string
331    {
332        return $this->lineSpacingMode;
333    }
334
335    public function setLineSpacingMode(string $lineSpacingMode): self
336    {
337        if (in_array($lineSpacingMode, [
338            self::LINE_SPACING_MODE_PERCENT,
339            self::LINE_SPACING_MODE_POINT,
340        ])) {
341            $this->lineSpacingMode = $lineSpacingMode;
342        }
343
344        return $this;
345    }
346
347    /**
348     * Value in points.
349     */
350    public function getSpacingBefore(): int
351    {
352        return $this->spacingBefore;
353    }
354
355    /**
356     * Value in points.
357     */
358    public function setSpacingBefore(int $spacingBefore): self
359    {
360        $this->spacingBefore = $spacingBefore;
361
362        return $this;
363    }
364
365    /**
366     * Value in points.
367     */
368    public function getSpacingAfter(): int
369    {
370        return $this->spacingAfter;
371    }
372
373    /**
374     * Value in points.
375     */
376    public function setSpacingAfter(int $spacingAfter): self
377    {
378        $this->spacingAfter = $spacingAfter;
379
380        return $this;
381    }
382}