Completed
Pull Request — develop (#435)
by Franck
09:07
created

AbstractSlide::writeParagraphs()   B

Complexity

Conditions 7
Paths 6

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 7

Importance

Changes 0
Metric Value
dl 0
loc 31
ccs 14
cts 14
cp 1
rs 8.4906
c 0
b 0
f 0
cc 7
nc 6
nop 2
crap 7
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
 * @link        https://github.com/PHPOffice/PHPPresentation
14
 * @copyright   2009-2015 PHPPresentation contributors
15
 * @license     http://www.gnu.org/licenses/lgpl.txt LGPL version 3
16
 */
17
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
18
use PhpOffice\Common\Drawing as CommonDrawing;
19
use PhpOffice\Common\Text;
20
use PhpOffice\Common\XMLWriter;
21
use PhpOffice\PhpPresentation\Shape\AbstractGraphic;
22
use PhpOffice\PhpPresentation\Shape\Chart as ShapeChart;
23
use PhpOffice\PhpPresentation\Shape\Comment;
24
use PhpOffice\PhpPresentation\Shape\Drawing\Gd as ShapeDrawingGd;
25
use PhpOffice\PhpPresentation\Shape\Drawing\File as ShapeDrawingFile;
26
use PhpOffice\PhpPresentation\Shape\GenericShape;
27
use PhpOffice\PhpPresentation\Shape\Group;
28
use PhpOffice\PhpPresentation\Shape\Line;
29
use PhpOffice\PhpPresentation\Shape\Rectangle;
30
use PhpOffice\PhpPresentation\Shape\RoundRectangle;
31
use PhpOffice\PhpPresentation\Shape\Triangle;
32
use PhpOffice\PhpPresentation\Shape\ArrowPointer;
33
use PhpOffice\PhpPresentation\Shape\Ellipse;
34
use PhpOffice\PhpPresentation\Shape\Media;
35
use PhpOffice\PhpPresentation\Shape\Placeholder;
36
use PhpOffice\PhpPresentation\Shape\RichText;
37
use PhpOffice\PhpPresentation\Shape\RichText\BreakElement;
38
use PhpOffice\PhpPresentation\Shape\RichText\Run;
39
use PhpOffice\PhpPresentation\Shape\RichText\TextElement;
40
use PhpOffice\PhpPresentation\Shape\Table as ShapeTable;
41
use PhpOffice\PhpPresentation\Slide;
42
use PhpOffice\PhpPresentation\Slide\Note;
43
use PhpOffice\PhpPresentation\Style\Alignment;
44
use PhpOffice\PhpPresentation\Style\Bullet;
45
use PhpOffice\PhpPresentation\Style\Border;
46
use PhpOffice\PhpPresentation\Style\Color;
47
use PhpOffice\PhpPresentation\Style\Shadow;
48
use PhpOffice\PhpPresentation\Slide\AbstractSlide as AbstractSlideAlias;
49
50
abstract class AbstractSlide extends AbstractDecoratorWriter
0 ignored issues
show
Complexity introduced by
The class AbstractSlide has a coupling between objects value of 38. Consider to reduce the number of dependencies under 35.
Loading history...
51
{
52
    /**
53
     * @param AbstractSlideAlias $pSlideMaster
54 113
     * @param $objWriter
55
     * @param $relId
56 113
     * @return mixed
57
     * @throws \Exception
58 1
     */
59 1
    protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, $objWriter, $relId)
60 1
    {
61
        if ($pSlideMaster->getShapeCollection()->count() > 0) {
62 1
            // Loop trough images and write relationships
63 1
            $iterator = $pSlideMaster->getShapeCollection()->getIterator();
64 1
            while ($iterator->valid()) {
65 1
                if ($iterator->current() instanceof ShapeDrawingFile || $iterator->current() instanceof ShapeDrawingGd) {
66 1
                    // Write relationship for image drawing
67
                    $this->writeRelationship(
68 1
                        $objWriter,
69 1
                        $relId,
70
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
71
                        '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename())
72
                    );
73
                    $iterator->current()->relationId = 'rId' . $relId;
74
                    ++$relId;
75
                } elseif ($iterator->current() instanceof ShapeChart) {
76
                    // Write relationship for chart drawing
77
                    $this->writeRelationship(
78
                        $objWriter,
79
                        $relId,
80
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
81
                        '../charts/' . $iterator->current()->getIndexedFilename()
82
                    );
83
                    $iterator->current()->relationId = 'rId' . $relId;
84
                    ++$relId;
85
                } elseif ($iterator->current() instanceof Group) {
86
                    $iterator2 = $iterator->current()->getShapeCollection()->getIterator();
87
                    while ($iterator2->valid()) {
88
                        if ($iterator2->current() instanceof ShapeDrawingFile ||
89
                            $iterator2->current() instanceof ShapeDrawingGd
90
                        ) {
91
                            // Write relationship for image drawing
92
                            $this->writeRelationship(
93
                                $objWriter,
94
                                $relId,
95
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
96
                                '../media/' . str_replace(' ', '_', $iterator2->current()->getIndexedFilename())
97
                            );
98
                            $iterator2->current()->relationId = 'rId' . $relId;
99
                            ++$relId;
100
                        } elseif ($iterator2->current() instanceof ShapeChart) {
101
                            // Write relationship for chart drawing
102
                            $this->writeRelationship(
103
                                $objWriter,
104
                                $relId,
105
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
106
                                '../charts/' . $iterator2->current()->getIndexedFilename()
107
                            );
108
                            $iterator2->current()->relationId = 'rId' . $relId;
109 1
                            ++$relId;
110
                        }
111
                        $iterator2->next();
112
                    }
113 113
                }
114
                $iterator->next();
115
            }
116
        }
117
    }
118
    /**
119
     * @param XMLWriter $objWriter
120
     * @param \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] $shapes
121
     * @param int $shapeId
122 112
     * @throws \Exception
123
     */
124 112
    protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), &$shapeId = 0)
125 112
    {
126
        if (count($shapes) == 0) {
127 85
            return;
128
        }
129 85
        foreach ($shapes as $shape) {
130
            // Increment $shapeId
131 85
            ++$shapeId;
132 24
            // Check type
133 61
            if ($shape instanceof RichText) {
134 10
                $this->writeShapeText($objWriter, $shape, $shapeId);
135 51
            }
136 1
            else if($shape instanceof GenericShape){
0 ignored issues
show
Coding Style introduced by
Expected 1 space after IF keyword; 0 found
Loading history...
137 50
                $this->writeShapeGeneric($objWriter, $shape, $shapeId);
138 34
            }
139 16
            elseif ($shape instanceof Ellipse) {
140 9
                $this->writeShapeEllipse($objWriter, $shape, $shapeId);
141 7
            }
142 1
            elseif ($shape instanceof ShapeTable) {
143 7
                $this->writeShapeTable($objWriter, $shape, $shapeId);
144
            } elseif ($shape instanceof Line) {
145 85
                $this->writeShapeLine($objWriter, $shape, $shapeId);
146
            } elseif ($shape instanceof ShapeChart) {
147
                $this->writeShapeChart($objWriter, $shape, $shapeId);
148 85
            } elseif ($shape instanceof AbstractGraphic) {
149
                $this->writeShapePic($objWriter, $shape, $shapeId);
150
            } elseif ($shape instanceof Group) {
151
                $this->writeShapeGroup($objWriter, $shape, $shapeId);
152
            }
153
            elseif ($shape instanceof RoundRectangle) {
154
                $this->writeShapeRoundRect($objWriter, $shape, $shapeId);
155
            }
156
            elseif ($shape instanceof Triangle) {
157
                $this->writeShapeTriangle($objWriter, $shape, $shapeId);
158 24
            }
159
            elseif ($shape instanceof Rectangle) {
160
                $this->writeShapeRectangle($objWriter, $shape, $shapeId);
161 24
            }
162
            elseif ($shape instanceof ArrowPointer) {
163 24
                $this->writeShapeArrowPointer($objWriter, $shape, $shapeId);
164
            }
165 24
            elseif ($shape instanceof Comment) {
166 24
            } else {
167 24
                throw new \Exception("Unknown Shape type: {get_class($shape)}");
168
            }
169
        }
170 24
    }
171
172
    /**
173 24
     * Writing a dynamic shape to help develop more dynamic and useful slides with php presentation.
174 1
     *
175
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
176
     * @param  \PhpOffice\PhpPresentation\Shape\GenericShape $shape
177 24
     * @param  int $shapeId
178
     * @throws \Exception
179 24
     */
180 24
    protected function writeShapeGeneric(XMLWriter $objWriter, GenericShape $shape, $shapeId)
181 24
    {
182
        //p:sp
183 24
        $objWriter->startElement('p:sp');
184
        //p:nvSpPr
185
        $objWriter->startElement('p:nvSpPr');
186
        //p:cNvPr
187
        $objWriter->startElement('p:cNvPr');
188
        $objWriter->writeAttribute('id',$shapeId);
189
        $objWriter->writeAttribute('name','Generic Shape');
190
        $objWriter->endElement();
191
        //p:cNvSpPr
192
        $objWriter->startElement('p:cNvSpPr');
193 24
        $objWriter->endElement();
194
        //p:nvPr
195
        $objWriter->startElement('p:nvPr');
196 24
        $objWriter->endElement();
197
        $objWriter->endElement();
198 24
        //p:spPr
199
        $objWriter->startElement('p:spPr');
200 24
        // a:xfrm
201
        $objWriter->startElement('a:xfrm');
202 24
203 24
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
204
205 24
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
206 24
            // a:off
207 24
            $objWriter->startElement('a:off');
208 24
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
209
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
210 24
            $objWriter->endElement();
211 24
            // a:ext
212 24
            $objWriter->startElement('a:ext');
213 24
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
214
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
215 24
            $objWriter->endElement();
216
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
217 24
            // a:off
218 24
            $objWriter->startElement('a:off');
219
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
220
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
221 24
            $objWriter->endElement();
222
            // a:ext
223 24
            $objWriter->startElement('a:ext');
224
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
225 24
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
226 24
            $objWriter->endElement();
227 24
        } elseif ($shape->getHeight() < 0) {
228
            $objWriter->writeAttribute('flipV', 1);
229
            // a:off
230 24
            $objWriter->startElement('a:off');
231
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
232 24
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
233
            $objWriter->endElement();
234
            // a:ext
235 24
            $objWriter->startElement('a:ext');
236 24
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
237 24
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
238 24
            $objWriter->endElement();
239 3
        } elseif ($shape->getWidth() < 0) {
240
            $objWriter->writeAttribute('flipV', 1);
241 24
            // a:off
242
            $objWriter->startElement('a:off');
243
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
244 24
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
245 24
            $objWriter->endElement();
246
            // a:ext
247
            $objWriter->startElement('a:ext');
248 24
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
249
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
250
            $objWriter->endElement();
251 24
        }
252 1
253
        $objWriter->endElement();
254 24
        //a:prstGeom
255 1
        $objWriter->startElement('a:prstGeom');
256
        $objWriter->writeAttribute('prst', $shape->getGenericShape());
0 ignored issues
show
Bug introduced by
The method getGenericShape() does not seem to exist on object<PhpOffice\PhpPres...ion\Shape\GenericShape>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
257 24
258 24
        // a:prstGeom/a:avLst
259 24
        $objWriter->writeElement('a:avLst');
260 24
        $objWriter->endElement();
261 24
        $this->writeSolidFill($objWriter, $shape->getFill());
262
        $this->writeBorder($objWriter, $shape->getBorder(), '');
263
        $objWriter->endElement();
264
        $objWriter->endElement();
