Skip to content

Commit 18b3c75

Browse files
committed
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
1 parent fe531ca commit 18b3c75

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

src/PhpWord/Writer/Word2007/Element/ListItemRun.php

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
namespace PhpOffice\PhpWord\Writer\Word2007\Element;
1919

20+
use PhpOffice\PhpWord\Element\ListItemRun as ListItemRunElement;
2021
use PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph as ParagraphStyleWriter;
2122

2223
/**
@@ -31,34 +32,56 @@ class ListItemRun extends AbstractElement
3132
*/
3233
public function write()
3334
{
34-
$xmlWriter = $this->getXmlWriter();
3535
$element = $this->getElement();
36-
if (!$element instanceof \PhpOffice\PhpWord\Element\ListItemRun) {
36+
37+
if (!$element instanceof ListItemRunElement) {
3738
return;
3839
}
3940

41+
$this->writeParagraph($element);
42+
}
43+
44+
private function writeParagraph(ListItemRunElement $element)
45+
{
46+
$xmlWriter = $this->getXmlWriter();
4047
$xmlWriter->startElement('w:p');
4148

49+
$this->writeParagraphProperties($element);
50+
51+
$containerWriter = new Container($xmlWriter, $element);
52+
$containerWriter->write();
53+
54+
$xmlWriter->endElement(); // w:p
55+
}
56+
57+
private function writeParagraphProperties(ListItemRunElement $element)
58+
{
59+
$xmlWriter = $this->getXmlWriter();
4260
$xmlWriter->startElement('w:pPr');
43-
$paragraphStyle = $element->getParagraphStyle();
44-
$styleWriter = new ParagraphStyleWriter($xmlWriter, $paragraphStyle);
61+
62+
$styleWriter = new ParagraphStyleWriter($xmlWriter, $element->getParagraphStyle());
4563
$styleWriter->setIsInline(true);
64+
$styleWriter->setWithoutPPR(true);
4665
$styleWriter->write();
4766

48-
$xmlWriter->startElement('w:numPr');
49-
$xmlWriter->startElement('w:ilvl');
50-
$xmlWriter->writeAttribute('w:val', $element->getDepth());
51-
$xmlWriter->endElement(); // w:ilvl
52-
$xmlWriter->startElement('w:numId');
53-
$xmlWriter->writeAttribute('w:val', $element->getStyle()->getNumId());
54-
$xmlWriter->endElement(); // w:numId
55-
$xmlWriter->endElement(); // w:numPr
67+
$this->writeParagraphPropertiesNumbering($element);
5668

5769
$xmlWriter->endElement(); // w:pPr
70+
}
5871

59-
$containerWriter = new Container($xmlWriter, $element);
60-
$containerWriter->write();
72+
private function writeParagraphPropertiesNumbering(ListItemRunElement $element)
73+
{
74+
$xmlWriter = $this->getXmlWriter();
75+
$xmlWriter->startElement('w:numPr');
6176

62-
$xmlWriter->endElement(); // w:p
77+
$xmlWriter->writeElementBlock('w:ilvl', array(
78+
'w:val' => $element->getDepth(),
79+
));
80+
81+
$xmlWriter->writeElementBlock('w:numId', array(
82+
'w:val' => $element->getStyle()->getNumId(),
83+
));
84+
85+
$xmlWriter->endElement(); // w:numPr
6386
}
6487
}

0 commit comments

Comments
 (0)