Completed
Push — master ( 028356...03137d )
by
unknown
02:00
created

Parser::parseModifiers()   D

Complexity

Conditions 10
Paths 18

Size

Total Lines 46
Code Lines 33

Duplication

Lines 46
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 46
loc 46
rs 4.983
cc 10
eloc 33
nc 18
nop 1

How to fix   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
2
3
namespace Macroparts\Vortex\RichParam;
4
5
/**
6
 * Created by PhpStorm.
7
 * User: daniel.jurkovic
8
 * Date: 14.06.17
9
 * Time: 18:02
10
 */
11
class Parser
12
{
13
    public function parseRichParam($param)
14
    {
15
        $interpretation = [];
16
        foreach ($this->parseElements($param) as $element) {
17
            list($fieldname, $modifiersStr) = array_pad(explode(':', $element, 2), 2, null);
18
19
            if ($modifiersStr === null) {
20
                if (!isset($interpretation[$fieldname])) {
21
                    $interpretation[$fieldname] = [];
22
                }
23
                continue;
24
            }
25
26
            $modifierArr = $this->parseModifiers($modifiersStr);
27
28
            if (isset($interpretation[$fieldname])) {
29
                $interpretation[$fieldname] = $interpretation[$fieldname] + $modifierArr;
30
            } else {
31
                $interpretation[$fieldname] = $modifierArr;
32
            }
33
        }
34
35
        return $interpretation;
36
    }
37
38
    /**
39
     * creates an array out of string in this format:
40
     *
41
     * modifierName1(modifierParam1|modifierParam2):modifierName2(modifierParam3))
42
     *
43
     * Can also handle modifier params that contain other modifier with params
44
     *
45
     * @param string $modifiersStr
46
     * @return array
47
     */
48 View Code Duplication
    private function parseModifiers($modifiersStr)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
49
    {
50
        $interpretation = [];
51
        $modifierName = '';
52
        $modifierParamStr = '';
53
54
        $depth = 0;
55
        for ($i = 0; $i < strlen($modifiersStr); $i++) {
56
            switch ($modifiersStr[$i]) {
57
                case '(':
58
                    if ($depth) {
59
                        $modifierParamStr .= $modifiersStr[$i];
60
                    }
61
                    $depth++;
62
                    break;
63
64
                case ')':
65
                    $depth--;
66
                    if ($depth) {
67
                        $modifierParamStr .= $modifiersStr[$i];
68
                    }
69
                    break;
70
                case ':':
71
                    if ($depth) {
72
                        $modifierParamStr .= $modifiersStr[$i];
73
                    } else {
74
                        $interpretation[$modifierName] = $this->parseArguments($modifierParamStr);
75
                        $modifierName = '';
76
                        $modifierParamStr = '';
77
                    }
78
                    break;
79
                default:
80
                    if ($depth) {
81
                        $modifierParamStr .= $modifiersStr[$i];
82
                    } else {
83
                        $modifierName .= $modifiersStr[$i];
84
                    }
85
            }
86
        }
87
88
        if ($modifierName) {
89
            $interpretation[$modifierName] = $this->parseArguments($modifierParamStr);
90
        }
91
92
        return $interpretation;
93
    }
94
95
    /**
96
     * Can make an array out of parameter string that looks like this:
97
     *
98
     * param1|param2|param3
99
     *
100
     * Can also handle params that contain other modifiers with params like this:
101
     * param1|modifier(innerParam1|innerParam2)|param3
102
     *
103
     * @param string $argumentsStr
104
     * @return array
105
     */
106 View Code Duplication
    private function parseArguments($argumentsStr)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in 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...
107
    {
108
        $paramArr = [];
109
        $tmpStr = '';
110
111
        $depth = 0;
112
        for ($i = 0; $i < strlen($argumentsStr); $i++) {
113
            switch ($argumentsStr[$i]) {
114
                case '(':
115
                    $tmpStr .= $argumentsStr[$i];
116
                    $depth++;
117
                    break;
118
119
                case ')':
120
                    $tmpStr .= $argumentsStr[$i];
121
                    $depth--;
122
                    break;
123
124
                case '|':
125
                    if ($depth) {
126
                        $tmpStr .= $argumentsStr[$i];
127
                    } else {
128
                        $paramArr[] = $tmpStr;
129
                        $tmpStr = '';
130
                    }
131
                    break;
132
133
                default:
134
                    $tmpStr .= $argumentsStr[$i];
135
            }
136
        }
137
138
        if (strlen($tmpStr)) {
139
            $paramArr[] = $tmpStr;
140
        }
141
142
        return $paramArr;
143
    }
144
145
    private function parseElements($richParam)
146
    {
147
        if ($richParam === '' || !is_string($richParam)) {
148
            return [];
149
        }
150
151
        $fields = explode(',', $richParam);
152
153
        return is_array($fields) ? $fields : [];
154
    }
155
}