getDomFromZip($this->docFile, $this->xmlFile); // Abstract numbering definition $nodes = $xmlReader->getElements('w:abstractNum'); if ($nodes->length > 0) { foreach ($nodes as $node) { $abstractID = $xmlReader->getAttribute('w:abstractNumID', $node); $abstracts[$abstractID] = array('levels' => array()); $abstract = &$abstracts[$abstractID]; $subnodes = $xmlReader->getElements('*', $node); foreach ($subnodes as $subnode) { switch ($subnode->nodeName) { case 'w:multiLevelType': $abstract['type'] = $xmlReader->getAttribute('w:val', $subnode); break; case 'w:lvl': $levelID = $xmlReader->getAttribute('w:ilvl', $subnode); $abstract['levels'][$levelID] = $this->readLevel($xmlReader, $subnode, $levelID); break; } } } } // Numbering instance definition $nodes = $xmlReader->getElements('w:num'); if ($nodes->length > 0) { foreach ($nodes as $node) { $numID = $xmlReader->getAttribute('w:numID', $node); $abstractID = $xmlReader->getAttribute('w:val', $node, 'w:abstractNumID'); $numberings[$numID] = $abstracts[$abstractID]; $numberings[$numID]['numID'] = $numID; $subnodes = $xmlReader->getElements('w:lvlOverride/w:lvl', $node); foreach ($subnodes as $subnode) { $levelID = $xmlReader->getAttribute('w:ilvl', $subnode); $overrides = $this->readLevel($xmlReader, $subnode, $levelID); foreach ($overrides as $key => $value) { $numberings[$numID]['levels'][$levelID][$key] = $value; } } } } // Push to Style collection foreach ($numberings as $numID => $numbering) { $phpWord->addNumberingStyle("PHPWordList{$numID}", $numbering); } } /** * Read numbering level definition from w:abstractNum and w:num * * @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader * @param \DOMElement $subnode * @param integer $levelID * @return array */ private function readLevel(XMLReader $xmlReader, \DOMElement $subnode, $levelID) { $level = array(); $level['level'] = $levelID; $level['start'] = $xmlReader->getAttribute('w:val', $subnode, 'w:start'); $level['format'] = $xmlReader->getAttribute('w:val', $subnode, 'w:numFmt'); $level['restart'] = $xmlReader->getAttribute('w:val', $subnode, 'w:lvlRestart'); $level['suffix'] = $xmlReader->getAttribute('w:val', $subnode, 'w:suff'); $level['text'] = $xmlReader->getAttribute('w:val', $subnode, 'w:lvlText'); $level['align'] = $xmlReader->getAttribute('w:val', $subnode, 'w:lvlJc'); $level['tab'] = $xmlReader->getAttribute('w:pos', $subnode, 'w:pPr/w:tabs/w:tab'); $level['left'] = $xmlReader->getAttribute('w:left', $subnode, 'w:pPr/w:ind'); $level['hanging'] = $xmlReader->getAttribute('w:hanging', $subnode, 'w:pPr/w:ind'); $level['font'] = $xmlReader->getAttribute('w:ascii', $subnode, 'w:rPr/w:rFonts'); $level['hint'] = $xmlReader->getAttribute('w:hint', $subnode, 'w:rPr/w:rFonts'); foreach ($level as $key => $value) { if (is_null($value)) { unset($level[$key]); } } return $level; } }