Passed
Pull Request — master (#3)
by Guillaume
11:19 queued 01:18
created

LaravelMix   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 48
dl 0
loc 103
rs 10
c 0
b 0
f 0
wmc 8

7 Methods

Rating   Name   Duplication   Size   Complexity  
A grab() 0 37 1
A guideEntries() 0 15 2
A entries() 0 9 1
A removeFooter() 0 3 1
A removeLeftSidebar() 0 3 1
A removeHeader() 0 3 1
A format() 0 9 1
1
<?php
2
3
namespace App\Docsets;
4
5
use Godbout\DashDocsetBuilder\Docsets\BaseDocset;
6
use Illuminate\Support\Collection;
7
use Illuminate\Support\Facades\Storage;
8
use Illuminate\Support\Str;
9
use Wa72\HtmlPageDom\HtmlPageCrawler;
10
11
class LaravelMix extends BaseDocset
12
{
13
    public const CODE = 'laravel-mix';
14
    public const NAME = 'Laravel Mix';
15
    public const URL = 'laravel-mix.com';
16
    public const INDEX = 'docs/main/installation.html';
17
    public const PLAYGROUND = '';
18
    public const ICON_16 = 'favicon-16x16.png';
19
    public const ICON_32 = 'favicon-32x32.png';
20
    public const EXTERNAL_DOMAINS = [];
21
22
23
    public function grab(): bool
24
    {
25
        /**
26
         * can't use PCRE regex style, so need to
27
         * type the whole list of shit (versions)
28
         * to ignore.
29
         */
30
        $toIgnore = implode('|', [
31
            'cdn-cgi',
32
            'docs/1.7/',
33
            'docs/2.0/',
34
            'docs/2.1/',
35
            'docs/3.0/',
36
            'docs/4.0/',
37
            'docs/4.1/',
38
            'docs/5.0/',
39
            'docs/6.0/',
40
        ]);
41
42
        system(
43
            "echo; wget laravel-mix.com/docs \
44
                --mirror \
45
                --trust-server-names \
46
                --reject-regex='{$toIgnore}' \
47
                --page-requisites \
48
                --adjust-extension \
49
                --convert-links \
50
                --span-hosts \
51
                --domains={$this->externalDomains()} \
52
                --directory-prefix=storage/{$this->downloadedDirectory()} \
53
                -e robots=off \
54
                --quiet \
55
                --show-progress",
56
            $result
57
        );
58
59
        return $result === 0;
60
    }
61
62
    public function entries(string $file): Collection
63
    {
64
        $crawler = HtmlPageCrawler::create(Storage::get($file));
65
66
        $entries = collect();
67
68
        $entries = $entries->union($this->guideEntries($crawler, $file));
69
70
        return $entries;
71
    }
72
73
    protected function guideEntries(HtmlPageCrawler $crawler, string $file)
74
    {
75
        $entries = collect();
76
77
        if (Str::contains($file, "{$this->url()}/docs/main/installation.html")) {
78
            $crawler->filter('nav#nav li a')->each(function (HtmlPageCrawler $node) use ($entries) {
79
                $entries->push([
80
                    'name' => trim($node->text()),
81
                    'type' => 'Guide',
82
                    'path' => $this->url() . '/docs/main/' . $node->attr('href'),
83
                ]);
84
            });
85
        }
86
87
        return $entries;
88
    }
89
90
    public function format(string $file): string
91
    {
92
        $crawler = HtmlPageCrawler::create(Storage::get($file));
93
94
        $this->removeHeader($crawler);
95
        $this->removeLeftSidebar($crawler);
96
        $this->removeFooter($crawler);
97
98
        return $crawler->saveHTML();
99
    }
100
101
    protected function removeHeader(HtmlPageCrawler $crawler)
102
    {
103
        $crawler->filter('header.sticky')->remove();
104
    }
105
106
    protected function removeLeftSidebar(HtmlPageCrawler $crawler)
107
    {
108
        $crawler->filter('#nav')->remove();
109
    }
110
111
    protected function removeFooter(HtmlPageCrawler $crawler)
112
    {
113
        $crawler->filter('footer.flex')->remove();
114
    }
115
}
116