Completed
Pull Request — develop (#435)
by
unknown
06:51
created

AbstractSlide::writeHyperlink()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 3

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 14
ccs 10
cts 10
cp 1
rs 9.4285
cc 3
eloc 9
nc 3
nop 2
crap 3
1
<?php
2
/**
3
 * This file is part of PHPPresentation - A pure PHP library for reading and writing
4
 * presentations documents.
5
 *
6
 * PHPPresentation is free software distributed under the terms of the GNU Lesser
7
 * General Public License version 3 as published by the Free Software Foundation.
8
 *
9
 * For the full copyright and license information, please read the LICENSE
10
 * file that was distributed with this source code. For the full list of
11
 * contributors, visit https://github.com/PHPOffice/PHPPresentation/contributors.
12
 *
13
 * @link        https://github.com/PHPOffice/PHPPresentation
14
 * @copyright   2009-2015 PHPPresentation contributors
15
 * @license     http://www.gnu.org/licenses/lgpl.txt LGPL version 3
16
 */
17
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
18
use PhpOffice\Common\Drawing as CommonDrawing;
19
use PhpOffice\Common\Text;
20
use PhpOffice\Common\XMLWriter;
21
use PhpOffice\PhpPresentation\Shape\AbstractGraphic;
22
use PhpOffice\PhpPresentation\Shape\Chart as ShapeChart;
23
use PhpOffice\PhpPresentation\Shape\Comment;
24
use PhpOffice\PhpPresentation\Shape\Drawing\Gd as ShapeDrawingGd;
25
use PhpOffice\PhpPresentation\Shape\Drawing\File as ShapeDrawingFile;
26
use PhpOffice\PhpPresentation\Shape\Group;
27
use PhpOffice\PhpPresentation\Shape\Line;
28
use PhpOffice\PhpPresentation\Shape\Rectangle;
29
use PhpOffice\PhpPresentation\Shape\RoundRectangle;
30
use PhpOffice\PhpPresentation\Shape\Triangle;
31
use PhpOffice\PhpPresentation\Shape\ArrowPointer;
32
use PhpOffice\PhpPresentation\Shape\Ellipse;
33
use PhpOffice\PhpPresentation\Shape\Media;
34
use PhpOffice\PhpPresentation\Shape\Placeholder;
35
use PhpOffice\PhpPresentation\Shape\RichText;
36
use PhpOffice\PhpPresentation\Shape\RichText\BreakElement;
37
use PhpOffice\PhpPresentation\Shape\RichText\Run;
38
use PhpOffice\PhpPresentation\Shape\RichText\TextElement;
39
use PhpOffice\PhpPresentation\Shape\Table as ShapeTable;
40
use PhpOffice\PhpPresentation\Slide;
41
use PhpOffice\PhpPresentation\Slide\Note;
42
use PhpOffice\PhpPresentation\Style\Alignment;
43
use PhpOffice\PhpPresentation\Style\Bullet;
44
use PhpOffice\PhpPresentation\Style\Border;
45
use PhpOffice\PhpPresentation\Style\Color;
46
use PhpOffice\PhpPresentation\Style\Shadow;
47
use PhpOffice\PhpPresentation\Slide\AbstractSlide as AbstractSlideAlias;
48
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...
49
{
50
    /**
51
     * @param AbstractSlideAlias $pSlideMaster
52
     * @param $objWriter
53
     * @param $relId
54
     * @throws \Exception
55
     */
56 114
    protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, $objWriter, $relId)
57
    {
58 114
        if ($pSlideMaster->getShapeCollection()->count() > 0) {
59
            // Loop trough images and write relationships
60 2
            $iterator = $pSlideMaster->getShapeCollection()->getIterator();
61 2
            while ($iterator->valid()) {
62 2
                if ($iterator->current() instanceof ShapeDrawingFile || $iterator->current() instanceof ShapeDrawingGd) {
63
                    // Write relationship for image drawing
64 1
                    $this->writeRelationship(
65 1
                        $objWriter,
66 1
                        $relId,
67 1
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
68 1
                        '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename())
69
                    );
70 1
                    $iterator->current()->relationId = 'rId' . $relId;
71 1
                    ++$relId;
72 1
                } elseif ($iterator->current() instanceof ShapeChart) {
73
                    // Write relationship for chart drawing
74
                    $this->writeRelationship(
75
                        $objWriter,
76
                        $relId,
77
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
78
                        '../charts/' . $iterator->current()->getIndexedFilename()
79
                    );
80
                    $iterator->current()->relationId = 'rId' . $relId;
81
                    ++$relId;
82 1
                } elseif ($iterator->current() instanceof Group) {
83
                    $iterator2 = $iterator->current()->getShapeCollection()->getIterator();
84
                    while ($iterator2->valid()) {
85
                        if ($iterator2->current() instanceof ShapeDrawingFile ||
86
                            $iterator2->current() instanceof ShapeDrawingGd
87
                        ) {
88
                            // Write relationship for image drawing
89
                            $this->writeRelationship(
90
                                $objWriter,
91
                                $relId,
92
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
93
                                '../media/' . str_replace(' ', '_', $iterator2->current()->getIndexedFilename())
94
                            );
95
                            $iterator2->current()->relationId = 'rId' . $relId;
96
                            ++$relId;
97
                        } elseif ($iterator2->current() instanceof ShapeChart) {
98
                            // Write relationship for chart drawing
99
                            $this->writeRelationship(
100
                                $objWriter,
101
                                $relId,
102
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
103
                                '../charts/' . $iterator2->current()->getIndexedFilename()
104
                            );
105
                            $iterator2->current()->relationId = 'rId' . $relId;
106
                            ++$relId;
107
                        }
108
                        $iterator2->next();
109
                    }
110
                }
111 2
                $iterator->next();
112
            }
113
        }
114 114
    }
115
    /**
116
     * @param XMLWriter $objWriter
117
     * @param \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] $shapes
118
     * @param int $shapeId
119
     * @throws \Exception
120
     */
121 113
    protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), &$shapeId = 0)
