38
38
use PhpOffice \PhpPresentation \Style \Alignment ;
39
39
use PhpOffice \PhpPresentation \Style \Bullet ;
40
40
use PhpOffice \PhpPresentation \Style \Border ;
41
+ use PhpOffice \PhpPresentation \Style \Color ;
41
42
use PhpOffice \PhpPresentation \Style \Shadow ;
42
43
use PhpOffice \PhpPresentation \Slide \AbstractSlide as AbstractSlideAlias ;
43
44
@@ -433,19 +434,25 @@ protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $sha
433
434
$ objWriter ->endElement ();
434
435
// a:tcPr
435
436
$ objWriter ->startElement ('a:tcPr ' );
436
- // Alignment (horizontal)
437
437
$ firstParagraph = $ currentCell ->getParagraph (0 );
438
- $ verticalAlign = $ firstParagraph ->getAlignment ()->getVertical ();
438
+ $ firstParagraphAlignment = $ firstParagraph ->getAlignment ();
439
+
440
+ // Text Direction
441
+ $ textDirection = $ firstParagraphAlignment ->getTextDirection ();
442
+ if ($ textDirection != Alignment::TEXT_DIRECTION_HORIZONTAL ) {
443
+ $ objWriter ->writeAttribute ('vert ' , $ textDirection );
444
+ }
445
+ // Alignment (horizontal)
446
+ $ verticalAlign = $ firstParagraphAlignment ->getVertical ();
439
447
if ($ verticalAlign != Alignment::VERTICAL_BASE && $ verticalAlign != Alignment::VERTICAL_AUTO ) {
440
448
$ objWriter ->writeAttribute ('anchor ' , $ verticalAlign );
441
449
}
442
450
443
451
// Margins
444
- $ alignment = $ firstParagraph ->getAlignment ();
445
- $ objWriter ->writeAttribute ('marL ' , $ alignment ->getMarginLeft ());
446
- $ objWriter ->writeAttribute ('marR ' , $ alignment ->getMarginRight ());
447
- $ objWriter ->writeAttribute ('marT ' , $ alignment ->getMarginTop ());
448
- $ objWriter ->writeAttribute ('marB ' , $ alignment ->getMarginBottom ());
452
+ $ objWriter ->writeAttribute ('marL ' , $ firstParagraphAlignment ->getMarginLeft ());
453
+ $ objWriter ->writeAttribute ('marR ' , $ firstParagraphAlignment ->getMarginRight ());
454
+ $ objWriter ->writeAttribute ('marT ' , $ firstParagraphAlignment ->getMarginTop ());
455
+ $ objWriter ->writeAttribute ('marB ' , $ firstParagraphAlignment ->getMarginBottom ());
449
456
450
457
// Determine borders
451
458
$ borderLeft = $ currentCell ->getBorders ()->getLeft ();
@@ -490,46 +497,66 @@ protected function writeShapeTable(XMLWriter $objWriter, ShapeTable $shape, $sha
490
497
*
491
498
* @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
492
499
* @param \PhpOffice\PhpPresentation\Shape\RichText\Paragraph[] $paragraphs
500
+ * @param bool $bIsPlaceholder
493
501
* @throws \Exception
494
502
*/
495
- protected function writeParagraphs (XMLWriter $ objWriter , $ paragraphs )
503
+ protected function writeParagraphs (XMLWriter $ objWriter , $ paragraphs, $ bIsPlaceholder = false )
496
504
{
497
505
// Loop trough paragraphs
498
506
foreach ($ paragraphs as $ paragraph ) {
499
507
// a:p
500
508
$ objWriter ->startElement ('a:p ' );
509
+
501
510
// a:pPr
502
- $ objWriter ->startElement ('a:pPr ' );
503
- $ objWriter ->writeAttribute ('algn ' , $ paragraph ->getAlignment ()->getHorizontal ());
504
- $ objWriter ->writeAttribute ('fontAlgn ' , $ paragraph ->getAlignment ()->getVertical ());
505
- $ objWriter ->writeAttribute ('marL ' , CommonDrawing::pixelsToEmu ($ paragraph ->getAlignment ()->getMarginLeft ()));
506
- $ objWriter ->writeAttribute ('marR ' , CommonDrawing::pixelsToEmu (
507
- $ paragraph ->getAlignment ()->getMarginRight ()
508
- ));
509
- $ objWriter ->writeAttribute ('indent ' , CommonDrawing::pixelsToEmu ($ paragraph ->getAlignment ()->getIndent ()));
510
- $ objWriter ->writeAttribute ('lvl ' , $ paragraph ->getAlignment ()->getLevel ());
511
- // Bullet type specified?
512
- if ($ paragraph ->getBulletStyle ()->getBulletType () != Bullet::TYPE_NONE ) {
513
- // a:buFont
514
- $ objWriter ->startElement ('a:buFont ' );
515
- $ objWriter ->writeAttribute ('typeface ' , $ paragraph ->getBulletStyle ()->getBulletFont ());
511
+ if (!$ bIsPlaceholder ) {
512
+ $ objWriter ->startElement ('a:pPr ' );
513
+ $ objWriter ->writeAttribute ('algn ' , $ paragraph ->getAlignment ()->getHorizontal ());
514
+ $ objWriter ->writeAttribute ('fontAlgn ' , $ paragraph ->getAlignment ()->getVertical ());
515
+ $ objWriter ->writeAttribute ('marL ' , CommonDrawing::pixelsToEmu ($ paragraph ->getAlignment ()->getMarginLeft ()));
516
+ $ objWriter ->writeAttribute ('marR ' , CommonDrawing::pixelsToEmu ($ paragraph ->getAlignment ()->getMarginRight ()));
517
+ $ objWriter ->writeAttribute ('indent ' , CommonDrawing::pixelsToEmu ($ paragraph ->getAlignment ()->getIndent ()));
518
+ $ objWriter ->writeAttribute ('lvl ' , $ paragraph ->getAlignment ()->getLevel ());
519
+
520
+ $ objWriter ->startElement ('a:lnSpc ' );
521
+ $ objWriter ->startElement ('a:spcPct ' );
522
+ $ objWriter ->writeAttribute ('val ' , $ paragraph ->getLineSpacing () * 1000 );
516
523
$ objWriter ->endElement ();
517
- if ($ paragraph ->getBulletStyle ()->getBulletType () == Bullet::TYPE_BULLET ) {
518
- // a:buChar
519
- $ objWriter ->startElement ('a:buChar ' );
520
- $ objWriter ->writeAttribute ('char ' , $ paragraph ->getBulletStyle ()->getBulletChar ());
521
- $ objWriter ->endElement ();
522
- } elseif ($ paragraph ->getBulletStyle ()->getBulletType () == Bullet::TYPE_NUMERIC ) {
523
- // a:buAutoNum
524
- $ objWriter ->startElement ('a:buAutoNum ' );
525
- $ objWriter ->writeAttribute ('type ' , $ paragraph ->getBulletStyle ()->getBulletNumericStyle ());
526
- if ($ paragraph ->getBulletStyle ()->getBulletNumericStartAt () != 1 ) {
527
- $ objWriter ->writeAttribute ('startAt ' , $ paragraph ->getBulletStyle ()->getBulletNumericStartAt ());
524
+ $ objWriter ->endElement ();
525
+
526
+ // Bullet type specified?
527
+ if ($ paragraph ->getBulletStyle ()->getBulletType () != Bullet::TYPE_NONE ) {
528
+ // Color
529
+ // a:buClr must be before a:buFont (else PowerPoint crashes at launch)
530
+ if ($ paragraph ->getBulletStyle ()->getBulletColor () instanceof Color) {
531
+ $ objWriter ->startElement ('a:buClr ' );
532
+ $ this ->writeColor ($ objWriter , $ paragraph ->getBulletStyle ()->getBulletColor ());
533
+ $ objWriter ->endElement ();
528
534
}
535
+
536
+ // a:buFont
537
+ $ objWriter ->startElement ('a:buFont ' );
538
+ $ objWriter ->writeAttribute ('typeface ' , $ paragraph ->getBulletStyle ()->getBulletFont ());
529
539
$ objWriter ->endElement ();
540
+
541
+ if ($ paragraph ->getBulletStyle ()->getBulletType () == Bullet::TYPE_BULLET ) {
542
+ // a:buChar
543
+ $ objWriter ->startElement ('a:buChar ' );
544
+ $ objWriter ->writeAttribute ('char ' , $ paragraph ->getBulletStyle ()->getBulletChar ());
545
+ $ objWriter ->endElement ();
546
+ } elseif ($ paragraph ->getBulletStyle ()->getBulletType () == Bullet::TYPE_NUMERIC ) {
547
+ // a:buAutoNum
548
+ $ objWriter ->startElement ('a:buAutoNum ' );
549
+ $ objWriter ->writeAttribute ('type ' , $ paragraph ->getBulletStyle ()->getBulletNumericStyle ());
550
+ if ($ paragraph ->getBulletStyle ()->getBulletNumericStartAt () != 1 ) {
551
+ $ objWriter ->writeAttribute ('startAt ' , $ paragraph ->getBulletStyle ()->getBulletNumericStartAt ());
552
+ }
553
+ $ objWriter ->endElement ();
554
+ }
530
555
}
556
+
557
+ $ objWriter ->endElement ();
531
558
}
532
- $ objWriter -> endElement ();
559
+
533
560
// Loop trough rich text elements
534
561
$ elements = $ paragraph ->getRichTextElements ();
535
562
foreach ($ elements as $ element ) {
@@ -539,56 +566,57 @@ protected function writeParagraphs(XMLWriter $objWriter, $paragraphs)
539
566
} elseif ($ element instanceof Run || $ element instanceof TextElement) {
540
567
// a:r
541
568
$ objWriter ->startElement ('a:r ' );
569
+
542
570
// a:rPr
543
- if ($ element instanceof Run) {
571
+ if ($ element instanceof Run && ! $ bIsPlaceholder ) {
544
572
// a:rPr
545
573
$ objWriter ->startElement ('a:rPr ' );
574
+
546
575
// Lang
547
- $ objWriter ->writeAttribute ('lang ' , ($ element ->getLanguage () ?
548
- $ element ->getLanguage () : 'en-US ' ));
549
- // Bold
550
- $ objWriter ->writeAttribute ('b ' , ($ element ->getFont ()->isBold () ? '1 ' : '0 ' ));
551
- // Italic
552
- $ objWriter ->writeAttribute ('i ' , ($ element ->getFont ()->isItalic () ? '1 ' : '0 ' ));
553
- // Strikethrough
554
- $ objWriter ->writeAttribute ('strike ' , ($ element ->getFont ()->isStrikethrough () ?
555
- 'sngStrike ' : 'noStrike ' ));
576
+ $ objWriter ->writeAttribute ('lang ' , ($ element ->getLanguage () ? $ element ->getLanguage () : 'en-US ' ));
577
+
578
+ $ objWriter ->writeAttributeIf ($ element ->getFont ()->isBold (), 'b ' , '1 ' );
579
+ $ objWriter ->writeAttributeIf ($ element ->getFont ()->isItalic (), 'i ' , '1 ' );
580
+ $ objWriter ->writeAttributeIf ($ element ->getFont ()->isStrikethrough (), 'strike ' , 'sngStrike ' );
581
+
556
582
// Size
557
583
$ objWriter ->writeAttribute ('sz ' , ($ element ->getFont ()->getSize () * 100 ));
584
+
585
+ // Character spacing
586
+ $ objWriter ->writeAttribute ('spc ' , $ element ->getFont ()->getCharacterSpacing ());
587
+
558
588
// Underline
559
589
$ objWriter ->writeAttribute ('u ' , $ element ->getFont ()->getUnderline ());
590
+
560
591
// Superscript / subscript
561
- if ($ element ->getFont ()->isSuperScript () || $ element ->getFont ()->isSubScript ()) {
562
- if ($ element ->getFont ()->isSuperScript ()) {
563
- $ objWriter ->writeAttribute ('baseline ' , '30000 ' );
564
- } elseif ($ element ->getFont ()->isSubScript ()) {
565
- $ objWriter ->writeAttribute ('baseline ' , '-25000 ' );
566
- }
567
- }
592
+ $ objWriter ->writeAttributeIf ($ element ->getFont ()->isSuperScript (), 'baseline ' , '30000 ' );
593
+ $ objWriter ->writeAttributeIf ($ element ->getFont ()->isSubScript (), 'baseline ' , '-25000 ' );
594
+
568
595
// Color - a:solidFill
569
596
$ objWriter ->startElement ('a:solidFill ' );
570
- // a:srgbClr
571
- $ objWriter ->startElement ('a:srgbClr ' );
572
- $ objWriter ->writeAttribute ('val ' , $ element ->getFont ()->getColor ()->getRGB ());
573
- $ objWriter ->endElement ();
597
+ $ this ->writeColor ($ objWriter , $ element ->getFont ()->getColor ());
574
598
$ objWriter ->endElement ();
599
+
575
600
// Font - a:latin
576
601
$ objWriter ->startElement ('a:latin ' );
577
602
$ objWriter ->writeAttribute ('typeface ' , $ element ->getFont ()->getName ());
578
603
$ objWriter ->endElement ();
604
+
579
605
// a:hlinkClick
580
- if ($ element ->hasHyperlink ()) {
581
- $ this ->writeHyperlink ($ objWriter , $ element );
582
- }
606
+ $ this ->writeHyperlink ($ objWriter , $ element );
607
+
583
608
$ objWriter ->endElement ();
584
609
}
610
+
585
611
// t
586
612
$ objWriter ->startElement ('a:t ' );
587
613
$ objWriter ->writeCData (Text::controlCharacterPHP2OOXML ($ element ->getText ()));
588
614
$ objWriter ->endElement ();
615
+
589
616
$ objWriter ->endElement ();
590
617
}
591
618
}
619
+
592
620
$ objWriter ->endElement ();
593
621
}
594
622
}
0 commit comments