265 24
266 24
    }
267 1
268 1
269
    /**
270 1
     * Writing a Triangle shape to help develop more dynamic and useful slides with php presentation.
271 1
     *
272
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
273
     * @param  \PhpOffice\PhpPresentation\Shape\Triangle $shape
274 24
     * @param  int $shapeId
275
     * @throws \Exception
276 24
     */
277
    protected function writeShapeTriangle(XMLWriter $objWriter, Triangle $shape, $shapeId)
278 24
    {
279 24
        //p:sp
280
        $objWriter->startElement('p:sp');
281 24
        //p:nvSpPr
282
        $objWriter->startElement('p:nvSpPr');
283
        //p:cNvPr
284
        $objWriter->startElement('p:cNvPr');
285
        $objWriter->writeAttribute('id',$shapeId);
286
        $objWriter->writeAttribute('name','Triangle');
287
        $objWriter->endElement();
288
        //p:cNvSpPr
289
        $objWriter->startElement('p:cNvSpPr');
290
        $objWriter->endElement();
291
        //p:nvPr
292
        $objWriter->startElement('p:nvPr');
293
        $objWriter->endElement();
294 24
        $objWriter->endElement();
295
        //p:spPr
296 24
        $objWriter->startElement('p:spPr');
297 24
        // a:xfrm
298 24
        $objWriter->startElement('a:xfrm');
299
300
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
301
302
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
303
            // a:off
304
            $objWriter->startElement('a:off');
305
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
306
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
307
            $objWriter->endElement();
308 10
            // a:ext
309
            $objWriter->startElement('a:ext');
310
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
311 10
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
312
            $objWriter->endElement();
313 10
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
314
            // a:off
315 10
            $objWriter->startElement('a:off');
316 10
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
317 10
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
318 10
            $objWriter->endElement();
319 10
            // a:ext
320
            $objWriter->startElement('a:ext');
321 10
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
322
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
323 10
            $objWriter->endElement();
324 10
        } elseif ($shape->getHeight() < 0) {
325 10
            $objWriter->writeAttribute('flipV', 1);
326
            // a:off
327 10
            $objWriter->startElement('a:off');
328
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
329 10
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
330 10
            $objWriter->endElement();
331
            // a:ext
332
            $objWriter->startElement('a:ext');
333
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
334
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
335 10
            $objWriter->endElement();
336
        } elseif ($shape->getWidth() < 0) {
337 10
            $objWriter->writeAttribute('flipV', 1);
338
            // a:off
339 10
            $objWriter->startElement('a:off');
340
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
341 10
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
342 10
            $objWriter->endElement();
343 10
            // a:ext
344 10
            $objWriter->startElement('a:ext');
345
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
346 10
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
347 10
            $objWriter->endElement();
348 10
        }
349 10
350
        $objWriter->endElement();
351 10
        //a:prstGeom
352
        $objWriter->startElement('a:prstGeom');
353 10
        $objWriter->writeAttribute('prst', 'triangle');
354
355 10
        // a:prstGeom/a:avLst
356 10
        $objWriter->writeElement('a:avLst');
357
        $objWriter->endElement();
358 10
        $this->writeSolidFill($objWriter, $shape->getFill());
359
        $this->writeBorder($objWriter, $shape->getBorder(), '');
360 10
        $objWriter->endElement();
361 10
        $objWriter->endElement();
362 10
363 10
    }
364
365 10
    /**
366
     * Writing a Ellipse shape to help develop more dynamic and useful slides with php presentation.
367 10
     *
368 10
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
369
     * @param  \PhpOffice\PhpPresentation\Shape\Ellipse $shape
370 10
     * @param  int $shapeId
371
     * @throws \Exception
372 10
     */
373 10
    protected function writeShapeEllipse(XMLWriter $objWriter, Ellipse $shape, $shapeId)
374 10
    {
375 10
        //p:sp
376 10
        $objWriter->startElement('p:sp');
377
        //p:nvSpPr
378 10
        $objWriter->startElement('p:nvSpPr');
379 10
        //p:cNvPr
380
        $objWriter->startElement('p:cNvPr');
381
        $objWriter->writeAttribute('id',$shapeId);
382 10
        $objWriter->writeAttribute('name','Ellipse 4');
383
        $objWriter->endElement();
384 10
        //p:cNvSpPr
385 10
        $objWriter->startElement('p:cNvSpPr');
386
        $objWriter->endElement();
387 10
        //p:nvPr
388
        $objWriter->startElement('p:nvPr');
389 10
        $objWriter->endElement();
390 10
        $objWriter->endElement();
391
        //p:spPr
392 10
        $objWriter->startElement('p:spPr');
393 10
        // a:xfrm
394
        $objWriter->startElement('a:xfrm');
395 10
396 10
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
397
398 10
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
399
            // a:off
400 10
            $objWriter->startElement('a:off');
401
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
402 10
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
403 10
            $objWriter->endElement();
404 10
            // a:ext
405 2
            $objWriter->startElement('a:ext');
406
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
407
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
408 10
            $objWriter->endElement();
409
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
410 10
            // a:off
411 1
            $objWriter->startElement('a:off');
412 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
413 10
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
414 1
            $objWriter->endElement();
415 1
            // a:ext
416
            $objWriter->startElement('a:ext');
417
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
418 10
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
419 1
            $objWriter->endElement();
420 1
        } elseif ($shape->getHeight() < 0) {
421 10
            $objWriter->writeAttribute('flipV', 1);
422 1
            // a:off
423 1
            $objWriter->startElement('a:off');
424
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
425
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
426 10
            $objWriter->endElement();
427
            // a:ext
428 10
            $objWriter->startElement('a:ext');
429 10
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
430 10
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
431
            $objWriter->endElement();
432 10
        } elseif ($shape->getWidth() < 0) {
433
            $objWriter->writeAttribute('flipV', 1);
434 10
            // a:off
435
            $objWriter->startElement('a:off');
436 10
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
437
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
438 10
            $objWriter->endElement();
439 10
            // a:ext
440
            $objWriter->startElement('a:ext');
441 10
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
442 10
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
443 10
            $objWriter->endElement();
444
        }
445
446 10
        $objWriter->endElement();
447 10
        //a:prstGeom
448 1
        $objWriter->startElement('a:prstGeom');
449
        $objWriter->writeAttribute('prst', 'leftCircularArrow');
450
451 10
        // a:prstGeom/a:avLst
452 10
        $objWriter->writeElement('a:avLst');
453 1
        $objWriter->endElement();
454
        $this->writeSolidFill($objWriter, $shape->getFill());
455
        $this->writeBorder($objWriter, $shape->getBorder(), '');
456
        $objWriter->endElement();
457 10
        $objWriter->endElement();
458 10
459 10
    }
460 10
461
    /**
462
     * Writing a Rectangle shape to help develop more dynamic and useful slides with php presentation.
463 10
     *
464 10
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
465 10
     * @param  \PhpOffice\PhpPresentation\Shape\Rectangle $shape
466 10
     * @param  int $shapeId
467 10
     * @throws \Exception
468 10
     */
469
    protected function writeShapeRectangle(XMLWriter $objWriter, Rectangle $shape, $shapeId)
470 10
    {
471 10
        //p:sp
472
        $objWriter->startElement('p:sp');
473 1
        //p:nvSpPr
474
        $objWriter->startElement('p:nvSpPr');
475 10
        //p:cNvPr
476 10
        $objWriter->startElement('p:cNvPr');
477
        $objWriter->writeAttribute('id',$shapeId);
478 1
        $objWriter->writeAttribute('name','Rectangle');
479
        $objWriter->endElement();
480
        //p:cNvSpPr
481 10
        $objWriter->startElement('p:cNvSpPr');
482 10
        $objWriter->endElement();
483 10
        //p:nvPr
484 10
        $objWriter->startElement('p:nvPr');
485 10
        $objWriter->endElement();
486 10
        $objWriter->endElement();
487
        //p:spPr
488 10
        $objWriter->startElement('p:spPr');
489 10
        // a:xfrm
490 10
        $objWriter->startElement('a:xfrm');
491
492 10
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
493
494 10
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
495 10
            // a:off
496 10
            $objWriter->startElement('a:off');
497 10
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
498 10
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
499
            $objWriter->endElement();
500
            // a:ext
501
            $objWriter->startElement('a:ext');
502
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
503
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
504
            $objWriter->endElement();
505
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
506
            // a:off
507
            $objWriter->startElement('a:off');
508 35
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
509
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
510
            $objWriter->endElement();
511 35
            // a:ext
512
            $objWriter->startElement('a:ext');
513 35
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
514
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
515
            $objWriter->endElement();
516 35
        } elseif ($shape->getHeight() < 0) {
517 35
            $objWriter->writeAttribute('flipV', 1);
518 35
            // a:off
519 35
            $objWriter->startElement('a:off');
520 35
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
521 35
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
522 35
            $objWriter->endElement();
523 35
            // a:ext
524
            $objWriter->startElement('a:ext');
525 35
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
526 35
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
527 35
            $objWriter->endElement();
528 35
        } elseif ($shape->getWidth() < 0) {
529 35
            $objWriter->writeAttribute('flipV', 1);
530
            // a:off
531
            $objWriter->startElement('a:off');
532 35
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
533
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
534
            $objWriter->endElement();
535 2
            // a:ext
536 2
            $objWriter->startElement('a:ext');
537 2
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
538 2
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
539
            $objWriter->endElement();
540
        }
541
542 2
        $objWriter->endElement();
543 2
        //a:prstGeom
544 2
        $objWriter->startElement('a:prstGeom');
545
        $objWriter->writeAttribute('prst', 'rect');
546 2
547
        // a:prstGeom/a:avLst
548 1
        $objWriter->writeElement('a:avLst');
549 1
        $objWriter->endElement();
550 1
        $this->writeSolidFill($objWriter, $shape->getFill());
551 1
        $this->writeBorder($objWriter, $shape->getBorder(), '');
552
        $objWriter->endElement();
553 1
        $objWriter->endElement();
554 1
555 1
    }
556 1
557
    /**
558 1
     * Writing an arrow pointer shape to help develop more dynamic and useful slides with php presentation.
559
     *
560
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
561
     * @param  \PhpOffice\PhpPresentation\Shape\ArrowPointer $shape
562 35
     * @param  int $shapeId
563
     * @throws \Exception
564
     */
565
    protected function writeShapeArrowPointer(XMLWriter $objWriter, ArrowPointer $shape, $shapeId)
