Completed
Pull Request — develop (#207)
by Franck
30:59 queued 22:31
created

PptSlides::writeShapeDrawing()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 88
Code Lines 45

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 43
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 88
ccs 43
cts 43
cp 1
rs 8.6012
cc 2
eloc 45
nc 2
nop 3
crap 2

How to fix   Long Method   

Long Method

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

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

Commonly applied refactorings include:

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