122
    {
123 113
        if (count($shapes) == 0) {
124 113
            return;
125
        }
126 86
        foreach ($shapes as $shape) {
127
            // Increment $shapeId
128 86
            ++$shapeId;
129
            // Check type
130 86
            if ($shape instanceof RichText) {
131 26
                $this->writeShapeText($objWriter, $shape, $shapeId);
132
            }
133 61
            elseif ($shape instanceof Ellipse) {
134
                $this->writeShapeEllipse($objWriter, $shape, $shapeId);
135
            }
136 61
            elseif ($shape instanceof ShapeTable) {
137 11
                $this->writeShapeTable($objWriter, $shape, $shapeId);
138 51
            } elseif ($shape instanceof Line) {
139 1
                $this->writeShapeLine($objWriter, $shape, $shapeId);
140 50
            } elseif ($shape instanceof ShapeChart) {
141 34
                $this->writeShapeChart($objWriter, $shape, $shapeId);
142 17
            } elseif ($shape instanceof AbstractGraphic) {
143 10
                $this->writeShapePic($objWriter, $shape, $shapeId);
144 8
            } elseif ($shape instanceof Group) {
145 1
                $this->writeShapeGroup($objWriter, $shape, $shapeId);
146
            }
147 8
            elseif ($shape instanceof RoundRectangle) {
148
                $this->writeShapeRoundRect($objWriter, $shape, $shapeId);
149
            }
150 8
            elseif ($shape instanceof Triangle) {
151
                $this->writeShapeTriangle($objWriter, $shape, $shapeId);
152
            }
153 8
            elseif ($shape instanceof Rectangle) {
154
                $this->writeShapeRectangle($objWriter, $shape, $shapeId);
155
            }
156 8
            elseif ($shape instanceof ArrowPointer) {
157
                $this->writeShapeArrowPointer($objWriter, $shape, $shapeId);
158
            }
159 8
            elseif ($shape instanceof Comment) {
160
            } else {
161 86
                throw new \Exception("Unknown Shape type: {get_class($shape)}");
162
            }
163
        }
164 86
    }
165
166
    /**
167
     * Writing a Triangle shape to help develop more dynamic and useful slides with php presentation.
168
     *
169
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
170
     * @param  \PhpOffice\PhpPresentation\Shape\Triangle $shape
171
     * @param  int $shapeId
172
     * @throws \Exception
173
     */
174
    protected function writeShapeTriangle(XMLWriter $objWriter, Triangle $shape, $shapeId)
175
    {
176
        print_r("triangle");
177
        //p:sp
178
        $objWriter->startElement('p:sp');
179
        //p:nvSpPr
180
        $objWriter->startElement('p:nvSpPr');
181
        //p:cNvPr
182
        $objWriter->startElement('p:cNvPr');
183
        $objWriter->writeAttribute('id',$shapeId);
184
        $objWriter->writeAttribute('name','Triangle');
185
        $objWriter->endElement();
186
        //p:cNvSpPr
187
        $objWriter->startElement('p:cNvSpPr');
188
        $objWriter->endElement();
189
        //p:nvPr
190
        $objWriter->startElement('p:nvPr');
191
        $objWriter->endElement();
192
        $objWriter->endElement();
193
        //p:spPr
194
        $objWriter->startElement('p:spPr');
195
        // a:xfrm
196
        $objWriter->startElement('a:xfrm');
197
198
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
199
200
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
201
            // a:off
202
            $objWriter->startElement('a:off');
203
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
204
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
205
            $objWriter->endElement();
206
            // a:ext
207
            $objWriter->startElement('a:ext');
208
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
209
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
210
            $objWriter->endElement();
211
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
212
            // a:off
213
            $objWriter->startElement('a:off');
214
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
215
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
216
            $objWriter->endElement();
217
            // a:ext
218
            $objWriter->startElement('a:ext');
219
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
220
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
221
            $objWriter->endElement();
222
        } elseif ($shape->getHeight() < 0) {
223
            $objWriter->writeAttribute('flipV', 1);
224
            // a:off
225
            $objWriter->startElement('a:off');
226
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
227
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
228
            $objWriter->endElement();
229
            // a:ext
230
            $objWriter->startElement('a:ext');
231
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
232
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
233
            $objWriter->endElement();
234
        } elseif ($shape->getWidth() < 0) {
235
            $objWriter->writeAttribute('flipV', 1);
236
            // a:off
237
            $objWriter->startElement('a:off');
238
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
239
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
240
            $objWriter->endElement();
241
            // a:ext
242
            $objWriter->startElement('a:ext');
243
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
244
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
245
            $objWriter->endElement();
246
        }
247
248
        $objWriter->endElement();
249
        //a:prstGeom
250
        $objWriter->startElement('a:prstGeom');
251
        $objWriter->writeAttribute('prst', 'triangle');
252
253
        // a:prstGeom/a:avLst
254
        $objWriter->writeElement('a:avLst');
255
        $objWriter->endElement();
256
        $this->writeSolidFill($objWriter, $shape->getFill());
257
        $this->writeBorder($objWriter, $shape->getBorder(), '');
258
        $objWriter->endElement();
259
        $objWriter->endElement();
260
261
    }
262
263
    /**
264
     * Writing a Ellipse shape to help develop more dynamic and useful slides with php presentation.
265
     *
266
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
267
     * @param  \PhpOffice\PhpPresentation\Shape\Ellipse $shape
268
     * @param  int $shapeId
269
     * @throws \Exception
270
     */
271
    protected function writeShapeEllipse(XMLWriter $objWriter, Ellipse $shape, $shapeId)
