Completed
Push — master ( f33ecc...f11cb1 )
by Dev
10:58 queued 09:04
created

HarvestLinksTrait   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 96
Duplicated Lines 0 %

Test Coverage

Coverage 85.71%

Importance

Changes 0
Metric Value
eloc 40
dl 0
loc 96
ccs 36
cts 42
cp 0.8571
rs 10
c 0
b 0
f 0
wmc 21

9 Methods

Rating   Name   Duplication   Size   Complexity  
A isInternalType() 0 3 1
A classifyLinks() 0 7 2
A isSelfType() 0 7 3
A isSubType() 0 3 1
A getType() 0 11 4
A getAbsoluteInternalLink() 0 3 1
A getNbrDuplicateLinks() 0 9 2
A getLinks() 0 18 6
A getLinkedRessources() 0 3 1
1
<?php
2
3
namespace PiedWeb\UrlHarvester;
4
5
trait HarvestLinksTrait
6
{
7
    /**
8
     * @var array
9
     */
10
    protected $links;
11
    protected $linksPerType;
12
13
    abstract public function getDom();
14
15
    abstract public function getDomain();
16
17 3
    public function getLinkedRessources()
18
    {
19 3
        return ExtractLinks::get($this->getDom(), $this->response->getEffectiveUrl(), ExtractLinks::SELECT_ALL);
20
    }
21
22 3
    public function getLinks($type = null)
23
    {
24 3
        if (null === $this->links) {
25 3
            $this->links = ExtractLinks::get($this->getDom(), $this->response->getEffectiveUrl());
26 3
            $this->classifyLinks();
27
        }
28
29 3
        switch ($type) {
30
            case Harvest::LINK_SELF:
31 3
                return $this->linksPerType[Harvest::LINK_SELF] ?? [];
32
            case Harvest::LINK_INTERNAL:
33 3
                return $this->linksPerType[Harvest::LINK_INTERNAL] ?? [];
34
            case Harvest::LINK_SUB:
35 3
                return $this->linksPerType[Harvest::LINK_SUB] ?? [];
36
            case Harvest::LINK_EXTERNAL:
37 3
                return $this->linksPerType[Harvest::LINK_EXTERNAL] ?? [];
38
            default:
39 3
                return $this->links;
40
        }
41
    }
42
43 3
    public function getNbrDuplicateLinks()
44
    {
45 3
        $links = $this->getLinks();
46 3
        $u = [];
47 3
        foreach ($links as $link) {
48 3
            $u[$link->getUrl()] = 1;
49
        }
50
51 3
        return count($links) - count($u);
52
    }
53
54
    abstract public function getDomainAndScheme();
55
56 3
    public function classifyLinks()
57
    {
58 3
        $links = $this->getLinks();
59
60 3
        foreach ($links as $link) {
61 3
            $type = $this->getType($link->getPageUrl());
62 3
            $this->linksPerType[$type][] = $link;
63
        }
64 3
    }
65
66 3
    public function isInternalType(string $url)
67
    {
68 3
        return 0 === strpos($url, $this->getDomainAndScheme());
69
    }
70
71
    public function isSubType(string $host)
72
    {
73
        return strtolower(substr($host, -strlen($this->getDomain()))) === $this->getDomain();
74
    }
75
76 3
    public function isSelfType(string $url)
77
    {
78 3
        if (0 !== strpos($url, '#')) {
79 3
            $url = substr($url, 0, -(strlen(parse_url($url, PHP_URL_FRAGMENT)) + 1));
80
        }
81
82 3
        return $this->isInternalType($url) && $url == $this->response->getEffectiveUrl();
83
    }
84
85 3
    public function getType(string $url): string
86
    {
87 3
        if ($this->isSelfType($url)) {
88
            return Harvest::LINK_SELF;
89 3
        } elseif ($this->isInternalType($url)) {
90 3
            return Harvest::LINK_INTERNAL;
91
        } elseif ($this->isSubType(parse_url($url, PHP_URL_HOST))) {
92
            return Harvest::LINK_SUB;
93
        }
94
95
        return Harvest::LINK_EXTERNAL;
96
    }
97
98 3
    public function getAbsoluteInternalLink(string $url)
99
    {
100 3
        return substr($url, strlen($this->getDomainAndScheme()));
101
    }
102
}
103