xref: /template/mikio/css.php (revision 703d73e0256405f80edfab9393b332ee7c436a97)
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
22*703d73e0SJames Collinsif(!function_exists('ctype_alnum')) {
23*703d73e0SJames Collins    function ctype_alnum($var) {
24*703d73e0SJames Collins        return preg_match('/^[a-zA-Z0-9]+$/', $var);
25*703d73e0SJames Collins    }
26*703d73e0SJames Collins}
27*703d73e0SJames Collins
28*703d73e0SJames Collinsif(!function_exists('ctype_alpha')) {
29*703d73e0SJames Collins    function ctype_alpha($var) {
30*703d73e0SJames Collins        return preg_match('/^[a-zA-Z]+$/', $var);
31*703d73e0SJames Collins    }
32*703d73e0SJames Collins}
33*703d73e0SJames Collins
34*703d73e0SJames Collinsif(!function_exists('ctype_cntrl')) {
35*703d73e0SJames Collins    function ctype_cntrl($var) {
36*703d73e0SJames Collins        return preg_match('/^[\x00-\x1F\x7F]+$/', $var);
37*703d73e0SJames Collins    }
38*703d73e0SJames Collins}
39*703d73e0SJames Collins
40*703d73e0SJames Collinsif(!function_exists('ctype_digit')) {
41*703d73e0SJames Collins    function ctype_digit($var) {
42*703d73e0SJames Collins        return preg_match('/^[0-9]+$/', $var);
43*703d73e0SJames Collins    }
44*703d73e0SJames Collins}
45*703d73e0SJames Collins
46*703d73e0SJames Collinsif(!function_exists('ctype_graph')) {
47*703d73e0SJames Collins    function ctype_graph($var) {
48*703d73e0SJames Collins        return preg_match('/^[\x20-\x7E\x80-\xFF]+$/', $var);
49*703d73e0SJames Collins    }
50*703d73e0SJames Collins}
51*703d73e0SJames Collins
52*703d73e0SJames Collinsif(!function_exists('ctype_lower')) {
53*703d73e0SJames Collins    function ctype_lower($var) {
54*703d73e0SJames Collins        return preg_match('/^[a-z]+$/', $var);
55*703d73e0SJames Collins    }
56*703d73e0SJames Collins}
57*703d73e0SJames Collins
58*703d73e0SJames Collinsif(!function_exists('ctype_print')) {
59*703d73e0SJames Collins    function ctype_print($var) {
60*703d73e0SJames Collins        return preg_match('/^[\x20-\x7E\x80-\xFF]+$/', $var);
61*703d73e0SJames Collins    }
62*703d73e0SJames Collins}
63*703d73e0SJames Collins
64*703d73e0SJames Collinsif(!function_exists('ctype_punct')) {
65*703d73e0SJames Collins    function ctype_punct($var) {
66*703d73e0SJames Collins        return preg_match('/^[^\w\s]+$/', $var);
67*703d73e0SJames Collins    }
68*703d73e0SJames Collins}
69*703d73e0SJames Collins
70*703d73e0SJames Collinsif(!function_exists('ctype_space')) {
71*703d73e0SJames Collins    function ctype_space($var) {
72*703d73e0SJames Collins        return preg_match('/^[\r\t\n]+$/', $var);
73*703d73e0SJames Collins    }
74*703d73e0SJames Collins}
75*703d73e0SJames Collins
76*703d73e0SJames Collinsif(!function_exists('ctype_upper')) {
77*703d73e0SJames Collins    function ctype_upper($var) {
78*703d73e0SJames Collins        return preg_match('/^[A-Z]+$/', $var);
79*703d73e0SJames Collins    }
80*703d73e0SJames Collins}
81*703d73e0SJames Collins
82*703d73e0SJames Collinsif(!function_exists('ctype_xdigit')) {
83*703d73e0SJames Collins    function ctype_upper($var) {
84*703d73e0SJames Collins        return preg_match('/^[0-9A-Fa-f]+$/', $var);
85*703d73e0SJames Collins    }
86*703d73e0SJames Collins}
87d24f6ec2SJames Collins
88ab45ba71SJames Collinstry {
8979f12da2SJames Collins    if(!function_exists('ctype_digit')) {
9029118ed7SJames Collins        if(isset($_GET['css'])) {
9129118ed7SJames Collins            $baseDir = dirname(__FILE__) . '/';
9229118ed7SJames Collins            $cssFile = realpath($baseDir . $_GET['css']);
9329118ed7SJames Collins            if(strtolower(substr($cssFile, -5)) == '.less') {
9429118ed7SJames Collins                $cssFile = substr($cssFile, 0, -5) . '.css';
9529118ed7SJames Collins                if(file_exists($cssFile)) {
9629118ed7SJames Collins                    echo file_get_contents($cssFile);
9729118ed7SJames Collins                    exit;
9829118ed7SJames Collins                }
9929118ed7SJames Collins            }
10029118ed7SJames Collins        }
10129118ed7SJames Collins
10229118ed7SJames Collins        throw new Exception('ctype extension not installed');
10329118ed7SJames Collins    }
10429118ed7SJames Collins
105ab45ba71SJames Collins    $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
10629118ed7SJames Collins    if(!file_exists($lesscLib))
10729118ed7SJames Collins        $lesscLib = '../../../../../app/dokuwiki/vendor/marcusschwarz/lesserphp/lessc.inc.php';
10829118ed7SJames Collins
109ab45ba71SJames Collins    if(file_exists($lesscLib)) {
11079f12da2SJames Collins        @require_once($lesscLib);
111ab45ba71SJames Collins
112ab45ba71SJames Collins        if(isset($_GET['css'])) {
113ab45ba71SJames Collins            $baseDir = dirname(__FILE__) . '/';
114ab45ba71SJames Collins            $cssFile = realpath($baseDir . $_GET['css']);
115ab45ba71SJames Collins
116ab45ba71SJames Collins            if(strpos($cssFile, $baseDir) === 0 && file_exists($cssFile)) {
117ab45ba71SJames Collins                $lastModified = filemtime($cssFile);
118ab45ba71SJames Collins                $eTagFile = md5_file($cssFile);
119ab45ba71SJames Collins                $eTagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : FALSE);
120ab45ba71SJames Collins
121ab45ba71SJames Collins                header('Content-Type: text/css; charset=utf-8');
122ab45ba71SJames Collins                header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
123ab45ba71SJames Collins                header('Etag: ' . $eTagFile);
124ab45ba71SJames Collins                header('Cache-Control: public, max-age=604800, immutable');
125ab45ba71SJames Collins
126ab45ba71SJames Collins                if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified || $eTagHeader == $eTagFile) {
127ab45ba71SJames Collins                    header('HTTP/1.1 304 Not Modified');
128ab45ba71SJames Collins                    exit;
129ab45ba71SJames Collins                }
130ab45ba71SJames Collins
131ab45ba71SJames Collins                $css = file_get_contents($cssFile);
132ab45ba71SJames Collins
133ab45ba71SJames Collins                $less = new lessc();
134ab45ba71SJames Collins                $less->setPreserveComments(false);
135a8eebd82SJames Collins
136*703d73e0SJames Collins                $rawVars = Array();
137*703d73e0SJames Collins                if(file_exists('style.ini')) $rawVars = array_merge($rawVars, parse_ini_file('style.ini', TRUE));
138*703d73e0SJames Collins                if(file_exists('../../../conf/tpl/mikio/style.ini')) $rawVars = array_merge($rawVars, parse_ini_file('../../../conf/tpl/mikio/style.ini', TRUE));
139a8eebd82SJames Collins
140a8eebd82SJames Collins                $vars = Array();
141a8eebd82SJames Collins                if(isset($rawVars['replacements'])) {
142a8eebd82SJames Collins                    foreach($rawVars['replacements'] as $key=>$val) {
143a8eebd82SJames Collins                        if(substr($key, 0, 2) == '__' && substr($key, -2) == '__') {
144a8eebd82SJames Collins                            $vars['ini_' . substr($key, 2, -2)] = $val;
145a8eebd82SJames Collins                        }
146a8eebd82SJames Collins                    }
147a8eebd82SJames Collins                }
148a8eebd82SJames Collins
149a8eebd82SJames Collins                if(count($vars) > 0) {
150a8eebd82SJames Collins                    $less->setVariables($vars);
151a8eebd82SJames Collins                }
152a8eebd82SJames Collins
153ab45ba71SJames Collins                $css = $less->compile($css);
154ab45ba71SJames Collins
155ab45ba71SJames Collins				$accept_encoding = @getallheaders()['Accept-Encoding'];
156ab45ba71SJames Collins     	        if($accept_encoding && preg_match('/ *gzip *,?/', $accept_encoding)) {
157ab45ba71SJames Collins               	    header('Content-Encoding: gzip');
158ab45ba71SJames Collins                		echo gzencode($css);
159ab45ba71SJames Collins            	} else {
160ab45ba71SJames Collins                		echo $css;
161ab45ba71SJames Collins                }
162ab45ba71SJames Collins            } else {
163ab45ba71SJames Collins                header('HTTP/1.1 404 Not Found');
164ab45ba71SJames Collins                echo "The requested file could not be found";
165ab45ba71SJames Collins            }
166ab45ba71SJames Collins        } else {
167ab45ba71SJames Collins            header('HTTP/1.1 404 Not Found');
168ab45ba71SJames Collins            echo "The requested file could not be found";
169ab45ba71SJames Collins        }
170ab45ba71SJames Collins    } else {
171ab45ba71SJames Collins        throw new Exception('Lessc library not found');
172ab45ba71SJames Collins    }
173ab45ba71SJames Collins}
174ab45ba71SJames Collinscatch(Exception $e) {
1751bdbd903SJames Collins    header('HTTP/1.1 500 Internal Server Error');
176a8eebd82SJames Collins    echo $e;
177a8eebd82SJames Collins}
178