Completed
Pull Request — develop (#230)
by Franck
13:17
created

AbstractSlide::writeNote()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 109
Code Lines 70

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 2
Bugs 0 Features 0
Metric Value
dl 0
loc 109
ccs 0
cts 1
cp 0
rs 8.2857
c 2
b 0
f 0
cc 3
eloc 70
nc 3
nop 1
crap 12

How to fix   Long Method   

Long Method

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

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

Commonly applied refactorings include:

1
<?php
2
/**
3
 * This file is part of PHPPresentation - A pure PHP library for reading and writing
4
 * presentations documents.
5
 *
6
 * PHPPresentation is free software distributed under the terms of the GNU Lesser
7
 * General Public License version 3 as published by the Free Software Foundation.
8
 *
9
 * For the full copyright and license information, please read the LICENSE
10
 * file that was distributed with this source code. For the full list of
11
 * contributors, visit https://github.com/PHPOffice/PHPPresentation/contributors.
12
 *
13
 * @link        https://github.com/PHPOffice/PHPPresentation
14
 * @copyright   2009-2015 PHPPresentation contributors
15
 * @license     http://www.gnu.org/licenses/lgpl.txt LGPL version 3
16
 */
17
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
18
19
use PhpOffice\Common\Drawing as CommonDrawing;
20
use PhpOffice\Common\Text;
21
use PhpOffice\Common\XMLWriter;
22
use PhpOffice\PhpPresentation\Shape\AbstractDrawing;
23
use PhpOffice\PhpPresentation\Shape\AbstractGraphic;
24
use PhpOffice\PhpPresentation\Shape\Chart as ShapeChart;
25
use PhpOffice\PhpPresentation\Shape\Comment;
26
use PhpOffice\PhpPresentation\Shape\Drawing\Gd as ShapeDrawingGd;
27
use PhpOffice\PhpPresentation\Shape\Drawing\File as ShapeDrawingFile;
28
use PhpOffice\PhpPresentation\Shape\Group;
29
use PhpOffice\PhpPresentation\Shape\Line;
30
use PhpOffice\PhpPresentation\Shape\Media;
31
use PhpOffice\PhpPresentation\Shape\Placeholder;
32
use PhpOffice\PhpPresentation\Shape\RichText;
33
use PhpOffice\PhpPresentation\Shape\RichText\BreakElement;
34
use PhpOffice\PhpPresentation\Shape\RichText\Run;
35
use PhpOffice\PhpPresentation\Shape\RichText\TextElement;
36
use PhpOffice\PhpPresentation\Shape\Table as ShapeTable;
37
use PhpOffice\PhpPresentation\Slide;
38
use PhpOffice\PhpPresentation\Slide\Note;
39
use PhpOffice\PhpPresentation\Style\Alignment;
40
use PhpOffice\PhpPresentation\Style\Bullet;
41
use PhpOffice\PhpPresentation\Style\Border;
42
use PhpOffice\PhpPresentation\Style\Shadow;
43
use PhpOffice\PhpPresentation\Slide\AbstractSlide as AbstractSlideAlias;
44
use PhpOffice\PhpPresentation\Slide\SlideMaster;
45
use PhpOffice\PhpPresentation\Slide\Background;
46
47
abstract class AbstractSlide extends AbstractDecoratorWriter
0 ignored issues
show
Complexity introduced by
The class AbstractSlide has a coupling between objects value of 30. Consider to reduce the number of dependencies under 30.
Loading history...
48
{
49
    /**
50
     * @param SlideMaster $pSlideMaster
51
     * @param $objWriter
52
     * @param $relId
53
     * @throws \Exception
54
     */
55 95
    protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, $objWriter, $relId)
56
    {
57 95
        if ($pSlideMaster->getShapeCollection()->count() > 0) {
58
            // Loop trough images and write relationships
59
            $iterator = $pSlideMaster->getShapeCollection()->getIterator();
60
            while ($iterator->valid()) {
61
                if ($iterator->current() instanceof ShapeDrawingFile || $iterator->current() instanceof ShapeDrawingGd) {
62
                    // Write relationship for image drawing
63
                    $this->writeRelationship(
64
                        $objWriter,
65
                        $relId,
66
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
67
                        '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename())
68
                    );
69
                    $iterator->current()->relationId = 'rId' . $relId;
70
                    ++$relId;
71
                } elseif ($iterator->current() instanceof ShapeChart) {
72
                    // Write relationship for chart drawing
73
                    $this->writeRelationship(
74
                        $objWriter,
75
                        $relId,
76
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
77
                        '../charts/' . $iterator->current()->getIndexedFilename()
78
                    );
79
                    $iterator->current()->relationId = 'rId' . $relId;
80
                    ++$relId;
81
                } elseif ($iterator->current() instanceof Group) {
82
                    $iterator2 = $iterator->current()->getShapeCollection()->getIterator();
83
                    while ($iterator2->valid()) {
84
                        if ($iterator2->current() instanceof ShapeDrawingFile ||
85
                            $iterator2->current() instanceof ShapeDrawingGd
86
                        ) {
87
                            // Write relationship for image drawing
88
                            $this->writeRelationship(
89
                                $objWriter,
90
                                $relId,
91
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
92
                                '../media/' . str_replace(' ', '_', $iterator2->current()->getIndexedFilename())
93
                            );
94
                            $iterator2->current()->relationId = 'rId' . $relId;
95
                            ++$relId;
96
                        } elseif ($iterator2->current() instanceof ShapeChart) {
97
                            // Write relationship for chart drawing
98
                            $this->writeRelationship(
99
                                $objWriter,
100
                                $relId,
101
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
102
                                '../charts/' . $iterator2->current()->getIndexedFilename()
103
                            );
104
                            $iterator2->current()->relationId = 'rId' . $relId;
105
                            ++$relId;
106
                        }
107
                        $iterator2->next();
108
                    }
109
                }
110
                $iterator->next();
111
            }
112
        }
113 95
    }
114
115
    /**
116
     * @param XMLWriter $objWriter
117
     * @param \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] $shapes
118
     * @param int $shapeId
119
     * @throws \Exception
120
     */
121 95
    protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), &$shapeId = 0)
