1ab45ba71SJames Collins<?php 2ab45ba71SJames Collins/** 3a8eebd82SJames Collins * Mikio CSS/LESS Engine 4ab45ba71SJames Collins * 5ab45ba71SJames Collins * @link http://dokuwiki.org/template:mikio 6ab45ba71SJames Collins * @author James Collins <james.collins@outlook.com.au> 7ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html) 8ab45ba71SJames Collins */ 9*d24f6ec2SJames Collins 10*d24f6ec2SJames Collinsif(!function_exists('getallheaders')) { 11*d24f6ec2SJames Collins function getallheaders() { 12*d24f6ec2SJames Collins $headers = []; 13*d24f6ec2SJames Collins foreach($_SERVER as $name => $value) { 14*d24f6ec2SJames Collins if(substr($name, 0, 5) == 'HTTP_') { 15*d24f6ec2SJames Collins $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 16*d24f6ec2SJames Collins } 17*d24f6ec2SJames Collins } 18*d24f6ec2SJames Collins return $headers; 19*d24f6ec2SJames Collins } 20*d24f6ec2SJames Collins} 21*d24f6ec2SJames Collins 22*d24f6ec2SJames Collins 23ab45ba71SJames Collinstry { 24ab45ba71SJames Collins $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'; 25ab45ba71SJames Collins if(file_exists($lesscLib)) { 26ab45ba71SJames Collins require_once($lesscLib); 27ab45ba71SJames Collins 28ab45ba71SJames Collins if(isset($_GET['css'])) { 29ab45ba71SJames Collins $baseDir = dirname(__FILE__) . '/'; 30ab45ba71SJames Collins $cssFile = realpath($baseDir . $_GET['css']); 31ab45ba71SJames Collins 32ab45ba71SJames Collins if(strpos($cssFile, $baseDir) === 0 && file_exists($cssFile)) { 33ab45ba71SJames Collins $lastModified = filemtime($cssFile); 34ab45ba71SJames Collins $eTagFile = md5_file($cssFile); 35ab45ba71SJames Collins $eTagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : FALSE); 36ab45ba71SJames Collins 37ab45ba71SJames Collins header('Content-Type: text/css; charset=utf-8'); 38ab45ba71SJames Collins header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); 39ab45ba71SJames Collins header('Etag: ' . $eTagFile); 40ab45ba71SJames Collins header('Cache-Control: public, max-age=604800, immutable'); 41ab45ba71SJames Collins 42ab45ba71SJames Collins if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified || $eTagHeader == $eTagFile) { 43ab45ba71SJames Collins header('HTTP/1.1 304 Not Modified'); 44ab45ba71SJames Collins exit; 45ab45ba71SJames Collins } 46ab45ba71SJames Collins 47ab45ba71SJames Collins $css = file_get_contents($cssFile); 48ab45ba71SJames Collins 49ab45ba71SJames Collins $less = new lessc(); 50ab45ba71SJames Collins $less->setPreserveComments(false); 51a8eebd82SJames Collins 52a8eebd82SJames Collins if(file_exists('style.ini')) { 53a8eebd82SJames Collins $overrideStyle = '../../../conf/tpl/mikio/style.ini'; 54a8eebd82SJames Collins 55a8eebd82SJames Collins $vars = Array(); 56a8eebd82SJames Collins $rawVars = parse_ini_file('style.ini', TRUE); 57a8eebd82SJames Collins 58a8eebd82SJames Collins if(file_exists($overrideStyle)) { 59a8eebd82SJames Collins $userVars = parse_ini_file($overrideStyle, TRUE); 60a8eebd82SJames Collins $rawVars = associativeMerge($rawVars, $userVars); 61a8eebd82SJames Collins } 62a8eebd82SJames Collins 63a8eebd82SJames Collins if(isset($rawVars['replacements'])) { 64a8eebd82SJames Collins foreach($rawVars['replacements'] as $key=>$val) { 65a8eebd82SJames Collins if(substr($key, 0, 2) == '__' && substr($key, -2) == '__') { 66a8eebd82SJames Collins $vars['ini_' . substr($key, 2, -2)] = $val; 67a8eebd82SJames Collins } 68a8eebd82SJames Collins } 69a8eebd82SJames Collins } 70a8eebd82SJames Collins 71a8eebd82SJames Collins if(count($vars) > 0) { 72a8eebd82SJames Collins $less->setVariables($vars); 73a8eebd82SJames Collins } 74a8eebd82SJames Collins } 75a8eebd82SJames Collins 76ab45ba71SJames Collins $css = $less->compile($css); 77ab45ba71SJames Collins 78ab45ba71SJames Collins $accept_encoding = @getallheaders()['Accept-Encoding']; 79ab45ba71SJames Collins if($accept_encoding && preg_match('/ *gzip *,?/', $accept_encoding)) { 80ab45ba71SJames Collins header('Content-Encoding: gzip'); 81ab45ba71SJames Collins echo gzencode($css); 82ab45ba71SJames Collins } else { 83ab45ba71SJames Collins echo $css; 84ab45ba71SJames Collins } 85ab45ba71SJames Collins } else { 86ab45ba71SJames Collins header('HTTP/1.1 404 Not Found'); 87ab45ba71SJames Collins echo "The requested file could not be found"; 88ab45ba71SJames Collins } 89ab45ba71SJames Collins } else { 90ab45ba71SJames Collins header('HTTP/1.1 404 Not Found'); 91ab45ba71SJames Collins echo "The requested file could not be found"; 92ab45ba71SJames Collins } 93ab45ba71SJames Collins } else { 94ab45ba71SJames Collins throw new Exception('Lessc library not found'); 95ab45ba71SJames Collins } 96ab45ba71SJames Collins} 97ab45ba71SJames Collinscatch(Exception $e) { 98ab45ba71SJames Collins header('HTTP/1.500 Internal Server Error'); 99a8eebd82SJames Collins echo $e; 100a8eebd82SJames Collins} 101a8eebd82SJames Collins 102a8eebd82SJames Collinsfunction associativeMerge($base, $addition) 103a8eebd82SJames Collins{ 104a8eebd82SJames Collins $result = $base; 105a8eebd82SJames Collins 106a8eebd82SJames Collins // if(is_array($base) && is_array($addition)) { 107a8eebd82SJames Collins // foreach($addition as $key=>$value) { 108a8eebd82SJames Collins // if(is_array($value)) { 109a8eebd82SJames Collins // $result[$key] = associativeMerge($result[$key], $value); 110a8eebd82SJames Collins // } else { 111a8eebd82SJames Collins // $result[$key] = $value; 112a8eebd82SJames Collins // } 113a8eebd82SJames Collins // } 114a8eebd82SJames Collins // } 115a8eebd82SJames Collins 116a8eebd82SJames Collins return $result; 117ab45ba71SJames Collins} 118*d24f6ec2SJames Collins 119