Completed
Pull Request — develop (#565)
by
unknown
07:15
created

AbstractSlide   F

Complexity

Total Complexity 161

Size/Duplication

Total Lines 1567
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 30

Test Coverage

Coverage 90.74%

Importance

Changes 0
Metric Value
wmc 161
lcom 1
cbo 30
dl 0
loc 1567
ccs 892
cts 983
cp 0.9074
rs 0.8
c 0
b 0
f 0

15 Methods

Rating   Name   Duplication   Size   Complexity  
B writeShapeCollection() 0 27 10
F writeShapeTable() 0 191 20
C writeDrawingRelations() 0 61 11
F writeShapeText() 0 141 23
D writeParagraphs() 0 111 15
B writeShapeLine() 0 86 8
A writeShadow() 0 27 3
A writeHyperlink() 0 14 3
B writeNote() 0 280 3
A writeShapeChart() 0 52 2
B writeShapePic() 0 93 3
A writeShapeGroup() 0 48 1
B writeSlideBackground() 0 64 5
A getGUID() 0 18 2
F writeSlideTransition() 0 240 52

How to fix   Complexity   

Complex Class

Complex classes like AbstractSlide often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use AbstractSlide, and based on these observations, apply Extract Interface, too.

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\File as ShapeDrawingFile;
26
use PhpOffice\PhpPresentation\Shape\Drawing\Gd as ShapeDrawingGd;
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\AbstractSlide as AbstractSlideAlias;
38
use PhpOffice\PhpPresentation\Slide\Note;
39
use PhpOffice\PhpPresentation\Style\Alignment;
40
use PhpOffice\PhpPresentation\Style\Border;
41
use PhpOffice\PhpPresentation\Style\Bullet;
42
use PhpOffice\PhpPresentation\Style\Color;
43
use PhpOffice\PhpPresentation\Style\Shadow;
44
45
abstract class AbstractSlide extends AbstractDecoratorWriter
46
{
47
    /**
48
     * @param AbstractSlideAlias $pSlideMaster
49
     * @param XMLWriter $objWriter
50
     * @param int $relId
51
     * @return mixed
52
     * @throws \Exception
53
     */
54 113
    protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, XMLWriter $objWriter, $relId)
55
    {
56 113
        if ($pSlideMaster->getShapeCollection()->count() > 0) {
57
            // Loop trough images and write relationships
58 1
            $iterator = $pSlideMaster->getShapeCollection()->getIterator();
59 1
            while ($iterator->valid()) {
60 1
                if ($iterator->current() instanceof ShapeDrawingFile || $iterator->current() instanceof ShapeDrawingGd) {
61
                    // Write relationship for image drawing
62 1
                    $this->writeRelationship(
63 1
                        $objWriter,
64 1
                        $relId,
65 1
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
66 1
                        '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename())
67
                    );
68 1
                    $iterator->current()->relationId = 'rId' . $relId;
69 1
                    ++$relId;
70
                } elseif ($iterator->current() instanceof ShapeChart) {
71
                    // Write relationship for chart drawing
72
                    $this->writeRelationship(
73
                        $objWriter,
74
                        $relId,
75
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
76
                        '../charts/' . $iterator->current()->getIndexedFilename()
77
                    );
78
                    $iterator->current()->relationId = 'rId' . $relId;
79
                    ++$relId;
80
                } elseif ($iterator->current() instanceof Group) {
81
                    $iterator2 = $iterator->current()->getShapeCollection()->getIterator();
82
                    while ($iterator2->valid()) {
83
                        if ($iterator2->current() instanceof ShapeDrawingFile ||
84
                            $iterator2->current() instanceof ShapeDrawingGd
85
                        ) {
86
                            // Write relationship for image drawing
87
                            $this->writeRelationship(
88
                                $objWriter,
89
                                $relId,
90
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
91
                                '../media/' . str_replace(' ', '_', $iterator2->current()->getIndexedFilename())
92
                            );
93
                            $iterator2->current()->relationId = 'rId' . $relId;
94
                            ++$relId;
95
                        } elseif ($iterator2->current() instanceof ShapeChart) {
96
                            // Write relationship for chart drawing
97
                            $this->writeRelationship(
98
                                $objWriter,
99
                                $relId,
100
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
101
                                '../charts/' . $iterator2->current()->getIndexedFilename()
102
                            );
103
                            $iterator2->current()->relationId = 'rId' . $relId;
104
                            ++$relId;
105
                        }
106
                        $iterator2->next();
107
                    }
108
                }
109 1
                $iterator->next();
110
            }
111
        }
112
113 113
        return $relId;
114
    }
115
116
    /**
117
     * @param XMLWriter $objWriter
118
     * @param \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] $shapes
119
     * @param int $shapeId
120
     * @throws \Exception
121
     */
122 112
    protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), &$shapeId = 0)
123
    {
124 112
        if (count($shapes) == 0) {
125 112
            return;
126
        }
127 85
        foreach ($shapes as $shape) {
128
            // Increment $shapeId
129 85
            ++$shapeId;
130
            // Check type
131 85
            if ($shape instanceof RichText) {
132 24
                $this->writeShapeText($objWriter, $shape, $shapeId);
133 61
            } elseif ($shape instanceof ShapeTable) {
134 10
                $this->writeShapeTable($objWriter, $shape, $shapeId);
135 51
            } elseif ($shape instanceof Line) {
136 1
                $this->writeShapeLine($objWriter, $shape, $shapeId);
137 50
            } elseif ($shape instanceof ShapeChart) {
138 34
                $this->writeShapeChart($objWriter, $shape, $shapeId);
139 16
            } elseif ($shape instanceof AbstractGraphic) {
140 9
                $this->writeShapePic($objWriter, $shape, $shapeId);
141 7
            } elseif ($shape instanceof Group) {
142 1
                $this->writeShapeGroup($objWriter, $shape, $shapeId);
143 7
            } elseif ($shape instanceof Comment) {
144
            } else {
145 85
                throw new \Exception("Unknown Shape type: {get_class($shape)}");
146
            }
147
        }
148 85
    }
149
150
    /**
151
     * Write txt
152
     *
153
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
154
     * @param  \PhpOffice\PhpPresentation\Shape\RichText $shape
155
     * @param  int $shapeId
156
     * @throws \Exception
157
     */
158 24
    protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId)