122
    {
123 95
        if (count($shapes) == 0) {
124 95
            return;
125
        }
126 71
        foreach ($shapes as $shape) {
127
            // Increment $shapeId
128 71
            ++$shapeId;
129
            // Check type
130 71
            if ($shape instanceof RichText) {
131 22
                $this->writeShapeText($objWriter, $shape, $shapeId);
132
            } elseif ($shape instanceof ShapeTable) {
133 9
                $this->writeShapeTable($objWriter, $shape, $shapeId);
134
            } elseif ($shape instanceof Line) {
135 1
                $this->writeShapeLine($objWriter, $shape, $shapeId);
136
            } elseif ($shape instanceof ShapeChart) {
137 24
                $this->writeShapeChart($objWriter, $shape, $shapeId);
138
            } elseif ($shape instanceof AbstractGraphic) {
139 8
                $this->writeShapePic($objWriter, $shape, $shapeId);
140
            } elseif ($shape instanceof Group) {
141 1
                $this->writeShapeGroup($objWriter, $shape, $shapeId);
142
            } elseif ($shape instanceof Comment) {
143 7
                return;
144
            } else {
145 65
                throw new \Exception("Unknown Shape type: {get_class($shape)}");
146
            }
147
        }
148 65
    }
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
    protected function writeShapeText(XMLWriter $objWriter, RichText $shape, $shapeId)
159
    {
160
        // p:sp
161
        $objWriter->startElement('p:sp');
162
        // p:sp\p:nvSpPr
163
        $objWriter->startElement('p:nvSpPr');
164
        // p:sp\p:nvSpPr\p:cNvPr
165
        $objWriter->startElement('p:cNvPr');
166
        $objWriter->writeAttribute('id', $shapeId);
167
        if ($shape->isPlaceholder()) {
168
            $objWriter->writeAttribute('name', 'Placeholder for ' . $shape->getPlaceholder()->getType());
169
        } else {
170
            $objWriter->writeAttribute('name', '');
171
        }
172
        // Hyperlink
173
        if ($shape->hasHyperlink()) {
174
            $this->writeHyperlink($objWriter, $shape);
175
        }
176
        // > p:sp\p:nvSpPr
177
        $objWriter->endElement();
178
        // p:sp\p:cNvSpPr
179
        $objWriter->startElement('p:cNvSpPr');
180
        $objWriter->writeAttribute('txBox', '1');
181
        $objWriter->endElement();
182
        // p:sp\p:cNvSpPr\p:nvPr
183
        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
            $objWriter->writeElement('p:nvPr', null);
194
        }
195
        // > p:sp\p:cNvSpPr
196
        $objWriter->endElement();
197
        // p:sp\p:spPr
198
        $objWriter->startElement('p:spPr');
199
        // p:sp\p:spPr\a:xfrm
200
        $objWriter->startElement('a:xfrm');
201
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
202
        // p:sp\p:spPr\a:xfrm\a:off
203
        $objWriter->startElement('a:off');
204
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
205
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
206
        $objWriter->endElement();
207
        // p:sp\p:spPr\a:xfrm\a:ext
208
        $objWriter->startElement('a:ext');
209
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
210
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
211
        $objWriter->endElement();
212
        // > p:sp\p:spPr\a:xfrm
213
        $objWriter->endElement();
214
        // p:sp\p:spPr\a:prstGeom
215
        $objWriter->startElement('a:prstGeom');
216
        $objWriter->writeAttribute('prst', 'rect');
217
        $objWriter->endElement();
218
        $this->writeFill($objWriter, $shape->getFill());
219
        if ($shape->getBorder()->getLineStyle() != Border::LINE_NONE) {
220
            $this->writeBorder($objWriter, $shape->getBorder(), '');
221
        }
222
        if ($shape->getShadow()->isVisible()) {
223
            $this->writeShadow($objWriter, $shape->getShadow());
224
        }
225
        // > p:sp\p:spPr
226
        $objWriter->endElement();
227
        // p:txBody
228
        $objWriter->startElement('p:txBody');
229
        // a:bodyPr
230
        //@link :http://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.bodyproperties%28v=office.14%29.aspx
231
        $objWriter->startElement('a:bodyPr');
232
        $verticalAlign = $shape->getActiveParagraph()->getAlignment()->getVertical();
233
        if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
234
            $objWriter->writeAttribute('anchor', $verticalAlign);
235
        }
236
        if ($shape->getWrap() != RichText::WRAP_SQUARE) {
237
            $objWriter->writeAttribute('wrap', $shape->getWrap());
238
        }
239
        $objWriter->writeAttribute('rtlCol', '0');
240
        if ($shape->getHorizontalOverflow() != RichText::OVERFLOW_OVERFLOW) {
241
            $objWriter->writeAttribute('horzOverflow', $shape->getHorizontalOverflow());
242
        }
243
        if ($shape->getVerticalOverflow() != RichText::OVERFLOW_OVERFLOW) {
244
            $objWriter->writeAttribute('vertOverflow', $shape->getVerticalOverflow());
245
        }
246
        if ($shape->isUpright()) {
247
            $objWriter->writeAttribute('upright', '1');
248
        }
249
        if ($shape->isVertical()) {
250
            $objWriter->writeAttribute('vert', 'vert');
251
        }
252
        $objWriter->writeAttribute('bIns', CommonDrawing::pixelsToEmu($shape->getInsetBottom()));
253
        $objWriter->writeAttribute('lIns', CommonDrawing::pixelsToEmu($shape->getInsetLeft()));
254
        $objWriter->writeAttribute('rIns', CommonDrawing::pixelsToEmu($shape->getInsetRight()));
255
        $objWriter->writeAttribute('tIns', CommonDrawing::pixelsToEmu($shape->getInsetTop()));
256
        if ($shape->getColumns() <> 1) {
257
            $objWriter->writeAttribute('numCol', $shape->getColumns());
258
        }
259
        // a:spAutoFit
260
        $objWriter->startElement('a:' . $shape->getAutoFit());
261
        if ($shape->getAutoFit() == RichText::AUTOFIT_NORMAL) {
262
            if (!is_null($shape->getFontScale())) {
263
                $objWriter->writeAttribute('fontScale', (int)($shape->getFontScale() * 1000));
264
            }
265
            if (!is_null($shape->getLineSpaceReduction())) {
266
                $objWriter->writeAttribute('lnSpcReduction', (int)($shape->getLineSpaceReduction() * 1000));
267
            }
268
        }
