Completed
Push — master ( bdb788...963082 )
by Kacper
03:46
created

TokenFactory::setBase()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 5
ccs 4
cts 4
cp 1
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
crap 1
1
<?php
2
/**
3
 * Highlighter
4
 *
5
 * Copyright (C) 2016, Some right reserved.
6
 *
7
 * @author Kacper "Kadet" Donat <[email protected]>
8
 *
9
 * Contact with author:
10
 * Xmpp: [email protected]
11
 * E-mail: [email protected]
12
 *
13
 * From Kadet with love.
14
 */
15
16
namespace Kadet\Highlighter\Parser;
17
18
use Kadet\Highlighter\Parser\Token\Token;
19
20
/**
21
 * Factory used to handle various token creation.
22
 *
23
 * @package Kadet\Highlighter\Parser
24
 */
25
class TokenFactory implements TokenFactoryInterface
26
{
27
    private $_class;
28
    private $_base;
29
    private $_rule;
30
    private $_type = 0x3;
31
32
    private $_cache = [];
33
34
    /**
35
     * Constructor
36
     *
37
     * @param string $class {@see }
38
     */
39 88
    public function __construct($class)
40
    {
41 88
        $this->setClass($class);
42 87
    }
43
44
    /**
45
     * @param       $name
46
     * @param array $params
47
     *
48
     * @return false|Token|null
49
     */
50 47
    public function create($name, $params = [ ])
51
    {
52 47
        if ($name !== null) {
53 23
            $name = $this->getName($name);
54 23
        } else {
55 24
            $name = $this->_base;
56
        }
57
58 47
        if (!isset($params['rule'])) {
59 41
            $params['rule'] = $this->_rule;
60 41
        }
61
62 47
        if (!isset($params['class'])) {
63 47
            $params['class'] = $this->_class;
64 47
        }
65
66 47
        return $this->link($name, $params);
67
    }
68
69 47
    private function link($name, $params) {
70 47
        if($this->_type & Token::START) {
71 47 View Code Duplication
            if(!isset($params['start'])) {
72 47
                $params['start'] = new $params['class']($name, $params);
73 47
            }
74
75 47
            if($this->_type === Token::START) {
76 2
                $params['start']->setEnd(false);
77 2
                return $params['start'];
78
            }
79 47
        }
80
81 47
        if($this->_type & Token::END) {
82 47
            if (isset($params['length'])) {
83 40
                $end = $params;
84 40
                $end['pos'] += $params['length'];
85
86
                /** @var Token $end */
87 40
                $params['end'] = new $params['class']($name, $end);
88 47 View Code Duplication
            } elseif(!isset($params['end'])) {
89 7
                $params['end'] = new $params['class']($name, $params);
90 7
            }
91
92 47
            if($this->_type === Token::END) {
93 1
                $params['end']->setStart(false);
94 1
                return $params['end'];
95
            }
96 47
        }
97
98 47
        $params['start']->setEnd($params['end']);
99 47
        return $params['start'];
100
    }
101
102 23
    private function getName($name)
103
    {
104 23
        if (!isset($this->_cache[$name])) {
105 23
            $this->_cache[$name] = str_replace('$', $this->_base, $name);
106 23
        }
107
108 23
        return $this->_cache[$name];
109
    }
110
111
    /**
112
     * @param string $base
113
     */
114 16
    public function setBase($base)
115
    {
116 16
        $this->_cache = []; // invalidate cache
117 16
        $this->_base  = $base;
118 16
    }
119
120
    /**
121
     * @param mixed $rule
122
     */
123 84
    public function setRule($rule)
124
    {
125 84
        $this->_rule = $rule;
126 84
    }
127
128
    /**
129
     * @param mixed $class
130
     *
131
     * @throws \InvalidArgumentException
132
     */
133 88
    public function setClass($class)
134
    {
135 88
        if (!is_a($class, 'Kadet\Highlighter\Parser\Token\Token', true)) {
136 1
            throw new \InvalidArgumentException('$class must extend Kadet\Highlighter\Parser\Token\Token');
137
        }
138
139 87
        $this->_class = $class;
140 87
    }
141
142 2
    public function setType($type)
143
    {
144 2
        $this->_type = $type;
145 2
    }
146
}
147