159
    {
160
        // p:sp
161 24
        $objWriter->startElement('p:sp');
162
        // p:sp\p:nvSpPr
163 24
        $objWriter->startElement('p:nvSpPr');
164
        // p:sp\p:nvSpPr\p:cNvPr
165 24
        $objWriter->startElement('p:cNvPr');
166 24
        $objWriter->writeAttribute('id', $shapeId);
167 24
        if ($shape->isPlaceholder()) {
168
            $objWriter->writeAttribute('name', 'Placeholder for ' . $shape->getPlaceholder()->getType());
169
        } else {
170 24
            $objWriter->writeAttribute('name', '');
171
        }
172
        // Hyperlink
173 24
        if ($shape->hasHyperlink()) {
174 1
            $this->writeHyperlink($objWriter, $shape);
175
        }
176
        // > p:sp\p:nvSpPr
177 24
        $objWriter->endElement();
178
        // p:sp\p:cNvSpPr
179 24
        $objWriter->startElement('p:cNvSpPr');
180 24
        $objWriter->writeAttribute('txBox', '1');
181 24
        $objWriter->endElement();
182
        // p:sp\p:cNvSpPr\p:nvPr
183 24
        if ($shape->isPlaceholder()) {
184
            $objWriter->startElement('p:nvPr');
185
            $objWriter->startElement('p:ph');
186
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
187
            if (!is_null($shape->getPlaceholder()->getIdx())) {
188
                $objWriter->writeAttribute('idx', $shape->getPlaceholder()->getIdx());
189
            }
190
            $objWriter->endElement();
191
            $objWriter->endElement();
192
        } else {
193 24
            $objWriter->writeElement('p:nvPr', null);
194
        }
195
        // > p:sp\p:cNvSpPr
196 24
        $objWriter->endElement();
197
        // p:sp\p:spPr
198 24
        $objWriter->startElement('p:spPr');
199
200 24
        if (!$shape->isPlaceholder()) {
201
            // p:sp\p:spPr\a:xfrm
202 24
            $objWriter->startElement('a:xfrm');
203 24
            $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
204
            // p:sp\p:spPr\a:xfrm\a:off
205 24
            $objWriter->startElement('a:off');
206 24
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
207 24
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
208 24
            $objWriter->endElement();
209
            // p:sp\p:spPr\a:xfrm\a:ext
210 24
            $objWriter->startElement('a:ext');
211 24
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
212 24
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
213 24
            $objWriter->endElement();
214
            // > p:sp\p:spPr\a:xfrm
215 24
            $objWriter->endElement();
216
            // p:sp\p:spPr\a:prstGeom
217 24
            $objWriter->startElement('a:prstGeom');
218 24
            $objWriter->writeAttribute('prst', 'rect');
219
220
            // p:sp\p:spPr\a:prstGeom\a:avLst
221 24
            $objWriter->writeElement('a:avLst');
222
223 24
            $objWriter->endElement();
224
        }
225 24
        $this->writeFill($objWriter, $shape->getFill());
0 ignored issues
show
Bug introduced by
It seems like $shape->getFill() can be null; however, writeFill() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
226 24
        $this->writeBorder($objWriter, $shape->getBorder(), '');
227 24
        $this->writeShadow($objWriter, $shape->getShadow());
228
229
        // > p:sp\p:spPr
230 24
        $objWriter->endElement();
231
        // p:txBody
232 24
        $objWriter->startElement('p:txBody');
233
        // a:bodyPr
234
        //@link :http://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.bodyproperties%28v=office.14%29.aspx
235 24
        $objWriter->startElement('a:bodyPr');
236 24
        if (!$shape->isPlaceholder()) {
237 24
            $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical();
238 24
            if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
239 3
                $objWriter->writeAttribute('anchor', $verticalAlign);
240
            }
241 24
            if ($shape->getWrap() != RichText::WRAP_SQUARE) {
242
                $objWriter->writeAttribute('wrap', $shape->getWrap());
243
            }
244 24
            $objWriter->writeAttribute('rtlCol', '0');
245 24
            if ($shape->getHorizontalOverflow() != RichText::OVERFLOW_OVERFLOW) {
246
                $objWriter->writeAttribute('horzOverflow', $shape->getHorizontalOverflow());
247
            }
248 24
            if ($shape->getVerticalOverflow() != RichText::OVERFLOW_OVERFLOW) {
249
                $objWriter->writeAttribute('vertOverflow', $shape->getVerticalOverflow());
250
            }
251 24
            if ($shape->isUpright()) {
252 1
                $objWriter->writeAttribute('upright', '1');
253
            }
254 24
            if ($shape->isVertical()) {
255 1
                $objWriter->writeAttribute('vert', 'vert');
256
            }
257 24
            $objWriter->writeAttribute('bIns', CommonDrawing::pixelsToEmu($shape->getInsetBottom()));
258 24
            $objWriter->writeAttribute('lIns', CommonDrawing::pixelsToEmu($shape->getInsetLeft()));
259 24
            $objWriter->writeAttribute('rIns', CommonDrawing::pixelsToEmu($shape->getInsetRight()));
260 24
            $objWriter->writeAttribute('tIns', CommonDrawing::pixelsToEmu($shape->getInsetTop()));
261 24
            if ($shape->getColumns() <> 1) {
262
                $objWriter->writeAttribute('numCol', $shape->getColumns());
263
            }
264
            // a:spAutoFit
265 24
            $objWriter->startElement('a:' . $shape->getAutoFit());
266 24
            if ($shape->getAutoFit() == RichText::AUTOFIT_NORMAL) {
267 1
                if (!is_null($shape->getFontScale())) {
268 1
                    $objWriter->writeAttribute('fontScale', $shape->getFontScale() * 1000);
269
                }
270 1
                if (!is_null($shape->getLineSpaceReduction())) {
271 1
                    $objWriter->writeAttribute('lnSpcReduction', $shape->getLineSpaceReduction() * 1000);
272
                }
273
            }
274 24
            $objWriter->endElement();
275
        }
276 24
        $objWriter->endElement();
277
        // a:lstStyle
278 24
        $objWriter->writeElement('a:lstStyle', null);
279 24
        if ($shape->isPlaceholder() &&
280
            ($shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ||
281 24
                $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_DATETIME)
282
        ) {
283
            $objWriter->startElement('a:p');
284
            $objWriter->startElement('a:fld');
285
            $objWriter->writeAttribute('id', $this->getGUID());
286
            $objWriter->writeAttribute('type', (
287
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? 'slidenum' : 'datetime'));
288
            $objWriter->writeElement('a:t', (
289
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? '<nr.>' : '03-04-05'));
290
            $objWriter->endElement();
291
            $objWriter->endElement();
292
        } else {
293
            // Write paragraphs
294 24
            $this->writeParagraphs($objWriter, $shape->getParagraphs());
295
        }
296 24
        $objWriter->endElement();
297 24
        $objWriter->endElement();
298 24
    }
299
300
    /**
301
     * Write table
302
     *
303
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
304
     * @param  \PhpOffice\PhpPresentation\Shape\Table $shape
305
     * @param  int $shapeId
306
     * @throws \Exception
307
     */
308 10
    protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $shapeId)
309
    {
310
        // p:graphicFrame
311 10
        $objWriter->startElement('p:graphicFrame');
312
        // p:graphicFrame/p:nvGraphicFramePr
313 10
        $objWriter->startElement('p:nvGraphicFramePr');
314
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvPr
315 10
        $objWriter->startElement('p:cNvPr');
316 10
        $objWriter->writeAttribute('id', $shapeId);
317 10
        $objWriter->writeAttribute('name', $shape->getName());
318 10
        $objWriter->writeAttribute('descr', $shape->getDescription());
319 10
        $objWriter->endElement();
320
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr
321 10
        $objWriter->startElement('p:cNvGraphicFramePr');
322
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr/a:graphicFrameLocks
323 10
        $objWriter->startElement('a:graphicFrameLocks');
324 10
        $objWriter->writeAttribute('noGrp', '1');
325 10
        $objWriter->endElement();
326
        // p:graphicFrame/p:nvGraphicFramePr/p:cNvGraphicFramePr/
327 10
        $objWriter->endElement();
328
        // p:graphicFrame/p:nvGraphicFramePr/p:nvPr
329 10
        $objWriter->startElement('p:nvPr');
330 10
        if ($shape->isPlaceholder()) {
331
            $objWriter->startElement('p:ph');
332
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
333
            $objWriter->endElement();
334
        }
335 10
        $objWriter->endElement();
336
        // p:graphicFrame/p:nvGraphicFramePr/
337 10
        $objWriter->endElement();
338
        // p:graphicFrame/p:xfrm
339 10
        $objWriter->startElement('p:xfrm');
340
        // p:graphicFrame/p:xfrm/a:off
341 10
        $objWriter->startElement('a:off');
342 10
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
343 10
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
344 10
        $objWriter->endElement();
345
        // p:graphicFrame/p:xfrm/a:ext
346 10
        $objWriter->startElement('a:ext');
347 10
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
348 10
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
349 10
        $objWriter->endElement();
350
        // p:graphicFrame/p:xfrm/
351 10
        $objWriter->endElement();
352
        // p:graphicFrame/a:graphic
353 10
        $objWriter->startElement('a:graphic');
354
        // p:graphicFrame/a:graphic/a:graphicData
355 10
        $objWriter->startElement('a:graphicData');
356 10
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/table');
357
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl
358 10
        $objWriter->startElement('a:tbl');
359
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblPr
360 10
        $objWriter->startElement('a:tblPr');
361 10
        $objWriter->writeAttribute('firstRow', '1');
362 10
        $objWriter->writeAttribute('bandRow', '1');
363 10
        $objWriter->endElement();
364
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid
365 10
        $objWriter->startElement('a:tblGrid');
366
        // Write cell widths
367 10
        $countCells = count($shape->getRow(0)->getCells());
368 10
        for ($cell = 0; $cell < $countCells; $cell++) {
369
            //  p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid/a:gridCol
370 10
            $objWriter->startElement('a:gridCol');
371
            // Calculate column width
372 10
            $width = $shape->getRow(0)->getCell($cell)->getWidth();
373 10
            if ($width == 0) {
374 10
                $colCount = count($shape->getRow(0)->getCells());
375 10
                $totalWidth = $shape->getWidth();
376 10
                $width = $totalWidth / $colCount;
377
            }
378 10
            $objWriter->writeAttribute('w', CommonDrawing::pixelsToEmu($width));
379 10
            $objWriter->endElement();
380
        }
381
        // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tblGrid/
382 10
        $objWriter->endElement();
383
        // Colspan / rowspan containers
384 10
        $colSpan = array();
385 10
        $rowSpan = array();
386
        // Default border style
387 10
        $defaultBorder = new Border();
388
        // Write rows
389 10
        $countRows = count($shape->getRows());
390 10
        for ($row = 0; $row < $countRows; $row++) {
391
            // p:graphicFrame/a:graphic/a:graphicData/a:tbl/a:tr
392 10
            $objWriter->startElement('a:tr');
393 10
            $objWriter->writeAttribute('h', CommonDrawing::pixelsToEmu($shape->getRow($row)->getHeight()));
394
            // Write cells
395 10
            $countCells = count($shape->getRow($row)->getCells());
396 10
            for ($cell = 0; $cell < $countCells; $cell++) {
397
                // Current cell
398 10
                $currentCell = $shape->getRow($row)->getCell($cell);
399
                // Next cell right
400 10
                $nextCellRight = $shape->getRow($row)->getCell($cell + 1, true);
401
                // Next cell below
402 10
                $nextRowBelow = $shape->getRow($row + 1, true);
403 10
                $nextCellBelow = null;
404 10
                if ($nextRowBelow != null) {
405 2
                    $nextCellBelow = $nextRowBelow->getCell($cell, true);
406
                }
407
                // a:tc
408 10
                $objWriter->startElement('a:tc');
409
                // Colspan
410 10
                if ($currentCell->getColSpan() > 1) {
411 1
                    $objWriter->writeAttribute('gridSpan', $currentCell->getColSpan());
412 1
                    $colSpan[$row] = $currentCell->getColSpan() - 1;
413 10
                } elseif (isset($colSpan[$row]) && $colSpan[$row] > 0) {
414 1
                    $colSpan[$row]--;
415 1
                    $objWriter->writeAttribute('hMerge', '1');
416
                }
417
                // Rowspan
418 10
                if ($currentCell->getRowSpan() > 1) {
419 1
                    $objWriter->writeAttribute('rowSpan', $currentCell->getRowSpan());
420 1
                    $rowSpan[$cell] = $currentCell->getRowSpan() - 1;
421 10
                } elseif (isset($rowSpan[$cell]) && $rowSpan[$cell] > 0) {
422 1
                    $rowSpan[$cell]--;
423 1
                    $objWriter->writeAttribute('vMerge', '1');
424
                }
425
                // a:txBody
426 10
                $objWriter->startElement('a:txBody');
427
                // a:txBody/a:bodyPr
428 10
                $objWriter->startElement('a:bodyPr');
429 10
                $objWriter->writeAttribute('wrap', 'square');
430 10
                $objWriter->writeAttribute('rtlCol', '0');
431
                // a:txBody/a:bodyPr/a:spAutoFit
432 10
                $objWriter->writeElement('a:spAutoFit', null);
433
                // a:txBody/a:bodyPr/
434 10
                $objWriter->endElement();
435
                // a:lstStyle
436 10
                $objWriter->writeElement('a:lstStyle', null);
437
                // Write paragraphs
438 10
                $this->writeParagraphs($objWriter, $currentCell->getParagraphs());
439 10
                $objWriter->endElement();
440
                // a:tcPr
441 10
                $objWriter->startElement('a:tcPr');
442 10
                $firstParagraph = $currentCell->getParagraph(0);
443 10
                $firstParagraphAlignment = $firstParagraph->getAlignment();
444
445
                // Text Direction
446 10
                $textDirection = $firstParagraphAlignment->getTextDirection();
447 10
                if ($textDirection != Alignment::TEXT_DIRECTION_HORIZONTAL) {
448 1
                    $objWriter->writeAttribute('vert', $textDirection);
449
                }
450
                // Alignment (horizontal)
451 10
                $verticalAlign = $firstParagraphAlignment->getVertical();
452 10
                if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
453 1
                    $objWriter->writeAttribute('anchor', $verticalAlign);
454
                }
455
456
                // Margins
457 10
                $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($firstParagraphAlignment->getMarginLeft()));
458 10
                $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($firstParagraphAlignment->getMarginRight()));