269
        $objWriter->endElement();
270
        $objWriter->endElement();
271
        // a:lstStyle
272
        $objWriter->writeElement('a:lstStyle', null);
273
        if ($shape->isPlaceholder() &&
274
            ($shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ||
275
                $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_DATETIME)
276
        ) {
277
            $objWriter->startElement('a:p');
278
            $objWriter->startElement('a:fld');
279
            $objWriter->writeAttribute('id', $this->getGUID());
280
            $objWriter->writeAttribute('type', (
281
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? 'slidenum' : 'datetime'));
282
            $objWriter->writeElement('a:t', (
283
            $shape->getPlaceholder()->getType() == Placeholder::PH_TYPE_SLIDENUM ? '<nr.>' : '03-04-05'));
284
            $objWriter->endElement();
285
            $objWriter->endElement();
286
        } else {
287
            // Write paragraphs
288
            $this->writeParagraphs($objWriter, $shape->getParagraphs());
289
        }
290
        $objWriter->endElement();
291
        $objWriter->endElement();
292
    }
293
294
    /**
295
     * Write table
296
     *
297
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
298
     * @param  \PhpOffice\PhpPresentation\Shape\Table $shape
299
     * @param  int $shapeId
300
     * @throws \Exception
301
     */
302
    protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $shapeId)
303
    {
304
        // p:graphicFrame
305
        $objWriter->startElement('p:graphicFrame');
306
        // p:nvGraphicFramePr
307
        $objWriter->startElement('p:nvGraphicFramePr');
308
        // p:cNvPr
309
        $objWriter->startElement('p:cNvPr');
310
        $objWriter->writeAttribute('id', $shapeId);
311
        $objWriter->writeAttribute('name', $shape->getName());
312
        $objWriter->writeAttribute('descr', $shape->getDescription());
313
        $objWriter->endElement();
314
        // p:cNvGraphicFramePr
315
        $objWriter->startElement('p:cNvGraphicFramePr');
316
        // a:graphicFrameLocks
317
        $objWriter->startElement('a:graphicFrameLocks');
318
        $objWriter->writeAttribute('noGrp', '1');
319
        $objWriter->endElement();
320
        $objWriter->endElement();
321
        // p:nvPr
322
        $objWriter->writeElement('p:nvPr', null);
323
        $objWriter->endElement();
324
        // p:xfrm
325
        $objWriter->startElement('p:xfrm');
326
        // a:off
327
        $objWriter->startElement('a:off');
328
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
329
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
330
        $objWriter->endElement();
331
        // a:ext
332
        $objWriter->startElement('a:ext');
333
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
334
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
335
        $objWriter->endElement();
336
        $objWriter->endElement();
337
        // a:graphic
338
        $objWriter->startElement('a:graphic');
339
        // a:graphicData
340
        $objWriter->startElement('a:graphicData');
341
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/table');
342
        // a:tbl
343
        $objWriter->startElement('a:tbl');
344
        // a:tblPr
345
        $objWriter->startElement('a:tblPr');
346
        $objWriter->writeAttribute('firstRow', '1');
347
        $objWriter->writeAttribute('bandRow', '1');
348
        $objWriter->endElement();
349
        // a:tblGrid
350
        $objWriter->startElement('a:tblGrid');
351
        // Write cell widths
352
        $countCells = count($shape->getRow(0)->getCells());
353
        for ($cell = 0; $cell < $countCells; $cell++) {
354
            // a:gridCol
355
            $objWriter->startElement('a:gridCol');
356
            // Calculate column width
357
            $width = $shape->getRow(0)->getCell($cell)->getWidth();
358
            if ($width == 0) {
359
                $colCount = count($shape->getRow(0)->getCells());
360
                $totalWidth = $shape->getWidth();
361
                $width = $totalWidth / $colCount;
362
            }
363
            $objWriter->writeAttribute('w', CommonDrawing::pixelsToEmu($width));
364
            $objWriter->endElement();
365
        }
366
        $objWriter->endElement();
367
        // Colspan / rowspan containers
368
        $colSpan = array();
369
        $rowSpan = array();
370
        // Default border style
371
        $defaultBorder = new Border();
372
        // Write rows
373
        $countRows = count($shape->getRows());
374
        for ($row = 0; $row < $countRows; $row++) {
375
            // a:tr
376
            $objWriter->startElement('a:tr');
377
            $objWriter->writeAttribute('h', CommonDrawing::pixelsToEmu($shape->getRow($row)->getHeight()));
378
            // Write cells
379
            $countCells = count($shape->getRow($row)->getCells());
380
            for ($cell = 0; $cell < $countCells; $cell++) {
381
                // Current cell
382
                $currentCell = $shape->getRow($row)->getCell($cell);
383
                // Next cell right
384
                $nextCellRight = $shape->getRow($row)->getCell($cell + 1, true);
385
                // Next cell below
386
                $nextRowBelow = $shape->getRow($row + 1, true);
387
                $nextCellBelow = null;
388
                if ($nextRowBelow != null) {
389
                    $nextCellBelow = $nextRowBelow->getCell($cell, true);
390
                }
391
                // a:tc
392
                $objWriter->startElement('a:tc');
393
                // Colspan
394
                if ($currentCell->getColSpan() > 1) {
395
                    $objWriter->writeAttribute('gridSpan', $currentCell->getColSpan());
396
                    $colSpan[$row] = $currentCell->getColSpan() - 1;
397
                } elseif (isset($colSpan[$row]) && $colSpan[$row] > 0) {
398
                    $colSpan[$row]--;
399
                    $objWriter->writeAttribute('hMerge', '1');
400
                }
401
                // Rowspan
402
                if ($currentCell->getRowSpan() > 1) {
403
                    $objWriter->writeAttribute('rowSpan', $currentCell->getRowSpan());
404
                    $rowSpan[$cell] = $currentCell->getRowSpan() - 1;
405
                } elseif (isset($rowSpan[$cell]) && $rowSpan[$cell] > 0) {
406
                    $rowSpan[$cell]--;
407
                    $objWriter->writeAttribute('vMerge', '1');
408
                }
409
                // a:txBody
410
                $objWriter->startElement('a:txBody');
411
                // a:bodyPr
412
                $objWriter->startElement('a:bodyPr');
413
                $objWriter->writeAttribute('wrap', 'square');
414
                $objWriter->writeAttribute('rtlCol', '0');
415
                // a:spAutoFit
416
                $objWriter->writeElement('a:spAutoFit', null);
417
                $objWriter->endElement();
418
                // a:lstStyle
419
                $objWriter->writeElement('a:lstStyle', null);
420
                // Write paragraphs
421
                $this->writeParagraphs($objWriter, $currentCell->getParagraphs());
422
                $objWriter->endElement();
423
                // a:tcPr
424
                $objWriter->startElement('a:tcPr');
425
                // Alignment (horizontal)
426
                $firstParagraph = $currentCell->getParagraph(0);
427
                $verticalAlign = $firstParagraph->getAlignment()->getVertical();
428
                if ($verticalAlign != Alignment::VERTICAL_BASE && $verticalAlign != Alignment::VERTICAL_AUTO) {
429
                    $objWriter->writeAttribute('anchor', $verticalAlign);
430
                }
431
                // Determine borders
432
                $borderLeft = $currentCell->getBorders()->getLeft();
433
                $borderRight = $currentCell->getBorders()->getRight();
434
                $borderTop = $currentCell->getBorders()->getTop();
435
                $borderBottom = $currentCell->getBorders()->getBottom();
436
                $borderDiagonalDown = $currentCell->getBorders()->getDiagonalDown();
437
                $borderDiagonalUp = $currentCell->getBorders()->getDiagonalUp();
438
                // Fix PowerPoint implementation
439
                if (!is_null($nextCellRight)
440
                    && $nextCellRight->getBorders()->getRight()->getHashCode() != $defaultBorder->getHashCode()
441
                ) {
442
                    $borderRight = $nextCellRight->getBorders()->getLeft();
443
                }
444
                if (!is_null($nextCellBelow)
445
                    && $nextCellBelow->getBorders()->getBottom()->getHashCode() != $defaultBorder->getHashCode()
446
                ) {
447
                    $borderBottom = $nextCellBelow->getBorders()->getTop();
448
                }
449
                // Write borders
450
                $this->writeBorder($objWriter, $borderLeft, 'L');
451
                $this->writeBorder($objWriter, $borderRight, 'R');
452
                $this->writeBorder($objWriter, $borderTop, 'T');
453
                $this->writeBorder($objWriter, $borderBottom, 'B');
454
                $this->writeBorder($objWriter, $borderDiagonalDown, 'TlToBr');
455
                $this->writeBorder($objWriter, $borderDiagonalUp, 'BlToTr');
456
                // Fill
457
                $this->writeFill($objWriter, $currentCell->getFill());
458
                $objWriter->endElement();
459
                $objWriter->endElement();
460
            }
461
            $objWriter->endElement();
462
        }
463
        $objWriter->endElement();
464
        $objWriter->endElement();
465
        $objWriter->endElement();
466
        $objWriter->endElement();
467
    }