566 35
    {
567 35
        // p:sp
568 30
        $objWriter->startElement('p:cxnSp');
569
        // p:nvSpPr
570 1
        $objWriter->startElement('p:nvCxnSpPr');
571 29
        // p:cNvPr
572
        $objWriter->startElement('p:cNvPr');
573 29
        $objWriter->writeAttribute('id', $shapeId);
574
        $objWriter->writeAttribute('name', 'Arrow Pointer');
575
        $objWriter->endElement();
576 29
        // p:cNvCxnSpPr
577
        $objWriter->writeElement('p:cNvCxnSpPr', null);
578 29
        // p:nvPr
579
        $objWriter->startElement('p:nvPr');
580
        if ($shape->isPlaceholder()) {
581 29
            $objWriter->startElement('p:ph');
582 29
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
583 29
            $objWriter->endElement();
584 29
        }
585 29
        $objWriter->endElement();
586 29
        $objWriter->endElement();
587 29
        // p:spPr
588 29
        $objWriter->startElement('p:spPr');
589 29
        // a:xfrm
590
        $objWriter->startElement('a:xfrm');
591
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
592 29
            // a:off
593 29
            $objWriter->startElement('a:off');
594 29
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
595
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
596
            $objWriter->endElement();
597 29
            // a:ext
598 29
            $objWriter->startElement('a:ext');
599 29
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
600
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
601
            $objWriter->endElement();
602 29
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
603
            // a:off
604 29
            $objWriter->startElement('a:off');
605
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
606
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
607
            $objWriter->endElement();
608 29
            // a:ext
609 29
            $objWriter->startElement('a:ext');
610 29
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
611
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
612 30
            $objWriter->endElement();
613
        } elseif ($shape->getHeight() < 0) {
614
            $objWriter->writeAttribute('flipV', 1);
615
            // a:off
616 35
            $objWriter->startElement('a:off');
617
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
618 35
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
619
            $objWriter->endElement();
620
            // a:ext
621
            $objWriter->startElement('a:ext');
622
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
623
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
624
            $objWriter->endElement();
625
        } elseif ($shape->getWidth() < 0) {
626
            $objWriter->writeAttribute('flipV', 1);
627
            // a:off
628 1
            $objWriter->startElement('a:off');
629
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
630
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
631 1
            $objWriter->endElement();
632
            // a:ext
633 1
            $objWriter->startElement('a:ext');
634
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
635 1
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
636 1
            $objWriter->endElement();
637 1
        }
638 1
        $objWriter->endElement();
639
        // a:prstGeom
640 1
        $objWriter->startElement('a:prstGeom');
641
        $objWriter->writeAttribute('prst', 'straightConnector1');
642 1
643 1
        // a:prstGeom/a:avLst
644
        $objWriter->writeElement('a:avLst');
645
        $objWriter->endElement();
646
647
        $this->writeArrowTailEnd($objWriter, $shape->getBorder(), '');
0 ignored issues
show
Bug introduced by
The method writeArrowTailEnd() does not seem to exist on object<PhpOffice\PhpPres...oint2007\AbstractSlide>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
648 1
649 1
        $objWriter->endElement();
650
651 1
        $objWriter->endElement();
652
653 1
    }
654 1
655
656 1
    /**
657 1
     * Writing a round rectangle shape to help develop more dynamic and useful slides with php presentation.
658 1
     *
659 1
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
660
     * @param  \PhpOffice\PhpPresentation\Shape\RoundRectangle $shape
661 1
     * @param  int $shapeId
662 1
     * @throws \Exception
663 1
     */
664 1
    protected function writeShapeRoundRect(XMLWriter $objWriter, RoundRectangle $shape, $shapeId)
665 1
    {
666
        //p:sp
667 1
        $objWriter->startElement('p:sp');
668 1
        //p:nvSpPr
669 1
        $objWriter->startElement('p:nvSpPr');
670 1
        //p:cNvPr
671
        $objWriter->startElement('p:cNvPr');
672 1
        $objWriter->writeAttribute('id',$shapeId);
673 1
        $objWriter->writeAttribute('name','Round Rectangle');
674 1
        $objWriter->endElement();
675 1
        //p:cNvSpPr
676 1
        $objWriter->startElement('p:cNvSpPr');
677 1
        $objWriter->endElement();
678
        //p:nvPr
679 1
        $objWriter->startElement('p:nvPr');
680 1
        $objWriter->endElement();
681 1
        $objWriter->endElement();
682 1
        //p:spPr
683
        $objWriter->startElement('p:spPr');
684 1
        // a:xfrm
685 1
        $objWriter->startElement('a:xfrm');
686 1
687 1
//        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
688 1
689 1
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
690
691 1
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
692 1
            // a:off
693 1
            $objWriter->startElement('a:off');
694 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
695
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
696 1
            $objWriter->endElement();
697 1
            // a:ext
698 1
            $objWriter->startElement('a:ext');
699 1
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
700
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
701 1
            $objWriter->endElement();
702
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
703 1
            // a:off
704 1
            $objWriter->startElement('a:off');
705
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
706
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
707 1
            $objWriter->endElement();
708
            // a:ext
709 1
            $objWriter->startElement('a:ext');
710 1
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
711 1
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
712 1
            $objWriter->endElement();
713 1
        } elseif ($shape->getHeight() < 0) {
714
            $objWriter->writeAttribute('flipV', 1);
715
            // a:off
716
            $objWriter->startElement('a:off');
717
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
718
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
719
            $objWriter->endElement();
720 33
            // a:ext
721
            $objWriter->startElement('a:ext');
722 33
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
723
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
724
            $objWriter->endElement();
725
        } elseif ($shape->getWidth() < 0) {
726 33
            $objWriter->writeAttribute('flipV', 1);
727 31
            // a:off
728
            $objWriter->startElement('a:off');
729
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
730
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
731 2
            $objWriter->endElement();
732
            // a:ext
733
            $objWriter->startElement('a:ext');
734 2
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
735 2
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
736 2
            $objWriter->endElement();
737 2
        }
738 2
739 2
        $objWriter->endElement();
740
        //a:prstGeom
741 2
        $objWriter->startElement('a:prstGeom');
742
        $objWriter->writeAttribute('prst', 'roundRect');
743 2
744
        // a:prstGeom/a:avLst
745 2
        $objWriter->writeElement('a:avLst');
746 2
        $objWriter->endElement();
747
        $this->writeSolidFill($objWriter, $shape->getFill());
748
        $this->writeBorder($objWriter, $shape->getBorder(), '');
749
        $objWriter->endElement();
750
        $objWriter->endElement();
751
752
753
    }
754
755 31
    /**
756
     * Write txt
757 31
     *
758 26
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
759
     * @param  \PhpOffice\PhpPresentation\Shape\RichText $shape
760
     * @param  int $shapeId
761 5
     * @throws \Exception
762 5
     */
763 5
    protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId)
764 5
    {
765 1
        // p:sp
766
        $objWriter->startElement('p:sp');
767 5
        // p:sp\p:nvSpPr
768 5
        $objWriter->startElement('p:nvSpPr');
769
        // p:sp\p:nvSpPr\p:cNvPr
770
        $objWriter->startElement('p:cNvPr');
771
        $objWriter->writeAttribute('id', $shapeId);
772
        if ($shape->isPlaceholder()) {
773
            $objWriter->writeAttribute('name', 'Placeholder for ' . $shape->getPlaceholder()->getType());
774
        } else {
775
            $objWriter->writeAttribute('name', '');
776 1
        }
777
        // Hyperlink
778
        if ($shape->hasHyperlink()) {
779 1
            $this->writeHyperlink($objWriter, $shape);
780
        }
781
        // > p:sp\p:nvSpPr
782 1
        $objWriter->endElement();
783
        // p:sp\p:cNvSpPr
784
        $objWriter->startElement('p:cNvSpPr');
785 1
        $objWriter->writeAttribute('txBox', '1');
786 1
        $objWriter->endElement();
787 1
        // p:sp\p:cNvSpPr\p:nvPr
788 1
        if ($shape->isPlaceholder()) {
789
            $objWriter->startElement('p:nvPr');
790
            $objWriter->startElement('p:ph');
791 1
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
792
            if (!is_null($shape->getPlaceholder()->getIdx())) {
793
                $objWriter->writeAttribute('idx', $shape->getPlaceholder()->getIdx());
794 1
            }
795
            $objWriter->endElement();
796
            $objWriter->endElement();
797 1
        } else {
798
            $objWriter->writeElement('p:nvPr', null);
799
        }
800 1
        // > p:sp\p:cNvSpPr
801 1
        $objWriter->endElement();
802 1
        // p:sp\p:spPr
803 1
        $objWriter->startElement('p:spPr');
804
        // p:sp\p:spPr\a:xfrm
805
        $objWriter->startElement('a:xfrm');
806 1
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
807
        // p:sp\p:spPr\a:xfrm\a:off
808
        $objWriter->startElement('a:off');
809 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
810
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
811
        $objWriter->endElement();
812 1
        // p:sp\p:spPr\a:xfrm\a:ext
813
        $objWriter->startElement('a:ext');
814
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
815 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
816
        $objWriter->endElement();
817
        // > p:sp\p:spPr\a:xfrm
818 1
        $objWriter->endElement();
819
        // p:sp\p:spPr\a:prstGeom
820
        $objWriter->startElement('a:prstGeom');
821 1
        $objWriter->writeAttribute('prst', 'rect');
822 1
        // p:sp\p:spPr\a:prstGeom\a:avLst
823 1
        $objWriter->writeElement('a:avLst');
824 1
        $objWriter->endElement();
825
        $this->writeFill($objWriter, $shape->getFill());
826
        $this->writeBorder($objWriter, $shape->getBorder(), '');
827 1
        $this->writeShadow($objWriter, $shape->getShadow());
828 1
        // > p:sp\p:spPr
829 1
        $objWriter->endElement();
830 1
        // p:txBody
831
        $objWriter->startElement('p:txBody');
832
        // a:bodyPr
833 1
        //@link :http://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.bodyproperties%28v=office.14%29.aspx
834 1
        $objWriter->startElement('a:bodyPr');
835 1
        if (!$shape->isPlaceholder()) {
836 1
            $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical();
837
            if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
838
                $objWriter->writeAttribute('anchor', $verticalAlign);
839 1
            }
840 1
            if ($shape->getWrap() != RichText::WRAP_SQUARE) {
841 1
                $objWriter->writeAttribute('wrap', $shape->getWrap());
842 1
            }
843
            $objWriter->writeAttribute('rtlCol', '0');
844
            if ($shape->getHorizontalOverflow() != RichText::OVERFLOW_OVERFLOW) {
845 1
                $objWriter->writeAttribute('horzOverflow', $shape->getHorizontalOverflow());
846
            }
847
            if ($shape->getVerticalOverflow() != RichText::OVERFLOW_OVERFLOW) {
848 1
                $objWriter->writeAttribute('vertOverflow', $shape->getVerticalOverflow());
849
            }
850
            if ($shape->isUpright()) {
851 1
                $objWriter->writeAttribute('upright', '1');
852
            }
853
            if ($shape->isVertical()) {
854 1
                $objWriter->writeAttribute('vert', 'vert');
855
            }
856
            $objWriter->writeAttribute('bIns', CommonDrawing::pixelsToEmu($shape->getInsetBottom()));
857 1
            $objWriter->writeAttribute('lIns', CommonDrawing::pixelsToEmu($shape->getInsetLeft()));
858 1
            $objWriter->writeAttribute('rIns', CommonDrawing::pixelsToEmu($shape->getInsetRight()));
859 1
            $objWriter->writeAttribute('tIns', CommonDrawing::pixelsToEmu($shape->getInsetTop()));
860 1
            if ($shape->getColumns() <> 1) {
861
                $objWriter->writeAttribute('numCol', $shape->getColumns());
862
            }
863 1
            // a:spAutoFit
864
            $objWriter->startElement('a:' . $shape->getAutoFit());
865
            if ($shape->getAutoFit() == RichText::AUTOFIT_NORMAL) {
866 1
                if (!is_null($shape->getFontScale())) {
867 1
                    $objWriter->writeAttribute('fontScale', $shape->getFontScale() * 1000);
868 1
                }
869 1
                if (!is_null($shape->getLineSpaceReduction())) {
870 1
                    $objWriter->writeAttribute('lnSpcReduction', $shape->getLineSpaceReduction() * 1000);
871
                }
872
            }
873 1
            $objWriter->endElement();
874
        }
875
        $objWriter->endElement();
876 1
        // a:lstStyle
877
        $objWriter->writeElement('a:lstStyle', null);
