Completed
Branch master (446cf6)
by Guillaume
04:16 queued 01:26
created

LaravelZero   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 134
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 14
eloc 63
dl 0
loc 134
c 0
b 0
f 0
rs 10

12 Methods

Rating   Name   Duplication   Size   Complexity  
A insertDashTableOfContents() 0 8 1
A removeHeader() 0 3 1
A updateBottomPadding() 0 4 1
A isRealPage() 0 3 1
A entries() 0 9 1
A removeLeftSidebar() 0 3 1
A sectionEntries() 0 19 2
A removeFooter() 0 3 1
A updateContainerWidth() 0 11 1
A guideEntries() 0 15 2
A updateTopPadding() 0 4 1
A format() 0 13 1
1
<?php
2
3
namespace App\Docsets;
4
5
use Illuminate\Support\Str;
6
use Illuminate\Support\Collection;
7
use Wa72\HtmlPageDom\HtmlPageCrawler;
8
use Illuminate\Support\Facades\Storage;
9
10
class LaravelZero extends BaseDocset
11
{
12
    public const CODE = 'laravel-zero';
13
    public const NAME = 'Laravel Zero';
14
    public const URL = 'laravel-zero.com';
15
    public const INDEX = 'introduction.html';
16
    public const PLAYGROUND = '';
17
    public const ICON_16 = '../icon.png';
18
    public const ICON_32 = '../[email protected]';
19
    public const EXTERNAL_DOMAINS = [
20
        'github.com',
21
        'raw.githubusercontent.com'
22
    ];
23
24
    public function entries(string $file): Collection
25
    {
26
        $crawler = HtmlPageCrawler::create(Storage::get($file));
27
28
        $entries = collect();
29
        $entries = $entries->merge($this->guideEntries($crawler));
30
        $entries = $entries->merge($this->sectionEntries($crawler, $file));
31
32
        return $entries;
33
    }
34
35
    protected function guideEntries(HtmlPageCrawler $crawler)
36
    {
37
        $entries = collect();
38
39
        $crawler->filter('.lvl0, .lvl1')->each(function (HtmlPageCrawler $node) use ($entries) {
40
            if ($this->isRealPage(trim($node->text()))) {
41
                $entries->push([
42
                    'name' => trim($node->text()),
43
                    'type' => 'Guide',
44
                    'path' => $node->attr('href')
45
                ]);
46
            }
47
        });
48
49
        return $entries;
50
    }
51
52
    protected function isRealPage($name)
53
    {
54
        return ! in_array($name, ['Usage', 'Add-ons']);
55
    }
56
57
    protected function sectionEntries(HtmlPageCrawler $crawler, string $file)
58
    {
59
        $entries = collect();
60
61
        $h1 = $crawler->filter('h1')->last();
62
63
        $crawler->filter('h2, h3, h4')->each(static function (HtmlPageCrawler $node) use ($entries, $file, $h1) {
64
            $fileBasename = basename($file);
65
66
            if (! in_array($fileBasename, ['index.html', '404.html'])) {
67
                $entries->push([
68
                    'name' => trim($node->text() . ' - ' . $h1->text()),
69
                    'type' => 'Section',
70
                    'path' => basename($file) . '#' . Str::slug($node->text())
71
                ]);
72
            }
73
        });
74
75
        return $entries;
76
    }
77
78
    public function format(string $html): string
79
    {
80
        $crawler = HtmlPageCrawler::create($html);
81
82
        $this->removeHeader($crawler);
83
        $this->removeLeftSidebar($crawler);
84
        $this->removeFooter($crawler);
85
        $this->updateTopPadding($crawler);
86
        $this->updateContainerWidth($crawler);
87
        $this->updateBottomPadding($crawler);
88
        $this->insertDashTableOfContents($crawler);
89
90
        return $crawler->saveHTML();
91
    }
92
93
    protected function removeHeader(HtmlPageCrawler $crawler)
94
    {
95
        $crawler->filter('body > header')->remove();
96
    }
97
98
    protected function removeLeftSidebar(HtmlPageCrawler $crawler)
99
    {
100
        $crawler->filter('#js-nav-menu')->remove();
101
    }
102
103
    protected function removeFooter(HtmlPageCrawler $crawler)
104
    {
105
        $crawler->filter('body > footer')->remove();
106
    }
107
108
    protected function updateTopPadding(HtmlPageCrawler $crawler)
109
    {
110
        $crawler->filter('h1')
111
            ->css('margin-top', '1rem')
112
        ;
113
    }
114
115
    protected function updateContainerWidth(HtmlPageCrawler $crawler)
116
    {
117
        $crawler->filter('section.container > div > div')
118
            ->removeClass('lg:w-3/5')
119
            ->removeClass('lg:pl-4')
120
        ;
121
122
        $crawler->filter('section.container')
123
            ->removeClass('max-w-4xl')
124
            ->removeClass('md:px-8')
125
            ->removeClass('container')
126
        ;
127
    }
128
129
    protected function updateBottomPadding(HtmlPageCrawler $crawler)
130
    {
131
        $crawler->filter('section > div > div')
132
            ->removeClass('pb-16')
133
        ;
134
    }
135
136
    protected function insertDashTableOfContents(HtmlPageCrawler $crawler)
137
    {
138
        $crawler->filter('h1')
139
            ->before('<a name="//apple_ref/cpp/Section/Top" class="dashAnchor"></a>');
140
141
        $crawler->filter('h2, h3, h4')->each(static function (HtmlPageCrawler $node) {
142
            $node->before(
143
                '<a id="' . Str::slug($node->text()) . '" name="//apple_ref/cpp/Section/' . rawurlencode($node->text()) . '" class="dashAnchor"></a>'
144
            );
145
        });
146
    }
147
}
148