468
469
    /**
470
     * Write paragraphs
471
     *
472
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
473
     * @param  \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] $paragraphs
474
     * @throws \Exception
475
     */
476
    protected function writeParagraphs(XMLWriter $objWriter, $paragraphs)
477
    {
478
        // Loop trough paragraphs
479
        foreach ($paragraphs as $paragraph) {
480
            // a:p
481
            $objWriter->startElement('a:p');
482
            // a:pPr
483
            $objWriter->startElement('a:pPr');
484
            $objWriter->writeAttribute('algn', $paragraph->getAlignment()->getHorizontal());
485
            $objWriter->writeAttribute('fontAlgn', $paragraph->getAlignment()->getVertical());
486
            $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getMarginLeft()));
487
            $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu(
488
                $paragraph->getAlignment()->getMarginRight()
489
            ));
490
            $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($paragraph->getAlignment()->getIndent()));
491
            $objWriter->writeAttribute('lvl', $paragraph->getAlignment()->getLevel());
492
            // Bullet type specified?
493
            if ($paragraph->getBulletStyle()->getBulletType() != Bullet::TYPE_NONE) {
494
                // a:buFont
495
                $objWriter->startElement('a:buFont');
496
                $objWriter->writeAttribute('typeface', $paragraph->getBulletStyle()->getBulletFont());
497
                $objWriter->endElement();
498
                if ($paragraph->getBulletStyle()->getBulletType() == Bullet::TYPE_BULLET) {
499
                    // a:buChar
500
                    $objWriter->startElement('a:buChar');
501
                    $objWriter->writeAttribute('char', $paragraph->getBulletStyle()->getBulletChar());
502
                    $objWriter->endElement();
503
                } elseif ($paragraph->getBulletStyle()->getBulletType() == Bullet::TYPE_NUMERIC) {
504
                    // a:buAutoNum
505
                    $objWriter->startElement('a:buAutoNum');
506
                    $objWriter->writeAttribute('type', $paragraph->getBulletStyle()->getBulletNumericStyle());
507
                    if ($paragraph->getBulletStyle()->getBulletNumericStartAt() != 1) {
508
                        $objWriter->writeAttribute('startAt', $paragraph->getBulletStyle()->getBulletNumericStartAt());
509
                    }
510
                    $objWriter->endElement();
511
                }
512
            }
513
            $objWriter->endElement();
514
            // Loop trough rich text elements
515
            $elements = $paragraph->getRichTextElements();
