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