Completed
Pull Request — develop (#180)
by Szymon
05:56
created

Slide   F

Complexity

Total Complexity 158

Size/Duplication

Total Lines 1688
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 28

Test Coverage

Coverage 99.88%

Importance

Changes 5
Bugs 0 Features 2
Metric Value
wmc 158
c 5
b 0
f 2
lcom 1
cbo 28
dl 0
loc 1688
ccs 860
cts 861
cp 0.9988
rs 0.5217

17 Methods

Rating   Name   Duplication   Size   Complexity  
D writeSlide() 0 174 13
C writeShapeGroup() 0 80 8
A writeShapeChart() 0 61 1
B writeShapePic() 0 92 4
F writeShapeText() 0 131 16
F writeShapeTable() 0 211 18
D writeParagraphs() 0 118 20
C writeShapeLine() 0 98 8
A writeBorder() 0 58 3
B writeFill() 0 22 5
A writeSolidFill() 0 12 1
B writeGradientFill() 0 39 1
B writePatternFill() 0 27 1
B writeShadow() 0 28 1
A writeHyperlink() 0 11 2
B writeNote() 0 151 4
D writeTransition() 0 244 52

How to fix   Complexity   

Complex Class

Complex classes like Slide often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Slide, and based on these observations, apply Extract Interface, too.

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