459 10
                $objWriter->writeAttribute('marT', CommonDrawing::pixelsToEmu($firstParagraphAlignment->getMarginTop()));
460 10
                $objWriter->writeAttribute('marB', CommonDrawing::pixelsToEmu($firstParagraphAlignment->getMarginBottom()));
461
462
                // Determine borders
463 10
                $borderLeft = $currentCell->getBorders()->getLeft();
464 10
                $borderRight = $currentCell->getBorders()->getRight();
465 10
                $borderTop = $currentCell->getBorders()->getTop();
466 10
                $borderBottom = $currentCell->getBorders()->getBottom();
467 10
                $borderDiagonalDown = $currentCell->getBorders()->getDiagonalDown();
468 10
                $borderDiagonalUp = $currentCell->getBorders()->getDiagonalUp();
469
                // Fix PowerPoint implementation
470 10
                if (!is_null($nextCellRight)
471 10
                    && $nextCellRight->getBorders()->getRight()->getHashCode() != $defaultBorder->getHashCode()
472
                ) {
473 1
                    $borderRight = $nextCellRight->getBorders()->getLeft();
474
                }
475 10
                if (!is_null($nextCellBelow)
476 10
                    && $nextCellBelow->getBorders()->getBottom()->getHashCode() != $defaultBorder->getHashCode()
477
                ) {
478 1
                    $borderBottom = $nextCellBelow->getBorders()->getTop();
479
                }
480
                // Write borders
481 10
                $this->writeBorder($objWriter, $borderLeft, 'L');
482 10
                $this->writeBorder($objWriter, $borderRight, 'R');
483 10
                $this->writeBorder($objWriter, $borderTop, 'T');
484 10
                $this->writeBorder($objWriter, $borderBottom, 'B');
485 10
                $this->writeBorder($objWriter, $borderDiagonalDown, 'TlToBr');
486 10
                $this->writeBorder($objWriter, $borderDiagonalUp, 'BlToTr');
487
                // Fill
488 10
                $this->writeFill($objWriter, $currentCell->getFill());
489 10
                $objWriter->endElement();
490 10
                $objWriter->endElement();
491
            }
492 10
            $objWriter->endElement();
493
        }
494 10
        $objWriter->endElement();
495 10
        $objWriter->endElement();
496 10
        $objWriter->endElement();
497 10
        $objWriter->endElement();
498 10
    }
499
500
    /**
501
     * Write paragraphs
502
     *
503
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
504
     * @param  \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] $paragraphs
505
     * @param  bool $bIsPlaceholder
506
     * @throws \Exception
507
     */
508 35
    protected function writeParagraphs(XMLWriter $objWriter, $paragraphs, $bIsPlaceholder = false)
509
    {
510
        // Loop trough paragraphs
511 35
        foreach ($paragraphs as $paragraph) {
512
            // a:p
513 35
            $objWriter->startElement('a:p');
514
515
            // a:pPr
516 35
            if (!$bIsPlaceholder) {
517 35
                $objWriter->startElement('a:pPr');
518 35
                $objWriter->writeAttribute('algn', $paragraph->getAlignment()->getHorizontal());
519 35
                $objWriter->writeAttribute('fontAlgn', $paragraph->getAlignment()->getVertical());
520 35
                $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getMarginLeft()));
521 35
                $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getMarginRight()));
522 35
                $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getIndent()));
523 35
                $objWriter->writeAttribute('lvl', $paragraph->getAlignment()->getLevel());
524
525 35
                $objWriter->startElement('a:lnSpc');
526 35
                $objWriter->startElement('a:spcPct');
527 35
                $objWriter->writeAttribute('val', $paragraph->getLineSpacing() * 1000);
528 35
                $objWriter->endElement();
529 35
                $objWriter->endElement();
530
531
                // Bullet type specified?
532 35
                if ($paragraph->getBulletStyle()->getBulletType() != Bullet::TYPE_NONE) {
533
                    // Color
534
                    // a:buClr must be before a:buFont (else PowerPoint crashes at launch)
535 2
                    if ($paragraph->getBulletStyle()->getBulletColor() instanceof Color) {
536 2
                        $objWriter->startElement('a:buClr');
537 2
                        $this->writeColor($objWriter, $paragraph->getBulletStyle()->getBulletColor());
538 2
                        $objWriter->endElement();
539
                    }
540
541
                    // a:buFont
542 2
                    $objWriter->startElement('a:buFont');
543 2
                    $objWriter->writeAttribute('typeface', $paragraph->getBulletStyle()->getBulletFont());
544 2
                    $objWriter->endElement();
545
546 2
                    if ($paragraph->getBulletStyle()->getBulletType() == Bullet::TYPE_BULLET) {
547
                        // a:buChar
548 1
                        $objWriter->startElement('a:buChar');
549 1
                        $objWriter->writeAttribute('char', $paragraph->getBulletStyle()->getBulletChar());
550 1
                        $objWriter->endElement();
551 1
                    } elseif ($paragraph->getBulletStyle()->getBulletType() == Bullet::TYPE_NUMERIC) {
552
                        // a:buAutoNum
553 1
                        $objWriter->startElement('a:buAutoNum');
554 1
                        $objWriter->writeAttribute('type', $paragraph->getBulletStyle()->getBulletNumericStyle());
555 1
                        if ($paragraph->getBulletStyle()->getBulletNumericStartAt() != 1) {
556 1
                            $objWriter->writeAttribute('startAt', $paragraph->getBulletStyle()->getBulletNumericStartAt());
557
                        }
558 1
                        $objWriter->endElement();
559
                    }
560
                }
