Skip to content

Commit 815bb52

Browse files
authored
Merge pull request #1628 from waltertamboer/feature/fix-issue-1529
No nested w:pPr elements in ListItemRun.
2 parents 24d120b + 3c6a1a1 commit 815bb52

File tree

2 files changed

+59
-15
lines changed

2 files changed

+59
-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
}

tests/PhpWord/Writer/Word2007/ElementTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,4 +510,25 @@ public function testTextWithAmpersant()
510510
$this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:r/w:t'));
511511
$this->assertEquals('this text contains an & (ampersant)', $doc->getElement('/w:document/w:body/w:p/w:r/w:t')->nodeValue);
512512
}
513+
514+
/**
515+
* Test ListItemRun paragraph style writing
516+
*/
517+
public function testListItemRunStyleWriting()
518+
{
519+
$phpWord = new PhpWord();
520+
$phpWord->addParagraphStyle('MyParagraphStyle', array('spaceBefore' => 400));
521+
522+
$section = $phpWord->addSection();
523+
$listItemRun = $section->addListItemRun(0, null, 'MyParagraphStyle');
524+
$listItemRun->addText('List item');
525+
$listItemRun->addText(' in bold', array('bold' => true));
526+
527+
$doc = TestHelperDOCX::getDocument($phpWord);
528+
$this->assertFalse($doc->elementExists('/w:document/w:body/w:p/w:pPr/w:pPr'));
529+
$this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:pPr/w:pStyle'));
530+
$this->assertEquals('List item', $doc->getElement('/w:document/w:body/w:p/w:r[1]/w:t')->nodeValue);
531+
$this->assertEquals(' in bold', $doc->getElement('/w:document/w:body/w:p/w:r[2]/w:t')->nodeValue);
532+
$this->assertTrue($doc->elementExists('/w:document/w:body/w:p/w:r[2]/w:rPr/w:b'));
533+
}
513534
}

0 commit comments

Comments
 (0)