Refactoring to extract DocProperties Reader from Gnumeric Reader (#2007)
* Refactoring to extract DocProperties Reader from Gnumeric Reader
This commit is contained in:
parent
f49a951bea
commit
caf11fe808
|
|
@ -2875,16 +2875,6 @@ parameters:
|
||||||
count: 1
|
count: 1
|
||||||
path: src/PhpSpreadsheet/Reader/Gnumeric.php
|
path: src/PhpSpreadsheet/Reader/Gnumeric.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$timestamp of method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:setCreated\\(\\) expects int\\|string\\|null, int\\|false given\\.$#"
|
|
||||||
count: 2
|
|
||||||
path: src/PhpSpreadsheet/Reader/Gnumeric.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$timestamp of method PhpOffice\\\\PhpSpreadsheet\\\\Document\\\\Properties\\:\\:setModified\\(\\) expects int\\|string\\|null, int\\|false given\\.$#"
|
|
||||||
count: 2
|
|
||||||
path: src/PhpSpreadsheet/Reader/Gnumeric.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Offset 'No' does not exist on SimpleXMLElement\\|null\\.$#"
|
message: "#^Offset 'No' does not exist on SimpleXMLElement\\|null\\.$#"
|
||||||
count: 2
|
count: 2
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
||||||
use PhpOffice\PhpSpreadsheet\Cell\DataType;
|
use PhpOffice\PhpSpreadsheet\Cell\DataType;
|
||||||
use PhpOffice\PhpSpreadsheet\DefinedName;
|
use PhpOffice\PhpSpreadsheet\DefinedName;
|
||||||
use PhpOffice\PhpSpreadsheet\Reader\Gnumeric\PageSetup;
|
use PhpOffice\PhpSpreadsheet\Reader\Gnumeric\PageSetup;
|
||||||
|
use PhpOffice\PhpSpreadsheet\Reader\Gnumeric\Properties;
|
||||||
use PhpOffice\PhpSpreadsheet\Reader\Security\XmlScanner;
|
use PhpOffice\PhpSpreadsheet\Reader\Security\XmlScanner;
|
||||||
use PhpOffice\PhpSpreadsheet\ReferenceHelper;
|
use PhpOffice\PhpSpreadsheet\ReferenceHelper;
|
||||||
use PhpOffice\PhpSpreadsheet\RichText\RichText;
|
use PhpOffice\PhpSpreadsheet\RichText\RichText;
|
||||||
|
|
@ -262,148 +263,6 @@ class Gnumeric extends BaseReader
|
||||||
return self::$mappings;
|
return self::$mappings;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function docPropertiesOld(SimpleXMLElement $gnmXML): void
|
|
||||||
{
|
|
||||||
$docProps = $this->spreadsheet->getProperties();
|
|
||||||
foreach ($gnmXML->Summary->Item as $summaryItem) {
|
|
||||||
$propertyName = $summaryItem->name;
|
|
||||||
$propertyValue = $summaryItem->{'val-string'};
|
|
||||||
switch ($propertyName) {
|
|
||||||
case 'title':
|
|
||||||
$docProps->setTitle(trim($propertyValue));
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'comments':
|
|
||||||
$docProps->setDescription(trim($propertyValue));
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'keywords':
|
|
||||||
$docProps->setKeywords(trim($propertyValue));
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'category':
|
|
||||||
$docProps->setCategory(trim($propertyValue));
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'manager':
|
|
||||||
$docProps->setManager(trim($propertyValue));
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'author':
|
|
||||||
$docProps->setCreator(trim($propertyValue));
|
|
||||||
$docProps->setLastModifiedBy(trim($propertyValue));
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'company':
|
|
||||||
$docProps->setCompany(trim($propertyValue));
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function docPropertiesDC(SimpleXMLElement $officePropertyDC): void
|
|
||||||
{
|
|
||||||
$docProps = $this->spreadsheet->getProperties();
|
|
||||||
foreach ($officePropertyDC as $propertyName => $propertyValue) {
|
|
||||||
$propertyValue = trim((string) $propertyValue);
|
|
||||||
switch ($propertyName) {
|
|
||||||
case 'title':
|
|
||||||
$docProps->setTitle($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'subject':
|
|
||||||
$docProps->setSubject($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'creator':
|
|
||||||
$docProps->setCreator($propertyValue);
|
|
||||||
$docProps->setLastModifiedBy($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'date':
|
|
||||||
$creationDate = strtotime($propertyValue);
|
|
||||||
$docProps->setCreated($creationDate);
|
|
||||||
$docProps->setModified($creationDate);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'description':
|
|
||||||
$docProps->setDescription($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function docPropertiesMeta(SimpleXMLElement $officePropertyMeta, array $namespacesMeta): void
|
|
||||||
{
|
|
||||||
$docProps = $this->spreadsheet->getProperties();
|
|
||||||
foreach ($officePropertyMeta as $propertyName => $propertyValue) {
|
|
||||||
$attributes = $propertyValue->attributes($namespacesMeta['meta']);
|
|
||||||
$propertyValue = trim((string) $propertyValue);
|
|
||||||
switch ($propertyName) {
|
|
||||||
case 'keyword':
|
|
||||||
$docProps->setKeywords($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'initial-creator':
|
|
||||||
$docProps->setCreator($propertyValue);
|
|
||||||
$docProps->setLastModifiedBy($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'creation-date':
|
|
||||||
$creationDate = strtotime($propertyValue);
|
|
||||||
$docProps->setCreated($creationDate);
|
|
||||||
$docProps->setModified($creationDate);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'user-defined':
|
|
||||||
[, $attrName] = explode(':', $attributes['name']);
|
|
||||||
switch ($attrName) {
|
|
||||||
case 'publisher':
|
|
||||||
$docProps->setCompany($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'category':
|
|
||||||
$docProps->setCategory($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
case 'manager':
|
|
||||||
$docProps->setManager($propertyValue);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function docProperties(SimpleXMLElement $xml, SimpleXMLElement $gnmXML, array $namespacesMeta): void
|
|
||||||
{
|
|
||||||
if (isset($namespacesMeta['office'])) {
|
|
||||||
$officeXML = $xml->children($namespacesMeta['office']);
|
|
||||||
$officeDocXML = $officeXML->{'document-meta'};
|
|
||||||
$officeDocMetaXML = $officeDocXML->meta;
|
|
||||||
|
|
||||||
foreach ($officeDocMetaXML as $officePropertyData) {
|
|
||||||
$officePropertyDC = [];
|
|
||||||
if (isset($namespacesMeta['dc'])) {
|
|
||||||
$officePropertyDC = $officePropertyData->children($namespacesMeta['dc']);
|
|
||||||
}
|
|
||||||
$this->docPropertiesDC($officePropertyDC);
|
|
||||||
|
|
||||||
$officePropertyMeta = [];
|
|
||||||
if (isset($namespacesMeta['meta'])) {
|
|
||||||
$officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);
|
|
||||||
}
|
|
||||||
$this->docPropertiesMeta($officePropertyMeta, $namespacesMeta);
|
|
||||||
}
|
|
||||||
} elseif (isset($gnmXML->Summary)) {
|
|
||||||
$this->docPropertiesOld($gnmXML);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function processComments(SimpleXMLElement $sheet): void
|
private function processComments(SimpleXMLElement $sheet): void
|
||||||
{
|
{
|
||||||
if ((!$this->readDataOnly) && (isset($sheet->Objects))) {
|
if ((!$this->readDataOnly) && (isset($sheet->Objects))) {
|
||||||
|
|
@ -450,7 +309,7 @@ class Gnumeric extends BaseReader
|
||||||
$this->gnm = array_key_exists('gmr', $namespacesMeta) ? 'gmr' : 'gnm';
|
$this->gnm = array_key_exists('gmr', $namespacesMeta) ? 'gmr' : 'gnm';
|
||||||
|
|
||||||
$gnmXML = $xml->children($namespacesMeta[$this->gnm]);
|
$gnmXML = $xml->children($namespacesMeta[$this->gnm]);
|
||||||
$this->docProperties($xml, $gnmXML, $namespacesMeta);
|
(new Properties($this->spreadsheet))->readProperties($xml, $gnmXML, $namespacesMeta);
|
||||||
|
|
||||||
$worksheetID = 0;
|
$worksheetID = 0;
|
||||||
foreach ($gnmXML->Sheets->Sheet as $sheet) {
|
foreach ($gnmXML->Sheets->Sheet as $sheet) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,167 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace PhpOffice\PhpSpreadsheet\Reader\Gnumeric;
|
||||||
|
|
||||||
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||||
|
use SimpleXMLElement;
|
||||||
|
|
||||||
|
class Properties
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Spreadsheet
|
||||||
|
*/
|
||||||
|
protected $spreadsheet;
|
||||||
|
|
||||||
|
public function __construct(Spreadsheet $spreadsheet)
|
||||||
|
{
|
||||||
|
$this->spreadsheet = $spreadsheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function docPropertiesOld(SimpleXMLElement $gnmXML): void
|
||||||
|
{
|
||||||
|
$docProps = $this->spreadsheet->getProperties();
|
||||||
|
foreach ($gnmXML->Summary->Item as $summaryItem) {
|
||||||
|
$propertyName = $summaryItem->name;
|
||||||
|
$propertyValue = $summaryItem->{'val-string'};
|
||||||
|
switch ($propertyName) {
|
||||||
|
case 'title':
|
||||||
|
$docProps->setTitle(trim($propertyValue));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'comments':
|
||||||
|
$docProps->setDescription(trim($propertyValue));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'keywords':
|
||||||
|
$docProps->setKeywords(trim($propertyValue));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'category':
|
||||||
|
$docProps->setCategory(trim($propertyValue));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'manager':
|
||||||
|
$docProps->setManager(trim($propertyValue));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'author':
|
||||||
|
$docProps->setCreator(trim($propertyValue));
|
||||||
|
$docProps->setLastModifiedBy(trim($propertyValue));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'company':
|
||||||
|
$docProps->setCompany(trim($propertyValue));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function docPropertiesDC(SimpleXMLElement $officePropertyDC): void
|
||||||
|
{
|
||||||
|
$docProps = $this->spreadsheet->getProperties();
|
||||||
|
foreach ($officePropertyDC as $propertyName => $propertyValue) {
|
||||||
|
$propertyValue = trim((string) $propertyValue);
|
||||||
|
switch ($propertyName) {
|
||||||
|
case 'title':
|
||||||
|
$docProps->setTitle($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'subject':
|
||||||
|
$docProps->setSubject($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'creator':
|
||||||
|
$docProps->setCreator($propertyValue);
|
||||||
|
$docProps->setLastModifiedBy($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'date':
|
||||||
|
$creationDate = strtotime($propertyValue);
|
||||||
|
$creationDate = $creationDate === false ? time() : $creationDate;
|
||||||
|
$docProps->setCreated($creationDate);
|
||||||
|
$docProps->setModified($creationDate);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'description':
|
||||||
|
$docProps->setDescription($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function docPropertiesMeta(SimpleXMLElement $officePropertyMeta, array $namespacesMeta): void
|
||||||
|
{
|
||||||
|
$docProps = $this->spreadsheet->getProperties();
|
||||||
|
foreach ($officePropertyMeta as $propertyName => $propertyValue) {
|
||||||
|
if ($propertyValue === null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$attributes = $propertyValue->attributes($namespacesMeta['meta']);
|
||||||
|
$propertyValue = trim((string) $propertyValue);
|
||||||
|
switch ($propertyName) {
|
||||||
|
case 'keyword':
|
||||||
|
$docProps->setKeywords($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'initial-creator':
|
||||||
|
$docProps->setCreator($propertyValue);
|
||||||
|
$docProps->setLastModifiedBy($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'creation-date':
|
||||||
|
$creationDate = strtotime($propertyValue);
|
||||||
|
$creationDate = $creationDate === false ? time() : $creationDate;
|
||||||
|
$docProps->setCreated($creationDate);
|
||||||
|
$docProps->setModified($creationDate);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'user-defined':
|
||||||
|
[, $attrName] = explode(':', $attributes['name']);
|
||||||
|
switch ($attrName) {
|
||||||
|
case 'publisher':
|
||||||
|
$docProps->setCompany($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'category':
|
||||||
|
$docProps->setCategory($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'manager':
|
||||||
|
$docProps->setManager($propertyValue);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readProperties(SimpleXMLElement $xml, SimpleXMLElement $gnmXML, array $namespacesMeta): void
|
||||||
|
{
|
||||||
|
if (isset($namespacesMeta['office'])) {
|
||||||
|
$officeXML = $xml->children($namespacesMeta['office']);
|
||||||
|
$officeDocXML = $officeXML->{'document-meta'};
|
||||||
|
$officeDocMetaXML = $officeDocXML->meta;
|
||||||
|
|
||||||
|
foreach ($officeDocMetaXML as $officePropertyData) {
|
||||||
|
$officePropertyDC = [];
|
||||||
|
if (isset($namespacesMeta['dc'])) {
|
||||||
|
$officePropertyDC = $officePropertyData->children($namespacesMeta['dc']);
|
||||||
|
}
|
||||||
|
$this->docPropertiesDC($officePropertyDC);
|
||||||
|
|
||||||
|
$officePropertyMeta = [];
|
||||||
|
if (isset($namespacesMeta['meta'])) {
|
||||||
|
$officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);
|
||||||
|
}
|
||||||
|
$this->docPropertiesMeta($officePropertyMeta, $namespacesMeta);
|
||||||
|
}
|
||||||
|
} elseif (isset($gnmXML->Summary)) {
|
||||||
|
$this->docPropertiesOld($gnmXML);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue