XmlFilter::load()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 3
cts 3
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 2
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Rs\XmlFilter;
6
7
use Pimple\Container;
8
use Rs\XmlFilter\Container\XmlFilterProvider;
9
use Rs\XmlFilter\Document\Document;
10
use Rs\XmlFilter\Document\DomDocument;
11
use Rs\XmlFilter\Document\Element;
12
use Rs\XmlFilter\Document\SimpleXmlDocument;
13
use Rs\XmlFilter\Filter\Filter;
14
use Rs\XmlFilter\Filter\Manager\FilterManager;
15
use Rs\XmlFilter\Loader\Loader;
16
17
class XmlFilter
18
{
19
    /**
20
     * @var FilterManager
21
     */
22
    private $filterManager;
23
24 5
    public function __construct(FilterManager $filterManager)
25
    {
26 5
        $this->filterManager = $filterManager;
27 5
    }
28
29
    /**
30
     * @param Filter|callable $filter
31
     */
32 2
    public function addFilter(string $name, $filter)
33
    {
34 2
        $this->filterManager->add($name, $filter);
35 2
    }
36
37 1
    public static function load($content, string $class = null)
38
    {
39 1
        $document = self::createDocument($class);
40
41 1
        return $document->load($content);
42
    }
43
44 1
    private static function createDocument(string $class = null) : Document
45
    {
46 1
        if (null === $class) {
47 1
            $class = SimpleXmlDocument::class;
48 1
        } elseif (!class_exists($class)) {
49 1
            throw new \InvalidArgumentException('no suitable xml parser found');
50 1
        } elseif (!in_array(Document::class, class_implements($class), true)) {
51 1
            throw new \InvalidArgumentException('given class should implement Document');
52
        }
53
54 1
        if (extension_loaded('simplexml') && SimpleXmlDocument::class === $class) {
55 1
            return new SimpleXmlDocument();
56 1
        } elseif (extension_loaded('libxml') && DomDocument::class === $class) {
57 1
            return new DomDocument();
58
        }
59
60
        return new $class();
61
    }
62
63 3
    public function filter(Element $content, Loader $loader)
64
    {
65 3
        $config = $loader->__invoke();
66
67 3
        return $this->filterManager->filter(
68
            $content,
69 3
            $config['filter'],
70 3
            $config['options']
71
        );
72
    }
73
74
    public static function create(Container $container = null) : XmlFilter
75
    {
76
        $container = $container ?: new Container();
77
        $container->register(new XmlFilterProvider());
78
79
        return $container['xml_filter'];
80
    }
81
}
82