Completed
Pull Request — develop (#230)
by Franck
09:23
created

AbstractSlide::writeParagraphs()   D

Complexity

Conditions 20
Paths 61

Size

Total Lines 100
Code Lines 63

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 420

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 100
ccs 0
cts 75
cp 0
rs 4.7294
cc 20
eloc 63
nc 61
nop 2
crap 420

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