|
18 | 18 | namespace PhpOffice\PhpWord\Reader\Word2007;
|
19 | 19 |
|
20 | 20 | use DOMElement;
|
| 21 | +use DOMNode; |
21 | 22 | use PhpOffice\PhpWord\Element\Section;
|
22 | 23 | use PhpOffice\PhpWord\PhpWord;
|
23 | 24 | use PhpOffice\PhpWord\Shared\XMLReader;
|
@@ -46,15 +47,33 @@ public function read(PhpWord $phpWord): void
|
46 | 47 | $this->phpWord = $phpWord;
|
47 | 48 | $xmlReader = new XMLReader();
|
48 | 49 | $xmlReader->getDomFromZip($this->docFile, $this->xmlFile);
|
49 |
| - $readMethods = ['w:p' => 'readWPNode', 'w:tbl' => 'readTable', 'w:sectPr' => 'readWSectPrNode']; |
50 |
| - |
51 | 50 | $nodes = $xmlReader->getElements('w:body/*');
|
52 | 51 | if ($nodes->length > 0) {
|
53 | 52 | $section = $this->phpWord->addSection();
|
54 | 53 | foreach ($nodes as $node) {
|
55 |
| - if (isset($readMethods[$node->nodeName])) { |
56 |
| - $readMethod = $readMethods[$node->nodeName]; |
57 |
| - $this->$readMethod($xmlReader, $node, $section); |
| 54 | + $this->readNode($phpWord, $xmlReader, $node, $section); |
| 55 | + } |
| 56 | + } |
| 57 | + } |
| 58 | + |
| 59 | + private function readNode(PhpWord $phpWord, XMLReader $xmlReader, DOMNode $node, Section $section): void |
| 60 | + { |
| 61 | + $readMethods = ['w:p' => 'readWPNode', 'w:tbl' => 'readTable', 'w:sectPr' => 'readWSectPrNode']; |
| 62 | + if (isset($readMethods[$node->nodeName])) { |
| 63 | + $readMethod = $readMethods[$node->nodeName]; |
| 64 | + $this->$readMethod($xmlReader, $node, $section); |
| 65 | + } elseif ($node->nodeName === 'w:sdt' && $node instanceof DOMElement) { |
| 66 | + $nodes = $xmlReader->getElements('w:sdtContent/*', $node); |
| 67 | + if ($nodes->length > 0) { |
| 68 | + foreach ($nodes as $subNode) { |
| 69 | + $this->readNode($phpWord, $xmlReader, $subNode, $section); |
| 70 | + } |
| 71 | + } |
| 72 | + } elseif ($node->nodeName === 'w:sdtContent' && $node instanceof DOMElement) { |
| 73 | + $nodes = $xmlReader->getElements('*', $node); |
| 74 | + if ($nodes->length > 0) { |
| 75 | + foreach ($nodes as $subNode) { |
| 76 | + $this->readNode($phpWord, $xmlReader, $subNode, $section); |
58 | 77 | }
|
59 | 78 | }
|
60 | 79 | }
|
|
0 commit comments