Completed
Pull Request — develop (#230)
by Franck
07:05
created

AbstractSlide::writeShapeTable()   F

Complexity

Conditions 18
Paths 438

Size

Total Lines 166
Code Lines 113

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 342

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 166
ccs 0
cts 1
cp 0
rs 3.4706
cc 18
eloc 113
nc 438
nop 3
crap 342

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\AbstractDrawing;
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\Placeholder;
30
use PhpOffice\PhpPresentation\Shape\RichText;
31
use PhpOffice\PhpPresentation\Shape\RichText\BreakElement;
32
use PhpOffice\PhpPresentation\Shape\RichText\Run;
33
use PhpOffice\PhpPresentation\Shape\RichText\TextElement;
34
use PhpOffice\PhpPresentation\Shape\Table as ShapeTable;
35
use PhpOffice\PhpPresentation\Slide;
36
use PhpOffice\PhpPresentation\Slide\Note;
37
use PhpOffice\PhpPresentation\Style\Alignment;
38
use PhpOffice\PhpPresentation\Style\Bullet;
39
use PhpOffice\PhpPresentation\Style\Border;
40
use PhpOffice\PhpPresentation\Style\Shadow;
41
use PhpOffice\PhpPresentation\Slide\AbstractSlide as AbstractSlideAlias;
42
use PhpOffice\PhpPresentation\Slide\SlideMaster;
43
use PhpOffice\PhpPresentation\Slide\Background;
44
45
abstract class AbstractSlide extends AbstractDecoratorWriter
46
{
47
    /**
48
     * @param SlideMaster $pSlideMaster
49
     * @param $objWriter
50
     * @param $relId
51
     * @throws \Exception
52
     */
53 95
    protected function writeDrawingRelations(AbstractSlideAlias $pSlideMaster, $objWriter, $relId)
54
    {
55 95
        if ($pSlideMaster->getShapeCollection()->count() > 0) {
56
            // Loop trough images and write relationships
57
            $iterator = $pSlideMaster->getShapeCollection()->getIterator();
58
            while ($iterator->valid()) {
59
                if ($iterator->current() instanceof ShapeDrawingFile || $iterator->current() instanceof ShapeDrawingGd) {
60
                    // Write relationship for image drawing
61
                    $this->writeRelationship(
62
                        $objWriter,
63
                        $relId,
64
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
65
                        '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename())
66
                    );
67
                    $iterator->current()->relationId = 'rId' . $relId;
68
                    ++$relId;
69
                } elseif ($iterator->current() instanceof ShapeChart) {
70
                    // Write relationship for chart drawing
71
                    $this->writeRelationship(
72
                        $objWriter,
73
                        $relId,
74
                        'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
75
                        '../charts/' . $iterator->current()->getIndexedFilename()
76
                    );
77
                    $iterator->current()->relationId = 'rId' . $relId;
78
                    ++$relId;
79
                } elseif ($iterator->current() instanceof Group) {
80
                    $iterator2 = $iterator->current()->getShapeCollection()->getIterator();
81
                    while ($iterator2->valid()) {
82
                        if ($iterator2->current() instanceof ShapeDrawingFile ||
83
                            $iterator2->current() instanceof ShapeDrawingGd
84
                        ) {
85
                            // Write relationship for image drawing
86
                            $this->writeRelationship(
87
                                $objWriter,
88
                                $relId,
89
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image',
90
                                '../media/' . str_replace(' ', '_', $iterator2->current()->getIndexedFilename())
91
                            );
92
                            $iterator2->current()->relationId = 'rId' . $relId;
93
                            ++$relId;
94
                        } elseif ($iterator2->current() instanceof ShapeChart) {
95
                            // Write relationship for chart drawing
96
                            $this->writeRelationship(
97
                                $objWriter,
98
                                $relId,
99
                                'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart',
100
                                '../charts/' . $iterator2->current()->getIndexedFilename()
101
                            );
102
                            $iterator2->current()->relationId = 'rId' . $relId;
103
                            ++$relId;
104
                        }
105
                        $iterator2->next();
106
                    }
107
                }
108
                $iterator->next();
109
            }
110
        }
111 95
    }
112
113
    /**
114
     * @param XMLWriter $objWriter
115
     * @param \ArrayObject|\PhpOffice\PhpPresentation\AbstractShape[] $shapes
116
     * @param int $shapeId
117
     */
118 95
    protected function writeShapeCollection(XMLWriter $objWriter, $shapes = array(), &$shapeId = 0)
119
    {
120 95
        foreach ($shapes as $shape) {
121
            // Increment $shapeId
122 71
            ++$shapeId;
123
            // Check type
124 71
            if ($shape instanceof RichText) {
125 22
                $this->writeShapeText($objWriter, $shape, $shapeId);
126
            } elseif ($shape instanceof ShapeTable) {
127 9
                $this->writeShapeTable($objWriter, $shape, $shapeId);
128
            } elseif ($shape instanceof Line) {
129 1
                $this->writeShapeLine($objWriter, $shape, $shapeId);
130
            } elseif ($shape instanceof ShapeChart) {
131 24
                $this->writeShapeChart($objWriter, $shape, $shapeId);
132 15
            } elseif ($shape instanceof AbstractDrawing) {
0 ignored issues
show
Bug introduced by
The class PhpOffice\PhpPresentation\Shape\AbstractDrawing does not exist. Did you forget a USE statement, or did you not list all dependencies?

This error could be the result of:

1. Missing dependencies

PHP Analyzer uses your composer.json file (if available) to determine the dependencies of your project and to determine all the available classes and functions. It expects the composer.json to be in the root folder of your repository.

Are you sure this class is defined by one of your dependencies, or did you maybe not list a dependency in either the require or require-dev section?

2. Missing use statement

PHP does not complain about undefined classes in ìnstanceof checks. For example, the following PHP code will work perfectly fine:

if ($x instanceof DoesNotExist) {
    // Do something.
}

If you have not tested against this specific condition, such errors might go unnoticed.

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