Completed
Pull Request — develop (#409)
by Franck
18:12 queued 05:52
created

AbstractSlide::writeShapeCollection()   B

Complexity

Conditions 10
Paths 10

Size

Total Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 21
CRAP Score 10.0094

Importance

Changes 0
Metric Value
dl 0
loc 27
ccs 21
cts 22
cp 0.9545
rs 7.6666
c 0
b 0
f 0
cc 10
nc 10
nop 3
crap 10.0094

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