Merge branch 'MDL-36950-updates-proxy' of git://github.com/mudrd8mz/moodle
[moodle.git] / theme / styles.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * This file is responsible for serving the one huge CSS of each theme.
20  *
21  * @package   moodlecore
22  * @copyright 2009 Petr Skoda (skodak)  {@link http://skodak.org}
23  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
27 // disable moodle specific debug messages and any errors in output,
28 // comment out when debugging or better look into error log!
29 define('NO_DEBUG_DISPLAY', true);
31 // we need just the values from config.php and minlib.php
32 define('ABORT_AFTER_CONFIG', true);
33 require('../config.php'); // this stops immediately at the beginning of lib/setup.php
34 require_once($CFG->dirroot.'/lib/csslib.php');
36 if ($slashargument = min_get_slash_argument()) {
37     $slashargument = ltrim($slashargument, '/');
38     if (substr_count($slashargument, '/') < 2) {
39         image_not_found();
40     }
42     if (strpos($slashargument, '_s/') === 0) {
43         // Can't use SVG
44         $slashargument = substr($slashargument, 3);
45         $usesvg = false;
46     } else {
47         $usesvg = true;
48     }
50     // image must be last because it may contain "/"
51     list($themename, $rev, $type) = explode('/', $slashargument, 3);
52     $themename = min_clean_param($themename, 'SAFEDIR');
53     $rev       = min_clean_param($rev, 'INT');
54     $type      = min_clean_param($type, 'SAFEDIR');
56 } else {
57     $themename = min_optional_param('theme', 'standard', 'SAFEDIR');
58     $rev       = min_optional_param('rev', 0, 'INT');
59     $type      = min_optional_param('type', 'all', 'SAFEDIR');
60     $usesvg    = (bool)min_optional_param('svg', '1', 'INT');
61 }
63 if (!in_array($type, array('all', 'ie', 'editor', 'plugins', 'parents', 'theme'))) {
64     header('HTTP/1.0 404 not found');
65     die('Theme was not found, sorry.');
66 }
68 if (file_exists("$CFG->dirroot/theme/$themename/config.php")) {
69     // exists
70 } else if (!empty($CFG->themedir) and file_exists("$CFG->themedir/$themename/config.php")) {
71     // exists
72 } else {
73     header('HTTP/1.0 404 not found');
74     die('Theme was not found, sorry.');
75 }
77 if ($type === 'ie') {
78     css_send_ie_css($themename, $rev, $etag, !empty($slashargument));
79 }
81 $candidatedir = "$CFG->cachedir/theme/$themename/css";
82 $etag = "$themename/$rev/$type";
83 if (!$usesvg) {
84     // Add to the sheet name, one day we'll be able to just drop this.
85     $candidatedir .= '/nosvg';
86     $etag .= '/nosvg';
87 }
88 $candidatesheet = "$candidatedir/$type.css";
89 $etag = sha1($etag);
91 if (file_exists($candidatesheet)) {
92     if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) || !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
93         // we do not actually need to verify the etag value because our files
94         // never change in cache because we increment the rev parameter
95         css_send_unmodified(filemtime($candidatesheet), $etag);
96     }
97     css_send_cached_css($candidatesheet, $etag);
98 }
100 //=================================================================================
101 // ok, now we need to start normal moodle script, we need to load all libs and $DB
102 define('ABORT_AFTER_CONFIG_CANCEL', true);
104 define('NO_MOODLE_COOKIES', true); // Session not used here
105 define('NO_UPGRADE_CHECK', true);  // Ignore upgrade check
107 require("$CFG->dirroot/lib/setup.php");
109 $theme = theme_config::load($themename);
110 $theme->force_svg_use($usesvg);
112 $rev = theme_get_revision();
114 $etag = "$themename/$rev/$type";
115 if (!$usesvg) {
116     // Add to the etag, one day we'll be able to just delete svg nonsense this.
117     $etag .= '/nosvg';
119 $etag = sha1($etag);
121 if ($type === 'editor') {
122     $cssfiles = $theme->editor_css_files();
123     css_store_css($theme, $candidatesheet, $cssfiles);
124 } else {
125     $basedir = "$CFG->cachedir/theme/$themename/css";
126     if (!$usesvg) {
127         $basedir .= '/nosvg';
128     }
129     $css = $theme->css_files();
130     $allfiles = array();
131     foreach ($css as $key=>$value) {
132         $cssfiles = array();
133         foreach($value as $val) {
134             if (is_array($val)) {
135                 foreach ($val as $k=>$v) {
136                     $cssfiles[] = $v;
137                 }
138             } else {
139                 $cssfiles[] = $val;
140             }
141         }
142         $cssfile = "$basedir/$key.css";
143         css_store_css($theme, $cssfile, $cssfiles);
144         $allfiles = array_merge($allfiles, $cssfiles);
145     }
146     $cssfile = "$basedir/all.css";
147     css_store_css($theme, $cssfile, $allfiles);
150 // verify nothing failed in cache file creation
151 clearstatcache();
152 if (!file_exists($candidatesheet)) {
153     css_send_css_not_found();
156 css_send_cached_css($candidatesheet, $etag);