Completed
Pull Request — develop (#361)
by
unknown
08:18
created

AbstractSlide::writeShadow()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 27
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 3.0021

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 27
ccs 15
cts 16
cp 0.9375
rs 8.8571
c 1
b 0
f 0
cc 3
eloc 15
nc 3
nop 2
crap 3.0021
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 110
    protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, $objWriter, $relId)
54
    {
55 110
        if ($pSlideMaster->getShapeCollection()->count() > 0) {
56
            // Loop trough images and write relationships
57 1
            $iterator = $pSlideMaster->getShapeCollection()->getIterator();
58 1
            while ($iterator->valid()) {
59 1
                if ($iterator->current() instanceof ShapeDrawingFile || $iterator->current() instanceof ShapeDrawingGd) {
60
                    // Write relationship for image drawing
61
                    $this->writeRelationship(
62
                        $objWriter,
63
                        $relId,
64
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
65
                        '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename())
66
                    );
67
                    $iterator->current()->relationId = 'rId' . $relId;
68
                    ++$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 1
                $iterator->next();
109 1
            }
110 1
        }
111 110
    }
112
113
    /**
114
     * @param XMLWriter $objWriter
115
     * @param \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] $shapes
116
     * @param int $shapeId
117
     * @throws \Exception
118
     */
119 110
    protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), &$shapeId = 0)
120
    {
121 110
        if (count($shapes) == 0) {
122 110
            return;
123
        }
124 83
        foreach ($shapes as $shape) {
125
            // Increment $shapeId
126 83
            ++$shapeId;
127
            // Check type
128 83
            if ($shape instanceof RichText) {
129 26
                $this->writeShapeText($objWriter, $shape, $shapeId);
130 83
            } elseif ($shape instanceof ShapeTable) {
131 11
                $this->writeShapeTable($objWriter, $shape, $shapeId);
132 58
            } elseif ($shape instanceof Line) {
133 1
                $this->writeShapeLine($objWriter, $shape, $shapeId);
134 48
            } elseif ($shape instanceof ShapeChart) {
135 32
                $this->writeShapeChart($objWriter, $shape, $shapeId);
136 47
            } elseif ($shape instanceof AbstractGraphic) {
137 9
                $this->writeShapePic($objWriter, $shape, $shapeId);
138 16
            } elseif ($shape instanceof Group) {
139 1
                $this->writeShapeGroup($objWriter, $shape, $shapeId);
140 8
            } elseif ($shape instanceof Comment) {
141 8
            } else {
142
                throw new \Exception("Unknown Shape type: {get_class($shape)}");
143
            }
144 83
        }
145 83
    }
146
147
    /**
148
     * Write txt
149
     *
150
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
151
     * @param  \PhpOffice\PhpPresentation\Shape\RichText $shape
152
     * @param  int $shapeId
153
     * @throws \Exception
154
     */
155 26
    protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId)
