Passed
Pull Request — master (#1)
by Guillaume
11:58 queued 09:04
created

insertDashTableOfContents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 5
c 1
b 0
f 1
nc 1
nop 1
dl 0
loc 8
ccs 6
cts 6
cp 1
crap 1
rs 10
1
<?php
2
3
namespace App\Docsets;
4
5
use Godbout\DashDocsetBuilder\Docsets\BaseDocset;
6
use Illuminate\Support\Collection;
7
use Illuminate\Support\Facades\Storage;
8
use Illuminate\Support\Str;
9
use Wa72\HtmlPageDom\HtmlPageCrawler;
10
11
class ChartjsPluginDatalabels extends BaseDocset
12
{
13
    public const CODE = 'chartjs-plugin-datalabels';
14
    public const NAME = 'chartjs-plugin-datalabels';
15
    public const URL = 'chartjs-plugin-datalabels.netlify.app';
16
    public const INDEX = 'guide/index.html';
17
    public const PLAYGROUND = '';
18
    public const ICON_16 = '../../icons/icon.png';
19
    public const ICON_32 = '../../icons/[email protected]';
20
    public const EXTERNAL_DOMAINS = [
21
    ];
22
23
24 8
    public function entries(string $file): Collection
25
    {
26 8
        $crawler = HtmlPageCrawler::create(Storage::get($file));
27
28 8
        $entries = collect();
29
30 8
        $entries = $entries->merge($this->guideEntries($crawler, $file));
31 8
        $entries = $entries->merge($this->sectionEntries($crawler, $file));
32
33 8
        return $entries;
34
    }
35
36 8
    protected function guideEntries(HtmlPageCrawler $crawler, string $file)
37
    {
38 8
        $entries = collect();
39
40 8
        if (Str::contains($file, "{$this->url()}/guide/index.html")) {
41
            $crawler
42 8
                ->filter('.sidebar-links > li > a')
43 8
                ->each(function (HtmlPageCrawler $node) use ($entries) {
44 8
                    $entries->push([
45 8
                        'name' => $node->text(),
46 8
                        'type' => 'Guide',
47 8
                        'path' => $this->url() . '/guide/' . $node->attr('href'),
48
                    ]);
49 8
                });
50
        }
51
52 8
        return $entries;
53
    }
54
55 8
    protected function sectionEntries(HtmlPageCrawler $crawler, string $file)
56
    {
57 8
        $entries = collect();
58
59 8
        $crawler->filter('h2')->each(function (HtmlPageCrawler $node) use ($entries, $file) {
60 8
            $entries->push([
61 8
                'name' => $node->text(),
62 8
                'type' => 'Section',
63 8
                'path' => Str::after($file . '#' . Str::slug($node->text()), $this->innerDirectory())
64
            ]);
65 8
        });
66
67 8
        return $entries;
68
    }
69
70 4
    public function format(string $file): string
71
    {
72 4
        $crawler = HtmlPageCrawler::create(Storage::get($file));
73
74 4
        $this->removeLeftSidebar($crawler);
75 4
        $this->removeHeaderContentExceptSamples($crawler);
76 4
        $this->removeEditLink($crawler);
77
78 4
        $this->insertDashTableOfContents($crawler);
79
80 4
        return $crawler->saveHTML();
81
    }
82
83 4
    protected function removeLeftSidebar(HtmlPageCrawler $crawler)
84
    {
85 4
        $crawler->filter('.sidebar')->remove();
86 4
    }
87
88 4
    protected function removeHeaderContentExceptSamples(HtmlPageCrawler $crawler)
89
    {
90 4
        $header = $crawler->filter('header');
91
92 4
        $header->filter('header > *:not(:last-child)')->remove();
93 4
        $header->filter('header form')->remove();
94 4
        $header->filter('header .nav-item:not(:nth-child(3))')->remove();
95 4
        $header->filter('header nav > a')->remove();
96 4
    }
97
98 4
    protected function removeEditLink(HtmlPageCrawler $crawler)
99
    {
100 4
        $crawler->filter('.edit-link')->remove();
101 4
    }
102
103 4
    protected function insertDashTableOfContents(HtmlPageCrawler $crawler)
104
    {
105 4
        $crawler->filter('head')
106 4
            ->before('<a name="//apple_ref/cpp/Section/Top" class="dashAnchor"></a>');
107
108 4
        $crawler->filter('h2, h3')->each(static function (HtmlPageCrawler $node) {
109 4
            $node->before(
110 4
                '<a id="' . Str::slug($node->text()) . '" name="//apple_ref/cpp/Section/' . rawurlencode($node->text()) . '" class="dashAnchor"></a>'
111
            );
112 4
        });
113 4
    }
114
}
115