Passed
Branch master (f9a666)
by Justin
04:27
created

Renderer   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 205
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 2

Test Coverage

Coverage 96.08%

Importance

Changes 0
Metric Value
wmc 19
lcom 2
cbo 2
dl 0
loc 205
ccs 49
cts 51
cp 0.9608
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 2
A registerFunctions() 0 5 1
A registerTheme() 0 9 2
A getEngine() 0 4 1
A getData() 0 4 1
A setData() 0 6 1
A validateData() 0 7 2
A wrapperClasses() 0 5 1
A image() 0 4 2
A processData() 0 10 3
A render() 0 4 1
A __toString() 0 8 2
1
<?php
2
3
namespace Vssl\Render;
4
5
use League\Plates\Engine;
6
7
class Renderer
8
{
9
    /**
10
     * Renderer configuration.
11
     *
12
     * @var array
13
     */
14
    protected $config;
15
16
    /**
17
     * Page data to render.
18
     *
19
     * @var array
20
     */
21
    protected $data;
22
23
    /**
24
     * Cache adapter.
25
     *
26
     * @var \Journey\Cache\CacheAdapterIterface
27
     */
28
    protected $cache;
29
30
    /**
31
     * String data to output.
32
     *
33
     * @var string
34
     */
35
    protected $output;
36
37
    /**
38
     * Template engine.
39
     *
40
     * @var \League\Plates\Engine
41
     */
42
    protected $engine;
43
44
    /**
45
     * Fields that are required in order to render.
46
     *
47
     * @var array
48
     */
49
    protected $required;
50
51
    /**
52
     * Name of the current theme.
53
     *
54
     * @var array
55
     */
56
    protected $theme;
57
58
    /**
59
     * Initialize our new renderer.
60
     */
61 9
    public function __construct(array $config, array $data)
62
    {
63 9
        $this->config = $config;
64 9
        $this->required = array_filter($config['required_fields']);
65 9
        $this->setData($data);
66 9
        $this->engine = new Engine(__DIR__ . "/../templates");
67 9
        $this->registerFunctions();
68 9
        if (isset($config['templates'])) {
69 1
            $this->registerTheme('default', $config['templates']);
70 1
        }
71 9
    }
72
73
    /**
74
     * Register custom theme functions particular function.
75
     *
76
     * @return $this
77
     */
78 9
    public function registerFunctions()
79
    {
80 9
        $this->engine->registerFunction('wrapperClasses', [$this, 'wrapperClasses']);
81 9
        $this->engine->registerFunction('image', [$this, 'image']);
82 9
    }
83
84
    /**
85
     * Add a single directory to the template engine.
86
     *
87
     * @param  string $directories directory of templates
0 ignored issues
show
Bug introduced by
There is no parameter named $directories. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
88
     * @return $this
89
     */
90 3
    public function registerTheme($theme, $directory)
91
    {
92 3
        if (!is_dir($directory)) {
93 1
            throw new RendererException('The specified theme directory does not exist: ' . $directory);
94
        }
95 2
        $this->theme = $theme;
96 2
        $this->engine->addFolder($theme, $directory, true);
97 2
        return $this;
98
    }
99
100
    /**
101
     * Returns the template rendering engine.
102
     *
103
     * @return League\Plates\Engine
104
     */
105 1
    public function getEngine()
106
    {
107 1
        return $this->engine;
108
    }
109
110
    /**
111
     * Get the page data that will be rendered.
112
     *
113
     * @return array
114
     */
115 2
    public function getData()
116
    {
117 2
        return $this->data;
118
    }
119
120
    /**
121
     * Replace the page data
122
     *
123
     * @param array $data
124
     */
125 9
    public function setData(array $data)
126
    {
127 9
        $this->validateData($data);
128 9
        $this->data = $data;
129 9
        return $this;
130
    }
131
132
    /**
133
     * Validate that the page data is complete enough to render.
134
     *
135
     * Note: Throws an exception if the page data is incomplete.
136
     *
137
     * @param  array  $data array
138
     * @return boolean
139
     */
140 9
    public function validateData(array $data)
141
    {
142 9
        if (!count(array_diff_key(array_flip($this->required), $data))) {
143 9
            return true;
144
        }
145 1
        throw new RendererException('Invalid or incomplete page data');
146
    }
147
148
    /**
149
     * Generate wrapper classes for stripes
150
     *
151
     * @return string
152
     */
153 3
    public function wrapperClasses($string)
154
    {
155 3
        $type = str_replace("stripe-", "", $string);
156 3
        return 'vssl-stripe vssl-stripe--' . $type;
157
    }
158
159
    /**
160
     * Returns the image url on the vssl server.
161
     *
162
     * @param  string $imageName hash.extension
0 ignored issues
show
Bug introduced by
There is no parameter named $imageName. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
163
     * @param  string $style     image style name
164
     * @return string
165
     */
166 2
    public function image($name, $style = false)
167
    {
168 2
        return ltrim($this->config['base_uri'], '/') . "/images" . ($style ? '/' . $style : '') . "/" . $name;
169
    }
170
171
    /**
172
     * Process data before its output. This is the last chance to make changes
173
     * to data before being passed to the actual template files.
174
     *
175
     * @return array
176
     */
177 3
    public function processData($data)
178
    {
179 3
        $data['themePrefix'] = $this->theme ? $this->theme . "::" : "";
180 3
        if (isset($data['stripes'])) {
181 3
            $data['stripes'] = array_filter($data['stripes'], function ($stripe) use ($data) {
182 3
                return $this->engine->exists($data['themePrefix'] . 'stripes/' . $stripe['type']);
183 3
            });
184 3
        }
185 3
        return $data;
186
    }
187
188
    /**
189
     * Render the current data.
190
     *
191
     * @return string
192
     */
193 3
    public function render()
194
    {
195 3
        return $this->engine->render('page', $this->processData($this->data));
196
    }
197
198
    /**
199
     * Return the rendered page.
200
     *
201
     * @return string
202
     */
203 3
    public function __toString()
204
    {
205
        try {
206 3
            return $this->render();
207
        } catch (\Exception $e) {
208
            return "Error rendering page: " . $e->getMessage();
209
        }
210
    }
211
}
212