156
    {
157
        // p:sp
158 26
        $objWriter->startElement('p:sp');
159
        // p:sp\p:nvSpPr
160 26
        $objWriter->startElement('p:nvSpPr');
161
        // p:sp\p:nvSpPr\p:cNvPr
162 26
        $objWriter->startElement('p:cNvPr');
163 26
        $objWriter->writeAttribute('id', $shapeId);
164 26
        if ($shape->isPlaceholder()) {
165 1
            $objWriter->writeAttribute('name', 'Placeholder for ' . $shape->getPlaceholder()->getType());
166 1
        } else {
167 26
            $objWriter->writeAttribute('name', '');
168
        }
169
        // Hyperlink
170 26
        if ($shape->hasHyperlink()) {
171 1
            $this->writeHyperlink($objWriter, $shape);
172 1
        }
173
        // > p:sp\p:nvSpPr
174 26
        $objWriter->endElement();
175
        // p:sp\p:cNvSpPr
176 26
        $objWriter->startElement('p:cNvSpPr');
177 26
        $objWriter->writeAttribute('txBox', '1');
178 26
        $objWriter->endElement();
179
        // p:sp\p:cNvSpPr\p:nvPr
180 26
        if ($shape->isPlaceholder()) {
181 1
            $objWriter->startElement('p:nvPr');
182 1
            $objWriter->startElement('p:ph');
183 1
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
184 1
            if (!is_null($shape->getPlaceholder()->getIdx())) {
185
                $objWriter->writeAttribute('idx', $shape->getPlaceholder()->getIdx());
186
            }
187 1
            $objWriter->endElement();
188 1
            $objWriter->endElement();
189 1
        } else {
190 26
            $objWriter->writeElement('p:nvPr', null);
191
        }
192
        // > p:sp\p:cNvSpPr
193 26
        $objWriter->endElement();
194
        // p:sp\p:spPr
195 26
        $objWriter->startElement('p:spPr');
196
197
        // p:sp\p:spPr\a:xfrm
198 26
        $objWriter->startElement('a:xfrm');
199 26
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
200
        // p:sp\p:spPr\a:xfrm\a:off
201 26
        $objWriter->startElement('a:off');
202 26
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
203 26
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
204 26
        $objWriter->endElement();
205
        // p:sp\p:spPr\a:xfrm\a:ext
206 26
        $objWriter->startElement('a:ext');
207 26
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
208 26
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
209 26
        $objWriter->endElement();
210
        // > p:sp\p:spPr\a:xfrm
211 26
        $objWriter->endElement();
212
        // p:sp\p:spPr\a:prstGeom
213 26
        $objWriter->startElement('a:prstGeom');
214 26
        $objWriter->writeAttribute('prst', 'rect');
215
216
        // p:sp\p:spPr\a:prstGeom\a:avLst
217 26
        $objWriter->writeElement('a:avLst');
218
219 26
        $objWriter->endElement();
220
221 26
        $this->writeFill($objWriter, $shape->getFill());
222 26
        $this->writeBorder($objWriter, $shape->getBorder(), '');
223 26
        $this->writeShadow($objWriter, $shape->getShadow());
224
225
        // > p:sp\p:spPr
226 26
        $objWriter->endElement();
227
        // p:txBody
228 26
        $objWriter->startElement('p:txBody');
229
        // a:bodyPr
230
        //@link :http://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.bodyproperties%28v=office.14%29.aspx
231 26
        $objWriter->startElement('a:bodyPr');
232 26
        if (!$shape->isPlaceholder()) {
233 26
            $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical();
234 26
            if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
235 3
                $objWriter->writeAttribute('anchor', $verticalAlign);
236 3
            }
237 26
            if ($shape->getWrap() != RichText::WRAP_SQUARE) {
238
                $objWriter->writeAttribute('wrap', $shape->getWrap());
239
            }
240 26
            $objWriter->writeAttribute('rtlCol', '0');
241 26
            if ($shape->getHorizontalOverflow() != RichText::OVERFLOW_OVERFLOW) {
242
                $objWriter->writeAttribute('horzOverflow', $shape->getHorizontalOverflow());
243
            }
244 26
            if ($shape->getVerticalOverflow() != RichText::OVERFLOW_OVERFLOW) {
245
                $objWriter->writeAttribute('vertOverflow', $shape->getVerticalOverflow());
246
            }
247 26
            if ($shape->isUpright()) {
248 1
                $objWriter->writeAttribute('upright', '1');
249 1
            }
250 26
            if ($shape->isVertical()) {
251 1
                $objWriter->writeAttribute('vert', 'vert');
252 1
            }
253 26
            $objWriter->writeAttribute('bIns', CommonDrawing::pixelsToEmu($shape->getInsetBottom()));
254 26
            $objWriter->writeAttribute('lIns', CommonDrawing::pixelsToEmu($shape->getInsetLeft()));
255 26
            $objWriter->writeAttribute('rIns', CommonDrawing::pixelsToEmu($shape->getInsetRight()));
256 26
            $objWriter->writeAttribute('tIns', CommonDrawing::pixelsToEmu($shape->getInsetTop()));
257 26
            if ($shape->getColumns() <> 1) {
258
                $objWriter->writeAttribute('numCol', $shape->getColumns());
259
            }
260
            // a:spAutoFit
261 26
            $objWriter->startElement('a:' . $shape->getAutoFit());
262 26
            if ($shape->getAutoFit() == RichText::AUTOFIT_NORMAL) {
263 1
                if (!is_null($shape->getFontScale())) {
264 1
                    $objWriter->writeAttribute('fontScale', (int)($shape->getFontScale() * 1000));
265 1
                }
266 1
                if (!is_null($shape->getLineSpaceReduction())) {
267 1
                    $objWriter->writeAttribute('lnSpcReduction', (int)($shape->getLineSpaceReduction() * 1000));
268 1
                }
269 1
            }
270 26
            $objWriter->endElement();
271 26
        }
272 26
        $objWriter->endElement();
273
        // a:lstStyle
274 26
        $objWriter->writeElement('a:lstStyle', null);
275 26
        if ($shape->isPlaceholder() &&
276 1
            ($shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ||
277
                $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_DATETIME)
278 26
        ) {
279 1
            $objWriter->startElement('a:p');
280
281
            // Paragraph Style
282 1
            $paragraphs = $shape->getParagraphs();
283 1
            if (!empty($paragraphs)) {
284 1
                $paragraph = &$paragraphs[0];
285 1
                $this->writeParagraphStyles($objWriter, $paragraph, true);
286 1
            }
287
288 1
            $objWriter->startElement('a:fld');
289 1
            $objWriter->writeAttribute('id', $this->getGUID());
290 1
            $objWriter->writeAttribute('type', (
291 1
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? 'slidenum' : 'datetime'));
292
293 1
            if (isset($paragraph)) {
294 1
                $elements = $paragraph->getRichTextElements();
295 1
                if (!empty($elements)) {
296 1
                    $element = &$elements[0];
297 1
                    $this->writeRunStyles($objWriter, $element);
0 ignored issues
show
Compatibility introduced by
$element of type object<PhpOffice\PhpPres...t\TextElementInterface> is not a sub-type of object<PhpOffice\PhpPres...ion\Shape\RichText\Run>. It seems like you assume a concrete implementation of the interface PhpOffice\PhpPresentatio...xt\TextElementInterface to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

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