561
562 35
                $objWriter->endElement();
563
            }
564
565
            // Loop trough rich text elements
566 35
            $elements = $paragraph->getRichTextElements();
567 35
            foreach ($elements as $element) {
568 30
                if ($element instanceof BreakElement) {
569
                    // a:br
570 1
                    $objWriter->writeElement('a:br', null);
571 29
                } elseif ($element instanceof Run || $element instanceof TextElement) {
572
                    // a:r
573 29
                    $objWriter->startElement('a:r');
574
575
                    // a:rPr
576 29
                    if ($element instanceof Run && !$bIsPlaceholder) {
577
                        // a:rPr
578 29
                        $objWriter->startElement('a:rPr');
579
580
                        // Lang
581 29
                        $objWriter->writeAttribute('lang', ($element->getLanguage() ? $element->getLanguage() : 'en-US'));
582 29
                        $objWriter->writeAttributeIf($element->getFont()->isBold(), 'b', '1');
583 29
                        $objWriter->writeAttributeIf($element->getFont()->isItalic(), 'i', '1');
584 29
                        $objWriter->writeAttributeIf($element->getFont()->isStrikethrough(), 'strike', 'sngStrike');
585 29
                        $objWriter->writeAttribute('sz', ($element->getFont()->getSize() * 100));
586 29
                        $objWriter->writeAttribute('spc', $element->getFont()->getCharacterSpacing());
587 29
                        $objWriter->writeAttribute('u', $element->getFont()->getUnderline());
588 29
                        $objWriter->writeAttributeIf($element->getFont()->isSuperScript(), 'baseline', '300000');
589 29
                        $objWriter->writeAttributeIf($element->getFont()->isSubScript(), 'baseline', '-250000');
590
591
                        // Color - a:solidFill
592 29
                        $objWriter->startElement('a:solidFill');
593 29
                        $this->writeColor($objWriter, $element->getFont()->getColor());
594 29
                        $objWriter->endElement();
595
596
                        // Font - a:latin
597 29
                        $objWriter->startElement('a:latin');
598 29
                        $objWriter->writeAttribute('typeface', $element->getFont()->getName());
599 29
                        $objWriter->endElement();
600
601
                        // a:hlinkClick
602 29
                        $this->writeHyperlink($objWriter, $element);
603
604 29
                        $objWriter->endElement();
605
                    }
606
607
                    // t
608 29
                    $objWriter->startElement('a:t');
609 29
                    $objWriter->writeCData(Text::controlCharacterPHP2OOXML($element->getText()));
610 29
                    $objWriter->endElement();
611
612 30
                    $objWriter->endElement();
613
                }
614
            }
615
616 35
            $objWriter->endElement();
617
        }
618 35
    }
619
620
    /**
621
     * Write Line Shape
622
     *
623
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
624
     * @param \PhpOffice\PhpPresentation\Shape\Line $shape
625
     * @param  int $shapeId
626
     * @throws \Exception
627
     */
628 1
    protected function writeShapeLine(XMLWriter $objWriter, Line $shape, $shapeId)
629
    {
630
        // p:sp
631 1
        $objWriter->startElement('p:cxnSp');
632
        // p:nvSpPr
633 1
        $objWriter->startElement('p:nvCxnSpPr');
634
        // p:cNvPr
635 1
        $objWriter->startElement('p:cNvPr');
636 1
        $objWriter->writeAttribute('id', $shapeId);
637 1
        $objWriter->writeAttribute('name', '');
638 1
        $objWriter->endElement();
639
        // p:cNvCxnSpPr
640 1
        $objWriter->writeElement('p:cNvCxnSpPr', null);
641
        // p:nvPr
642 1
        $objWriter->startElement('p:nvPr');
643 1
        if ($shape->isPlaceholder()) {
644
            $objWriter->startElement('p:ph');
645
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
646
            $objWriter->endElement();
647
        }
648 1
        $objWriter->endElement();
649 1
        $objWriter->endElement();
650
        // p:spPr
651 1
        $objWriter->startElement('p:spPr');
652
        // a:xfrm
653 1
        $objWriter->startElement('a:xfrm');
654 1
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
655
            // a:off
656 1
            $objWriter->startElement('a:off');
657 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
658 1
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
659 1
            $objWriter->endElement();
660
            // a:ext
661 1
            $objWriter->startElement('a:ext');
662 1
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
663 1
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
664 1
            $objWriter->endElement();
665 1
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
666
            // a:off
667 1
            $objWriter->startElement('a:off');
668 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
669 1
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
670 1
            $objWriter->endElement();
671
            // a:ext
672 1
            $objWriter->startElement('a:ext');
673 1
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
674 1
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
675 1
            $objWriter->endElement();
676 1
        } elseif ($shape->getHeight() < 0) {
677 1
            $objWriter->writeAttribute('flipV', 1);
678
            // a:off
679 1
            $objWriter->startElement('a:off');
680 1
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
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->getWidth() < 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() + $shape->getWidth()));
693 1
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
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
        }
701 1
        $objWriter->endElement();
702
        // a:prstGeom
703 1
        $objWriter->startElement('a:prstGeom');
704 1
        $objWriter->writeAttribute('prst', 'line');
705
706
        // a:prstGeom/a:avLst
707 1
        $objWriter->writeElement('a:avLst');
708
709 1
        $objWriter->endElement();
710 1
        $this->writeBorder($objWriter, $shape->getBorder(), '');
711 1
        $objWriter->endElement();
712 1
        $objWriter->endElement();
713 1
    }
714
715
    /**
716
     * Write Shadow
717
     * @param XMLWriter $objWriter
718
     * @param Shadow|null $oShadow
719
     */
720 33
    protected function writeShadow(XMLWriter $objWriter, $oShadow)
721
    {
722 33
        if (!($oShadow instanceof Shadow)) {
723
            return;
724
        }
725
726 33
        if (!$oShadow->isVisible()) {
727 31
            return;
728
        }
729
        
730
        // a:effectLst
731 2
        $objWriter->startElement('a:effectLst');
732
        
733
        // a:outerShdw
734 2
        $objWriter->startElement('a:outerShdw');
735 2
        $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($oShadow->getBlurRadius()));
736 2
        $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($oShadow->getDistance()));
737 2
        $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($oShadow->getDirection()));
738 2
        $objWriter->writeAttribute('algn', $oShadow->getAlignment());
739 2
        $objWriter->writeAttribute('rotWithShape', '0');
740
        
741 2
        $this->writeColor($objWriter, $oShadow->getColor(), $oShadow->getAlpha());
742
        
743 2
        $objWriter->endElement();
744
        
745 2
        $objWriter->endElement();
746 2
    }
747
748
    /**
749
     * Write hyperlink
750
     *
751
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
752
     * @param \PhpOffice\PhpPresentation\AbstractShape|\PhpOffice\PhpPresentation\Shape\RichText\TextElement $shape
753
     * @throws \Exception
754
     */
755 31
    protected function writeHyperlink(XMLWriter $objWriter, $shape)
756
    {
757 31
        if (!$shape->hasHyperlink()) {
758 26
            return;
759
        }
760
        // a:hlinkClick
761 5
        $objWriter->startElement('a:hlinkClick');
762 5
        $objWriter->writeAttribute('r:id', $shape->getHyperlink()->relationId);
763 5
        $objWriter->writeAttribute('tooltip', $shape->getHyperlink()->getTooltip());
764 5
        if ($shape->getHyperlink()->isInternal()) {
765 1
            $objWriter->writeAttribute('action', $shape->getHyperlink()->getUrl());
766
        }
767 5
        $objWriter->endElement();
768 5
    }
769
770
    /**
771
     * Write Note Slide
772
     * @param Note $pNote
773
     * @throws \Exception
774
     * @return  string
775
     */
776 1
    protected function writeNote(Note $pNote)
777
    {
778
        // Create XML writer
779 1
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
780
781
        // XML header
782 1
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
783
784
        // p:notes
785 1
        $objWriter->startElement('p:notes');
786 1
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
787 1
        $objWriter->writeAttribute('xmlns:p', 'http://schemas.openxmlformats.org/presentationml/2006/main');
788 1
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
789
790
        // p:notes/p:cSld
791 1
        $objWriter->startElement('p:cSld');
792
793
        // p:notes/p:cSld/p:spTree
794 1
        $objWriter->startElement('p:spTree');
795
796
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr
797 1
        $objWriter->startElement('p:nvGrpSpPr');
798
799
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:cNvPr
800 1
        $objWriter->startElement('p:cNvPr');
801 1
        $objWriter->writeAttribute('id', '1');
802 1
        $objWriter->writeAttribute('name', '');
803 1
        $objWriter->endElement();
804
805
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:cNvGrpSpPr
806 1
        $objWriter->writeElement('p:cNvGrpSpPr', null);
807
808
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr/p:nvPr
809 1
        $objWriter->writeElement('p:nvPr', null);
810
811
        // p:notes/p:cSld/p:spTree/p:nvGrpSpPr
812 1
        $objWriter->endElement();
813
814
        // p:notes/p:cSld/p:spTree/p:grpSpPr
815 1
        $objWriter->startElement('p:grpSpPr');
816
817
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm
818 1
        $objWriter->startElement('a:xfrm');
819
820
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:off
821 1
        $objWriter->startElement('a:off');
822 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
823 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($pNote->getOffsetY()));
824 1
        $objWriter->endElement(); // a:off
