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 */ 9 10require(dirname(__FILE__) . '/inc/polyfill-ctype.php'); 11 12if(!function_exists('getallheaders')) { 13 function getallheaders() { 14 $headers = []; 15 foreach($_SERVER as $name => $value) { 16 if(substr($name, 0, 5) == 'HTTP_') { 17 $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 18 } 19 } 20 return $headers; 21 } 22} 23 24if(!function_exists('platformSlashes')) { 25 function platformSlashes($path) { 26 return str_replace('/', DIRECTORY_SEPARATOR, $path); 27 } 28} 29 30try { 31 $lesscLib = platformSlashes('../../../vendor/marcusschwarz/lesserphp/lessc.inc.php'); 32 if(!file_exists($lesscLib)) 33 $lesscLib = platformSlashes($_SERVER['DOCUMENT_ROOT'] . '/vendor/marcusschwarz/lesserphp/lessc.inc.php'); 34 if(!file_exists($lesscLib)) 35 $lesscLib = platformSlashes('../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'); 36 if(!file_exists($lesscLib)) 37 $lesscLib = platformSlashes($_SERVER['DOCUMENT_ROOT'] . '/app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php'); 38 39 if(file_exists($lesscLib)) { 40 @require_once($lesscLib); 41 42 if(isset($_GET['css'])) { 43 $baseDir = platformSlashes(dirname(__FILE__) . '/'); 44 $cssFile = platformSlashes(realpath($baseDir . $_GET['css'])); 45 46 if(strpos($cssFile, $baseDir) === 0 && file_exists($cssFile)) { 47 $rawVars = Array(); 48 $file = 'style.ini'; 49 if(file_exists($file)) { 50 $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 51 } 52 53 $file = platformSlashes('../../../conf/tpl/mikio/style.ini'); 54 if(file_exists($file)) { 55 $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 56 } 57 58 $file = ($_SERVER['DOCUMENT_ROOT'] . '/conf/tpl/mikio/style.ini'); 59 if(file_exists($file)) { 60 $rawVars = arrayDeepMerge($rawVars, parse_ini_file($file, TRUE)); 61 } 62 63 $css = file_get_contents($cssFile); 64 65 header('Content-Type: text/css; charset=utf-8'); 66 67 $less = new lessc(); 68 $less->setPreserveComments(false); 69 70 $vars = Array(); 71 if(isset($rawVars['replacements'])) { 72 foreach($rawVars['replacements'] as $key=>$val) { 73 if(substr($key, 0, 2) == '__' && substr($key, -2) == '__') { 74 $vars['ini_' . substr($key, 2, -2)] = $val; 75 } 76 } 77 } 78 79 if(count($vars) > 0) { 80 $less->setVariables($vars); 81 } 82 83 $css = $less->compile($css); 84 echo $css; 85 } else { 86 header('HTTP/1.1 404 Not Found'); 87 echo "The requested file could not be found"; 88 } 89 } else { 90 header('HTTP/1.1 404 Not Found'); 91 echo "The requested file could not be found"; 92 } 93 } else { 94 throw new Exception('Mikio could not find the LESSC engine in DokuWiki'); 95 } 96} 97catch(Exception $e) { 98 header('Content-Type: text/css; charset=utf-8'); 99 $cssFile = file_get_contents(dirname(__FILE__) . '/assets/mikio.css'); 100 $exceptionComment = "\n\n/** An exception occurred in the Mikio Less engine:\n\n " . $e->getMessage() . "\n\n*/"; 101 102 // Find the position of the first comment in the CSS file 103 $pos = strpos($cssFile, '*/'); 104 105 // Insert the exception comment after the first comment 106 $modifiedCSSFile = substr_replace($cssFile, $exceptionComment, $pos + 2, 0); 107 108 echo $modifiedCSSFile; 109} 110 111function arrayDeepMerge($arr1, $arr2) { 112 foreach ($arr2 as $key => $value){ 113 if(array_key_exists($key, $arr1)) { 114 $arr1[$key] = array_merge($arr1[$key], $value); 115 } else { 116 $arr1[$key] = $value; 117 } 118 } 119 return $arr1; 120}