Completed
Pull Request — develop (#188)
by Franck
06:55
created

PptSlides::writeShapeText()   F

Complexity

Conditions 16
Paths 10240

Size

Total Lines 131
Code Lines 70

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 66
CRAP Score 16

Importance

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

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
     * @return \PhpOffice\Common\Adapter\Zip\ZipInterface
34
     */
35 74
    public function render()
36
    {
37 74
        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
39 74
            $this->oZip->addFromString('ppt/slides/_rels/slide' . ($idx + 1) . '.xml.rels', $this->writeSlideRelationships($oSlide));
40 74
            $this->oZip->addFromString('ppt/slides/slide' . ($idx + 1) . '.xml', $this->writeSlide($oSlide));
41
42
            // Add note slide
43 74
            if ($oSlide->getNote()->getShapeCollection()->count() > 0) {
44 1
                $this->oZip->addFromString('ppt/notesSlides/notesSlide' . ($idx + 1) . '.xml', $this->writeNote($oSlide->getNote()));
0 ignored issues
show
Bug introduced by
It seems like $oSlide->getNote() can be null; however, writeNote() does not accept null, maybe add an additional type check?

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

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

function doesNotAcceptNull(stdClass $x) { }

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

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

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