825
826
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:ext
827 1
        $objWriter->startElement('a:ext');
828 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($pNote->getExtentX()));
829 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($pNote->getExtentY()));
830 1
        $objWriter->endElement(); // a:ext
831
832
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:chOff
833 1
        $objWriter->startElement('a:chOff');
834 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
835 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($pNote->getOffsetY()));
836 1
        $objWriter->endElement(); // a:chOff
837
838
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm/a:chExt
839 1
        $objWriter->startElement('a:chExt');
840 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($pNote->getExtentX()));
841 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($pNote->getExtentY()));
842 1
        $objWriter->endElement(); // a:chExt
843
844
        // p:notes/p:cSld/p:spTree/p:grpSpPr/a:xfrm
845 1
        $objWriter->endElement();
846
847
        // p:notes/p:cSld/p:spTree/p:grpSpPr
848 1
        $objWriter->endElement();
849
850
        // p:notes/p:cSld/p:spTree/p:sp[1]
851 1
        $objWriter->startElement('p:sp');
852
853
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr
854 1
        $objWriter->startElement('p:nvSpPr');
855
856
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr
857 1
        $objWriter->startElement('p:cNvPr');
858 1
        $objWriter->writeAttribute('id', '2');
859 1
        $objWriter->writeAttribute('name', 'Slide Image Placeholder 1');
860 1
        $objWriter->endElement();
861
862
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr
863 1
        $objWriter->startElement('p:cNvSpPr');
864
865
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr/a:spLocks
866 1
        $objWriter->startElement('a:spLocks');
867 1
        $objWriter->writeAttribute('noGrp', '1');
868 1
        $objWriter->writeAttribute('noRot', '1');
869 1
        $objWriter->writeAttribute('noChangeAspect', '1');
870 1
        $objWriter->endElement();
871
872
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvSpPr
873 1
        $objWriter->endElement();
874
875
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr
876 1
        $objWriter->startElement('p:nvPr');
877
878
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr/p:ph
879 1
        $objWriter->startElement('p:ph');
880 1
        $objWriter->writeAttribute('type', 'sldImg');
881 1
        $objWriter->endElement();
882
883
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:nvPr
884 1
        $objWriter->endElement();
885
886
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:nvSpPr
887 1
        $objWriter->endElement();
888
889
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr
890 1
        $objWriter->startElement('p:spPr');
891
892
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm
893 1
        $objWriter->startElement('a:xfrm');
894
895
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm/a:off
896 1
        $objWriter->startElement('a:off');
897 1
        $objWriter->writeAttribute('x', 0);
898 1
        $objWriter->writeAttribute('y', 0);
899 1
        $objWriter->endElement();
900
901
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm/a:ext
902 1
        $objWriter->startElement('a:ext');
903 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(round($pNote->getExtentX() / 2)));
904 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(round($pNote->getExtentY() / 2)));
905 1
        $objWriter->endElement();
906
907
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:xfrm
908 1
        $objWriter->endElement();
909
910
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom
911 1
        $objWriter->startElement('a:prstGeom');
912 1
        $objWriter->writeAttribute('prst', 'rect');
913
914
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom/a:avLst
915 1
        $objWriter->writeElement('a:avLst', null);
916
917
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:prstGeom
918 1
        $objWriter->endElement();
919
920
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:noFill
921 1
        $objWriter->writeElement('a:noFill', null);
922
923
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln
924 1
        $objWriter->startElement('a:ln');
925 1
        $objWriter->writeAttribute('w', '12700');
926
927
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill
928 1
        $objWriter->startElement('a:solidFill');
929
930
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill/a:prstClr
931 1
        $objWriter->startElement('a:prstClr');
932 1
        $objWriter->writeAttribute('val', 'black');
933 1
        $objWriter->endElement();
934
935
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln/a:solidFill
936 1
        $objWriter->endElement();
937
938
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr/a:ln
939 1
        $objWriter->endElement();
940
941
        // p:notes/p:cSld/p:spTree/p:sp[1]/p:spPr
942 1
        $objWriter->endElement();
943
944
        // p:notes/p:cSld/p:spTree/p:sp[1]
945 1
        $objWriter->endElement();
946
947
        // p:notes/p:cSld/p:spTree/p:sp[2]
948 1
        $objWriter->startElement('p:sp');
949
950
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr
951 1
        $objWriter->startElement('p:nvSpPr');
952
953
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr
954 1
        $objWriter->startElement('p:cNvPr');
955 1
        $objWriter->writeAttribute('id', '3');
956 1
        $objWriter->writeAttribute('name', 'Notes Placeholder');
957 1
        $objWriter->endElement();
958
959
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr
960 1
        $objWriter->startElement('p:cNvSpPr');
961
962
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr/a:spLocks
963 1
        $objWriter->startElement('a:spLocks');
964 1
        $objWriter->writeAttribute('noGrp', '1');
965 1
        $objWriter->endElement();
966
967
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvSpPr
968 1
        $objWriter->endElement();
969
970
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr
971 1
        $objWriter->startElement('p:nvPr');
972
973
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr/p:ph
974 1
        $objWriter->startElement('p:ph');
975 1
        $objWriter->writeAttribute('type', 'body');
976 1
        $objWriter->writeAttribute('idx', '1');
977 1
        $objWriter->endElement();
978
979
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:nvPr
980 1
        $objWriter->endElement();
981
982
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:nvSpPr
983 1
        $objWriter->endElement();
984
985
        // START notes print below rectangle section
986
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr
987 1
        $objWriter->startElement('p:spPr');
988
989
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm
990 1
        $objWriter->startElement('a:xfrm');
991
992
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:off
993 1
        $objWriter->startElement('a:off');
994 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
995 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu(round($pNote->getExtentY() / 2) + $pNote->getOffsetY()));
996 1
        $objWriter->endElement();
997
998
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm/a:ext
999 1
        $objWriter->startElement('a:ext');
1000 1
        $objWriter->writeAttribute('cx', '5486400');
1001 1
        $objWriter->writeAttribute('cy', '3600450');
1002 1
        $objWriter->endElement();
1003
1004
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:xfrm
1005 1
        $objWriter->endElement();
1006
1007
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom
1008 1
        $objWriter->startElement('a:prstGeom');
1009 1
        $objWriter->writeAttribute('prst', 'rect');
1010
1011
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom/a:avLst
1012 1
        $objWriter->writeElement('a:avLst', null);
1013
1014
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr/a:prstGeom
1015 1
        $objWriter->endElement();
1016
1017
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:spPr
1018 1
        $objWriter->endElement();
1019
1020
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody
1021 1
        $objWriter->startElement('p:txBody');
1022
1023
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr
1024 1
        $objWriter->writeElement('a:bodyPr', null);
1025
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody/a:lstStyle
1026 1
        $objWriter->writeElement('a:lstStyle', null);
1027
1028
        // Loop shapes
1029 1
        $shapes = $pNote->getShapeCollection();
1030 1
        foreach ($shapes as $shape) {
1031
            // Check type
1032 1
            if ($shape instanceof RichText) {
1033 1
                $paragraphs = $shape->getParagraphs();
1034 1
                $this->writeParagraphs($objWriter, $paragraphs);
1035
            }
1036
        }
1037
1038
        // p:notes/p:cSld/p:spTree/p:sp[2]/p:txBody
1039 1
        $objWriter->endElement();
1040
1041
        // p:notes/p:cSld/p:spTree/p:sp[2]
1042 1
        $objWriter->endElement();
1043
1044
        // p:notes/p:cSld/p:spTree
1045 1
        $objWriter->endElement();
1046
1047
        // p:notes/p:cSld
1048 1
        $objWriter->endElement();
1049
1050
        // p:notes
1051 1
        $objWriter->endElement();
1052
1053
        // Return
1054 1
        return $objWriter->getData();
1055
    }
1056
1057
    /**
1058
     * Write chart
1059
     *
1060
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
1061
     * @param \PhpOffice\PhpPresentation\Shape\Chart $shape
1062
     * @param  int $shapeId
1063
     */
1064 34
    protected function writeShapeChart(XMLWriter $objWriter, ShapeChart $shape, $shapeId)
