• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Cecilapp / Cecil / 5051446522

pending completion
5051446522

push

github

Arnaud Ligny
refactor: enhances code

15 of 15 new or added lines in 2 files covered. (100.0%)

2785 of 4124 relevant lines covered (67.53%)

0.68 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.65
/src/Generator/Section.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of Cecil.
7
 *
8
 * Copyright (c) Arnaud Ligny <arnaud@ligny.fr>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13

14
namespace Cecil\Generator;
15

16
use Cecil\Collection\Page\Collection as PagesCollection;
17
use Cecil\Collection\Page\Page;
18
use Cecil\Collection\Page\Type;
19
use Cecil\Exception\RuntimeException;
20

21
/**
22
 * Class Generator\Section.
23
 */
24
class Section extends AbstractGenerator implements GeneratorInterface
25
{
26
    /**
27
     * {@inheritdoc}
28
     */
29
    public function generate(): void
30
    {
31
        $sections = [];
1✔
32

33
        // identifying sections
34
        /** @var Page $page */
35
        foreach ($this->builder->getPages() as $page) {
1✔
36
            if ($page->getSection()) {
1✔
37
                // excludes page from its section?
38
                if ($page->getVariable('published') !== true || $page->getVariable('exclude')) {
1✔
39
                    $alteredPage = clone $page;
1✔
40
                    $alteredPage->setSection('');
1✔
41
                    $this->builder->getPages()->replace($page->getId(), $alteredPage);
1✔
42
                    continue;
1✔
43
                }
44
                $sections[$page->getSection()][$page->getVariable('language', $this->config->getLanguageDefault())][] = $page;
1✔
45
            }
46
        }
47

48
        // adds section to pages collection
49
        if (\count($sections) > 0) {
1✔
50
            $menuWeight = 100;
1✔
51

52
            foreach ($sections as $section => $languages) {
1✔
53
                foreach ($languages as $language => $pagesAsArray) {
1✔
54
                    $pageId = $path = Page::slugify($section);
1✔
55
                    if ($language != $this->config->getLanguageDefault()) {
1✔
56
                        $pageId = "$language/$pageId";
1✔
57
                    }
58
                    $page = (new Page($pageId))->setVariable('title', ucfirst($section))
1✔
59
                        ->setPath($path);
1✔
60
                    if ($this->builder->getPages()->has($pageId)) {
1✔
61
                        $page = clone $this->builder->getPages()->get($pageId);
1✔
62
                    }
63
                    $pages = new PagesCollection("section-$pageId", $pagesAsArray);
1✔
64
                    // cascade
65
                    /** @var \Cecil\Collection\Page\Page $page */
66
                    if ($page->hasVariable('cascade')) {
1✔
67
                        $cascade = $page->getVariable('cascade');
1✔
68
                        $pages->map(function (Page $page) use ($cascade) {
1✔
69
                            foreach ($cascade as $key => $value) {
1✔
70
                                if (!$page->hasVariable($key)) {
1✔
71
                                    $page->setVariable($key, $value);
1✔
72
                                }
73
                            }
74
                        });
1✔
75
                    }
76
                    // sorts pages
77
                    $pages = self::sortSubPages($page, $pages);
1✔
78
                    // adds navigation links (excludes taxonomy pages)
79
                    $sortby = $page->getVariable('sortby')['variable'] ?? (string) $page->getVariable('sortby') ?? 'date';
1✔
80
                    if (!\in_array($page->getId(), array_keys((array) $this->config->get('taxonomies')))) {
1✔
81
                        $this->addNavigationLinks($pages, $sortby, $page->getVariable('circular'));
1✔
82
                    }
83
                    // creates page for each section
84
                    $page->setType(Type::SECTION)
1✔
85
                        ->setSection($path)
1✔
86
                        ->setPages($pages)
1✔
87
                        ->setVariable('language', $language)
1✔
88
                        ->setVariable('date', $pages->first()->getVariable('date'))
1✔
89
                        ->setVariable('langref', $path);
1✔
90
                    // clean title
91
                    if ($page->getVariable('title') == 'index') {
1✔
92
                        $page->setVariable('title', $section);
1✔
93
                    }
94
                    // default menu
95
                    if (!$page->getVariable('menu')) {
1✔
96
                        $page->setVariable('menu', ['main' => ['weight' => $menuWeight]]);
1✔
97
                    }
98
                    $this->generatedPages->add($page);
1✔
99
                }
100
                $menuWeight += 10;
1✔
101
            }
102
        }
103
    }
104

105
    /**
106
     * Sorts subpages.
107
     */
108
    public static function sortSubPages(Page $page, PagesCollection $pages): PagesCollection
109
    {
110
        // sorts (by date by default)
111
        $pages = $pages->sortByDate();
1✔
112
        /*
113
         * sortby: date|updated|title|weight
114
         *
115
         * sortby:
116
         *   variable: date|updated
117
         *   desc_title: false|true
118
         *   reverse: false|true
119
         */
120
        if ($page->hasVariable('sortby')) {
1✔
121
            $sortby = (string) $page->getVariable('sortby');
1✔
122
            // options?
123
            $sortby = $page->getVariable('sortby')['variable'] ?? $sortby;
1✔
124
            $descTitle = $page->getVariable('sortby')['desc_title'] ?? false;
1✔
125
            $reverse = $page->getVariable('sortby')['reverse'] ?? false;
1✔
126
            // sortby: date, title or weight
127
            $sortMethod = sprintf('sortBy%s', ucfirst(str_replace('updated', 'date', $sortby)));
1✔
128
            if (!method_exists($pages, $sortMethod)) {
1✔
129
                throw new RuntimeException(sprintf('In "%s" "%s" is not a valid value for "sortby" variable.', $page->getId(), $sortby));
×
130
            }
131

132
            return $pages->$sortMethod(['variable' => $sortby, 'descTitle' => $descTitle, 'reverse' => $reverse]);
1✔
133
        }
134

135
        return $pages;
1✔
136
    }
137

138
    /**
139
     * Adds navigation (next and prev) to section sub pages.
140
     */
141
    protected function addNavigationLinks(PagesCollection $pages, string $sort = null, $circular = false): void
142
    {
143
        $pagesAsArray = $pages->toArray();
1✔
144
        if ($sort === null || $sort == 'date' || $sort == 'updated') {
1✔
145
            $pagesAsArray = array_reverse($pagesAsArray);
×
146
        }
147
        $count = \count($pagesAsArray);
1✔
148
        if ($count > 1) {
1✔
149
            foreach ($pagesAsArray as $position => $page) {
1✔
150
                switch ($position) {
151
                    case 0: // first
1✔
152
                        if ($circular) {
1✔
153
                            $page->setVariables([
1✔
154
                                'prev' => $pagesAsArray[$count - 1],
1✔
155
                            ]);
1✔
156
                        }
157
                        $page->setVariables([
1✔
158
                            'next' => $pagesAsArray[$position + 1],
1✔
159
                        ]);
1✔
160
                        break;
1✔
161
                    case $count - 1: // last
1✔
162
                        $page->setVariables([
1✔
163
                            'prev' => $pagesAsArray[$position - 1],
1✔
164
                        ]);
1✔
165
                        if ($circular) {
1✔
166
                            $page->setVariables([
1✔
167
                                'next' => $pagesAsArray[0],
1✔
168
                            ]);
1✔
169
                        }
170
                        break;
1✔
171
                    default:
172
                        $page->setVariables([
1✔
173
                            'prev' => $pagesAsArray[$position - 1],
1✔
174
                            'next' => $pagesAsArray[$position + 1],
1✔
175
                        ]);
1✔
176
                        break;
1✔
177
                }
178
                $this->generatedPages->add($page);
1✔
179
            }
180
        }
181
    }
182
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc