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
This commit is contained in:
parent
fe531cae55
commit
18b3c754ef
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
namespace PhpOffice\PhpWord\Writer\Word2007\Element;
|
namespace PhpOffice\PhpWord\Writer\Word2007\Element;
|
||||||
|
|
||||||
|
use PhpOffice\PhpWord\Element\ListItemRun as ListItemRunElement;
|
||||||
use PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph as ParagraphStyleWriter;
|
use PhpOffice\PhpWord\Writer\Word2007\Style\Paragraph as ParagraphStyleWriter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -31,34 +32,56 @@ class ListItemRun extends AbstractElement
|
||||||
*/
|
*/
|
||||||
public function write()
|
public function write()
|
||||||
{
|
{
|
||||||
$xmlWriter = $this->getXmlWriter();
|
|
||||||
$element = $this->getElement();
|
$element = $this->getElement();
|
||||||
if (!$element instanceof \PhpOffice\PhpWord\Element\ListItemRun) {
|
|
||||||
|
if (!$element instanceof ListItemRunElement) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->writeParagraph($element);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function writeParagraph(ListItemRunElement $element)
|
||||||
|
{
|
||||||
|
$xmlWriter = $this->getXmlWriter();
|
||||||
$xmlWriter->startElement('w:p');
|
$xmlWriter->startElement('w:p');
|
||||||
|
|
||||||
$xmlWriter->startElement('w:pPr');
|
$this->writeParagraphProperties($element);
|
||||||
$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
|
|
||||||
|
|
||||||
$containerWriter = new Container($xmlWriter, $element);
|
$containerWriter = new Container($xmlWriter, $element);
|
||||||
$containerWriter->write();
|
$containerWriter->write();
|
||||||
|
|
||||||
$xmlWriter->endElement(); // w:p
|
$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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue