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