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 10692c64c6SJames Collinsrequire(dirname(__FILE__) . '/inc/polyfill-ctype.php'); 11692c64c6SJames Collins 12*7a37170aSJames Collinsif(!class_exists('lessc')) { 13*7a37170aSJames Collins require(dirname(__FILE__) . '/inc/marcusschwarz/lesserphp/lessc.inc.php'); 14*7a37170aSJames Collins} 15*7a37170aSJames Collins 16d24f6ec2SJames Collinsif(!function_exists('getallheaders')) { 17d24f6ec2SJames Collins function getallheaders() { 18d24f6ec2SJames Collins $headers = []; 19d24f6ec2SJames Collins foreach($_SERVER as $name => $value) { 20d24f6ec2SJames Collins if(substr($name, 0, 5) == 'HTTP_') { 21d24f6ec2SJames Collins $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 22d24f6ec2SJames Collins } 23d24f6ec2SJames Collins } 24d24f6ec2SJames Collins return $headers; 25d24f6ec2SJames Collins } 26d24f6ec2SJames Collins} 27d24f6ec2SJames Collins 28fd3ef33aSJames Collinsif(!function_exists('platformSlashes')) { 29fd3ef33aSJames Collins function platformSlashes($path) { 30fd3ef33aSJames Collins return str_replace('/', DIRECTORY_SEPARATOR, $path); 31fd3ef33aSJames Collins } 32fd3ef33aSJames Collins} 33fd3ef33aSJames Collins 34ab45ba71SJames Collinstry { 35ab45ba71SJames Collins if(isset($_GET['css'])) { 36fd3ef33aSJames Collins $baseDir = platformSlashes(dirname(__FILE__) . '/'); 37fd3ef33aSJames Collins $cssFile = platformSlashes(realpath($baseDir . $_GET['css'])); 38ab45ba71SJames Collins 39ab45ba71SJames Collins if(strpos($cssFile, $baseDir) === 0 && file_exists($cssFile)) { 40e876e764SJames Collins $rawVars = Array(); 41e876e764SJames Collins $file = 'style.ini'; 428ddabb4eSJames Collins if(file_exists($file)) { 438ddabb4eSJames Collins $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 448ddabb4eSJames Collins } 45ab45ba71SJames Collins 46fd3ef33aSJames Collins $file = platformSlashes('../../../conf/tpl/mikio/style.ini'); 478ddabb4eSJames Collins if(file_exists($file)) { 488ddabb4eSJames Collins $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 498ddabb4eSJames Collins } 50ab45ba71SJames Collins 51fd3ef33aSJames Collins $file = ($_SERVER['DOCUMENT_ROOT'] . '/conf/tpl/mikio/style.ini'); 528ddabb4eSJames Collins if(file_exists($file)) { 538ddabb4eSJames Collins $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 548ddabb4eSJames Collins } 55692c64c6SJames Collins 56ab45ba71SJames Collins $css = file_get_contents($cssFile); 57ab45ba71SJames Collins 58e876e764SJames Collins header('Content-Type: text/css; charset=utf-8'); 59e876e764SJames Collins 60ab45ba71SJames Collins $less = new lessc(); 61ab45ba71SJames Collins $less->setPreserveComments(false); 62a8eebd82SJames Collins 63a8eebd82SJames Collins $vars = Array(); 64a8eebd82SJames Collins if(isset($rawVars['replacements'])) { 65a8eebd82SJames Collins foreach($rawVars['replacements'] as $key=>$val) { 66a8eebd82SJames Collins if(substr($key, 0, 2) == '__' && substr($key, -2) == '__') { 67a8eebd82SJames Collins $vars['ini_' . substr($key, 2, -2)] = $val; 68a8eebd82SJames Collins } 69a8eebd82SJames Collins } 70a8eebd82SJames Collins } 71a8eebd82SJames Collins 72a8eebd82SJames Collins if(count($vars) > 0) { 73a8eebd82SJames Collins $less->setVariables($vars); 74a8eebd82SJames Collins } 75a8eebd82SJames Collins 76ab45ba71SJames Collins $css = $less->compile($css); 77ab45ba71SJames Collins echo $css; 78ab45ba71SJames Collins } else { 79ab45ba71SJames Collins header('HTTP/1.1 404 Not Found'); 80ab45ba71SJames Collins echo "The requested file could not be found"; 81ab45ba71SJames Collins } 82ab45ba71SJames Collins } else { 83ab45ba71SJames Collins header('HTTP/1.1 404 Not Found'); 84ab45ba71SJames Collins echo "The requested file could not be found"; 85ab45ba71SJames Collins } 86ab45ba71SJames Collins} 87ab45ba71SJames Collinscatch(Exception $e) { 88692c64c6SJames Collins header('Content-Type: text/css; charset=utf-8'); 89ce274c1aSJames Collins $cssFile = file_get_contents(dirname(__FILE__) . '/assets/mikio.css'); 90ce274c1aSJames Collins $exceptionComment = "\n\n/** An exception occurred in the Mikio Less engine:\n\n " . $e->getMessage() . "\n\n*/"; 91ce274c1aSJames Collins 92ce274c1aSJames Collins // Find the position of the first comment in the CSS file 93ce274c1aSJames Collins $pos = strpos($cssFile, '*/'); 94ce274c1aSJames Collins 95ce274c1aSJames Collins // Insert the exception comment after the first comment 96ce274c1aSJames Collins $modifiedCSSFile = substr_replace($cssFile, $exceptionComment, $pos + 2, 0); 97ce274c1aSJames Collins 98ce274c1aSJames Collins echo $modifiedCSSFile; 99a8eebd82SJames Collins} 1008ddabb4eSJames Collins 1018ddabb4eSJames Collinsfunction arrayDeepMerge($arr1, $arr2) { 1028ddabb4eSJames Collins foreach ($arr2 as $key => $value){ 1038ddabb4eSJames Collins if(array_key_exists($key, $arr1)) { 1048ddabb4eSJames Collins $arr1[$key] = array_merge($arr1[$key], $value); 1058ddabb4eSJames Collins } else { 1068ddabb4eSJames Collins $arr1[$key] = $value; 1078ddabb4eSJames Collins } 1088ddabb4eSJames Collins } 1098ddabb4eSJames Collins return $arr1; 1108ddabb4eSJames Collins}