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

AbstractSlide::getGUID()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 18
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

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