878
        if ($shape->isPlaceholder() &&
879 1
            ($shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ||
880 1
                $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_DATETIME)
881 1
        ) {
882
            $objWriter->startElement('a:p');
883
            // Paragraph Style
884 1
            $paragraphs = $shape->getParagraphs();
885
            if (!empty($paragraphs)) {
886
                $paragraph = &$paragraphs[0];
887 1
                $this->writeParagraphStyles($objWriter, $paragraph, true);
888
            }
889
            $objWriter->startElement('a:fld');
890 1
            $objWriter->writeAttribute('id', $this->getGUID());
891
            $objWriter->writeAttribute('type', (
892
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? 'slidenum' : 'datetime'));
893 1
            if (isset($paragraph)) {
894
                $elements = $paragraph->getRichTextElements();
895
                if (!empty($elements)) {
896 1
                    $element = &$elements[0];
897 1
                    $this->writeRunStyles($objWriter, $element);
0 ignored issues
show
Compatibility introduced by
$element of type object<PhpOffice\PhpPres...t\TextElementInterface> is not a sub-type of object<PhpOffice\PhpPres...ion\Shape\RichText\Run>. It seems like you assume a concrete implementation of the interface PhpOffice\PhpPresentatio...xt\TextElementInterface to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
898 1
                }
899 1
            }
900
            $objWriter->writeElement('a:t', (
901
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? '<nr.>' : '03-04-05'));
902 1
            $objWriter->endElement();
903 1
            $objWriter->endElement();
904 1
        } else {
905 1
            // Write paragraphs
906
            $this->writeParagraphs($objWriter, $shape->getParagraphs());
907
        }
908 1
        $objWriter->endElement();
909
        $objWriter->endElement();
910
    }
911 1
    /**
912 1
     * Write table
913
     *
914
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
915 1
     * @param  \PhpOffice\PhpPresentation\Shape\Table $shape
916
     * @param  int $shapeId
917
     * @throws \Exception
918 1
     */
919
    protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $shapeId)
920
    {
921 1
        // p:graphicFrame
922
        $objWriter->startElement('p:graphicFrame');
923
        // p:graphicFrame/p:nvGraphicFramePr
924 1
        $objWriter->startElement('p:nvGraphicFramePr');
925 1
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvPr
926
        $objWriter->startElement('p:cNvPr');
927
        $objWriter->writeAttribute('id', $shapeId);
928 1
        $objWriter->writeAttribute('name', $shape->getName());
929
        $objWriter->writeAttribute('descr', $shape->getDescription());
930
        $objWriter->endElement();
931 1
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr
932 1
        $objWriter->startElement('p:cNvGraphicFramePr');
933 1
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr/a:graphicFrameLocks
934
        $objWriter->startElement('a:graphicFrameLocks');
935
        $objWriter->writeAttribute('noGrp', '1');
936 1
        $objWriter->endElement();
937
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr/
938
        $objWriter->endElement();
939 1
        // p:graphicFrame/p:nvGraphicFramePr/p:nvPr
940
        $objWriter->startElement('p:nvPr');
941
        if ($shape->isPlaceholder()) {
942 1
            $objWriter->startElement('p:ph');
943
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
944
            $objWriter->endElement();
945 1
        }
946
        $objWriter->endElement();
947
        // p:graphicFrame/p:nvGraphicFramePr/
948 1
        $objWriter->endElement();
949
        // p:graphicFrame/p:xfrm
950
        $objWriter->startElement('p:xfrm');
951 1
        // p:graphicFrame/p:xfrm/a:off
952
        $objWriter->startElement('a:off');
953
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
954 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
955 1
        $objWriter->endElement();
956 1
        // p:graphicFrame/p:xfrm/a:ext
957 1
        $objWriter->startElement('a:ext');
958
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
959
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
960 1
        $objWriter->endElement();
961
        // p:graphicFrame/p:xfrm/
962
        $objWriter->endElement();
963 1
        // p:graphicFrame/a:graphic
964 1
        $objWriter->startElement('a:graphic');
965 1
        // p:graphicFrame/a:graphic/a:graphicData
966
        $objWriter->startElement('a:graphicData');
967
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/table');
968 1
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl
969
        $objWriter->startElement('a:tbl');
970
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblPr
971 1
        $objWriter->startElement('a:tblPr');
972
        $objWriter->writeAttribute('firstRow', '1');
973
        $objWriter->writeAttribute('bandRow', '1');
974 1
        $objWriter->endElement();
975 1
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid
976 1
        $objWriter->startElement('a:tblGrid');
977 1
        // Write cell widths
978
        $countCells = count($shape->getRow(0)->getCells());
979
        for ($cell = 0; $cell < $countCells; $cell++) {
980 1
            //  p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid/a:gridCol
981
            $objWriter->startElement('a:gridCol');
982
            // Calculate column width
983 1
            $width = $shape->getRow(0)->getCell($cell)->getWidth();
984
            if ($width == 0) {
985
                $colCount = count($shape->getRow(0)->getCells());
986
                $totalWidth = $shape->getWidth();
987 1
                $width = $totalWidth / $colCount;
988
            }
989
            $objWriter->writeAttribute('w', CommonDrawing::pixelsToEmu($width));
990 1
            $objWriter->endElement();
991
        }
992
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid/
993 1
        $objWriter->endElement();
994 1
        // Colspan / rowspan containers
995 1
        $colSpan = array();
996 1
        $rowSpan = array();
997
        // Default border style
998
        $defaultBorder = new Border();
999 1
        // Write rows
1000 1
        $countRows = count($shape->getRows());
1001 1
        for ($row = 0; $row < $countRows; $row++) {
1002 1
            // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr
1003
            $objWriter->startElement('a:tr');
1004
            $objWriter->writeAttribute('h', CommonDrawing::pixelsToEmu($shape->getRow($row)->getHeight()));
1005 1
            // Write cells
1006
            $countCells = count($shape->getRow($row)->getCells());
1007
            for ($cell = 0; $cell < $countCells; $cell++) {
1008 1
                // Current cell
1009 1
                $currentCell = $shape->getRow($row)->getCell($cell);
1010
                // Next cell right
1011
                $nextCellRight = $shape->getRow($row)->getCell($cell + 1, true);
1012 1
                // Next cell below
1013
                $nextRowBelow = $shape->getRow($row + 1, true);
1014
                $nextCellBelow = null;
1015 1
                if ($nextRowBelow != null) {
1016
                    $nextCellBelow = $nextRowBelow->getCell($cell, true);
1017
                }
1018 1
                // a:tc
1019
                $objWriter->startElement('a:tc');
1020
                // Colspan
1021 1
                if ($currentCell->getColSpan() > 1) {
1022
                    $objWriter->writeAttribute('gridSpan', $currentCell->getColSpan());
1023
                    $colSpan[$row] = $currentCell->getColSpan() - 1;
1024 1
                } elseif (isset($colSpan[$row]) && $colSpan[$row] > 0) {
1025
                    $colSpan[$row]--;
1026 1
                    $objWriter->writeAttribute('hMerge', '1');
1027
                }
1028
                // Rowspan
1029 1
                if ($currentCell->getRowSpan() > 1) {
1030 1
                    $objWriter->writeAttribute('rowSpan', $currentCell->getRowSpan());
1031
                    $rowSpan[$cell] = $currentCell->getRowSpan() - 1;
1032 1
                } elseif (isset($rowSpan[$cell]) && $rowSpan[$cell] > 0) {
1033 1
                    $rowSpan[$cell]--;
1034 1
                    $objWriter->writeAttribute('vMerge', '1');
1035
                }
1036
                // a:txBody
1037
                $objWriter->startElement('a:txBody');
1038
                // a:txBody/a:bodyPr
1039 1
                $objWriter->startElement('a:bodyPr');
1040
                $objWriter->writeAttribute('wrap', 'square');
1041
                $objWriter->writeAttribute('rtlCol', '0');
1042 1
                // a:txBody/a:bodyPr/a:spAutoFit
1043
                $objWriter->writeElement('a:spAutoFit', null);
1044
                // a:txBody/a:bodyPr/
1045 1
                $objWriter->endElement();
1046
                // a:lstStyle
1047
                $objWriter->writeElement('a:lstStyle', null);
1048 1
                // Write paragraphs
1049
                $this->writeParagraphs($objWriter, $currentCell->getParagraphs());
1050
                $objWriter->endElement();
1051 1
                // a:tcPr
1052
                $objWriter->startElement('a:tcPr');
1053
                $firstParagraph = $currentCell->getParagraph(0);
1054 1
                $firstParagraphAlignment = $firstParagraph->getAlignment();
1055
                // Text Direction
1056
                $textDirection = $firstParagraphAlignment->getTextDirection();
1057
                if ($textDirection != Alignment::TEXT_DIRECTION_HORIZONTAL) {
1058
                    $objWriter->writeAttribute('vert', $textDirection);
1059
                }
1060
                // Alignment (horizontal)
1061
                $verticalAlign = $firstParagraphAlignment->getVertical();
1062
                if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
1063
                    $objWriter->writeAttribute('anchor', $verticalAlign);
1064 34
                }
1065
                // Margins
1066
                $objWriter->writeAttribute('marL', $firstParagraphAlignment->getMarginLeft());
1067 34
                $objWriter->writeAttribute('marR', $firstParagraphAlignment->getMarginRight());
1068
                $objWriter->writeAttribute('marT', $firstParagraphAlignment->getMarginTop());
1069 34
                $objWriter->writeAttribute('marB', $firstParagraphAlignment->getMarginBottom());
1070
                // Determine borders
1071 34
                $borderLeft = $currentCell->getBorders()->getLeft();
1072 34
                $borderRight = $currentCell->getBorders()->getRight();
1073 34
                $borderTop = $currentCell->getBorders()->getTop();
1074 34
                $borderBottom = $currentCell->getBorders()->getBottom();
1075 34
                $borderDiagonalDown = $currentCell->getBorders()->getDiagonalDown();
1076
                $borderDiagonalUp = $currentCell->getBorders()->getDiagonalUp();
1077 34
                // Fix PowerPoint implementation
1078
                if (!is_null($nextCellRight)
1079 34
                    && $nextCellRight->getBorders()->getRight()->getHashCode() != $defaultBorder->getHashCode()
1080 34
                ) {
1081
                    $borderRight = $nextCellRight->getBorders()->getLeft();
1082
                }
1083
                if (!is_null($nextCellBelow)
1084
                    && $nextCellBelow->getBorders()->getBottom()->getHashCode() != $defaultBorder->getHashCode()
1085 34
                ) {
1086 34
                    $borderBottom = $nextCellBelow->getBorders()->getTop();
1087
                }
1088 34
                // Write borders
1089 34
                $this->writeBorder($objWriter, $borderLeft, 'L');
1090
                $this->writeBorder($objWriter, $borderRight, 'R');
1091 34
                $this->writeBorder($objWriter, $borderTop, 'T');
1092 34
                $this->writeBorder($objWriter, $borderBottom, 'B');
1093 34
                $this->writeBorder($objWriter, $borderDiagonalDown, 'TlToBr');
1094 34
                $this->writeBorder($objWriter, $borderDiagonalUp, 'BlToTr');
1095
                // Fill
1096 34
                $this->writeFill($objWriter, $currentCell->getFill());
1097 34
                $objWriter->endElement();
1098 34
                $objWriter->endElement();
1099 34
            }
1100 34
            $objWriter->endElement();
1101
        }
1102 34
        $objWriter->endElement();
1103
        $objWriter->endElement();
1104 34
        $objWriter->endElement();
1105 34
        $objWriter->endElement();
1106
    }
