Completed
Pull Request — develop (#527)
by
unknown
07:34
created

AbstractSlide::writeShapeText()   F

Complexity

Conditions 21
Paths 15360

Size

Total Lines 187

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 115
CRAP Score 21.0319

Importance

Changes 0
Metric Value
dl 0
loc 187
ccs 115
cts 120
cp 0.9583
rs 0
c 0
b 0
f 0
cc 21
nc 15360
nop 3
crap 21.0319

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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