Completed
Push — develop ( 86946f...95aba9 )
by Franck
14:04 queued 05:55
created

PptSlides::writeHyperlink()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2

Importance

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

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

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

function doesNotAcceptNull(stdClass $x) { }

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

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

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