Completed
Push — master ( e84666...fe350e )
by smiley
01:34
created

BBCodeOutputAbstract::getEOL()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
c 0
b 0
f 0
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
/**
3
 * Class BBCodeOutputAbstract
4
 *
5
 * @filesource   BBCodeOutputAbstract.php
6
 * @created      23.04.2018
7
 * @package      chillerlan\BBCode\Output
8
 * @author       smiley <[email protected]>
9
 * @copyright    2018 smiley
10
 * @license      MIT
11
 */
12
13
namespace chillerlan\BBCode\Output;
14
15
use chillerlan\Traits\{
16
	ClassLoader, ContainerInterface
17
};
18
use Psr\Log\LoggerInterface;
19
use Psr\SimpleCache\CacheInterface;
20
21
abstract class BBCodeOutputAbstract implements BBCodeOutputInterface{
22
	use ClassLoader;
23
24
	/**
25
	 * @var string[]
26
	 */
27
	protected $modules = [];
28
29
	/**
30
	 * @var string[]
31
	 */
32
	protected $tagmap = [];
33
34
	/**
35
	 * Holds an array of singletags
36
	 *
37
	 * @var string[]
38
	 */
39
	protected $singletags = [];
40
41
	/**
42
	 * Holds an array of noparse tags
43
	 *
44
	 * @var string[]
45
	 */
46
	protected $noparse = [];
47
48
	/**
49
	 * @var \chillerlan\BBCode\BBCodeOptions
50
	 */
51
	protected $options;
52
53
	/**
54
	 * @var \Psr\SimpleCache\CacheInterface
55
	 */
56
	protected $cache;
57
58
	/**
59
	 * @var \Psr\Log\LoggerInterface
60
	 */
61
	protected $logger;
62
63
	/**
64
	 * @var \chillerlan\BBCode\Output\BBCodeModuleInterface[]
65
	 */
66
	protected $moduleInterfaces = [];
67
68
	/**
69
	 * @var string
70
	 */
71
	protected $eol = PHP_EOL;
72
73
	/**
74
	 * BBCodeOutputInterface constructor.
75
	 *
76
	 * @param \chillerlan\Traits\ContainerInterface $options
77
	 * @param \Psr\SimpleCache\CacheInterface  $cache
78
	 * @param \Psr\Log\LoggerInterface         $logger
79
	 */
80
	public function __construct(ContainerInterface $options, CacheInterface $cache, LoggerInterface $logger){
81
		$options->replacement_eol = $options->replacement_eol ?? $this->eol;
0 ignored issues
show
Bug introduced by
Accessing replacement_eol on the interface chillerlan\Traits\ContainerInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
82
83
		$this->options = $options;
0 ignored issues
show
Documentation Bug introduced by
$options is of type object<chillerlan\Traits\ContainerInterface>, but the property $options was declared to be of type object<chillerlan\BBCode\BBCodeOptions>. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
84
		$this->cache   = $cache;
85
		$this->logger  = $logger;
86
87
		foreach($this->modules as $module){
88
			/** @var \chillerlan\BBCode\Output\BBCodeModuleInterface $moduleInterface */
89
			$moduleInterface = $this->loadClass($module, BBCodeModuleInterface::class, $this->options, $this->cache, $this->logger);
90
			foreach($moduleInterface->getTags() as $tag){
91
				$this->tagmap[$tag] = $module;
92
			}
93
94
			$this->noparse    = array_merge($this->noparse, $moduleInterface->getNoparse());
0 ignored issues
show
Documentation Bug introduced by
It seems like array_merge($this->nopar...nterface->getNoparse()) of type array is incompatible with the declared type array<integer,string> of property $noparse.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
95
			$this->singletags = array_merge($this->singletags, $moduleInterface->getSingleTags());
0 ignored issues
show
Documentation Bug introduced by
It seems like array_merge($this->singl...rface->getSingleTags()) of type array is incompatible with the declared type array<integer,string> of property $singletags.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
96
97
			$this->moduleInterfaces[$module] = $moduleInterface;
98
		}
99
100
	}
101
102
	/**
103
	 * @inheritdoc
104
	 */
105
	public function getTags():array {
106
		return array_keys($this->tagmap);
107
	}
108
109
	/**
110
	 * @inheritdoc
111
	 */
112
	public function getSingleTags():array {
113
		return $this->singletags;
114
	}
115
116
	/**
117
	 * @inheritdoc
118
	 */
119
	public function getNoparse():array{
120
		return $this->noparse;
121
	}
122
123
	/**
124
	 * @return string
125
	 */
126
	public function getEOL():string{
127
		return $this->options->replacement_eol;
128
	}
129
130
	/**
131
	 * @inheritdoc
132
	 */
133
	public function transform(string $tag, array $attributes, string $content, string $match, int $callback_count):string{
134
135
		if(!in_array($tag, array_keys($this->tagmap), true)){
136
			return $match; // $content
137
		}
138
139
		return call_user_func_array([$this->moduleInterfaces[$this->tagmap[$tag]], $tag], [$tag, $attributes, $content, $match, $callback_count]);
140
	}
141
142
}
143