Reduce cyclomatic complexity on DocumentProperties and Word2007 Document Writer.
This commit is contained in:
commit
d79ca9ae31
|
|
@ -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';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue