Completed
Push — master ( fb63dd...b1c748 )
by Guillaume
08:25 queued 02:44
created

TailwindCSS::updateHeader()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 7
c 1
b 0
f 0
dl 0
loc 9
ccs 8
cts 8
cp 1
rs 10
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace App\Docsets;
4
5
use Illuminate\Support\Str;
6
use Wa72\HtmlPageDom\HtmlPage;
7
use Illuminate\Support\Collection;
8
use Wa72\HtmlPageDom\HtmlPageCrawler;
9
use Illuminate\Support\Facades\Storage;
10
11
class TailwindCSS extends BaseDocset
12
{
13
    public const CODE = 'tailwindcss';
14
    public const NAME = 'Tailwind CSS';
15
    public const URL = 'tailwindcss.com';
16
    public const INDEX = 'installation.html';
17
    public const PLAYGROUND = 'https://codesandbox.io/s/github/lbogdan/tailwindcss-playground';
18
    public const ICON_16 = 'favicon-16x16.png';
19
    public const ICON_32 = 'favicon-32x32.png';
20
    public const EXTERNAL_DOMAINS = [
21
        'refactoring-ui.nyc3.cdn.digitaloceanspaces.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
30 1
        $entries = $entries->merge($this->environmentEntries($crawler, $file));
31 1
        $entries = $entries->merge($this->instructionEntries($crawler, $file));
0 ignored issues
show
Bug introduced by
The method instructionEntries() does not exist on App\Docsets\TailwindCSS. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

31
        $entries = $entries->merge($this->/** @scrutinizer ignore-call */ instructionEntries($crawler, $file));

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
32 1
        $entries = $entries->merge($this->sampleEntries($crawler, $file));
33 1
        $entries = $entries->merge($this->resourceEntries($crawler, $file));
34
        $entries = $entries->merge($this->guideEntries($crawler, $file));
35 1
        $entries = $entries->merge($this->sectionEntries($crawler, $file));
36
37
        return $entries;
38 1
    }
39
40 1
    protected function environmentEntries(HtmlPageCrawler $crawler, string $file)
41
    {
42 1
        $entries = collect();
43 1
44
        if (basename($file) === 'community.html') {
45
            $parent = $crawler->filter('h1')->first();
46
47
            $crawler->filter('h2')->each(function (HtmlPageCrawler $node) use ($entries, $file, $parent) {
48
                $entries->push([
49
                    'name' => $this->cleanAnchorText($node->text()) . ' - ' . $parent->text(),
50 1
                    'type' => 'Environment',
51
                    'path' => basename($file) . '#' . Str::slug($node->text()),
52 1
                ]);
53 1
            });
54 1
55 1
            return $entries;
56
        }
57
    }
58
59 1
    protected function sampleEntries(HtmlPageCrawler $crawler, string $file)
60 1
    {
61 1
        $entries = collect();
62 1
63
        if (in_array(basename($file), [
64 1
            'alerts.html',
65
            'buttons.html',
66 1
            'cards.html',
67
            'forms.html',
68 1
            'grids.html',
69
            'navigation.html'
70 1
        ])) {
71
            $parent = $crawler->filter('h1')->first();
72 1
73
            $entries->push([
74 1
                'name' => $this->cleanAnchorText($parent->text()),
75 1
                'type' => 'Sample',
76
                'path' => basename($file) . '#' . Str::slug($parent->text()),
77
            ]);
78 1
79 1
            $crawler->filter('h2')->each(function (HtmlPageCrawler $node) use ($entries, $file, $parent) {
80 1
                $entries->push([
81 1
                    'name' => $this->cleanAnchorText($node->text()) . ' - ' . $parent->text(),
82
                    'type' => 'Sample',
83 1
                    'path' => basename($file) . '#' . Str::slug($node->text()),
84
                ]);
85 1
            });
86
87 1
            return $entries;
88
        }
89 1
    }
90
91 1
    protected function resourceEntries(HtmlPageCrawler $crawler, string $file)
92
    {
93 1
        $entries = collect();
94
95 1
        if (basename($file) === 'resources.html') {
96
            $parent = $crawler->filter('h1')->first();
97 1
98 1
            $crawler->filter('h2')->each(function (HtmlPageCrawler $node) use ($entries, $file, $parent) {
99 1
                $entries->push([
100 1
                    'name' => $this->cleanAnchorText($node->text()) . ' - ' . $parent->text(),
101
                    'type' => 'Resource',
102 1
                    'path' => basename($file) . '#' . Str::slug($node->text()),
103
                ]);
104
            });
105 1
106
            return $entries;
107
        }
108 1
    }
109
110 1
    protected function guideEntries(HtmlPageCrawler $crawler, string $file)
111
    {
112 1
        $pageTitle = (new HtmlPage(Storage::get($file)))->getTitle();
113
114
        $entries = collect();
115 1
116 1
        if ($pageTitle === 'Installation - Tailwind CSS') {
117 1
            $crawler->filter('#navWrapper li a')->each(static function (HtmlPageCrawler $node) use ($entries) {
118 1
                $entries->push([
119
                    'name' => trim($node->text()),
120 1
                    'type' => 'Guide',
121
                    'path' => $node->attr('href'),
122 1
                ]);
123
            });
124
        }
125 1
126
        return $entries;
127 1
    }
128
129 1
    protected function sectionEntries(HtmlPageCrawler $crawler, string $file)
130 1
    {
131 1
        $entries = collect();
132 1
133 1
        $parent = $crawler->filter('h1')->first();
134
135 1
        $crawler->filter('h2')->each(function (HtmlPageCrawler $node) use ($entries, $file, $parent) {
136
            $entries->push([
137
                'name' => $this->cleanAnchorText($node->text()) . ' - ' . $parent->text(),
138 1
                'type' => 'Section',
139
                'path' => basename($file) . '#' . Str::slug($node->text()),
140 1
            ]);
141 1
        });
142
143 1
        return $entries;
144
    }
145 1
146 1
    public function format(string $html): string
147
    {
148 1
        $crawler = HtmlPageCrawler::create($html);
149
150 1
        $this->removeNavbarAndHeader($crawler);
151 1
        $this->removeLeftSidebar($crawler);
152
        $this->removeRightSidebar($crawler);
153 1
        $this->updateCSS($crawler);
154
        $this->insertDashTableOfContents($crawler);
155 1
156 1
        return $crawler->saveHTML();
157 1
    }
158 1
159 1
    protected function removeNavbarAndHeader(HtmlPageCrawler $crawler)
160
    {
161 1
        $crawler->filter('body > div:first-child')->remove();
162
    }
163 1
164 1
    protected function removeLeftSidebar(HtmlPageCrawler $crawler)
165 1
    {
166 1
        $crawler->filter('#sidebar')->remove();
167 1
    }
168 1
169
    protected function removeRightSidebar(HtmlPageCrawler $crawler)
170 1
    {
171
        $crawler->filter('#app div.flex > div.hidden')->remove();
172 1
    }
173
174 1
    protected function updateCSS(HtmlPageCrawler $crawler)
175 1
    {
176 1
        $this->updateTopPadding($crawler);
177 1
        $this->updateHeader($crawler);
178 1
        $this->updateContainerWidth($crawler);
179 1
        $this->updateBottomPadding($crawler);
180 1
    }
181
182 1
    protected function updateTopPadding(HtmlPageCrawler $crawler)
183
    {
184 1
        $crawler->filter('#app > div')
185
            ->removeClass('pt-12')
186 1
            ->removeClass('pt-24')
187 1
            ->removeClass('pb-16')
188
            ->removeClass('lg:pt-28')
189 1
            ->removeClass('lg:pt-12')
190 1
        ;
191 1
    }
192 1
193 1
    protected function updateHeader(HtmlPageCrawler $crawler)
194 1
    {
195
        $crawler->filter('#app > div > div.markdown')
196 1
            ->removeClass('lg:ml-0')
197 1
            ->removeClass('lg:mr-auto')
198 1
            ->removeClass('xl:mx-0')
199 1
            ->removeClass('xl:w-3/4')
200 1
            ->removeClass('max-w-3xl')
201 1
            ->removeClass('xl:px-12')
202 1
        ;
203 1
    }
204 1
205
    protected function updateContainerWidth(HtmlPageCrawler $crawler)
206 1
    {
207
        $crawler->filter('body > div:first-child')
208 1
            ->removeClass('max-w-screen-xl');
209 1
210 1
        $crawler->filter('#content-wrapper')
211
            ->removeClass('lg:static')
212 1
            ->removeClass('lg:max-h-full')
213
            ->removeClass('lg:overflow-visible')
214 1
            ->removeClass('lg:w-3/4')
215 1
            ->removeClass('xl:w-4/5');
216
217
        $crawler->filter('#app > div > div.flex > div.markdown')
218 1
            ->removeClass('xl:p-12')
219 1
            ->removeClass('max-w-3xl')
220
            ->removeClass('lg:ml-0')
221 1
            ->removeClass('lg:mr-auto')
222 1
            ->removeClass('xl:w-3/4')
223
            ->removeClass('xl:px-12')
224 2
            ->removeClass('xl:mx-0');
225
    }
226 2
227
    protected function updateBottomPadding(HtmlPageCrawler $crawler)
228
    {
229
        $crawler->filter('body')
230
            ->addClass('pb-8');
231
    }
232
233
    protected function insertDashTableOfContents(HtmlPageCrawler $crawler)
234
    {
235
        $crawler->filter('h1')
236
            ->before('<a name="//apple_ref/cpp/Section/Top" class="dashAnchor"></a>');
237
238
        $crawler->filter('h2, h3')->each(function (HtmlPageCrawler $node) {
239
            $node->prepend(
240
                '<a id="' . Str::slug($node->text()) . '" name="//apple_ref/cpp/Section/' . rawurlencode($this->cleanAnchorText($node->text())) . '" class="dashAnchor"></a>'
241
            );
242
        });
243
    }
244
245
    protected function cleanAnchorText($anchorText)
246
    {
247
        return trim(preg_replace('/\s+/', ' ', $anchorText));
248
    }
249
}
250