xref: /template/mikio/css.php (revision c617ba512081e0e8da8afd4720906c671b2e8c77)
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    // echo $e;
99    header('Content-Type: text/css; charset=utf-8');
100    include(dirname(__FILE__) . '/assets/mikio.css');
101}
102
103function arrayDeepMerge($arr1, $arr2) {
104    foreach ($arr2 as $key => $value){
105        if(array_key_exists($key, $arr1)) {
106            $arr1[$key] = array_merge($arr1[$key], $value);
107        } else {
108            $arr1[$key] = $value;
109        }
110    }
111    return $arr1;
112}