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