Completed
Pull Request — develop (#435)
by
unknown
19:30 queued 15:48
created

AbstractSlide::writeShapeGeneric()   C

Complexity

Conditions 7
Paths 5

Size

Total Lines 87
Code Lines 62

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 56

Importance

Changes 0
Metric Value
dl 0
loc 87
ccs 0
cts 64
cp 0
rs 6.5235
c 0
b 0
f 0
cc 7
eloc 62
nc 5
nop 3
crap 56

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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
     * @param $objWriter
55
     * @param $relId
56
     * @throws \Exception
57
     */
58 114
    protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, $objWriter, $relId)
59
    {
60 114
        if ($pSlideMaster->getShapeCollection()->count() > 0) {
61
            // Loop trough images and write relationships
62 2
            $iterator = $pSlideMaster->getShapeCollection()->getIterator();
63 2
            while ($iterator->valid()) {
64 2
                if ($iterator->current() instanceof ShapeDrawingFile || $iterator->current() instanceof ShapeDrawingGd) {
65
                    // Write relationship for image drawing
66 1
                    $this->writeRelationship(
67 1
                        $objWriter,
68 1
                        $relId,
69 1
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
70 1
                        '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename())
71 1
                    );
72 1
                    $iterator->current()->relationId = 'rId' . $relId;
73 1
                    ++$relId;
74 2
                } elseif ($iterator->current() instanceof ShapeChart) {
75
                    // Write relationship for chart drawing
76
                    $this->writeRelationship(
77
                        $objWriter,
78
                        $relId,
79
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
80
                        '../charts/' . $iterator->current()->getIndexedFilename()
81
                    );
82
                    $iterator->current()->relationId = 'rId' . $relId;
83
                    ++$relId;
84 1
                } elseif ($iterator->current() instanceof Group) {
85
                    $iterator2 = $iterator->current()->getShapeCollection()->getIterator();
86
                    while ($iterator2->valid()) {
87
                        if ($iterator2->current() instanceof ShapeDrawingFile ||
88
                            $iterator2->current() instanceof ShapeDrawingGd
89
                        ) {
90
                            // Write relationship for image drawing
91
                            $this->writeRelationship(
92
                                $objWriter,
93
                                $relId,
94
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
95
                                '../media/' . str_replace(' ', '_', $iterator2->current()->getIndexedFilename())
96
                            );
97
                            $iterator2->current()->relationId = 'rId' . $relId;
98
                            ++$relId;
99
                        } elseif ($iterator2->current() instanceof ShapeChart) {
100
                            // Write relationship for chart drawing
101
                            $this->writeRelationship(
102
                                $objWriter,
103
                                $relId,
104
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
105
                                '../charts/' . $iterator2->current()->getIndexedFilename()
106
                            );
107
                            $iterator2->current()->relationId = 'rId' . $relId;
108
                            ++$relId;
109
                        }
110
                        $iterator2->next();
111
                    }
112
                }
113 2
                $iterator->next();
114 2
            }
115 2
        }
116 114
    }
117
    /**
118
     * @param XMLWriter $objWriter
119
     * @param \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] $shapes
120
     * @param int $shapeId
121
     * @throws \Exception
122
     */
123 113
    protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), &$shapeId = 0)
124
    {
125 113
        if (count($shapes) == 0) {
126 113
            return;
127
        }
128 86
        foreach ($shapes as $shape) {
129
            // Increment $shapeId
130 86
            ++$shapeId;
131
            // Check type
132 86
            if ($shape instanceof RichText) {
133 26
                $this->writeShapeText($objWriter, $shape, $shapeId);
134 26
            }
135 61
            else if($shape instanceof GenericShape){
0 ignored issues
show
Coding Style introduced by
Expected 1 space after IF keyword; 0 found
Loading history...
136
                $this->writeShapeGeneric($objWriter, $shape, $shapeId);
137
            }
138 61
            elseif ($shape instanceof Ellipse) {
139
                $this->writeShapeEllipse($objWriter, $shape, $shapeId);
140
            }
141 61
            elseif ($shape instanceof ShapeTable) {
142 11
                $this->writeShapeTable($objWriter, $shape, $shapeId);
143 61
            } elseif ($shape instanceof Line) {
144 1
                $this->writeShapeLine($objWriter, $shape, $shapeId);
145 51
            } elseif ($shape instanceof ShapeChart) {
146 34
                $this->writeShapeChart($objWriter, $shape, $shapeId);
147 50
            } elseif ($shape instanceof AbstractGraphic) {
148 10
                $this->writeShapePic($objWriter, $shape, $shapeId);
149 17
            } elseif ($shape instanceof Group) {
150 1
                $this->writeShapeGroup($objWriter, $shape, $shapeId);
151 1
            }
152 8
            elseif ($shape instanceof RoundRectangle) {
153
                $this->writeShapeRoundRect($objWriter, $shape, $shapeId);
154
            }
155 8
            elseif ($shape instanceof Triangle) {
156
                $this->writeShapeTriangle($objWriter, $shape, $shapeId);
157
            }
158 8
            elseif ($shape instanceof Rectangle) {
159
                $this->writeShapeRectangle($objWriter, $shape, $shapeId);
160
            }
161 8
            elseif ($shape instanceof ArrowPointer) {
162
                $this->writeShapeArrowPointer($objWriter, $shape, $shapeId);
163
            }
164 8
            elseif ($shape instanceof Comment) {
165 8
            } else {
166
                throw new \Exception("Unknown Shape type: {get_class($shape)}");
167
            }
168 86
        }
169 86
    }
170
171
    /**
172
     * Writing a dynamic shape to help develop more dynamic and useful slides with php presentation.
173
     *
174
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
175
     * @param  \PhpOffice\PhpPresentation\Shape\GenericShape $shape
176
     * @param  int $shapeId
177
     * @throws \Exception
178
     */
179
    protected function writeShapeGeneric(XMLWriter $objWriter, GenericShape $shape, $shapeId)
180
    {
181
        //p:sp
182
        $objWriter->startElement('p:sp');
183
        //p:nvSpPr
184
        $objWriter->startElement('p:nvSpPr');
185
        //p:cNvPr
186
        $objWriter->startElement('p:cNvPr');
187
        $objWriter->writeAttribute('id',$shapeId);
188
        $objWriter->writeAttribute('name','Generic Shape');
189
        $objWriter->endElement();
190
        //p:cNvSpPr
191
        $objWriter->startElement('p:cNvSpPr');
192
        $objWriter->endElement();
193
        //p:nvPr
194
        $objWriter->startElement('p:nvPr');
195
        $objWriter->endElement();
196
        $objWriter->endElement();
197
        //p:spPr
198
        $objWriter->startElement('p:spPr');
199
        // a:xfrm
200
        $objWriter->startElement('a:xfrm');
201
202
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
203
204
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
205
            // a:off
206
            $objWriter->startElement('a:off');
207
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
208
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
209
            $objWriter->endElement();
210
            // a:ext
211
            $objWriter->startElement('a:ext');
212
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
213
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
214
            $objWriter->endElement();
215
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
216
            // a:off
217
            $objWriter->startElement('a:off');
218
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
219
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
220
            $objWriter->endElement();
221
            // a:ext
222
            $objWriter->startElement('a:ext');
223
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
224
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
225
            $objWriter->endElement();
226
        } elseif ($shape->getHeight() < 0) {
227
            $objWriter->writeAttribute('flipV', 1);
228
            // a:off
229
            $objWriter->startElement('a:off');
230
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
231
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
232
            $objWriter->endElement();
233
            // a:ext
234
            $objWriter->startElement('a:ext');
235
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
236
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
237
            $objWriter->endElement();
238
        } elseif ($shape->getWidth() < 0) {
239
            $objWriter->writeAttribute('flipV', 1);
240
            // a:off
241
            $objWriter->startElement('a:off');
242
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
243
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
244
            $objWriter->endElement();
245
            // a:ext
246
            $objWriter->startElement('a:ext');
247
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
248
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
249
            $objWriter->endElement();
250
        }
251
252
        $objWriter->endElement();
253
        //a:prstGeom
254
        $objWriter->startElement('a:prstGeom');
255
        $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...
256
257
        // a:prstGeom/a:avLst
258
        $objWriter->writeElement('a:avLst');
259
        $objWriter->endElement();
260
        $this->writeSolidFill($objWriter, $shape->getFill());
261
        $this->writeBorder($objWriter, $shape->getBorder(), '');
262
        $objWriter->endElement();
263
        $objWriter->endElement();
264
265
    }
266
267
268
    /**
269
     * Writing a Triangle shape to help develop more dynamic and useful slides with php presentation.
270
     *
271
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
272
     * @param  \PhpOffice\PhpPresentation\Shape\Triangle $shape
273
     * @param  int $shapeId
274
     * @throws \Exception
275
     */
276
    protected function writeShapeTriangle(XMLWriter $objWriter, Triangle $shape, $shapeId)
277
    {
278
        //p:sp
279
        $objWriter->startElement('p:sp');
280
        //p:nvSpPr
281
        $objWriter->startElement('p:nvSpPr');
282
        //p:cNvPr
283
        $objWriter->startElement('p:cNvPr');
284
        $objWriter->writeAttribute('id',$shapeId);
285
        $objWriter->writeAttribute('name','Triangle');
286
        $objWriter->endElement();
287
        //p:cNvSpPr
288
        $objWriter->startElement('p:cNvSpPr');
289
        $objWriter->endElement();
290
        //p:nvPr
291
        $objWriter->startElement('p:nvPr');
292
        $objWriter->endElement();
293
        $objWriter->endElement();
294
        //p:spPr
295
        $objWriter->startElement('p:spPr');
296
        // a:xfrm
297
        $objWriter->startElement('a:xfrm');
298
299
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
300
301
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
302
            // a:off
303
            $objWriter->startElement('a:off');
304
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
305
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
306
            $objWriter->endElement();
307
            // a:ext
308
            $objWriter->startElement('a:ext');
309
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
310
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
311
            $objWriter->endElement();
312
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
313
            // a:off
314
            $objWriter->startElement('a:off');
315
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
316
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
317
            $objWriter->endElement();
318
            // a:ext
319
            $objWriter->startElement('a:ext');
320
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
321
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
322
            $objWriter->endElement();
323
        } elseif ($shape->getHeight() < 0) {
324
            $objWriter->writeAttribute('flipV', 1);
325
            // a:off
326
            $objWriter->startElement('a:off');
327
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
328
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
329
            $objWriter->endElement();
330
            // a:ext
331
            $objWriter->startElement('a:ext');
332
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
333
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
334
            $objWriter->endElement();
335
        } elseif ($shape->getWidth() < 0) {
336
            $objWriter->writeAttribute('flipV', 1);
337
            // a:off
338
            $objWriter->startElement('a:off');
339
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
340
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
341
            $objWriter->endElement();
342
            // a:ext
343
            $objWriter->startElement('a:ext');
344
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
345
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
346
            $objWriter->endElement();
347
        }
348
349
        $objWriter->endElement();
350
        //a:prstGeom
351
        $objWriter->startElement('a:prstGeom');
352
        $objWriter->writeAttribute('prst', 'triangle');
353
354
        // a:prstGeom/a:avLst
355
        $objWriter->writeElement('a:avLst');
356
        $objWriter->endElement();
357
        $this->writeSolidFill($objWriter, $shape->getFill());
358
        $this->writeBorder($objWriter, $shape->getBorder(), '');
359
        $objWriter->endElement();
360
        $objWriter->endElement();
361
362
    }
363
364
    /**
365
     * Writing a Ellipse shape to help develop more dynamic and useful slides with php presentation.
366
     *
367
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
368
     * @param  \PhpOffice\PhpPresentation\Shape\Ellipse $shape
369
     * @param  int $shapeId
370
     * @throws \Exception
371
     */
372
    protected function writeShapeEllipse(XMLWriter $objWriter, Ellipse $shape, $shapeId)
373
    {
374
        //p:sp
375
        $objWriter->startElement('p:sp');
376
        //p:nvSpPr
377
        $objWriter->startElement('p:nvSpPr');
378
        //p:cNvPr
379
        $objWriter->startElement('p:cNvPr');
380
        $objWriter->writeAttribute('id',$shapeId);
381
        $objWriter->writeAttribute('name','Ellipse 4');
382
        $objWriter->endElement();
383
        //p:cNvSpPr
384
        $objWriter->startElement('p:cNvSpPr');
385
        $objWriter->endElement();
386
        //p:nvPr
387
        $objWriter->startElement('p:nvPr');
388
        $objWriter->endElement();
389
        $objWriter->endElement();
390
        //p:spPr
391
        $objWriter->startElement('p:spPr');
392
        // a:xfrm
393
        $objWriter->startElement('a:xfrm');
394
395
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
396
397
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
398
            // a:off
399
            $objWriter->startElement('a:off');
400
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
401
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
402
            $objWriter->endElement();
403
            // a:ext
404
            $objWriter->startElement('a:ext');
405
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
406
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
407
            $objWriter->endElement();
408
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
409
            // a:off
410
            $objWriter->startElement('a:off');
411
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
412
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
413
            $objWriter->endElement();
414
            // a:ext
415
            $objWriter->startElement('a:ext');
416
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
417
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
418
            $objWriter->endElement();
419
        } elseif ($shape->getHeight() < 0) {
420
            $objWriter->writeAttribute('flipV', 1);
421
            // a:off
422
            $objWriter->startElement('a:off');
423
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
424
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
425
            $objWriter->endElement();
426
            // a:ext
427
            $objWriter->startElement('a:ext');
428
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
429
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
430
            $objWriter->endElement();
431
        } elseif ($shape->getWidth() < 0) {
432
            $objWriter->writeAttribute('flipV', 1);
433
            // a:off
434
            $objWriter->startElement('a:off');
435
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
436
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
437
            $objWriter->endElement();
438
            // a:ext
439
            $objWriter->startElement('a:ext');
440
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
441
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
442
            $objWriter->endElement();
443
        }
444
445
        $objWriter->endElement();
446
        //a:prstGeom
447
        $objWriter->startElement('a:prstGeom');
448
        $objWriter->writeAttribute('prst', 'leftCircularArrow');
449
450
        // a:prstGeom/a:avLst
451
        $objWriter->writeElement('a:avLst');
452
        $objWriter->endElement();
453
        $this->writeSolidFill($objWriter, $shape->getFill());
454
        $this->writeBorder($objWriter, $shape->getBorder(), '');
455
        $objWriter->endElement();
456
        $objWriter->endElement();
457
458
    }
459
460
    /**
461
     * Writing a Rectangle shape to help develop more dynamic and useful slides with php presentation.
462
     *
463
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
464
     * @param  \PhpOffice\PhpPresentation\Shape\Rectangle $shape
465
     * @param  int $shapeId
466
     * @throws \Exception
467
     */
468
    protected function writeShapeRectangle(XMLWriter $objWriter, Rectangle $shape, $shapeId)
469
    {
470
        //p:sp
471
        $objWriter->startElement('p:sp');
472
        //p:nvSpPr
473
        $objWriter->startElement('p:nvSpPr');
474
        //p:cNvPr
475
        $objWriter->startElement('p:cNvPr');
476
        $objWriter->writeAttribute('id',$shapeId);
477
        $objWriter->writeAttribute('name','Rectangle');
478
        $objWriter->endElement();
479
        //p:cNvSpPr
480
        $objWriter->startElement('p:cNvSpPr');
481
        $objWriter->endElement();
482
        //p:nvPr
483
        $objWriter->startElement('p:nvPr');
484
        $objWriter->endElement();
485
        $objWriter->endElement();
486
        //p:spPr
487
        $objWriter->startElement('p:spPr');
488
        // a:xfrm
489
        $objWriter->startElement('a:xfrm');
490
491
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
492
493
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
494
            // a:off
495
            $objWriter->startElement('a:off');
496
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
497
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
498
            $objWriter->endElement();
499
            // a:ext
500
            $objWriter->startElement('a:ext');
501
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
502
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
503
            $objWriter->endElement();
504
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
505
            // a:off
506
            $objWriter->startElement('a:off');
507
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
508
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
509
            $objWriter->endElement();
510
            // a:ext
511
            $objWriter->startElement('a:ext');
512
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
513
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
514
            $objWriter->endElement();
515
        } elseif ($shape->getHeight() < 0) {
516
            $objWriter->writeAttribute('flipV', 1);
517
            // a:off
518
            $objWriter->startElement('a:off');
519
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
520
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
521
            $objWriter->endElement();
522
            // a:ext
523
            $objWriter->startElement('a:ext');
524
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
525
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
526
            $objWriter->endElement();
527
        } elseif ($shape->getWidth() < 0) {
528
            $objWriter->writeAttribute('flipV', 1);
529
            // a:off
530
            $objWriter->startElement('a:off');
531
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
532
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
533
            $objWriter->endElement();
534
            // a:ext
535
            $objWriter->startElement('a:ext');
536
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
537
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
538
            $objWriter->endElement();
539
        }
540
541
        $objWriter->endElement();
542
        //a:prstGeom
543
        $objWriter->startElement('a:prstGeom');
544
        $objWriter->writeAttribute('prst', 'rect');
545
546
        // a:prstGeom/a:avLst
547
        $objWriter->writeElement('a:avLst');
548
        $objWriter->endElement();
549
        $this->writeSolidFill($objWriter, $shape->getFill());
550
        $this->writeBorder($objWriter, $shape->getBorder(), '');
551
        $objWriter->endElement();
552
        $objWriter->endElement();
553
554
    }
555
556
    /**
557
     * Writing an arrow pointer shape to help develop more dynamic and useful slides with php presentation.
558
     *
559
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
560
     * @param  \PhpOffice\PhpPresentation\Shape\ArrowPointer $shape
561
     * @param  int $shapeId
562
     * @throws \Exception
563
     */
564
    protected function writeShapeArrowPointer(XMLWriter $objWriter, ArrowPointer $shape, $shapeId)
565
    {
566
        // p:sp
567
        $objWriter->startElement('p:cxnSp');
568
        // p:nvSpPr
569
        $objWriter->startElement('p:nvCxnSpPr');
570
        // p:cNvPr
571
        $objWriter->startElement('p:cNvPr');
572
        $objWriter->writeAttribute('id', $shapeId);
573
        $objWriter->writeAttribute('name', 'Arrow Pointer');
574
        $objWriter->endElement();
575
        // p:cNvCxnSpPr
576
        $objWriter->writeElement('p:cNvCxnSpPr', null);
577
        // p:nvPr
578
        $objWriter->startElement('p:nvPr');
579
        if ($shape->isPlaceholder()) {
580
            $objWriter->startElement('p:ph');
581
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
582
            $objWriter->endElement();
583
        }
584
        $objWriter->endElement();
585
        $objWriter->endElement();
586
        // p:spPr
587
        $objWriter->startElement('p:spPr');
588
        // a:xfrm
589
        $objWriter->startElement('a:xfrm');
590
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
591
            // a:off
592
            $objWriter->startElement('a:off');
593
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
594
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
595
            $objWriter->endElement();
596
            // a:ext
597
            $objWriter->startElement('a:ext');
598
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
599
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
600
            $objWriter->endElement();
601
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
602
            // a:off
603
            $objWriter->startElement('a:off');
604
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
605
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
606
            $objWriter->endElement();
607
            // a:ext
608
            $objWriter->startElement('a:ext');
609
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
610
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
611
            $objWriter->endElement();
612
        } elseif ($shape->getHeight() < 0) {
613
            $objWriter->writeAttribute('flipV', 1);
614
            // a:off
615
            $objWriter->startElement('a:off');
616
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
617
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
618
            $objWriter->endElement();
619
            // a:ext
620
            $objWriter->startElement('a:ext');
621
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
622
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
623
            $objWriter->endElement();
624
        } elseif ($shape->getWidth() < 0) {
625
            $objWriter->writeAttribute('flipV', 1);
626
            // a:off
627
            $objWriter->startElement('a:off');
628
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
629
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
630
            $objWriter->endElement();
631
            // a:ext
632
            $objWriter->startElement('a:ext');
633
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
634
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
635
            $objWriter->endElement();
636
        }
637
        $objWriter->endElement();
638
        // a:prstGeom
639
        $objWriter->startElement('a:prstGeom');
640
        $objWriter->writeAttribute('prst', 'straightConnector1');
641
642
        // a:prstGeom/a:avLst
643
        $objWriter->writeElement('a:avLst');
644
        $objWriter->endElement();
645
646
        $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...
647
648
        $objWriter->endElement();
649
650
        $objWriter->endElement();
651
652
    }
653
654
655
    /**
656
     * Writing a round rectangle shape to help develop more dynamic and useful slides with php presentation.
657
     *
658
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
659
     * @param  \PhpOffice\PhpPresentation\Shape\RoundRectangle $shape
660
     * @param  int $shapeId
661
     * @throws \Exception
662
     */
663
    protected function writeShapeRoundRect(XMLWriter $objWriter, RoundRectangle $shape, $shapeId)
664
    {
665
        //p:sp
666
        $objWriter->startElement('p:sp');
667
        //p:nvSpPr
668
        $objWriter->startElement('p:nvSpPr');
669
        //p:cNvPr
670
        $objWriter->startElement('p:cNvPr');
671
        $objWriter->writeAttribute('id',$shapeId);
672
        $objWriter->writeAttribute('name','Round Rectangle');
673
        $objWriter->endElement();
674
        //p:cNvSpPr
675
        $objWriter->startElement('p:cNvSpPr');
676
        $objWriter->endElement();
677
        //p:nvPr
678
        $objWriter->startElement('p:nvPr');
679
        $objWriter->endElement();
680
        $objWriter->endElement();
681
        //p:spPr
682
        $objWriter->startElement('p:spPr');
683
        // a:xfrm
684
        $objWriter->startElement('a:xfrm');
685
686
//        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
687
688
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
689
690
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
691
            // a:off
692
            $objWriter->startElement('a:off');
693
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
694
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
695
            $objWriter->endElement();
696
            // a:ext
697
            $objWriter->startElement('a:ext');
698
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
699
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
700
            $objWriter->endElement();
701
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
702
            // a:off
703
            $objWriter->startElement('a:off');
704
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
705
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
706
            $objWriter->endElement();
707
            // a:ext
708
            $objWriter->startElement('a:ext');
709
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
710
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
711
            $objWriter->endElement();
712
        } elseif ($shape->getHeight() < 0) {
713
            $objWriter->writeAttribute('flipV', 1);
714
            // a:off
715
            $objWriter->startElement('a:off');
716
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
717
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
718
            $objWriter->endElement();
719
            // a:ext
720
            $objWriter->startElement('a:ext');
721
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
722
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
723
            $objWriter->endElement();
724
        } elseif ($shape->getWidth() < 0) {
725
            $objWriter->writeAttribute('flipV', 1);
726
            // a:off
727
            $objWriter->startElement('a:off');
728
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
729
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
730
            $objWriter->endElement();
731
            // a:ext
732
            $objWriter->startElement('a:ext');
733
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
734
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
735
            $objWriter->endElement();
736
        }
