Main::isExcludedAsset()   B
last analyzed

Complexity

Conditions 6
Paths 4

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 19
rs 8.8571
c 0
b 0
f 0
cc 6
eloc 10
nc 4
nop 1
1
<?php
2
3
/**
4
 * @package Compressor
5
 * @author Iurii Makukh <[email protected]>
6
 * @copyright Copyright (c) 2018, Iurii Makukh <[email protected]>
7
 * @license https://www.gnu.org/licenses/gpl-3.0.en.html GPL-3.0-or-later
8
 */
9
10
namespace gplcart\modules\compressor;
11
12
use gplcart\core\Container;
13
use gplcart\core\helpers\Request;
14
use gplcart\core\Module;
15
16
/**
17
 * Main class for Compressor module
18
 */
19
class Main
20
{
21
    /**
22
     * Module class instance
23
     * @var \gplcart\core\Module;
24
     */
25
    protected $module;
26
27
    /**
28
     * Request class instance
29
     * @var \gplcart\core\helpers\Request;
30
     */
31
    protected $request;
32
33
    /**
34
     * Main constructor.
35
     * @param Module $module
36
     * @param Request $request
37
     */
38
    public function __construct(Module $module, Request $request)
39
    {
40
        $this->module = $module;
41
        $this->request = $request;
42
    }
43
44
    /**
45
     * Implements hook "template.data"
46
     * @param array $data
47
     */
48
    public function hookTemplateData(array &$data)
49
    {
50
        $settings = $this->module->getSettings('compressor');
51
52
        if (!empty($settings['status_css'])) {
53
            gplcart_array_sort($data['_css']);
54
            $data['_css'] = $this->compress($data['_css'], 'css');
55
        }
56
57
        if (!empty($settings['status_js'])) {
58
            foreach (array('top', 'bottom') as $position) {
59
                gplcart_array_sort($data["_js_$position"]);
60
                $data["_js_$position"] = $this->compress($data["_js_$position"], 'js');
61
            }
62
        }
63
    }
64
65
    /**
66
     * Implements hook "route.list"
67
     * @param array $routes
68
     */
69
    public function hookRouteList(array &$routes)
70
    {
71
        $routes['admin/module/settings/compressor'] = array(
72
            'access' => 'module_edit',
73
            'handlers' => array(
74
                'controller' => array('gplcart\\modules\\compressor\\controllers\\Settings', 'editSettings')
75
            )
76
        );
77
    }
78
79
    /**
80
     * Compress and aggregate an array of assets
81
     * @param array $assets
82
     * @param string $type
83
     * @return array
84
     */
85
    public function compress(array $assets, $type)
86
    {
87
        $group = 0;
88
        $groups = $results = array();
89
        $directory = GC_DIR_ASSET . "/compiled/$type";
90
91
        foreach ($assets as $key => $asset) {
92
93
            if ($this->isExcludedAsset($asset)) {
94
                $groups["__$group"] = $asset;
95
                $group++;
96
                continue;
97
            }
98
99
            if (!empty($asset['asset'])) {
100
                $groups[$group][$key] = $asset['asset'];
101
            }
102
        }
103
104
        $asset_helper = $this->getAssetHelper();
105
        $compressor_helper = $this->getCompressor()->setBase($this->request->base());
106
107
        foreach ($groups as $group => $contents) {
108
109
            if (strpos($group, '__') === 0) {
110
                $results[$group] = $contents;
111
                continue;
112
            }
113
114
            if ($type === 'js') {
115
                $aggregated = $compressor_helper->getJs($contents, $directory);
116
            } else if ($type === 'css') {
117
                $aggregated = $compressor_helper->getCss($contents, $directory);
118
            }
119
120
            if (!empty($aggregated)) {
121
                $asset = $asset_helper->build(array('asset' => $aggregated, 'version' => false));
122
                $results[$asset['key']] = $asset;
123
            }
124
        }
125
126
        return $results;
127
    }
128
129
    /**
130
     * Whether the asset is excluded from aggregation
131
     * @param array $asset
132
     * @return bool
133
     */
134
    protected function isExcludedAsset(array $asset)
135
    {
136
        if (!empty($asset['text']) || (isset($asset['type']) && $asset['type'] === 'external')) {
137
            return true;
138
        }
139
140
        $paths = array(
141
            'files/assets/system/js/common.js',
142
            'vendor/assets/jquery/'
143
        );
144
145
        foreach ($paths as $path) {
146
            if (strpos($asset['asset'], $path) !== false) {
147
                return true;
148
            }
149
        }
150
151
        return false;
152
    }
153
154
    /**
155
     * Asset helper class instance
156
     * @return \gplcart\core\helpers\Asset
157
     */
158
    protected function getAssetHelper()
159
    {
160
        /** @var \gplcart\core\helpers\Asset $instance */
161
        $instance = Container::get('gplcart\\core\\helpers\\Asset');
162
        return $instance;
163
    }
164
165
    /**
166
     * Returns Compressor class instance
167
     * @return \gplcart\modules\compressor\helpers\Compressor
168
     */
169
    public function getCompressor()
170
    {
171
        /** @var \gplcart\modules\compressor\helpers\Compressor $instance */
172
        $instance = Container::get('gplcart\\modules\\compressor\\helpers\\Compressor');
173
        return $instance;
174
    }
175
}
176