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