737
738
        $objWriter->endElement();
739
        //a:prstGeom
740
        $objWriter->startElement('a:prstGeom');
741
        $objWriter->writeAttribute('prst', 'roundRect');
742
743
        // a:prstGeom/a:avLst
744
        $objWriter->writeElement('a:avLst');
745
        $objWriter->endElement();
746
        $this->writeSolidFill($objWriter, $shape->getFill());
747
        $this->writeBorder($objWriter, $shape->getBorder(), '');
748
        $objWriter->endElement();
749
        $objWriter->endElement();
750
751
752
    }
753
754
    /**
755
     * Write txt
756
     *
757
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
758
     * @param  \PhpOffice\PhpPresentation\Shape\RichText $shape
759
     * @param  int $shapeId
760
     * @throws \Exception
761
     */
762 26
    protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId)
763
    {
764
        // p:sp
765 26
        $objWriter->startElement('p:sp');
766
        // p:sp\p:nvSpPr
767 26
        $objWriter->startElement('p:nvSpPr');
768
        // p:sp\p:nvSpPr\p:cNvPr
769 26
        $objWriter->startElement('p:cNvPr');
770 26
        $objWriter->writeAttribute('id', $shapeId);
771 26
        if ($shape->isPlaceholder()) {
772 1
            $objWriter->writeAttribute('name', 'Placeholder for ' . $shape->getPlaceholder()->getType());
773 1
        } else {
774 26
            $objWriter->writeAttribute('name', '');
775
        }
776
        // Hyperlink
777 26
        if ($shape->hasHyperlink()) {
778 1
            $this->writeHyperlink($objWriter, $shape);
779 1
        }
780
        // > p:sp\p:nvSpPr
781 26
        $objWriter->endElement();
782
        // p:sp\p:cNvSpPr
783 26
        $objWriter->startElement('p:cNvSpPr');
784 26
        $objWriter->writeAttribute('txBox', '1');
785 26
        $objWriter->endElement();
786
        // p:sp\p:cNvSpPr\p:nvPr
787 26
        if ($shape->isPlaceholder()) {
788 1
            $objWriter->startElement('p:nvPr');
789 1
            $objWriter->startElement('p:ph');
790 1
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
791 1
            if (!is_null($shape->getPlaceholder()->getIdx())) {
792
                $objWriter->writeAttribute('idx', $shape->getPlaceholder()->getIdx());
793
            }
794 1
            $objWriter->endElement();
795 1
            $objWriter->endElement();
796 1
        } else {
797 26
            $objWriter->writeElement('p:nvPr', null);
798
        }
799
        // > p:sp\p:cNvSpPr
800 26
        $objWriter->endElement();
801
        // p:sp\p:spPr
802 26
        $objWriter->startElement('p:spPr');
803
        // p:sp\p:spPr\a:xfrm
804 26
        $objWriter->startElement('a:xfrm');
805 26
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
806
        // p:sp\p:spPr\a:xfrm\a:off
807 26
        $objWriter->startElement('a:off');
808 26
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
809 26
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
810 26
        $objWriter->endElement();
811
        // p:sp\p:spPr\a:xfrm\a:ext
812 26
        $objWriter->startElement('a:ext');
813 26
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
814 26
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
815 26
        $objWriter->endElement();
816
        // > p:sp\p:spPr\a:xfrm
817 26
        $objWriter->endElement();
818
        // p:sp\p:spPr\a:prstGeom
819 26
        $objWriter->startElement('a:prstGeom');
820 26
        $objWriter->writeAttribute('prst', 'rect');
821
        // p:sp\p:spPr\a:prstGeom\a:avLst
822 26
        $objWriter->writeElement('a:avLst');
823 26
        $objWriter->endElement();
824 26
        $this->writeFill($objWriter, $shape->getFill());
825 26
        $this->writeBorder($objWriter, $shape->getBorder(), '');
826 26
        $this->writeShadow($objWriter, $shape->getShadow());
827
        // > p:sp\p:spPr
828 26
        $objWriter->endElement();
829
        // p:txBody
830 26
        $objWriter->startElement('p:txBody');
831
        // a:bodyPr
832
        //@link :http://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.bodyproperties%28v=office.14%29.aspx
833 26
        $objWriter->startElement('a:bodyPr');
834 26
        if (!$shape->isPlaceholder()) {
835 26
            $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical();
836 26
            if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
837 3
                $objWriter->writeAttribute('anchor', $verticalAlign);
838 3
            }
839 26
            if ($shape->getWrap() != RichText::WRAP_SQUARE) {
840
                $objWriter->writeAttribute('wrap', $shape->getWrap());
841
            }
842 26
            $objWriter->writeAttribute('rtlCol', '0');
843 26
            if ($shape->getHorizontalOverflow() != RichText::OVERFLOW_OVERFLOW) {
844
                $objWriter->writeAttribute('horzOverflow', $shape->getHorizontalOverflow());
845
            }
846 26
            if ($shape->getVerticalOverflow() != RichText::OVERFLOW_OVERFLOW) {
847
                $objWriter->writeAttribute('vertOverflow', $shape->getVerticalOverflow());
848
            }
849 26
            if ($shape->isUpright()) {
850 1
                $objWriter->writeAttribute('upright', '1');
851 1
            }
852 26
            if ($shape->isVertical()) {
853 1
                $objWriter->writeAttribute('vert', 'vert');
854 1
            }
855 26
            $objWriter->writeAttribute('bIns', CommonDrawing::pixelsToEmu($shape->getInsetBottom()));
856 26
            $objWriter->writeAttribute('lIns', CommonDrawing::pixelsToEmu($shape->getInsetLeft()));
857 26
            $objWriter->writeAttribute('rIns', CommonDrawing::pixelsToEmu($shape->getInsetRight()));
858 26
            $objWriter->writeAttribute('tIns', CommonDrawing::pixelsToEmu($shape->getInsetTop()));
859 26
            if ($shape->getColumns() <> 1) {
860
                $objWriter->writeAttribute('numCol', $shape->getColumns());
861
            }
862
            // a:spAutoFit
863 26
            $objWriter->startElement('a:' . $shape->getAutoFit());
864 26
            if ($shape->getAutoFit() == RichText::AUTOFIT_NORMAL) {
865 1
                if (!is_null($shape->getFontScale())) {
866 1
                    $objWriter->writeAttribute('fontScale', (int)($shape->getFontScale() * 1000));
867 1
                }
868 1
                if (!is_null($shape->getLineSpaceReduction())) {
869 1
                    $objWriter->writeAttribute('lnSpcReduction', (int)($shape->getLineSpaceReduction() * 1000));
870 1
                }
871 1
            }
872 26
            $objWriter->endElement();
873 26
        }
874 26
        $objWriter->endElement();
875
        // a:lstStyle
876 26
        $objWriter->writeElement('a:lstStyle', null);
877 26
        if ($shape->isPlaceholder() &&
878 1
            ($shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ||
879
                $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_DATETIME)
880 26
        ) {
881 1
            $objWriter->startElement('a:p');
882
            // Paragraph Style
883 1
            $paragraphs = $shape->getParagraphs();
884 1
            if (!empty($paragraphs)) {
885 1
                $paragraph = &$paragraphs[0];
886 1
                $this->writeParagraphStyles($objWriter, $paragraph, true);
887 1
            }
888 1
            $objWriter->startElement('a:fld');
889 1
            $objWriter->writeAttribute('id', $this->getGUID());
890 1
            $objWriter->writeAttribute('type', (
891 1
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? 'slidenum' : 'datetime'));
892 1
            if (isset($paragraph)) {
893 1
                $elements = $paragraph->getRichTextElements();
894 1
                if (!empty($elements)) {
895 1
                    $element = &$elements[0];
896 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...
897 1
                }
898 1
            }
899 1
            $objWriter->writeElement('a:t', (
900 1
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? '<nr.>' : '03-04-05'));
901 1
            $objWriter->endElement();
902 1
            $objWriter->endElement();
903 1
        } else {
904
            // Write paragraphs
905 26
            $this->writeParagraphs($objWriter, $shape->getParagraphs());
906
        }
907 26
        $objWriter->endElement();
908 26
        $objWriter->endElement();
909 26
    }
910
    /**
911
     * Write table
912
     *
913
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
914
     * @param  \PhpOffice\PhpPresentation\Shape\Table $shape
915
     * @param  int $shapeId
916
     * @throws \Exception
917
     */
918 11
    protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $shapeId)
