LdmlConfigHandler::getChildsOrAlias()   C
last analyzed

Complexity

Conditions 13
Paths 19

Size

Total Lines 53
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 13
eloc 33
nc 19
nop 1
dl 0
loc 53
rs 6.3327
c 0
b 0
f 0

How to fix   Long Method    Complexity   

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
0 ignored issues
show
Coding Style introduced by
File has mixed line endings; this may cause incorrect results
Loading history...
2
3
// +---------------------------------------------------------------------------+
4
// | This file is part of the Agavi package.                                   |
5
// | Copyright (c) 2005-2011 the Agavi Project.                                |
6
// |                                                                           |
7
// | For the full copyright and license information, please view the LICENSE   |
8
// | file that was distributed with this source code. You can also view the    |
9
// | LICENSE file online at http://www.agavi.org/LICENSE.txt                   |
10
// |   vi: set noexpandtab:                                                    |
11
// |   Local Variables:                                                        |
12
// |   indent-tabs-mode: t                                                     |
13
// |   End:                                                                    |
14
// +---------------------------------------------------------------------------+
15
16
namespace Agavi\Config;
17
18
use Agavi\Date\DateDefinitions;
19
use Agavi\Exception\AgaviException;
20
use Agavi\Translation\Locale;
21
22
/**
23
 * AgaviLdmlConfigHandler allows you to parse ldml files into an array.
24
 *
25
 * @package    agavi
26
 * @subpackage config
27
 *
28
 * @author     Dominik del Bondio <[email protected]>
29
 * @copyright  Authors
30
 * @copyright  The Agavi Project
31
 *
32
 * @since      0.11.0
33
 *
34
 * @version    $Id$
35
 */
36
class LdmlConfigHandler extends ConfigHandler
0 ignored issues
show
Deprecated Code introduced by
The class Agavi\Config\ConfigHandler has been deprecated with message: Superseded by AgaviXmlConfigHandler, will be removed in Agavi 1.1

This class, trait or interface has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the type will be removed from the class and what other constant to use instead.

