Passed
Push — master ( 872c38...4456de )
by Guillaume
11:06
created

TailwindCSS::removeTailwindUIAlert()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

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