Completed
Pull Request — develop (#565)
by
unknown
06:14
created

AbstractSlide::writeShadow()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

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