919
    {
920
        // p:graphicFrame
921 11
        $objWriter->startElement('p:graphicFrame');
922
        // p:graphicFrame/p:nvGraphicFramePr
923 11
        $objWriter->startElement('p:nvGraphicFramePr');
924
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvPr
925 11
        $objWriter->startElement('p:cNvPr');
926 11
        $objWriter->writeAttribute('id', $shapeId);
927 11
        $objWriter->writeAttribute('name', $shape->getName());
928 11
        $objWriter->writeAttribute('descr', $shape->getDescription());
929 11
        $objWriter->endElement();
930
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr
931 11
        $objWriter->startElement('p:cNvGraphicFramePr');
932
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr/a:graphicFrameLocks
933 11
        $objWriter->startElement('a:graphicFrameLocks');
934 11
        $objWriter->writeAttribute('noGrp', '1');
935 11
        $objWriter->endElement();
936
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr/
937 11
        $objWriter->endElement();
938
        // p:graphicFrame/p:nvGraphicFramePr/p:nvPr
939 11
        $objWriter->startElement('p:nvPr');
940 11
        if ($shape->isPlaceholder()) {
941
            $objWriter->startElement('p:ph');
942
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
943
            $objWriter->endElement();
944
        }
945 11
        $objWriter->endElement();
946
        // p:graphicFrame/p:nvGraphicFramePr/
947 11
        $objWriter->endElement();
948
        // p:graphicFrame/p:xfrm
949 11
        $objWriter->startElement('p:xfrm');
950
        // p:graphicFrame/p:xfrm/a:off
951 11
        $objWriter->startElement('a:off');
952 11
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
953 11
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
954 11
        $objWriter->endElement();
955
        // p:graphicFrame/p:xfrm/a:ext
956 11
        $objWriter->startElement('a:ext');
957 11
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
958 11
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
959 11
        $objWriter->endElement();
960
        // p:graphicFrame/p:xfrm/
961 11
        $objWriter->endElement();
962
        // p:graphicFrame/a:graphic
963 11
        $objWriter->startElement('a:graphic');
964
        // p:graphicFrame/a:graphic/a:graphicData
965 11
        $objWriter->startElement('a:graphicData');
966 11
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/table');
967
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl
968 11
        $objWriter->startElement('a:tbl');
969
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblPr
970 11
        $objWriter->startElement('a:tblPr');
971 11
        $objWriter->writeAttribute('firstRow', '1');
972 11
        $objWriter->writeAttribute('bandRow', '1');
973 11
        $objWriter->endElement();
974
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid
975 11
        $objWriter->startElement('a:tblGrid');
976
        // Write cell widths
977 11
        $countCells = count($shape->getRow(0)->getCells());
978 11
        for ($cell = 0; $cell < $countCells; $cell++) {
979
            //  p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid/a:gridCol
980 11
            $objWriter->startElement('a:gridCol');
981
            // Calculate column width
982 11
            $width = $shape->getRow(0)->getCell($cell)->getWidth();
983 11
            if ($width == 0) {
984 11
                $colCount = count($shape->getRow(0)->getCells());
985 11
                $totalWidth = $shape->getWidth();
986 11
                $width = $totalWidth / $colCount;
987 11
            }
988 11
            $objWriter->writeAttribute('w', CommonDrawing::pixelsToEmu($width));
989 11
            $objWriter->endElement();
990 11
        }
991
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid/
992 11
        $objWriter->endElement();
993
        // Colspan / rowspan containers
994 11
        $colSpan = array();
995 11
        $rowSpan = array();
996
        // Default border style
997 11
        $defaultBorder = new Border();
998
        // Write rows
999 11
        $countRows = count($shape->getRows());
1000 11
        for ($row = 0; $row < $countRows; $row++) {
1001
            // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr
1002 11
            $objWriter->startElement('a:tr');
1003 11
            $objWriter->writeAttribute('h', CommonDrawing::pixelsToEmu($shape->getRow($row)->getHeight()));
1004
            // Write cells
1005 11
            $countCells = count($shape->getRow($row)->getCells());
1006 11
            for ($cell = 0; $cell < $countCells; $cell++) {
1007
                // Current cell
1008 11
                $currentCell = $shape->getRow($row)->getCell($cell);
1009
                // Next cell right
1010 11
                $nextCellRight = $shape->getRow($row)->getCell($cell + 1, true);
1011
                // Next cell below
1012 11
                $nextRowBelow = $shape->getRow($row + 1, true);
1013 11
                $nextCellBelow = null;
1014 11
                if ($nextRowBelow != null) {
1015 3
                    $nextCellBelow = $nextRowBelow->getCell($cell, true);
1016 3
                }
1017
                // a:tc
1018 11
                $objWriter->startElement('a:tc');
1019
                // Colspan
1020 11
                if ($currentCell->getColSpan() > 1) {
1021 2
                    $objWriter->writeAttribute('gridSpan', $currentCell->getColSpan());
1022 2
                    $colSpan[$row] = $currentCell->getColSpan() - 1;
1023 11
                } elseif (isset($colSpan[$row]) && $colSpan[$row] > 0) {
1024 2
                    $colSpan[$row]--;
1025 2
                    $objWriter->writeAttribute('hMerge', '1');
1026 2
                }
1027
                // Rowspan
1028 11
                if ($currentCell->getRowSpan() > 1) {
1029 1
                    $objWriter->writeAttribute('rowSpan', $currentCell->getRowSpan());
1030 1
                    $rowSpan[$cell] = $currentCell->getRowSpan() - 1;
1031 11
                } elseif (isset($rowSpan[$cell]) && $rowSpan[$cell] > 0) {
1032 1
                    $rowSpan[$cell]--;
1033 1
                    $objWriter->writeAttribute('vMerge', '1');
1034 1
                }
1035
                // a:txBody
1036 11
                $objWriter->startElement('a:txBody');
1037
                // a:txBody/a:bodyPr
1038 11
                $objWriter->startElement('a:bodyPr');
1039 11
                $objWriter->writeAttribute('wrap', 'square');
1040 11
                $objWriter->writeAttribute('rtlCol', '0');
1041
                // a:txBody/a:bodyPr/a:spAutoFit
1042 11
                $objWriter->writeElement('a:spAutoFit', null);
1043
                // a:txBody/a:bodyPr/
1044 11
                $objWriter->endElement();
1045
                // a:lstStyle
1046 11
                $objWriter->writeElement('a:lstStyle', null);
1047
                // Write paragraphs
1048 11
                $this->writeParagraphs($objWriter, $currentCell->getParagraphs());
1049 11
                $objWriter->endElement();
1050
                // a:tcPr
1051 11
                $objWriter->startElement('a:tcPr');
1052 11
                $firstParagraph = $currentCell->getParagraph(0);
1053 11
                $firstParagraphAlignment = $firstParagraph->getAlignment();
1054
                // Text Direction
1055 11
                $textDirection = $firstParagraphAlignment->getTextDirection();
1056 11
                if ($textDirection != Alignment::TEXT_DIRECTION_HORIZONTAL) {
1057 1
                    $objWriter->writeAttribute('vert', $textDirection);
1058 1
                }
1059
                // Alignment (horizontal)
1060 11
                $verticalAlign = $firstParagraphAlignment->getVertical();
1061 11
                if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
1062 1
                    $objWriter->writeAttribute('anchor', $verticalAlign);
1063 1
                }
1064
                // Margins
1065 11
                $objWriter->writeAttribute('marL', $firstParagraphAlignment->getMarginLeft());
1066 11
                $objWriter->writeAttribute('marR', $firstParagraphAlignment->getMarginRight());
1067 11
                $objWriter->writeAttribute('marT', $firstParagraphAlignment->getMarginTop());
1068 11
                $objWriter->writeAttribute('marB', $firstParagraphAlignment->getMarginBottom());
1069
                // Determine borders
1070 11
                $borderLeft = $currentCell->getBorders()->getLeft();
1071 11
                $borderRight = $currentCell->getBorders()->getRight();
1072 11
                $borderTop = $currentCell->getBorders()->getTop();
1073 11
                $borderBottom = $currentCell->getBorders()->getBottom();
1074 11
                $borderDiagonalDown = $currentCell->getBorders()->getDiagonalDown();
1075 11
                $borderDiagonalUp = $currentCell->getBorders()->getDiagonalUp();
1076
                // Fix PowerPoint implementation
1077 11
                if (!is_null($nextCellRight)
1078 11
                    && $nextCellRight->getBorders()->getRight()->getHashCode() != $defaultBorder->getHashCode()
1079 11
                ) {
1080 1
                    $borderRight = $nextCellRight->getBorders()->getLeft();
1081 1
                }
1082 11
                if (!is_null($nextCellBelow)
1083 11
                    && $nextCellBelow->getBorders()->getBottom()->getHashCode() != $defaultBorder->getHashCode()
1084 11
                ) {
1085 1
                    $borderBottom = $nextCellBelow->getBorders()->getTop();
1086 1
                }
1087
                // Write borders
1088 11
                $this->writeBorder($objWriter, $borderLeft, 'L');
1089 11
                $this->writeBorder($objWriter, $borderRight, 'R');
1090 11
                $this->writeBorder($objWriter, $borderTop, 'T');
1091 11
                $this->writeBorder($objWriter, $borderBottom, 'B');
1092 11
                $this->writeBorder($objWriter, $borderDiagonalDown, 'TlToBr');
1093 11
                $this->writeBorder($objWriter, $borderDiagonalUp, 'BlToTr');
1094
                // Fill
1095 11
                $this->writeFill($objWriter, $currentCell->getFill());
1096 11
                $objWriter->endElement();
1097 11
                $objWriter->endElement();
1098 11
            }
1099 11
            $objWriter->endElement();
1100 11
        }
1101 11
        $objWriter->endElement();
1102 11
        $objWriter->endElement();
1103 11
        $objWriter->endElement();
1104 11
        $objWriter->endElement();
1105 11
    }
1106
    /**
1107
     * Write paragraphs
1108
     *
1109
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1110
     * @param  \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] $paragraphs
1111
     * @throws \Exception
1112
     */
1113 37
    protected function writeParagraphs(XMLWriter $objWriter, $paragraphs)
1114
    {
1115
        // Loop trough paragraphs
1116 37
        foreach ($paragraphs as $paragraph) {
1117
            // a:p
1118 37
            $objWriter->startElement('a:p');
1119
            // a:pPr
1120 37
            $this->writeParagraphStyles($objWriter, $paragraph, false);
1121
            // Loop trough rich text elements
1122 37
            $elements = $paragraph->getRichTextElements();
1123 37
            foreach ($elements as $element) {
1124 32
                if ($element instanceof BreakElement) {
1125
                    // a:br
1126 1
                    $objWriter->writeElement('a:br', null);
1127 32
                } elseif ($element instanceof Run || $element instanceof TextElement) {
1128
                    // a:r
1129 31
                    $objWriter->startElement('a:r');
1130
                    // a:rPr
1131 31
                    if ($element instanceof Run) {
1132 31
                        $this->writeRunStyles($objWriter, $element);
1133 31
                    }
1134
                    // t
1135 31
                    $objWriter->startElement('a:t');
1136 31
                    $objWriter->writeCData(Text::controlCharacterPHP2OOXML($element->getText()));
1137 31
                    $objWriter->endElement();
1138 31
                    $objWriter->endElement();
1139 31
                }
1140 37
            }
1141 37
            $objWriter->endElement();
1142 37
        }
1143 37
    }
1144
    /**
1145
     * Write Paragraph Styles (a:pPr)
1146
     *
1147
     * @param XMLWriter          $objWriter
1148
     * @param RichText\Paragraph $paragraph
1149
     * @param bool               $isPlaceholder
1150
     */
1151 37
    protected function writeParagraphStyles(XMLWriter $objWriter, RichText\Paragraph $paragraph, $isPlaceholder = false)
1152
    {
1153 37
        $objWriter->startElement('a:pPr');
1154 37
        $objWriter->writeAttribute('algn', $paragraph->getAlignment()->getHorizontal());
1155 37
        $objWriter->writeAttribute('fontAlgn', $paragraph->getAlignment()->getVertical());
1156 37
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getMarginLeft()));
1157 37
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getMarginRight()));
1158 37
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getIndent()));
1159 37
        $objWriter->writeAttribute('lvl', $paragraph->getAlignment()->getLevel());
1160 37
        $objWriter->startElement('a:lnSpc');
1161 37
        $objWriter->startElement('a:spcPct');
1162 37
        $objWriter->writeAttribute('val', $paragraph->getLineSpacing() . "%");
1163 37
        $objWriter->endElement();
1164 37
        $objWriter->endElement();
