Completed
Pull Request — develop (#187)
by Franck
19:04 queued 41s
created

PptSlides::writeShapeText()   F

Complexity

Conditions 16
Paths 10240

Size

Total Lines 131
Code Lines 70

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 131
rs 2
cc 16
eloc 70
nc 10240
nop 3

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

1
<?php
2
3
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
4
5
use PhpOffice\Common\Drawing as CommonDrawing;
6
use PhpOffice\Common\Text;
7
use PhpOffice\Common\XMLWriter;
8
use PhpOffice\PhpPresentation\Shape\AbstractDrawing;
9
use PhpOffice\PhpPresentation\Shape\Chart as ShapeChart;
10
use PhpOffice\PhpPresentation\Shape\Drawing as ShapeDrawing;
11
use PhpOffice\PhpPresentation\Shape\Group;
12
use PhpOffice\PhpPresentation\Shape\Line;
13
use PhpOffice\PhpPresentation\Shape\MemoryDrawing as MemoryDrawing;
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
     */
34
    public function render()
35
    {
36
        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...
37
38
            $this->oZip->addFromString('ppt/slides/_rels/slide' . ($idx + 1) . '.xml.rels', $this->writeSlideRelationships($oSlide));
39
            $this->oZip->addFromString('ppt/slides/slide' . ($idx + 1) . '.xml', $this->writeSlide($oSlide));
40
41
            // Add note slide
42
            if ($oSlide->getNote()->getShapeCollection()->count() > 0) {
43
                $this->oZip->addFromString('ppt/notesSlides/notesSlide' . ($idx + 1) . '.xml', $this->writeNote($oSlide->getNote()));
0 ignored issues
show
Bug introduced by
It seems like $oSlide->getNote() can be null; however, writeNote() does not accept null, maybe add an additional type check?

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

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

function doesNotAcceptNull(stdClass $x) { }

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

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

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