Completed
Push — develop ( 8cf911...93ccf7 )
by Adrien
33:03
created

Theme::writeTheme()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 674
Code Lines 364

Duplication

Lines 5
Ratio 0.74 %

Code Coverage

Tests 362
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 364
c 1
b 0
f 0
nc 2
nop 1
dl 5
loc 674
ccs 362
cts 363
cp 0.9972
crap 2
rs 8.2857

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Writer\Excel2007;
4
5
/**
6
 * PhpSpreadsheet
7
 *
8
 * Copyright (c) 2006 - 2016 PhpSpreadsheet
9
 *
10
 * This library is free software; you can redistribute it and/or
11
 * modify it under the terms of the GNU Lesser General Public
12
 * License as published by the Free Software Foundation; either
13
 * version 2.1 of the License, or (at your option) any later version.
14
 *
15
 * This library is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18
 * Lesser General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU Lesser General Public
21
 * License along with this library; if not, write to the Free Software
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
23
 *
24
 * @category   PhpSpreadsheet
25
 * @copyright  Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
26
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
27
 * @version    ##VERSION##, ##DATE##
28
 */
29
30
/**
31
 * @category   PhpSpreadsheet
32
 * @copyright  Copyright (c) 2006 - 2016 PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet)
33
 */
34
class Theme extends WriterPart
35
{
36
    /**
37
     * Map of Major fonts to write
38
     * @static    array of string
39
     */
40
    private static $majorFonts = [
41
        'Jpan' => 'MS Pゴシック',
42
        'Hang' => '맑은 고딕',
43
        'Hans' => '宋体',
44
        'Hant' => '新細明體',
45
        'Arab' => 'Times New Roman',
46
        'Hebr' => 'Times New Roman',
47
        'Thai' => 'Tahoma',
48
        'Ethi' => 'Nyala',
49
        'Beng' => 'Vrinda',
50
        'Gujr' => 'Shruti',
51
        'Khmr' => 'MoolBoran',
52
        'Knda' => 'Tunga',
53
        'Guru' => 'Raavi',
54
        'Cans' => 'Euphemia',
55
        'Cher' => 'Plantagenet Cherokee',
56
        'Yiii' => 'Microsoft Yi Baiti',
57
        'Tibt' => 'Microsoft Himalaya',
58
        'Thaa' => 'MV Boli',
59
        'Deva' => 'Mangal',
60
        'Telu' => 'Gautami',
61
        'Taml' => 'Latha',
62
        'Syrc' => 'Estrangelo Edessa',
63
        'Orya' => 'Kalinga',
64
        'Mlym' => 'Kartika',
65
        'Laoo' => 'DokChampa',
66
        'Sinh' => 'Iskoola Pota',
67
        'Mong' => 'Mongolian Baiti',
68
        'Viet' => 'Times New Roman',
69
        'Uigh' => 'Microsoft Uighur',
70
        'Geor' => 'Sylfaen',
71
    ];
72
73
    /**
74
     * Map of Minor fonts to write
75
     * @static    array of string
76
     */
77
    private static $minorFonts = [
78
        'Jpan' => 'MS Pゴシック',
79
        'Hang' => '맑은 고딕',
80
        'Hans' => '宋体',
81
        'Hant' => '新細明體',
82
        'Arab' => 'Arial',
83
        'Hebr' => 'Arial',
84
        'Thai' => 'Tahoma',
85
        'Ethi' => 'Nyala',
86
        'Beng' => 'Vrinda',
87
        'Gujr' => 'Shruti',
88
        'Khmr' => 'DaunPenh',
89
        'Knda' => 'Tunga',
90
        'Guru' => 'Raavi',
91
        'Cans' => 'Euphemia',
92
        'Cher' => 'Plantagenet Cherokee',
93
        'Yiii' => 'Microsoft Yi Baiti',
94
        'Tibt' => 'Microsoft Himalaya',
95
        'Thaa' => 'MV Boli',
96
        'Deva' => 'Mangal',
97
        'Telu' => 'Gautami',
98
        'Taml' => 'Latha',
99
        'Syrc' => 'Estrangelo Edessa',
100
        'Orya' => 'Kalinga',
101
        'Mlym' => 'Kartika',
102
        'Laoo' => 'DokChampa',
103
        'Sinh' => 'Iskoola Pota',
104
        'Mong' => 'Mongolian Baiti',
105
        'Viet' => 'Arial',
106
        'Uigh' => 'Microsoft Uighur',
107
        'Geor' => 'Sylfaen',
108
    ];
109
110
    /**
111
     * Map of core colours
112
     * @static    array of string
113
     */
114
    private static $colourScheme = [
115
        'dk2' => '1F497D',
116
        'lt2' => 'EEECE1',
117
        'accent1' => '4F81BD',
118
        'accent2' => 'C0504D',
119
        'accent3' => '9BBB59',
120
        'accent4' => '8064A2',
121
        'accent5' => '4BACC6',
122
        'accent6' => 'F79646',
123
        'hlink' => '0000FF',
124
        'folHlink' => '800080',
125
    ];
126
127
    /**
128
     * Write theme to XML format
129
     *
130
     * @param \PhpOffice\PhpSpreadsheet\SpreadSheet $spreadsheet
131
     * @throws     \PhpOffice\PhpSpreadsheet\Writer\Exception
132
     * @return string  XML Output
133
     */
134 56
    public function writeTheme(\PhpOffice\PhpSpreadsheet\SpreadSheet $spreadsheet = null)
0 ignored issues
show
Unused Code introduced by
The parameter $spreadsheet is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
135
    {
136
        // Create XML writer
137 56
        $objWriter = null;
0 ignored issues
show
Unused Code introduced by
$objWriter is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
138 56 View Code Duplication
        if ($this->getParentWriter()->getUseDiskCaching()) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
Bug introduced by
It seems like you code against a concrete implementation and not the interface PhpOffice\PhpSpreadsheet\Writer\IWriter as the method getUseDiskCaching() does only exist in the following implementations of said interface: PhpOffice\PhpSpreadsheet\Writer\BaseWriter, PhpOffice\PhpSpreadsheet\Writer\CSV, PhpOffice\PhpSpreadsheet\Writer\Excel2007, PhpOffice\PhpSpreadsheet\Writer\Excel5, PhpOffice\PhpSpreadsheet\Writer\HTML, PhpOffice\PhpSpreadsheet\Writer\OpenDocument, PhpOffice\PhpSpreadsheet\Writer\PDF\Core, PhpOffice\PhpSpreadsheet\Writer\PDF\DomPDF, PhpOffice\PhpSpreadsheet\Writer\PDF\MPDF, PhpOffice\PhpSpreadsheet\Writer\PDF\TcPDF.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
139
            $objWriter = new \PhpOffice\PhpSpreadsheet\Shared\XMLWriter(\PhpOffice\PhpSpreadsheet\Shared\XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
0 ignored issues
show
Bug introduced by
It seems like you code against a concrete implementation and not the interface PhpOffice\PhpSpreadsheet\Writer\IWriter as the method getDiskCachingDirectory() does only exist in the following implementations of said interface: PhpOffice\PhpSpreadsheet\Writer\BaseWriter, PhpOffice\PhpSpreadsheet\Writer\CSV, PhpOffice\PhpSpreadsheet\Writer\Excel2007, PhpOffice\PhpSpreadsheet\Writer\Excel5, PhpOffice\PhpSpreadsheet\Writer\HTML, PhpOffice\PhpSpreadsheet\Writer\OpenDocument, PhpOffice\PhpSpreadsheet\Writer\PDF\Core, PhpOffice\PhpSpreadsheet\Writer\PDF\DomPDF, PhpOffice\PhpSpreadsheet\Writer\PDF\MPDF, PhpOffice\PhpSpreadsheet\Writer\PDF\TcPDF.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
140
        } else {
141 56
            $objWriter = new \PhpOffice\PhpSpreadsheet\Shared\XMLWriter(\PhpOffice\PhpSpreadsheet\Shared\XMLWriter::STORAGE_MEMORY);
142
        }
143
144
        // XML header
145 56
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
146
147
        // a:theme
148 56
        $objWriter->startElement('a:theme');
149 56
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
150 56
        $objWriter->writeAttribute('name', 'Office Theme');
151
152
            // a:themeElements
153 56
            $objWriter->startElement('a:themeElements');
154
155
                // a:clrScheme
156 56
                $objWriter->startElement('a:clrScheme');
157 56
        $objWriter->writeAttribute('name', 'Office');
158
159
                    // a:dk1
160 56
                    $objWriter->startElement('a:dk1');
161
162
                        // a:sysClr
163 56
                        $objWriter->startElement('a:sysClr');
164 56
        $objWriter->writeAttribute('val', 'windowText');
165 56
        $objWriter->writeAttribute('lastClr', '000000');
166 56
        $objWriter->endElement();
167
168 56
        $objWriter->endElement();
169
170
                    // a:lt1
171 56
                    $objWriter->startElement('a:lt1');
172
173
                        // a:sysClr
174 56
                        $objWriter->startElement('a:sysClr');
175 56
        $objWriter->writeAttribute('val', 'window');
176 56
        $objWriter->writeAttribute('lastClr', 'FFFFFF');
177 56
        $objWriter->endElement();
178
179 56
        $objWriter->endElement();
180
181
                    // a:dk2
182 56
                    $this->writeColourScheme($objWriter);
183
184 56
        $objWriter->endElement();
185
186
                // a:fontScheme
187 56
                $objWriter->startElement('a:fontScheme');
188 56
        $objWriter->writeAttribute('name', 'Office');
189
190
                    // a:majorFont
191 56
                    $objWriter->startElement('a:majorFont');
192 56
        $this->writeFonts($objWriter, 'Cambria', self::$majorFonts);
193 56
        $objWriter->endElement();
194
195
                    // a:minorFont
196 56
                    $objWriter->startElement('a:minorFont');
197 56
        $this->writeFonts($objWriter, 'Calibri', self::$minorFonts);
198 56
        $objWriter->endElement();
199
200 56
        $objWriter->endElement();
201
202
                // a:fmtScheme
203 56
                $objWriter->startElement('a:fmtScheme');
204 56
        $objWriter->writeAttribute('name', 'Office');
205
206
                    // a:fillStyleLst
207 56
                    $objWriter->startElement('a:fillStyleLst');
208
209
                        // a:solidFill
210 56
                        $objWriter->startElement('a:solidFill');
211
212
                            // a:schemeClr
213 56
                            $objWriter->startElement('a:schemeClr');
214 56
        $objWriter->writeAttribute('val', 'phClr');
215 56
        $objWriter->endElement();
216
217 56
        $objWriter->endElement();
218
219
                        // a:gradFill
220 56
                        $objWriter->startElement('a:gradFill');
221 56
        $objWriter->writeAttribute('rotWithShape', '1');
222
223
                            // a:gsLst
224 56
                            $objWriter->startElement('a:gsLst');
225
226
                                // a:gs
227 56
                                $objWriter->startElement('a:gs');
228 56
        $objWriter->writeAttribute('pos', '0');
229
230
                                    // a:schemeClr
231 56
                                    $objWriter->startElement('a:schemeClr');
232 56
        $objWriter->writeAttribute('val', 'phClr');
233
234
                                        // a:tint
235 56
                                        $objWriter->startElement('a:tint');
236 56
        $objWriter->writeAttribute('val', '50000');
237 56
        $objWriter->endElement();
238
239
                                        // a:satMod
240 56
                                        $objWriter->startElement('a:satMod');
241 56
        $objWriter->writeAttribute('val', '300000');
242 56
        $objWriter->endElement();
243
244 56
        $objWriter->endElement();
245
246 56
        $objWriter->endElement();
247
248
                                // a:gs
249 56
                                $objWriter->startElement('a:gs');
250 56
        $objWriter->writeAttribute('pos', '35000');
251
252
                                    // a:schemeClr
253 56
                                    $objWriter->startElement('a:schemeClr');
254 56
        $objWriter->writeAttribute('val', 'phClr');
255
256
                                        // a:tint
257 56
                                        $objWriter->startElement('a:tint');
258 56
        $objWriter->writeAttribute('val', '37000');
259 56
        $objWriter->endElement();
260
261
                                        // a:satMod
262 56
                                        $objWriter->startElement('a:satMod');
263 56
        $objWriter->writeAttribute('val', '300000');
264 56
        $objWriter->endElement();
265
266 56
        $objWriter->endElement();
267
268 56
        $objWriter->endElement();
269
270
                                // a:gs
271 56
                                $objWriter->startElement('a:gs');
272 56
        $objWriter->writeAttribute('pos', '100000');
273
274
                                    // a:schemeClr
275 56
                                    $objWriter->startElement('a:schemeClr');
276 56
        $objWriter->writeAttribute('val', 'phClr');
277
278
                                        // a:tint
279 56
                                        $objWriter->startElement('a:tint');
280 56
        $objWriter->writeAttribute('val', '15000');
281 56
        $objWriter->endElement();
282
283
                                        // a:satMod
284 56
                                        $objWriter->startElement('a:satMod');
285 56
        $objWriter->writeAttribute('val', '350000');
286 56
        $objWriter->endElement();
287
288 56
        $objWriter->endElement();
289
290 56
        $objWriter->endElement();
291
292 56
        $objWriter->endElement();
293
294
                            // a:lin
295 56
                            $objWriter->startElement('a:lin');
296 56
        $objWriter->writeAttribute('ang', '16200000');
297 56
        $objWriter->writeAttribute('scaled', '1');
298 56
        $objWriter->endElement();
299
300 56
        $objWriter->endElement();
301
302
                        // a:gradFill
303 56
                        $objWriter->startElement('a:gradFill');
304 56
        $objWriter->writeAttribute('rotWithShape', '1');
305
306
                            // a:gsLst
307 56
                            $objWriter->startElement('a:gsLst');
308
309
                                // a:gs
310 56
                                $objWriter->startElement('a:gs');
311 56
        $objWriter->writeAttribute('pos', '0');
312
313
                                    // a:schemeClr
314 56
                                    $objWriter->startElement('a:schemeClr');
315 56
        $objWriter->writeAttribute('val', 'phClr');
316
317
                                        // a:shade
318 56
                                        $objWriter->startElement('a:shade');
319 56
        $objWriter->writeAttribute('val', '51000');
320 56
        $objWriter->endElement();
321
322
                                        // a:satMod
323 56
                                        $objWriter->startElement('a:satMod');
324 56
        $objWriter->writeAttribute('val', '130000');
325 56
        $objWriter->endElement();
326
327 56
        $objWriter->endElement();
328
329 56
        $objWriter->endElement();
330
331
                                // a:gs
332 56
                                $objWriter->startElement('a:gs');
333 56
        $objWriter->writeAttribute('pos', '80000');
334
335
                                    // a:schemeClr
336 56
                                    $objWriter->startElement('a:schemeClr');
337 56
        $objWriter->writeAttribute('val', 'phClr');
338
339
                                        // a:shade
340 56
                                        $objWriter->startElement('a:shade');
341 56
        $objWriter->writeAttribute('val', '93000');
342 56
        $objWriter->endElement();
343
344
                                        // a:satMod
345 56
                                        $objWriter->startElement('a:satMod');
346 56
        $objWriter->writeAttribute('val', '130000');
347 56
        $objWriter->endElement();
348
349 56
        $objWriter->endElement();
350
351 56
        $objWriter->endElement();
352
353
                                // a:gs
354 56
                                $objWriter->startElement('a:gs');
355 56
        $objWriter->writeAttribute('pos', '100000');
356
357
                                    // a:schemeClr
358 56
                                    $objWriter->startElement('a:schemeClr');
359 56
        $objWriter->writeAttribute('val', 'phClr');
360
361
                                        // a:shade
362 56
                                        $objWriter->startElement('a:shade');
363 56
        $objWriter->writeAttribute('val', '94000');
364 56
        $objWriter->endElement();
365
366
                                        // a:satMod
367 56
                                        $objWriter->startElement('a:satMod');
368 56
        $objWriter->writeAttribute('val', '135000');
369 56
        $objWriter->endElement();
370
371 56
        $objWriter->endElement();
372
373 56
        $objWriter->endElement();
374
375 56
        $objWriter->endElement();
376
377
                            // a:lin
378 56
                            $objWriter->startElement('a:lin');
379 56
        $objWriter->writeAttribute('ang', '16200000');
380 56
        $objWriter->writeAttribute('scaled', '0');
381 56
        $objWriter->endElement();
382
383 56
        $objWriter->endElement();
384
385 56
        $objWriter->endElement();
386
387
                    // a:lnStyleLst
388 56
                    $objWriter->startElement('a:lnStyleLst');
389
390
                        // a:ln
391 56
                        $objWriter->startElement('a:ln');
392 56
        $objWriter->writeAttribute('w', '9525');
393 56
        $objWriter->writeAttribute('cap', 'flat');
394 56
        $objWriter->writeAttribute('cmpd', 'sng');
395 56
        $objWriter->writeAttribute('algn', 'ctr');
396
397
                            // a:solidFill
398 56
                            $objWriter->startElement('a:solidFill');
399
400
                                // a:schemeClr
401 56
                                $objWriter->startElement('a:schemeClr');
402 56
        $objWriter->writeAttribute('val', 'phClr');
403
404
                                        // a:shade
405 56
                                        $objWriter->startElement('a:shade');
406 56
        $objWriter->writeAttribute('val', '95000');
407 56
        $objWriter->endElement();
408
409
                                        // a:satMod
410 56
                                        $objWriter->startElement('a:satMod');
411 56
        $objWriter->writeAttribute('val', '105000');
412 56
        $objWriter->endElement();
413
414 56
        $objWriter->endElement();
415
416 56
        $objWriter->endElement();
417
418
                            // a:prstDash
419 56
                            $objWriter->startElement('a:prstDash');
420 56
        $objWriter->writeAttribute('val', 'solid');
421 56
        $objWriter->endElement();
422
423 56
        $objWriter->endElement();
424
425
                        // a:ln
426 56
                        $objWriter->startElement('a:ln');
427 56
        $objWriter->writeAttribute('w', '25400');
428 56
        $objWriter->writeAttribute('cap', 'flat');
429 56
        $objWriter->writeAttribute('cmpd', 'sng');
430 56
        $objWriter->writeAttribute('algn', 'ctr');
431
432
                            // a:solidFill
433 56
                            $objWriter->startElement('a:solidFill');
434
435
                                // a:schemeClr
436 56
                                $objWriter->startElement('a:schemeClr');
437 56
        $objWriter->writeAttribute('val', 'phClr');
438 56
        $objWriter->endElement();
439
440 56
        $objWriter->endElement();
441
442
                            // a:prstDash
443 56
                            $objWriter->startElement('a:prstDash');
444 56
        $objWriter->writeAttribute('val', 'solid');
445 56
        $objWriter->endElement();
446
447 56
        $objWriter->endElement();
448
449
                        // a:ln
450 56
                        $objWriter->startElement('a:ln');
451 56
        $objWriter->writeAttribute('w', '38100');
452 56
        $objWriter->writeAttribute('cap', 'flat');
453 56
        $objWriter->writeAttribute('cmpd', 'sng');
454 56
        $objWriter->writeAttribute('algn', 'ctr');
455
456
                            // a:solidFill
457 56
                            $objWriter->startElement('a:solidFill');
458
459
                                // a:schemeClr
460 56
                                $objWriter->startElement('a:schemeClr');
461 56
        $objWriter->writeAttribute('val', 'phClr');
462 56
        $objWriter->endElement();
463
464 56
        $objWriter->endElement();
465
466
                            // a:prstDash
467 56
                            $objWriter->startElement('a:prstDash');
468 56
        $objWriter->writeAttribute('val', 'solid');
469 56
        $objWriter->endElement();
470
471 56
        $objWriter->endElement();
472
473 56
        $objWriter->endElement();
474
475
                    // a:effectStyleLst
476 56
                    $objWriter->startElement('a:effectStyleLst');
477
478
                        // a:effectStyle
479 56
                        $objWriter->startElement('a:effectStyle');
480
481
                            // a:effectLst
482 56
                            $objWriter->startElement('a:effectLst');
483
484
                                // a:outerShdw
485 56
                                $objWriter->startElement('a:outerShdw');
486 56
        $objWriter->writeAttribute('blurRad', '40000');
487 56
        $objWriter->writeAttribute('dist', '20000');
488 56
        $objWriter->writeAttribute('dir', '5400000');
489 56
        $objWriter->writeAttribute('rotWithShape', '0');
490
491
                                    // a:srgbClr
492 56
                                    $objWriter->startElement('a:srgbClr');
493 56
        $objWriter->writeAttribute('val', '000000');
494
495
                                        // a:alpha
496 56
                                        $objWriter->startElement('a:alpha');
497 56
        $objWriter->writeAttribute('val', '38000');
498 56
        $objWriter->endElement();
499
500 56
        $objWriter->endElement();
501
502 56
        $objWriter->endElement();
503
504 56
        $objWriter->endElement();
505
506 56
        $objWriter->endElement();
507
508
                        // a:effectStyle
509 56
                        $objWriter->startElement('a:effectStyle');
510
511
                            // a:effectLst
512 56
                            $objWriter->startElement('a:effectLst');
513
514
                                // a:outerShdw
515 56
                                $objWriter->startElement('a:outerShdw');
516 56
        $objWriter->writeAttribute('blurRad', '40000');
517 56
        $objWriter->writeAttribute('dist', '23000');
518 56
        $objWriter->writeAttribute('dir', '5400000');
519 56
        $objWriter->writeAttribute('rotWithShape', '0');
520
521
                                    // a:srgbClr
522 56
                                    $objWriter->startElement('a:srgbClr');
523 56
        $objWriter->writeAttribute('val', '000000');
524
525
                                        // a:alpha
526 56
                                        $objWriter->startElement('a:alpha');
527 56
        $objWriter->writeAttribute('val', '35000');
528 56
        $objWriter->endElement();
529
530 56
        $objWriter->endElement();
531
532 56
        $objWriter->endElement();
533
534 56
        $objWriter->endElement();
535
536 56
        $objWriter->endElement();
537
538
                        // a:effectStyle
539 56
                        $objWriter->startElement('a:effectStyle');
540
541
                            // a:effectLst
542 56
                            $objWriter->startElement('a:effectLst');
543
544
                                // a:outerShdw
545 56
                                $objWriter->startElement('a:outerShdw');
546 56
        $objWriter->writeAttribute('blurRad', '40000');
547 56
        $objWriter->writeAttribute('dist', '23000');
548 56
        $objWriter->writeAttribute('dir', '5400000');
549 56
        $objWriter->writeAttribute('rotWithShape', '0');
550
551
                                    // a:srgbClr
552 56
                                    $objWriter->startElement('a:srgbClr');
553 56
        $objWriter->writeAttribute('val', '000000');
554
555
                                        // a:alpha
556 56
                                        $objWriter->startElement('a:alpha');
557 56
        $objWriter->writeAttribute('val', '35000');
558 56
        $objWriter->endElement();
559
560 56
        $objWriter->endElement();
561
562 56
        $objWriter->endElement();
563
564 56
        $objWriter->endElement();
565
566
                            // a:scene3d
567 56
                            $objWriter->startElement('a:scene3d');
568
569
                                // a:camera
570 56
                                $objWriter->startElement('a:camera');
571 56
        $objWriter->writeAttribute('prst', 'orthographicFront');
572
573
                                    // a:rot
574 56
                                    $objWriter->startElement('a:rot');
575 56
        $objWriter->writeAttribute('lat', '0');
576 56
        $objWriter->writeAttribute('lon', '0');
577 56
        $objWriter->writeAttribute('rev', '0');
578 56
        $objWriter->endElement();
579
580 56
        $objWriter->endElement();
581
582
                                // a:lightRig
583 56
                                $objWriter->startElement('a:lightRig');
584 56
        $objWriter->writeAttribute('rig', 'threePt');
585 56
        $objWriter->writeAttribute('dir', 't');
586
587
                                    // a:rot
588 56
                                    $objWriter->startElement('a:rot');
589 56
        $objWriter->writeAttribute('lat', '0');
590 56
        $objWriter->writeAttribute('lon', '0');
591 56
        $objWriter->writeAttribute('rev', '1200000');
592 56
        $objWriter->endElement();
593
594 56
        $objWriter->endElement();
595
596 56
        $objWriter->endElement();
597
598
                            // a:sp3d
599 56
                            $objWriter->startElement('a:sp3d');
600
601
                                // a:bevelT
602 56
                                $objWriter->startElement('a:bevelT');
603 56
        $objWriter->writeAttribute('w', '63500');
604 56
        $objWriter->writeAttribute('h', '25400');
605 56
        $objWriter->endElement();
606
607 56
        $objWriter->endElement();
608
609 56
        $objWriter->endElement();
610
611 56
        $objWriter->endElement();
612
613
                    // a:bgFillStyleLst
614 56
                    $objWriter->startElement('a:bgFillStyleLst');
615
616
                        // a:solidFill
617 56
                        $objWriter->startElement('a:solidFill');
618
619
                            // a:schemeClr
620 56
                            $objWriter->startElement('a:schemeClr');
621 56
        $objWriter->writeAttribute('val', 'phClr');
622 56
        $objWriter->endElement();
623
624 56
        $objWriter->endElement();
625
626
                        // a:gradFill
627 56
                        $objWriter->startElement('a:gradFill');
628 56
        $objWriter->writeAttribute('rotWithShape', '1');
629
630
                            // a:gsLst
631 56
                            $objWriter->startElement('a:gsLst');
632
633
                                // a:gs
634 56
                                $objWriter->startElement('a:gs');
635 56
        $objWriter->writeAttribute('pos', '0');
636
637
                                    // a:schemeClr
638 56
                                    $objWriter->startElement('a:schemeClr');
639 56
        $objWriter->writeAttribute('val', 'phClr');
640
641
                                        // a:tint
642 56
                                        $objWriter->startElement('a:tint');
643 56
        $objWriter->writeAttribute('val', '40000');
644 56
        $objWriter->endElement();
645
646
                                        // a:satMod
647 56
                                        $objWriter->startElement('a:satMod');
648 56
        $objWriter->writeAttribute('val', '350000');
649 56
        $objWriter->endElement();
650
651 56
        $objWriter->endElement();
652
653 56
        $objWriter->endElement();
654
655
                                // a:gs
656 56
                                $objWriter->startElement('a:gs');
657 56
        $objWriter->writeAttribute('pos', '40000');
658
659
                                    // a:schemeClr
660 56
                                    $objWriter->startElement('a:schemeClr');
661 56
        $objWriter->writeAttribute('val', 'phClr');
662
663
                                        // a:tint
664 56
                                        $objWriter->startElement('a:tint');
665 56
        $objWriter->writeAttribute('val', '45000');
666 56
        $objWriter->endElement();
667
668
                                        // a:shade
669 56
                                        $objWriter->startElement('a:shade');
670 56
        $objWriter->writeAttribute('val', '99000');
671 56
        $objWriter->endElement();
672
673
                                        // a:satMod
674 56
                                        $objWriter->startElement('a:satMod');
675 56
        $objWriter->writeAttribute('val', '350000');
676 56
        $objWriter->endElement();
677
678 56
        $objWriter->endElement();
679
680 56
        $objWriter->endElement();
681
682
                                // a:gs
683 56
                                $objWriter->startElement('a:gs');
684 56
        $objWriter->writeAttribute('pos', '100000');
685
686
                                    // a:schemeClr
687 56
                                    $objWriter->startElement('a:schemeClr');
688 56
        $objWriter->writeAttribute('val', 'phClr');
689
690
                                        // a:shade
691 56
                                        $objWriter->startElement('a:shade');
692 56
        $objWriter->writeAttribute('val', '20000');
693 56
        $objWriter->endElement();
694
695
                                        // a:satMod
696 56
                                        $objWriter->startElement('a:satMod');
697 56
        $objWriter->writeAttribute('val', '255000');
698 56
        $objWriter->endElement();
699
700 56
        $objWriter->endElement();
701
702 56
        $objWriter->endElement();
703
704 56
        $objWriter->endElement();
705
706
                            // a:path
707 56
                            $objWriter->startElement('a:path');
708 56
        $objWriter->writeAttribute('path', 'circle');
709
710
                                // a:fillToRect
711 56
                                $objWriter->startElement('a:fillToRect');
712 56
        $objWriter->writeAttribute('l', '50000');
713 56
        $objWriter->writeAttribute('t', '-80000');
714 56
        $objWriter->writeAttribute('r', '50000');
715 56
        $objWriter->writeAttribute('b', '180000');
716 56
        $objWriter->endElement();
717
718 56
        $objWriter->endElement();
719
720 56
        $objWriter->endElement();
721
722
                        // a:gradFill
723 56
                        $objWriter->startElement('a:gradFill');
724 56
        $objWriter->writeAttribute('rotWithShape', '1');
725
726
                            // a:gsLst
727 56
                            $objWriter->startElement('a:gsLst');
728
729
                                // a:gs
730 56
                                $objWriter->startElement('a:gs');
731 56
        $objWriter->writeAttribute('pos', '0');
732
733
                                    // a:schemeClr
734 56
                                    $objWriter->startElement('a:schemeClr');
735 56
        $objWriter->writeAttribute('val', 'phClr');
736
737
                                        // a:tint
738 56
                                        $objWriter->startElement('a:tint');
739 56
        $objWriter->writeAttribute('val', '80000');
740 56
        $objWriter->endElement();
741
742
                                        // a:satMod
743 56
                                        $objWriter->startElement('a:satMod');
744 56
        $objWriter->writeAttribute('val', '300000');
745 56
        $objWriter->endElement();
746
747 56
        $objWriter->endElement();
748
749 56
        $objWriter->endElement();
750
751
                                // a:gs
752 56
                                $objWriter->startElement('a:gs');
753 56
        $objWriter->writeAttribute('pos', '100000');
754
755
                                    // a:schemeClr
756 56
                                    $objWriter->startElement('a:schemeClr');
757 56
        $objWriter->writeAttribute('val', 'phClr');
758
759
                                        // a:shade
760 56
                                        $objWriter->startElement('a:shade');
761 56
        $objWriter->writeAttribute('val', '30000');
762 56
        $objWriter->endElement();
763
764
                                        // a:satMod
765 56
                                        $objWriter->startElement('a:satMod');
766 56
        $objWriter->writeAttribute('val', '200000');
767 56
        $objWriter->endElement();
768
769 56
        $objWriter->endElement();
770
771 56
        $objWriter->endElement();
772
773 56
        $objWriter->endElement();
774
775
                            // a:path
776 56
                            $objWriter->startElement('a:path');
777 56
        $objWriter->writeAttribute('path', 'circle');
778
779
                                // a:fillToRect
780 56
                                $objWriter->startElement('a:fillToRect');
781 56
        $objWriter->writeAttribute('l', '50000');
782 56
        $objWriter->writeAttribute('t', '50000');
783 56
        $objWriter->writeAttribute('r', '50000');
784 56
        $objWriter->writeAttribute('b', '50000');
785 56
        $objWriter->endElement();
786
787 56
        $objWriter->endElement();
788
789 56
        $objWriter->endElement();
790
791 56
        $objWriter->endElement();
792
793 56
        $objWriter->endElement();
794
795 56
        $objWriter->endElement();
796
797
            // a:objectDefaults
798 56
            $objWriter->writeElement('a:objectDefaults', null);
799
800
            // a:extraClrSchemeLst
801 56
            $objWriter->writeElement('a:extraClrSchemeLst', null);
802
803 56
        $objWriter->endElement();
804
805
        // Return
806 56
        return $objWriter->getData();
807
    }
808
809
    /**
810
     * Write fonts to XML format
811
     *
812
     * @param     \PhpOffice\PhpSpreadsheet\Shared\XMLWriter    $objWriter
813
     * @param     string                        $latinFont
814
     * @param     array of string                $fontSet
815
     * @throws     \PhpOffice\PhpSpreadsheet\Writer\Exception
816
     * @return string                  XML Output
817
     */
818 56
    private function writeFonts($objWriter, $latinFont, $fontSet)
819
    {
820
        // a:latin
821 56
        $objWriter->startElement('a:latin');
822 56
        $objWriter->writeAttribute('typeface', $latinFont);
823 56
        $objWriter->endElement();
824
825
        // a:ea
826 56
        $objWriter->startElement('a:ea');
827 56
        $objWriter->writeAttribute('typeface', '');
828 56
        $objWriter->endElement();
829
830
        // a:cs
831 56
        $objWriter->startElement('a:cs');
832 56
        $objWriter->writeAttribute('typeface', '');
833 56
        $objWriter->endElement();
834
835 56
        foreach ($fontSet as $fontScript => $typeface) {
836 56
            $objWriter->startElement('a:font');
837 56
            $objWriter->writeAttribute('script', $fontScript);
838 56
            $objWriter->writeAttribute('typeface', $typeface);
839 56
            $objWriter->endElement();
840
        }
841 56
    }
842
843
    /**
844
     * Write colour scheme to XML format
845
     *
846
     * @param     \PhpOffice\PhpSpreadsheet\Shared\XMLWriter    $objWriter
847
     * @throws     \PhpOffice\PhpSpreadsheet\Writer\Exception
848
     * @return string                  XML Output
849
     */
850 56
    private function writeColourScheme($objWriter)
851
    {
852 56
        foreach (self::$colourScheme as $colourName => $colourValue) {
853 56
            $objWriter->startElement('a:' . $colourName);
854
855 56
            $objWriter->startElement('a:srgbClr');
856 56
            $objWriter->writeAttribute('val', $colourValue);
857 56
            $objWriter->endElement();
858
859 56
            $objWriter->endElement();
860
        }
861 56
    }
862
}
863