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