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)
|
public static function convertProperty($propertyValue, $propertyType)
|
||||||
{
|
{
|
||||||
switch ($propertyType) {
|
$conversion = self::getConversion($propertyType);
|
||||||
case 'empty': // Empty
|
|
||||||
|
switch ($conversion) {
|
||||||
|
case 'empty': // Empty
|
||||||
return '';
|
return '';
|
||||||
case 'null': // Null
|
case 'null': // Null
|
||||||
return null;
|
return null;
|
||||||
case 'i1': // 1-Byte Signed Integer
|
case 'int': // Signed integer
|
||||||
case 'i2': // 2-Byte Signed Integer
|
|
||||||
case 'i4': // 4-Byte Signed Integer
|
|
||||||
case 'i8': // 8-Byte Signed Integer
|
|
||||||
case 'int': // Integer
|
|
||||||
return (int) $propertyValue;
|
return (int) $propertyValue;
|
||||||
case 'ui1': // 1-Byte Unsigned Integer
|
case 'uint': // Unsigned integer
|
||||||
case 'ui2': // 2-Byte Unsigned Integer
|
|
||||||
case 'ui4': // 4-Byte Unsigned Integer
|
|
||||||
case 'ui8': // 8-Byte Unsigned Integer
|
|
||||||
case 'uint': // Unsigned Integer
|
|
||||||
return abs((int) $propertyValue);
|
return abs((int) $propertyValue);
|
||||||
case 'r4': // 4-Byte Real Number
|
case 'float': // Float
|
||||||
case 'r8': // 8-Byte Real Number
|
|
||||||
case 'decimal': // Decimal
|
|
||||||
return (float) $propertyValue;
|
return (float) $propertyValue;
|
||||||
case 'date': // Date and Time
|
case 'date': // Date
|
||||||
case 'filetime': // File Time
|
|
||||||
return strtotime($propertyValue);
|
return strtotime($propertyValue);
|
||||||
case 'bool': // Boolean
|
case 'bool': // Boolean
|
||||||
return ($propertyValue == 'true') ? true : false;
|
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;
|
return $propertyValue;
|
||||||
|
|
@ -569,10 +543,36 @@ class DocumentProperties
|
||||||
*/
|
*/
|
||||||
private function setValue($value, $default)
|
private function setValue($value, $default)
|
||||||
{
|
{
|
||||||
if (is_null($value) || $value == '') {
|
if ($value === null || $value == '') {
|
||||||
$value = $default;
|
$value = $default;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $value;
|
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;
|
namespace PhpOffice\PhpWord\Reader\ODText;
|
||||||
|
|
||||||
use PhpOffice\PhpWord\Reader\Word2007\AbstractPart as Word2007AbstractPart;
|
use PhpOffice\PhpWord\Reader\Word2007\AbstractPart as Word2007AbstractPart;
|
||||||
use PhpOffice\PhpWord\Shared\XMLReader;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract part reader
|
* Abstract part reader
|
||||||
|
|
@ -28,75 +27,4 @@ use PhpOffice\PhpWord\Shared\XMLReader;
|
||||||
*/
|
*/
|
||||||
abstract class AbstractPart extends Word2007AbstractPart
|
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
|
* @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
|
// Paragraph style
|
||||||
$paragraphStyle = null;
|
$paragraphStyle = null;
|
||||||
|
|
@ -248,7 +248,7 @@ abstract class AbstractPart
|
||||||
* @param mixed $parent
|
* @param mixed $parent
|
||||||
* @param string $docPart
|
* @param string $docPart
|
||||||
*/
|
*/
|
||||||
protected function readTable(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart)
|
protected function readTable(XMLReader $xmlReader, \DOMElement $domNode, &$parent, $docPart = 'document')
|
||||||
{
|
{
|
||||||
// Table style
|
// Table style
|
||||||
$tblStyle = null;
|
$tblStyle = null;
|
||||||
|
|
|
||||||
|
|
@ -19,14 +19,23 @@ namespace PhpOffice\PhpWord\Reader\Word2007;
|
||||||
|
|
||||||
use PhpOffice\PhpWord\PhpWord;
|
use PhpOffice\PhpWord\PhpWord;
|
||||||
use PhpOffice\PhpWord\Shared\XMLReader;
|
use PhpOffice\PhpWord\Shared\XMLReader;
|
||||||
|
use PhpOffice\PhpWord\Element\Section;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Document reader
|
* Document reader
|
||||||
*
|
*
|
||||||
* @since 0.10.0
|
* @since 0.10.0
|
||||||
|
* @SuppressWarnings(PHPMD.UnusedPrivateMethod) For readWPNode
|
||||||
*/
|
*/
|
||||||
class Document extends AbstractPart
|
class Document extends AbstractPart
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* PhpWord object
|
||||||
|
*
|
||||||
|
* @var \PhpOffice\PhpWord\PhpWord
|
||||||
|
*/
|
||||||
|
private $phpWord;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read document.xml
|
* Read document.xml
|
||||||
*
|
*
|
||||||
|
|
@ -34,45 +43,18 @@ class Document extends AbstractPart
|
||||||
*/
|
*/
|
||||||
public function read(PhpWord &$phpWord)
|
public function read(PhpWord &$phpWord)
|
||||||
{
|
{
|
||||||
|
$this->phpWord = $phpWord;
|
||||||
$xmlReader = new XMLReader();
|
$xmlReader = new XMLReader();
|
||||||
$xmlReader->getDomFromZip($this->docFile, $this->xmlFile);
|
$xmlReader->getDomFromZip($this->docFile, $this->xmlFile);
|
||||||
|
$readMethods = array('w:p' => 'readWPNode', 'w:tbl' => 'readTable', 'w:sectPr' => 'readWSectPrNode');
|
||||||
|
|
||||||
$nodes = $xmlReader->getElements('w:body/*');
|
$nodes = $xmlReader->getElements('w:body/*');
|
||||||
if ($nodes->length > 0) {
|
if ($nodes->length > 0) {
|
||||||
$section = $phpWord->addSection();
|
$section = $this->phpWord->addSection();
|
||||||
foreach ($nodes as $node) {
|
foreach ($nodes as $node) {
|
||||||
switch ($node->nodeName) {
|
if (array_key_exists($node->nodeName, $readMethods)) {
|
||||||
|
$readMethod = $readMethods[$node->nodeName];
|
||||||
case 'w:p': // Paragraph
|
$this->$readMethod($xmlReader, $node, $section);
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -84,14 +66,16 @@ class Document extends AbstractPart
|
||||||
* @param array $settings
|
* @param array $settings
|
||||||
* @param \PhpOffice\PhpWord\Element\Section $section
|
* @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)) {
|
if (is_array($settings) && array_key_exists('hf', $settings)) {
|
||||||
foreach ($settings['hf'] as $rId => $hfSetting) {
|
foreach ($settings['hf'] as $rId => $hfSetting) {
|
||||||
if (array_key_exists($rId, $this->rels['document'])) {
|
if (array_key_exists($rId, $this->rels['document'])) {
|
||||||
list($hfType, $xmlFile, $docPart) = array_values($this->rels['document'][$rId]);
|
list($hfType, $xmlFile, $docPart) = array_values($this->rels['document'][$rId]);
|
||||||
$method = "add{$hfType}";
|
$addMethod = "add{$hfType}";
|
||||||
$hfObject = $section->$method($hfSetting['type']);
|
$hfObject = $section->$addMethod($hfSetting['type']);
|
||||||
|
|
||||||
// Read header/footer content
|
// Read header/footer content
|
||||||
$xmlReader = new XMLReader();
|
$xmlReader = new XMLReader();
|
||||||
|
|
@ -99,15 +83,9 @@ class Document extends AbstractPart
|
||||||
$nodes = $xmlReader->getElements('*');
|
$nodes = $xmlReader->getElements('*');
|
||||||
if ($nodes->length > 0) {
|
if ($nodes->length > 0) {
|
||||||
foreach ($nodes as $node) {
|
foreach ($nodes as $node) {
|
||||||
switch ($node->nodeName) {
|
if (array_key_exists($node->nodeName, $readMethods)) {
|
||||||
|
$readMethod = $readMethods[$node->nodeName];
|
||||||
case 'w:p': // Paragraph
|
$this->$readMethod($xmlReader, $node, $hfObject, $docPart);
|
||||||
$this->readParagraph($xmlReader, $node, $hfObject, $docPart);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'w:tbl': // Table
|
|
||||||
$this->readTable($xmlReader, $node, $hfObject, $docPart);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -157,4 +135,47 @@ class Document extends AbstractPart
|
||||||
|
|
||||||
return $styles;
|
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