1165 37
        if (!$isPlaceholder) {
1166
            // Bullet type specified?
1167 37
            if ($paragraph->getBulletStyle()->getBulletType() != Bullet::TYPE_NONE) {
1168
                // Color
1169
                // a:buClr must be before a:buFont (else PowerPoint crashes at launch)
1170 2
                if ($paragraph->getBulletStyle()->getBulletColor() instanceof Color) {
1171 2
                    $objWriter->startElement('a:buClr');
1172 2
                    $this->writeColor($objWriter, $paragraph->getBulletStyle()->getBulletColor());
1173 2
                    $objWriter->endElement();
1174 2
                }
1175
                // a:buFont
1176 2
                $objWriter->startElement('a:buFont');
1177 2
                $objWriter->writeAttribute('typeface', $paragraph->getBulletStyle()->getBulletFont());
1178 2
                $objWriter->endElement();
1179 2
                if ($paragraph->getBulletStyle()->getBulletType() == Bullet::TYPE_BULLET) {
1180
                    // a:buChar
1181 1
                    $objWriter->startElement('a:buChar');
1182 1
                    $objWriter->writeAttribute('char', $paragraph->getBulletStyle()->getBulletChar());
1183 1
                    $objWriter->endElement();
1184 2
                } elseif ($paragraph->getBulletStyle()->getBulletType() == Bullet::TYPE_NUMERIC) {
1185
                    // a:buAutoNum
1186 1
                    $objWriter->startElement('a:buAutoNum');
1187 1
                    $objWriter->writeAttribute('type', $paragraph->getBulletStyle()->getBulletNumericStyle());
1188 1
                    if ($paragraph->getBulletStyle()->getBulletNumericStartAt() != 1) {
1189 1
                        $objWriter->writeAttribute('startAt', $paragraph->getBulletStyle()->getBulletNumericStartAt());
1190 1
                    }
1191 1
                    $objWriter->endElement();
1192 1
                }
1193 2
            }
1194 37
        }
1195 37
        $objWriter->endElement();
1196 37
    }
1197
    /**
1198
     * Write RichTextElement Styles (a:pPr)
1199
     *
1200
     * @param XMLWriter   $objWriter
1201
     * @param RichText\Run $element
1202
     */
1203 31
    protected function writeRunStyles(XMLWriter $objWriter, RichText\Run $element)
1204
    {
1205
        // a:rPr
1206 31
        $objWriter->startElement('a:rPr');
1207
        // Lang
1208 31
        $objWriter->writeAttribute('lang', ($element->getLanguage() ? $element->getLanguage() : 'en-US'));
1209 31
        $objWriter->writeAttributeIf($element->getFont()->isBold(), 'b', '1');
1210 31
        $objWriter->writeAttributeIf($element->getFont()->isItalic(), 'i', '1');
1211 31
        $objWriter->writeAttributeIf($element->getFont()->isStrikethrough(), 'strike', 'sngStrike');
1212
        // Size
1213 31
        $objWriter->writeAttribute('sz', ($element->getFont()->getSize() * 100));
1214
        // Character spacing
1215 31
        $objWriter->writeAttribute('spc', $element->getFont()->getCharacterSpacing());
1216
        // Underline
1217 31
        $objWriter->writeAttribute('u', $element->getFont()->getUnderline());
1218
        // Superscript / subscript
1219 31
        $objWriter->writeAttributeIf($element->getFont()->isSuperScript(), 'baseline', '30000');
1220 31
        $objWriter->writeAttributeIf($element->getFont()->isSubScript(), 'baseline', '-25000');
1221
        // Color - a:solidFill
1222 31
        $objWriter->startElement('a:solidFill');
1223 31
        $this->writeColor($objWriter, $element->getFont()->getColor());
1224 31
        $objWriter->endElement();
1225
        // Font - a:latin
1226 31
        $objWriter->startElement('a:latin');
1227 31
        $objWriter->writeAttribute('typeface', $element->getFont()->getName());
1228 31
        $objWriter->endElement();
1229
        // a:hlinkClick
1230 31
        $this->writeHyperlink($objWriter, $element);
1231 31
        $objWriter->endElement();
1232 31
    }
1233
    /**
1234
     * Write Line Shape
1235
     *
1236
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1237
     * @param \PhpOffice\PhpPresentation\Shape\Line $shape
1238
     * @param  int $shapeId
1239
     */
1240 1
    protected function writeShapeLine(XMLWriter $objWriter, Line $shape, $shapeId)
1241
    {
1242
        // p:sp
1243 1
        $objWriter->startElement('p:cxnSp');
1244
        // p:nvSpPr
1245 1
        $objWriter->startElement('p:nvCxnSpPr');
1246
        // p:cNvPr
1247 1
        $objWriter->startElement('p:cNvPr');
1248 1
        $objWriter->writeAttribute('id', $shapeId);
1249 1
        $objWriter->writeAttribute('name', '');
1250 1
        $objWriter->endElement();
1251
        // p:cNvCxnSpPr
1252 1
        $objWriter->writeElement('p:cNvCxnSpPr', null);
1253
        // p:nvPr
1254 1
        $objWriter->startElement('p:nvPr');
1255 1
        if ($shape->isPlaceholder()) {
1256
            $objWriter->startElement('p:ph');
1257
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
1258
            $objWriter->endElement();
1259
        }
1260 1
        $objWriter->endElement();
1261 1
        $objWriter->endElement();
1262
        // p:spPr
1263 1
        $objWriter->startElement('p:spPr');
1264
        // a:xfrm
1265 1
        $objWriter->startElement('a:xfrm');
1266 1
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
1267
            // a:off
1268 1
            $objWriter->startElement('a:off');
1269 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1270 1
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1271 1
            $objWriter->endElement();
1272
            // a:ext
1273 1
            $objWriter->startElement('a:ext');
1274 1
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1275 1
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1276 1
            $objWriter->endElement();
1277 1
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
1278
            // a:off
1279 1
            $objWriter->startElement('a:off');
1280 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
1281 1
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
1282 1
            $objWriter->endElement();
1283
            // a:ext
1284 1
            $objWriter->startElement('a:ext');
1285 1
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
1286 1
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
1287 1
            $objWriter->endElement();
1288 1
        } elseif ($shape->getHeight() < 0) {
1289 1
            $objWriter->writeAttribute('flipV', 1);
1290
            // a:off
1291 1
            $objWriter->startElement('a:off');
1292 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1293 1
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
1294 1
            $objWriter->endElement();
1295
            // a:ext
1296 1
            $objWriter->startElement('a:ext');
1297 1
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1298 1
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
1299 1
            $objWriter->endElement();
1300 1
        } elseif ($shape->getWidth() < 0) {
1301 1
            $objWriter->writeAttribute('flipV', 1);
1302
            // a:off
1303 1
            $objWriter->startElement('a:off');
1304 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
1305 1
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1306 1
            $objWriter->endElement();
1307
            // a:ext
1308 1
            $objWriter->startElement('a:ext');
1309 1
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
1310 1
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1311 1
            $objWriter->endElement();
1312 1
        }
1313 1
        $objWriter->endElement();
1314
        // a:prstGeom
1315 1
        $objWriter->startElement('a:prstGeom');
1316 1
        $objWriter->writeAttribute('prst', 'line');
1317
        // a:prstGeom/a:avLst
1318 1
        $objWriter->writeElement('a:avLst');
1319 1
        $objWriter->endElement();
1320 1
        $this->writeBorder($objWriter, $shape->getBorder(), '');
1321 1
        $objWriter->endElement();
1322 1
        $objWriter->endElement();
1323 1
    }
1324
    /**
1325
     * Write Shadow
1326
     * @param XMLWriter $objWriter
1327
     * @param Shadow $oShadow
1328
     */
1329 27
    protected function writeShadow(XMLWriter $objWriter, $oShadow)
1330
    {
1331 27
        if (!($oShadow instanceof Shadow)) {
1332
            return;
1333
        }
1334 27
        if (!$oShadow->isVisible()) {
1335 25
            return;
1336
        }
1337
        // a:effectLst
1338 3
        $objWriter->startElement('a:effectLst');
1339
        // a:outerShdw
1340 3
        $objWriter->startElement('a:outerShdw');
1341 3
        $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($oShadow->getBlurRadius()));
1342 3
        $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($oShadow->getDistance()));
1343 3
        $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($oShadow->getDirection()));
1344 3
        $objWriter->writeAttribute('algn', $oShadow->getAlignment());
1345 3
        $objWriter->writeAttribute('rotWithShape', '0');
1346 3
        $this->writeColor($objWriter, $oShadow->getColor(), $oShadow->getAlpha());
1347 3
        $objWriter->endElement();
1348 3
        $objWriter->endElement();
1349 3
    }
1350
    /**
1351
     * Write hyperlink
1352
     *
1353
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
1354
     * @param \PhpOffice\PhpPresentation\AbstractShape|\PhpOffice\PhpPresentation\Shape\RichText\TextElement $shape
1355
     */
1356 33
    protected function writeHyperlink(XMLWriter $objWriter, $shape)
1357
    {
1358 33
        if (!$shape->hasHyperlink()) {
1359 28
            return;
1360
        }
1361
        // a:hlinkClick
1362 6
        $objWriter->startElement('a:hlinkClick');
1363 6
        $objWriter->writeAttribute('r:id', $shape->getHyperlink()->relationId);
1364 6
        $objWriter->writeAttribute('tooltip', $shape->getHyperlink()->getTooltip());
1365 6
        if ($shape->getHyperlink()->isInternal()) {
1366 1
            $objWriter->writeAttribute('action', $shape->getHyperlink()->getUrl());
1367 1
        }
1368 6
        $objWriter->endElement();
1369 6
    }
1370
    /**
1371
     * Write Note Slide
1372
     * @param Note $pNote
1373
     * @throws \Exception
1374
     * @return  string
1375
     */
1376 2
    protected function writeNote(Note $pNote)
1377
    {
1378
        // Create XML writer
1379 2
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
1380
        // XML header
1381 2
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
1382
        // p:notes
1383 2
        $objWriter->startElement('p:notes');
1384 2
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
1385 2
        $objWriter->writeAttribute('xmlns:p', 'http://schemas.openxmlformats.org/presentationml/2006/main');
1386 2
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
1387
        // p:notes/p:cSld
1388 2
        $objWriter->startElement('p:cSld');
1389
        // p:notes/p:cSld/p:spTree
1390 2
        $objWriter->startElement('p:spTree');
1391
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr
1392 2
        $objWriter->startElement('p:nvGrpSpPr');
1393
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:cNvPr
1394 2
        $objWriter->startElement('p:cNvPr');
1395 2
        $objWriter->writeAttribute('id', '1');
1396 2
        $objWriter->writeAttribute('name', '');
1397 2
        $objWriter->endElement();
1398
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:cNvGrpSpPr
1399 2
        $objWriter->writeElement('p:cNvGrpSpPr', null);
1400
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:nvPr
1401 2
        $objWriter->writeElement('p:nvPr', null);
1402
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr
1403 2
        $objWriter->endElement();
1404
        // p:notes/p:cSld/p:spTree/p:grpSpPr
1405 2
        $objWriter->startElement('p:grpSpPr');
1406
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm
1407 2
        $objWriter->startElement('a:xfrm');
1408
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:off
1409 2
        $objWriter->startElement('a:off');
1410 2
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
1411 2
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($pNote->getOffsetY()));
1412 2
        $objWriter->endElement(); // a:off
1413
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:ext
1414 2
        $objWriter->startElement('a:ext');
1415 2
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($pNote->getExtentX()));
1416 2
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($pNote->getExtentY()));
1417 2
        $objWriter->endElement(); // a:ext
1418
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:chOff
1419 2
        $objWriter->startElement('a:chOff');
1420 2
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
1421 2
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($pNote->getOffsetY()));
1422 2
        $objWriter->endElement(); // a:chOff
1423
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:chExt
1424 2
        $objWriter->startElement('a:chExt');
1425 2
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($pNote->getExtentX()));
1426 2
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($pNote->getExtentY()));
1427 2
        $objWriter->endElement(); // a:chExt
1428
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm
1429 2
        $objWriter->endElement();
1430
        // p:notes/p:cSld/p:spTree/p:grpSpPr
1431 2
        $objWriter->endElement();
1432
        // p:notes/p:cSld/p:spTree/p:sp[1]
1433 2
        $objWriter->startElement('p:sp');
1434
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr
1435 2
        $objWriter->startElement('p:nvSpPr');
1436
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr
1437 2
        $objWriter->startElement('p:cNvPr');
1438 2
        $objWriter->writeAttribute('id', '2');
1439 2
        $objWriter->writeAttribute('name', 'Slide Image Placeholder 1');
1440 2
        $objWriter->endElement();
1441
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr
1442 2
        $objWriter->startElement('p:cNvSpPr');
1443
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr/a:spLocks
1444 2
        $objWriter->startElement('a:spLocks');
1445 2
        $objWriter->writeAttribute('noGrp', '1');
1446 2
        $objWriter->writeAttribute('noRot', '1');
1447 2
        $objWriter->writeAttribute('noChangeAspect', '1');
1448 2
        $objWriter->endElement();
1449
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr
1450 2
        $objWriter->endElement();
1451
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr
1452 2
        $objWriter->startElement('p:nvPr');
1453
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr/p:ph
1454 2
        $objWriter->startElement('p:ph');
1455 2
        $objWriter->writeAttribute('type', 'sldImg');
1456 2
        $objWriter->endElement();
1457
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr
1458 2
        $objWriter->endElement();
1459
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr
1460 2
        $objWriter->endElement();
1461
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr
1462 2
        $objWriter->startElement('p:spPr');
1463
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm
1464 2
        $objWriter->startElement('a:xfrm');
1465
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm/a:off
1466 2
        $objWriter->startElement('a:off');
1467 2
        $objWriter->writeAttribute('x', 0);
1468 2
        $objWriter->writeAttribute('y', 0);
1469 2
        $objWriter->endElement();
1470
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm/a:ext
1471 2
        $objWriter->startElement('a:ext');
1472 2
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(round($pNote->getExtentX() / 2)));
1473 2
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(round($pNote->getExtentY() / 2)));
1474 2
        $objWriter->endElement();
1475
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm
1476 2
        $objWriter->endElement();
1477
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom
1478 2
        $objWriter->startElement('a:prstGeom');
1479 2
        $objWriter->writeAttribute('prst', 'rect');
1480
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom/a:avLst
1481 2
        $objWriter->writeElement('a:avLst', null);
1482
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom
1483 2
        $objWriter->endElement();
1484
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:noFill
1485 2
        $objWriter->writeElement('a:noFill', null);
1486
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln
1487 2
        $objWriter->startElement('a:ln');
1488 2
        $objWriter->writeAttribute('w', '12700');
1489
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill
1490 2
        $objWriter->startElement('a:solidFill');
1491
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill/a:prstClr
1492 2
        $objWriter->startElement('a:prstClr');
1493 2
        $objWriter->writeAttribute('val', 'black');
1494 2
        $objWriter->endElement();
1495
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill
1496 2
        $objWriter->endElement();
1497
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln
1498 2
        $objWriter->endElement();
1499
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr
1500 2
        $objWriter->endElement();
1501
        // p:notes/p:cSld/p:spTree/p:sp[1]
1502 2
        $objWriter->endElement();
1503
        // p:notes/p:cSld/p:spTree/p:sp[2]
1504 2
        $objWriter->startElement('p:sp');
1505
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr
1506 2
        $objWriter->startElement('p:nvSpPr');
1507
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr
1508 2
        $objWriter->startElement('p:cNvPr');
1509 2
        $objWriter->writeAttribute('id', '3');
1510 2
        $objWriter->writeAttribute('name', 'Notes Placeholder');
1511 2
        $objWriter->endElement();
1512
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr
1513 2
        $objWriter->startElement('p:cNvSpPr');
1514
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr/a:spLocks
1515 2
        $objWriter->startElement('a:spLocks');
1516 2
        $objWriter->writeAttribute('noGrp', '1');
1517 2
        $objWriter->endElement();
1518
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr
1519 2
        $objWriter->endElement();
1520
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr
1521 2
        $objWriter->startElement('p:nvPr');
1522
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr/p:ph
1523 2
        $objWriter->startElement('p:ph');
1524 2
        $objWriter->writeAttribute('type', 'body');
1525 2
        $objWriter->writeAttribute('idx', '1');
1526 2
        $objWriter->endElement();
1527
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr
1528 2
        $objWriter->endElement();
1529
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr
1530 2
        $objWriter->endElement();
1531
        // START notes print below rectangle section
1532
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr
1533 2
        $objWriter->startElement('p:spPr');
1534
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm
1535 2
        $objWriter->startElement('a:xfrm');
1536
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:off
1537 2
        $objWriter->startElement('a:off');
1538 2
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
1539 2
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu(round($pNote->getExtentY() / 2) + $pNote->getOffsetY()));
1540 2
        $objWriter->endElement();
1541
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:ext
1542 2
        $objWriter->startElement('a:ext');
1543 2
        $objWriter->writeAttribute('cx', '5486400');
1544 2
        $objWriter->writeAttribute('cy', '3600450');
1545 2
        $objWriter->endElement();
1546
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm
1547 2
        $objWriter->endElement();
1548
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom
1549 2
        $objWriter->startElement('a:prstGeom');
1550 2
        $objWriter->writeAttribute('prst', 'rect');
1551
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom/a:avLst
1552 2
        $objWriter->writeElement('a:avLst', null);
1553
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom
1554 2
        $objWriter->endElement();
1555
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr
1556 2
        $objWriter->endElement();
1557
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody
1558 2
        $objWriter->startElement('p:txBody');
1559
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr
1560 2
        $objWriter->writeElement('a:bodyPr', null);
1561
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody/a:lstStyle
1562 2
        $objWriter->writeElement('a:lstStyle', null);
1563
        // Loop shapes
1564 2
        $shapes = $pNote->getShapeCollection();
1565 2
        foreach ($shapes as $shape) {
1566
            // Check type
1567 2
            if ($shape instanceof RichText) {
1568 2
                $paragraphs = $shape->getParagraphs();
1569 2
                $this->writeParagraphs($objWriter, $paragraphs);
1570 2
            }
1571 2
        }
1572
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody
1573 2
        $objWriter->endElement();
1574
        // p:notes/p:cSld/p:spTree/p:sp[2]
1575 2
        $objWriter->endElement();
1576
        // p:notes/p:cSld/p:spTree
1577 2
        $objWriter->endElement();
1578
        // p:notes/p:cSld
1579 2
        $objWriter->endElement();
1580
        // p:notes
1581 2
        $objWriter->endElement();
1582
        // Return
1583 2
        return $objWriter->getData();
1584
    }
1585
    /**
1586
     * Write chart
1587
     *
1588
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
1589
     * @param \PhpOffice\PhpPresentation\Shape\Chart $shape
1590
     * @param  int $shapeId
1591
     */
1592 34
    protected function writeShapeChart(XMLWriter $objWriter, ShapeChart $shape, $shapeId)
1593
    {
1594
        // p:graphicFrame
1595 34
        $objWriter->startElement('p:graphicFrame');
1596
        // p:nvGraphicFramePr
1597 34
        $objWriter->startElement('p:nvGraphicFramePr');
1598
        // p:cNvPr
1599 34
        $objWriter->startElement('p:cNvPr');
1600 34
        $objWriter->writeAttribute('id', $shapeId);
1601 34
        $objWriter->writeAttribute('name', $shape->getName());
1602 34
        $objWriter->writeAttribute('descr', $shape->getDescription());
1603 34
        $objWriter->endElement();
1604
        // p:cNvGraphicFramePr
1605 34
        $objWriter->writeElement('p:cNvGraphicFramePr', null);
1606
        // p:nvPr
1607 34
        $objWriter->startElement('p:nvPr');
1608 34
        if ($shape->isPlaceholder()) {
1609
            $objWriter->startElement('p:ph');
1610
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
1611
            $objWriter->endElement();
1612
        }
1613 34
        $objWriter->endElement();
1614 34
        $objWriter->endElement();
1615
        // p:xfrm
1616 34
        $objWriter->startElement('p:xfrm');
1617 34
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
1618
        // a:off
1619 34
        $objWriter->startElement('a:off');
1620 34
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1621 34
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1622 34
        $objWriter->endElement();
1623
        // a:ext
1624 34
        $objWriter->startElement('a:ext');
1625 34
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1626 34
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1627 34
        $objWriter->endElement();
1628 34
        $objWriter->endElement();
1629
        // a:graphic
1630 34
        $objWriter->startElement('a:graphic');
1631
        // a:graphicData
1632 34
        $objWriter->startElement('a:graphicData');
1633 34
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
1634
        // c:chart
1635 34
        $objWriter->startElement('c:chart');
1636 34
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
1637 34
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
1638 34
        $objWriter->writeAttribute('r:id', $shape->relationId);
1639 34
        $objWriter->endElement();
1640 34
        $objWriter->endElement();
1641 34
        $objWriter->endElement();
1642 34
        $objWriter->endElement();
1643 34
    }
1644
    /**
1645
     * Write pic
1646
     *
1647
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1648
     * @param  \PhpOffice\PhpPresentation\Shape\AbstractGraphic $shape
1649
     * @param  int $shapeId
1650
     * @throws \Exception
1651
     */
1652 10
    protected function writeShapePic(XMLWriter $objWriter, AbstractGraphic $shape, $shapeId)
