Completed
Push — develop ( d7bbf5...5d23e6 )
by Franck
12s
created

PptSlides::writeShapeText()   F

Complexity

Conditions 16
Paths 5128

Size

Total Lines 137
Code Lines 75

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 69
CRAP Score 16

Importance

Changes 5
Bugs 0 Features 1
Metric Value
dl 0
loc 137
ccs 69
cts 69
cp 1
rs 2
c 5
b 0
f 1
cc 16
eloc 75
nc 5128
nop 3
crap 16

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

1
<?php
2
3
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
4
5
use PhpOffice\Common\Drawing as CommonDrawing;
6
use PhpOffice\Common\Text;
7
use PhpOffice\Common\XMLWriter;
8
use PhpOffice\PhpPresentation\Shape\AbstractDrawing;
9
use PhpOffice\PhpPresentation\Shape\Chart as ShapeChart;
10
use PhpOffice\PhpPresentation\Shape\Comment;
11
use PhpOffice\PhpPresentation\Shape\Drawing as ShapeDrawing;
12
use PhpOffice\PhpPresentation\Shape\Group;
13
use PhpOffice\PhpPresentation\Shape\Line;
14
use PhpOffice\PhpPresentation\Shape\Media;
15
use PhpOffice\PhpPresentation\Shape\RichText;
16
use PhpOffice\PhpPresentation\Shape\RichText\BreakElement;
17
use PhpOffice\PhpPresentation\Shape\RichText\Run;
18
use PhpOffice\PhpPresentation\Shape\RichText\TextElement;
19
use PhpOffice\PhpPresentation\Shape\Table as ShapeTable;
20
use PhpOffice\PhpPresentation\Slide;
21
use PhpOffice\PhpPresentation\Slide\Background\Image;
22
use PhpOffice\PhpPresentation\Slide\Note;
23
use PhpOffice\PhpPresentation\Slide\Transition;
24
use PhpOffice\PhpPresentation\Style\Alignment;
25
use PhpOffice\PhpPresentation\Style\Bullet;
26
use PhpOffice\PhpPresentation\Style\Border;
27
use PhpOffice\PhpPresentation\Style\Color;
28
29
class PptSlides extends AbstractSlide
30
{
31
    /**
32
     * Add slides (drawings, ...) and slide relationships (drawings, ...)
33
     * @return \PhpOffice\Common\Adapter\Zip\ZipInterface
34
     */
35 96
    public function render()
36
    {
37 96
        foreach ($this->oPresentation->getAllSlides() as $idx => $oSlide) {
38 96
            $this->oZip->addFromString('ppt/slides/_rels/slide' . ($idx + 1) . '.xml.rels', $this->writeSlideRelationships($oSlide));
39 96
            $this->oZip->addFromString('ppt/slides/slide' . ($idx + 1) . '.xml', $this->writeSlide($oSlide));
40
41
            // Add note slide
42 96
            if ($oSlide->getNote()->getShapeCollection()->count() > 0) {
43 1
                $this->oZip->addFromString('ppt/notesSlides/notesSlide' . ($idx + 1) . '.xml', $this->writeNote($oSlide->getNote()));
0 ignored issues
show
Bug introduced by
It seems like $oSlide->getNote() can be null; however, writeNote() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
44
            }
45
46
            // Add background image slide
47 96
            $oBkgImage = $oSlide->getBackground();
48 96
            if ($oBkgImage instanceof Image) {
49 96
                $this->oZip->addFromString('ppt/media/'.$oBkgImage->getIndexedFilename($idx), file_get_contents($oBkgImage->getPath()));
50
            }
51
        }
52
53 96
        return $this->oZip;
54
    }
55
56
    /**
57
     * Write slide relationships to XML format
58
     *
59
     * @param  \PhpOffice\PhpPresentation\Slide $pSlide
60
     * @return string              XML Output
61
     * @throws \Exception
62
     */
63 96
    protected function writeSlideRelationships(Slide $pSlide)
64
    {
65
        //@todo Group all getShapeCollection()->getIterator
66
67
        // Create XML writer
68 96
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
69
70
        // XML header
71 96
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
72
73
        // Relationships
74 96
        $objWriter->startElement('Relationships');
75 96
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
76
77
        // Starting relation id
78 96
        $relId = 1;
79 96
        $idxSlide = $pSlide->getParent()->getIndex($pSlide);
80
81
        // Write slideLayout relationship
82 96
        if ($pSlide->getSlideLayout()) {
83
            $layoutId = $pSlide->getSlideLayout()->layoutNr;
84
            $this->writeRelationship($objWriter, $relId++, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout', '../slideLayouts/slideLayout' . $layoutId . '.xml');
85
        }
86
87
        // Write drawing relationships?
88 96
        if ($pSlide->getShapeCollection()->count() > 0) {
89
            // Loop trough images and write relationships
90 72
            $iterator = $pSlide->getShapeCollection()->getIterator();
91 72
            while ($iterator->valid()) {
92 72
                if ($iterator->current() instanceof Media) {
93
                    // Write relationship for image drawing
94 1
                    $this->writeRelationship($objWriter, $relId, 'http://schemas.microsoft.com/office/2007/relationships/media', '../media/' . $iterator->current()->getIndexedFilename());
95 1
                    $iterator->current()->relationId = 'rId' . $relId;
96 1
                    ++$relId;
97 71
                } elseif ($iterator->current() instanceof ShapeDrawing\AbstractDrawingAdapter) {
98
                    // Write relationship for image drawing
99 7
                    $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', '../media/' . $iterator->current()->getIndexedFilename());
100 7
                    $iterator->current()->relationId = 'rId' . $relId;
101 7
                    ++$relId;
102 64
                } elseif ($iterator->current() instanceof ShapeChart) {
103
                    // Write relationship for chart drawing
104 24
                    $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', '../charts/' . $iterator->current()->getIndexedFilename());
105
106 24
                    $iterator->current()->relationId = 'rId' . $relId;
107
108 24
                    ++$relId;
109 40
                } elseif ($iterator->current() instanceof Group) {
110 1
                    $iterator2 = $iterator->current()->getShapeCollection()->getIterator();
111 1
                    while ($iterator2->valid()) {
112 1
                        if ($iterator->current() instanceof Media) {
113
                            // Write relationship for image drawing
114
                            $this->writeRelationship($objWriter, $relId, 'http://schemas.microsoft.com/office/2007/relationships/media', '../media/' . $iterator->current()->getIndexedFilename());
115
                            $iterator->current()->relationId = 'rId' . $relId;
116
                            ++$relId;
117 1
                        } elseif ($iterator->current() instanceof ShapeDrawing\AbstractDrawingAdapter) {
118
                            // Write relationship for image drawing
119
                            $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', '../media/' . $iterator2->current()->getIndexedFilename());
120
                            $iterator2->current()->relationId = 'rId' . $relId;
121
122
                            ++$relId;
123 1
                        } elseif ($iterator2->current() instanceof ShapeChart) {
124
                            // Write relationship for chart drawing
125
                            $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', '../charts/' . $iterator2->current()->getIndexedFilename());
126
                            $iterator2->current()->relationId = 'rId' . $relId;
127
128
                            ++$relId;
129
                        }
130 1
                        $iterator2->next();
131
                    }
132
                }
133
134 72
                $iterator->next();
135
            }
136
        }
137
138
        // Write background relationships?
139 96
        $oBackground = $pSlide->getBackground();
140 96
        if ($oBackground instanceof Image) {
141
            $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', '../media/' . $oBackground->getIndexedFilename($idxSlide));
142
            $oBackground->relationId = 'rId' . $relId;
143
            ++$relId;
144
        }
145
146
        // Write hyperlink relationships?
147 96
        if ($pSlide->getShapeCollection()->count() > 0) {
148
            // Loop trough hyperlinks and write relationships
149 72
            $iterator = $pSlide->getShapeCollection()->getIterator();
150 72
            while ($iterator->valid()) {
151
                // Hyperlink on shape
152 72
                if ($iterator->current()->hasHyperlink()) {
153
                    // Write relationship for hyperlink
154 2
                    $hyperlink               = $iterator->current()->getHyperlink();
155 2
                    $hyperlink->relationId = 'rId' . $relId;
156
157 2
                    if (!$hyperlink->isInternal()) {
158 2
                        $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', $hyperlink->getUrl(), 'External');
159
                    } else {
160
                        $this->writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide', 'slide' . $hyperlink->getSlideNumber() . '.xml');
161
                    }
162
163 2
                    ++$relId;
164
                }
165
166
                // Hyperlink on rich text run
167 72
                if ($iterator->current() instanceof RichText) {
168 23
                    foreach ($iterator->current()->getParagraphs() as $paragraph) {
169 23
                        foreach ($paragraph->getRichTextElements() as $element) {
170 18
                            if ($element instanceof Run || $element instanceof RunTextElement) {
0 ignored issues
show
Bug introduced by
The class PhpOffice\PhpPresentatio...oint2007\RunTextElement does not exist. Did you forget a USE statement, or did you not list all dependencies?

This error could be the result of:

1. Missing dependencies

PHP Analyzer uses your composer.json file (if available) to determine the dependencies of your project and to determine all the available classes and functions. It expects the composer.json to be in the root folder of your repository.

Are you sure this class is defined by one of your dependencies, or did you maybe not list a dependency in either the require or require-dev section?

2. Missing use statement

PHP does not complain about undefined classes in ìnstanceof checks. For example, the following PHP code will work perfectly fine:

if ($x instanceof DoesNotExist) {
    // Do something.
}

If you have not tested against this specific condition, such errors might go unnoticed.

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