Passed
Push — master ( 4c211f...58f014 )
by Brent
02:47
created

SiteParser::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 4
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Brendt\Stitcher\Parser\Site;
4
5
use Brendt\Html\Meta\Meta;
6
use Brendt\Stitcher\Event\Event;
7
use Brendt\Stitcher\Exception\InvalidSiteException;
8
use Brendt\Stitcher\Exception\TemplateNotFoundException;
9
use Brendt\Stitcher\Site\Page;
10
use Brendt\Stitcher\Site\Site;
11
use Symfony\Component\EventDispatcher\EventDispatcher;
12
use Symfony\Component\Finder\Finder;
13
use Symfony\Component\Finder\SplFileInfo;
14
use Symfony\Component\Yaml\Exception\ParseException;
15
use Symfony\Component\Yaml\Yaml;
16
17
class SiteParser
18
{
19
    const EVENT_PARSER_INIT = 'parser.initialised';
20
21
    const EVENT_PAGE_PARSING = 'page.parsing';
22
23
    const EVENT_PAGE_PARSED = 'page.parsed';
24
25
    /**
26
     * @var string
27
     */
28
    private $filter;
29
30
    /**
31
     * @var string
32
     */
33
    private $srcDir;
34
35
    /**
36
     * @var array
37
     */
38
    private $metaConfig;
39
40
    /**
41
     * @var SplFileInfo[]
42
     */
43
    private $templates;
44
45
    /**
46
     * @var EventDispatcher
47
     */
48
    private $eventDispatcher;
49
50
    /**
51
     * @var PageParser
52
     */
53
    private $pageParser;
54
55
    /**
56
     * SiteParser constructor.
57
     *
58
     * @param string                $srcDir
59
     * @param EventDispatcher       $eventDispatcher
60
     * @param PageParser            $pageParser
61
     * @param array                 $metaConfig
62
     */
63
    public function __construct(
64
        string $srcDir,
65
        EventDispatcher $eventDispatcher,
66
        PageParser $pageParser,
67
        array $metaConfig = []
68
    ) {
69
        $this->srcDir = $srcDir;
70
        $this->eventDispatcher = $eventDispatcher;
71
        $this->pageParser = $pageParser;
72
        $this->metaConfig = $metaConfig;
73
    }
74
75
    /**
76
     * Load a site from YAML configuration files in the `directories.src`/site directory.
77
     * All YAML files are loaded and parsed into Page objects and added to a Site collection.
78
     *
79
     * @param array $routes
80
     *
81
     * @return Site
82
     * @throws InvalidSiteException
83
     * @see \Brendt\Stitcher\Site\Page
84
     * @see \Brendt\Stitcher\Site\Site
85
     */
86
    public function loadSite(array $routes = []) : Site {
87
        /** @var SplFileInfo[] $files */
88
        $files = Finder::create()->files()->in("{$this->srcDir}/site")->name('*.yml');
89
        $site = new Site();
90
91
        foreach ($files as $file) {
92
            try {
93
                $fileContents = (array) Yaml::parse($file->getContents());
94
            } catch (ParseException $e) {
95
                throw new InvalidSiteException("{$file->getRelativePathname()}: {$e->getMessage()}");
96
            }
97
98
            foreach ($fileContents as $route => $data) {
99
                if (count($routes) && !in_array($route, $routes)) {
100
                    continue;
101
                }
102
103
                $page = new Page($route, $data, $this->createMeta());
104
                $site->addPage($page);
105
            }
106
        }
107
108
        return $site;
109
    }
110
111
    /**
112
     * Parse a path into usable data.
113
     *
114
     * @param array  $routes
115
     * @param string $filterValue
116
     *
117
     * @return array|mixed
118
     * @throws TemplateNotFoundException
119
     */
120
    public function parse($routes = [], string $filterValue = null) : array {
121
        $blanket = [];
122
123
        $site = $this->loadSite((array) $routes);
124
        $this->eventDispatcher->dispatch(self::EVENT_PARSER_INIT, Event::create(['site' => $site]));
125
126
        foreach ($site as $page) {
127
            $this->eventDispatcher->dispatch(self::EVENT_PAGE_PARSING, Event::create(['page' => $page]));
128
129
            $this->pageParser->validate($page);
130
            $pages = $this->pageParser->parseAdapters($page, $filterValue);
131
132
            /** @var Page $entryPage */
133
            foreach ($pages as $entryPage) {
134
                $blanket[$entryPage->getId()] = $this->pageParser->parsePage($entryPage);
135
            }
136
137
            $this->eventDispatcher->dispatch(self::EVENT_PAGE_PARSED, Event::create(['page' => $page]));
138
        }
139
140
        return $blanket;
141
    }
142
143
    /**
144
     * @param string $filter
145
     *
146
     * @return SiteParser
147
     */
148
    public function setFilter(string $filter) : SiteParser {
149
        $this->filter = $filter;
150
151
        return $this;
152
    }
153
154
    /**
155
     * @return Meta
156
     */
157
    private function createMeta() : Meta {
158
        $meta = new Meta();
159
160
        return $meta;
161
    }
162
}
163