Completed
Branch 0.8-dev (01721d)
by Kacper
02:43
created

TokenFactory::link()   C

Complexity

Conditions 8
Paths 23

Size

Total Lines 32
Code Lines 19

Duplication

Lines 6
Ratio 18.75 %

Code Coverage

Tests 23
CRAP Score 8

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 6
loc 32
ccs 23
cts 23
cp 1
rs 5.3846
cc 8
eloc 19
nc 23
nop 2
crap 8
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 $_offset;
31
    private $_type = 0x3;
32
33
    private $_cache = [];
34
35
    /**
36
     * Constructor
37
     *
38
     * @param string $class {@see }
39
     */
40 62
    public function __construct($class)
41
    {
42 62
        $this->setClass($class);
43 61
    }
44
45
    /**
46
     * @param       $name
47
     * @param array $params
48
     *
49
     * @return false|Token|null
50
     */
51 46
    public function create($name, $params = [ ])
52
    {
53 46
        if ($name !== null) {
54 19
            $name = $this->getName($name);
55 19
        } else {
56 27
            $name = $this->_base;
57
        }
58
59 46
        if (!isset($params['rule'])) {
60 42
            $params['rule'] = $this->_rule;
61 42
        }
62
63 46
        if (isset($params['pos'])) {
64 43
            $params['pos'] += $this->_offset;
65 43
        }
66
67 46
        if (!isset($params['class'])) {
68 46
            $params['class'] = $this->_class;
69 46
        }
70
71 46
        return $this->link($name, $params);
72
    }
73
74 46
    private function link($name, $params) {
75 46
        if($this->_type & Token::START) {
76 46 View Code Duplication
            if(!isset($params['start'])) {
77 46
                $params['start'] = new $params['class']($name, $params);
78 46
            }
79
80 46
            if($this->_type === Token::START) {
81 2
                $params['start']->setEnd(false);
82 2
                return $params['start'];
83
            }
84 46
        }
85
86 46
        if($this->_type & Token::END) {
87 46
            if (isset($params['length'])) {
88 38
                $end = $params;
89 38
                $end['pos'] += $params['length'];
90
91
                /** @var Token $end */
92 38
                $params['end'] = new $params['class']($name, $end);
93 46 View Code Duplication
            } elseif(!isset($params['end'])) {
94 8
                $params['end'] = new $params['class']($name, $params);
95 8
            }
96
97 46
            if($this->_type === Token::END) {
98 1
                $params['end']->setStart(false);
99 1
                return $params['end'];
100
            }
101 46
        }
102
103 46
        $params['start']->setEnd($params['end']);
104 46
        return $params['start'];
105
    }
106
107 19
    private function getName($name)
108
    {
109 19
        if (!isset($this->_cache[$name])) {
110 19
            $this->_cache[$name] = str_replace('$', $this->_base, $name);
111 19
        }
112
113 19
        return $this->_cache[$name];
114
    }
115
116
    /**
117
     * @param string $base
118
     */
119 17
    public function setBase($base)
120
    {
121 17
        $this->_cache = []; // invalidate cache
122 17
        $this->_base  = $base;
123 17
    }
124
125
    /**
126
     * @param mixed $rule
127
     */
128 59
    public function setRule($rule)
129
    {
130 59
        $this->_rule = $rule;
131 59
    }
132
133
    /**
134
     * @param int $offset
135
     */
136 13
    public function setOffset($offset)
137
    {
138 13
        $this->_offset = $offset;
139 13
    }
140
141
    /**
142
     * @param mixed $class
143
     *
144
     * @throws \InvalidArgumentException
145
     */
146 62
    public function setClass($class)
147
    {
148 62
        if (!is_a($class, 'Kadet\Highlighter\Parser\Token\Token', true)) {
149 1
            throw new \InvalidArgumentException('$class must extend Kadet\Highlighter\Parser\Token\Token');
150
        }
151
152 61
        $this->_class = $class;
153 61
    }
154
155 2
    public function setType($type)
156
    {
157 2
        $this->_type = $type;
158 2
    }
159
}
160