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