516
            foreach ($elements as $element) {
517
                if ($element instanceof BreakElement) {
518
                    // a:br
519
                    $objWriter->writeElement('a:br', null);
520
                } elseif ($element instanceof Run || $element instanceof TextElement) {
521
                    // a:r
522
                    $objWriter->startElement('a:r');
523
                    // a:rPr
524
                    if ($element instanceof Run) {
525
                        // a:rPr
526
                        $objWriter->startElement('a:rPr');
527
                        // Lang
528
                        $objWriter->writeAttribute('lang', ($element->getLanguage() ?
529
                            $element->getLanguage() : 'en-US'));
530
                        // Bold
531
                        $objWriter->writeAttribute('b', ($element->getFont()->isBold() ? '1' : '0'));
532
                        // Italic
533
                        $objWriter->writeAttribute('i', ($element->getFont()->isItalic() ? '1' : '0'));
534
                        // Strikethrough
535
                        $objWriter->writeAttribute('strike', ($element->getFont()->isStrikethrough() ?
536
                            'sngStrike' : 'noStrike'));
537
                        // Size
538
                        $objWriter->writeAttribute('sz', ($element->getFont()->getSize() * 100));
539
                        // Underline
540
                        $objWriter->writeAttribute('u', $element->getFont()->getUnderline());
541
                        // Superscript / subscript
542
                        if ($element->getFont()->isSuperScript() || $element->getFont()->isSubScript()) {
543
                            if ($element->getFont()->isSuperScript()) {
544
                                $objWriter->writeAttribute('baseline', '30000');
545
                            } elseif ($element->getFont()->isSubScript()) {
546
                                $objWriter->writeAttribute('baseline', '-25000');
547
                            }
548
                        }
549
                        // Color - a:solidFill
550
                        $objWriter->startElement('a:solidFill');
551
                        // a:srgbClr
552
                        $objWriter->startElement('a:srgbClr');
553
                        $objWriter->writeAttribute('val', $element->getFont()->getColor()->getRGB());
554
                        $objWriter->endElement();
555
                        $objWriter->endElement();
556
                        // Font - a:latin
557
                        $objWriter->startElement('a:latin');
558
                        $objWriter->writeAttribute('typeface', $element->getFont()->getName());
559
                        $objWriter->endElement();
560
                        // a:hlinkClick
561
                        if ($element->hasHyperlink()) {
562
                            $this->writeHyperlink($objWriter, $element);
563
                        }
564
                        $objWriter->endElement();
565
                    }
566
                    // t
567
                    $objWriter->startElement('a:t');
568
                    $objWriter->writeCData(Text::controlCharacterPHP2OOXML($element->getText()));
569
                    $objWriter->endElement();
570
                    $objWriter->endElement();
571
                }
572
            }
573
            $objWriter->endElement();
574
        }
575
    }
576
577
    /**
578
     * Write Line Shape
579
     *
580
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
581
     * @param \PhpOffice\PhpPresentation\Shape\Line $shape
582
     * @param  int $shapeId
583
     */
584
    protected function writeShapeLine(XMLWriter $objWriter, Line $shape, $shapeId)
585
    {
586
        // p:sp
587
        $objWriter->startElement('p:cxnSp');
588
        // p:nvSpPr
589
        $objWriter->startElement('p:nvCxnSpPr');
590
        // p:cNvPr
591
        $objWriter->startElement('p:cNvPr');
592
        $objWriter->writeAttribute('id', $shapeId);
593
        $objWriter->writeAttribute('name', '');
594
        $objWriter->endElement();
595
        // p:cNvCxnSpPr
596
        $objWriter->writeElement('p:cNvCxnSpPr', null);
597
        // p:nvPr
598
        $objWriter->writeElement('p:nvPr', null);
599
        $objWriter->endElement();
600
        // p:spPr
601
        $objWriter->startElement('p:spPr');
602
        // a:xfrm
603
        $objWriter->startElement('a:xfrm');
604
        if ($shape->getWidth() >= 0 && $shape->getHeight() >= 0) {
605
            // a:off
606
            $objWriter->startElement('a:off');
607
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
608
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
609
            $objWriter->endElement();
610
            // a:ext
611
            $objWriter->startElement('a:ext');
612
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
613
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
614
            $objWriter->endElement();
615
        } elseif ($shape->getWidth() < 0 && $shape->getHeight() < 0) {
616
            // a:off
617
            $objWriter->startElement('a:off');
618
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
619
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
620
            $objWriter->endElement();
621
            // a:ext
622
            $objWriter->startElement('a:ext');
623
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
624
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
625
            $objWriter->endElement();
626
        } elseif ($shape->getHeight() < 0) {
627
            $objWriter->writeAttribute('flipV', 1);
628
            // a:off
629
            $objWriter->startElement('a:off');
630
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
631
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY() + $shape->getHeight()));
632
            $objWriter->endElement();
633
            // a:ext
634
            $objWriter->startElement('a:ext');
635
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
636
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu(-$shape->getHeight()));
637
            $objWriter->endElement();
638
        } elseif ($shape->getWidth() < 0) {
639
            $objWriter->writeAttribute('flipV', 1);
640
            // a:off
641
            $objWriter->startElement('a:off');
642
            $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX() + $shape->getWidth()));
643
            $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
644
            $objWriter->endElement();
645
            // a:ext
646
            $objWriter->startElement('a:ext');
647
            $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu(-$shape->getWidth()));
648
            $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
649
            $objWriter->endElement();
650
        }
651
        $objWriter->endElement();
652
        // a:prstGeom
653
        $objWriter->startElement('a:prstGeom');
654
        $objWriter->writeAttribute('prst', 'line');
655
        $objWriter->endElement();
656
        if ($shape->getBorder()->getLineStyle() != Border::LINE_NONE) {
657
            $this->writeBorder($objWriter, $shape->getBorder(), '');
658
        }
659
        $objWriter->endElement();
660
        $objWriter->endElement();
661
    }
662
663
    /**
664
     * Write Shadow
665
     * @param XMLWriter $objWriter
666
     * @param Shadow $oShadow
667
     */
668 23
    protected function writeShadow(XMLWriter $objWriter, $oShadow)
669
    {
670 23
        if (!($oShadow instanceof Shadow)) {
671
            return;
672
        }
673
674 23
        if (!$oShadow->isVisible()) {
675 21
            return;
676
        }
677
678
        // a:effectLst
679 2
        $objWriter->startElement('a:effectLst');
680
681
        // a:outerShdw
682 2
        $objWriter->startElement('a:outerShdw');
683 2
        $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($oShadow->getBlurRadius()));
684 2
        $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($oShadow->getDistance()));
685 2
        $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($oShadow->getDirection()));
686 2
        $objWriter->writeAttribute('algn', $oShadow->getAlignment());
687 2
        $objWriter->writeAttribute('rotWithShape', '0');
688
689 2
        $this->writeColor($objWriter, $oShadow->getColor(), $oShadow->getAlpha());
690
691 2
        $objWriter->endElement();
692
693 2
        $objWriter->endElement();
694 2
    }
695
696
    /**
697
     * Write hyperlink
698
     *
699
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
700
     * @param \PhpOffice\PhpPresentation\AbstractShape|\PhpOffice\PhpPresentation\Shape\RichText\TextElement $shape
701
     */
702
    protected function writeHyperlink(XMLWriter $objWriter, $shape)
703
    {
704
        // a:hlinkClick
705
        $objWriter->startElement('a:hlinkClick');
706
        $objWriter->writeAttribute('r:id', $shape->getHyperlink()->relationId);
707
        $objWriter->writeAttribute('tooltip', $shape->getHyperlink()->getTooltip());
708
        if ($shape->getHyperlink()->isInternal()) {
709
            $objWriter->writeAttribute('action', $shape->getHyperlink()->getUrl());
710
        }
711
        $objWriter->endElement();
712
    }
713
714
    /**
715
     * Write Note Slide
716
     * @param Note $pNote
717
     * @throws \Exception
718
     * @return  string
719
     */
720
    protected function writeNote(Note $pNote)
721
    {
722
        // Create XML writer
723
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
724
        // XML header
725
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
726
        // p:notes
727
        $objWriter->startElement('p:notes');
728
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
729
        $objWriter->writeAttribute('xmlns:p', 'http://schemas.openxmlformats.org/presentationml/2006/main');
730
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
731
        // p:cSld
732
        $objWriter->startElement('p:cSld');
733
        // p:spTree
734
        $objWriter->startElement('p:spTree');
735
        // p:nvGrpSpPr
736
        $objWriter->startElement('p:nvGrpSpPr');
737
        // p:cNvPr
738
        $objWriter->startElement('p:cNvPr');
739
        $objWriter->writeAttribute('id', '1');
740
        $objWriter->writeAttribute('name', '');
741
        $objWriter->endElement();
742
        // p:cNvGrpSpPr
743
        $objWriter->writeElement('p:cNvGrpSpPr', null);
744
        // p:nvPr
745
        $objWriter->writeElement('p:nvPr', null);
746
        // ## p:nvGrpSpPr
747
        $objWriter->endElement();
748
        // p:grpSpPr
749
        $objWriter->startElement('p:grpSpPr');
750
        // a:xfrm
751
        $objWriter->startElement('a:xfrm');
752
        // a:off
753
        $objWriter->startElement('a:off');
754
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
755
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($pNote->getOffsetY()));
756
        $objWriter->endElement(); // a:off
757
        // a:ext
758
        $objWriter->startElement('a:ext');
759
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($pNote->getExtentX()));
760
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($pNote->getExtentY()));
761
        $objWriter->endElement(); // a:ext
762
        // a:chOff
763
        $objWriter->startElement('a:chOff');
764
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($pNote->getOffsetX()));
765
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($pNote->getOffsetY()));
766
        $objWriter->endElement(); // a:chOff
767
        // a:chExt
768
        $objWriter->startElement('a:chExt');
769
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($pNote->getExtentX()));
770
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($pNote->getExtentY()));
771
        $objWriter->endElement(); // a:chExt
772
        // ## a:xfrm
773
        $objWriter->endElement();
774
        // ## p:grpSpPr
775
        $objWriter->endElement();
776
        // p:sp
777
        $objWriter->startElement('p:sp');
778
        // p:nvSpPr
779
        $objWriter->startElement('p:nvSpPr');
780
        $objWriter->startElement('p:cNvPr');
781
        $objWriter->writeAttribute('id', '1');
782
        $objWriter->writeAttribute('name', 'Notes Placeholder');
783
        $objWriter->endElement();
784
        // p:cNvSpPr
785
        $objWriter->startElement('p:cNvSpPr');
786
        //a:spLocks
787
        $objWriter->startElement('a:spLocks');
788
        $objWriter->writeAttribute('noGrp', '1');
789
        $objWriter->endElement();
790
        // ## p:cNvSpPr
791
        $objWriter->endElement();
792
        // p:nvPr
793
        $objWriter->startElement('p:nvPr');
794
        $objWriter->startElement('p:ph');
795
        $objWriter->writeAttribute('type', 'body');
796
        $objWriter->writeAttribute('idx', '1');
797
        $objWriter->endElement();
798
        // ## p:nvPr
799
        $objWriter->endElement();
800
        // ## p:nvSpPr
801
        $objWriter->endElement();
802
        $objWriter->writeElement('p:spPr', null);
803
        // p:txBody
804
        $objWriter->startElement('p:txBody');
805
        $objWriter->writeElement('a:bodyPr', null);
806
        $objWriter->writeElement('a:lstStyle', null);
807
        // Loop shapes
808
        $shapes = $pNote->getShapeCollection();
809
        foreach ($shapes as $shape) {
810
            // Check type
811
            if ($shape instanceof RichText) {
812
                $paragraphs = $shape->getParagraphs();
813
                $this->writeParagraphs($objWriter, $paragraphs);
814
            }
815
        }
816
        // ## p:txBody
817
        $objWriter->endElement();
818
        // ## p:sp
819
        $objWriter->endElement();
820
        // ## p:spTree
821
        $objWriter->endElement();
822
        // ## p:cSld
823
        $objWriter->endElement();
824
        // ## p:notes
825
        $objWriter->endElement();
826
        // Return
827
        return $objWriter->getData();
828
    }
829
830
    /**
831
     * Write chart
832
     *
833
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
834
     * @param \PhpOffice\PhpPresentation\Shape\Chart $shape
835
     * @param  int $shapeId
836
     */
837
    protected function writeShapeChart(XMLWriter $objWriter, ShapeChart $shape, $shapeId)