1653
    {
1654
        // p:pic
1655 10
        $objWriter->startElement('p:pic');
1656
        // p:nvPicPr
1657 10
        $objWriter->startElement('p:nvPicPr');
1658
        // p:cNvPr
1659 10
        $objWriter->startElement('p:cNvPr');
1660 10
        $objWriter->writeAttribute('id', $shapeId);
1661 10
        $objWriter->writeAttribute('name', $shape->getName());
1662 10
        $objWriter->writeAttribute('descr', $shape->getDescription());
1663
        // a:hlinkClick
1664 10
        if ($shape->hasHyperlink()) {
1665 2
            $this->writeHyperlink($objWriter, $shape);
1666 2
        }
1667 10
        $objWriter->endElement();
1668
        // p:cNvPicPr
1669 10
        $objWriter->startElement('p:cNvPicPr');
1670
        // a:picLocks
1671 10
        $objWriter->startElement('a:picLocks');
1672 10
        $objWriter->writeAttribute('noChangeAspect', '1');
1673 10
        $objWriter->endElement();
1674 10
        $objWriter->endElement();
1675
        // p:nvPr
1676 10
        $objWriter->startElement('p:nvPr');
1677
        /**
1678
         * @link : https://github.com/stefslon/exportToPPTX/blob/master/exportToPPTX.m#L2128
1679
         */
1680 10
        if ($shape instanceof Media) {
1681
            // p:nvPr > a:videoFile
1682 1
            $objWriter->startElement('a:videoFile');
1683 1
            $objWriter->writeAttribute('r:link', $shape->relationId);
1684 1
            $objWriter->endElement();
1685
            // p:nvPr > p:extLst
1686 1
            $objWriter->startElement('p:extLst');
1687
            // p:nvPr > p:extLst > p:ext
1688 1
            $objWriter->startElement('p:ext');
1689 1
            $objWriter->writeAttribute('uri', '{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}');
1690
            // p:nvPr > p:extLst > p:ext > p14:media
1691 1
            $objWriter->startElement('p14:media');
1692 1
            $objWriter->writeAttribute('r:embed', $shape->relationId);
1693 1
            $objWriter->writeAttribute('xmlns:p14', 'http://schemas.microsoft.com/office/powerpoint/2010/main');
1694
            // p:nvPr > p:extLst > p:ext > ##p14:media
1695 1
            $objWriter->endElement();
1696
            // p:nvPr > p:extLst > ##p:ext
1697 1
            $objWriter->endElement();
1698
            // p:nvPr > ##p:extLst
1699 1
            $objWriter->endElement();
1700 1
        }
1701
        // ##p:nvPr
1702 10
        $objWriter->endElement();
1703 10
        $objWriter->endElement();
1704
        // p:blipFill
1705 10
        $objWriter->startElement('p:blipFill');
1706
        // a:blip
1707 10
        $objWriter->startElement('a:blip');
1708 10
        $objWriter->writeAttribute('r:embed', $shape->relationId);
1709 10
        $objWriter->endElement();
1710
        // a:stretch
1711 10
        $objWriter->startElement('a:stretch');
1712 10
        $objWriter->writeElement('a:fillRect', null);
1713 10
        $objWriter->endElement();
1714 10
        $objWriter->endElement();
1715
        // p:spPr
1716 10
        $objWriter->startElement('p:spPr');
1717
        // a:xfrm
1718 10
        $objWriter->startElement('a:xfrm');
1719 10
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
1720
        // a:off
1721 10
        $objWriter->startElement('a:off');
1722 10
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1723 10
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1724 10
        $objWriter->endElement();
1725
        // a:ext
1726 10
        $objWriter->startElement('a:ext');
1727 10
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1728 10
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1729 10
        $objWriter->endElement();
1730 10
        $objWriter->endElement();
1731
        // a:prstGeom
1732 10
        $objWriter->startElement('a:prstGeom');
1733 10
        $objWriter->writeAttribute('prst', 'rect');
1734
        // a:avLst
1735 10
        $objWriter->writeElement('a:avLst', null);
1736 10
        $objWriter->endElement();
1737 10
        if ($shape->getBorder()->getLineStyle() != Border::LINE_NONE) {
1738 1
            $this->writeBorder($objWriter, $shape->getBorder(), '');
1739 1
        }
1740 10
        if ($shape->getShadow()->isVisible()) {
1741 2
            $this->writeShadow($objWriter, $shape->getShadow());
1742 2
        }
1743 10
        $objWriter->endElement();
1744 10
        $objWriter->endElement();
1745 10
    }
1746
    /**
1747
     * Write group
1748
     *
1749
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
1750
     * @param \PhpOffice\PhpPresentation\Shape\Group $group
1751
     * @param  int $shapeId
1752
     */
1753 1
    protected function writeShapeGroup(XMLWriter $objWriter, Group $group, &$shapeId)
1754
    {
1755
        // p:grpSp
1756 1
        $objWriter->startElement('p:grpSp');
1757
        // p:nvGrpSpPr
1758 1
        $objWriter->startElement('p:nvGrpSpPr');
1759
        // p:cNvPr
1760 1
        $objWriter->startElement('p:cNvPr');
1761 1
        $objWriter->writeAttribute('name', 'Group ' . $shapeId++);
1762 1
        $objWriter->writeAttribute('id', $shapeId);
1763 1
        $objWriter->endElement(); // p:cNvPr
1764
        // NOTE: Re: $shapeId This seems to be how PowerPoint 2010 does business.
1765
        // p:cNvGrpSpPr
1766 1
        $objWriter->writeElement('p:cNvGrpSpPr', null);
1767
        // p:nvPr
1768 1
        $objWriter->writeElement('p:nvPr', null);
1769 1
        $objWriter->endElement(); // p:nvGrpSpPr
1770
        // p:grpSpPr
1771 1
        $objWriter->startElement('p:grpSpPr');
1772
        // a:xfrm
1773 1
        $objWriter->startElement('a:xfrm');
1774
        // a:off
1775 1
        $objWriter->startElement('a:off');
1776 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($group->getOffsetX()));
1777 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($group->getOffsetY()));
1778 1
        $objWriter->endElement(); // a:off
1779
        // a:ext
1780 1
        $objWriter->startElement('a:ext');
1781 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($group->getExtentX()));
1782 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($group->getExtentY()));
1783 1
        $objWriter->endElement(); // a:ext
1784
        // a:chOff
1785 1
        $objWriter->startElement('a:chOff');
1786 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($group->getOffsetX()));
1787 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($group->getOffsetY()));
1788 1
        $objWriter->endElement(); // a:chOff
1789
        // a:chExt
1790 1
        $objWriter->startElement('a:chExt');
1791 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($group->getExtentX()));
1792 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($group->getExtentY()));
1793 1
        $objWriter->endElement(); // a:chExt
1794 1
        $objWriter->endElement(); // a:xfrm
1795 1
        $objWriter->endElement(); // p:grpSpPr
1796 1
        $this->writeShapeCollection($objWriter, $group->getShapeCollection(), $shapeId);
1797 1
        $objWriter->endElement(); // p:grpSp
1798 1
    }
1799
    /**
1800
     * @param \PhpOffice\PhpPresentation\Slide\AbstractSlide $pSlide
1801
     * @param $objWriter
1802
     */
1803 113
    protected function writeSlideBackground(AbstractSlideAlias $pSlide, XMLWriter $objWriter)
1804
    {
1805 113
        if (!($pSlide->getBackground() instanceof Slide\AbstractBackground)) {
1806 113
            return;
1807
        }
1808 113
        $oBackground = $pSlide->getBackground();
1809
        // p:bg
1810 113
        $objWriter->startElement('p:bg');
1811 113
        if ($oBackground instanceof Slide\Background\Color) {
1812
            // p:bgPr
1813 113
            $objWriter->startElement('p:bgPr');
1814
            // a:solidFill
1815 113
            $objWriter->startElement('a:solidFill');
1816
            // a:srgbClr
1817 113
            $objWriter->startElement('a:srgbClr');
1818 113
            $objWriter->writeAttribute('val', $oBackground->getColor()->getRGB());
1819 113
            $objWriter->endElement();
1820
            // > a:solidFill
1821 113
            $objWriter->endElement();
1822
            // p:bgPr/a:effectLst
1823 113
            $objWriter->writeElement('a:effectLst');
1824
            // > p:bgPr
1825 113
            $objWriter->endElement();
1826 113
        }
1827 113
        if ($oBackground instanceof Slide\Background\Image) {
1828
            // p:bgPr
1829
            $objWriter->startElement('p:bgPr');
1830
            // a:blipFill
1831
            $objWriter->startElement('a:blipFill');
1832
            // a:blip
1833
            $objWriter->startElement('a:blip');
1834
            $objWriter->writeAttribute('r:embed', $oBackground->relationId);
1835
            // > a:blipFill
1836
            $objWriter->endElement();
1837
            // a:stretch
1838
            $objWriter->startElement('a:stretch');
1839
            // a:fillRect
1840
            $objWriter->writeElement('a:fillRect');
1841
            // > a:stretch
1842
            $objWriter->endElement();
1843
            // > a:blipFill
1844
            $objWriter->endElement();
1845
            // > p:bgPr
1846
            $objWriter->endElement();
1847
        }
1848
        /**
1849
         * @link : http://www.officeopenxml.com/prSlide-background.php
1850
         */
1851 113
        if ($oBackground instanceof Slide\Background\SchemeColor) {
1852
            // p:bgRef
1853
            $objWriter->startElement('p:bgRef');
1854
            $objWriter->writeAttribute('idx', '1001');
1855
            // a:schemeClr
1856
            $objWriter->startElement('a:schemeClr');
1857
            $objWriter->writeAttribute('val', $oBackground->getSchemeColor()->getValue());
1858
            $objWriter->endElement();
1859
            // > p:bgRef
1860
            $objWriter->endElement();
1861
        }
1862
        // > p:bg
1863 113
        $objWriter->endElement();
1864 113
    }
1865
    /**
1866
     * Write Transition Slide
1867
     * @link http://officeopenxml.com/prSlide-transitions.php
1868
     * @param XMLWriter $objWriter
1869
     * @param Slide\Transition $transition
1870
     */
1871 113
    protected function writeSlideTransition(XMLWriter $objWriter, $transition)