1065
    {
1066
        // p:graphicFrame
1067 34
        $objWriter->startElement('p:graphicFrame');
1068
        // p:nvGraphicFramePr
1069 34
        $objWriter->startElement('p:nvGraphicFramePr');
1070
        // p:cNvPr
1071 34
        $objWriter->startElement('p:cNvPr');
1072 34
        $objWriter->writeAttribute('id', $shapeId);
1073 34
        $objWriter->writeAttribute('name', $shape->getName());
1074 34
        $objWriter->writeAttribute('descr', $shape->getDescription());
1075 34
        $objWriter->endElement();
1076
        // p:cNvGraphicFramePr
1077 34
        $objWriter->writeElement('p:cNvGraphicFramePr', null);
1078
        // p:nvPr
1079 34
        $objWriter->startElement('p:nvPr');
1080 34
        if ($shape->isPlaceholder()) {
1081
            $objWriter->startElement('p:ph');
1082
            $objWriter->writeAttribute('type', $shape->getPlaceholder()->getType());
1083
            $objWriter->endElement();
1084
        }
1085 34
        $objWriter->endElement();
1086 34
        $objWriter->endElement();
1087
        // p:xfrm
1088 34
        $objWriter->startElement('p:xfrm');
1089 34
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
1090
        // a:off
1091 34
        $objWriter->startElement('a:off');
1092 34
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1093 34
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1094 34
        $objWriter->endElement();
1095
        // a:ext
1096 34
        $objWriter->startElement('a:ext');
1097 34
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1098 34
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1099 34
        $objWriter->endElement();
1100 34
        $objWriter->endElement();
1101
        // a:graphic
1102 34
        $objWriter->startElement('a:graphic');
1103
        // a:graphicData
1104 34
        $objWriter->startElement('a:graphicData');
1105 34
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
1106
        // c:chart
1107 34
        $objWriter->startElement('c:chart');
1108 34
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
1109 34
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
1110 34
        $objWriter->writeAttribute('r:id', $shape->relationId);
1111 34
        $objWriter->endElement();
1112 34
        $objWriter->endElement();
1113 34
        $objWriter->endElement();
1114 34
        $objWriter->endElement();
1115 34
    }
1116
1117
    /**
1118
     * Write pic
1119
     *
1120
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1121
     * @param  \PhpOffice\PhpPresentation\Shape\AbstractGraphic $shape
1122
     * @param  int $shapeId
1123
     * @throws \Exception
1124
     */
1125 9
    protected function writeShapePic(XMLWriter $objWriter, AbstractGraphic $shape, $shapeId)
1126
    {
1127
        // p:pic
1128 9
        $objWriter->startElement('p:pic');
1129
        // p:nvPicPr
1130 9
        $objWriter->startElement('p:nvPicPr');
1131
        // p:cNvPr
1132 9
        $objWriter->startElement('p:cNvPr');
1133 9
        $objWriter->writeAttribute('id', $shapeId);
1134 9
        $objWriter->writeAttribute('name', $shape->getName());
1135 9
        $objWriter->writeAttribute('descr', $shape->getDescription());
1136
        // a:hlinkClick
1137 9
        if ($shape->hasHyperlink()) {
1138 1
            $this->writeHyperlink($objWriter, $shape);
1139
        }
1140 9
        $objWriter->endElement();
1141
        // p:cNvPicPr
1142 9
        $objWriter->startElement('p:cNvPicPr');
1143
        // a:picLocks
1144 9
        $objWriter->startElement('a:picLocks');
1145 9
        $objWriter->writeAttribute('noChangeAspect', '1');
1146 9
        $objWriter->endElement();
1147 9
        $objWriter->endElement();
1148
        // p:nvPr
1149 9
        $objWriter->startElement('p:nvPr');
1150
        /**
1151
         * @link : https://github.com/stefslon/exportToPPTX/blob/master/exportToPPTX.m#L2128
1152
         */
1153 9
        if ($shape instanceof Media) {
1154
            // p:nvPr > a:videoFile
1155 1
            $objWriter->startElement('a:videoFile');
1156 1
            $objWriter->writeAttribute('r:link', $shape->relationId);
1157 1
            $objWriter->endElement();
1158
            // p:nvPr > p:extLst
1159 1
            $objWriter->startElement('p:extLst');
1160
            // p:nvPr > p:extLst > p:ext
1161 1
            $objWriter->startElement('p:ext');
1162 1
            $objWriter->writeAttribute('uri', '{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}');
1163
            // p:nvPr > p:extLst > p:ext > p14:media
1164 1
            $objWriter->startElement('p14:media');
1165 1
            $objWriter->writeAttribute('r:embed', $shape->relationId);
1166 1
            $objWriter->writeAttribute('xmlns:p14', 'http://schemas.microsoft.com/office/powerpoint/2010/main');
1167
            // p:nvPr > p:extLst > p:ext > ##p14:media
1168 1
            $objWriter->endElement();
1169
            // p:nvPr > p:extLst > ##p:ext
1170 1
            $objWriter->endElement();
1171
            // p:nvPr > ##p:extLst
1172 1
            $objWriter->endElement();
1173
        }
1174
        // ##p:nvPr
1175 9
        $objWriter->endElement();
1176 9
        $objWriter->endElement();
1177
        // p:blipFill
1178 9
        $objWriter->startElement('p:blipFill');
1179
        // a:blip
1180 9
        $objWriter->startElement('a:blip');
1181 9
        $objWriter->writeAttribute('r:embed', $shape->relationId);
1182 9
        $objWriter->endElement();
1183
        // a:stretch
1184 9
        $objWriter->startElement('a:stretch');
1185 9
        $objWriter->writeElement('a:fillRect', null);
1186 9
        $objWriter->endElement();
1187 9
        $objWriter->endElement();
1188
        // p:spPr
1189 9
        $objWriter->startElement('p:spPr');
1190
        // a:xfrm
1191 9
        $objWriter->startElement('a:xfrm');
1192 9
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
1193
        // a:off
1194 9
        $objWriter->startElement('a:off');
1195 9
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
1196 9
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
1197 9
        $objWriter->endElement();
1198
        // a:ext
1199 9
        $objWriter->startElement('a:ext');
1200 9
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
1201 9
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
1202 9
        $objWriter->endElement();
1203 9
        $objWriter->endElement();
1204
        // a:prstGeom
1205 9
        $objWriter->startElement('a:prstGeom');
1206 9
        $objWriter->writeAttribute('prst', 'rect');
1207
        // a:avLst
1208 9
        $objWriter->writeElement('a:avLst', null);
1209 9
        $objWriter->endElement();
1210
1211 9
        $this->writeFill($objWriter, $shape->getFill());
0 ignored issues
show
Bug introduced by
It seems like $shape->getFill() can be null; however, writeFill() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
1212 9
        $this->writeBorder($objWriter, $shape->getBorder(), '');
1213 9
        $this->writeShadow($objWriter, $shape->getShadow());
1214
1215 9
        $objWriter->endElement();
1216 9
        $objWriter->endElement();
1217 9
    }
1218
1219
    /**
1220
     * Write group
1221
     *
1222
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
1223
     * @param \PhpOffice\PhpPresentation\Shape\Group $group
1224
     * @param  int $shapeId
1225
     * @throws \Exception
1226
     */
1227 1
    protected function writeShapeGroup(XMLWriter $objWriter, Group $group, &$shapeId)
1228
    {
1229
        // p:grpSp
1230 1
        $objWriter->startElement('p:grpSp');
1231
        // p:nvGrpSpPr
1232 1
        $objWriter->startElement('p:nvGrpSpPr');
1233
        // p:cNvPr
1234 1
        $objWriter->startElement('p:cNvPr');
1235 1
        $objWriter->writeAttribute('name', 'Group ' . $shapeId++);
1236 1
        $objWriter->writeAttribute('id', $shapeId);
1237 1
        $objWriter->endElement(); // p:cNvPr
1238
        // NOTE: Re: $shapeId This seems to be how PowerPoint 2010 does business.
1239
        // p:cNvGrpSpPr
1240 1
        $objWriter->writeElement('p:cNvGrpSpPr', null);
1241
        // p:nvPr
1242 1
        $objWriter->writeElement('p:nvPr', null);
1243 1
        $objWriter->endElement(); // p:nvGrpSpPr
1244
        // p:grpSpPr
1245 1
        $objWriter->startElement('p:grpSpPr');
1246
        // a:xfrm
1247 1
        $objWriter->startElement('a:xfrm');
1248
        // a:off
1249 1
        $objWriter->startElement('a:off');
1250 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($group->getOffsetX()));
1251 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($group->getOffsetY()));
1252 1
        $objWriter->endElement(); // a:off
1253
        // a:ext
1254 1
        $objWriter->startElement('a:ext');
1255 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($group->getExtentX()));
1256 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($group->getExtentY()));
1257 1
        $objWriter->endElement(); // a:ext
1258
        // a:chOff
1259 1
        $objWriter->startElement('a:chOff');
