xref: /template/mikio/css.php (revision a8eebd8223c9e7a29443b978b64e79b827875f04)
1ab45ba71SJames Collins<?php
2ab45ba71SJames Collins/**
3*a8eebd82SJames 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 */
9ab45ba71SJames Collinstry {
10ab45ba71SJames Collins    $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
11ab45ba71SJames Collins    if(file_exists($lesscLib)) {
12ab45ba71SJames Collins        require_once($lesscLib);
13ab45ba71SJames Collins
14ab45ba71SJames Collins        if(isset($_GET['css'])) {
15ab45ba71SJames Collins            $baseDir = dirname(__FILE__) . '/';
16ab45ba71SJames Collins            $cssFile = realpath($baseDir . $_GET['css']);
17ab45ba71SJames Collins
18ab45ba71SJames Collins            if(strpos($cssFile, $baseDir) === 0 && file_exists($cssFile)) {
19ab45ba71SJames Collins                $lastModified = filemtime($cssFile);
20ab45ba71SJames Collins                $eTagFile = md5_file($cssFile);
21ab45ba71SJames Collins                $eTagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : FALSE);
22ab45ba71SJames Collins
23ab45ba71SJames Collins                header('Content-Type: text/css; charset=utf-8');
24ab45ba71SJames Collins                header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
25ab45ba71SJames Collins                header('Etag: ' . $eTagFile);
26ab45ba71SJames Collins                header('Cache-Control: public, max-age=604800, immutable');
27ab45ba71SJames Collins
28ab45ba71SJames Collins                if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified || $eTagHeader == $eTagFile) {
29ab45ba71SJames Collins                    header('HTTP/1.1 304 Not Modified');
30ab45ba71SJames Collins                    exit;
31ab45ba71SJames Collins                }
32ab45ba71SJames Collins
33ab45ba71SJames Collins                $css = file_get_contents($cssFile);
34ab45ba71SJames Collins
35ab45ba71SJames Collins                $less = new lessc();
36ab45ba71SJames Collins                $less->setPreserveComments(false);
37*a8eebd82SJames Collins
38*a8eebd82SJames Collins                if(file_exists('style.ini')) {
39*a8eebd82SJames Collins                    $overrideStyle = '../../../conf/tpl/mikio/style.ini';
40*a8eebd82SJames Collins
41*a8eebd82SJames Collins                    $vars = Array();
42*a8eebd82SJames Collins                    $rawVars = parse_ini_file('style.ini', TRUE);
43*a8eebd82SJames Collins
44*a8eebd82SJames Collins                    if(file_exists($overrideStyle)) {
45*a8eebd82SJames Collins                        $userVars = parse_ini_file($overrideStyle, TRUE);
46*a8eebd82SJames Collins                        $rawVars = associativeMerge($rawVars, $userVars);
47*a8eebd82SJames Collins                    }
48*a8eebd82SJames Collins
49*a8eebd82SJames Collins                  if(isset($rawVars['replacements'])) {
50*a8eebd82SJames Collins                    foreach($rawVars['replacements'] as $key=>$val) {
51*a8eebd82SJames Collins                      if(substr($key, 0, 2) == '__' && substr($key, -2) == '__') {
52*a8eebd82SJames Collins                        $vars['ini_' . substr($key, 2, -2)] = $val;
53*a8eebd82SJames Collins                      }
54*a8eebd82SJames Collins                    }
55*a8eebd82SJames Collins                  }
56*a8eebd82SJames Collins
57*a8eebd82SJames Collins                  if(count($vars) > 0) {
58*a8eebd82SJames Collins                    $less->setVariables($vars);
59*a8eebd82SJames Collins                  }
60*a8eebd82SJames Collins                }
61*a8eebd82SJames Collins
62ab45ba71SJames Collins                $css = $less->compile($css);
63ab45ba71SJames Collins
64ab45ba71SJames Collins                $accept_encoding = @getallheaders()['Accept-Encoding'];
65ab45ba71SJames Collins                if($accept_encoding && preg_match('/ *gzip *,?/', $accept_encoding)) {
66ab45ba71SJames Collins                    header('Content-Encoding: gzip');
67ab45ba71SJames Collins                    echo gzencode($css);
68ab45ba71SJames Collins                } else {
69ab45ba71SJames Collins                    echo $css;
70ab45ba71SJames Collins                }
71ab45ba71SJames Collins            } else {
72ab45ba71SJames Collins                header('HTTP/1.1 404 Not Found');
73ab45ba71SJames Collins                echo "The requested file could not be found";
74ab45ba71SJames Collins            }
75ab45ba71SJames Collins        } else {
76ab45ba71SJames Collins            header('HTTP/1.1 404 Not Found');
77ab45ba71SJames Collins            echo "The requested file could not be found";
78ab45ba71SJames Collins        }
79ab45ba71SJames Collins    } else {
80ab45ba71SJames Collins        throw new Exception('Lessc library not found');
81ab45ba71SJames Collins    }
82ab45ba71SJames Collins}
83ab45ba71SJames Collinscatch(Exception $e) {
84ab45ba71SJames Collins    header('HTTP/1.500 Internal Server Error');
85*a8eebd82SJames Collins    echo $e;
86*a8eebd82SJames Collins}
87*a8eebd82SJames Collins
88*a8eebd82SJames Collinsfunction associativeMerge($base, $addition)
89*a8eebd82SJames Collins{
90*a8eebd82SJames Collins    $result = $base;
91*a8eebd82SJames Collins
92*a8eebd82SJames Collins    // if(is_array($base) && is_array($addition)) {
93*a8eebd82SJames Collins    //     foreach($addition as $key=>$value) {
94*a8eebd82SJames Collins    //         if(is_array($value)) {
95*a8eebd82SJames Collins    //             $result[$key] = associativeMerge($result[$key], $value);
96*a8eebd82SJames Collins	// 		} else {
97*a8eebd82SJames Collins	// 			$result[$key] = $value;
98*a8eebd82SJames Collins	// 		}
99*a8eebd82SJames Collins    //     }
100*a8eebd82SJames Collins    // }
101*a8eebd82SJames Collins
102*a8eebd82SJames Collins    return $result;
103ab45ba71SJames Collins}