272
    {
273
        //p:sp
274
        $objWriter->startElement('p:sp');
275
        //p:nvSpPr
276
        $objWriter->startElement('p:nvSpPr');
277
        //p:cNvPr
278
        $objWriter->startElement('p:cNvPr');
279
        $objWriter->writeAttribute('id',$shapeId);
280
        $objWriter->writeAttribute('name','Ellipse 4');
281
        $objWriter->endElement();
282
        //p:cNvSpPr
283
        $objWriter->startElement('p:cNvSpPr');
284
        $objWriter->endElement();
285
        //p:nvPr
286
        $objWriter->startElement('p:nvPr');
287
        $objWriter->endElement();
288
        $objWriter->endElement();
289
        //p:spPr
290
        $objWriter->startElement('p:spPr');
291
        // a:xfrm
292
        $objWriter->startElement('a:xfrm');
293
294
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
295
296
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
297
            // a:off
298
            $objWriter->startElement('a:off');
299
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
300
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
301
            $objWriter->endElement();
302
            // a:ext
303
            $objWriter->startElement('a:ext');
304
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
305
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
306
            $objWriter->endElement();
307
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
308
            // a:off
309
            $objWriter->startElement('a:off');
310
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
311
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
312
            $objWriter->endElement();
313
            // a:ext
314
            $objWriter->startElement('a:ext');
315
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
316
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
317
            $objWriter->endElement();
318
        } elseif ($shape->getHeight() < 0) {
319
            $objWriter->writeAttribute('flipV', 1);
320
            // a:off
321
            $objWriter->startElement('a:off');
322
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
323
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
324
            $objWriter->endElement();
325
            // a:ext
326
            $objWriter->startElement('a:ext');
327
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
328
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
329
            $objWriter->endElement();
330
        } elseif ($shape->getWidth() < 0) {
331
            $objWriter->writeAttribute('flipV', 1);
332
            // a:off
333
            $objWriter->startElement('a:off');
334
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
335
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
336
            $objWriter->endElement();
337
            // a:ext
338
            $objWriter->startElement('a:ext');
339
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
340
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
341
            $objWriter->endElement();
342
        }
343
344
        $objWriter->endElement();
345
        //a:prstGeom
346
        $objWriter->startElement('a:prstGeom');
347
        $objWriter->writeAttribute('prst', 'ellipse');
348
349
        // a:prstGeom/a:avLst
350
        $objWriter->writeElement('a:avLst');
351
        $objWriter->endElement();
352
        $this->writeSolidFill($objWriter, $shape->getFill());
353
        $this->writeBorder($objWriter, $shape->getBorder(), '');
354
        $objWriter->endElement();
355
        $objWriter->endElement();
356
357
    }
358
359
    /**
360
     * Writing a Rectangle shape to help develop more dynamic and useful slides with php presentation.
361
     *
362
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
363
     * @param  \PhpOffice\PhpPresentation\Shape\Rectangle $shape
364
     * @param  int $shapeId
365
     * @throws \Exception
366
     */
367
    protected function writeShapeRectangle(XMLWriter $objWriter, Rectangle $shape, $shapeId)
