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