Passed
Push — master ( cb72c1...6a1f09 )
by Arnaud
07:28
created

Homepage   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Test Coverage

Coverage 84.38%

Importance

Changes 0
Metric Value
eloc 32
dl 0
loc 57
ccs 27
cts 32
cp 0.8438
rs 10
c 0
b 0
f 0
wmc 16

1 Method

Rating   Name   Duplication   Size   Complexity  
D generate() 0 52 16
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of Cecil.
7
 *
8
 * Copyright (c) Arnaud Ligny <[email protected]>
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\Page;
17
use Cecil\Collection\Page\Type;
18
use Cecil\Exception\RuntimeException;
19
20
/**
21
 * Class Generator\Homepage.
22
 */
23
class Homepage extends AbstractGenerator implements GeneratorInterface
24
{
25
    /**
26
     * {@inheritdoc}
27
     */
28 1
    public function generate(): void
29
    {
30 1
        foreach ($this->config->getLanguages() as $lang) {
31 1
            $language = $lang['code'];
32 1
            $pageId = 'index';
33 1
            if ($language != $this->config->getLanguageDefault()) {
34 1
                $pageId = "$language/$pageId";
35
            }
36
            // creates a new index page...
37 1
            $page = (new Page($pageId))->setPath('')->setVariable('title', 'Home');
38
            // ... clones it if already exists
39 1
            if ($this->builder->getPages()->has($pageId)) {
40 1
                $page = clone $this->builder->getPages()->get($pageId);
41
            }
42
            /** @var \Cecil\Collection\Page\Page $page */
43 1
            $page->setType(Type::HOMEPAGE->value);
44
            // collects all pages
45 1
            $subPages = $this->builder->getPages()->filter(function (Page $page) use ($language) {
46 1
                return $page->getType() == Type::PAGE->value
47 1
                    && $page->isVirtual() === false
48 1
                    && $page->getVariable('exclude') !== true
49 1
                    && $page->getVariable('language') == $language;
50 1
            });
51
            // collects pages of a section
52
            /** @var \Cecil\Collection\Page\Collection $subPages */
53 1
            if ($page->hasVariable('pagesfrom') && $this->builder->getPages()->has((string) $page->getVariable('pagesfrom'))) {
54
                $subPages = $this->builder->getPages()->get((string) $page->getVariable('pagesfrom'))->getPages();
55
            }
56 1
            if ($subPages instanceof \Cecil\Collection\Page\Collection) {
57
                // sorts pages
58 1
                $pages = $subPages->sortBy($this->config->get('pages.sortby'));
59 1
                if ($page->hasVariable('sortby')) {
60
                    try {
61
                        $pages = $pages->sortBy($page->getVariable('sortby'));
62
                    } catch (RuntimeException $e) {
63
                        throw new RuntimeException(sprintf('In page "%s", %s', $page->getId(), $e->getMessage()));
64
                    }
65
                }
66 1
                $page->setPages($pages);
67 1
                if ($pages->first()) {
68 1
                    $page->setVariable('date', $pages->first()->getVariable('date'));
69
                }
70
            }
71
            // set default "main" menu
72 1
            if (!$page->getVariable('menu')) {
73 1
                $page->setVariable('menu', ['main' => ['weight' => 0]]);
74
            }
75
            // add an alias redirection from the root if language path prefix is forced for the default language
76 1
            if ($language == $this->config->getLanguageDefault() && (bool) $this->config->get('language.prefix')) {
77
                $page->setVariable('alias', '../');
78
            }
79 1
            $this->generatedPages->add($page);
80
        }
81
    }
82
}
83