Completed
Pull Request — develop (#545)
by Franck
19:28 queued 06:47
created

AbstractSlide::writeShapeChart()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 52

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 36
CRAP Score 2.004

Importance

Changes 0
Metric Value
dl 0
loc 52
ccs 36
cts 40
cp 0.9
rs 9.0472
c 0
b 0
f 0
cc 2
nc 2
nop 3
crap 2.004

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