Test Failed
Push — master ( 49669f...06f7f1 )
by Guillaume
15:36
created

LaravelZero::is404OrIndex()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 2

Importance

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