Reduce cyclomatic complexity on DocumentProperties and Word2007 Document Writer.

This commit is contained in:
Ivan Lanin 2014-05-23 10:19:57 +07:00
commit d79ca9ae31
4 changed files with 105 additions and 156 deletions

View File

@ -488,49 +488,23 @@ class DocumentProperties
*/
public static function convertProperty($propertyValue, $propertyType)
{
switch ($propertyType) {
$conversion = self::getConversion($propertyType);
switch ($conversion) {
case 'empty': // Empty
return '';
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
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';
}
}

View File

@ -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())
{
}
}

View File

@ -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;

View File

@ -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 <w:lastRenderedPageBreak>
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 <w:lastRenderedPageBreak>
*/
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);
}
}
}