Completed
Pull Request — develop (#435)
by
unknown
07:41 queued 01:57
created

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