1260 1
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($group->getOffsetX()));
1261 1
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($group->getOffsetY()));
1262 1
        $objWriter->endElement(); // a:chOff
1263
        // a:chExt
1264 1
        $objWriter->startElement('a:chExt');
1265 1
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($group->getExtentX()));
1266 1
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($group->getExtentY()));
1267 1
        $objWriter->endElement(); // a:chExt
1268 1
        $objWriter->endElement(); // a:xfrm
1269 1
        $objWriter->endElement(); // p:grpSpPr
1270
1271 1
        $this->writeShapeCollection($objWriter, $group->getShapeCollection(), $shapeId);
1272
1273 1
        $objWriter->endElement(); // p:grpSp
1274 1
    }
1275
1276
    /**
1277
     * @param \PhpOffice\PhpPresentation\Slide\AbstractSlide $pSlide
1278
     * @param $objWriter
1279
     */
1280 112
    protected function writeSlideBackground(AbstractSlideAlias $pSlide, XMLWriter $objWriter)
1281
    {
1282 112
        if (!($pSlide->getBackground() instanceof Slide\AbstractBackground)) {
1283 112
            return;
1284
        }
1285 112
        $oBackground = $pSlide->getBackground();
1286
        // p:bg
1287 112
        $objWriter->startElement('p:bg');
1288 112
        if ($oBackground instanceof Slide\Background\Color) {
1289
            // p:bgPr
1290 112
            $objWriter->startElement('p:bgPr');
1291
            // a:solidFill
1292 112
            $objWriter->startElement('a:solidFill');
1293
            // a:srgbClr
1294 112
            $objWriter->startElement('a:srgbClr');
1295 112
            $objWriter->writeAttribute('val', $oBackground->getColor()->getRGB());
1296 112
            $objWriter->endElement();
1297
            // > a:solidFill
1298 112
            $objWriter->endElement();
1299
1300
            // p:bgPr/a:effectLst
1301 112
            $objWriter->writeElement('a:effectLst');
1302
1303
            // > p:bgPr
1304 112
            $objWriter->endElement();
1305
        }
1306 112
        if ($oBackground instanceof Slide\Background\Image) {
1307
            // p:bgPr
1308
            $objWriter->startElement('p:bgPr');
1309
            // a:blipFill
1310
            $objWriter->startElement('a:blipFill');
1311
            // a:blip
1312
            $objWriter->startElement('a:blip');
1313
            $objWriter->writeAttribute('r:embed', $oBackground->relationId);
1314
            // > a:blipFill
1315
            $objWriter->endElement();
1316
            // a:stretch
1317
            $objWriter->startElement('a:stretch');
1318
            // a:fillRect
1319
            $objWriter->writeElement('a:fillRect');
1320
            // > a:stretch
1321
            $objWriter->endElement();
1322
            // > a:blipFill
1323
            $objWriter->endElement();
1324
            // > p:bgPr
1325
            $objWriter->endElement();
1326
        }
1327
        /**
1328
         * @link : http://www.officeopenxml.com/prSlide-background.php
1329
         */
1330 112
        if ($oBackground instanceof Slide\Background\SchemeColor) {
1331
            // p:bgRef
1332
            $objWriter->startElement('p:bgRef');
1333
            $objWriter->writeAttribute('idx', '1001');
1334
            // a:schemeClr
1335
            $objWriter->startElement('a:schemeClr');
1336
            $objWriter->writeAttribute('val', $oBackground->getSchemeColor()->getValue());
1337
            $objWriter->endElement();
1338
            // > p:bgRef
1339
            $objWriter->endElement();
1340
        }
1341
        // > p:bg
1342 112
        $objWriter->endElement();
1343 112
    }
1344
1345
1346
    /**
1347
     * Write Transition Slide
1348
     * @link http://officeopenxml.com/prSlide-transitions.php
1349
     * @param XMLWriter $objWriter
1350
     * @param Slide\Transition|null $transition
1351
     */
1352 112
    protected function writeSlideTransition(XMLWriter $objWriter, $transition)
