xref: /plugin/combo/action/css.php (revision 007225e5fb2d3f64edaccd3bd447ca26effb9d68)
1*007225e5Sgerardnico<?php
2*007225e5Sgerardnico
3*007225e5Sgerardnico
4*007225e5Sgerardnicouse ComboStrap\PluginUtility;
5*007225e5Sgerardnico
6*007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
7*007225e5Sgerardnico
8*007225e5Sgerardnico/**
9*007225e5Sgerardnico * Class action_plugin_combo_css
10*007225e5Sgerardnico * Delete Backend CSS for front-end
11*007225e5Sgerardnico *
12*007225e5Sgerardnico * Bug:
13*007225e5Sgerardnico *   * https://datacadamia.comlighthouse - no interwiki
14*007225e5Sgerardnico *
15*007225e5Sgerardnico * A call to /lib/exe/css.php?t=template&tseed=time()
16*007225e5Sgerardnico *
17*007225e5Sgerardnico *    * t is the template
18*007225e5Sgerardnico *
19*007225e5Sgerardnico *    * tseed is md5 of modified time of the below config file set at {@link tpl_metaheaders()}
20*007225e5Sgerardnico *
21*007225e5Sgerardnico *        * conf/dokuwiki.php
22*007225e5Sgerardnico *        * conf/local.php
23*007225e5Sgerardnico *        * conf/local.protected.php
24*007225e5Sgerardnico *        * conf/tpl/strap/style.ini
25*007225e5Sgerardnico *
26*007225e5Sgerardnico */
27*007225e5Sgerardnicoclass action_plugin_combo_css extends DokuWiki_Action_Plugin
28*007225e5Sgerardnico{
29*007225e5Sgerardnico
30*007225e5Sgerardnico    /**
31*007225e5Sgerardnico     * Conf
32*007225e5Sgerardnico     */
33*007225e5Sgerardnico    const CONF_ENABLE_MINIMAL_FRONTEND_STYLESHEET = 'enableMinimalFrontEndStylesheet';
34*007225e5Sgerardnico    const CONF_DISABLE_DOKUWIKI_STYLESHEET = 'disableDokuwikiStylesheet';
35*007225e5Sgerardnico
36*007225e5Sgerardnico    /**
37*007225e5Sgerardnico     * Front end or backend
38*007225e5Sgerardnico     */
39*007225e5Sgerardnico    const WHICH_END_KEY = 'end';
40*007225e5Sgerardnico    const VALUE_FRONT = 'front';
41*007225e5Sgerardnico    const VALUE_BACK = 'back';
42*007225e5Sgerardnico
43*007225e5Sgerardnico    /**
44*007225e5Sgerardnico     * List of excluded plugin
45*007225e5Sgerardnico     */
46*007225e5Sgerardnico    const EXCLUDED_PLUGINS = array(
47*007225e5Sgerardnico        "acl",
48*007225e5Sgerardnico        "authplain",
49*007225e5Sgerardnico        "changes",
50*007225e5Sgerardnico        "config",
51*007225e5Sgerardnico        "extension",
52*007225e5Sgerardnico        "info",
53*007225e5Sgerardnico        "move",
54*007225e5Sgerardnico        "popularity",
55*007225e5Sgerardnico        "revert",
56*007225e5Sgerardnico        "safefnrecode",
57*007225e5Sgerardnico        "searchindex",
58*007225e5Sgerardnico        "sqlite",
59*007225e5Sgerardnico        "upgrade",
60*007225e5Sgerardnico        "usermanager"
61*007225e5Sgerardnico    );
62*007225e5Sgerardnico
63*007225e5Sgerardnico    /**
64*007225e5Sgerardnico     * Registers a callback function for a given event
65*007225e5Sgerardnico     *
66*007225e5Sgerardnico     * @param Doku_Event_Handler $controller DokuWiki's event controller object
67*007225e5Sgerardnico     * @return void
68*007225e5Sgerardnico     *
69*007225e5Sgerardnico     * To fire this event
70*007225e5Sgerardnico     *   * Ctrl+Shift+R to disable browser cache
71*007225e5Sgerardnico     *
72*007225e5Sgerardnico     */
73*007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
74*007225e5Sgerardnico    {
75*007225e5Sgerardnico
76*007225e5Sgerardnico
77*007225e5Sgerardnico        /**
78*007225e5Sgerardnico         * Delete the all.css file due to `group` class
79*007225e5Sgerardnico         */
80*007225e5Sgerardnico        $controller->register_hook('CSS_STYLES_INCLUDED', 'BEFORE', $this, 'handle_css_styles');
81*007225e5Sgerardnico
82*007225e5Sgerardnico        /**
83*007225e5Sgerardnico         * For front-end/public only
84*007225e5Sgerardnico         */
85*007225e5Sgerardnico        $urlPropertyValue = PluginUtility::getPropertyValue(self::WHICH_END_KEY, self::VALUE_BACK);
86*007225e5Sgerardnico        if (PluginUtility::getRequestScript() == "css.php" && $urlPropertyValue == self::VALUE_FRONT) {
87*007225e5Sgerardnico            /**
88*007225e5Sgerardnico             * The process follows the following steps:
89*007225e5Sgerardnico             *     * With CSS_STYLES_INCLUDED, you choose the file that you want
90*007225e5Sgerardnico             *     * then with CSS_CACHE_USE, you can change the cache key name
91*007225e5Sgerardnico             */
92*007225e5Sgerardnico            $controller->register_hook('CSS_STYLES_INCLUDED', 'BEFORE', $this, 'handle_front_css_styles');
93*007225e5Sgerardnico            $controller->register_hook('CSS_CACHE_USE', 'BEFORE', $this, 'handle_css_cache');
94*007225e5Sgerardnico        }
95*007225e5Sgerardnico
96*007225e5Sgerardnico        /**
97*007225e5Sgerardnico         * Add a property to the URL to create two CSS file:
98*007225e5Sgerardnico         *   * one public
99*007225e5Sgerardnico         *   * one private (logged in)
100*007225e5Sgerardnico         */
101*007225e5Sgerardnico        if (PluginUtility::getRequestScript() == "doku.php") {
102*007225e5Sgerardnico            $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_css_metaheader');
103*007225e5Sgerardnico        }
104*007225e5Sgerardnico
105*007225e5Sgerardnico    }
106*007225e5Sgerardnico
107*007225e5Sgerardnico    /**
108*007225e5Sgerardnico     * @param Doku_Event $event
109*007225e5Sgerardnico     * @param $param
110*007225e5Sgerardnico     *
111*007225e5Sgerardnico     * Add query parameter to the CSS header call. ie
112*007225e5Sgerardnico     * <link rel="preload" href="/lib/exe/css.php?t=template&tseed=8e31090353c8fcf80aa6ff0ea9bf3746" as="style">
113*007225e5Sgerardnico     * to indicate if the page that calls the css is from a user that is logged in or not:
114*007225e5Sgerardnico     *   * public vs private
115*007225e5Sgerardnico     *   * ie frontend vs backend
116*007225e5Sgerardnico     */
117*007225e5Sgerardnico    public function handle_css_metaheader(Doku_Event &$event, $param)
118*007225e5Sgerardnico    {
119*007225e5Sgerardnico        $disableDokuwikiStylesheet = $this->getConf(self::CONF_DISABLE_DOKUWIKI_STYLESHEET, false);
120*007225e5Sgerardnico        $enableMinimalFrontEnd = $this->getConf(self::CONF_ENABLE_MINIMAL_FRONTEND_STYLESHEET, false);
121*007225e5Sgerardnico
122*007225e5Sgerardnico        if (empty($_SERVER['REMOTE_USER']) && ($disableDokuwikiStylesheet || $enableMinimalFrontEnd)) {
123*007225e5Sgerardnico            $links = &$event->data['link'];
124*007225e5Sgerardnico            foreach ($links as $key => &$link) {
125*007225e5Sgerardnico                $pos = strpos($link['href'], 'css.php');
126*007225e5Sgerardnico                if ($pos !== false) {
127*007225e5Sgerardnico
128*007225e5Sgerardnico                    if ($disableDokuwikiStylesheet) {
129*007225e5Sgerardnico                        unset($links[$key]);
130*007225e5Sgerardnico                        return;
131*007225e5Sgerardnico                    }
132*007225e5Sgerardnico
133*007225e5Sgerardnico                    if ($enableMinimalFrontEnd) {
134*007225e5Sgerardnico                        $link['href'] .= '&' . self::WHICH_END_KEY . '=' . self::VALUE_FRONT . '';
135*007225e5Sgerardnico                        return;
136*007225e5Sgerardnico                    }
137*007225e5Sgerardnico
138*007225e5Sgerardnico                }
139*007225e5Sgerardnico            }
140*007225e5Sgerardnico        }
141*007225e5Sgerardnico
142*007225e5Sgerardnico    }
143*007225e5Sgerardnico
144*007225e5Sgerardnico    /**
145*007225e5Sgerardnico     *
146*007225e5Sgerardnico     * @param Doku_Event $event event object by reference
147*007225e5Sgerardnico     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
148*007225e5Sgerardnico     *                           handler was registered]
149*007225e5Sgerardnico     * @return void
150*007225e5Sgerardnico     *
151*007225e5Sgerardnico     * Change the key of the cache.
152*007225e5Sgerardnico     *
153*007225e5Sgerardnico     * The default key can be seen in the {@link css_out()} function
154*007225e5Sgerardnico     * when a new cache is created (ie new cache(key,ext)
155*007225e5Sgerardnico     *
156*007225e5Sgerardnico     * This is only called when this is a front call, see {@link register()}
157*007225e5Sgerardnico     *
158*007225e5Sgerardnico     * @see <a href="https://github.com/i-net-software/dokuwiki-plugin-lightweightcss/blob/master/action.php#L122">Credits</a>
159*007225e5Sgerardnico     */
160*007225e5Sgerardnico    public function handle_css_cache(Doku_Event &$event, $param)
161*007225e5Sgerardnico    {
162*007225e5Sgerardnico
163*007225e5Sgerardnico        $enableMinimalFrontEnd = $this->getConf(self::CONF_ENABLE_MINIMAL_FRONTEND_STYLESHEET, false);
164*007225e5Sgerardnico        if ($enableMinimalFrontEnd) {
165*007225e5Sgerardnico            $propertyValue = PluginUtility::getPropertyValue(self::WHICH_END_KEY);
166*007225e5Sgerardnico            if ($propertyValue == self::VALUE_FRONT) {
167*007225e5Sgerardnico                $event->data->key .= self::VALUE_FRONT;
168*007225e5Sgerardnico                $event->data->cache = getCacheName($event->data->key, $event->data->ext);
169*007225e5Sgerardnico            }
170*007225e5Sgerardnico        }
171*007225e5Sgerardnico
172*007225e5Sgerardnico    }
173*007225e5Sgerardnico
174*007225e5Sgerardnico    /**
175*007225e5Sgerardnico     * Handle the front CSS script list. The script would be fit to do even more stuff / types
176*007225e5Sgerardnico     * but handles only admin and default currently.
177*007225e5Sgerardnico     *
178*007225e5Sgerardnico     * @param Doku_Event $event event object by reference
179*007225e5Sgerardnico     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
180*007225e5Sgerardnico     *                           handler was registered]
181*007225e5Sgerardnico     * @return void
182*007225e5Sgerardnico     */
183*007225e5Sgerardnico    public function handle_front_css_styles(Doku_Event &$event, $param)
184*007225e5Sgerardnico    {
185*007225e5Sgerardnico        /**
186*007225e5Sgerardnico         * Trick to be able to test
187*007225e5Sgerardnico         * The {@link register()} function is called only once when a test
188*007225e5Sgerardnico         * is started
189*007225e5Sgerardnico         * we change the value to see if the payload is less big
190*007225e5Sgerardnico         */
191*007225e5Sgerardnico        $propertyValue = PluginUtility::getPropertyValue(self::WHICH_END_KEY);
192*007225e5Sgerardnico        if ($propertyValue == self::VALUE_BACK) {
193*007225e5Sgerardnico            return;
194*007225e5Sgerardnico        }
195*007225e5Sgerardnico
196*007225e5Sgerardnico
197*007225e5Sgerardnico        /**
198*007225e5Sgerardnico         * There is one call by:
199*007225e5Sgerardnico         *   * mediatype (ie scree, all, print, speech)
200*007225e5Sgerardnico         *   * and one call for the dokuwiki default
201*007225e5Sgerardnico         */
202*007225e5Sgerardnico        switch ($event->data['mediatype']) {
203*007225e5Sgerardnico
204*007225e5Sgerardnico            case 'print':
205*007225e5Sgerardnico            case 'screen':
206*007225e5Sgerardnico            case 'all':
207*007225e5Sgerardnico                $filteredDataFiles = array();
208*007225e5Sgerardnico                $files = $event->data['files'];
209*007225e5Sgerardnico                foreach ($files as $file => $fileDirectory) {
210*007225e5Sgerardnico                    // lib styles
211*007225e5Sgerardnico                    if (strpos($fileDirectory, 'lib/styles')) {
212*007225e5Sgerardnico                        // Geshi (syntax highlighting) and basic style of doku, we keep.
213*007225e5Sgerardnico                        $filteredDataFiles[$file] = $fileDirectory;
214*007225e5Sgerardnico                        continue;
215*007225e5Sgerardnico                    }
216*007225e5Sgerardnico                    // No Css from lib scripts
217*007225e5Sgerardnico                    // Jquery is here
218*007225e5Sgerardnico                    if (strpos($fileDirectory, 'lib/scripts')) {
219*007225e5Sgerardnico                        continue;
220*007225e5Sgerardnico                    }
221*007225e5Sgerardnico                    // Excluded
222*007225e5Sgerardnico                    $isExcluded = false;
223*007225e5Sgerardnico                    foreach (self::EXCLUDED_PLUGINS as $plugin) {
224*007225e5Sgerardnico                        if (strpos($file, 'lib/plugins/' . $plugin)) {
225*007225e5Sgerardnico                            $isExcluded = true;
226*007225e5Sgerardnico                            break;
227*007225e5Sgerardnico                        }
228*007225e5Sgerardnico                    }
229*007225e5Sgerardnico                    if (!$isExcluded) {
230*007225e5Sgerardnico                        $filteredDataFiles[$file] = $fileDirectory;
231*007225e5Sgerardnico                    }
232*007225e5Sgerardnico                }
233*007225e5Sgerardnico
234*007225e5Sgerardnico                $event->data['files'] = $filteredDataFiles;
235*007225e5Sgerardnico
236*007225e5Sgerardnico                break;
237*007225e5Sgerardnico
238*007225e5Sgerardnico            case 'speech':
239*007225e5Sgerardnico                $event->preventDefault();
240*007225e5Sgerardnico                break;
241*007225e5Sgerardnico            case 'DW_DEFAULT':
242*007225e5Sgerardnico                // Interwiki styles are here, we keep (in the lib/css.php file)
243*007225e5Sgerardnico                break;
244*007225e5Sgerardnico
245*007225e5Sgerardnico        }
246*007225e5Sgerardnico    }
247*007225e5Sgerardnico
248*007225e5Sgerardnico    /**
249*007225e5Sgerardnico     * Handle all CSS script list.
250*007225e5Sgerardnico     *
251*007225e5Sgerardnico     * @param Doku_Event $event event object by reference
252*007225e5Sgerardnico     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
253*007225e5Sgerardnico     *                           handler was registered]
254*007225e5Sgerardnico     * @return void
255*007225e5Sgerardnico     */
256*007225e5Sgerardnico    public function handle_css_styles(Doku_Event &$event, $param)
257*007225e5Sgerardnico    {
258*007225e5Sgerardnico
259*007225e5Sgerardnico        /**
260*007225e5Sgerardnico         * There is one call by:
261*007225e5Sgerardnico         *   * mediatype (ie scree, all, print, speech)
262*007225e5Sgerardnico         *   * and one call for the dokuwiki default
263*007225e5Sgerardnico         */
264*007225e5Sgerardnico        switch ($event->data['mediatype']) {
265*007225e5Sgerardnico
266*007225e5Sgerardnico            case 'print':
267*007225e5Sgerardnico            case 'screen':
268*007225e5Sgerardnico            case 'all':
269*007225e5Sgerardnico                /**
270*007225e5Sgerardnico                 * Get the file by reference
271*007225e5Sgerardnico                 */
272*007225e5Sgerardnico                $files = &$event->data['files'];
273*007225e5Sgerardnico                /**
274*007225e5Sgerardnico                 * Strap has a copy of
275*007225e5Sgerardnico                 * the all.css without the group clear fix
276*007225e5Sgerardnico                 */
277*007225e5Sgerardnico                global $conf;
278*007225e5Sgerardnico                if ($conf['template'] == PluginUtility::TEMPLATE_STRAP_NAME) {
279*007225e5Sgerardnico                    foreach ($files as $file => $dir) {
280*007225e5Sgerardnico                        if (strpos($file, 'lib/styles/all.css')) {
281*007225e5Sgerardnico                            unset($files[$file]);
282*007225e5Sgerardnico                        }
283*007225e5Sgerardnico                    }
284*007225e5Sgerardnico                }
285*007225e5Sgerardnico                break;
286*007225e5Sgerardnico        }
287*007225e5Sgerardnico    }
288*007225e5Sgerardnico}
289*007225e5Sgerardnico
290*007225e5Sgerardnico
291