Loading history...
37
{
38
    protected $nodeRefs = array();
39
40
    /**
41
     * Execute this configuration handler.
42
     *
43
     * @param      string $config  An absolute filesystem path to a configuration file.
44
     * @param      string $context An optional context in which we are currently running.
45
     *
46
     * @return     string Data to be written to a cache file.
47
     *
48
     * @throws     <b>AgaviUnreadableException</b> If a requested configuration
49
     *                                             file does not exist or is not
50
     *                                             readable.
51
     * @throws     <b>AgaviParseException</b> If a requested configuration file is
52
     *                                        improperly formatted.
53
     *
54
     * @author     Dominik del Bondio <[email protected]>
55
     * @since      0.11.0
56
     */
57
    public function execute($config, $context = null)
58
    {
59
        $pathParts = pathinfo($config);
60
        // unlike basename, filename does not contain the extension, which is what we need there
61
        $lookupPaths = Locale::getLookupPath($pathParts['filename']);
62
        $lookupPaths[] = 'root';
63
64
        $data = array(
65
            'layout' => array('orientation' => array('lines' => 'top-to-bottom', 'characters' => 'left-to-right')),
66
        );
67
68
        foreach (array_reverse($lookupPaths) as $basename) {
69
            $filePath = $pathParts['dirname'] . '/' . $basename . '.' . $pathParts['extension'];
70
            if (is_readable($filePath)) {
71
                $ldmlTree = ConfigCache::parseConfig($filePath, false, $this->getValidationFile(), $this->parser);
0 ignored issues
show
Deprecated Code introduced by
The method Agavi\Config\ConfigCache::parseConfig() has been deprecated with message: New-style config handlers don't call this method anymore. To be removed in Agavi 1.1

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
72
                $this->prepareParentInformation($ldmlTree);
73
                $this->parseLdmlTree($ldmlTree->ldml, $data);
0 ignored issues
show
Documentation introduced by
The property ldml does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
74
            }
75
        }
76
77
        $dayMap = array(
78
                                        'sun' => DateDefinitions::SUNDAY,
79
                                        'mon' => DateDefinitions::MONDAY,
80
                                        'tue' => DateDefinitions::TUESDAY,
81
                                        'wed' => DateDefinitions::WEDNESDAY,
82
                                        'thu' => DateDefinitions::THURSDAY,
83
                                        'fri' => DateDefinitions::FRIDAY,
84
                                        'sat' => DateDefinitions::SATURDAY,
85
        );
86
87
        // fix the day indices for all day fields
88
        foreach ($data['calendars'] as $calKey => &$calValue) {
89
            // skip the 'default' => '' key => value pair
90
            if (is_array($calValue)) {
91 View Code Duplication
                if (isset($calValue['days']['format'])) {
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...
92
                    foreach ($calValue['days']['format'] as $formatKey => &$formatValue) {
93
                        if (is_array($formatValue)) {
94
                            $newData = array();
95
                            foreach ($formatValue as $day => $value) {
96
                                $newData[$dayMap[$day]] = $value;
97
                            }
98
                            $formatValue = $newData;
99
                        }
100
                    }
101
                }
102
103 View Code Duplication
                if (isset($calValue['days']['stand-alone'])) {
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...
104
                    foreach ($calValue['days']['stand-alone'] as $formatKey => &$formatValue) {
105
                        if (is_array($formatValue)) {
106
                            $newData = array();
107
                            foreach ($formatValue as $day => $value) {
108
                                $newData[$dayMap[$day]] = $value;
109
                            }
110
                            $formatValue = $newData;
111
                        }
112
                    }
113
                }
114
            }
115
        }
116
117
        $code = array();
118
        $code[] = 'return ' . var_export($data, true) . ';';
119
120
        return $this->generate($code, $config);
121
    }
122
123
    /**
124
     * Prepares the parent information for the given ldml tree.
125
     *
126
     * @param      ConfigValueHolder $ldmlTree The ldml tree.
127
     *
128
     * @author     Dominik del Bondio <[email protected]>
129
     * @since      0.11.0
130
     */
131
    protected function prepareParentInformation($ldmlTree)
132
    {
133
        $this->nodeRefs = array();
134
        $i = 0;
135
        $ldmlTree->setAttribute('__agavi_node_id', $i);
136
        $ldmlTree->setAttribute('__agavi_parent_id', null);
137
        $this->nodeRefs[$i] = $ldmlTree;
138
        ++$i;
139
        if ($ldmlTree->hasChildren()) {
140
            $this->generateParentInformation($ldmlTree->getChildren(), $i, 0);
141
        }
142
    }
143
144
    /**
145
     * Generates the parent information for the given ldml subtree.
146
     *
147
     * @param      ConfigValueHolder[] $childList The ldml node.
148
     * @param      int                 $nextId
149
     * @param      int                 $parentId
150
     *
151
     * @author     Dominik del Bondio <[email protected]>
152
     * @since      0.11.0
153
     */
154
    protected function generateParentInformation($childList, &$nextId, $parentId)
155
    {
156
        /** @var ConfigValueHolder $child */
157
        foreach ($childList as $child) {
158
            $child->setAttribute('__agavi_node_id', $nextId);
159
            $child->setAttribute('__agavi_parent_id', $parentId);
160
            $this->nodeRefs[$nextId] = $child;
161
            ++$nextId;
162
            if ($child->hasChildren()) {
163
                $this->generateParentInformation($child->getChildren(), $nextId, $child->getAttribute('__agavi_node_id'));
164
            }
165
        }
166
    }
167
168
/*
169
170
171
array data format
172
173
174
 locale                  =
175
   language              = de|en|fr|..
176
   territory             = DE|AT|CH|..
177
   script                = Latn|...
178
   variant               = NYNORSK|...
179
180
181
 display Names           =
182
   languages             =
183
     [lId]               = localized language 
184
   scripts               =
185
     [sId]               = localized script name
186
   territories           = 
187
     [tId]               = localized territory name
188
   variants              = 
189
     [vId]               = localized variant name
190
   keys                  = 
191
     [key]               = localized key name
192
   measurementSystemNames=
193
     [mId]               = localized measurement system name
194
 
195
196
 layout                  =
197
   orientation           =
198
     lines               = top-to-bottom|bottom-to-top
199
     characters          = left-to-right|right-to-left
200
201
 delimiters              =
202
   quotationStart        = The quotation start symbol
203
   quotationEnd          = The quotation end symbol
204
   altQuotationStart     = The alternative quotation start symbol
205
   altQuotationEnd       = The alternative quotation end symbol
206
207
208
 calendars               =
209
   default               = The default calendar
210
   [cId]                 =
211
     months              =
212
       default           = format|stand-alone
213
       format            =
214
         default         = wide|abbreviated|narrow
215
         wide            =
216
           1|2|3|...     = The wide month name
217
         abbreviated     = 
218
           1|2|3|...     = The abbreviated month name
219
         narrow          = 
220
           1|2|3|...     = The narrow month name
221
       stand-alone       =
222
         default         = wide|abbreviated|narrow
223
         wide            =
224
           1|2|3|...     = The wide month name
225
         abbreviated     = 
226
           1|2|3|...     = The abbreviated month name
227
         narrow          = 
228
           1|2|3|...     = The narrow month name
229
     days                =
230
       default           = format|stand-alone
231
       format            =
232
         default         = wide|abbreviated|narrow
233
         wide            =
234
           mon|tue|...   = The wide day name
235
         abbreviated     = 
236
           ...
237
     quarters            =
238
       default           = format|stand-alone
239
       format            =
240
         default         = wide|abbreviated|narrow
241
         wide            =
242
           1|2|3|4       = The wide quarter name
243
         abbreviated     = 
244
           ...
245
     am                  = The locale string for am
246
     pm                  = The locale string for pm
247
     eras                =
248
       wide              =
249
         1|2|3|...       = The wide era name
250
       abbreviated       = 
251
         1|2|3|...       = The abbreviated era name
252
       narrow            = 
253
         1|2|3|...       = The narrow era name
254
     dateFormats         =
255
       default           = full|long|medium|short
256
       [dfId]            =
257
         pattern         = The date pattern
258
         displayName     = An optional format name
259
     timeFormats         =
260
       default           = full|long|medium|short
261
       [tfId]            =
262
         pattern         = The time pattern
263
         displayName     = An optional format name
264
265
     dateTimeFormats     =
266
       default           = full|long|medium|short
267
       formats           =
268
         [fId]           = pattern
269
       availableFormats  =
270
         [afId]          = The datetime pattern
271
       appendItems       =
272
         [aiId]          = pattern
273
274
     fields              =
275
       [fId]             =
276
         displayName     = The localized name for this field
277
         relatives       =
278
           [rId]         = The localized relative of this field
279
280
 timeZoneNames
281
   hourFormat            = 
282
   hoursFormat           = 
283
   gmtFormat             = 
284
   regionFormat          = 
285
   fallbackFormat        = 
286
   abbreviationFallback  = standard|...?
287
   singleCountries       =
288
     [id]                = timezone
289
   zones                 =
290
     [tzId]              =
291
       long              =
292
         generic         = 
293
         standard        = 
294
         daylight        = 
295
       short
296
         generic         = 
297
         standard        = 
298
         daylight        = 
299
       exemplarCity      = 
300
301
 numbers                 =
302
   symbols               =
303
     decimal             = .
304
     group               = ,
305
     list                = ;
306
     percentSign         = %
307
     nativeZeroDigit     = 0
308
     patternDigit        = #
309
     plusSign            = +
310
     minusSign           = -
311
     exponential         = E
312
     perMille            = ‰
313
     infinity            = ∞
314
     nan                 = ☹
315
   decimalFormats        =
316
     [dfId]              = pattern
317
   scientificFormats     =
318
     [sfId]              = pattern
319
   percentFormats        =
320
     [pfId]              = pattern
321
   currencyFormats       =
322
     [cfId]              = pattern
323
   currencySpacing       =
324
     beforeCurrency      =
325
       currencyMatch     = 
326
       surroundingMatch  = 
327
       insertBetween     = 
328
     afterCurrency       =
329
       currencyMatch     = 
330
       surroundingMatch  = 
331
       insertBetween     = 
332
   currencies            =
333
     [cId]               =
334
       displayName       = The locale display name
335
       symbol            = The symbol (or array when its a choice)
336
337
			
338
*/
339
340
    /**
341
     * Generates the array used by AgaviLocale from an LDML tree.
342
     *
343
     * @param      ConfigValueHolder $ldmlTree The ldml tree.
344
     * @param      array             $data     The array to store the parsed data to.
345
     *
346
     * @return     array The array with the data.
347
     *
348
     * @author     Dominik del Bondio <[email protected]>
349
     * @since      0.11.0
350
     */
351
    public function parseLdmlTree($ldmlTree, &$data)
352
    {
353
354
        if (isset($ldmlTree->identity)) {
355
            $data['locale']['language'] = $ldmlTree->identity->language->getAttribute('type');
0 ignored issues
show
Documentation introduced by
The property identity does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
356 View Code Duplication
            if (isset($ldmlTree->identity->territory)) {
0 ignored issues
show
Documentation introduced by
The property identity does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
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...
357
                $data['locale']['territory'] = $ldmlTree->identity->territory->getAttribute('type');
0 ignored issues
show
Documentation introduced by
The property identity does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
358
            }
359 View Code Duplication
            if (isset($ldmlTree->identity->script)) {
0 ignored issues
show
Documentation introduced by
The property identity does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
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...
360
                $data['locale']['script'] = $ldmlTree->identity->script->getAttribute('type');
0 ignored issues
show
Documentation introduced by
The property identity does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
361
            }
362 View Code Duplication
            if (isset($ldmlTree->identity->variant)) {
0 ignored issues
show
Documentation introduced by
The property identity does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
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...
363
                $data['locale']['variant'] = $ldmlTree->identity->variant->getAttribute('type');
0 ignored issues
show
Documentation introduced by
The property identity does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
364
            }
365
        }
366
367
        if (isset($ldmlTree->localeDisplayNames)) {
368
            $ldn = $ldmlTree->localeDisplayNames;
0 ignored issues
show
Bug introduced by
The property localeDisplayNames does not seem to exist in Agavi\Config\ConfigValueHolder.

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
369
370 View Code Duplication
            if (isset($ldn->languages)) {
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...
371
                $data['displayNames']['languages'] = isset($data['displayNames']['languages']) ? $data['displayNames']['languages'] : array();
372
                $this->getTypeList($ldn->languages, $data['displayNames']['languages']);
373
            }
374
375 View Code Duplication
            if (isset($ldn->scripts)) {
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...
376
                $data['displayNames']['scripts'] = isset($data['displayNames']['scripts']) ? $data['displayNames']['scripts'] : array();
377
                $this->getTypeList($ldn->scripts, $data['displayNames']['scripts']);
378
            }
379
380 View Code Duplication
            if (isset($ldn->territories)) {
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...
381
                $data['displayNames']['territories'] = isset($data['displayNames']['territories']) ? $data['displayNames']['territories'] : array();
382
                $this->getTypeList($ldn->territories, $data['displayNames']['territories']);
383
            }
384
385 View Code Duplication
            if (isset($ldn->variants)) {
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...
386
                $data['displayNames']['variants'] = isset($data['displayNames']['variants']) ? $data['displayNames']['variants'] : array();
387
                $this->getTypeList($ldn->variants, $data['displayNames']['variants']);
388
            }
389
390 View Code Duplication
            if (isset($ldn->keys)) {
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...
391
                $data['displayNames']['keys'] = isset($data['displayNames']['keys']) ? $data['displayNames']['keys'] : array();
392
                $this->getTypeList($ldn->keys, $data['displayNames']['keys']);
393
            }
394
395
            /*
0 ignored issues
show
Unused Code Comprehensibility introduced by
44% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
396
			// not needed right now
397
			if(isset($ldn->types)) {
398
			}
399
			*/
400
401 View Code Duplication
            if (isset($ldn->measurementSystemNames)) {
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...
402
                $data['displayNames']['measurementSystemNames'] = isset($data['displayNames']['measurementSystemNames']) ? $data['displayNames']['measurementSystemNames'] : array();
403
                $this->getTypeList($ldn->measurementSystemNames, $data['displayNames']['measurementSystemNames']);
404
            }
405
        }
406
407
        if (isset($ldmlTree->layout->orientation)) {
0 ignored issues
show
Documentation introduced by
The property layout does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
408
            $ori = $ldmlTree->layout->orientation;
0 ignored issues
show
Documentation introduced by
The property layout does not exist on object<Agavi\Config\ConfigValueHolder>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
409
410
            $data['layout']['orientation']['lines'] = $ori->getAttribute('lines', $data['layout']['orientation']['lines']);
411
            $data['layout']['orientation']['characters'] = $ori->getAttribute('characters', $data['layout']['orientation']['characters']);
412
        }
413
414
        if (isset($ldmlTree->delimiters)) {
415
            $delims = $ldmlTree->delimiters;
0 ignored issues
show
Bug introduced by
The property delimiters does not seem to exist in Agavi\Config\ConfigValueHolder.

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
416
417
            if (isset($delims->quotationStart)) {
418
                $data['delimiters']['quotationStart'] = $this->unescape($delims->quotationStart->getValue());
419
            }
420
            if (isset($delims->quotationEnd)) {
421
                $data['delimiters']['quotationEnd'] = $this->unescape($delims->quotationEnd->getValue());
422
            }
423
            if (isset($delims->alternateQuotationStart)) {
424
                $data['delimiters']['alternateQuotationStart'] = $this->unescape($delims->alternateQuotationStart->getValue());
425
            }
426
            if (isset($delims->alternateQuotationEnd)) {
427
                $data['delimiters']['alternateQuotationEnd'] = $this->unescape($delims->alternateQuotationEnd->getValue());
428
            }
429
        }
430
431
        if (isset($ldmlTree->dates)) {
432
            $dates = $ldmlTree->dates;
0 ignored issues
show
Bug introduced by
The property dates does not seem to exist in Agavi\Config\ConfigValueHolder.

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
433
434
            if (isset($dates->calendars)) {
435
                $cals = $dates->calendars;
436
437
                foreach ($cals as $calendar) {
438
                    if ($calendar->getName() == 'default') {
439
                        $data['calendars']['default'] = $calendar->getAttribute('choice');
440
                    } elseif ($calendar->getName() == 'calendar') {
441
                        $calendarName = $calendar->getAttribute('type');
442
443
                        if (!isset($data['calendars'][$calendarName])) {
444
                            $data['calendars'][$calendarName] = array();
445
                        }
446
447
                        if (isset($calendar->months)) {
448
                            $this->getCalendarWidth($calendar->months, 'month', $data['calendars'][$calendarName]);
449
                        }
450
451
                        if (isset($calendar->days)) {
452
                            $this->getCalendarWidth($calendar->days, 'day', $data['calendars'][$calendarName]);
453
                        }
454
455
                        if (isset($calendar->quarters)) {
456
                            $this->getCalendarWidth($calendar->quarters, 'quarter', $data['calendars'][$calendarName]);
457
                        }
458
459 View Code Duplication
                        if (isset($calendar->am)) {
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...
460
                            $data['calendars'][$calendarName]['am'] = $this->unescape($calendar->am->getValue());
461
                        }
462 View Code Duplication
                        if (isset($calendar->pm)) {
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...
463
                            $data['calendars'][$calendarName]['pm'] = $this->unescape($calendar->pm->getValue());
464
                        }
465
466
                        if (isset($calendar->eras)) {
467 View Code Duplication
                            if (isset($calendar->eras->eraNames)) {
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...
468
                                foreach ($this->getChildsOrAlias($calendar->eras->eraNames) as $era) {
469
                                    $data['calendars'][$calendarName]['eras']['wide'][$era->getAttribute('type')] = $this->unescape($era->getValue());
470
                                }
471
                            }
472 View Code Duplication
                            if (isset($calendar->eras->eraAbbr)) {
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...
473
                                foreach ($this->getChildsOrAlias($calendar->eras->eraAbbr) as $era) {
474
                                    $data['calendars'][$calendarName]['eras']['abbreviated'][$era->getAttribute('type')] = $this->unescape($era->getValue());
475
                                }
476
                            }
477 View Code Duplication
                            if (isset($calendar->eras->eraNarrow)) {
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...
478
                                foreach ($this->getChildsOrAlias($calendar->eras->eraNarrow) as $era) {
479
                                    $data['calendars'][$calendarName]['eras']['narrow'][$era->getAttribute('type')] = $this->unescape($era->getValue());
480
                                }
481
                            }
482
                        }
483
484
                        if (isset($calendar->dateFormats)) {
485
                            $this->getDateOrTimeFormats($calendar->dateFormats, 'dateFormat', $data['calendars'][$calendarName]);
486
                        }
487
                        if (isset($calendar->timeFormats)) {
488
                            $this->getDateOrTimeFormats($calendar->timeFormats, 'timeFormat', $data['calendars'][$calendarName]);
489
                        }
490
491
                        if (isset($calendar->dateTimeFormats)) {
492
                            $dtf = $calendar->dateTimeFormats;
493
                            $data['calendars'][$calendarName]['dateTimeFormats']['default'] = isset($dtf->default) ? $dtf->default->getAttribute('choice') : '__default';
494
495
                            $dtfItems = $this->getChildsOrAlias($dtf);
496
                            foreach ($dtfItems as $item) {
497
                                if ($item->getName() == 'dateTimeFormatLength') {
498
                                    if (isset($item->dateTimeFormat->pattern)) {
499
                                        $data['calendars'][$calendarName]['dateTimeFormats']['formats'][$item->getAttribute('type', '__default')] = $this->unescape($item->dateTimeFormat->pattern->getValue(), true);
500
                                    } else {
501
                                        throw new AgaviException('unknown child content in dateTimeFormatLength tag');
502
                                    }
503
                                } elseif ($item->getName() == 'availableFormats') {
504 View Code Duplication
                                    foreach ($item as $dateFormatItem) {
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...
505
                                        if ($dateFormatItem->getName() != 'dateFormatItem') {
506
                                            throw new AgaviException('unknown childtag "' . $dateFormatItem->getName() . '" in availableFormats tag');
507
                                        }
508
                                        $data['calendars'][$calendarName]['dateTimeFormats']['availableFormats'][$dateFormatItem->getAttribute('id')] = $this->unescape($dateFormatItem->getValue(), true);
509
                                    }
510
                                } elseif ($item->getName() == 'appendItems') {
511 View Code Duplication
                                    foreach ($item as $appendItem) {
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...
512
                                        if ($appendItem->getName() != 'appendItem') {
513
                                            throw new AgaviException('unknown childtag "' . $appendItem->getName() . '" in appendItems tag');
514
                                        }
515
                                        $data['calendars'][$calendarName]['dateTimeFormats']['appendItems'][$appendItem->getAttribute('request')] = $this->unescape($appendItem->getValue(), true);
516
                                    }
517
                                } elseif ($item->getName() != 'default') {
518
                                    throw new AgaviException('unknown childtag "' . $item->getName() . '" in dateTimeFormats tag');
519
                                }
520
                            }
521
                        }
522
523
                        if (isset($calendar->fields)) {
524
                            foreach ($this->getChildsOrAlias($calendar->fields) as $field) {
525
                                $type = $field->getAttribute('type');
526
                                if (isset($field->displayName)) {
527
                                    $data['calendars'][$calendarName]['fields'][$type]['displayName'] = $this->unescape($field->displayName->getValue());
528
                                }
529
                                if (isset($field->relative)) {
530
                                    foreach ($field as $relative) {
531
                                        if ($relative->getName() == 'relative') {
532
                                            $data['calendars'][$calendarName]['fields'][$type]['relatives'][$relative->getAttribute('type')] = $this->unescape($relative->getValue());
533
                                        }
534
                                    }
535
                                }
536
                            }
537
                        }
538
                    } else {
539
                        throw new AgaviException('unknown childtag "' . $calendar->getName() . '" in calendars tag');
540
                    }
541
                }
542
            }
543
            
544
            if (isset($dates->timeZoneNames)) {
545
                $tzn = $dates->timeZoneNames;
546
                if (isset($tzn->hourFormat)) {
547
                    $data['timeZoneNames']['hourFormat'] = $this->unescape($tzn->hourFormat->getValue());
548
                }
549
                if (isset($tzn->hoursFormat)) {
550
                    $data['timeZoneNames']['hoursFormat'] = $this->unescape($tzn->hoursFormat->getValue());
551
                }
552
                if (isset($tzn->gmtFormat)) {
553
                    $data['timeZoneNames']['gmtFormat'] = $this->unescape($tzn->gmtFormat->getValue());
554
                }
555
                if (isset($tzn->regionFormat)) {
556
                    $data['timeZoneNames']['regionFormat'] = $this->unescape($tzn->regionFormat->getValue());
557
                }
558
                if (isset($tzn->fallbackFormat)) {
559
                    $data['timeZoneNames']['fallbackFormat'] = $this->unescape($tzn->fallbackFormat->getValue());
560
                }
561
                if (isset($tzn->abbreviationFallback)) {
562
                    $data['timeZoneNames']['abbreviationFallback'] = $tzn->abbreviationFallback->getAttribute('choice');
563
                }
564
                if (isset($tzn->singleCountries)) {
565
                    $data['timeZoneNames']['singleCountries'] = explode(' ', $tzn->singleCountries->getAttribute('list'));
566
                }
567
568
                foreach ($tzn as $zone) {
569
                    $zoneName = $zone->getAttribute('type');
570
                    if ($zone->getName() == 'zone') {
571
                        if (isset($zone->long->generic)) {
572
                            $data['timeZoneNames']['zones'][$zoneName]['long']['generic'] = $this->unescape($zone->long->generic->getValue());
573
                        }
574 View Code Duplication
                        if (isset($zone->long->standard)) {
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...
575
                            $data['timeZoneNames']['zones'][$zoneName]['long']['standard'] = $this->unescape($zone->long->standard->getValue());
576
                        }
577
                        if (isset($zone->long->daylight)) {
578
                            $data['timeZoneNames']['zones'][$zoneName]['long']['daylight'] = $this->unescape($zone->long->daylight->getValue());
579
                        }
580 View Code Duplication
                        if (isset($zone->short->generic)) {
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...
581
                            $data['timeZoneNames']['zones'][$zoneName]['short']['generic'] = $this->unescape($zone->short->generic->getValue());
582
                        }
583 View Code Duplication
                        if (isset($zone->short->standard)) {
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...
584
                            $data['timeZoneNames']['zones'][$zoneName]['short']['standard'] = $this->unescape($zone->short->standard->getValue());
585
                        }
586 View Code Duplication
                        if (isset($zone->short->daylight)) {
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...
587
                            $data['timeZoneNames']['zones'][$zoneName]['short']['daylight'] = $this->unescape($zone->short->daylight->getValue());
588
                        }
589
                        if (isset($zone->exemplarCity)) {
590
                            $data['timeZoneNames']['zones'][$zoneName]['exemplarCity'] = $this->unescape($zone->exemplarCity->getValue());
591
                        }
592
                    }
593
                }
594
            }
595
        }
596
597
        if (isset($ldmlTree->numbers)) {
598
            $nums = $ldmlTree->numbers;
0 ignored issues
show
Bug introduced by
The property numbers does not seem to exist in Agavi\Config\ConfigValueHolder.

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
599
            if (!isset($data['numbers'])) {
600
                $data['numbers'] = array();
601
            }
602
603
            if (isset($nums->symbols)) {
604
                $syms = $nums->symbols;
605 View Code Duplication
                if (isset($syms->decimal)) {
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...
606
                    $data['numbers']['symbols']['decimal'] = $this->unescape($syms->decimal->getValue());
607
                }
608 View Code Duplication
                if (isset($syms->group)) {
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...
609
                    $data['numbers']['symbols']['group'] = $this->unescape($syms->group->getValue());
610
                }
611 View Code Duplication
                if (isset($syms->list)) {
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...
612
                    $data['numbers']['symbols']['list'] = $this->unescape($syms->list->getValue());
613
                }
614 View Code Duplication
                if (isset($syms->percentSign)) {
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...
615
                    $data['numbers']['symbols']['percentSign'] = $this->unescape($syms->percentSign->getValue());
616
                }
617 View Code Duplication
                if (isset($syms->nativeZeroDigit)) {
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...
618
                    $data['numbers']['symbols']['nativeZeroDigit'] = $this->unescape($syms->nativeZeroDigit->getValue());
619
                }
620 View Code Duplication
                if (isset($syms->patternDigit)) {
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...
621
                    $data['numbers']['symbols']['patternDigit'] = $this->unescape($syms->patternDigit->getValue());
622
                }
623 View Code Duplication
                if (isset($syms->plusSign)) {
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...
624
                    $data['numbers']['symbols']['plusSign'] = $this->unescape($syms->plusSign->getValue());
625
                }
626 View Code Duplication
                if (isset($syms->minusSign)) {
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...
627
                    $data['numbers']['symbols']['minusSign'] = $this->unescape($syms->minusSign->getValue());
628
                }
629 View Code Duplication
                if (isset($syms->exponential)) {
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...
630
                    $data['numbers']['symbols']['exponential'] = $this->unescape($syms->exponential->getValue());
631
                }
632 View Code Duplication
                if (isset($syms->perMille)) {
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...
633
                    $data['numbers']['symbols']['perMille'] = $this->unescape($syms->perMille->getValue());
634
                }
635 View Code Duplication
                if (isset($syms->infinity)) {
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...
636
                    $data['numbers']['symbols']['infinity'] = $this->unescape($syms->infinity->getValue());
637
                }
638 View Code Duplication
                if (isset($syms->nan)) {
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...
639
                    $data['numbers']['symbols']['nan'] = $this->unescape($syms->nan->getValue());
640
                }
641
            }
642
            if (isset($nums->decimalFormats)) {
643
                $this->getNumberFormats($nums->decimalFormats, 'decimalFormat', $data['numbers']);
644
            }
645
            if (isset($nums->scientificFormats)) {
646
                $this->getNumberFormats($nums->scientificFormats, 'scientificFormat', $data['numbers']);
647
            }
648
            if (isset($nums->percentFormats)) {
649
                $this->getNumberFormats($nums->percentFormats, 'percentFormat', $data['numbers']);
650
            }
651
            if (isset($nums->currencyFormats)) {
652
                $cf = $nums->currencyFormats;
653
654
                foreach ($this->getChildsOrAlias($cf) as $itemLength) {
655
                    if ($itemLength->getName() == 'default') {
656
                        $data['numbers']['currencyFormats']['default'] = $itemLength->getAttribute('choice');
657
                    } elseif ($itemLength->getName() == 'currencyFormatLength') {
658
                        $itemLengthName = $itemLength->getAttribute('type', '__default');
659
660
                        foreach ($this->getChildsOrAlias($itemLength) as $itemFormat) {
661
                            if ($itemFormat->getName() == 'currencyFormat') {
662
                                if (isset($itemFormat->pattern)) {
663
                                    $data['numbers']['currencyFormats'][$itemLengthName] = $this->unescape($itemFormat->pattern->getValue());
664
                                }
665
                            } else {
666
                                throw new AgaviException('unknown childtag "' . $itemFormat->getName() . '" in currencyFormatLength tag');
667
                            }
668
                        }
669
                    } elseif ($itemLength->getName() == 'currencySpacing') {
670 View Code Duplication
                        if (isset($itemLength->beforeCurrency->currencyMatch)) {
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...
671
                            $data['numbers']['currencySpacing']['beforeCurrency']['currencyMatch'] = $this->unescape($itemLength->beforeCurrency->currencyMatch->getValue());
672
                        }
673 View Code Duplication
                        if (isset($itemLength->beforeCurrency->surroundingMatch)) {
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...
674
                            $data['numbers']['currencySpacing']['beforeCurrency']['surroundingMatch'] = $this->unescape($itemLength->beforeCurrency->surroundingMatch->getValue());
675
                        }
676 View Code Duplication
                        if (isset($itemLength->beforeCurrency->insertBetween)) {
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...
677
                            $data['numbers']['currencySpacing']['beforeCurrency']['insertBetween'] = $this->unescape($itemLength->beforeCurrency->insertBetween->getValue());
678
                        }
679 View Code Duplication
                        if (isset($itemLength->afterCurrency->currencyMatch)) {
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...
680
                            $data['numbers']['currencySpacing']['afterCurrency']['currencyMatch'] = $this->unescape($itemLength->afterCurrency->currencyMatch->getValue());
681
                        }
682 View Code Duplication
                        if (isset($itemLength->afterCurrency->surroundingMatch)) {
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...
683
                            $data['numbers']['currencySpacing']['afterCurrency']['surroundingMatch'] = $this->unescape($itemLength->afterCurrency->surroundingMatch->getValue());
684
                        }
685 View Code Duplication
                        if (isset($itemLength->afterCurrency->insertBetween)) {
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...
686
                            $data['numbers']['currencySpacing']['afterCurrency']['insertBetween'] = $this->unescape($itemLength->afterCurrency->insertBetween->getValue());
687
                        }
688
                    } else {
689
                        throw new AgaviException('unknown childtag "' . $itemLength->getName() . '" in currencyFormats tag');
690
                    }
691
                }
692
            }
693
            if (isset($nums->currencies)) {
694
                foreach ($nums->currencies as $currency) {
695
                    $name = $currency->getAttribute('type');
696
                    if (isset($currency->displayName)) {
697
                        $data['numbers']['currencies'][$name]['displayName'] = $this->unescape($currency->displayName->getValue());
698
                    }
699
                    if (isset($currency->symbol)) {
700
                        $symbolValue = $this->unescape($currency->symbol->getValue());
701
                        if ($currency->symbol->getAttribute('choice') == 'true') {
702
                            $symbolValue = explode('|', $symbolValue);
703
                        }
704
                        $data['numbers']['currencies'][$name]['symbol'] = $symbolValue;
705
                    }
706
                }
707
            }
708
        }
709
710
        return $data;
711
    }
712
713
    /**
714
     * Gets the value of each node with a type attribute.
715
     *
716
     * @param      array $list List of ConfigValueHolder items.
717
     * @param      array $data The array to store the parsed data to.
718
     *
719
     * @return     array The array with the data.
720
     *
721
     * @author     Dominik del Bondio <[email protected]>
722
     * @since      0.11.0
723
     */
724
    protected function getTypeList($list, &$data)
725
    {
726
        // debug stuff to check if we missed any tags (lc = loop count)
727
        $lc = 0;
728
        foreach ($list as $listItem) {
729
            $type = $listItem->getAttribute('type');
730
731
            if (!$listItem->hasAttribute('alt')) {
732
                $data[$type] = $this->unescape($listItem->getValue());
733
            }
734
735
            ++$lc;
736
        }
737
738
        if ($lc != count($list->getChildren())) {
0 ignored issues
show
Bug introduced by
The method getChildren cannot be called on $list (of type array).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
739
            throw new AgaviException('wrong tagcount');
740
        }
741
742
        return $data;
743
    }
744
745
    /**
746
     * Gets the calendar widths for the given item.
747
     *
748
     * @param      ConfigValueHolder $item The item.
749
     * @param      string $name The name of item.
750
     * @param      array $data The array to store the parsed data to.
751
     *
752
     * @return     array The array with the data.
753
     *
754
     * @author     Dominik del Bondio <[email protected]>
755
     * @since      0.11.0
756
     */
757
    protected function getCalendarWidth(ConfigValueHolder $item, $name, &$data)
758
    {
759
        $dataIdxName = $name . 's';
760
761
        $items = $this->getChildsOrAlias($item);
762
        foreach ($items as $itemContext) {
763
            if ($itemContext->getName() == 'default') {
764
                $data[$dataIdxName]['default'] = $itemContext->getAttribute('choice');
765
            } elseif ($itemContext->getName() == $name . 'Context') {
766
                $itemContextName = $itemContext->getAttribute('type');
767
768
                foreach ($itemContext as $itemWidths) {
769
                    if ($itemWidths->getName() == 'default') {
770
                        $data[$dataIdxName][$itemContextName]['default'] = $itemWidths->getAttribute('choice');
771
                    } elseif ($itemWidths->getName() == $name . 'Width') {
772
                        $itemWidthName = $itemWidths->getAttribute('type');
773
774
                        $widthChildItems = $this->getChildsOrAlias($itemWidths);
775
                        foreach ($widthChildItems as $item) {
776
                            if ($item->getName() != $name) {
777
                                throw new AgaviException('unknown childtag "' . $item->getName() . '" in ' . $name . 'Widths tag');
778
                            }
779
780
                            if (!$item->hasAttribute('alt')) {
781
                                $itemName = $item->getAttribute('type');
782
                                $data[$dataIdxName][$itemContextName][$itemWidthName][$itemName] = $this->unescape($item->getValue());
783
                            }
784
                        }
785
                    } else {
786
                        throw new AgaviException('unknown childtag "' . $itemWidths->getName() . '" in ' . $name . 'Context tag');
787
                    }
788
                }
789
            } else {
790
                throw new AgaviException('unknown childtag "' . $itemContext->getName() . '" in ' . $name . 's tag');
791
            }
792
        }
793
    }
794
795
    /**
796
     * Gets the date or time formats the given item.
797
     *
798
     * @param      ConfigValueHolder $item The item.
799
     * @param      string $name The name of item.
800
     * @param      array $data The array to store the parsed data to.
801
     *
802
     * @return     array The array with the data.
803
     *
804
     * @author     Dominik del Bondio <[email protected]>
805
     * @since      0.11.0
806
     */
807
    protected function getDateOrTimeFormats(ConfigValueHolder $item, $name, &$data)
808
    {
809
        $dataIdxName = $name . 's';
810
811
        $items = $this->getChildsOrAlias($item);
812
        foreach ($items as $itemLength) {
813
            if ($itemLength->getName() == 'default') {
814
                $data[$dataIdxName]['default'] = $itemLength->getAttribute('choice');
815
            } elseif ($itemLength->getName() == $name . 'Length') {
816
                $itemLengthName = $itemLength->getAttribute('type', '__default');
817
818
                $aliasedItemLength = $this->getChildsOrAlias($itemLength);
819
                foreach ($aliasedItemLength as $itemFormat) {
820
                    if ($itemFormat->getName() == $name) {
821 View Code Duplication
                        if (isset($itemFormat->pattern)) {
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...
822
                            $data[$dataIdxName][$itemLengthName]['pattern'] = $this->unescape($itemFormat->pattern->getValue(), true);
823
                        }
824 View Code Duplication
                        if (isset($itemFormat->displayName)) {
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...
825
                            $data[$dataIdxName][$itemLengthName]['displayName'] = $this->unescape($itemFormat->displayName->getValue());
826
                        }
827
                    } else {
828
                        throw new AgaviException('unknown childtag "' . $itemFormat->getName() . '" in ' . $name . 'Length tag');
829
                    }
830
                }
831
            } else {
832
                throw new AgaviException('unknown childtag "' . $itemLength->getName() . '" in ' . $name . 's tag');
833
            }
834
        }
835
    }
836
837
    /**
838
     * Gets the number formats the given item.
839
     *
840
     * @param      ConfigValueHolder The item.
841
     * @param      string The name of item.
842
     * @param      array The array to store the parsed data to.
843
     *
844
     * @return     array The array with the data.
845
     *
846
     * @author     Dominik del Bondio <[email protected]>
847
     * @since      0.11.0
848
     */
849
    protected function getNumberFormats($item, $name, &$data)
850
    {
851
        $dataIdxName = $name . 's';
852
853
        $items = $this->getChildsOrAlias($item);
854
        foreach ($items as $itemLength) {
855
            if ($itemLength->getName() == 'default') {
856
                $data[$dataIdxName]['default'] = $itemLength->getAttribute('choice');
857
            } elseif ($itemLength->getName() == $name . 'Length') {
858
                $itemLengthName = $itemLength->getAttribute('type', '__default');
859
860
                foreach ($this->getChildsOrAlias($itemLength) as $itemFormat) {
861
                    if ($itemFormat->getName() == $name) {
862
                        if (isset($itemFormat->pattern)) {
863
                            $data[$dataIdxName][$itemLengthName] = $this->unescape($itemFormat->pattern->getValue());
864
                        }
865
                    } else {
866
                        throw new AgaviException('unknown childtag "' . $itemFormat->getName() . '" in ' . $name . 'Length tag');
867
                    }
868
                }
869
            } else {
870
                throw new AgaviException('unknown childtag "' . $itemLength->getName() . '" in ' . $name . 's tag');
871
            }
872
        }
873
    }
874
875
    /**
876
     * Resolves the alias LDML tag.
877
     *
878
     * @param      ConfigValueHolder $item The item.
879
     *
880
     * @return     mixed Either the item if there is no alias or the resolved
881
     *                   alias.
882
     *
883
     * @author     Dominik del Bondio <[email protected]>
884
     * @since      0.11.0
885
     */
886
    protected function getChildsOrAlias(ConfigValueHolder $item)
887
    {
888
        if (isset($item->alias)) {
889
            $alias = $item->alias;
0 ignored issues
show
Bug introduced by
The property alias does not seem to exist in Agavi\Config\ConfigValueHolder.

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
890
            if ($alias->getAttribute('source') != 'locale') {
891
                throw new AgaviException('The alias handling doesn\'t support any source except locale (' . $alias->getAttribute('source') . ' was given)');
892
            }
893
894
            $pathParts = explode('/', $alias->getAttribute('path'));
895
896
            $currentNodeId = $item->getAttribute('__agavi_node_id');
897
            
898
            foreach ($pathParts as $part) {
899
                // select the parent node
900
                if ($part == '..') {
901
                    $currentNodeId = $this->nodeRefs[$currentNodeId]->getAttribute('__agavi_parent_id');
902
                } else {
903
                    $predicates = array();
904
                    if (preg_match('#([^\[]+)\[([^\]]+)\]#', $part, $match)) {
905
                        if (!preg_match('#@([^=]+)=\'([^\']+)\'#', $match[2], $predMatch)) {
906
                            throw new AgaviException('Unknown predicate ' . $match[2] . ' in alias xpath spec');
907
                        }
908
                        $tagName = $match[1];
909
                        $predicates[$predMatch[1]] = $predMatch[2];
910
                    } else {
911
                        $tagName = $part;
912
                    }
913
                    foreach ($this->nodeRefs[$currentNodeId]->getChildren() as $childNode) {
914
                        $isSearchedNode = false;
915
                        if ($childNode->getName() == $tagName) {
916
                            $predMatches = 0;
917
                            foreach ($predicates as $attrib => $value) {
918
                                if ($childNode->getAttribute($attrib) == $value) {
919
                                    ++$predMatches;
920
                                }
921
                            }
922
                            if ($predMatches == count($predicates)) {
923
                                $isSearchedNode = true;
924
                            }
925
                        }
926
927
                        if ($isSearchedNode) {
928
                            $currentNodeId = $childNode->getAttribute('__agavi_node_id');
929
                        }
930
                    }
931
                }
932
            }
933
934
            return $this->nodeRefs[$currentNodeId]->getChildren();
935
        } else {
936
            return $item;
937
        }
938
    }
939
    
940
    /**
941
     * Unescapes unicode escapes
942
     *
943
     * @link       http://unicode.org/reports/tr35/#Unicode_Sets
944
     *
945
     * @param      string $input The string to unescape.
946
     * @param      bool   $handleQuotes Whether the string needs to handle quoting behaviour
947
     *
948
     * @return     string The unescaped string.
949
     *
950
     * @author     Dominik del Bondio <[email protected]>
951
     * @since      0.11.0
952
     */
953
    protected function unescape($input, $handleQuotes = false)
954
    {
955
        $output = '';
0 ignored issues
show
Unused Code introduced by
$output 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...
956
        $hex = '[0-9A-Fa-f]';
957
        $rx = '\\\\(\\\\|u' . $hex . '{4}|U' . $hex . '{8}|x' . $hex .'{1,2}|[0-7]{1,3}|.)';
958
        if ($handleQuotes) {
959
            // needs to be < -1 to not confuse the algorithm in the first run
960
            $lastClose = -2;
0 ignored issues
show
Unused Code introduced by
$lastClose 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...
961
            if (preg_match_all("#'(?:''|[^'])+'|" . $rx . "#", $input, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE)) {
962
                $output = $input;
963
                $offsetMod = 0;
964
                $ml = $matches[0];
965
                $len = count($ml);
966
                for ($i = 0; $i < $len; ++ $i) {
967
                    $match = $ml[$i];
968
                    if ($match[0][0] != '\'') {
969
                        // we check if there is a quoted string directly before or directly after the escape sequence
970
                        // by using the string lengths and the offset of the matches. Since an escape sequence directly before
971
                        // this sequence results in an quoted string we only check if its really a quoted string and not an
972
                        // escape sequence for parts coming after this sequence
973
                        $quoteBefore = ($i > 0 && (strlen($ml[$i - 1][0]) + $ml[$i - 1][1]) == $match[1]);
974
                        $quoteAfter = ($i + 1 < $len && $ml[$i + 1][0][0] == '\'' && (strlen($match[0]) + $match[1]) == $ml[$i + 1][1]);
975
                        $oldLen = strlen($output);
976
                        $unescaped = $this->unescapeCallback(array($match[0], substr($match[0], 1)));
977
                        $unescaped = ($quoteBefore ? '' : '\'') . $unescaped . ($quoteAfter ? '' : '\'');
978
                        $replacedPartLen = strlen($match[0]) + ((int) $quoteBefore) + ((int) $quoteAfter);
979
                        // replace the matched escape sequence with the unescaped one. we also replace the opening or closing quote
980
                        // from the quoted part before or after this escape sequence to include the unescaped string into the closed part
981
                        $output = substr_replace($output, $unescaped, $offsetMod + $match[1] + ($quoteBefore ? -1 : 0), $replacedPartLen);
982
                        // since the string length gets changed, we have to track the size change so we can adjust the offset from the match
983
                        $offsetMod += strlen($output) - $oldLen;
984
                    }
985
                }
986
            } else {
987
                $output = $input;
988
            }
989
        } else {
990
            $output = preg_replace_callback('#' . $rx . '#', array($this, 'unescapeCallback'), $input);
991
        }
992
993
        return $output;
994
    }
995
    
996
    /**
997
     * Unescapes a single unicode escape sequence. This is designed to be a
998
     * preg_replace_callback callback function.
999
     *
1000
     * @param      array $matches The match.
1001
     *
1002
     * @return     string The unescaped sequence.
1003
     *
1004
     * @author     Dominik del Bondio <[email protected]>
1005
     * @since      0.11.0
1006
     */
1007
    protected function unescapeCallback($matches)
1008
    {
1009
        static $map = array(
1010
            'a' => "\x07",
1011
            'b' => "\x08",
1012
            't' => "\x09",
1013
            'n' => "\x0A",
1014
            'v' => "\x0B",
1015
            'f' => "\x0C",
1016
            'r' => "\x0D",
1017
            '\\' => '\\',
1018
        );
1019
        
1020
        
1021
        $res = '';
0 ignored issues
show
Unused Code introduced by
$res 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...
1022
        
1023
        $char = $matches[1][0];
1024
        $seq = substr($matches[1], 1);
1025
        if ($char == 'u' || $char == 'U' || $char == 'x') {
1026
            $res = html_entity_decode('&#x' . $seq . ';', ENT_QUOTES, 'utf-8');
1027
        } elseif (is_numeric($char)) {
1028
            $res = html_entity_decode('&#' . octdec($matches[1]) . ';', ENT_QUOTES, 'utf-8');
1029
        } elseif (isset($map[$char])) {
1030
            $res = $map[$char];
1031
        } else {
1032
            $res = $char; // something like \s or \0 or so, just return the character ("s" or "0")
1033
        }
1034
        
1035
        return $res;
1036
    }
1037
}
1038