838
    {
839
        // p:graphicFrame
840
        $objWriter->startElement('p:graphicFrame');
841
        // p:nvGraphicFramePr
842
        $objWriter->startElement('p:nvGraphicFramePr');
843
        // p:cNvPr
844
        $objWriter->startElement('p:cNvPr');
845
        $objWriter->writeAttribute('id', $shapeId);
846
        $objWriter->writeAttribute('name', $shape->getName());
847
        $objWriter->writeAttribute('descr', $shape->getDescription());
848
        $objWriter->endElement();
849
        // p:cNvGraphicFramePr
850
        $objWriter->writeElement('p:cNvGraphicFramePr', null);
851
        // p:nvPr
852
        $objWriter->writeElement('p:nvPr', null);
853
        $objWriter->endElement();
854
        // p:xfrm
855
        $objWriter->startElement('p:xfrm');
856
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
857
        // a:off
858
        $objWriter->startElement('a:off');
859
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
860
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
861
        $objWriter->endElement();
862
        // a:ext
863
        $objWriter->startElement('a:ext');
864
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
865
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
866
        $objWriter->endElement();
867
        $objWriter->endElement();
868
        // a:graphic
869
        $objWriter->startElement('a:graphic');
870
        // a:graphicData
871
        $objWriter->startElement('a:graphicData');
872
        $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
873
        // c:chart
874
        $objWriter->startElement('c:chart');
875
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
876
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
877
        $objWriter->writeAttribute('r:id', $shape->relationId);
878
        $objWriter->endElement();
879
        $objWriter->endElement();
880
        $objWriter->endElement();
881
        $objWriter->endElement();
882
    }
883
884
    /**
885
     * Write pic
886
     *
887
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
888
     * @param  \PhpOffice\PhpPresentation\Shape\AbstractGraphic $shape
889
     * @param  int $shapeId
890
     * @throws \Exception
891
     */
892 8
    protected function writeShapePic(XMLWriter $objWriter, AbstractGraphic $shape, $shapeId)
893
    {
894
        // p:pic
895 8
        $objWriter->startElement('p:pic');
896
        // p:nvPicPr
897 8
        $objWriter->startElement('p:nvPicPr');
898
        // p:cNvPr
899 8
        $objWriter->startElement('p:cNvPr');
900 8
        $objWriter->writeAttribute('id', $shapeId);
901 8
        $objWriter->writeAttribute('name', $shape->getName());
902 8
        $objWriter->writeAttribute('descr', $shape->getDescription());
903
        // a:hlinkClick
904 8
        if ($shape->hasHyperlink()) {
905 1
            $this->writeHyperlink($objWriter, $shape);
906
        }
907 8
        $objWriter->endElement();
908
        // p:cNvPicPr
909 8
        $objWriter->startElement('p:cNvPicPr');
910
        // a:picLocks
911 8
        $objWriter->startElement('a:picLocks');
912 8
        $objWriter->writeAttribute('noChangeAspect', '1');
913 8
        $objWriter->endElement();
914 8
        $objWriter->endElement();
915
        // p:nvPr
916 8
        $objWriter->startElement('p:nvPr');
917
        /**
918
         * @link : https://github.com/stefslon/exportToPPTX/blob/master/exportToPPTX.m#L2128
919
         */
920 8
        if ($shape instanceof Media) {
921
            // p:nvPr > a:videoFile
922 1
            $objWriter->startElement('a:videoFile');
923 1
            $objWriter->writeAttribute('r:link', $shape->relationId);
924 1
            $objWriter->endElement();
925
            // p:nvPr > p:extLst
926 1
            $objWriter->startElement('p:extLst');
927
            // p:nvPr > p:extLst > p:ext
928 1
            $objWriter->startElement('p:ext');
929 1
            $objWriter->writeAttribute('uri', '{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}');
930
            // p:nvPr > p:extLst > p:ext > p14:media
931 1
            $objWriter->startElement('p14:media');
932 1
            $objWriter->writeAttribute('r:embed', $shape->relationId);
933 1
            $objWriter->writeAttribute('xmlns:p14', 'http://schemas.microsoft.com/office/powerpoint/2010/main');
934
            // p:nvPr > p:extLst > p:ext > ##p14:media
935 1
            $objWriter->endElement();
936
            // p:nvPr > p:extLst > ##p:ext
937 1
            $objWriter->endElement();
938
            // p:nvPr > ##p:extLst
939 1
            $objWriter->endElement();
940
        }
941
        // ##p:nvPr
942 8
        $objWriter->endElement();
943 8
        $objWriter->endElement();
944
        // p:blipFill
945 8
        $objWriter->startElement('p:blipFill');
946
        // a:blip
947 8
        $objWriter->startElement('a:blip');
948 8
        $objWriter->writeAttribute('r:embed', $shape->relationId);
949 8
        $objWriter->endElement();
950
        // a:stretch
951 8
        $objWriter->startElement('a:stretch');
952 8
        $objWriter->writeElement('a:fillRect', null);
953 8
        $objWriter->endElement();
954 8
        $objWriter->endElement();
955
        // p:spPr
956 8
        $objWriter->startElement('p:spPr');
957
        // a:xfrm
958 8
        $objWriter->startElement('a:xfrm');
959 8
        $objWriter->writeAttributeIf($shape->getRotation() != 0, 'rot', CommonDrawing::degreesToAngle($shape->getRotation()));
960
        // a:off
961 8
        $objWriter->startElement('a:off');
962 8
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($shape->getOffsetX()));
963 8
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($shape->getOffsetY()));
964 8
        $objWriter->endElement();
965
        // a:ext
966 8
        $objWriter->startElement('a:ext');
967 8
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($shape->getWidth()));
968 8
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($shape->getHeight()));
969 8
        $objWriter->endElement();
970 8
        $objWriter->endElement();
971
        // a:prstGeom
972 8
        $objWriter->startElement('a:prstGeom');
973 8
        $objWriter->writeAttribute('prst', 'rect');
974
        // a:avLst
975 8
        $objWriter->writeElement('a:avLst', null);
976 8
        $objWriter->endElement();
977 8
        if ($shape->getBorder()->getLineStyle() != Border::LINE_NONE) {
978 1
            $this->writeBorder($objWriter, $shape->getBorder(), '');
979
        }
980 8
        if ($shape->getShadow()->isVisible()) {
981 1
            $this->writeShadow($objWriter, $shape->getShadow());
982
        }
983 8
        $objWriter->endElement();
984 8
        $objWriter->endElement();
985 8
    }
986
987
    /**
988
     * Write group
989
     *
990
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
991
     * @param \PhpOffice\PhpPresentation\Shape\Group $group
992
     * @param  int $shapeId
993
     */
