xref: /template/mikio/css.php (revision ab45ba7165dc08ce8ac280c60e4318ef9df9d00d)
1*ab45ba71SJames Collins<?php
2*ab45ba71SJames Collins/**
3*ab45ba71SJames Collins * Mikio CSS Engine
4*ab45ba71SJames Collins *
5*ab45ba71SJames Collins * @link    http://dokuwiki.org/template:mikio
6*ab45ba71SJames Collins * @author  James Collins <james.collins@outlook.com.au>
7*ab45ba71SJames Collins * @license GPLv2 (http://www.gnu.org/licenses/gpl-2.0.html)
8*ab45ba71SJames Collins */
9*ab45ba71SJames Collinstry {
10*ab45ba71SJames Collins    $lesscLib = '../../../vendor/marcusschwarz/lesserphp/lessc.inc.php';
11*ab45ba71SJames Collins    if(file_exists($lesscLib)) {
12*ab45ba71SJames Collins        require_once($lesscLib);
13*ab45ba71SJames Collins
14*ab45ba71SJames Collins        if(isset($_GET['css'])) {
15*ab45ba71SJames Collins            $baseDir = dirname(__FILE__) . '/';
16*ab45ba71SJames Collins            $cssFile = realpath($baseDir . $_GET['css']);
17*ab45ba71SJames Collins
18*ab45ba71SJames Collins            if(strpos($cssFile, $baseDir) === 0 && file_exists($cssFile)) {
19*ab45ba71SJames Collins                $lastModified = filemtime($cssFile);
20*ab45ba71SJames Collins                $eTagFile = md5_file($cssFile);
21*ab45ba71SJames Collins                $eTagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : FALSE);
22*ab45ba71SJames Collins
23*ab45ba71SJames Collins                header('Content-Type: text/css; charset=utf-8');
24*ab45ba71SJames Collins                header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
25*ab45ba71SJames Collins                header('Etag: ' . $eTagFile);
26*ab45ba71SJames Collins                header('Cache-Control: public, max-age=604800, immutable');
27*ab45ba71SJames Collins
28*ab45ba71SJames Collins                if(@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified || $eTagHeader == $eTagFile) {
29*ab45ba71SJames Collins                    header('HTTP/1.1 304 Not Modified');
30*ab45ba71SJames Collins                    exit;
31*ab45ba71SJames Collins                }
32*ab45ba71SJames Collins
33*ab45ba71SJames Collins                $css = file_get_contents($cssFile);
34*ab45ba71SJames Collins
35*ab45ba71SJames Collins                $less = new lessc();
36*ab45ba71SJames Collins                $less->setPreserveComments(false);
37*ab45ba71SJames Collins                $css = $less->compile($css);
38*ab45ba71SJames Collins
39*ab45ba71SJames Collins                $accept_encoding = @getallheaders()['Accept-Encoding'];
40*ab45ba71SJames Collins                if($accept_encoding && preg_match('/ *gzip *,?/', $accept_encoding)) {
41*ab45ba71SJames Collins                    header('Content-Encoding: gzip');
42*ab45ba71SJames Collins                    echo gzencode($css);
43*ab45ba71SJames Collins                } else {
44*ab45ba71SJames Collins                    echo $css;
45*ab45ba71SJames Collins                }
46*ab45ba71SJames Collins            } else {
47*ab45ba71SJames Collins                header('HTTP/1.1 404 Not Found');
48*ab45ba71SJames Collins                echo "The requested file could not be found";
49*ab45ba71SJames Collins            }
50*ab45ba71SJames Collins        } else {
51*ab45ba71SJames Collins            header('HTTP/1.1 404 Not Found');
52*ab45ba71SJames Collins            echo "The requested file could not be found";
53*ab45ba71SJames Collins        }
54*ab45ba71SJames Collins    } else {
55*ab45ba71SJames Collins        throw new Exception('Lessc library not found');
56*ab45ba71SJames Collins    }
57*ab45ba71SJames Collins}
58*ab45ba71SJames Collinscatch(Exception $e) {
59*ab45ba71SJames Collins    header('HTTP/1.500 Internal Server Error');
60*ab45ba71SJames Collins}
61