Test Failed
Push — develop ( 425fc0...4f2be8 )
by Paul
13:11
created

Sanitizer::buildSanitizer()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 14
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 14
ccs 12
cts 12
cp 1
rs 9.9
c 0
b 0
f 0
cc 3
nc 4
nop 1
crap 3
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Modules;
4
5
use GeminiLabs\SiteReviews\Helper;
6
use GeminiLabs\SiteReviews\Helpers\Arr;
7
use GeminiLabs\SiteReviews\Helpers\Str;
8
use GeminiLabs\SiteReviews\Modules\Sanitizers\SanitizeText;
9
10
class Sanitizer
11
{
12
    /**
13
     * @var array
14
     */
15
    public $sanitizers;
16
17
    /**
18
     * @var array
19
     */
20
    public $values;
21
22 210
    public function __construct(array $values = [], array $sanitizers = [])
23
    {
24 210
        $this->sanitizers = $this->buildSanitizers($sanitizers);
25 210
        $this->values = $values;
26
    }
27
28 147
    public function __call(string $method, array $args)
29
    {
30 147
        $name = Str::dashcase(Str::removePrefix($method, 'sanitize'));
31 147
        $value = array_shift($args);
32 147
        $className = Helper::buildClassName($method, 'Modules\Sanitizers');
33 147
        $className = glsr()->filterString("sanitizer/{$name}", $className);
34 147
        if (class_exists($className)) {
35 147
            return (new $className($value, $args, $this->values))->run();
36
        }
37
        glsr_log()->error("Sanitizer method [$method] not found.");
38
        return array_shift($args);
39
    }
40
41 210
    public function run(): array
42
    {
43 210
        $results = $this->values;
44 210
        foreach ($this->values as $key => $value) {
45 210
            if (!array_key_exists($key, $this->sanitizers)) {
46 175
                continue;
47
            }
48 210
            foreach ($this->sanitizers[$key] as $sanitizer) {
49 210
                $args = $sanitizer['args'];
50 210
                $className = $sanitizer['sanitizer'];
51 210
                $value = (new $className($value, $args, $this->values))->run();
52
            }
53 210
            $results[$key] = $value;
54
        }
55 210
        return $results;
56
    }
57
58 210
    protected function buildSanitizer(string $sanitizer): array
59
    {
60 210
        $parts = preg_split('/:/', $sanitizer, 2, PREG_SPLIT_NO_EMPTY);
61 210
        $name = trim(Arr::get($parts, 0));
62 210
        $args = trim(Arr::get($parts, 1));
63 210
        $args = 'regex' === $name ? [$args] : explode(',', $args);
64 210
        $className = Helper::buildClassName(['sanitize', $name], 'Modules\Sanitizers');
65 210
        $className = glsr()->filterString("sanitizer/{$name}", $className);
66 210
        if (!class_exists($className)) {
67 1
            $className = SanitizeText::class;
68
        }
69 210
        return [
70 210
            'args' => $args,
71 210
            'sanitizer' => $className,
72 210
        ];
73
    }
74
75 210
    protected function buildSanitizers(array $sanitizers): array
76
    {
77 210
        foreach ($sanitizers as $key => $value) {
78 210
            $methods = Arr::consolidate(preg_split('/\|/', $value, -1, PREG_SPLIT_NO_EMPTY));
79 210
            $sanitizers[$key] = [];
80 210
            if (empty($methods)) {
81
                $sanitizers[$key][] = $this->buildSanitizer('text');
82
                continue;
83
            }
84 210
            foreach ($methods as $sanitizer) {
85 210
                $sanitizers[$key][] = $this->buildSanitizer($sanitizer);
86
            }
87
        }
88 210
        return $sanitizers;
89
    }
90
}
91