Completed
Pull Request — develop (#551)
by
unknown
09:20
created

AbstractSlide::writeShapeLine()   B

Complexity

Conditions 8
Paths 10

Size

Total Lines 86

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 61
CRAP Score 8.0066

Importance

Changes 0
Metric Value
dl 0
loc 86
ccs 61
cts 64
cp 0.9531
rs 7.061
c 0
b 0
f 0
cc 8
nc 10
nop 3
crap 8.0066

How to fix   Long Method   

Long Method

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

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

Commonly applied refactorings include:

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