Completed
Push — master ( c14884...42571b )
by Guillaume
05:41
created

TailwindCSS::updateTopPadding()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 1

Importance

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