368
    {
369
        //p:sp
370
        $objWriter->startElement('p:sp');
371
        //p:nvSpPr
372
        $objWriter->startElement('p:nvSpPr');
373
        //p:cNvPr
374
        $objWriter->startElement('p:cNvPr');
375
        $objWriter->writeAttribute('id',$shapeId);
376
        $objWriter->writeAttribute('name','Rectangle');
377
        $objWriter->endElement();
378
        //p:cNvSpPr
379
        $objWriter->startElement('p:cNvSpPr');
380
        $objWriter->endElement();
381
        //p:nvPr
382
        $objWriter->startElement('p:nvPr');
383
        $objWriter->endElement();
384
        $objWriter->endElement();
385
        //p:spPr
386
        $objWriter->startElement('p:spPr');
387
        // a:xfrm
388
        $objWriter->startElement('a:xfrm');
389
390
        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
391
392
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
393
            // a:off
394
            $objWriter->startElement('a:off');
395
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
396
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
397
            $objWriter->endElement();
398
            // a:ext
399
            $objWriter->startElement('a:ext');
400
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
401
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
402
            $objWriter->endElement();
403
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
404
            // a:off
405
            $objWriter->startElement('a:off');
406
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
407
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
408
            $objWriter->endElement();
409
            // a:ext
410
            $objWriter->startElement('a:ext');
411
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
412
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
413
            $objWriter->endElement();
414
        } elseif ($shape->getHeight() < 0) {
415
            $objWriter->writeAttribute('flipV', 1);
416
            // a:off
417
            $objWriter->startElement('a:off');
418
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
419
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
420
            $objWriter->endElement();
421
            // a:ext
422
            $objWriter->startElement('a:ext');
423
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
424
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
425
            $objWriter->endElement();
426
        } elseif ($shape->getWidth() < 0) {
427
            $objWriter->writeAttribute('flipV', 1);
428
            // a:off
429
            $objWriter->startElement('a:off');
430
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
431
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
432
            $objWriter->endElement();
433
            // a:ext
434
            $objWriter->startElement('a:ext');
435
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
436
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
437
            $objWriter->endElement();
438
        }
439
440
        $objWriter->endElement();
441
        //a:prstGeom
442
        $objWriter->startElement('a:prstGeom');
443
        $objWriter->writeAttribute('prst', 'rect');
444
445
        // a:prstGeom/a:avLst
446
        $objWriter->writeElement('a:avLst');
447
        $objWriter->endElement();
448
        $this->writeSolidFill($objWriter, $shape->getFill());
449
        $this->writeBorder($objWriter, $shape->getBorder(), '');
450
        $objWriter->endElement();
451
        $objWriter->endElement();
452
453
    }
454
455
    /**
456
     * Writing an arrow pointer shape to help develop more dynamic and useful slides with php presentation.
457
     *
458
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
459
     * @param  \PhpOffice\PhpPresentation\Shape\ArrowPointer $shape
460
     * @param  int $shapeId
461
     * @throws \Exception
462
     */
463
    protected function writeShapeArrowPointer(XMLWriter $objWriter, ArrowPointer $shape, $shapeId)
464
    {
465
        // p:sp
466
        $objWriter->startElement('p:cxnSp');
467
        // p:nvSpPr
468
        $objWriter->startElement('p:nvCxnSpPr');
469
        // p:cNvPr
470
        $objWriter->startElement('p:cNvPr');
471
        $objWriter->writeAttribute('id', $shapeId);
472
        $objWriter->writeAttribute('name', 'Arrow Pointer');
473
        $objWriter->endElement();
474
        // p:cNvCxnSpPr
475
        $objWriter->writeElement('p:cNvCxnSpPr', null);
476
        // p:nvPr
477
        $objWriter->startElement('p:nvPr');
478
        if ($shape->isPlaceholder()) {
479
            $objWriter->startElement('p:ph');
480
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
481
            $objWriter->endElement();
482
        }
483
        $objWriter->endElement();
484
        $objWriter->endElement();
485
        // p:spPr
486
        $objWriter->startElement('p:spPr');
487
        // a:xfrm
488
        $objWriter->startElement('a:xfrm');
489
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
490
            // a:off
491
            $objWriter->startElement('a:off');
492
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
493
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
494
            $objWriter->endElement();
495
            // a:ext
496
            $objWriter->startElement('a:ext');
497
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
498
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
499
            $objWriter->endElement();
500
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
501
            // a:off
502
            $objWriter->startElement('a:off');
503
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
504
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
505
            $objWriter->endElement();
506
            // a:ext
507
            $objWriter->startElement('a:ext');
508
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
509
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
510
            $objWriter->endElement();
511
        } elseif ($shape->getHeight() < 0) {
512
            $objWriter->writeAttribute('flipV', 1);
513
            // a:off
514
            $objWriter->startElement('a:off');
515
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
516
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
517
            $objWriter->endElement();
518
            // a:ext
519
            $objWriter->startElement('a:ext');
520
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
521
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
522
            $objWriter->endElement();
523
        } elseif ($shape->getWidth() < 0) {
524
            $objWriter->writeAttribute('flipV', 1);
525
            // a:off
526
            $objWriter->startElement('a:off');
527
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
528
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
529
            $objWriter->endElement();
530
            // a:ext
531
            $objWriter->startElement('a:ext');
532
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
533
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
534
            $objWriter->endElement();
535
        }
536
        $objWriter->endElement();
537
        // a:prstGeom
538
        $objWriter->startElement('a:prstGeom');
539
        $objWriter->writeAttribute('prst', 'straightConnector1');
540
541
        // a:prstGeom/a:avLst
542
        $objWriter->writeElement('a:avLst');
543
        $objWriter->endElement();
544
545
        $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...
546
547
        $objWriter->endElement();
548
549
        $objWriter->endElement();
550
551
    }
552
553
554
    /**
555
     * Writing a round rectangle shape to help develop more dynamic and useful slides with php presentation.
556
     *
557
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
558
     * @param  \PhpOffice\PhpPresentation\Shape\RoundRectangle $shape
559
     * @param  int $shapeId
560
     * @throws \Exception
561
     */
562
    protected function writeShapeRoundRect(XMLWriter $objWriter, RoundRectangle $shape, $shapeId)
563
    {
564
        //p:sp
565
        $objWriter->startElement('p:sp');
566
        //p:nvSpPr
567
        $objWriter->startElement('p:nvSpPr');
568
        //p:cNvPr
569
        $objWriter->startElement('p:cNvPr');
570
        $objWriter->writeAttribute('id',$shapeId);
571
        $objWriter->writeAttribute('name','Round Rectangle');
572
        $objWriter->endElement();
573
        //p:cNvSpPr
574
        $objWriter->startElement('p:cNvSpPr');
575
        $objWriter->endElement();
576
        //p:nvPr
577
        $objWriter->startElement('p:nvPr');
578
        $objWriter->endElement();
579
        $objWriter->endElement();
580
        //p:spPr
581
        $objWriter->startElement('p:spPr');
582
        // a:xfrm
583
        $objWriter->startElement('a:xfrm');
584
585
//        $objWriter->writeAttribute('rot',CommonDrawing::pixelsToEmu($shape->getRotation()));
586
587
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
588
589
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
590
            // a:off
591
            $objWriter->startElement('a:off');
592
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
593
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
594
            $objWriter->endElement();
595
            // a:ext
596
            $objWriter->startElement('a:ext');
597
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
598
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
599
            $objWriter->endElement();
600
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
601
            // a:off
602
            $objWriter->startElement('a:off');
603
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
604
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
605
            $objWriter->endElement();
606
            // a:ext
607
            $objWriter->startElement('a:ext');
608
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
609
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
610
            $objWriter->endElement();
611
        } elseif ($shape->getHeight() < 0) {
612
            $objWriter->writeAttribute('flipV', 1);
613
            // a:off
614
            $objWriter->startElement('a:off');
615
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
616
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
617
            $objWriter->endElement();
618
            // a:ext
619
            $objWriter->startElement('a:ext');
620
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
621
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
622
            $objWriter->endElement();
623
        } elseif ($shape->getWidth() < 0) {
624
            $objWriter->writeAttribute('flipV', 1);
625
            // a:off
626
            $objWriter->startElement('a:off');
627
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
628
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
629
            $objWriter->endElement();
630
            // a:ext
631
            $objWriter->startElement('a:ext');
632
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
633
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
634
            $objWriter->endElement();
635
        }
636
637
        $objWriter->endElement();
638
        //a:prstGeom
639
        $objWriter->startElement('a:prstGeom');
640
        $objWriter->writeAttribute('prst', 'roundRect');
641
642
        // a:prstGeom/a:avLst
643
        $objWriter->writeElement('a:avLst');
