Passed
Push — master ( ff576e...774618 )
by Guillaume
05:39
created

LaravelZero::guideEntries()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 2

Importance

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