Completed
Push — master ( 891bb6...0d3b88 )
by Iurii
01:15
created

Main::getHtmlpurifierInstance()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 8.7972
c 0
b 0
f 0
cc 4
eloc 13
nc 4
nop 1
1
<?php
2
3
/**
4
 * @package Filter
5
 * @author Iurii Makukh
6
 * @copyright Copyright (c) 2017, Iurii Makukh
7
 * @license https://www.gnu.org/licenses/gpl-3.0.en.html GPL-3.0+
8
 */
9
10
namespace gplcart\modules\filter;
11
12
use Exception;
13
use gplcart\core\Config;
14
use gplcart\core\Library;
15
use HTMLPurifier;
16
use HTMLPurifier_Config;
17
use LogicException;
18
19
/**
20
 * Main class for Filter module
21
 */
22
class Main
23
{
24
25
    /**
26
     * An array of HTML Purifier instances keyed by filter configuration hash
27
     * @var array
28
     */
29
    protected $htmlpurifiers = array();
30
31
    /**
32
     * Config class instance
33
     * @var \gplcart\core\Config $config
34
     */
35
    protected $config;
36
37
    /**
38
     * Library class instance
39
     * @var \gplcart\core\Library $library
40
     */
41
    protected $library;
42
43
    /**
44
     * @param Config $config
45
     * @param Library $library
46
     */
47
    public function __construct(Config $config, Library $library)
48
    {
49
        $this->config = $config;
50
        $this->library = $library;
51
    }
52
53
    /**
54
     * Implements hook "library.list"
55
     * @param array $libraries
56
     */
57
    public function hookLibraryList(array &$libraries)
58
    {
59
        $libraries['htmlpurifier'] = array(
60
            'name' => 'HTML Purifier', // @text
61
            'description' => 'Standards compliant HTML filter written in PHP', // @text
62
            'type' => 'php',
63
            'module' => 'filter',
64
            'url' => 'https://github.com/ezyang/htmlpurifier',
65
            'download' => 'https://github.com/ezyang/htmlpurifier/archive/v4.9.2.zip',
66
            'version_source' => array(
67
                'lines' => 100,
68
                'file' => 'vendor/ezyang/htmlpurifier/library/HTMLPurifier.php',
69
                'pattern' => '/.*VERSION.*(\\d+\\.+\\d+\\.+\\d+)/'
70
            ),
71
            'files' => array(
72
                'vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php'
73
            ),
74
        );
75
    }
76
77
    /**
78
     * Implements hook "route.list"
79
     * @param array $routes
80
     */
81
    public function hookRouteList(array &$routes)
82
    {
83
        $routes['admin/module/settings/filter'] = array(
84
            'access' => 'module_edit',
85
            'handlers' => array(
86
                'controller' => array('gplcart\\modules\\filter\\controllers\\Filter', 'listFilter')
87
            )
88
        );
89
90
        $routes['admin/module/settings/filter/edit/(\w+)'] = array(
91
            'access' => 'module_filter_edit',
92
            'handlers' => array(
93
                'controller' => array('gplcart\\modules\\filter\\controllers\\Filter', 'editFilter')
94
            )
95
        );
96
    }
97
98
    /**
99
     * Implements hook "user.role.permissions"
100
     * @param array $permissions
101
     */
102
    public function hookUserRolePermissions(array &$permissions)
103
    {
104
        $permissions['module_filter_edit'] = 'HTML Filter: edit'; // @text
105
        $permissions['module_filter_delete'] = 'HTML Filter: delete'; // @text
106
    }
107
108
    /**
109
     * Implements hook "filter"
110
     * @param string $text
111
     * @param array $filter
112
     * @param null|string $filtered
113
     */
114
    public function hookFilter($text, $filter, &$filtered)
115
    {
116
        if (isset($filter['module']) && $filter['module'] === 'filter' && !empty($filter['status'])) {
117
            try {
118
                $filtered = $this->filter($text, $filter);
119
            } catch (Exception $ex) {
120
                //
121
            }
122
        }
123
    }
124
125
    /**
126
     * Implements hook "filter.handlers"
127
     * @param mixed $filters
128
     */
129
    public function hookFilterHandlers(array &$filters)
130
    {
131
        $filters = array_merge($filters, $this->getHandlers());
132
    }
133
134
    /**
135
     * Implements hook "module.enable.after"
136
     */
137
    public function hookModuleEnableAfter()
138
    {
139
        $this->library->clearCache();
140
    }
141
142
    /**
143
     * Implements hook "module.disable.after"
144
     */
145
    public function hookModuleDisableAfter()
146
    {
147
        $this->library->clearCache();
148
    }
149
150
    /**
151
     * Implements hook "module.install.after"
152
     */
153
    public function hookModuleInstallAfter()
154
    {
155
        $this->library->clearCache();
156
    }
157
158
    /**
159
     * Implements hook "module.uninstall.after"
160
     */
161
    public function hookModuleUninstallAfter()
162
    {
163
        $this->library->clearCache();
164
165
        foreach (array_keys($this->config->select()) as $key) {
166
            if (strpos($key, 'module_filter_') === 0) {
167
                $this->config->reset($key);
168
            }
169
        }
170
    }
171
172
    /**
173
     * Filter a string
174
     * @param string $text
175
     * @param array $filter
176
     * @return string
177
     */
178
    public function filter($text, $filter)
179
    {
180
        return $this->getHtmlpurifierInstance($filter)->purify($text);
181
    }
182
183
    /**
184
     * Returns HTML Purifier class instance depending on the filter configuration
185
     * @param array $filter
186
     * @return HTMLPurifier
187
     * @throws LogicException
188
     */
189
    public function getHtmlpurifierInstance(array $filter)
190
    {
191
        ksort($filter['data']);
192
        $key = md5(json_encode($filter['data']));
193
194
        if (isset($this->htmlpurifiers[$key])) {
195
            return $this->htmlpurifiers[$key];
196
        }
197
198
        $this->library->load('htmlpurifier');
199
200
        if (!class_exists('HTMLPurifier')) {
201
            throw new LogicException('Class HTMLPurifier not found');
202
        }
203
204
        if (empty($filter['data'])) {
205
            $config = HTMLPurifier_Config::createDefault();
206
        } else {
207
            $config = HTMLPurifier_Config::create($filter['data']);
208
        }
209
210
        return $this->htmlpurifiers[$key] = new HTMLPurifier($config);
211
    }
212
213
    /**
214
     * Returns an array of filter handlers
215
     * @return array
216
     */
217
    public function getHandlers()
218
    {
219
        $filters = gplcart_config_get(__DIR__ . '/config/filters.php');
220
        $saved = $this->config->get('module_filter_filters', array());
221
        return array_replace_recursive($filters, $saved);
222
    }
223
224
}
225