Completed
Push — master ( 29545d...bdb788 )
by Kacper
04:24
created

TokenFactory::setOffset()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

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