Completed
Pull Request — develop (#455)
by
unknown
10:09
created

AbstractSlide::getGUID()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 18
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

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