Test Failed
Push — master ( 588ef3...436e37 )
by Guillaume
05:07
created

LaravelZero::format()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 11
c 2
b 0
f 0
dl 0
loc 15
ccs 0
cts 10
cp 0
rs 9.9
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 = 'docs/introduction.html';
16
    public const PLAYGROUND = '';
17
    public const ICON_16 = '../../icons/icon.png';
18
    public const ICON_32 = '../../icons/[email protected]';
19
    public const EXTERNAL_DOMAINS = [
20
        'raw.githubusercontent.com',
21
        'googleapis.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' => $this->url() . '/docs/' . $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
        $crawler->filter('h2, h3, h4')->each(function (HtmlPageCrawler $node) use ($entries, $file) {
62
            if (! in_array(basename($file), ['index.html', '404.html'])) {
63
                $entries->push([
64
                    'name' => trim($node->text()),
65
                    'type' => 'Section',
66
                    'path' => Str::after($file . '#' . Str::slug($node->text()), $this->innerDirectory()),
67
                ]);
68
            }
69
        });
70
71
        return $entries;
72
    }
73
74
    public function format(string $html): string
75
    {
76
        $crawler = HtmlPageCrawler::create($html);
77
78
        $this->removeHeader($crawler);
79
        $this->removeLeftSidebar($crawler);
80
        $this->removeFooter($crawler);
81
        $this->updateTopPadding($crawler);
82
        $this->updateContainerWidth($crawler);
83
        $this->updateBottomPadding($crawler);
84
        $this->removeUnwantedCSS($crawler);
85
        $this->removeUnwantedJavaScript($crawler);
86
        $this->insertDashTableOfContents($crawler);
87
88
        return $crawler->saveHTML();
89
    }
90
91
    protected function removeHeader(HtmlPageCrawler $crawler)
92
    {
93
        $crawler->filter('body > header')->remove();
94
    }
95
96
    protected function removeLeftSidebar(HtmlPageCrawler $crawler)
97
    {
98
        $crawler->filter('#js-nav-menu')->remove();
99
    }
100
101
    protected function removeFooter(HtmlPageCrawler $crawler)
102
    {
103
        $crawler->filter('body > footer')->remove();
104
    }
105
106
    protected function updateTopPadding(HtmlPageCrawler $crawler)
107
    {
108
        $crawler->filter('h1')
109
            ->css('margin-top', '1rem')
110
        ;
111
    }
112
113
    protected function updateContainerWidth(HtmlPageCrawler $crawler)
114
    {
115
        $crawler->filter('section.container > div > div')
116
            ->removeClass('lg:w-3/5')
117
            ->removeClass('lg:pl-4')
118
        ;
119
120
        $crawler->filter('section.container')
121
            ->removeClass('max-w-4xl')
122
            ->removeClass('md:px-8')
123
            ->removeClass('container')
124
        ;
125
    }
126
127
    protected function updateBottomPadding(HtmlPageCrawler $crawler)
128
    {
129
        $crawler->filter('section > div > div')
130
            ->removeClass('pb-16')
131
        ;
132
    }
133
134
    protected function removeUnwantedCSS(HtmlPageCrawler $crawler)
135
    {
136
        $crawler->filter('link[href*="docsearch.min.css"]')->remove();
137
    }
138
139
    protected function removeUnwantedJavaScript(HtmlPageCrawler $crawler)
140
    {
141
        $crawler->filter('script[src*=docsearch]')->remove();
142
        $crawler->filter('script[src*=gtag]')->remove();
143
        $crawler->filterXPath("//script[text()[contains(.,'docsearch')]]")->remove();
144
        $crawler->filterXPath("//script[text()[contains(.,'gtag')]]")->remove();
145
    }
146
147
    protected function insertDashTableOfContents(HtmlPageCrawler $crawler)
148
    {
149
        $crawler->filter('h1')
150
            ->before('<a name="//apple_ref/cpp/Section/Top" class="dashAnchor"></a>');
151
152
        $crawler->filter('h2, h3, h4')->each(static function (HtmlPageCrawler $node) {
153
            $node->before(
154
                '<a id="' . Str::slug($node->text()) . '" name="//apple_ref/cpp/Section/' . rawurlencode($node->text()) . '" class="dashAnchor"></a>'
155
            );
156
        });
157
    }
158
}
159