Completed
Pull Request — develop (#304)
by Franck
09:13
created

PptSlides::writeShapeChart()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 67
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 36
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 67
ccs 36
cts 36
cp 1
rs 9.2815
c 0
b 0
f 0
cc 2
eloc 38
nc 2
nop 3
crap 2

How to fix   Long Method   

Long Method

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

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

Commonly applied refactorings include:

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