xref: /template/mikio/css.php (revision ce274c1ab223c7c7c37cbdc7a6cd108d6ec6e002)
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}