1107 34
    /**
1108 34
     * Write paragraphs
1109 34
     *
1110 34
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1111 34
     * @param  \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] $paragraphs
1112 34
     * @throws \Exception
1113 34
     */
1114 34
    protected function writeParagraphs(XMLWriter $objWriter, $paragraphs)
1115 34
    {
1116
        // Loop trough paragraphs
1117
        foreach ($paragraphs as $paragraph) {
1118
            // a:p
1119
            $objWriter->startElement('a:p');
1120
            // a:pPr
1121
            $this->writeParagraphStyles($objWriter, $paragraph, false);
1122
            // Loop trough rich text elements
1123
            $elements = $paragraph->getRichTextElements();
1124
            foreach ($elements as $element) {
1125 9
                if ($element instanceof BreakElement) {
1126
                    // a:br
1127
                    $objWriter->writeElement('a:br', null);
1128 9
                } elseif ($element instanceof Run || $element instanceof TextElement) {
1129
                    // a:r
1130 9
                    $objWriter->startElement('a:r');
1131
                    // a:rPr
1132 9
                    if ($element instanceof Run) {
1133 9
                        $this->writeRunStyles($objWriter, $element);
1134 9
                    }
1135 9
                    // t
1136
                    $objWriter->startElement('a:t');
1137 9
                    $objWriter->writeCData(Text::controlCharacterPHP2OOXML($element->getText()));
1138 1
                    $objWriter->endElement();
1139
                    $objWriter->endElement();
1140 9
                }
1141
            }
1142 9
            $objWriter->endElement();
1143
        }
1144 9
    }
1145 9
    /**
1146 9
     * Write Paragraph Styles (a:pPr)
1147 9
     *
1148
     * @param XMLWriter          $objWriter
1149 9
     * @param RichText\Paragraph $paragraph
1150
     * @param bool               $isPlaceholder
1151
     */
1152
    protected function writeParagraphStyles(XMLWriter $objWriter, RichText\Paragraph $paragraph, $isPlaceholder = false)
1153 9
    {
1154
        $objWriter->startElement('a:pPr');
1155 1
        $objWriter->writeAttribute('algn', $paragraph->getAlignment()->getHorizontal());
1156 1
        $objWriter->writeAttribute('fontAlgn', $paragraph->getAlignment()->getVertical());
1157 1
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getMarginLeft()));
1158
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getMarginRight()));
1159 1
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getIndent()));
1160
        $objWriter->writeAttribute('lvl', $paragraph->getAlignment()->getLevel());
1161 1
        $objWriter->startElement('a:lnSpc');
1162 1
        $objWriter->startElement('a:spcPct');
1163
        $objWriter->writeAttribute('val', $paragraph->getLineSpacing() . "%");
1164 1
        $objWriter->endElement();
1165 1
        $objWriter->endElement();
1166 1
        if (!$isPlaceholder) {
1167
            // Bullet type specified?
1168 1
            if ($paragraph->getBulletStyle()->getBulletType() != Bullet::TYPE_NONE) {
1169
                // Color
1170 1
                // a:buClr must be before a:buFont (else PowerPoint crashes at launch)
1171
                if ($paragraph->getBulletStyle()->getBulletColor() instanceof Color) {
1172 1
                    $objWriter->startElement('a:buClr');
1173
                    $this->writeColor($objWriter, $paragraph->getBulletStyle()->getBulletColor());
1174
                    $objWriter->endElement();
1175 9
                }
1176 9
                // a:buFont
1177
                $objWriter->startElement('a:buFont');
1178 9
                $objWriter->writeAttribute('typeface', $paragraph->getBulletStyle()->getBulletFont());
1179
                $objWriter->endElement();
1180 9
                if ($paragraph->getBulletStyle()->getBulletType() == Bullet::TYPE_BULLET) {
1181 9
                    // a:buChar
1182 9
                    $objWriter->startElement('a:buChar');
1183
                    $objWriter->writeAttribute('char', $paragraph->getBulletStyle()->getBulletChar());
1184 9
                    $objWriter->endElement();
1185 9
                } elseif ($paragraph->getBulletStyle()->getBulletType() == Bullet::TYPE_NUMERIC) {
1186 9
                    // a:buAutoNum
1187 9
                    $objWriter->startElement('a:buAutoNum');
1188
                    $objWriter->writeAttribute('type', $paragraph->getBulletStyle()->getBulletNumericStyle());
1189 9
                    if ($paragraph->getBulletStyle()->getBulletNumericStartAt() != 1) {
1190
                        $objWriter->writeAttribute('startAt', $paragraph->getBulletStyle()->getBulletNumericStartAt());
1191 9
                    }
1192 9
                    $objWriter->endElement();
1193
                }
1194 9
            }
1195 9
        }
1196 9
        $objWriter->endElement();
1197 9
    }
1198
    /**
1199 9
     * Write RichTextElement Styles (a:pPr)
1200 9
     *
1201 9
     * @param XMLWriter   $objWriter
1202 9
     * @param RichText\Run $element
1203 9
     */
1204
    protected function writeRunStyles(XMLWriter $objWriter, RichText\Run $element)
1205 9
    {
1206 9
        // a:rPr
1207
        $objWriter->startElement('a:rPr');
1208 9
        // Lang
1209 9
        $objWriter->writeAttribute('lang', ($element->getLanguage() ? $element->getLanguage() : 'en-US'));
1210
        $objWriter->writeAttributeIf($element->getFont()->isBold(), 'b', '1');
1211 9
        $objWriter->writeAttributeIf($element->getFont()->isItalic(), 'i', '1');
1212 9
        $objWriter->writeAttributeIf($element->getFont()->isStrikethrough(), 'strike', 'sngStrike');
1213 9
        // Size
1214
        $objWriter->writeAttribute('sz', ($element->getFont()->getSize() * 100));
1215 9
        // Character spacing
1216 9
        $objWriter->writeAttribute('spc', $element->getFont()->getCharacterSpacing());
1217 9
        // Underline
1218
        $objWriter->writeAttribute('u', $element->getFont()->getUnderline());
1219
        // Superscript / subscript
1220
        $objWriter->writeAttributeIf($element->getFont()->isSuperScript(), 'baseline', '30000');
1221
        $objWriter->writeAttributeIf($element->getFont()->isSubScript(), 'baseline', '-25000');
1222
        // Color - a:solidFill
1223
        $objWriter->startElement('a:solidFill');
1224
        $this->writeColor($objWriter, $element->getFont()->getColor());
1225
        $objWriter->endElement();
1226
        // Font - a:latin
1227 1
        $objWriter->startElement('a:latin');
1228
        $objWriter->writeAttribute('typeface', $element->getFont()->getName());
1229
        $objWriter->endElement();
1230 1
        // a:hlinkClick
1231
        $this->writeHyperlink($objWriter, $element);
1232 1
        $objWriter->endElement();
1233
    }
1234 1
    /**
1235 1
     * Write Line Shape
1236 1
     *
1237 1
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1238
     * @param \PhpOffice\PhpPresentation\Shape\Line $shape
1239
     * @param  int $shapeId
1240 1
     * @throws \Exception
1241
     */
1242 1
    protected function writeShapeLine(XMLWriter $objWriter, Line $shape, $shapeId)
1243 1
    {
1244
        // p:sp
1245 1
        $objWriter->startElement('p:cxnSp');
1246
        // p:nvSpPr
1247 1
        $objWriter->startElement('p:nvCxnSpPr');
1248
        // p:cNvPr
1249 1
        $objWriter->startElement('p:cNvPr');
1250 1
        $objWriter->writeAttribute('id', $shapeId);
1251 1
        $objWriter->writeAttribute('name', '');
1252 1
        $objWriter->endElement();
1253
        // p:cNvCxnSpPr
1254 1
        $objWriter->writeElement('p:cNvCxnSpPr', null);
1255 1
        // p:nvPr
1256 1
        $objWriter->startElement('p:nvPr');
1257 1
        if ($shape->isPlaceholder()) {
1258
            $objWriter->startElement('p:ph');
1259 1
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
1260 1
            $objWriter->endElement();
1261 1
        }
1262 1
        $objWriter->endElement();
1263
        $objWriter->endElement();
1264 1
        // p:spPr
1265 1
        $objWriter->startElement('p:spPr');
1266 1
        // a:xfrm
1267 1
        $objWriter->startElement('a:xfrm');
1268 1
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
1269 1
            // a:off
1270
            $objWriter->startElement('a:off');
1271 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1272
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1273 1
            $objWriter->endElement();
1274 1
            // a:ext
1275
            $objWriter->startElement('a:ext');
1276
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1277
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1278
            $objWriter->endElement();
1279
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
1280 112
            // a:off
1281
            $objWriter->startElement('a:off');
1282 112
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
1283 112
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
1284
            $objWriter->endElement();
1285 112
            // a:ext
1286
            $objWriter->startElement('a:ext');
1287 112
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
1288 112
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
1289
            $objWriter->endElement();
1290 112
        } elseif ($shape->getHeight() < 0) {
1291
            $objWriter->writeAttribute('flipV', 1);
1292 112
            // a:off
1293
            $objWriter->startElement('a:off');
1294 112
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1295 112
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
1296 112
            $objWriter->endElement();
1297
            // a:ext
1298 112
            $objWriter->startElement('a:ext');
1299
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1300
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
1301 112
            $objWriter->endElement();
1302
        } elseif ($shape->getWidth() < 0) {
1303
            $objWriter->writeAttribute('flipV', 1);
1304 112
            // a:off
1305
            $objWriter->startElement('a:off');
1306 112
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
1307
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1308
            $objWriter->endElement();
1309
            // a:ext
1310
            $objWriter->startElement('a:ext');
1311
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
1312
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1313
            $objWriter->endElement();
1314
        }
1315
        $objWriter->endElement();
1316
        // a:prstGeom
1317
        $objWriter->startElement('a:prstGeom');
1318
        $objWriter->writeAttribute('prst', 'line');
1319
        // a:prstGeom/a:avLst
1320
        $objWriter->writeElement('a:avLst');
1321
        $objWriter->endElement();
1322
        $this->writeBorder($objWriter, $shape->getBorder(), '');
1323
        $objWriter->endElement();
1324
        $objWriter->endElement();
1325
    }
1326
    /**
1327
     * Write Shadow
1328
     * @param XMLWriter $objWriter
1329
     * @param Shadow $oShadow
1330 112
     */
1331
    protected function writeShadow(XMLWriter $objWriter, $oShadow)
1332
    {
1333
        if (!($oShadow instanceof Shadow)) {
1334
            return;
1335
        }
1336
        if (!$oShadow->isVisible()) {
1337
            return;
1338
        }
1339
        // a:effectLst
1340
        $objWriter->startElement('a:effectLst');
1341
        // a:outerShdw
1342 112
        $objWriter->startElement('a:outerShdw');
1343 112
        $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($oShadow->getBlurRadius()));
1344
        $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($oShadow->getDistance()));
1345
        $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($oShadow->getDirection()));
1346
        $objWriter->writeAttribute('algn', $oShadow->getAlignment());
1347
        $objWriter->writeAttribute('rotWithShape', '0');
1348
        $this->writeColor($objWriter, $oShadow->getColor(), $oShadow->getAlpha());
1349
        $objWriter->endElement();
1350
        $objWriter->endElement();
1351
    }
1352 112
    /**
1353
     * Write hyperlink
1354 112
     *
1355 112
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
1356
     * @param \PhpOffice\PhpPresentation\AbstractShape|\PhpOffice\PhpPresentation\Shape\RichText\TextElement $shape
1357 1
     * @throws \Exception
1358 1
     */
1359 1
    protected function writeHyperlink(XMLWriter $objWriter, $shape)
