Passed
Push — master ( e62da4...21834f )
by Guillaume
05:30
created

LaravelZero::updateBottomPadding()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 2
c 1
b 0
f 0
dl 0
loc 4
ccs 0
cts 3
cp 0
rs 10
cc 1
nc 1
nop 1
crap 2
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
        'jsdelivr.net',
23
        'googleapis.com',
24
        'googletagmanager.com'
25
    ];
26
27
    public function entries(string $file): Collection
28
    {
29
        $crawler = HtmlPageCrawler::create(Storage::get($file));
30
31
        $entries = collect();
32
        $entries = $entries->merge($this->guideEntries($crawler));
33
        $entries = $entries->merge($this->sectionEntries($crawler, $file));
34
35
        return $entries;
36
    }
37
38
    protected function guideEntries(HtmlPageCrawler $crawler)
39
    {
40
        $entries = collect();
41
42
        $crawler->filter('.lvl0, .lvl1')->each(function (HtmlPageCrawler $node) use ($entries) {
43
            if ($this->isRealPage(trim($node->text()))) {
44
                $entries->push([
45
                    'name' => trim($node->text()),
46
                    'type' => 'Guide',
47
                    'path' => $node->attr('href')
48
                ]);
49
            }
50
        });
51
52
        return $entries;
53
    }
54
55
    protected function isRealPage($name)
56
    {
57
        return ! in_array($name, ['Usage', 'Add-ons']);
58
    }
59
60
    protected function sectionEntries(HtmlPageCrawler $crawler, string $file)
61
    {
62
        $entries = collect();
63
64
        $crawler->filter('h2, h3, h4')->each(static function (HtmlPageCrawler $node) use ($entries, $file) {
65
            $fileBasename = basename($file);
66
67
            if (! in_array($fileBasename, ['index.html', '404.html'])) {
68
                $entries->push([
69
                    'name' => trim($node->text()),
70
                    'type' => 'Section',
71
                    'path' => basename($file) . '#' . Str::slug($node->text())
72
                ]);
73
            }
74
        });
75
76
        return $entries;
77
    }
78
79
    public function format(string $html): string
80
    {
81
        $crawler = HtmlPageCrawler::create($html);
82
83
        $this->removeHeader($crawler);
84
        $this->removeLeftSidebar($crawler);
85
        $this->removeFooter($crawler);
86
        $this->updateTopPadding($crawler);
87
        $this->updateContainerWidth($crawler);
88
        $this->updateBottomPadding($crawler);
89
        $this->insertDashTableOfContents($crawler);
90
91
        return $crawler->saveHTML();
92
    }
93
94
    protected function removeHeader(HtmlPageCrawler $crawler)
95
    {
96
        $crawler->filter('body > header')->remove();
97
    }
98
99
    protected function removeLeftSidebar(HtmlPageCrawler $crawler)
100
    {
101
        $crawler->filter('#js-nav-menu')->remove();
102
    }
103
104
    protected function removeFooter(HtmlPageCrawler $crawler)
105
    {
106
        $crawler->filter('body > footer')->remove();
107
    }
108
109
    protected function updateTopPadding(HtmlPageCrawler $crawler)
110
    {
111
        $crawler->filter('h1')
112
            ->css('margin-top', '1rem')
113
        ;
114
    }
115
116
    protected function updateContainerWidth(HtmlPageCrawler $crawler)
117
    {
118
        $crawler->filter('section.container > div > div')
119
            ->removeClass('lg:w-3/5')
120
            ->removeClass('lg:pl-4')
121
        ;
122
123
        $crawler->filter('section.container')
124
            ->removeClass('max-w-4xl')
125
            ->removeClass('md:px-8')
126
            ->removeClass('container')
127
        ;
128
    }
129
130
    protected function updateBottomPadding(HtmlPageCrawler $crawler)
131
    {
132
        $crawler->filter('section > div > div')
133
            ->removeClass('pb-16')
134
        ;
135
    }
136
137
    protected function insertDashTableOfContents(HtmlPageCrawler $crawler)
138
    {
139
        $crawler->filter('h1')
140
            ->before('<a name="//apple_ref/cpp/Section/Top" class="dashAnchor"></a>');
141
142
        $crawler->filter('h2, h3, h4')->each(static function (HtmlPageCrawler $node) {
143
            $node->before(
144
                '<a id="' . Str::slug($node->text()) . '" name="//apple_ref/cpp/Section/' . rawurlencode($node->text()) . '" class="dashAnchor"></a>'
145
            );
146
        });
147
    }
148
}
149