994
    protected function writeShapeGroup(XMLWriter $objWriter, Group $group, &$shapeId)
995
    {
996
        // p:grpSp
997
        $objWriter->startElement('p:grpSp');
998
        // p:nvGrpSpPr
999
        $objWriter->startElement('p:nvGrpSpPr');
1000
        // p:cNvPr
1001
        $objWriter->startElement('p:cNvPr');
1002
        $objWriter->writeAttribute('name', 'Group ' . $shapeId++);
1003
        $objWriter->writeAttribute('id', $shapeId);
1004
        $objWriter->endElement(); // p:cNvPr
1005
        // NOTE: Re: $shapeId This seems to be how PowerPoint 2010 does business.
1006
        // p:cNvGrpSpPr
1007
        $objWriter->writeElement('p:cNvGrpSpPr', null);
1008
        // p:nvPr
1009
        $objWriter->writeElement('p:nvPr', null);
1010
        $objWriter->endElement(); // p:nvGrpSpPr
1011
        // p:grpSpPr
1012
        $objWriter->startElement('p:grpSpPr');
1013
        // a:xfrm
1014
        $objWriter->startElement('a:xfrm');
1015
        // a:off
1016
        $objWriter->startElement('a:off');
1017
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($group->getOffsetX()));
1018
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($group->getOffsetY()));
1019
        $objWriter->endElement(); // a:off
1020
        // a:ext
1021
        $objWriter->startElement('a:ext');
1022
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($group->getExtentX()));
1023
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($group->getExtentY()));
1024
        $objWriter->endElement(); // a:ext
1025
        // a:chOff
1026
        $objWriter->startElement('a:chOff');
1027
        $objWriter->writeAttribute('x', CommonDrawing::pixelsToEmu($group->getOffsetX()));
1028
        $objWriter->writeAttribute('y', CommonDrawing::pixelsToEmu($group->getOffsetY()));
1029
        $objWriter->endElement(); // a:chOff
1030
        // a:chExt
1031
        $objWriter->startElement('a:chExt');
1032
        $objWriter->writeAttribute('cx', CommonDrawing::pixelsToEmu($group->getExtentX()));
1033
        $objWriter->writeAttribute('cy', CommonDrawing::pixelsToEmu($group->getExtentY()));
1034
        $objWriter->endElement(); // a:chExt
1035
        $objWriter->endElement(); // a:xfrm
1036
        $objWriter->endElement(); // p:grpSpPr
1037
1038
        $this->writeShapeCollection($objWriter, $group->getShapeCollection(), $shapeId);
1039
1040
        $objWriter->endElement(); // p:grpSp
1041
    }
1042
1043
    /**
1044
     * @param \PhpOffice\PhpPresentation\Slide\AbstractSlide $pSlide
1045
     * @param $objWriter
1046
     */
1047 95
    protected function writeSlideBackground(AbstractSlideAlias $pSlide, XMLWriter $objWriter)
1048
    {
1049 95
        if (!($pSlide->getBackground() instanceof Slide\AbstractBackground)) {
1050 95
            return;
1051
        }
1052 95
        $oBackground = $pSlide->getBackground();
1053
        // p:bg
1054 95
        $objWriter->startElement('p:bg');
1055 95
        if ($oBackground instanceof Slide\Background\Color) {
1056
            // p:bgPr
1057 95
            $objWriter->startElement('p:bgPr');
1058
            // a:solidFill
1059 95
            $objWriter->startElement('a:solidFill');
1060
            // a:srgbClr
1061 95
            $objWriter->startElement('a:srgbClr');
1062 95
            $objWriter->writeAttribute('val', $oBackground->getColor()->getRGB());
1063 95
            $objWriter->endElement();
1064
            // > a:solidFill
1065 95
            $objWriter->endElement();
1066
            // > p:bgPr
1067 95
            $objWriter->endElement();
1068
        }
1069 95
        if ($oBackground instanceof Slide\Background\Image) {
1070
            // p:bgPr
1071
            $objWriter->startElement('p:bgPr');
1072
            // a:blipFill
1073
            $objWriter->startElement('a:blipFill');
1074
            // a:blip
1075
            $objWriter->startElement('a:blip');
1076
            $objWriter->writeAttribute('r:embed', $oBackground->relationId);
1077
            // > a:blipFill
1078
            $objWriter->endElement();
1079
            // a:stretch
1080
            $objWriter->startElement('a:stretch');
1081
            // a:fillRect
1082
            $objWriter->writeElement('a:fillRect');
1083
            // > a:stretch
1084
            $objWriter->endElement();
1085
            // > a:blipFill
1086
            $objWriter->endElement();
1087
            // > p:bgPr
1088
            $objWriter->endElement();
1089
        }
1090
        /**
1091
         * @link : http://www.officeopenxml.com/prSlide-background.php
1092
         */
1093 95
        if ($oBackground instanceof Slide\Background\SchemeColor) {
1094
            // p:bgRef
1095
            $objWriter->startElement('p:bgRef');
1096
            $objWriter->writeAttribute('idx', '1001');
1097
            // a:schemeClr
1098
            $objWriter->startElement('a:schemeClr');
1099
            $objWriter->writeAttribute('val', $oBackground->getSchemeColor()->getValue());
1100
            $objWriter->endElement();
1101
            // > p:bgRef
1102
            $objWriter->endElement();
1103
        }
1104
        // > p:bg
1105 95
        $objWriter->endElement();
1106 95
    }
1107
1108
    private function getGUID()
1109
    {
1110
        if (function_exists('com_create_guid')) {
1111
            return com_create_guid();
1112
        } else {
1113
            mt_srand((double)microtime() * 10000);//optional for php 4.2.0 and up.
1114
            $charid = strtoupper(md5(uniqid(rand(), true)));
1115
            $hyphen = chr(45);// "-"
1116
            $uuid = chr(123)// "{"
1117
                . substr($charid, 0, 8) . $hyphen
1118
                . substr($charid, 8, 4) . $hyphen
1119
                . substr($charid, 12, 4) . $hyphen
1120
                . substr($charid, 16, 4) . $hyphen
1121
                . substr($charid, 20, 12)
1122
                . chr(125);// "}"
1123
            return $uuid;
1124
        }
1125
    }
1126
}
1127