1360
    {
1361 1
        if (!$shape->hasHyperlink()) {
1362 1
            return;
1363 1
        }
1364
        // a:hlinkClick
1365
        $objWriter->startElement('a:hlinkClick');
1366 1
        $objWriter->writeAttribute('r:id', $shape->getHyperlink()->relationId);
1367 1
        $objWriter->writeAttribute('tooltip', $shape->getHyperlink()->getTooltip());
1368 1
        if ($shape->getHyperlink()->isInternal()) {
1369 1
            $objWriter->writeAttribute('action', $shape->getHyperlink()->getUrl());
1370 1
        }
1371 1
        $objWriter->endElement();
1372 1
    }
1373 1
    /**
1374 1
     * Write Note Slide
1375 1
     * @param Note $pNote
1376 1
     * @throws \Exception
1377 1
     * @return  string
1378 1
     */
1379 1
    protected function writeNote(Note $pNote)
1380 1
    {
1381 1
        // Create XML writer
1382 1
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
1383 1
        // XML header
1384 1
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
1385 1
        // p:notes
1386 1
        $objWriter->startElement('p:notes');
1387 1
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
1388 1
        $objWriter->writeAttribute('xmlns:p', 'http://schemas.openxmlformats.org/presentationml/2006/main');
1389 1
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
1390 1
        // p:notes/p:cSld
1391 1
        $objWriter->startElement('p:cSld');
1392 1
        // p:notes/p:cSld/p:spTree
1393 1
        $objWriter->startElement('p:spTree');
1394 1
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr
1395 1
        $objWriter->startElement('p:nvGrpSpPr');
1396 1
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:cNvPr
1397 1
        $objWriter->startElement('p:cNvPr');
1398 1
        $objWriter->writeAttribute('id', '1');
1399 1
        $objWriter->writeAttribute('name', '');
1400 1
        $objWriter->endElement();
1401 1
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:cNvGrpSpPr
1402 1
        $objWriter->writeElement('p:cNvGrpSpPr', null);
1403 1
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:nvPr
1404 1
        $objWriter->writeElement('p:nvPr', null);
1405 1
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr
1406 1
        $objWriter->endElement();
1407 1
        // p:notes/p:cSld/p:spTree/p:grpSpPr
1408 1
        $objWriter->startElement('p:grpSpPr');
1409 1
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm
1410 1
        $objWriter->startElement('a:xfrm');
1411 1
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:off
1412 1
        $objWriter->startElement('a:off');
1413 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
1414 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($pNote->getOffsetY()));
1415 1
        $objWriter->endElement(); // a:off
1416 1
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:ext
1417 1
        $objWriter->startElement('a:ext');
1418 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($pNote->getExtentX()));
1419 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($pNote->getExtentY()));
1420 1
        $objWriter->endElement(); // a:ext
1421 1
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:chOff
1422 1
        $objWriter->startElement('a:chOff');
1423 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
1424 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($pNote->getOffsetY()));
1425 1
        $objWriter->endElement(); // a:chOff
1426 1
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:chExt
1427 1
        $objWriter->startElement('a:chExt');
1428 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($pNote->getExtentX()));
1429 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($pNote->getExtentY()));
1430 1
        $objWriter->endElement(); // a:chExt
1431 1
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm
1432 1
        $objWriter->endElement();
1433 1
        // p:notes/p:cSld/p:spTree/p:grpSpPr
1434 1
        $objWriter->endElement();
1435 1
        // p:notes/p:cSld/p:spTree/p:sp[1]
1436 1
        $objWriter->startElement('p:sp');
1437 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr
1438 1
        $objWriter->startElement('p:nvSpPr');
1439 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr
1440 1
        $objWriter->startElement('p:cNvPr');
1441 1
        $objWriter->writeAttribute('id', '2');
1442 1
        $objWriter->writeAttribute('name', 'Slide Image Placeholder 1');
1443 1
        $objWriter->endElement();
1444 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr
1445 1
        $objWriter->startElement('p:cNvSpPr');
1446 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr/a:spLocks
1447 1
        $objWriter->startElement('a:spLocks');
1448 1
        $objWriter->writeAttribute('noGrp', '1');
1449 1
        $objWriter->writeAttribute('noRot', '1');
1450 1
        $objWriter->writeAttribute('noChangeAspect', '1');
1451 1
        $objWriter->endElement();
1452 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr
1453 1
        $objWriter->endElement();
1454 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr
1455 1
        $objWriter->startElement('p:nvPr');
1456 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr/p:ph
1457 1
        $objWriter->startElement('p:ph');
1458 1
        $objWriter->writeAttribute('type', 'sldImg');
1459 1
        $objWriter->endElement();
1460 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr
1461 1
        $objWriter->endElement();
1462 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr
1463 1
        $objWriter->endElement();
1464 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr
1465 1
        $objWriter->startElement('p:spPr');
1466 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm
1467 1
        $objWriter->startElement('a:xfrm');
1468 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm/a:off
1469 1
        $objWriter->startElement('a:off');
1470 1
        $objWriter->writeAttribute('x', 0);
1471 1
        $objWriter->writeAttribute('y', 0);
1472 1
        $objWriter->endElement();
1473 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm/a:ext
1474 1
        $objWriter->startElement('a:ext');
1475 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(round($pNote->getExtentX() / 2)));
1476 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(round($pNote->getExtentY() / 2)));
1477 1
        $objWriter->endElement();
1478 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm
1479 1
        $objWriter->endElement();
1480 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom
1481 1
        $objWriter->startElement('a:prstGeom');
1482 1
        $objWriter->writeAttribute('prst', 'rect');
1483 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom/a:avLst
1484 1
        $objWriter->writeElement('a:avLst', null);
1485 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom
1486 1
        $objWriter->endElement();
1487 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:noFill
1488 1
        $objWriter->writeElement('a:noFill', null);
1489 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln
1490 1
        $objWriter->startElement('a:ln');
1491 1
        $objWriter->writeAttribute('w', '12700');
1492 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill
1493 1
        $objWriter->startElement('a:solidFill');
1494 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill/a:prstClr
1495 1
        $objWriter->startElement('a:prstClr');
1496 1
        $objWriter->writeAttribute('val', 'black');
1497 1
        $objWriter->endElement();
1498 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill
1499 1
        $objWriter->endElement();
1500 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln
1501 1
        $objWriter->endElement();
1502 1
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr
1503 1
        $objWriter->endElement();
1504 1
        // p:notes/p:cSld/p:spTree/p:sp[1]
1505 1
        $objWriter->endElement();
1506 1
        // p:notes/p:cSld/p:spTree/p:sp[2]
1507 1
        $objWriter->startElement('p:sp');
1508 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr
1509 1
        $objWriter->startElement('p:nvSpPr');
1510 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr
1511 1
        $objWriter->startElement('p:cNvPr');
1512 1
        $objWriter->writeAttribute('id', '3');
1513 1
        $objWriter->writeAttribute('name', 'Notes Placeholder');
1514 1
        $objWriter->endElement();
1515 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr
1516 1
        $objWriter->startElement('p:cNvSpPr');
1517 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr/a:spLocks
1518 1
        $objWriter->startElement('a:spLocks');
1519 1
        $objWriter->writeAttribute('noGrp', '1');
1520 1
        $objWriter->endElement();
1521 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr
1522 1
        $objWriter->endElement();
1523 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr
1524 1
        $objWriter->startElement('p:nvPr');
1525 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr/p:ph
1526 1
        $objWriter->startElement('p:ph');
1527 1
        $objWriter->writeAttribute('type', 'body');
1528 1
        $objWriter->writeAttribute('idx', '1');
1529 1
        $objWriter->endElement();
1530 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr
1531 1
        $objWriter->endElement();
1532 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr
1533 1
        $objWriter->endElement();
1534 1
        // START notes print below rectangle section
1535 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr
1536 1
        $objWriter->startElement('p:spPr');
1537 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm
1538 1
        $objWriter->startElement('a:xfrm');
1539 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:off
1540 1
        $objWriter->startElement('a:off');
1541 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
1542 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu(round($pNote->getExtentY() / 2) + $pNote->getOffsetY()));
1543 1
        $objWriter->endElement();
1544 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:ext
1545 1
        $objWriter->startElement('a:ext');
1546 1
        $objWriter->writeAttribute('cx', '5486400');
1547 1
        $objWriter->writeAttribute('cy', '3600450');
1548 1
        $objWriter->endElement();
1549 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm
1550 1
        $objWriter->endElement();
1551 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom
1552 1
        $objWriter->startElement('a:prstGeom');
1553 1
        $objWriter->writeAttribute('prst', 'rect');
1554 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom/a:avLst
1555 1
        $objWriter->writeElement('a:avLst', null);
1556 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom
1557 1
        $objWriter->endElement();
1558 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr
1559 1
        $objWriter->endElement();
1560 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody
1561 1
        $objWriter->startElement('p:txBody');
1562 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr
1563 1
        $objWriter->writeElement('a:bodyPr', null);
1564 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody/a:lstStyle
1565 1
        $objWriter->writeElement('a:lstStyle', null);
1566 1
        // Loop shapes
1567 1
        $shapes = $pNote->getShapeCollection();
1568 1
        foreach ($shapes as $shape) {
1569 1
            // Check type
1570 1
            if ($shape instanceof RichText) {
1571 1
                $paragraphs = $shape->getParagraphs();
1572 1
                $this->writeParagraphs($objWriter, $paragraphs);
1573 1
            }
1574 1
        }
1575 1
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody
1576 1
        $objWriter->endElement();
1577 1
        // p:notes/p:cSld/p:spTree/p:sp[2]
1578 1
        $objWriter->endElement();
1579 1
        // p:notes/p:cSld/p:spTree
1580 1
        $objWriter->endElement();
1581 1
        // p:notes/p:cSld
1582 1
        $objWriter->endElement();
1583 1
        // p:notes
1584 1
        $objWriter->endElement();
1585 1
        // Return
1586 1
        return $objWriter->getData();
1587 1
    }
1588
    /**
1589
     * Write chart
1590 1
     *
1591 1
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
1592
     * @param \PhpOffice\PhpPresentation\Shape\Chart $shape
1593
     * @param  int $shapeId
1594
     */
1595
    protected function writeShapeChart(XMLWriter $objWriter, ShapeChart $shape, $shapeId)
1596
    {
1597
        // p:graphicFrame
1598
        $objWriter->startElement('p:graphicFrame');
1599
        // p:nvGraphicFramePr
1600
        $objWriter->startElement('p:nvGraphicFramePr');
1601
        // p:cNvPr
1602
        $objWriter->startElement('p:cNvPr');
1603
        $objWriter->writeAttribute('id', $shapeId);
1604
        $objWriter->writeAttribute('name', $shape->getName());
1605
        $objWriter->writeAttribute('descr', $shape->getDescription());
1606
        $objWriter->endElement();
1607
        // p:cNvGraphicFramePr
1608
        $objWriter->writeElement('p:cNvGraphicFramePr', null);
1609
        // p:nvPr
1610
        $objWriter->startElement('p:nvPr');
1611
        if ($shape->isPlaceholder()) {
1612
            $objWriter->startElement('p:ph');
1613
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
1614
            $objWriter->endElement();
1615
        }
1616
        $objWriter->endElement();
1617
        $objWriter->endElement();
1618
        // p:xfrm
1619
        $objWriter->startElement('p:xfrm');
1620
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
1621
        // a:off
1622
        $objWriter->startElement('a:off');
1623
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1624
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1625
        $objWriter->endElement();
1626
        // a:ext
1627
        $objWriter->startElement('a:ext');
1628
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1629
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1630
        $objWriter->endElement();
1631
        $objWriter->endElement();
1632
        // a:graphic
1633
        $objWriter->startElement('a:graphic');
1634
        // a:graphicData
1635
        $objWriter->startElement('a:graphicData');
1636
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
1637
        // c:chart
1638
        $objWriter->startElement('c:chart');
1639
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
1640
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
1641
        $objWriter->writeAttribute('r:id', $shape->relationId);
1642
        $objWriter->endElement();
1643
        $objWriter->endElement();
1644
        $objWriter->endElement();
1645
        $objWriter->endElement();
1646
    }
