Passed
Push — master ( b20f5c...b636c5 )
by Adrien
29:30 queued 11:53
created

Properties::setCoreProperties()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 32
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 8.8847

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 24
c 1
b 0
f 0
nc 8
nop 2
dl 0
loc 32
ccs 19
cts 25
cp 0.76
crap 8.8847
rs 8.4444
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Reader\Ods;
4
5
use PhpOffice\PhpSpreadsheet\Document\Properties as DocumentProperties;
6
use PhpOffice\PhpSpreadsheet\Spreadsheet;
7
8
class Properties
9
{
10
    private $spreadsheet;
11
12 14
    public function __construct(Spreadsheet $spreadsheet)
13
    {
14 14
        $this->spreadsheet = $spreadsheet;
15 14
    }
16
17 14
    public function load(\SimpleXMLElement $xml, $namespacesMeta)
18
    {
19 14
        $docProps = $this->spreadsheet->getProperties();
20 14
        $officeProperty = $xml->children($namespacesMeta['office']);
21 14
        foreach ($officeProperty as $officePropertyData) {
22
            // @var \SimpleXMLElement $officePropertyData
23 14
            if (isset($namespacesMeta['dc'])) {
24 14
                $officePropertiesDC = $officePropertyData->children($namespacesMeta['dc']);
25 14
                $this->setCoreProperties($docProps, $officePropertiesDC);
26
            }
27
28 14
            $officePropertyMeta = (object) [];
29 14
            if (isset($namespacesMeta['dc'])) {
30 14
                $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']);
31
            }
32 14
            foreach ($officePropertyMeta as $propertyName => $propertyValue) {
33 14
                $this->setMetaProperties($namespacesMeta, $propertyValue, $propertyName, $docProps);
34
            }
35
        }
36 14
    }
37
38 14
    private function setCoreProperties(DocumentProperties $docProps, \SimpleXMLElement $officePropertyDC)
39
    {
40 14
        foreach ($officePropertyDC as $propertyName => $propertyValue) {
41 14
            $propertyValue = (string) $propertyValue;
42 14
            switch ($propertyName) {
43 14
                case 'title':
44 12
                    $docProps->setTitle($propertyValue);
45
46 12
                    break;
47 14
                case 'subject':
48 12
                    $docProps->setSubject($propertyValue);
49
50 12
                    break;
51 14
                case 'creator':
52 5
                    $docProps->setCreator($propertyValue);
53 5
                    $docProps->setLastModifiedBy($propertyValue);
54
55 5
                    break;
56 14
                case 'creation-date':
57
                    $creationDate = strtotime($propertyValue);
58
                    $docProps->setCreated($creationDate);
59
                    $docProps->setModified($creationDate);
60
61
                    break;
62 14
                case 'keyword':
63
                    $docProps->setKeywords($propertyValue);
64
65
                    break;
66 14
                case 'description':
67 11
                    $docProps->setDescription($propertyValue);
68
69 11
                    break;
70
            }
71
        }
72 14
    }
73
74 14
    private function setMetaProperties(
75
        $namespacesMeta,
76
        \SimpleXMLElement $propertyValue,
77
        $propertyName,
78
        DocumentProperties $docProps
79
    ) {
80 14
        $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']);
81 14
        $propertyValue = (string) $propertyValue;
82 14
        switch ($propertyName) {
83 14
            case 'initial-creator':
84 11
                $docProps->setCreator($propertyValue);
85
86 11
                break;
87 14
            case 'keyword':
88 12
                $docProps->setKeywords($propertyValue);
89
90 12
                break;
91 14
            case 'creation-date':
92 14
                $creationDate = strtotime($propertyValue);
93 14
                $docProps->setCreated($creationDate);
94
95 14
                break;
96 14
            case 'user-defined':
97 12
                $this->setUserDefinedProperty($propertyValueAttributes, $propertyValue, $docProps);
98
99 12
                break;
100
        }
101 14
    }
102
103 12
    private function setUserDefinedProperty($propertyValueAttributes, $propertyValue, DocumentProperties $docProps)
104
    {
105 12
        $propertyValueName = '';
106 12
        $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING;
107 12
        foreach ($propertyValueAttributes as $key => $value) {
108 12
            if ($key == 'name') {
109 12
                $propertyValueName = (string) $value;
110 1
            } elseif ($key == 'value-type') {
111 1
                switch ($value) {
112 1
                    case 'date':
113 1
                        $propertyValue = DocumentProperties::convertProperty($propertyValue, 'date');
114 1
                        $propertyValueType = DocumentProperties::PROPERTY_TYPE_DATE;
115
116 1
                        break;
117 1
                    case 'boolean':
118 1
                        $propertyValue = DocumentProperties::convertProperty($propertyValue, 'bool');
119 1
                        $propertyValueType = DocumentProperties::PROPERTY_TYPE_BOOLEAN;
120
121 1
                        break;
122 1
                    case 'float':
123 1
                        $propertyValue = DocumentProperties::convertProperty($propertyValue, 'r4');
124 1
                        $propertyValueType = DocumentProperties::PROPERTY_TYPE_FLOAT;
125
126 1
                        break;
127
                    default:
128 1
                        $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING;
129
                }
130
            }
131
        }
132
133 12
        $docProps->setCustomProperty($propertyValueName, $propertyValue, $propertyValueType);
134 12
    }
135
}
136