Completed
Pull Request — develop (#230)
by Franck
09:07
created

PptSlides::writeShadow()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 27
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 3.0021

Importance

Changes 3
Bugs 0 Features 1
Metric Value
c 3
b 0
f 1
dl 0
loc 27
ccs 15
cts 16
cp 0.9375
rs 8.8571
cc 3
eloc 15
nc 3
nop 2
crap 3.0021
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
28
class PptSlides extends AbstractSlide
29
{
30
    /**
31
     * Add slides (drawings, ...) and slide relationships (drawings, ...)
32
     * @return \PhpOffice\Common\Adapter\Zip\ZipInterface
33
     */
34
    public function render()
35
    {
36 95
        foreach ($this->oPresentation->getAllSlides() as $idx => $oSlide) {
37
            $this->oZip->addFromString('ppt/slides/_rels/slide' . ($idx + 1) . '.xml.rels', $this->writeSlideRelationships($oSlide));
38 95
            $this->oZip->addFromString('ppt/slides/slide' . ($idx + 1) . '.xml', $this->writeSlide($oSlide));
39 95
40 95
            // Add note slide
41
            if ($oSlide->getNote()->getShapeCollection()->count() > 0) {
42
                $this->oZip->addFromString('ppt/notesSlides/notesSlide' . ($idx + 1) . '.xml', $this->writeNote($oSlide->getNote()));
0 ignored issues
show
Bug introduced by
It seems like $oSlide->getNote() can be null; however, writeNote() does not accept null, maybe add an additional type check?

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

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

function doesNotAcceptNull(stdClass $x) { }

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

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

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