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 12d24f6ec2SJames Collinsif(!function_exists('getallheaders')) { 13d24f6ec2SJames Collins function getallheaders() { 14d24f6ec2SJames Collins $headers = []; 15d24f6ec2SJames Collins foreach($_SERVER as $name => $value) { 16d24f6ec2SJames Collins if(substr($name, 0, 5) == 'HTTP_') { 17d24f6ec2SJames Collins $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 18d24f6ec2SJames Collins } 19d24f6ec2SJames Collins } 20d24f6ec2SJames Collins return $headers; 21d24f6ec2SJames Collins } 22d24f6ec2SJames Collins} 23d24f6ec2SJames Collins 24fd3ef33aSJames Collinsif(!function_exists('platformSlashes')) { 25fd3ef33aSJames Collins function platformSlashes($path) { 26fd3ef33aSJames Collins return str_replace('/', DIRECTORY_SEPARATOR, $path); 27fd3ef33aSJames Collins } 28fd3ef33aSJames Collins} 29fd3ef33aSJames Collins 30ab45ba71SJames Collinstry { 31fd3ef33aSJames Collins $lesscLib = platformSlashes('../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'); 3229118ed7SJames Collins if(!file_exists($lesscLib)) 33fd3ef33aSJames Collins $lesscLib = platformSlashes($_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php'); 34692c64c6SJames Collins if(!file_exists($lesscLib)) 35fd3ef33aSJames Collins $lesscLib = platformSlashes('../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'); 36692c64c6SJames Collins if(!file_exists($lesscLib)) 37fd3ef33aSJames Collins $lesscLib = platformSlashes($_SERVER['DOCUMENT_ROOT'] . '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'); 3829118ed7SJames Collins 39ab45ba71SJames Collins if(file_exists($lesscLib)) { 4079f12da2SJames Collins @require_once($lesscLib); 41ab45ba71SJames Collins 42ab45ba71SJames Collins if(isset($_GET['css'])) { 43fd3ef33aSJames Collins $baseDir = platformSlashes(dirname(__FILE__) . '/'); 44fd3ef33aSJames Collins $cssFile = platformSlashes(realpath($baseDir . $_GET['css'])); 45ab45ba71SJames Collins 46ab45ba71SJames Collins if(strpos($cssFile, $baseDir) === 0 && file_exists($cssFile)) { 47e876e764SJames Collins $rawVars = Array(); 48e876e764SJames Collins $file = 'style.ini'; 498ddabb4eSJames Collins if(file_exists($file)) { 508ddabb4eSJames Collins $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 518ddabb4eSJames Collins } 52ab45ba71SJames Collins 53fd3ef33aSJames Collins $file = platformSlashes('../../../conf/tpl/mikio/style.ini'); 548ddabb4eSJames Collins if(file_exists($file)) { 558ddabb4eSJames Collins $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 568ddabb4eSJames Collins } 57ab45ba71SJames Collins 58fd3ef33aSJames Collins $file = ($_SERVER['DOCUMENT_ROOT'] . '/conf/tpl/mikio/style.ini'); 598ddabb4eSJames Collins if(file_exists($file)) { 608ddabb4eSJames Collins $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 618ddabb4eSJames Collins } 62692c64c6SJames Collins 63ab45ba71SJames Collins $css = file_get_contents($cssFile); 64ab45ba71SJames Collins 65e876e764SJames Collins header('Content-Type: text/css; charset=utf-8'); 66e876e764SJames Collins 67ab45ba71SJames Collins $less = new lessc(); 68ab45ba71SJames Collins $less->setPreserveComments(false); 69a8eebd82SJames Collins 70a8eebd82SJames Collins $vars = Array(); 71a8eebd82SJames Collins if(isset($rawVars['replacements'])) { 72a8eebd82SJames Collins foreach($rawVars['replacements'] as $key=>$val) { 73a8eebd82SJames Collins if(substr($key, 0, 2) == '__' && substr($key, -2) == '__') { 74a8eebd82SJames Collins $vars['ini_' . substr($key, 2, -2)] = $val; 75a8eebd82SJames Collins } 76a8eebd82SJames Collins } 77a8eebd82SJames Collins } 78a8eebd82SJames Collins 79a8eebd82SJames Collins if(count($vars) > 0) { 80a8eebd82SJames Collins $less->setVariables($vars); 81a8eebd82SJames Collins } 82a8eebd82SJames Collins 83ab45ba71SJames Collins $css = $less->compile($css); 84ab45ba71SJames Collins echo $css; 85ab45ba71SJames Collins } else { 86ab45ba71SJames Collins header('HTTP/1.1 404 Not Found'); 87ab45ba71SJames Collins echo "The requested file could not be found"; 88ab45ba71SJames Collins } 89ab45ba71SJames Collins } else { 90ab45ba71SJames Collins header('HTTP/1.1 404 Not Found'); 91ab45ba71SJames Collins echo "The requested file could not be found"; 92ab45ba71SJames Collins } 93ab45ba71SJames Collins } else { 94692c64c6SJames Collins throw new Exception('Mikio could not find the LESSC engine in DokuWiki'); 95ab45ba71SJames Collins } 96ab45ba71SJames Collins} 97ab45ba71SJames Collinscatch(Exception $e) { 98692c64c6SJames Collins header('Content-Type: text/css; charset=utf-8'); 99*ce274c1aSJames Collins $cssFile = file_get_contents(dirname(__FILE__) . '/assets/mikio.css'); 100*ce274c1aSJames Collins $exceptionComment = "\n\n/** An exception occurred in the Mikio Less engine:\n\n " . $e->getMessage() . "\n\n*/"; 101*ce274c1aSJames Collins 102*ce274c1aSJames Collins // Find the position of the first comment in the CSS file 103*ce274c1aSJames Collins $pos = strpos($cssFile, '*/'); 104*ce274c1aSJames Collins 105*ce274c1aSJames Collins // Insert the exception comment after the first comment 106*ce274c1aSJames Collins $modifiedCSSFile = substr_replace($cssFile, $exceptionComment, $pos + 2, 0); 107*ce274c1aSJames Collins 108*ce274c1aSJames Collins echo $modifiedCSSFile; 109a8eebd82SJames Collins} 1108ddabb4eSJames Collins 1118ddabb4eSJames Collinsfunction arrayDeepMerge($arr1, $arr2) { 1128ddabb4eSJames Collins foreach ($arr2 as $key => $value){ 1138ddabb4eSJames Collins if(array_key_exists($key, $arr1)) { 1148ddabb4eSJames Collins $arr1[$key] = array_merge($arr1[$key], $value); 1158ddabb4eSJames Collins } else { 1168ddabb4eSJames Collins $arr1[$key] = $value; 1178ddabb4eSJames Collins } 1188ddabb4eSJames Collins } 1198ddabb4eSJames Collins return $arr1; 1208ddabb4eSJames Collins}