Completed
Push — develop ( 332ad5...6bcde6 )
by Franck
06:55
created

AbstractSlide::getGUID()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 18
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 2

Importance

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