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