1353
    {
1354 112
        if (!$transition instanceof Slide\Transition) {
1355 112
            return;
1356
        }
1357 1
        $objWriter->startElement('p:transition');
1358 1
        if (!is_null($transition->getSpeed())) {
1359 1
            $objWriter->writeAttribute('spd', $transition->getSpeed());
1360
        }
1361 1
        $objWriter->writeAttribute('advClick', $transition->hasManualTrigger() ? '1' : '0');
1362 1
        if ($transition->hasTimeTrigger()) {
1363 1
            $objWriter->writeAttribute('advTm', $transition->getAdvanceTimeTrigger());
1364
        }
1365
1366 1
        switch ($transition->getTransitionType()) {
1367 1
            case Slide\Transition::TRANSITION_BLINDS_HORIZONTAL:
1368 1
                $objWriter->startElement('p:blinds');
1369 1
                $objWriter->writeAttribute('dir', 'horz');
1370 1
                $objWriter->endElement();
1371 1
                break;
1372 1
            case Slide\Transition::TRANSITION_BLINDS_VERTICAL:
1373 1
                $objWriter->startElement('p:blinds');
1374 1
                $objWriter->writeAttribute('dir', 'vert');
1375 1
                $objWriter->endElement();
1376 1
                break;
1377 1
            case Slide\Transition::TRANSITION_CHECKER_HORIZONTAL:
1378 1
                $objWriter->startElement('p:checker');
1379 1
                $objWriter->writeAttribute('dir', 'horz');
1380 1
                $objWriter->endElement();
1381 1
                break;
1382 1
            case Slide\Transition::TRANSITION_CHECKER_VERTICAL:
1383 1
                $objWriter->startElement('p:checker');
1384 1
                $objWriter->writeAttribute('dir', 'vert');
1385 1
                $objWriter->endElement();
1386 1
                break;
1387 1
            case Slide\Transition::TRANSITION_CIRCLE:
1388 1
                $objWriter->writeElement('p:circle');
1389 1
                break;
1390 1
            case Slide\Transition::TRANSITION_COMB_HORIZONTAL:
1391 1
                $objWriter->startElement('p:comb');
1392 1
                $objWriter->writeAttribute('dir', 'horz');
1393 1
                $objWriter->endElement();
1394 1
                break;
1395 1
            case Slide\Transition::TRANSITION_COMB_VERTICAL:
1396 1
                $objWriter->startElement('p:comb');
1397 1
                $objWriter->writeAttribute('dir', 'vert');
1398 1
                $objWriter->endElement();
1399 1
                break;
1400 1
            case Slide\Transition::TRANSITION_COVER_DOWN:
1401 1
                $objWriter->startElement('p:cover');
1402 1
                $objWriter->writeAttribute('dir', 'd');
1403 1
                $objWriter->endElement();
1404 1
                break;
1405 1
            case Slide\Transition::TRANSITION_COVER_LEFT:
1406 1
                $objWriter->startElement('p:cover');
1407 1
                $objWriter->writeAttribute('dir', 'l');
1408 1
                $objWriter->endElement();
1409 1
                break;
1410 1
            case Slide\Transition::TRANSITION_COVER_LEFT_DOWN:
1411 1
                $objWriter->startElement('p:cover');
1412 1
                $objWriter->writeAttribute('dir', 'ld');
1413 1
                $objWriter->endElement();
1414 1
                break;
1415 1
            case Slide\Transition::TRANSITION_COVER_LEFT_UP:
1416 1
                $objWriter->startElement('p:cover');
1417 1
                $objWriter->writeAttribute('dir', 'lu');
1418 1
                $objWriter->endElement();
1419 1
                break;
1420 1
            case Slide\Transition::TRANSITION_COVER_RIGHT:
1421 1
                $objWriter->startElement('p:cover');
1422 1
                $objWriter->writeAttribute('dir', 'r');
1423 1
                $objWriter->endElement();
1424 1
                break;
1425 1
            case Slide\Transition::TRANSITION_COVER_RIGHT_DOWN:
1426 1
                $objWriter->startElement('p:cover');
1427 1
                $objWriter->writeAttribute('dir', 'rd');
1428 1
                $objWriter->endElement();
1429 1
                break;
1430 1
            case Slide\Transition::TRANSITION_COVER_RIGHT_UP:
1431 1
                $objWriter->startElement('p:cover');
1432 1
                $objWriter->writeAttribute('dir', 'ru');
1433 1
                $objWriter->endElement();
1434 1
                break;
1435 1
            case Slide\Transition::TRANSITION_COVER_UP:
1436 1
                $objWriter->startElement('p:cover');
1437 1
                $objWriter->writeAttribute('dir', 'u');
1438 1
                $objWriter->endElement();
1439 1
                break;
1440 1
            case Slide\Transition::TRANSITION_CUT:
1441 1
                $objWriter->writeElement('p:cut');
1442 1
                break;
1443 1
            case Slide\Transition::TRANSITION_DIAMOND:
1444 1
                $objWriter->writeElement('p:diamond');
1445 1
                break;
1446 1
            case Slide\Transition::TRANSITION_DISSOLVE:
1447 1
                $objWriter->writeElement('p:dissolve');
1448 1
                break;
1449 1
            case Slide\Transition::TRANSITION_FADE:
1450 1
                $objWriter->writeElement('p:fade');
1451 1
                break;
1452 1
            case Slide\Transition::TRANSITION_NEWSFLASH:
1453 1
                $objWriter->writeElement('p:newsflash');
1454 1
                break;
1455 1
            case Slide\Transition::TRANSITION_PLUS:
1456 1
                $objWriter->writeElement('p:plus');
1457 1
                break;
1458 1
            case Slide\Transition::TRANSITION_PULL_DOWN:
1459 1
                $objWriter->startElement('p:pull');
1460 1
                $objWriter->writeAttribute('dir', 'd');
1461 1
                $objWriter->endElement();
1462 1
                break;
1463 1
            case Slide\Transition::TRANSITION_PULL_LEFT:
1464 1
                $objWriter->startElement('p:pull');
1465 1
                $objWriter->writeAttribute('dir', 'l');
1466 1
                $objWriter->endElement();
1467 1
                break;
1468 1
            case Slide\Transition::TRANSITION_PULL_RIGHT:
1469 1
                $objWriter->startElement('p:pull');
1470 1
                $objWriter->writeAttribute('dir', 'r');
1471 1
                $objWriter->endElement();
1472 1
                break;
1473 1
            case Slide\Transition::TRANSITION_PULL_UP:
1474 1
                $objWriter->startElement('p:pull');
1475 1
                $objWriter->writeAttribute('dir', 'u');
1476 1
                $objWriter->endElement();
1477 1
                break;
1478 1
            case Slide\Transition::TRANSITION_PUSH_DOWN:
1479 1
                $objWriter->startElement('p:push');
1480 1
                $objWriter->writeAttribute('dir', 'd');
1481 1
                $objWriter->endElement();
1482 1
                break;
1483 1
            case Slide\Transition::TRANSITION_PUSH_LEFT:
1484 1
                $objWriter->startElement('p:push');
1485 1
                $objWriter->writeAttribute('dir', 'l');
1486 1
                $objWriter->endElement();
1487 1
                break;
1488 1
            case Slide\Transition::TRANSITION_PUSH_RIGHT:
1489 1
                $objWriter->startElement('p:push');
1490 1
                $objWriter->writeAttribute('dir', 'r');
1491 1
                $objWriter->endElement();
1492 1
                break;
1493 1
            case Slide\Transition::TRANSITION_PUSH_UP:
1494 1
                $objWriter->startElement('p:push');
1495 1
                $objWriter->writeAttribute('dir', 'u');
1496 1
                $objWriter->endElement();
1497 1
                break;
1498 1
            case Slide\Transition::TRANSITION_RANDOM:
1499 1
                $objWriter->writeElement('p:random');
1500 1
                break;
1501 1
            case Slide\Transition::TRANSITION_RANDOMBAR_HORIZONTAL:
1502 1
                $objWriter->startElement('p:randomBar');
1503 1
                $objWriter->writeAttribute('dir', 'horz');
1504 1
                $objWriter->endElement();
1505 1
                break;
1506 1
            case Slide\Transition::TRANSITION_RANDOMBAR_VERTICAL:
1507 1
                $objWriter->startElement('p:randomBar');
1508 1
                $objWriter->writeAttribute('dir', 'vert');
1509 1
                $objWriter->endElement();
1510 1
                break;
1511 1
            case Slide\Transition::TRANSITION_SPLIT_IN_HORIZONTAL:
1512 1
                $objWriter->startElement('p:split');
1513 1
                $objWriter->writeAttribute('dir', 'in');
1514 1
                $objWriter->writeAttribute('orient', 'horz');
1515 1
                $objWriter->endElement();
1516 1
                break;
1517 1
            case Slide\Transition::TRANSITION_SPLIT_OUT_HORIZONTAL:
1518 1
                $objWriter->startElement('p:split');
1519 1
                $objWriter->writeAttribute('dir', 'out');
1520 1
                $objWriter->writeAttribute('orient', 'horz');
1521 1
                $objWriter->endElement();
1522 1
                break;
1523 1
            case Slide\Transition::TRANSITION_SPLIT_IN_VERTICAL:
1524 1
                $objWriter->startElement('p:split');
1525 1
                $objWriter->writeAttribute('dir', 'in');
1526 1
                $objWriter->writeAttribute('orient', 'vert');
1527 1
                $objWriter->endElement();
1528 1
                break;
1529 1
            case Slide\Transition::TRANSITION_SPLIT_OUT_VERTICAL:
1530 1
                $objWriter->startElement('p:split');
1531 1
                $objWriter->writeAttribute('dir', 'out');
1532 1
                $objWriter->writeAttribute('orient', 'vert');
1533 1
                $objWriter->endElement();
1534 1
                break;
1535 1
            case Slide\Transition::TRANSITION_STRIPS_LEFT_DOWN:
1536 1
                $objWriter->startElement('p:strips');
1537 1
                $objWriter->writeAttribute('dir', 'ld');
1538 1
                $objWriter->endElement();
1539 1
                break;
1540 1
            case Slide\Transition::TRANSITION_STRIPS_LEFT_UP:
1541 1
                $objWriter->startElement('p:strips');
1542 1
                $objWriter->writeAttribute('dir', 'lu');
1543 1
                $objWriter->endElement();
1544 1
                break;
1545 1
            case Slide\Transition::TRANSITION_STRIPS_RIGHT_DOWN:
1546 1
                $objWriter->startElement('p:strips');
1547 1
                $objWriter->writeAttribute('dir', 'rd');
1548 1
                $objWriter->endElement();
1549 1
                break;
1550 1
            case Slide\Transition::TRANSITION_STRIPS_RIGHT_UP:
1551 1
                $objWriter->startElement('p:strips');
1552 1
                $objWriter->writeAttribute('dir', 'ru');
1553 1
                $objWriter->endElement();
1554 1
                break;
1555 1
            case Slide\Transition::TRANSITION_WEDGE:
1556 1
                $objWriter->writeElement('p:wedge');
1557 1
                break;
1558 1
            case Slide\Transition::TRANSITION_WIPE_DOWN:
1559 1
                $objWriter->startElement('p:wipe');
1560 1
                $objWriter->writeAttribute('dir', 'd');
1561 1
                $objWriter->endElement();
1562 1
                break;
1563 1
            case Slide\Transition::TRANSITION_WIPE_LEFT:
1564 1
                $objWriter->startElement('p:wipe');
1565 1
                $objWriter->writeAttribute('dir', 'l');
1566 1
                $objWriter->endElement();
1567 1
                break;
1568 1
            case Slide\Transition::TRANSITION_WIPE_RIGHT:
1569 1
                $objWriter->startElement('p:wipe');
1570 1
                $objWriter->writeAttribute('dir', 'r');
1571 1
                $objWriter->endElement();
1572 1
                break;
1573 1
            case Slide\Transition::TRANSITION_WIPE_UP:
1574 1
                $objWriter->startElement('p:wipe');
1575 1
                $objWriter->writeAttribute('dir', 'u');
1576 1
                $objWriter->endElement();
1577 1
                break;
1578 1
            case Slide\Transition::TRANSITION_ZOOM_IN:
1579 1
                $objWriter->startElement('p:zoom');
1580 1
                $objWriter->writeAttribute('dir', 'in');
1581 1
                $objWriter->endElement();
1582 1
                break;
1583 1
            case Slide\Transition::TRANSITION_ZOOM_OUT:
1584 1
                $objWriter->startElement('p:zoom');
1585 1
                $objWriter->writeAttribute('dir', 'out');
1586 1
                $objWriter->endElement();
1587 1
                break;
1588
        }
1589
1590 1
        $objWriter->endElement();
1591 1
    }
1592
1593
    private function getGUID()
1594
    {
1595
        if (function_exists('com_create_guid')) {
1596
            return com_create_guid();
1597
        } else {
1598
            mt_srand((double)microtime() * 10000);//optional for php 4.2.0 and up.
1599
            $charid = strtoupper(md5(uniqid(rand(), true)));
1600
            $hyphen = chr(45);// "-"
1601
            $uuid = chr(123)// "{"
1602
                . substr($charid, 0, 8) . $hyphen
1603
                . substr($charid, 8, 4) . $hyphen
1604
                . substr($charid, 12, 4) . $hyphen
1605
                . substr($charid, 16, 4) . $hyphen
1606
                . substr($charid, 20, 12)
1607
                . chr(125);// "}"
1608
            return $uuid;
1609
        }
1610
    }
1611
}
1612