1872
    {
1873 113
        if (!$transition instanceof Slide\Transition) {
1874 113
            return;
1875
        }
1876 2
        $objWriter->startElement('p:transition');
1877 2
        if (!is_null($transition->getSpeed())) {
1878 1
            $objWriter->writeAttribute('spd', $transition->getSpeed());
1879 1
        }
1880 2
        $objWriter->writeAttribute('advClick', $transition->hasManualTrigger() ? '1' : '0');
1881 2
        if ($transition->hasTimeTrigger()) {
1882 2
            $objWriter->writeAttribute('advTm', $transition->getAdvanceTimeTrigger());
1883 2
        }
1884 2
        switch ($transition->getTransitionType()) {
1885 2
            case Slide\Transition::TRANSITION_BLINDS_HORIZONTAL:
1886 1
                $objWriter->startElement('p:blinds');
1887 1
                $objWriter->writeAttribute('dir', 'horz');
1888 1
                $objWriter->endElement();
1889 1
                break;
1890 2
            case Slide\Transition::TRANSITION_BLINDS_VERTICAL:
1891 1
                $objWriter->startElement('p:blinds');
1892 1
                $objWriter->writeAttribute('dir', 'vert');
1893 1
                $objWriter->endElement();
1894 1
                break;
1895 2
            case Slide\Transition::TRANSITION_CHECKER_HORIZONTAL:
1896 1
                $objWriter->startElement('p:checker');
1897 1
                $objWriter->writeAttribute('dir', 'horz');
1898 1
                $objWriter->endElement();
1899 1
                break;
1900 2
            case Slide\Transition::TRANSITION_CHECKER_VERTICAL:
1901 1
                $objWriter->startElement('p:checker');
1902 1
                $objWriter->writeAttribute('dir', 'vert');
1903 1
                $objWriter->endElement();
1904 1
                break;
1905 2
            case Slide\Transition::TRANSITION_CIRCLE_HORIZONTAL:
1906 1
                $objWriter->startElement('p:circle');
1907 1
                $objWriter->writeAttribute('dir', 'horz');
1908 1
                $objWriter->endElement();
1909 1
                break;
1910 2
            case Slide\Transition::TRANSITION_CIRCLE_VERTICAL:
1911 1
                $objWriter->startElement('p:circle');
1912 1
                $objWriter->writeAttribute('dir', 'vert');
1913 1
                $objWriter->endElement();
1914 1
                break;
1915 2
            case Slide\Transition::TRANSITION_COMB_HORIZONTAL:
1916 1
                $objWriter->startElement('p:comb');
1917 1
                $objWriter->writeAttribute('dir', 'horz');
1918 1
                $objWriter->endElement();
1919 1
                break;
1920 2
            case Slide\Transition::TRANSITION_COMB_VERTICAL:
1921 1
                $objWriter->startElement('p:comb');
1922 1
                $objWriter->writeAttribute('dir', 'vert');
1923 1
                $objWriter->endElement();
1924 1
                break;
1925 2
            case Slide\Transition::TRANSITION_COVER_DOWN:
1926 1
                $objWriter->startElement('p:cover');
1927 1
                $objWriter->writeAttribute('dir', 'd');
1928 1
                $objWriter->endElement();
1929 1
                break;
1930 2
            case Slide\Transition::TRANSITION_COVER_LEFT:
1931 1
                $objWriter->startElement('p:cover');
1932 1
                $objWriter->writeAttribute('dir', 'l');
1933 1
                $objWriter->endElement();
1934 1
                break;
1935 2
            case Slide\Transition::TRANSITION_COVER_LEFT_DOWN:
1936 1
                $objWriter->startElement('p:cover');
1937 1
                $objWriter->writeAttribute('dir', 'ld');
1938 1
                $objWriter->endElement();
1939 1
                break;
1940 2
            case Slide\Transition::TRANSITION_COVER_LEFT_UP:
1941 1
                $objWriter->startElement('p:cover');
1942 1
                $objWriter->writeAttribute('dir', 'lu');
1943 1
                $objWriter->endElement();
1944 1
                break;
1945 2
            case Slide\Transition::TRANSITION_COVER_RIGHT:
1946 1
                $objWriter->startElement('p:cover');
1947 1
                $objWriter->writeAttribute('dir', 'r');
1948 1
                $objWriter->endElement();
1949 1
                break;
1950 2
            case Slide\Transition::TRANSITION_COVER_RIGHT_DOWN:
1951 1
                $objWriter->startElement('p:cover');
1952 1
                $objWriter->writeAttribute('dir', 'rd');
1953 1
                $objWriter->endElement();
1954 1
                break;
1955 2
            case Slide\Transition::TRANSITION_COVER_RIGHT_UP:
1956 1
                $objWriter->startElement('p:cover');
1957 1
                $objWriter->writeAttribute('dir', 'ru');
1958 1
                $objWriter->endElement();
1959 1
                break;
1960 2
            case Slide\Transition::TRANSITION_COVER_UP:
1961 1
                $objWriter->startElement('p:cover');
1962 1
                $objWriter->writeAttribute('dir', 'u');
1963 1
                $objWriter->endElement();
1964 1
                break;
1965 2
            case Slide\Transition::TRANSITION_CUT:
1966 1
                $objWriter->writeElement('p:cut');
1967 1
                break;
1968 2
            case Slide\Transition::TRANSITION_DIAMOND:
1969 1
                $objWriter->writeElement('p:diamond');
1970 1
                break;
1971 2
            case Slide\Transition::TRANSITION_DISSOLVE:
1972 1
                $objWriter->writeElement('p:dissolve');
1973 1
                break;
1974 2
            case Slide\Transition::TRANSITION_FADE:
1975 1
                $objWriter->writeElement('p:fade');
1976 1
                break;
1977 2
            case Slide\Transition::TRANSITION_NEWSFLASH:
1978 1
                $objWriter->writeElement('p:newsflash');
1979 1
                break;
1980 2
            case Slide\Transition::TRANSITION_PLUS:
1981 1
                $objWriter->writeElement('p:plus');
1982 1
                break;
1983 2
            case Slide\Transition::TRANSITION_PULL_DOWN:
1984 1
                $objWriter->startElement('p:pull');
1985 1
                $objWriter->writeAttribute('dir', 'd');
1986 1
                $objWriter->endElement();
1987 1
                break;
1988 2
            case Slide\Transition::TRANSITION_PULL_LEFT:
1989 1
                $objWriter->startElement('p:pull');
1990 1
                $objWriter->writeAttribute('dir', 'l');
1991 1
                $objWriter->endElement();
1992 1
                break;
1993 2
            case Slide\Transition::TRANSITION_PULL_RIGHT:
1994 1
                $objWriter->startElement('p:pull');
1995 1
                $objWriter->writeAttribute('dir', 'r');
1996 1
                $objWriter->endElement();
1997 1
                break;
1998 2
            case Slide\Transition::TRANSITION_PULL_UP:
1999 1
                $objWriter->startElement('p:pull');
2000 1
                $objWriter->writeAttribute('dir', 'u');
2001 1
                $objWriter->endElement();
2002 1
                break;
2003 2
            case Slide\Transition::TRANSITION_PUSH_DOWN:
2004 1
                $objWriter->startElement('p:push');
2005 1
                $objWriter->writeAttribute('dir', 'd');
2006 1
                $objWriter->endElement();
2007 1
                break;
2008 2
            case Slide\Transition::TRANSITION_PUSH_LEFT:
2009 1
                $objWriter->startElement('p:push');
2010 1
                $objWriter->writeAttribute('dir', 'l');
2011 1
                $objWriter->endElement();
2012 1
                break;
2013 2
            case Slide\Transition::TRANSITION_PUSH_RIGHT:
2014 1
                $objWriter->startElement('p:push');
2015 1
                $objWriter->writeAttribute('dir', 'r');
2016 1
                $objWriter->endElement();
2017 1
                break;
2018 2
            case Slide\Transition::TRANSITION_PUSH_UP:
2019 1
                $objWriter->startElement('p:push');
2020 1
                $objWriter->writeAttribute('dir', 'u');
2021 1
                $objWriter->endElement();
2022 1
                break;
2023 2
            case Slide\Transition::TRANSITION_RANDOM:
2024 1
                $objWriter->writeElement('p:random');
2025 1
                break;
2026 2
            case Slide\Transition::TRANSITION_RANDOMBAR_HORIZONTAL:
2027 1
                $objWriter->startElement('p:randomBar');
2028 1
                $objWriter->writeAttribute('dir', 'horz');
2029 1
                $objWriter->endElement();
2030 1
                break;
2031 2
            case Slide\Transition::TRANSITION_RANDOMBAR_VERTICAL:
2032 1
                $objWriter->startElement('p:randomBar');
2033 1
                $objWriter->writeAttribute('dir', 'vert');
2034 1
                $objWriter->endElement();
2035 1
                break;
2036 2
            case Slide\Transition::TRANSITION_SPLIT_IN_HORIZONTAL:
2037 1
                $objWriter->startElement('p:split');
2038 1
                $objWriter->writeAttribute('dir', 'in');
2039 1
                $objWriter->writeAttribute('orient', 'horz');
2040 1
                $objWriter->endElement();
2041 1
                break;
2042 2
            case Slide\Transition::TRANSITION_SPLIT_OUT_HORIZONTAL:
2043 1
                $objWriter->startElement('p:split');
2044 1
                $objWriter->writeAttribute('dir', 'out');
2045 1
                $objWriter->writeAttribute('orient', 'horz');
2046 1
                $objWriter->endElement();
2047 1
                break;
2048 2
            case Slide\Transition::TRANSITION_SPLIT_IN_VERTICAL:
2049 2
                $objWriter->startElement('p:split');
2050 2
                $objWriter->writeAttribute('dir', 'in');
2051 2
                $objWriter->writeAttribute('orient', 'vert');
2052 2
                $objWriter->endElement();
2053 2
                break;
2054 1
            case Slide\Transition::TRANSITION_SPLIT_OUT_VERTICAL:
2055 1
                $objWriter->startElement('p:split');
2056 1
                $objWriter->writeAttribute('dir', 'out');
2057 1
                $objWriter->writeAttribute('orient', 'vert');
2058 1
                $objWriter->endElement();
2059 1
                break;
2060 1
            case Slide\Transition::TRANSITION_STRIPS_LEFT_DOWN:
2061 1
                $objWriter->startElement('p:strips');
2062 1
                $objWriter->writeAttribute('dir', 'ld');
2063 1
                $objWriter->endElement();
2064 1
                break;
2065 1
            case Slide\Transition::TRANSITION_STRIPS_LEFT_UP:
2066 1
                $objWriter->startElement('p:strips');
2067 1
                $objWriter->writeAttribute('dir', 'lu');
2068 1
                $objWriter->endElement();
2069 1
                break;
2070 1
            case Slide\Transition::TRANSITION_STRIPS_RIGHT_DOWN:
2071 1
                $objWriter->startElement('p:strips');
2072 1
                $objWriter->writeAttribute('dir', 'rd');
2073 1
                $objWriter->endElement();
2074 1
                break;
2075 1
            case Slide\Transition::TRANSITION_STRIPS_RIGHT_UP:
2076 1
                $objWriter->startElement('p:strips');
2077 1
                $objWriter->writeAttribute('dir', 'ru');
2078 1
                $objWriter->endElement();
2079 1
                break;
2080 1
            case Slide\Transition::TRANSITION_WEDGE:
2081 1
                $objWriter->writeElement('p:wedge');
2082 1
                break;
2083 1
            case Slide\Transition::TRANSITION_WIPE_DOWN:
2084 1
                $objWriter->startElement('p:wipe');
2085 1
                $objWriter->writeAttribute('dir', 'd');
2086 1
                $objWriter->endElement();
2087 1
                break;
2088 1
            case Slide\Transition::TRANSITION_WIPE_LEFT:
2089 1
                $objWriter->startElement('p:wipe');
2090 1
                $objWriter->writeAttribute('dir', 'l');
2091 1
                $objWriter->endElement();
2092 1
                break;
2093 1
            case Slide\Transition::TRANSITION_WIPE_RIGHT:
2094 1
                $objWriter->startElement('p:wipe');
2095 1
                $objWriter->writeAttribute('dir', 'r');
2096 1
                $objWriter->endElement();
2097 1
                break;
2098 1
            case Slide\Transition::TRANSITION_WIPE_UP:
2099 1
                $objWriter->startElement('p:wipe');
2100 1
                $objWriter->writeAttribute('dir', 'u');
2101 1
                $objWriter->endElement();
2102 1
                break;
2103 1
            case Slide\Transition::TRANSITION_ZOOM_IN:
2104 1
                $objWriter->startElement('p:zoom');
2105 1
                $objWriter->writeAttribute('dir', 'in');
2106 1
                $objWriter->endElement();
2107 1
                break;
2108 1
            case Slide\Transition::TRANSITION_ZOOM_OUT:
2109 1
                $objWriter->startElement('p:zoom');
2110 1
                $objWriter->writeAttribute('dir', 'out');
2111 1
                $objWriter->endElement();
2112 1
                break;
2113 2
        }
2114 2
        $objWriter->endElement();
2115 2
    }
2116 1
    private function getGUID()
2117
    {
2118 1
        if (function_exists('com_create_guid')) {
2119
            return com_create_guid();
2120
        } else {
2121 1
            mt_srand((double)microtime() * 10000);//optional for php 4.2.0 and up.
2122 1
            $charid = strtoupper(md5(uniqid(rand(), true)));
2123 1
            $hyphen = chr(45);// "-"
2124 1
            $uuid = chr(123)// "{"
2125 1
                . substr($charid, 0, 8) . $hyphen
2126 1
                . substr($charid, 8, 4) . $hyphen
2127 1
                . substr($charid, 12, 4) . $hyphen
2128 1
                . substr($charid, 16, 4) . $hyphen
2129 1
                . substr($charid, 20, 12)
2130 1
                . chr(125);// "}"
2131 1
            return $uuid;
2132
        }
2133
    }
2134
}
2135