diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php index e90e4fc23fcde20f8063154520947de2ee0f9a9d..5e185e9c21149fa2bbd30a94369b6008a870be51 100644 --- a/conf/dokuwiki.php +++ b/conf/dokuwiki.php @@ -108,6 +108,7 @@ $conf['subscribers'] = 0; //enable change notice subscription sup $conf['subscribe_time'] = 24*60*60; //Time after which digests / lists are sent (in sec, default 1 day) //Should be smaller than the time specified in recent_days $conf['compress'] = 1; //Strip whitespaces and comments from Styles and JavaScript? 1|0 +$conf['cssdatauri'] = 0; //Maximum byte size of small images to embed into CSS, won't work on IE<8 $conf['hidepages'] = ''; //Regexp for pages to be skipped from RSS, Search and Recent Changes $conf['send404'] = 0; //Send a HTTP 404 status for non existing pages? $conf['sitemap'] = 0; //Create a google sitemap? How often? In days. diff --git a/lib/exe/css.php b/lib/exe/css.php index 03fe6ad907481fe9d2176eaa5cc22f9f22702ab7..8f86f2433d463f4b5e9b484b7a6a14cd4d6042ea 100644 --- a/lib/exe/css.php +++ b/lib/exe/css.php @@ -123,6 +123,12 @@ function css_out(){ $css = css_compress($css); } + // embed small images right into the stylesheet + if($conf['cssdatauri']){ + $base = preg_quote(DOKU_BASE,'#'); + $css = preg_replace_callback('#(url\([ \'"]*)('.$base.')(.*?(?:\.(png|gif)))#i','css_datauri',$css); + } + http_cached_finish($cache->cache, $css); } @@ -221,11 +227,38 @@ function css_loadfile($file,$location=''){ $css = io_readFile($file); if(!$location) return $css; - $css = preg_replace('#(url\([ \'"]*)(?!/|http://|https://| |\'|")#','\\1'.$location,$css); - $css = preg_replace('#(@import\s+[\'"])(?!/|http://|https://)#', '\\1'.$location, $css); + $css = preg_replace('#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#','\\1'.$location,$css); + $css = preg_replace('#(@import\s+[\'"])(?!/|data:|http://|https://)#', '\\1'.$location, $css); + return $css; } +/** + * Converte local image URLs to data URLs if the filesize is small + * + * Callback for preg_replace_callback + */ +function css_datauri($match){ + global $conf; + + $pre = unslash($match[1]); + $base = unslash($match[2]); + $url = unslash($match[3]); + $ext = unslash($match[4]); + + $local = DOKU_INC.$url; + $size = @filesize($local); + if($size && $size < $conf['cssdatauri']){ + $data = base64_encode(file_get_contents($local)); + } + if($data){ + $url = 'data:image/'.$ext.';base64,'.$data; + }else{ + $url = $base.$url; + } + return $pre.$url; +} + /** * Returns a list of possible Plugin Styles (no existance check here) diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php index 9b7c643bfbf9b1370652e2abb0d829b6a3175769..e5dd4707a5fe2e1e85b73985772110ca7575dc2c 100644 --- a/lib/plugins/config/lang/en/lang.php +++ b/lib/plugins/config/lang/en/lang.php @@ -133,6 +133,7 @@ $lang['jpg_quality'] = 'JPG compression quality (0-100)'; $lang['subscribers'] = 'Enable page subscription support'; $lang['subscribe_time'] = 'Time after which subscription lists and digests are sent (sec); This should be smaller than the time specified in recent_days.'; $lang['compress'] = 'Compact CSS and javascript output'; +$lang['cssdatauri'] = 'Size in bytes up to which images referenced in CSS files should be embedded right into the stylesheet to reduce HTTP request header overhead. This technique won\'t work in IE < 8! <code>400</code> to <code>600</code> bytes is a good value. Set <code>0</code> to disable.'; $lang['hidepages'] = 'Hide matching pages (regular expressions)'; $lang['send404'] = 'Send "HTTP 404/Page Not Found" for non existing pages'; $lang['sitemap'] = 'Generate Google sitemap (days)'; diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php index af7e63a6180a7d3ee1f6f3be4941a3d2099c9acf..abea1be1cd594d4e177d91d501b91a2835aa15c8 100644 --- a/lib/plugins/config/settings/config.metadata.php +++ b/lib/plugins/config/settings/config.metadata.php @@ -179,6 +179,7 @@ $meta['autoplural'] = array('onoff'); $meta['mailfrom'] = array('richemail'); $meta['mailprefix'] = array('string'); $meta['compress'] = array('onoff'); +$meta['cssdatauri'] = array('numeric','_pattern' => '/^\d+$/'); $meta['gzip_output'] = array('onoff'); $meta['hidepages'] = array('string'); $meta['send404'] = array('onoff');