Completed
Pull Request — develop (#263)
by Franck
09:08
created

AbstractSlide::writeShapeChart()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 52
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 36
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 52
ccs 36
cts 36
cp 1
rs 9.4929
cc 2
eloc 38
nc 2
nop 3
crap 2

How to fix   Long Method   

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