644
        $objWriter->endElement();
645
        $this->writeSolidFill($objWriter, $shape->getFill());
646
        $this->writeBorder($objWriter, $shape->getBorder(), '');
647
        $objWriter->endElement();
648
        $objWriter->endElement();
649
650
651
    }
652
653
654
    /**
655
     * Write txt
656
     *
657
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
658
     * @param  \PhpOffice\PhpPresentation\Shape\RichText $shape
659
     * @param  int $shapeId
660
     * @throws \Exception
661
     */
662 26
    protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId)
663
    {
664
        // p:sp
665 26
        $objWriter->startElement('p:sp');
666
        // p:sp\p:nvSpPr
667 26
        $objWriter->startElement('p:nvSpPr');
668
        // p:sp\p:nvSpPr\p:cNvPr
669 26
        $objWriter->startElement('p:cNvPr');
670 26
        $objWriter->writeAttribute('id', $shapeId);
671 26
        if ($shape->isPlaceholder()) {
672 1
            $objWriter->writeAttribute('name', 'Placeholder for ' . $shape->getPlaceholder()->getType());
673
        } else {
674 26
            $objWriter->writeAttribute('name', '');
675
        }
676
        // Hyperlink
677 26
        if ($shape->hasHyperlink()) {
678 1
            $this->writeHyperlink($objWriter, $shape);
679
        }
680
        // > p:sp\p:nvSpPr
681 26
        $objWriter->endElement();
682
        // p:sp\p:cNvSpPr
683 26
        $objWriter->startElement('p:cNvSpPr');
684 26
        $objWriter->writeAttribute('txBox', '1');
685 26
        $objWriter->endElement();
686
        // p:sp\p:cNvSpPr\p:nvPr
687 26
        if ($shape->isPlaceholder()) {
688 1
            $objWriter->startElement('p:nvPr');
689 1
            $objWriter->startElement('p:ph');
690 1
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
691 1
            if (!is_null($shape->getPlaceholder()->getIdx())) {
692
                $objWriter->writeAttribute('idx', $shape->getPlaceholder()->getIdx());
693
            }
694 1
            $objWriter->endElement();
695 1
            $objWriter->endElement();
696
        } else {
697 26
            $objWriter->writeElement('p:nvPr', null);
698
        }
699
        // > p:sp\p:cNvSpPr
700 26
        $objWriter->endElement();
701
        // p:sp\p:spPr
702 26
        $objWriter->startElement('p:spPr');
703
        // p:sp\p:spPr\a:xfrm
704 26
        $objWriter->startElement('a:xfrm');
705 26
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
706
        // p:sp\p:spPr\a:xfrm\a:off
707 26
        $objWriter->startElement('a:off');
708 26
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
709 26
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
710 26
        $objWriter->endElement();
711
        // p:sp\p:spPr\a:xfrm\a:ext
712 26
        $objWriter->startElement('a:ext');
713 26
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
714 26
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
715 26
        $objWriter->endElement();
716
        // > p:sp\p:spPr\a:xfrm
717 26
        $objWriter->endElement();
718
        // p:sp\p:spPr\a:prstGeom
719 26
        $objWriter->startElement('a:prstGeom');
720 26
        $objWriter->writeAttribute('prst', 'rect');
721
        // p:sp\p:spPr\a:prstGeom\a:avLst
722 26
        $objWriter->writeElement('a:avLst');
723 26
        $objWriter->endElement();
724 26
        $this->writeFill($objWriter, $shape->getFill());
725 26
        $this->writeBorder($objWriter, $shape->getBorder(), '');
726 26
        $this->writeShadow($objWriter, $shape->getShadow());
727
        // > p:sp\p:spPr
728 26
        $objWriter->endElement();
729
        // p:txBody
730 26
        $objWriter->startElement('p:txBody');
731
        // a:bodyPr
732
        //@link :http://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.bodyproperties%28v=office.14%29.aspx
733 26
        $objWriter->startElement('a:bodyPr');
734 26
        if (!$shape->isPlaceholder()) {
735 26
            $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical();
736 26
            if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
737 3
                $objWriter->writeAttribute('anchor', $verticalAlign);
738
            }
739 26
            if ($shape->getWrap() != RichText::WRAP_SQUARE) {
740
                $objWriter->writeAttribute('wrap', $shape->getWrap());
741
            }
742 26
            $objWriter->writeAttribute('rtlCol', '0');
743 26
            if ($shape->getHorizontalOverflow() != RichText::OVERFLOW_OVERFLOW) {
744
                $objWriter->writeAttribute('horzOverflow', $shape->getHorizontalOverflow());
745
            }
746 26
            if ($shape->getVerticalOverflow() != RichText::OVERFLOW_OVERFLOW) {
747
                $objWriter->writeAttribute('vertOverflow', $shape->getVerticalOverflow());
748
            }
749 26
            if ($shape->isUpright()) {
750 1
                $objWriter->writeAttribute('upright', '1');
751
            }
752 26
            if ($shape->isVertical()) {
753 1
                $objWriter->writeAttribute('vert', 'vert');
754
            }
755 26
            $objWriter->writeAttribute('bIns', CommonDrawing::pixelsToEmu($shape->getInsetBottom()));
756 26
            $objWriter->writeAttribute('lIns', CommonDrawing::pixelsToEmu($shape->getInsetLeft()));
757 26
            $objWriter->writeAttribute('rIns', CommonDrawing::pixelsToEmu($shape->getInsetRight()));
758 26
            $objWriter->writeAttribute('tIns', CommonDrawing::pixelsToEmu($shape->getInsetTop()));
759 26
            if ($shape->getColumns() <> 1) {
760
                $objWriter->writeAttribute('numCol', $shape->getColumns());
761
            }
762
            // a:spAutoFit
763 26
            $objWriter->startElement('a:' . $shape->getAutoFit());
764 26
            if ($shape->getAutoFit() == RichText::AUTOFIT_NORMAL) {
765 1
                if (!is_null($shape->getFontScale())) {
766 1
                    $objWriter->writeAttribute('fontScale', (int)($shape->getFontScale() * 1000));
767
                }
768 1
                if (!is_null($shape->getLineSpaceReduction())) {
769 1
                    $objWriter->writeAttribute('lnSpcReduction', (int)($shape->getLineSpaceReduction() * 1000));
770
                }
771
            }
772 26
            $objWriter->endElement();
773
        }