1647
    /**
1648
     * Write pic
1649
     *
1650
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1651
     * @param  \PhpOffice\PhpPresentation\Shape\AbstractGraphic $shape
1652
     * @param  int $shapeId
1653
     * @throws \Exception
1654
     */
1655
    protected function writeShapePic(XMLWriter $objWriter, AbstractGraphic $shape, $shapeId)
1656
    {
1657
        // p:pic
1658
        $objWriter->startElement('p:pic');
1659
        // p:nvPicPr
1660
        $objWriter->startElement('p:nvPicPr');
1661
        // p:cNvPr
1662
        $objWriter->startElement('p:cNvPr');
1663
        $objWriter->writeAttribute('id', $shapeId);
1664
        $objWriter->writeAttribute('name', $shape->getName());
1665
        $objWriter->writeAttribute('descr', $shape->getDescription());
1666
        // a:hlinkClick
1667
        if ($shape->hasHyperlink()) {
1668
            $this->writeHyperlink($objWriter, $shape);
1669
        }
1670
        $objWriter->endElement();
1671
        // p:cNvPicPr
1672
        $objWriter->startElement('p:cNvPicPr');
1673
        // a:picLocks
1674
        $objWriter->startElement('a:picLocks');
1675
        $objWriter->writeAttribute('noChangeAspect', '1');
1676
        $objWriter->endElement();
1677
        $objWriter->endElement();
1678
        // p:nvPr
1679
        $objWriter->startElement('p:nvPr');
1680
        /**
1681
         * @link : https://github.com/stefslon/exportToPPTX/blob/master/exportToPPTX.m#L2128
1682
         */
1683
        if ($shape instanceof Media) {
1684
            // p:nvPr > a:videoFile
1685
            $objWriter->startElement('a:videoFile');
1686
            $objWriter->writeAttribute('r:link', $shape->relationId);
1687
            $objWriter->endElement();
1688
            // p:nvPr > p:extLst
1689
            $objWriter->startElement('p:extLst');
1690
            // p:nvPr > p:extLst > p:ext
1691
            $objWriter->startElement('p:ext');
1692
            $objWriter->writeAttribute('uri', '{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}');
1693
            // p:nvPr > p:extLst > p:ext > p14:media
1694
            $objWriter->startElement('p14:media');
1695
            $objWriter->writeAttribute('r:embed', $shape->relationId);
1696
            $objWriter->writeAttribute('xmlns:p14', 'http://schemas.microsoft.com/office/powerpoint/2010/main');
1697
            // p:nvPr > p:extLst > p:ext > ##p14:media
1698
            $objWriter->endElement();
1699
            // p:nvPr > p:extLst > ##p:ext
1700
            $objWriter->endElement();
1701
            // p:nvPr > ##p:extLst
1702
            $objWriter->endElement();
1703
        }
1704
        // ##p:nvPr
1705
        $objWriter->endElement();
1706
        $objWriter->endElement();
1707
        // p:blipFill
1708
        $objWriter->startElement('p:blipFill');
1709
        // a:blip
1710
        $objWriter->startElement('a:blip');
1711
        $objWriter->writeAttribute('r:embed', $shape->relationId);
1712
        $objWriter->endElement();
1713
        // a:stretch
1714
        $objWriter->startElement('a:stretch');
1715
        $objWriter->writeElement('a:fillRect', null);
1716
        $objWriter->endElement();
1717
        $objWriter->endElement();
1718
        // p:spPr
1719
        $objWriter->startElement('p:spPr');
1720
        // a:xfrm
1721
        $objWriter->startElement('a:xfrm');
1722
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
1723
        // a:off
1724
        $objWriter->startElement('a:off');
1725
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1726
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1727
        $objWriter->endElement();
1728
        // a:ext
1729
        $objWriter->startElement('a:ext');
1730
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1731
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1732
        $objWriter->endElement();
1733
        $objWriter->endElement();
1734
        // a:prstGeom
1735
        $objWriter->startElement('a:prstGeom');
1736
        $objWriter->writeAttribute('prst', 'rect');
1737
        // a:avLst
1738
        $objWriter->writeElement('a:avLst', null);
1739
        $objWriter->endElement();
1740
        if ($shape->getBorder()->getLineStyle() != Border::LINE_NONE) {
1741
            $this->writeBorder($objWriter, $shape->getBorder(), '');
1742
        }
1743
        if ($shape->getShadow()->isVisible()) {
1744
            $this->writeShadow($objWriter, $shape->getShadow());
1745
        }
1746
        $objWriter->endElement();
1747
        $objWriter->endElement();
1748
    }
1749
    /**
1750
     * Write group
1751
     *
1752
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
1753
     * @param \PhpOffice\PhpPresentation\Shape\Group $group
1754
     * @param  int $shapeId
1755
     * @throws \Exception
1756
     */
1757
    protected function writeShapeGroup(XMLWriter $objWriter, Group $group, &$shapeId)
1758
    {
1759
        // p:grpSp
1760
        $objWriter->startElement('p:grpSp');
1761
        // p:nvGrpSpPr
1762
        $objWriter->startElement('p:nvGrpSpPr');
1763
        // p:cNvPr
1764
        $objWriter->startElement('p:cNvPr');
1765
        $objWriter->writeAttribute('name', 'Group ' . $shapeId++);
1766
        $objWriter->writeAttribute('id', $shapeId);
1767
        $objWriter->endElement(); // p:cNvPr
1768
        // NOTE: Re: $shapeId This seems to be how PowerPoint 2010 does business.
1769
        // p:cNvGrpSpPr
1770
        $objWriter->writeElement('p:cNvGrpSpPr', null);
1771
        // p:nvPr
1772
        $objWriter->writeElement('p:nvPr', null);
1773
        $objWriter->endElement(); // p:nvGrpSpPr
1774
        // p:grpSpPr
1775
        $objWriter->startElement('p:grpSpPr');
1776
        // a:xfrm
1777
        $objWriter->startElement('a:xfrm');
1778
        // a:off
1779
        $objWriter->startElement('a:off');
1780
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($group->getOffsetX()));
1781
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($group->getOffsetY()));
1782
        $objWriter->endElement(); // a:off
1783
        // a:ext
1784
        $objWriter->startElement('a:ext');
1785
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($group->getExtentX()));
1786
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($group->getExtentY()));
1787
        $objWriter->endElement(); // a:ext
1788
        // a:chOff
1789
        $objWriter->startElement('a:chOff');
1790
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($group->getOffsetX()));
1791
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($group->getOffsetY()));
1792
        $objWriter->endElement(); // a:chOff
1793
        // a:chExt
1794
        $objWriter->startElement('a:chExt');
1795
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($group->getExtentX()));
1796
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($group->getExtentY()));
1797
        $objWriter->endElement(); // a:chExt
1798
        $objWriter->endElement(); // a:xfrm
1799
        $objWriter->endElement(); // p:grpSpPr
1800
        $this->writeShapeCollection($objWriter, $group->getShapeCollection(), $shapeId);
1801
        $objWriter->endElement(); // p:grpSp
1802
    }
1803
    /**
1804
     * @param \PhpOffice\PhpPresentation\Slide\AbstractSlide $pSlide
1805
     * @param $objWriter
1806
     */
1807
    protected function writeSlideBackground(AbstractSlideAlias $pSlide, XMLWriter $objWriter)
1808
    {
1809
        if (!($pSlide->getBackground() instanceof Slide\AbstractBackground)) {
1810
            return;
1811
        }
1812
        $oBackground = $pSlide->getBackground();
1813
        // p:bg
1814
        $objWriter->startElement('p:bg');
1815
        if ($oBackground instanceof Slide\Background\Color) {
1816
            // p:bgPr
1817
            $objWriter->startElement('p:bgPr');
1818
            // a:solidFill
1819
            $objWriter->startElement('a:solidFill');
1820
            // a:srgbClr
1821
            $objWriter->startElement('a:srgbClr');
1822
            $objWriter->writeAttribute('val', $oBackground->getColor()->getRGB());
1823
            $objWriter->endElement();
1824
            // > a:solidFill
1825
            $objWriter->endElement();
1826
            // p:bgPr/a:effectLst
1827
            $objWriter->writeElement('a:effectLst');
1828
            // > p:bgPr
1829
            $objWriter->endElement();
1830
        }
1831
        if ($oBackground instanceof Slide\Background\Image) {
1832
            // p:bgPr
1833
            $objWriter->startElement('p:bgPr');
1834
            // a:blipFill
1835
            $objWriter->startElement('a:blipFill');
1836
            // a:blip
1837
            $objWriter->startElement('a:blip');
1838
            $objWriter->writeAttribute('r:embed', $oBackground->relationId);
1839
            // > a:blipFill
1840
            $objWriter->endElement();
1841
            // a:stretch
1842
            $objWriter->startElement('a:stretch');
1843
            // a:fillRect
1844
            $objWriter->writeElement('a:fillRect');
1845
            // > a:stretch
1846
            $objWriter->endElement();
1847
            // > a:blipFill
1848
            $objWriter->endElement();
1849
            // > p:bgPr
1850
            $objWriter->endElement();
1851
        }
1852
        /**
1853
         * @link : http://www.officeopenxml.com/prSlide-background.php
1854
         */
1855
        if ($oBackground instanceof Slide\Background\SchemeColor) {
1856
            // p:bgRef
1857
            $objWriter->startElement('p:bgRef');
1858
            $objWriter->writeAttribute('idx', '1001');
1859
            // a:schemeClr
1860
            $objWriter->startElement('a:schemeClr');
1861
            $objWriter->writeAttribute('val', $oBackground->getSchemeColor()->getValue());
1862
            $objWriter->endElement();
1863
            // > p:bgRef
1864
            $objWriter->endElement();
1865
        }
1866
        // > p:bg
1867
        $objWriter->endElement();
1868
    }
1869
    /**
1870
     * Write Transition Slide
1871
     * @link http://officeopenxml.com/prSlide-transitions.php
1872
     * @param XMLWriter $objWriter
1873
     * @param Slide\Transition $transition
1874
     */
1875
    protected function writeSlideTransition(XMLWriter $objWriter, $transition)
