xref: /plugin/combo/action/css.php (revision 2128d41957a347f460d708a4ede62030dec35ebe)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3007225e5Sgerardnico
4007225e5Sgerardnicouse ComboStrap\PluginUtility;
5007225e5Sgerardnico
6007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
7007225e5Sgerardnico
8*2128d419Sgerardnicorequire_once(__DIR__ . '/../class/' . 'PluginUtility.php');
9*2128d419Sgerardnico
10007225e5Sgerardnico/**
11007225e5Sgerardnico * Class action_plugin_combo_css
12007225e5Sgerardnico * Delete Backend CSS for front-end
13007225e5Sgerardnico *
14007225e5Sgerardnico * Bug:
15007225e5Sgerardnico *   * https://datacadamia.comlighthouse - no interwiki
16007225e5Sgerardnico *
17007225e5Sgerardnico * A call to /lib/exe/css.php?t=template&tseed=time()
18007225e5Sgerardnico *
19007225e5Sgerardnico *    * t is the template
20007225e5Sgerardnico *
21007225e5Sgerardnico *    * tseed is md5 of modified time of the below config file set at {@link tpl_metaheaders()}
22007225e5Sgerardnico *
23007225e5Sgerardnico *        * conf/dokuwiki.php
24007225e5Sgerardnico *        * conf/local.php
25007225e5Sgerardnico *        * conf/local.protected.php
26007225e5Sgerardnico *        * conf/tpl/strap/style.ini
27007225e5Sgerardnico *
28007225e5Sgerardnico */
29007225e5Sgerardnicoclass action_plugin_combo_css extends DokuWiki_Action_Plugin
30007225e5Sgerardnico{
31007225e5Sgerardnico
32007225e5Sgerardnico    /**
33007225e5Sgerardnico     * Conf
34007225e5Sgerardnico     */
35007225e5Sgerardnico    const CONF_ENABLE_MINIMAL_FRONTEND_STYLESHEET = 'enableMinimalFrontEndStylesheet';
36007225e5Sgerardnico    const CONF_DISABLE_DOKUWIKI_STYLESHEET = 'disableDokuwikiStylesheet';
37007225e5Sgerardnico
38007225e5Sgerardnico    /**
39007225e5Sgerardnico     * Front end or backend
40007225e5Sgerardnico     */
41007225e5Sgerardnico    const WHICH_END_KEY = 'end';
42007225e5Sgerardnico    const VALUE_FRONT = 'front';
43007225e5Sgerardnico    const VALUE_BACK = 'back';
44007225e5Sgerardnico
45007225e5Sgerardnico    /**
46007225e5Sgerardnico     * List of excluded plugin
47007225e5Sgerardnico     */
48007225e5Sgerardnico    const EXCLUDED_PLUGINS = array(
49007225e5Sgerardnico        "acl",
50007225e5Sgerardnico        "authplain",
51007225e5Sgerardnico        "changes",
52007225e5Sgerardnico        "config",
53007225e5Sgerardnico        "extension",
54007225e5Sgerardnico        "info",
55007225e5Sgerardnico        "move",
56007225e5Sgerardnico        "popularity",
57007225e5Sgerardnico        "revert",
58007225e5Sgerardnico        "safefnrecode",
59007225e5Sgerardnico        "searchindex",
60007225e5Sgerardnico        "sqlite",
61007225e5Sgerardnico        "upgrade",
62007225e5Sgerardnico        "usermanager"
63007225e5Sgerardnico    );
64007225e5Sgerardnico
65007225e5Sgerardnico    /**
66007225e5Sgerardnico     * Registers a callback function for a given event
67007225e5Sgerardnico     *
68007225e5Sgerardnico     * @param Doku_Event_Handler $controller DokuWiki's event controller object
69007225e5Sgerardnico     * @return void
70007225e5Sgerardnico     *
71007225e5Sgerardnico     * To fire this event
72007225e5Sgerardnico     *   * Ctrl+Shift+R to disable browser cache
73007225e5Sgerardnico     *
74007225e5Sgerardnico     */
75007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
76007225e5Sgerardnico    {
77007225e5Sgerardnico
78007225e5Sgerardnico
79007225e5Sgerardnico        /**
80007225e5Sgerardnico         * Delete the all.css file due to `group` class
81007225e5Sgerardnico         */
82007225e5Sgerardnico        $controller->register_hook('CSS_STYLES_INCLUDED', 'BEFORE', $this, 'handle_css_styles');
83007225e5Sgerardnico
84007225e5Sgerardnico        /**
85007225e5Sgerardnico         * For front-end/public only
86007225e5Sgerardnico         */
87007225e5Sgerardnico        $urlPropertyValue = PluginUtility::getPropertyValue(self::WHICH_END_KEY, self::VALUE_BACK);
88007225e5Sgerardnico        if (PluginUtility::getRequestScript() == "css.php" && $urlPropertyValue == self::VALUE_FRONT) {
89007225e5Sgerardnico            /**
90007225e5Sgerardnico             * The process follows the following steps:
91007225e5Sgerardnico             *     * With CSS_STYLES_INCLUDED, you choose the file that you want
92007225e5Sgerardnico             *     * then with CSS_CACHE_USE, you can change the cache key name
93007225e5Sgerardnico             */
94007225e5Sgerardnico            $controller->register_hook('CSS_STYLES_INCLUDED', 'BEFORE', $this, 'handle_front_css_styles');
95007225e5Sgerardnico            $controller->register_hook('CSS_CACHE_USE', 'BEFORE', $this, 'handle_css_cache');
96007225e5Sgerardnico        }
97007225e5Sgerardnico
98007225e5Sgerardnico        /**
99007225e5Sgerardnico         * Add a property to the URL to create two CSS file:
100007225e5Sgerardnico         *   * one public
101007225e5Sgerardnico         *   * one private (logged in)
102007225e5Sgerardnico         */
103007225e5Sgerardnico        if (PluginUtility::getRequestScript() == "doku.php") {
104007225e5Sgerardnico            $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_css_metaheader');
105007225e5Sgerardnico        }
106007225e5Sgerardnico
107007225e5Sgerardnico    }
108007225e5Sgerardnico
109007225e5Sgerardnico    /**
110007225e5Sgerardnico     * @param Doku_Event $event
111007225e5Sgerardnico     * @param $param
112007225e5Sgerardnico     *
113007225e5Sgerardnico     * Add query parameter to the CSS header call. ie
114007225e5Sgerardnico     * <link rel="preload" href="/lib/exe/css.php?t=template&tseed=8e31090353c8fcf80aa6ff0ea9bf3746" as="style">
115007225e5Sgerardnico     * to indicate if the page that calls the css is from a user that is logged in or not:
116007225e5Sgerardnico     *   * public vs private
117007225e5Sgerardnico     *   * ie frontend vs backend
118007225e5Sgerardnico     */
119007225e5Sgerardnico    public function handle_css_metaheader(Doku_Event &$event, $param)
120007225e5Sgerardnico    {
121007225e5Sgerardnico        $disableDokuwikiStylesheet = $this->getConf(self::CONF_DISABLE_DOKUWIKI_STYLESHEET, false);
122007225e5Sgerardnico        $enableMinimalFrontEnd = $this->getConf(self::CONF_ENABLE_MINIMAL_FRONTEND_STYLESHEET, false);
123007225e5Sgerardnico
124007225e5Sgerardnico        if (empty($_SERVER['REMOTE_USER']) && ($disableDokuwikiStylesheet || $enableMinimalFrontEnd)) {
125007225e5Sgerardnico            $links = &$event->data['link'];
126007225e5Sgerardnico            foreach ($links as $key => &$link) {
127007225e5Sgerardnico                $pos = strpos($link['href'], 'css.php');
128007225e5Sgerardnico                if ($pos !== false) {
129007225e5Sgerardnico
130007225e5Sgerardnico                    if ($disableDokuwikiStylesheet) {
131007225e5Sgerardnico                        unset($links[$key]);
132007225e5Sgerardnico                        return;
133007225e5Sgerardnico                    }
134007225e5Sgerardnico
135007225e5Sgerardnico                    if ($enableMinimalFrontEnd) {
136007225e5Sgerardnico                        $link['href'] .= '&' . self::WHICH_END_KEY . '=' . self::VALUE_FRONT . '';
137007225e5Sgerardnico                        return;
138007225e5Sgerardnico                    }
139007225e5Sgerardnico
140007225e5Sgerardnico                }
141007225e5Sgerardnico            }
142007225e5Sgerardnico        }
143007225e5Sgerardnico
144007225e5Sgerardnico    }
145007225e5Sgerardnico
146007225e5Sgerardnico    /**
147007225e5Sgerardnico     *
148007225e5Sgerardnico     * @param Doku_Event $event event object by reference
149007225e5Sgerardnico     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
150007225e5Sgerardnico     *                           handler was registered]
151007225e5Sgerardnico     * @return void
152007225e5Sgerardnico     *
153007225e5Sgerardnico     * Change the key of the cache.
154007225e5Sgerardnico     *
155007225e5Sgerardnico     * The default key can be seen in the {@link css_out()} function
156007225e5Sgerardnico     * when a new cache is created (ie new cache(key,ext)
157007225e5Sgerardnico     *
158007225e5Sgerardnico     * This is only called when this is a front call, see {@link register()}
159007225e5Sgerardnico     *
160007225e5Sgerardnico     * @see <a href="https://github.com/i-net-software/dokuwiki-plugin-lightweightcss/blob/master/action.php#L122">Credits</a>
161007225e5Sgerardnico     */
162007225e5Sgerardnico    public function handle_css_cache(Doku_Event &$event, $param)
163007225e5Sgerardnico    {
164007225e5Sgerardnico
165007225e5Sgerardnico        $enableMinimalFrontEnd = $this->getConf(self::CONF_ENABLE_MINIMAL_FRONTEND_STYLESHEET, false);
166007225e5Sgerardnico        if ($enableMinimalFrontEnd) {
167007225e5Sgerardnico            $propertyValue = PluginUtility::getPropertyValue(self::WHICH_END_KEY);
168007225e5Sgerardnico            if ($propertyValue == self::VALUE_FRONT) {
169007225e5Sgerardnico                $event->data->key .= self::VALUE_FRONT;
170007225e5Sgerardnico                $event->data->cache = getCacheName($event->data->key, $event->data->ext);
171007225e5Sgerardnico            }
172007225e5Sgerardnico        }
173007225e5Sgerardnico
174007225e5Sgerardnico    }
175007225e5Sgerardnico
176007225e5Sgerardnico    /**
177007225e5Sgerardnico     * Handle the front CSS script list. The script would be fit to do even more stuff / types
178007225e5Sgerardnico     * but handles only admin and default currently.
179007225e5Sgerardnico     *
180007225e5Sgerardnico     * @param Doku_Event $event event object by reference
181007225e5Sgerardnico     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
182007225e5Sgerardnico     *                           handler was registered]
183007225e5Sgerardnico     * @return void
184007225e5Sgerardnico     */
185007225e5Sgerardnico    public function handle_front_css_styles(Doku_Event &$event, $param)
186007225e5Sgerardnico    {
187007225e5Sgerardnico        /**
188007225e5Sgerardnico         * Trick to be able to test
189007225e5Sgerardnico         * The {@link register()} function is called only once when a test
190007225e5Sgerardnico         * is started
191007225e5Sgerardnico         * we change the value to see if the payload is less big
192007225e5Sgerardnico         */
193007225e5Sgerardnico        $propertyValue = PluginUtility::getPropertyValue(self::WHICH_END_KEY);
194007225e5Sgerardnico        if ($propertyValue == self::VALUE_BACK) {
195007225e5Sgerardnico            return;
196007225e5Sgerardnico        }
197007225e5Sgerardnico
198007225e5Sgerardnico
199007225e5Sgerardnico        /**
200007225e5Sgerardnico         * There is one call by:
201007225e5Sgerardnico         *   * mediatype (ie scree, all, print, speech)
202007225e5Sgerardnico         *   * and one call for the dokuwiki default
203007225e5Sgerardnico         */
204007225e5Sgerardnico        switch ($event->data['mediatype']) {
205007225e5Sgerardnico
206007225e5Sgerardnico            case 'print':
207007225e5Sgerardnico            case 'screen':
208007225e5Sgerardnico            case 'all':
209007225e5Sgerardnico                $filteredDataFiles = array();
210007225e5Sgerardnico                $files = $event->data['files'];
211007225e5Sgerardnico                foreach ($files as $file => $fileDirectory) {
212007225e5Sgerardnico                    // lib styles
213007225e5Sgerardnico                    if (strpos($fileDirectory, 'lib/styles')) {
214007225e5Sgerardnico                        // Geshi (syntax highlighting) and basic style of doku, we keep.
215007225e5Sgerardnico                        $filteredDataFiles[$file] = $fileDirectory;
216007225e5Sgerardnico                        continue;
217007225e5Sgerardnico                    }
218007225e5Sgerardnico                    // No Css from lib scripts
219007225e5Sgerardnico                    // Jquery is here
220007225e5Sgerardnico                    if (strpos($fileDirectory, 'lib/scripts')) {
221007225e5Sgerardnico                        continue;
222007225e5Sgerardnico                    }
223007225e5Sgerardnico                    // Excluded
224007225e5Sgerardnico                    $isExcluded = false;
225007225e5Sgerardnico                    foreach (self::EXCLUDED_PLUGINS as $plugin) {
226007225e5Sgerardnico                        if (strpos($file, 'lib/plugins/' . $plugin)) {
227007225e5Sgerardnico                            $isExcluded = true;
228007225e5Sgerardnico                            break;
229007225e5Sgerardnico                        }
230007225e5Sgerardnico                    }
231007225e5Sgerardnico                    if (!$isExcluded) {
232007225e5Sgerardnico                        $filteredDataFiles[$file] = $fileDirectory;
233007225e5Sgerardnico                    }
234007225e5Sgerardnico                }
235007225e5Sgerardnico
236007225e5Sgerardnico                $event->data['files'] = $filteredDataFiles;
237007225e5Sgerardnico
238007225e5Sgerardnico                break;
239007225e5Sgerardnico
240007225e5Sgerardnico            case 'speech':
241007225e5Sgerardnico                $event->preventDefault();
242007225e5Sgerardnico                break;
243007225e5Sgerardnico            case 'DW_DEFAULT':
244007225e5Sgerardnico                // Interwiki styles are here, we keep (in the lib/css.php file)
245007225e5Sgerardnico                break;
246007225e5Sgerardnico
247007225e5Sgerardnico        }
248007225e5Sgerardnico    }
249007225e5Sgerardnico
250007225e5Sgerardnico    /**
251007225e5Sgerardnico     * Handle all CSS script list.
252007225e5Sgerardnico     *
253007225e5Sgerardnico     * @param Doku_Event $event event object by reference
254007225e5Sgerardnico     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
255007225e5Sgerardnico     *                           handler was registered]
256007225e5Sgerardnico     * @return void
257007225e5Sgerardnico     */
258007225e5Sgerardnico    public function handle_css_styles(Doku_Event &$event, $param)
259007225e5Sgerardnico    {
260007225e5Sgerardnico
261007225e5Sgerardnico        /**
262007225e5Sgerardnico         * There is one call by:
263007225e5Sgerardnico         *   * mediatype (ie scree, all, print, speech)
264007225e5Sgerardnico         *   * and one call for the dokuwiki default
265007225e5Sgerardnico         */
266007225e5Sgerardnico        switch ($event->data['mediatype']) {
267007225e5Sgerardnico
268007225e5Sgerardnico            case 'print':
269007225e5Sgerardnico            case 'screen':
270007225e5Sgerardnico            case 'all':
271007225e5Sgerardnico                /**
272007225e5Sgerardnico                 * Get the file by reference
273007225e5Sgerardnico                 */
274007225e5Sgerardnico                $files = &$event->data['files'];
275007225e5Sgerardnico                /**
276007225e5Sgerardnico                 * Strap has a copy of
277007225e5Sgerardnico                 * the all.css without the group clear fix
278007225e5Sgerardnico                 */
279007225e5Sgerardnico                global $conf;
280007225e5Sgerardnico                if ($conf['template'] == PluginUtility::TEMPLATE_STRAP_NAME) {
281007225e5Sgerardnico                    foreach ($files as $file => $dir) {
282007225e5Sgerardnico                        if (strpos($file, 'lib/styles/all.css')) {
283007225e5Sgerardnico                            unset($files[$file]);
284007225e5Sgerardnico                        }
285007225e5Sgerardnico                    }
286007225e5Sgerardnico                }
287007225e5Sgerardnico                break;
288007225e5Sgerardnico        }
289007225e5Sgerardnico    }
290007225e5Sgerardnico}
291007225e5Sgerardnico
292007225e5Sgerardnico
293