774 26
        $objWriter->endElement();
775
        // a:lstStyle
776 26
        $objWriter->writeElement('a:lstStyle', null);
777 26
        if ($shape->isPlaceholder() &&
778 1
            ($shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ||
779 26
                $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_DATETIME)
780
        ) {
781 1
            $objWriter->startElement('a:p');
782
            // Paragraph Style
783 1
            $paragraphs = $shape->getParagraphs();
784 1
            if (!empty($paragraphs)) {
785 1
                $paragraph = &$paragraphs[0];
786 1
                $this->writeParagraphStyles($objWriter, $paragraph, true);
787
            }
788 1
            $objWriter->startElement('a:fld');
789 1
            $objWriter->writeAttribute('id', $this->getGUID());
790 1
            $objWriter->writeAttribute('type', (
791 1
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? 'slidenum' : 'datetime'));
792 1
            if (isset($paragraph)) {
793 1
                $elements = $paragraph->getRichTextElements();
794 1
                if (!empty($elements)) {
795 1
                    $element = &$elements[0];
796 1
                    $this->writeRunStyles($objWriter, $element);
0 ignored issues
show
Compatibility introduced by
$element of type object<PhpOffice\PhpPres...t\TextElementInterface> is not a sub-type of object<PhpOffice\PhpPres...ion\Shape\RichText\Run>. It seems like you assume a concrete implementation of the interface PhpOffice\PhpPresentatio...xt\TextElementInterface to be always present.

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

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

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