Passed
Push — master ( e62da4...21834f )
by Guillaume
05:30
created

Jigsaw::guideEntries()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 9
c 2
b 0
f 0
dl 0
loc 17
ccs 0
cts 10
cp 0
rs 9.9666
cc 2
nc 1
nop 2
crap 6
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 Jigsaw extends BaseDocset
11
{
12
    public const CODE = 'jigsaw';
13
    public const NAME = 'Jigsaw';
14
    public const URL = 'jigsaw.tighten.co';
15
    public const INDEX = 'installation.html';
16
    public const PLAYGROUND = '';
17
    public const ICON_16 = '../icon.png';
18
    public const ICON_32 = '../[email protected]';
19
    public const EXTERNAL_DOMAINS = [
20
        'googleapis.com',
21
        'jsdelivr.net',
22
    ];
23
24
25
    public function entries(string $file): Collection
26
    {
27
        $crawler = HtmlPageCrawler::create(Storage::get($file));
28
29
        $entries = collect();
30
        $entries = $entries->merge($this->guideEntries($crawler, $file));
31
        $entries = $entries->merge($this->sectionEntries($crawler, $file));
32
33
        return $entries;
34
    }
35
36
    protected function guideEntries(HtmlPageCrawler $crawler, string $file)
37
    {
38
        $entries = collect();
39
40
        $crawler->filter('h2')->each(static function (HtmlPageCrawler $node) use ($entries, $file) {
41
            $fileBasename = basename($file);
42
43
            if ($fileBasename !== 'index.html') {
44
                $entries->push([
45
                    'name' => trim($node->text()),
46
                    'type' => 'Guide',
47
                    'path' => $fileBasename
48
                ]);
49
            }
50
        });
51
52
        return $entries;
53
    }
54
55
    protected function sectionEntries(HtmlPageCrawler $crawler, string $file)
56
    {
57
        $entries = collect();
58
59
        $crawler->filter('h3')->each(static function (HtmlPageCrawler $node) use ($entries, $file) {
60
            $fileBasename = basename($file);
61
62
            if ($fileBasename !== 'index.html') {
63
                $entries->push([
64
                    'name' => trim($node->text()),
65
                    'type' => 'Section',
66
                    'path' => $fileBasename . '#' . Str::slug($node->text())
67
                ]);
68
            }
69
        });
70
71
        return $entries;
72
    }
73
74
    public function format(string $html): string
75
    {
76
        $crawler = HtmlPageCrawler::create($html);
77
78
        $this->removeHeader($crawler);
79
        $this->removeFooter($crawler);
80
        $this->updateTopPadding($crawler);
81
        $this->updateContainer($crawler);
82
        $this->updateTextSize($crawler);
83
        $this->updateH4Padding($crawler);
84
        $this->removeJavaScript($crawler);
85
        $this->insertDashTableOfContents($crawler);
86
87
        return $crawler->saveHTML();
88
    }
89
90
    protected function removeHeader(HtmlPageCrawler $crawler)
91
    {
92
        $crawler->filter('#vue-app > div:first-child')->remove();
93
        $crawler->filter('#vue-app > header')->remove();
94
    }
95
96
    protected function removeFooter(HtmlPageCrawler $crawler)
97
    {
98
        $crawler->filter('footer')->remove();
99
    }
100
101
    protected function updateTopPadding(HtmlPageCrawler $crawler)
102
    {
103
        $crawler->filter('#vue-app > div > div > div')
104
            ->removeClass('pt-4')
105
            ->css('margin-top', '-1.5rem')
106
        ;
107
    }
108
109
    protected function updateContainer(HtmlPageCrawler $crawler)
110
    {
111
        $crawler->filter('#vue-app > div')
112
            ->removeClass('pt-16')
113
            ->removeClass('md:pt-24')
114
            ->removeClass('lg:pt-32')
115
            ->removeClass('md:px-6')
116
        ;
117
118
        $crawler->filter('#vue-app > div > div')
119
            ->removeClass('max-w-3xl')
120
        ;
121
122
        $crawler->filter('div.markdown')
123
            ->removeClass('lg:max-w-md')
124
            ->removeClass('xl:max-w-lg')
125
            ->removeClass('md:mb-6')
126
            ->removeClass('lg:mb-10')
127
            ->removeClass('xl:px-10')
128
            ->removeClass('sm:shadow')
129
            ->removeClass('md:rounded-lg')
130
        ;
131
    }
132
133
    protected function updateTextSize(HtmlPageCrawler $crawler)
134
    {
135
        $crawler->filter('h2')
136
            ->addClass('text-3xl')
137
        ;
138
139
        $crawler->filter('h3')
140
            ->css('font-size', '1.5rem')
141
        ;
142
    }
143
144
    protected function updateH4Padding(HtmlPageCrawler $crawler)
145
    {
146
        $crawler->filter('h4')
147
            ->css('margin-top', '2.5rem')
148
        ;
149
    }
150
151
    protected function removeJavaScript(HtmlPageCrawler $crawler)
152
    {
153
        $crawler->filter('script')->remove();
154
    }
155
156
    protected function insertDashTableOfContents(HtmlPageCrawler $crawler)
157
    {
158
        $crawler->filter('h2')
159
            ->before('<a name="//apple_ref/cpp/Section/Top" class="dashAnchor"></a>');
160
161
        $crawler->filter('h3')->each(static function (HtmlPageCrawler $node) {
162
            $node->before(
163
                '<a id="' . Str::slug($node->text()) . '" name="//apple_ref/cpp/Section/' . rawurlencode($node->text()) . '" class="dashAnchor"></a>'
164
            );
165
        });
166
    }
167
}
168