Completed
Pull Request — develop (#361)
by Franck
07:38
created

AbstractSlide::writeSlideTransition()   F

Complexity

Conditions 52
Paths 193

Size

Total Lines 240

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 233
CRAP Score 52

Importance

Changes 0
Metric Value
dl 0
loc 240
ccs 233
cts 233
cp 1
rs 2.7133
c 0
b 0
f 0
cc 52
nc 193
nop 2
crap 52

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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