From 18b3c754ef32f5a2c0fc21666ffe481da370cf97 Mon Sep 17 00:00:00 2001 From: Walter Tamboer Date: Thu, 9 May 2019 15:29:25 +0200 Subject: [PATCH] No nested w:pPr elements in ListItemRun. This commit fixes issue #1529 This commit prevents nested w:pPr elements when using a ListItemRun with a paragraph style. The different between a ListItem and a ListItem run is that the setWithoutPPR method is called on the ParagraphStyleWriter (PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph). According to the specs it's not allowed to have nested w:pPr elements. See http://www.datypic.com/sc/ooxml/e-w_pPr-2.html --- .../Writer/Word2007/Element/ListItemRun.php | 59 +++++++++++++------ 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/src/PhpWord/Writer/Word2007/Element/ListItemRun.php b/src/PhpWord/Writer/Word2007/Element/ListItemRun.php index 765d2ee0..fda2b078 100644 --- a/src/PhpWord/Writer/Word2007/Element/ListItemRun.php +++ b/src/PhpWord/Writer/Word2007/Element/ListItemRun.php @@ -17,6 +17,7 @@ namespace PhpOffice\PhpWord\Writer\Word2007\Element; +use PhpOffice\PhpWord\Element\ListItemRun as ListItemRunElement; use PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph as ParagraphStyleWriter; /** @@ -31,34 +32,56 @@ class ListItemRun extends AbstractElement */ public function write() { - $xmlWriter = $this->getXmlWriter(); $element = $this->getElement(); - if (!$element instanceof \PhpOffice\PhpWord\Element\ListItemRun) { + + if (!$element instanceof ListItemRunElement) { return; } + $this->writeParagraph($element); + } + + private function writeParagraph(ListItemRunElement $element) + { + $xmlWriter = $this->getXmlWriter(); $xmlWriter->startElement('w:p'); - $xmlWriter->startElement('w:pPr'); - $paragraphStyle = $element->getParagraphStyle(); - $styleWriter = new ParagraphStyleWriter($xmlWriter, $paragraphStyle); - $styleWriter->setIsInline(true); - $styleWriter->write(); - - $xmlWriter->startElement('w:numPr'); - $xmlWriter->startElement('w:ilvl'); - $xmlWriter->writeAttribute('w:val', $element->getDepth()); - $xmlWriter->endElement(); // w:ilvl - $xmlWriter->startElement('w:numId'); - $xmlWriter->writeAttribute('w:val', $element->getStyle()->getNumId()); - $xmlWriter->endElement(); // w:numId - $xmlWriter->endElement(); // w:numPr - - $xmlWriter->endElement(); // w:pPr + $this->writeParagraphProperties($element); $containerWriter = new Container($xmlWriter, $element); $containerWriter->write(); $xmlWriter->endElement(); // w:p } + + private function writeParagraphProperties(ListItemRunElement $element) + { + $xmlWriter = $this->getXmlWriter(); + $xmlWriter->startElement('w:pPr'); + + $styleWriter = new ParagraphStyleWriter($xmlWriter, $element->getParagraphStyle()); + $styleWriter->setIsInline(true); + $styleWriter->setWithoutPPR(true); + $styleWriter->write(); + + $this->writeParagraphPropertiesNumbering($element); + + $xmlWriter->endElement(); // w:pPr + } + + private function writeParagraphPropertiesNumbering(ListItemRunElement $element) + { + $xmlWriter = $this->getXmlWriter(); + $xmlWriter->startElement('w:numPr'); + + $xmlWriter->writeElementBlock('w:ilvl', array( + 'w:val' => $element->getDepth(), + )); + + $xmlWriter->writeElementBlock('w:numId', array( + 'w:val' => $element->getStyle()->getNumId(), + )); + + $xmlWriter->endElement(); // w:numPr + } }