diff --git a/src/PhpWord/DocumentProperties.php b/src/PhpWord/DocumentProperties.php index 17d57c1d..95159ec0 100644 --- a/src/PhpWord/DocumentProperties.php +++ b/src/PhpWord/DocumentProperties.php @@ -488,49 +488,23 @@ class DocumentProperties */ public static function convertProperty($propertyValue, $propertyType) { - switch ($propertyType) { - case 'empty': // Empty + $conversion = self::getConversion($propertyType); + + switch ($conversion) { + case 'empty': // Empty return ''; - case 'null': // Null + case 'null': // Null return null; - case 'i1': // 1-Byte Signed Integer - case 'i2': // 2-Byte Signed Integer - case 'i4': // 4-Byte Signed Integer - case 'i8': // 8-Byte Signed Integer - case 'int': // Integer + case 'int': // Signed integer return (int) $propertyValue; - case 'ui1': // 1-Byte Unsigned Integer - case 'ui2': // 2-Byte Unsigned Integer - case 'ui4': // 4-Byte Unsigned Integer - case 'ui8': // 8-Byte Unsigned Integer - case 'uint': // Unsigned Integer + case 'uint': // Unsigned integer return abs((int) $propertyValue); - case 'r4': // 4-Byte Real Number - case 'r8': // 8-Byte Real Number - case 'decimal': // Decimal + case 'float': // Float return (float) $propertyValue; - case 'date': // Date and Time - case 'filetime': // File Time + case 'date': // Date return strtotime($propertyValue); - case 'bool': // Boolean + case 'bool': // Boolean return ($propertyValue == 'true') ? true : false; - case 'lpstr': // LPSTR - case 'lpwstr': // LPWSTR - case 'bstr': // Basic String - case 'cy': // Currency - case 'error': // Error Status Code - case 'vector': // Vector - case 'array': // Array - case 'blob': // Binary Blob - case 'oblob': // Binary Blob Object - case 'stream': // Binary Stream - case 'ostream': // Binary Stream Object - case 'storage': // Binary Storage - case 'ostorage': // Binary Storage Object - case 'vstream': // Binary Versioned Stream - case 'clsid': // Class ID - case 'cf': // Clipboard Data - return $propertyValue; } return $propertyValue; @@ -569,10 +543,36 @@ class DocumentProperties */ private function setValue($value, $default) { - if (is_null($value) || $value == '') { + if ($value === null || $value == '') { $value = $default; } return $value; } + + /** + * Get conversion model depending on property type + * + * @param string $propertyType + * @return string + */ + private static function getConversion($propertyType) + { + $conversions = array( + 'empty' => array('empty'), + 'null' => array('null'), + 'int' => array('i1', 'i2', 'i4', 'i8', 'int'), + 'uint' => array('ui1', 'ui2', 'ui4', 'ui8', 'uint'), + 'float' => array('r4', 'r8', 'decimal'), + 'bool' => array('bool'), + 'date' => array('date', 'filetime'), + ); + foreach ($conversions as $conversion => $types) { + if (in_array($propertyType, $types)) { + return $conversion; + } + } + + return 'string'; + } } diff --git a/src/PhpWord/Reader/ODText/AbstractPart.php b/src/PhpWord/Reader/ODText/AbstractPart.php index 392c3126..2097df9c 100644 --- a/src/PhpWord/Reader/ODText/AbstractPart.php +++ b/src/PhpWord/Reader/ODText/AbstractPart.php @@ -18,7 +18,6 @@ namespace PhpOffice\PhpWord\Reader\ODText; use PhpOffice\PhpWord\Reader\Word2007\AbstractPart as Word2007AbstractPart; -use PhpOffice\PhpWord\Shared\XMLReader; /** * Abstract part reader @@ -28,75 +27,4 @@ use PhpOffice\PhpWord\Shared\XMLReader; */ abstract class AbstractPart extends Word2007AbstractPart { - /** - * Read w:p (override) - * - * @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader - * @param \DOMElement $domNode - * @param mixed $parent - * @param string $docPart - * - * @todo Get font style for preserve text - */ - protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart) - { - } - - /** - * Read w:r (override) - * - * @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader - * @param \DOMElement $domNode - * @param mixed $parent - * @param string $docPart - * @param mixed $paragraphStyle - */ - protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart, $paragraphStyle = null) - { - } - - /** - * Read w:tbl (override) - * - * @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader - * @param \DOMElement $domNode - * @param mixed $parent - * @param string $docPart - */ - protected function readTable(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart) - { - } - - /** - * Read w:pPr (override) - */ - protected function readParagraphStyle(XMLReader $xmlReader, \DOMElement $domNode) - { - } - - /** - * Read w:rPr (override) - */ - protected function readFontStyle(XMLReader $xmlReader, \DOMElement $domNode) - { - } - - /** - * Read w:tblPr (override) - */ - protected function readTableStyle(XMLReader $xmlReader, \DOMElement $domNode) - { - } - - /** - * Read style definition (override) - * - * @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader - * @param \DOMElement $parentNode - * @param array $styleDefs - * @return array - */ - protected function readStyleDefs(XMLReader $xmlReader, \DOMElement $parentNode = null, $styleDefs = array()) - { - } } diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 2289a5e8..2936884f 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -98,7 +98,7 @@ abstract class AbstractPart * * @todo Get font style for preserve text */ - protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart) + protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart = 'document') { // Paragraph style $paragraphStyle = null; @@ -248,7 +248,7 @@ abstract class AbstractPart * @param mixed $parent * @param string $docPart */ - protected function readTable(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart) + protected function readTable(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart = 'document') { // Table style $tblStyle = null; diff --git a/src/PhpWord/Reader/Word2007/Document.php b/src/PhpWord/Reader/Word2007/Document.php index 34460b52..224c895e 100644 --- a/src/PhpWord/Reader/Word2007/Document.php +++ b/src/PhpWord/Reader/Word2007/Document.php @@ -19,14 +19,23 @@ namespace PhpOffice\PhpWord\Reader\Word2007; use PhpOffice\PhpWord\PhpWord; use PhpOffice\PhpWord\Shared\XMLReader; +use PhpOffice\PhpWord\Element\Section; /** * Document reader * * @since 0.10.0 + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) For readWPNode */ class Document extends AbstractPart { + /** + * PhpWord object + * + * @var \PhpOffice\PhpWord\PhpWord + */ + private $phpWord; + /** * Read document.xml * @@ -34,45 +43,18 @@ class Document extends AbstractPart */ public function read(PhpWord &$phpWord) { + $this->phpWord = $phpWord; $xmlReader = new XMLReader(); $xmlReader->getDomFromZip($this->docFile, $this->xmlFile); + $readMethods = array('w:p' => 'readWPNode', 'w:tbl' => 'readTable', 'w:sectPr' => 'readWSectPrNode'); $nodes = $xmlReader->getElements('w:body/*'); if ($nodes->length > 0) { - $section = $phpWord->addSection(); + $section = $this->phpWord->addSection(); foreach ($nodes as $node) { - switch ($node->nodeName) { - - case 'w:p': // Paragraph - // Page break - // @todo - if ($xmlReader->getAttribute('w:type', $node, 'w:r/w:br') == 'page') { - $section->addPageBreak(); // PageBreak - } - - // Paragraph - $this->readParagraph($xmlReader, $node, $section, 'document'); - // Section properties - if ($xmlReader->elementExists('w:pPr/w:sectPr', $node)) { - $settingsNode = $xmlReader->getElement('w:pPr/w:sectPr', $node); - if (!is_null($settingsNode)) { - $settings = $this->readSectionStyle($xmlReader, $settingsNode); - $section->setSettings($settings); - $this->readHeaderFooter($settings, $section); - } - $section = $phpWord->addSection(); - } - break; - - case 'w:tbl': // Table - $this->readTable($xmlReader, $node, $section, 'document'); - break; - - case 'w:sectPr': // Last section - $settings = $this->readSectionStyle($xmlReader, $node); - $section->setSettings($settings); - $this->readHeaderFooter($settings, $section); - break; + if (array_key_exists($node->nodeName, $readMethods)) { + $readMethod = $readMethods[$node->nodeName]; + $this->$readMethod($xmlReader, $node, $section); } } } @@ -84,14 +66,16 @@ class Document extends AbstractPart * @param array $settings * @param \PhpOffice\PhpWord\Element\Section $section */ - private function readHeaderFooter($settings, &$section) + private function readHeaderFooter($settings, Section &$section) { + $readMethods = array('w:p' => 'readParagraph', 'w:tbl' => 'readTable'); + if (is_array($settings) && array_key_exists('hf', $settings)) { foreach ($settings['hf'] as $rId => $hfSetting) { if (array_key_exists($rId, $this->rels['document'])) { list($hfType, $xmlFile, $docPart) = array_values($this->rels['document'][$rId]); - $method = "add{$hfType}"; - $hfObject = $section->$method($hfSetting['type']); + $addMethod = "add{$hfType}"; + $hfObject = $section->$addMethod($hfSetting['type']); // Read header/footer content $xmlReader = new XMLReader(); @@ -99,15 +83,9 @@ class Document extends AbstractPart $nodes = $xmlReader->getElements('*'); if ($nodes->length > 0) { foreach ($nodes as $node) { - switch ($node->nodeName) { - - case 'w:p': // Paragraph - $this->readParagraph($xmlReader, $node, $hfObject, $docPart); - break; - - case 'w:tbl': // Table - $this->readTable($xmlReader, $node, $hfObject, $docPart); - break; + if (array_key_exists($node->nodeName, $readMethods)) { + $readMethod = $readMethods[$node->nodeName]; + $this->$readMethod($xmlReader, $node, $hfObject, $docPart); } } } @@ -157,4 +135,47 @@ class Document extends AbstractPart return $styles; } + + /** + * Read w:p node + * + * @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader + * @param \DOMElement $node + * @param \PhpOffice\PhpWord\Element\Section $section + * + * @todo + */ + private function readWPNode(XMLReader $xmlReader, \DOMElement $node, Section &$section) + { + // Page break + if ($xmlReader->getAttribute('w:type', $node, 'w:r/w:br') == 'page') { + $section->addPageBreak(); // PageBreak + } + + // Paragraph + $this->readParagraph($xmlReader, $node, $section); + + // Section properties + if ($xmlReader->elementExists('w:pPr/w:sectPr', $node)) { + $sectPrNode = $xmlReader->getElement('w:pPr/w:sectPr', $node); + $this->readWSectPrNode($xmlReader, $sectPrNode, $section); + $section = $this->phpWord->addSection(); + } + } + + /** + * Read w:sectPr node + * + * @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader + * @param \DOMElement $node + * @param \PhpOffice\PhpWord\Element\Section $section + */ + private function readWSectPrNode(XMLReader $xmlReader, \DOMElement $node, Section &$section) + { + if ($node !== null) { + $settings = $this->readSectionStyle($xmlReader, $node); + $section->setSettings($settings); + $this->readHeaderFooter($settings, $section); + } + } }