Skip to content

Commit d79ca9a

Browse files
committed
Reduce cyclomatic complexity on DocumentProperties and Word2007 Document Writer.
2 parents 6351792 + 2086e9e commit d79ca9a

File tree

4 files changed

+105
-156
lines changed

4 files changed

+105
-156
lines changed

src/PhpWord/DocumentProperties.php

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -488,49 +488,23 @@ public function setCustomProperty($propertyName, $propertyValue = '', $propertyT
488488
*/
489489
public static function convertProperty($propertyValue, $propertyType)
490490
{
491-
switch ($propertyType) {
492-
case 'empty': // Empty
491+
$conversion = self::getConversion($propertyType);
492+
493+
switch ($conversion) {
494+
case 'empty': // Empty
493495
return '';
494-
case 'null': // Null
496+
case 'null': // Null
495497
return null;
496-
case 'i1': // 1-Byte Signed Integer
497-
case 'i2': // 2-Byte Signed Integer
498-
case 'i4': // 4-Byte Signed Integer
499-
case 'i8': // 8-Byte Signed Integer
500-
case 'int': // Integer
498+
case 'int': // Signed integer
501499
return (int) $propertyValue;
502-
case 'ui1': // 1-Byte Unsigned Integer
503-
case 'ui2': // 2-Byte Unsigned Integer
504-
case 'ui4': // 4-Byte Unsigned Integer
505-
case 'ui8': // 8-Byte Unsigned Integer
506-
case 'uint': // Unsigned Integer
500+
case 'uint': // Unsigned integer
507501
return abs((int) $propertyValue);
508-
case 'r4': // 4-Byte Real Number
509-
case 'r8': // 8-Byte Real Number
510-
case 'decimal': // Decimal
502+
case 'float': // Float
511503
return (float) $propertyValue;
512-
case 'date': // Date and Time
513-
case 'filetime': // File Time
504+
case 'date': // Date
514505
return strtotime($propertyValue);
515-
case 'bool': // Boolean
506+
case 'bool': // Boolean
516507
return ($propertyValue == 'true') ? true : false;
517-
case 'lpstr': // LPSTR
518-
case 'lpwstr': // LPWSTR
519-
case 'bstr': // Basic String
520-
case 'cy': // Currency
521-
case 'error': // Error Status Code
522-
case 'vector': // Vector
523-
case 'array': // Array
524-
case 'blob': // Binary Blob
525-
case 'oblob': // Binary Blob Object
526-
case 'stream': // Binary Stream
527-
case 'ostream': // Binary Stream Object
528-
case 'storage': // Binary Storage
529-
case 'ostorage': // Binary Storage Object
530-
case 'vstream': // Binary Versioned Stream
531-
case 'clsid': // Class ID
532-
case 'cf': // Clipboard Data
533-
return $propertyValue;
534508
}
535509

536510
return $propertyValue;
@@ -569,10 +543,36 @@ public static function convertPropertyType($propertyType)
569543
*/
570544
private function setValue($value, $default)
571545
{
572-
if (is_null($value) || $value == '') {
546+
if ($value === null || $value == '') {
573547
$value = $default;
574548
}
575549

576550
return $value;
577551
}
552+
553+
/**
554+
* Get conversion model depending on property type
555+
*
556+
* @param string $propertyType
557+
* @return string
558+
*/
559+
private static function getConversion($propertyType)
560+
{
561+
$conversions = array(
562+
'empty' => array('empty'),
563+
'null' => array('null'),
564+
'int' => array('i1', 'i2', 'i4', 'i8', 'int'),
565+
'uint' => array('ui1', 'ui2', 'ui4', 'ui8', 'uint'),
566+
'float' => array('r4', 'r8', 'decimal'),
567+
'bool' => array('bool'),
568+
'date' => array('date', 'filetime'),
569+
);
570+
foreach ($conversions as $conversion => $types) {
571+
if (in_array($propertyType, $types)) {
572+
return $conversion;
573+
}
574+
}
575+
576+
return 'string';
577+
}
578578
}

src/PhpWord/Reader/ODText/AbstractPart.php

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
namespace PhpOffice\PhpWord\Reader\ODText;
1919

2020
use PhpOffice\PhpWord\Reader\Word2007\AbstractPart as Word2007AbstractPart;
21-
use PhpOffice\PhpWord\Shared\XMLReader;
2221

2322
/**
2423
* Abstract part reader
@@ -28,75 +27,4 @@
2827
*/
2928
abstract class AbstractPart extends Word2007AbstractPart
3029
{
31-
/**
32-
* Read w:p (override)
33-
*
34-
* @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader
35-
* @param \DOMElement $domNode
36-
* @param mixed $parent
37-
* @param string $docPart
38-
*
39-
* @todo Get font style for preserve text
40-
*/
41-
protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart)
42-
{
43-
}
44-
45-
/**
46-
* Read w:r (override)
47-
*
48-
* @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader
49-
* @param \DOMElement $domNode
50-
* @param mixed $parent
51-
* @param string $docPart
52-
* @param mixed $paragraphStyle
53-
*/
54-
protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart, $paragraphStyle = null)
55-
{
56-
}
57-
58-
/**
59-
* Read w:tbl (override)
60-
*
61-
* @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader
62-
* @param \DOMElement $domNode
63-
* @param mixed $parent
64-
* @param string $docPart
65-
*/
66-
protected function readTable(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart)
67-
{
68-
}
69-
70-
/**
71-
* Read w:pPr (override)
72-
*/
73-
protected function readParagraphStyle(XMLReader $xmlReader, \DOMElement $domNode)
74-
{
75-
}
76-
77-
/**
78-
* Read w:rPr (override)
79-
*/
80-
protected function readFontStyle(XMLReader $xmlReader, \DOMElement $domNode)
81-
{
82-
}
83-
84-
/**
85-
* Read w:tblPr (override)
86-
*/
87-
protected function readTableStyle(XMLReader $xmlReader, \DOMElement $domNode)
88-
{
89-
}
90-
91-
/**
92-
* Read style definition (override)
93-
*
94-
* @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader
95-
* @param \DOMElement $parentNode
96-
* @param array $styleDefs
97-
* @return array
98-
*/
99-
protected function readStyleDefs(XMLReader $xmlReader, \DOMElement $parentNode = null, $styleDefs = array())
100-
{
101-
}
10230
}

src/PhpWord/Reader/Word2007/AbstractPart.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public function setRels($value)
9898
*
9999
* @todo Get font style for preserve text
100100
*/
101-
protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart)
101+
protected function readParagraph(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart = 'document')
102102
{
103103
// Paragraph style
104104
$paragraphStyle = null;
@@ -248,7 +248,7 @@ protected function readRun(XMLReader $xmlReader, \DOMElement $domNode, &$parent,
248248
* @param mixed $parent
249249
* @param string $docPart
250250
*/
251-
protected function readTable(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart)
251+
protected function readTable(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart = 'document')
252252
{
253253
// Table style
254254
$tblStyle = null;

src/PhpWord/Reader/Word2007/Document.php

Lines changed: 66 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,60 +19,42 @@
1919

2020
use PhpOffice\PhpWord\PhpWord;
2121
use PhpOffice\PhpWord\Shared\XMLReader;
22+
use PhpOffice\PhpWord\Element\Section;
2223

2324
/**
2425
* Document reader
2526
*
2627
* @since 0.10.0
28+
* @SuppressWarnings(PHPMD.UnusedPrivateMethod) For readWPNode
2729
*/
2830
class Document extends AbstractPart
2931
{
32+
/**
33+
* PhpWord object
34+
*
35+
* @var \PhpOffice\PhpWord\PhpWord
36+
*/
37+
private $phpWord;
38+
3039
/**
3140
* Read document.xml
3241
*
3342
* @param \PhpOffice\PhpWord\PhpWord $phpWord
3443
*/
3544
public function read(PhpWord &$phpWord)
3645
{
46+
$this->phpWord = $phpWord;
3747
$xmlReader = new XMLReader();
3848
$xmlReader->getDomFromZip($this->docFile, $this->xmlFile);
49+
$readMethods = array('w:p' => 'readWPNode', 'w:tbl' => 'readTable', 'w:sectPr' => 'readWSectPrNode');
3950

4051
$nodes = $xmlReader->getElements('w:body/*');
4152
if ($nodes->length > 0) {
42-
$section = $phpWord->addSection();
53+
$section = $this->phpWord->addSection();
4354
foreach ($nodes as $node) {
44-
switch ($node->nodeName) {
45-
46-
case 'w:p': // Paragraph
47-
// Page break
48-
// @todo <w:lastRenderedPageBreak>
49-
if ($xmlReader->getAttribute('w:type', $node, 'w:r/w:br') == 'page') {
50-
$section->addPageBreak(); // PageBreak
51-
}
52-
53-
// Paragraph
54-
$this->readParagraph($xmlReader, $node, $section, 'document');
55-
// Section properties
56-
if ($xmlReader->elementExists('w:pPr/w:sectPr', $node)) {
57-
$settingsNode = $xmlReader->getElement('w:pPr/w:sectPr', $node);
58-
if (!is_null($settingsNode)) {
59-
$settings = $this->readSectionStyle($xmlReader, $settingsNode);
60-
$section->setSettings($settings);
61-
$this->readHeaderFooter($settings, $section);
62-
}
63-
$section = $phpWord->addSection();
64-
}
65-
break;
66-
67-
case 'w:tbl': // Table
68-
$this->readTable($xmlReader, $node, $section, 'document');
69-
break;
70-
71-
case 'w:sectPr': // Last section
72-
$settings = $this->readSectionStyle($xmlReader, $node);
73-
$section->setSettings($settings);
74-
$this->readHeaderFooter($settings, $section);
75-
break;
55+
if (array_key_exists($node->nodeName, $readMethods)) {
56+
$readMethod = $readMethods[$node->nodeName];
57+
$this->$readMethod($xmlReader, $node, $section);
7658
}
7759
}
7860
}
@@ -84,30 +66,26 @@ public function read(PhpWord &$phpWord)
8466
* @param array $settings
8567
* @param \PhpOffice\PhpWord\Element\Section $section
8668
*/
87-
private function readHeaderFooter($settings, &$section)
69+
private function readHeaderFooter($settings, Section &$section)
8870
{
71+
$readMethods = array('w:p' => 'readParagraph', 'w:tbl' => 'readTable');
72+
8973
if (is_array($settings) && array_key_exists('hf', $settings)) {
9074
foreach ($settings['hf'] as $rId => $hfSetting) {
9175
if (array_key_exists($rId, $this->rels['document'])) {
9276
list($hfType, $xmlFile, $docPart) = array_values($this->rels['document'][$rId]);
93-
$method = "add{$hfType}";
94-
$hfObject = $section->$method($hfSetting['type']);
77+
$addMethod = "add{$hfType}";
78+
$hfObject = $section->$addMethod($hfSetting['type']);
9579

9680
// Read header/footer content
9781
$xmlReader = new XMLReader();
9882
$xmlReader->getDomFromZip($this->docFile, $xmlFile);
9983
$nodes = $xmlReader->getElements('*');
10084
if ($nodes->length > 0) {
10185
foreach ($nodes as $node) {
102-
switch ($node->nodeName) {
103-
104-
case 'w:p': // Paragraph
105-
$this->readParagraph($xmlReader, $node, $hfObject, $docPart);
106-
break;
107-
108-
case 'w:tbl': // Table
109-
$this->readTable($xmlReader, $node, $hfObject, $docPart);
110-
break;
86+
if (array_key_exists($node->nodeName, $readMethods)) {
87+
$readMethod = $readMethods[$node->nodeName];
88+
$this->$readMethod($xmlReader, $node, $hfObject, $docPart);
11189
}
11290
}
11391
}
@@ -157,4 +135,47 @@ private function readSectionStyle(XMLReader $xmlReader, \DOMElement $domNode)
157135

158136
return $styles;
159137
}
138+
139+
/**
140+
* Read w:p node
141+
*
142+
* @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader
143+
* @param \DOMElement $node
144+
* @param \PhpOffice\PhpWord\Element\Section $section
145+
*
146+
* @todo <w:lastRenderedPageBreak>
147+
*/
148+
private function readWPNode(XMLReader $xmlReader, \DOMElement $node, Section &$section)
149+
{
150+
// Page break
151+
if ($xmlReader->getAttribute('w:type', $node, 'w:r/w:br') == 'page') {
152+
$section->addPageBreak(); // PageBreak
153+
}
154+
155+
// Paragraph
156+
$this->readParagraph($xmlReader, $node, $section);
157+
158+
// Section properties
159+
if ($xmlReader->elementExists('w:pPr/w:sectPr', $node)) {
160+
$sectPrNode = $xmlReader->getElement('w:pPr/w:sectPr', $node);
161+
$this->readWSectPrNode($xmlReader, $sectPrNode, $section);
162+
$section = $this->phpWord->addSection();
163+
}
164+
}
165+
166+
/**
167+
* Read w:sectPr node
168+
*
169+
* @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader
170+
* @param \DOMElement $node
171+
* @param \PhpOffice\PhpWord\Element\Section $section
172+
*/
173+
private function readWSectPrNode(XMLReader $xmlReader, \DOMElement $node, Section &$section)
174+
{
175+
if ($node !== null) {
176+
$settings = $this->readSectionStyle($xmlReader, $node);
177+
$section->setSettings($settings);
178+
$this->readHeaderFooter($settings, $section);
179+
}
180+
}
160181
}

0 commit comments

Comments
 (0)