• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

laravie / parser / 6980789669

24 Nov 2023 12:33PM UTC coverage: 94.672% (-0.4%) from 95.082%
6980789669

push

github

web-flow
wip

231 of 244 relevant lines covered (94.67%)

7.31 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.53
/src/Xml/Concerns/SupportMultiLevel.php
1
<?php
2

3
namespace Laravie\Parser\Xml\Concerns;
4

5
use Illuminate\Support\Arr;
6
use InvalidArgumentException;
7
use function Laravie\Parser\alias_get;
8
use Laravie\Parser\Xml\Definitions\MultiLevel;
9
use SimpleXMLElement;
10

11
trait SupportMultiLevel
12
{
13
    /**
14
     * prepare use variable for using.
15
     *
16
     * @param  string  $uses
17
     * @return \Laravie\Parser\Xml\Definitions\MultiLevel|string
18
     */
19
    protected function resolveUses(string $uses)
20
    {
21
        $result = $this->parseAdvancedUses($uses);
13✔
22

23
        return ! empty($result->getRoot()) ? $result : $uses;
13✔
24
    }
25

26
    /**
27
     * split the use.
28
     *
29
     * @param  string  $value
30
     * @return array
31
     */
32
    protected function parseBasicUses(string $value): array
33
    {
34
        $level = 0;
15✔
35
        $uses = [''];
15✔
36
        $current = 0;
15✔
37

38
        foreach (str_split($value) as $char) {
15✔
39
            switch ($char) {
40
                case '{':
15✔
41
                    $level++;
2✔
42
                    $uses[$current] .= '{';
2✔
43
                    break;
2✔
44
                case '}':
15✔
45
                    $level--;
2✔
46
                    $uses[$current] .= '}';
2✔
47
                    break;
2✔
48
                case ',':
15✔
49
                    if ($level == 0) {
15✔
50
                        $current++;
14✔
51
                        $uses[$current] = '';
14✔
52
                        break;
14✔
53
                    }
54
                    // no break
55
                default:
56
                    $uses[$current] .= $char;
15✔
57
            }
58
        }
59

60
        return $uses;
15✔
61
    }
62

63
    /**
64
     * split the use.
65
     *
66
     * @param  string  $value
67
     * @return \Laravie\Parser\Xml\Definitions\MultiLevel
68
     */
69
    protected function parseAdvancedUses(string $value): MultiLevel
70
    {
71
        $level = 0;
13✔
72
        $uses = [''];
13✔
73
        $current = 0;
13✔
74
        $root = '';
13✔
75

76
        foreach (str_split($value) as $char) {
13✔
77
            switch ($char) {
78
                case '{':
13✔
79
                    if ($level == 0) {
2✔
80
                        $root = $uses[0];
2✔
81
                        $uses[$current] = '';
2✔
82
                        $level++;
2✔
83
                        break;
2✔
84
                    } else {
85
                        $uses[$current] .= '{';
2✔
86
                        $level++;
2✔
87
                        break;
2✔
88
                    }
89
                    // no break
90
                case ',':
13✔
91
                    if ($level === 1) {
2✔
92
                        $current++;
2✔
93
                        $uses[$current] = '';
2✔
94
                        break;
2✔
95
                    } else {
96
                        $uses[$current] .= ',';
2✔
97
                        break;
2✔
98
                    }
99
                    // no break
100
                case '}':
13✔
101
                    if ($level === 2) {
2✔
102
                        $uses[$current] .= '}';
2✔
103
                        $level--;
2✔
104
                        break;
2✔
105
                    } elseif ($level === 1) {
2✔
106
                        $current++;
2✔
107
                        $uses[$current] = '';
2✔
108
                        $level--;
2✔
109
                        break;
2✔
110
                    } else {
111
                        $uses[$current] .= '}';
1✔
112
                        $level--;
1✔
113
                        break;
1✔
114
                    }
115
                    // no break
116
                default:
117
                    $uses[$current] .= $char;
13✔
118
            }
119
        }
120

121
        $alias = $uses[$current] ? str_replace('>', '', $uses[$current]) : $root;
13✔
122

123
        array_pop($uses);
13✔
124

125
        return new MultiLevel($root, $alias, $uses);
13✔
126
    }
127

128
    /**
129
     * Resolve values by collection of multi levels.
130
     *
131
     * @param  \SimpleXMLElement  $content
132
     * @param  \Laravie\Parser\Xml\Definitions\MultiLevel  $multilevel
133
     * @return array<int, mixed>
134
     */
135
    protected function parseMultiLevelsValueCollection(SimpleXMLElement $content, MultiLevel $multilevel): array
136
    {
137
        $value = [];
2✔
138
        $result = [];
2✔
139
        $features = $content->{$multilevel->getRoot()};
2✔
140

141
        if (! empty($features)) {
2✔
142
            foreach ($features as $key => $feature) {
2✔
143
                foreach ($multilevel as $use) {
2✔
144
                    if (strpos($use, '{') !== false) {
2✔
145
                        $secondary = $this->resolveUses($use);
2✔
146

147
                        if (\is_string($secondary)) {
2✔
148
                            throw new InvalidArgumentException('Unable to resolve given $secondary variable as ['.MultiLevel::class.']');
×
149
                        }
150

151
                        $value[$secondary->getKey()] = $this->parseMultiLevelsValueCollection($feature, $secondary);
2✔
152
                    } else {
153
                        [$name, $as] = strpos($use, '>') !== false ? explode('>', $use, 2) : [$use, $use];
2✔
154

155
                        if (preg_match('/^([A-Za-z0-9_\-\.]+)\((.*)\=(.*)\)$/', $name, $matches)) {
2✔
156
                            $as = alias_get($as, $name);
1✔
157

158
                            $item = $this->getSelfMatchingValue($feature, $matches, $as);
1✔
159

160
                            if (\is_null($as)) {
1✔
161
                                $value = array_merge($value, $item);
1✔
162
                            } else {
163
                                Arr::set($value, $as, $item);
×
164
                            }
165
                        } else {
166
                            $name = alias_get($name, '@');
2✔
167

168
                            Arr::set($value, $as, $this->getValue($feature, $name));
2✔
169
                        }
170
                    }
171
                }
172

173
                $result[] = $value;
2✔
174
            }
175
        }
176

177
        return $result;
2✔
178
    }
179
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc