Completed
Push — master ( 808f8c...952fde )
by Vladimir
11s
created

WatchSubscriber::getSubscribedEvents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 10
nc 1
nop 0
1
<?php
2
3
/**
4
 * @copyright 2018 Vladimir Jimenez
5
 * @license   https://github.com/allejo/stakx/blob/master/LICENSE.md MIT
6
 */
7
8
namespace allejo\stakx\EventSubscriber;
9
10
use allejo\stakx\Command\BuildableCommand;
11
use allejo\stakx\Event\CollectionDefinitionAdded;
12
use allejo\stakx\Event\CollectionItemAdded;
13
use allejo\stakx\Event\CompileProcessTemplateCreation;
14
use allejo\stakx\Event\DataItemAdded;
15
use allejo\stakx\Event\DataItemFolderAdded;
16
use allejo\stakx\Event\DatasetDefinitionAdded;
17
use allejo\stakx\Event\PageViewAdded;
18
use allejo\stakx\Event\PageViewDefinitionAdded;
19
use allejo\stakx\FileMapper;
20
use allejo\stakx\Filesystem\FilesystemLoader as fs;
21
use allejo\stakx\Filesystem\FilesystemPath;
22
use allejo\stakx\Manager\ThemeManager;
23
use allejo\stakx\Service;
24
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
25
26
class WatchSubscriber implements EventSubscriberInterface
27
{
28
    private $fileMapper;
29
30
    public function __construct(FileMapper $fileMapper)
31
    {
32
        $this->fileMapper = $fileMapper;
33
    }
34
35
    public function recordCollectionDefinition(CollectionDefinitionAdded $event)
36
    {
37
        $this->fileMapper->registerFolder($event->getFolderName(), FileMapper::CONTENT_ITEM);
38
        $this->fileMapper->registerMetadata(
39
            sprintf('collection.%s', $event->getCollectionName()),
40
            $event->getFolderName()
41
        );
42
    }
43
44
    public function recordCollectionItem(CollectionItemAdded $event)
45
    {
46
        $this->fileMapper->registerFile($event->getContentItem());
47
    }
48
49
    public function recordDataItemDefinition(DataItemFolderAdded $event)
50
    {
51
        $this->fileMapper->registerFolder($event->getFolderName(), FileMapper::DATA_ITEM);
52
    }
53
54
    public function recordDataItem(DataItemAdded $event)
55
    {
56
        $this->fileMapper->registerFile($event->getDataItem());
57
    }
58
59
    public function recordDatasetDefinition(DatasetDefinitionAdded $event)
60
    {
61
        $this->fileMapper->registerFolder($event->getDatasetFolder(), FileMapper::DATA_ITEM);
62
        $this->fileMapper->registerMetadata(
63
            sprintf('dataset.%s', $event->getDatasetName()),
64
            $event->getDatasetFolder()
65
        );
66
    }
67
68
    public function recordPageView(PageViewAdded $event)
69
    {
70
        $this->fileMapper->registerFile($event->getPageView());
71
    }
72
73
    public function recordPageViewDefinition(PageViewDefinitionAdded $event)
74
    {
75
        $this->fileMapper->registerFolder($event->getFolderName(), FileMapper::BASE_PAGEVIEW);
76
    }
77
78
    public function recordTemplateDependencies(CompileProcessTemplateCreation $event)
79
    {
80
        $pageView = $event->getPageView();
81
        $template = $event->getTemplate();
82
83
        // Keep track of import dependencies
84
        foreach ($pageView->getImportDependencies() as $dependency)
85
        {
86
            $this->fileMapper->registerTemplateInclude($dependency, $pageView->getRelativeFilePath());
87
        }
88
89
        // Keep track of Twig extends'
90
        $parent = $template->getParentTemplate();
91
92
        while ($parent !== false)
93
        {
94
            // Replace the '@theme' namespace in Twig with the path to the theme folder and create a FilesystemPath object from the given path
95
            $path = str_replace('@theme', fs::appendPath(ThemeManager::THEME_FOLDER, $event->getTheme()), $parent->getTemplateName());
96
            $path = new FilesystemPath($path);
97
98
            $this->fileMapper->registerTemplateExtend((string)$path, $pageView->getRelativeFilePath());
99
100
            $parent = $parent->getParentTemplate();
101
        }
102
    }
103
104
    /**
105
     * {@inheritdoc}
106
     */
107
    public static function getSubscribedEvents()
108
    {
109
        // @TODO Don't subscribe to these events unless we're in "watch" mode.
110
111
        return [
112
            CollectionDefinitionAdded::NAME => 'recordCollectionDefinition',
113
            CollectionItemAdded::NAME => 'recordCollectionItem',
114
115
            DataItemFolderAdded::NAME => 'recordDataItemDefinition',
116
            DataItemAdded::NAME => 'recordDataItem',
117
            DatasetDefinitionAdded::NAME => 'recordDatasetDefinition',
118
119
            PageViewAdded::NAME => 'recordPageView',
120
            PageViewDefinitionAdded::NAME => 'recordPageViewDefinition',
121
122
            CompileProcessTemplateCreation::NAME => 'recordTemplateDependencies',
123
        ];
124
    }
125
}
126