Completed
Pull Request — develop (#629)
by
unknown
07:50
created

AbstractSlide::writeParagraphs()   F

Complexity

Conditions 18
Paths 81

Size

Total Lines 122

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 71
CRAP Score 18.049

Importance

Changes 0
Metric Value
dl 0
loc 122
ccs 71
cts 75
cp 0.9467
rs 3.8933
c 0
b 0
f 0
cc 18
nc 81
nop 3
crap 18.049

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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