1876
    {
1877
        if (!$transition instanceof Slide\Transition) {
1878
            return;
1879
        }
1880
        $objWriter->startElement('p:transition');
1881
        if (!is_null($transition->getSpeed())) {
1882
            $objWriter->writeAttribute('spd', $transition->getSpeed());
1883
        }
1884
        $objWriter->writeAttribute('advClick', $transition->hasManualTrigger() ? '1' : '0');
1885
        if ($transition->hasTimeTrigger()) {
1886
            $objWriter->writeAttribute('advTm', $transition->getAdvanceTimeTrigger());
1887
        }
1888
        switch ($transition->getTransitionType()) {
1889
            case Slide\Transition::TRANSITION_BLINDS_HORIZONTAL:
1890
                $objWriter->startElement('p:blinds');
1891
                $objWriter->writeAttribute('dir', 'horz');
1892
                $objWriter->endElement();
1893
                break;
1894
            case Slide\Transition::TRANSITION_BLINDS_VERTICAL:
1895
                $objWriter->startElement('p:blinds');
1896
                $objWriter->writeAttribute('dir', 'vert');
1897
                $objWriter->endElement();
1898
                break;
1899
            case Slide\Transition::TRANSITION_CHECKER_HORIZONTAL:
1900
                $objWriter->startElement('p:checker');
1901
                $objWriter->writeAttribute('dir', 'horz');
1902
                $objWriter->endElement();
1903
                break;
1904
            case Slide\Transition::TRANSITION_CHECKER_VERTICAL:
1905
                $objWriter->startElement('p:checker');
1906
                $objWriter->writeAttribute('dir', 'vert');
1907
                $objWriter->endElement();
1908
                break;
1909
            case Slide\Transition::TRANSITION_CIRCLE:
1910
                $objWriter->writeElement('p:circle');
1911
                break;
1912
            case Slide\Transition::TRANSITION_COMB_HORIZONTAL:
1913
                $objWriter->startElement('p:comb');
1914
                $objWriter->writeAttribute('dir', 'horz');
1915
                $objWriter->endElement();
1916
                break;
1917
            case Slide\Transition::TRANSITION_COMB_VERTICAL:
1918
                $objWriter->startElement('p:comb');
1919
                $objWriter->writeAttribute('dir', 'vert');
1920
                $objWriter->endElement();
1921
                break;
1922
            case Slide\Transition::TRANSITION_COVER_DOWN:
1923
                $objWriter->startElement('p:cover');
1924
                $objWriter->writeAttribute('dir', 'd');
1925
                $objWriter->endElement();
1926
                break;
1927
            case Slide\Transition::TRANSITION_COVER_LEFT:
1928
                $objWriter->startElement('p:cover');
1929
                $objWriter->writeAttribute('dir', 'l');
1930
                $objWriter->endElement();
1931
                break;
1932
            case Slide\Transition::TRANSITION_COVER_LEFT_DOWN:
1933
                $objWriter->startElement('p:cover');
1934
                $objWriter->writeAttribute('dir', 'ld');
1935
                $objWriter->endElement();
1936
                break;
1937
            case Slide\Transition::TRANSITION_COVER_LEFT_UP:
1938
                $objWriter->startElement('p:cover');
1939
                $objWriter->writeAttribute('dir', 'lu');
1940
                $objWriter->endElement();
1941
                break;
1942
            case Slide\Transition::TRANSITION_COVER_RIGHT:
1943
                $objWriter->startElement('p:cover');
1944
                $objWriter->writeAttribute('dir', 'r');
1945
                $objWriter->endElement();
1946
                break;
1947
            case Slide\Transition::TRANSITION_COVER_RIGHT_DOWN:
1948
                $objWriter->startElement('p:cover');
1949
                $objWriter->writeAttribute('dir', 'rd');
1950
                $objWriter->endElement();
1951
                break;
1952
            case Slide\Transition::TRANSITION_COVER_RIGHT_UP:
1953
                $objWriter->startElement('p:cover');
1954
                $objWriter->writeAttribute('dir', 'ru');
1955
                $objWriter->endElement();
1956
                break;
1957
            case Slide\Transition::TRANSITION_COVER_UP:
1958
                $objWriter->startElement('p:cover');
1959
                $objWriter->writeAttribute('dir', 'u');
1960
                $objWriter->endElement();
1961
                break;
1962
            case Slide\Transition::TRANSITION_CUT:
1963
                $objWriter->writeElement('p:cut');
1964
                break;
1965
            case Slide\Transition::TRANSITION_DIAMOND:
1966
                $objWriter->writeElement('p:diamond');
1967
                break;
1968
            case Slide\Transition::TRANSITION_DISSOLVE:
1969
                $objWriter->writeElement('p:dissolve');
1970
                break;
1971
            case Slide\Transition::TRANSITION_FADE:
1972
                $objWriter->writeElement('p:fade');
1973
                break;
1974
            case Slide\Transition::TRANSITION_NEWSFLASH:
1975
                $objWriter->writeElement('p:newsflash');
1976
                break;
1977
            case Slide\Transition::TRANSITION_PLUS:
1978
                $objWriter->writeElement('p:plus');
1979
                break;
1980
            case Slide\Transition::TRANSITION_PULL_DOWN:
1981
                $objWriter->startElement('p:pull');
1982
                $objWriter->writeAttribute('dir', 'd');
1983
                $objWriter->endElement();
1984
                break;
1985
            case Slide\Transition::TRANSITION_PULL_LEFT:
1986
                $objWriter->startElement('p:pull');
1987
                $objWriter->writeAttribute('dir', 'l');
1988
                $objWriter->endElement();
1989
                break;
1990
            case Slide\Transition::TRANSITION_PULL_RIGHT:
1991
                $objWriter->startElement('p:pull');
1992
                $objWriter->writeAttribute('dir', 'r');
1993
                $objWriter->endElement();
1994
                break;
1995
            case Slide\Transition::TRANSITION_PULL_UP:
1996
                $objWriter->startElement('p:pull');
1997
                $objWriter->writeAttribute('dir', 'u');
1998
                $objWriter->endElement();
1999
                break;
2000
            case Slide\Transition::TRANSITION_PUSH_DOWN:
2001
                $objWriter->startElement('p:push');
2002
                $objWriter->writeAttribute('dir', 'd');
2003
                $objWriter->endElement();
2004
                break;
2005
            case Slide\Transition::TRANSITION_PUSH_LEFT:
2006
                $objWriter->startElement('p:push');
2007
                $objWriter->writeAttribute('dir', 'l');
2008
                $objWriter->endElement();
2009
                break;
2010
            case Slide\Transition::TRANSITION_PUSH_RIGHT:
2011
                $objWriter->startElement('p:push');
2012
                $objWriter->writeAttribute('dir', 'r');
2013
                $objWriter->endElement();
2014
                break;
2015
            case Slide\Transition::TRANSITION_PUSH_UP:
2016
                $objWriter->startElement('p:push');
2017
                $objWriter->writeAttribute('dir', 'u');
2018
                $objWriter->endElement();
2019
                break;
2020
            case Slide\Transition::TRANSITION_RANDOM:
2021
                $objWriter->writeElement('p:random');
2022
                break;
2023
            case Slide\Transition::TRANSITION_RANDOMBAR_HORIZONTAL:
2024
                $objWriter->startElement('p:randomBar');
2025
                $objWriter->writeAttribute('dir', 'horz');
2026
                $objWriter->endElement();
2027
                break;
2028
            case Slide\Transition::TRANSITION_RANDOMBAR_VERTICAL:
2029
                $objWriter->startElement('p:randomBar');
2030
                $objWriter->writeAttribute('dir', 'vert');
2031
                $objWriter->endElement();
2032
                break;
2033
            case Slide\Transition::TRANSITION_SPLIT_IN_HORIZONTAL:
2034
                $objWriter->startElement('p:split');
2035
                $objWriter->writeAttribute('dir', 'in');
2036
                $objWriter->writeAttribute('orient', 'horz');
2037
                $objWriter->endElement();
2038
                break;
2039
            case Slide\Transition::TRANSITION_SPLIT_OUT_HORIZONTAL:
2040
                $objWriter->startElement('p:split');
2041
                $objWriter->writeAttribute('dir', 'out');
2042
                $objWriter->writeAttribute('orient', 'horz');
2043
                $objWriter->endElement();
2044
                break;
2045
            case Slide\Transition::TRANSITION_SPLIT_IN_VERTICAL:
2046
                $objWriter->startElement('p:split');
2047
                $objWriter->writeAttribute('dir', 'in');
2048
                $objWriter->writeAttribute('orient', 'vert');
2049
                $objWriter->endElement();
2050
                break;
2051
            case Slide\Transition::TRANSITION_SPLIT_OUT_VERTICAL:
2052
                $objWriter->startElement('p:split');
2053
                $objWriter->writeAttribute('dir', 'out');
2054
                $objWriter->writeAttribute('orient', 'vert');
2055
                $objWriter->endElement();
2056
                break;
2057
            case Slide\Transition::TRANSITION_STRIPS_LEFT_DOWN:
2058
                $objWriter->startElement('p:strips');
2059
                $objWriter->writeAttribute('dir', 'ld');
2060
                $objWriter->endElement();
2061
                break;
2062
            case Slide\Transition::TRANSITION_STRIPS_LEFT_UP:
2063
                $objWriter->startElement('p:strips');
2064
                $objWriter->writeAttribute('dir', 'lu');
2065
                $objWriter->endElement();
2066
                break;
2067
            case Slide\Transition::TRANSITION_STRIPS_RIGHT_DOWN:
2068
                $objWriter->startElement('p:strips');
2069
                $objWriter->writeAttribute('dir', 'rd');
2070
                $objWriter->endElement();
2071
                break;
2072
            case Slide\Transition::TRANSITION_STRIPS_RIGHT_UP:
2073
                $objWriter->startElement('p:strips');
2074
                $objWriter->writeAttribute('dir', 'ru');
2075
                $objWriter->endElement();
2076
                break;
2077
            case Slide\Transition::TRANSITION_WEDGE:
2078
                $objWriter->writeElement('p:wedge');
2079
                break;
2080
            case Slide\Transition::TRANSITION_WIPE_DOWN:
2081
                $objWriter->startElement('p:wipe');
2082
                $objWriter->writeAttribute('dir', 'd');
2083
                $objWriter->endElement();
2084
                break;
2085
            case Slide\Transition::TRANSITION_WIPE_LEFT:
2086
                $objWriter->startElement('p:wipe');
2087
                $objWriter->writeAttribute('dir', 'l');
2088
                $objWriter->endElement();
2089
                break;
2090
            case Slide\Transition::TRANSITION_WIPE_RIGHT:
2091
                $objWriter->startElement('p:wipe');
2092
                $objWriter->writeAttribute('dir', 'r');
2093
                $objWriter->endElement();
2094
                break;
2095
            case Slide\Transition::TRANSITION_WIPE_UP:
2096
                $objWriter->startElement('p:wipe');
2097
                $objWriter->writeAttribute('dir', 'u');
2098
                $objWriter->endElement();
2099
                break;
2100
            case Slide\Transition::TRANSITION_ZOOM_IN:
2101
                $objWriter->startElement('p:zoom');
2102
                $objWriter->writeAttribute('dir', 'in');
2103
                $objWriter->endElement();
2104
                break;
2105
            case Slide\Transition::TRANSITION_ZOOM_OUT:
2106
                $objWriter->startElement('p:zoom');
2107
                $objWriter->writeAttribute('dir', 'out');
2108
                $objWriter->endElement();
2109
                break;
2110
        }
2111
        $objWriter->endElement();
2112
    }
2113
    private function getGUID()
2114
    {
2115
        if (function_exists('com_create_guid')) {
2116
            return com_create_guid();
2117
        } else {
2118
            mt_srand((double)microtime() * 10000);//optional for php 4.2.0 and up.
2119
            $charid = strtoupper(md5(uniqid(rand(), true)));
2120
            $hyphen = chr(45);// "-"
2121
            $uuid = chr(123)// "{"
2122
                . substr($charid, 0, 8) . $hyphen
2123
                . substr($charid, 8, 4) . $hyphen
2124
                . substr($charid, 12, 4) . $hyphen
2125
                . substr($charid, 16, 4) . $hyphen
2126
                . substr($charid, 20, 12)
2127
                . chr(125);// "}"
2128
            return $uuid;
2129
        }
2130
    }
2131
}
2132