Completed
Pull Request — master (#2)
by Jan-Petter
02:43
created

DisAllowParser::add()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 11
rs 9.4285
cc 3
eloc 8
nc 3
nop 1
1
<?php
2
namespace vipnytt\RobotsTxtParser\Parser\Directives;
3
4
use vipnytt\RobotsTxtParser\Client\Directives\DisAllowClient;
5
use vipnytt\RobotsTxtParser\Exceptions;
6
use vipnytt\RobotsTxtParser\RobotsTxtInterface;
7
8
/**
9
 * Class DisAllowParser
10
 *
11
 * @package vipnytt\RobotsTxtParser\Parser\Directives
12
 */
13
class DisAllowParser implements ParserInterface, RobotsTxtInterface
14
{
15
    use DirectiveParserCommons;
16
17
    /**
18
     * Sub directives white list
19
     */
20
    const SUB_DIRECTIVES = [
21
        self::DIRECTIVE_CLEAN_PARAM,
22
        self::DIRECTIVE_HOST,
23
    ];
24
25
    /**
26
     * Directive
27
     * @var string
28
     */
29
    private $directive;
30
31
    /**
32
     * Base Uri
33
     * @var string
34
     */
35
    private $base;
36
37
    /**
38
     * Path
39
     * @var array
40
     */
41
    private $path = [];
42
43
    /**
44
     * Sub-directive Clean-param
45
     * @var CleanParamParser
46
     */
47
    private $cleanParam;
48
49
    /**
50
     * Sub-directive Host
51
     * @var HostParser
52
     */
53
    private $host;
54
55
    /**
56
     * DisAllow constructor
57
     *
58
     * @param string $base
59
     * @param string $directive
60
     */
61
    public function __construct($base, $directive)
62
    {
63
        $this->base = $base;
64
        $this->directive = $this->validateDirective($directive, [self::DIRECTIVE_DISALLOW, self::DIRECTIVE_ALLOW]);
65
        $this->cleanParam = new CleanParamParser();
66
        $this->host = new HostParser($this->base, $this->directive);
67
    }
68
69
    /**
70
     * Add
71
     *
72
     * @param string $line
73
     * @return bool
74
     */
75
    public function add($line)
76
    {
77
        $pair = $this->generateRulePair($line, self::SUB_DIRECTIVES);
78
        switch ($pair['directive']) {
79
            case self::DIRECTIVE_CLEAN_PARAM:
80
                return $this->cleanParam->add($pair['value']);
81
            case self::DIRECTIVE_HOST:
82
                return $this->host->add($pair['value']);
83
        }
84
        return $this->addPath($line);
85
    }
86
87
    /**
88
     * Add plain path to allow/disallow
89
     *
90
     * @param string $path
91
     * @return bool
92
     */
93
    private function addPath($path)
94
    {
95
        if (in_array($path, $this->path)) {
96
            return false;
97
        }
98
        $this->path[] = $path;
99
        return true;
100
    }
101
102
    /**
103
     * Render
104
     *
105
     * @return string[]
106
     */
107
    public function render()
108
    {
109
        $result = [];
110
        $values = array_merge(
111
            $this->path,
112
            $this->cleanParam->render(),
113
            $this->host->render()
114
        );
115
        foreach ($values as $value) {
116
            $result[] = $this->directive . ':' . $value;
117
        }
118
        sort($result);
119
        return $result;
120
    }
121
122
    /**
123
     * Client
124
     *
125
     * @return DisAllowClient
126
     */
127
    public function client()
128
    {
129
        return new DisAllowClient($this->path, $this->host->client(), $this->cleanParam->client());
130
    }
131
}
132