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 22*703d73e0SJames Collinsif(!function_exists('ctype_alnum')) { 23*703d73e0SJames Collins function ctype_alnum($var) { 24*703d73e0SJames Collins return preg_match('/^[a-zA-Z0-9]+$/', $var); 25*703d73e0SJames Collins } 26*703d73e0SJames Collins} 27*703d73e0SJames Collins 28*703d73e0SJames Collinsif(!function_exists('ctype_alpha')) { 29*703d73e0SJames Collins function ctype_alpha($var) { 30*703d73e0SJames Collins return preg_match('/^[a-zA-Z]+$/', $var); 31*703d73e0SJames Collins } 32*703d73e0SJames Collins} 33*703d73e0SJames Collins 34*703d73e0SJames Collinsif(!function_exists('ctype_cntrl')) { 35*703d73e0SJames Collins function ctype_cntrl($var) { 36*703d73e0SJames Collins return preg_match('/^[\x00-\x1F\x7F]+$/', $var); 37*703d73e0SJames Collins } 38*703d73e0SJames Collins} 39*703d73e0SJames Collins 40*703d73e0SJames Collinsif(!function_exists('ctype_digit')) { 41*703d73e0SJames Collins function ctype_digit($var) { 42*703d73e0SJames Collins return preg_match('/^[0-9]+$/', $var); 43*703d73e0SJames Collins } 44*703d73e0SJames Collins} 45*703d73e0SJames Collins 46*703d73e0SJames Collinsif(!function_exists('ctype_graph')) { 47*703d73e0SJames Collins function ctype_graph($var) { 48*703d73e0SJames Collins return preg_match('/^[\x20-\x7E\x80-\xFF]+$/', $var); 49*703d73e0SJames Collins } 50*703d73e0SJames Collins} 51*703d73e0SJames Collins 52*703d73e0SJames Collinsif(!function_exists('ctype_lower')) { 53*703d73e0SJames Collins function ctype_lower($var) { 54*703d73e0SJames Collins return preg_match('/^[a-z]+$/', $var); 55*703d73e0SJames Collins } 56*703d73e0SJames Collins} 57*703d73e0SJames Collins 58*703d73e0SJames Collinsif(!function_exists('ctype_print')) { 59*703d73e0SJames Collins function ctype_print($var) { 60*703d73e0SJames Collins return preg_match('/^[\x20-\x7E\x80-\xFF]+$/', $var); 61*703d73e0SJames Collins } 62*703d73e0SJames Collins} 63*703d73e0SJames Collins 64*703d73e0SJames Collinsif(!function_exists('ctype_punct')) { 65*703d73e0SJames Collins function ctype_punct($var) { 66*703d73e0SJames Collins return preg_match('/^[^\w\s]+$/', $var); 67*703d73e0SJames Collins } 68*703d73e0SJames Collins} 69*703d73e0SJames Collins 70*703d73e0SJames Collinsif(!function_exists('ctype_space')) { 71*703d73e0SJames Collins function ctype_space($var) { 72*703d73e0SJames Collins return preg_match('/^[\r\t\n]+$/', $var); 73*703d73e0SJames Collins } 74*703d73e0SJames Collins} 75*703d73e0SJames Collins 76*703d73e0SJames Collinsif(!function_exists('ctype_upper')) { 77*703d73e0SJames Collins function ctype_upper($var) { 78*703d73e0SJames Collins return preg_match('/^[A-Z]+$/', $var); 79*703d73e0SJames Collins } 80*703d73e0SJames Collins} 81*703d73e0SJames Collins 82*703d73e0SJames Collinsif(!function_exists('ctype_xdigit')) { 83*703d73e0SJames Collins function ctype_upper($var) { 84*703d73e0SJames Collins return preg_match('/^[0-9A-Fa-f]+$/', $var); 85*703d73e0SJames Collins } 86*703d73e0SJames Collins} 87d24f6ec2SJames Collins 88ab45ba71SJames Collinstry { 8979f12da2SJames Collins if(!function_exists('ctype_digit')) { 9029118ed7SJames Collins if(isset($_GET['css'])) { 9129118ed7SJames Collins $baseDir = dirname(__FILE__) . '/'; 9229118ed7SJames Collins $cssFile = realpath($baseDir . $_GET['css']); 9329118ed7SJames Collins if(strtolower(substr($cssFile, -5)) == '.less') { 9429118ed7SJames Collins $cssFile = substr($cssFile, 0, -5) . '.css'; 9529118ed7SJames Collins if(file_exists($cssFile)) { 9629118ed7SJames Collins echo file_get_contents($cssFile); 9729118ed7SJames Collins exit; 9829118ed7SJames Collins } 9929118ed7SJames Collins } 10029118ed7SJames Collins } 10129118ed7SJames Collins 10229118ed7SJames Collins throw new Exception('ctype extension not installed'); 10329118ed7SJames Collins } 10429118ed7SJames Collins 105ab45ba71SJames Collins $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'; 10629118ed7SJames Collins if(!file_exists($lesscLib)) 10729118ed7SJames Collins $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'; 10829118ed7SJames Collins 109ab45ba71SJames Collins if(file_exists($lesscLib)) { 11079f12da2SJames Collins @require_once($lesscLib); 111ab45ba71SJames Collins 112ab45ba71SJames Collins if(isset($_GET['css'])) { 113ab45ba71SJames Collins $baseDir = dirname(__FILE__) . '/'; 114ab45ba71SJames Collins $cssFile = realpath($baseDir . $_GET['css']); 115ab45ba71SJames Collins 116ab45ba71SJames Collins if(strpos($cssFile, $baseDir) === 0 && file_exists($cssFile)) { 117ab45ba71SJames Collins $lastModified = filemtime($cssFile); 118ab45ba71SJames Collins $eTagFile = md5_file($cssFile); 119ab45ba71SJames Collins $eTagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : FALSE); 120ab45ba71SJames Collins 121ab45ba71SJames Collins header('Content-Type: text/css; charset=utf-8'); 122ab45ba71SJames Collins header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); 123ab45ba71SJames Collins header('Etag: ' . $eTagFile); 124ab45ba71SJames Collins header('Cache-Control: public, max-age=604800, immutable'); 125ab45ba71SJames Collins 126ab45ba71SJames Collins if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified || $eTagHeader == $eTagFile) { 127ab45ba71SJames Collins header('HTTP/1.1 304 Not Modified'); 128ab45ba71SJames Collins exit; 129ab45ba71SJames Collins } 130ab45ba71SJames Collins 131ab45ba71SJames Collins $css = file_get_contents($cssFile); 132ab45ba71SJames Collins 133ab45ba71SJames Collins $less = new lessc(); 134ab45ba71SJames Collins $less->setPreserveComments(false); 135a8eebd82SJames Collins 136*703d73e0SJames Collins $rawVars = Array(); 137*703d73e0SJames Collins if(file_exists('style.ini')) $rawVars = array_merge($rawVars, parse_ini_file('style.ini', TRUE)); 138*703d73e0SJames Collins if(file_exists('../../../conf/tpl/mikio/style.ini')) $rawVars = array_merge($rawVars, parse_ini_file('../../../conf/tpl/mikio/style.ini', TRUE)); 139a8eebd82SJames Collins 140a8eebd82SJames Collins $vars = Array(); 141a8eebd82SJames Collins if(isset($rawVars['replacements'])) { 142a8eebd82SJames Collins foreach($rawVars['replacements'] as $key=>$val) { 143a8eebd82SJames Collins if(substr($key, 0, 2) == '__' && substr($key, -2) == '__') { 144a8eebd82SJames Collins $vars['ini_' . substr($key, 2, -2)] = $val; 145a8eebd82SJames Collins } 146a8eebd82SJames Collins } 147a8eebd82SJames Collins } 148a8eebd82SJames Collins 149a8eebd82SJames Collins if(count($vars) > 0) { 150a8eebd82SJames Collins $less->setVariables($vars); 151a8eebd82SJames Collins } 152a8eebd82SJames Collins 153ab45ba71SJames Collins $css = $less->compile($css); 154ab45ba71SJames Collins 155ab45ba71SJames Collins $accept_encoding = @getallheaders()['Accept-Encoding']; 156ab45ba71SJames Collins if($accept_encoding && preg_match('/ *gzip *,?/', $accept_encoding)) { 157ab45ba71SJames Collins header('Content-Encoding: gzip'); 158ab45ba71SJames Collins echo gzencode($css); 159ab45ba71SJames Collins } else { 160ab45ba71SJames Collins echo $css; 161ab45ba71SJames Collins } 162ab45ba71SJames Collins } else { 163ab45ba71SJames Collins header('HTTP/1.1 404 Not Found'); 164ab45ba71SJames Collins echo "The requested file could not be found"; 165ab45ba71SJames Collins } 166ab45ba71SJames Collins } else { 167ab45ba71SJames Collins header('HTTP/1.1 404 Not Found'); 168ab45ba71SJames Collins echo "The requested file could not be found"; 169ab45ba71SJames Collins } 170ab45ba71SJames Collins } else { 171ab45ba71SJames Collins throw new Exception('Lessc library not found'); 172ab45ba71SJames Collins } 173ab45ba71SJames Collins} 174ab45ba71SJames Collinscatch(Exception $e) { 1751bdbd903SJames Collins header('HTTP/1.1 500 Internal Server Error'); 176a8eebd82SJames Collins echo $e; 177a8eebd82SJames Collins} 178