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