|
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