[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/theme/ -> styles.php (source)

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * This file is responsible for serving the one huge CSS of each theme.
  19   *
  20   * @package   core
  21   * @copyright 2009 Petr Skoda (skodak)  {@link http://skodak.org}
  22   * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  // Disable moodle specific debug messages and any errors in output,
  26  // comment out when debugging or better look into error log!
  27  define('NO_DEBUG_DISPLAY', true);
  28  
  29  define('ABORT_AFTER_CONFIG', true);
  30  require('../config.php');
  31  require_once($CFG->dirroot.'/lib/csslib.php');
  32  
  33  if ($slashargument = min_get_slash_argument()) {
  34      $slashargument = ltrim($slashargument, '/');
  35      if (substr_count($slashargument, '/') < 2) {
  36          css_send_css_not_found();
  37      }
  38  
  39      if (strpos($slashargument, '_s/') === 0) {
  40          // Can't use SVG.
  41          $slashargument = substr($slashargument, 3);
  42          $usesvg = false;
  43      } else {
  44          $usesvg = true;
  45      }
  46  
  47      $chunk = null;
  48      if (preg_match('#/(chunk(\d+)(/|$))#', $slashargument, $matches)) {
  49          $chunk = (int)$matches[2];
  50          $slashargument = str_replace($matches[1], '', $slashargument);
  51      }
  52  
  53      list($themename, $rev, $type) = explode('/', $slashargument, 3);
  54      $themename = min_clean_param($themename, 'SAFEDIR');
  55      $rev       = min_clean_param($rev, 'INT');
  56      $type      = min_clean_param($type, 'SAFEDIR');
  57  
  58  } else {
  59      $themename = min_optional_param('theme', 'standard', 'SAFEDIR');
  60      $rev       = min_optional_param('rev', 0, 'INT');
  61      $type      = min_optional_param('type', 'all', 'SAFEDIR');
  62      $chunk     = min_optional_param('chunk', null, 'INT');
  63      $usesvg    = (bool)min_optional_param('svg', '1', 'INT');
  64  }
  65  
  66  if ($type === 'editor') {
  67      // The editor CSS is never chunked.
  68      $chunk = null;
  69  } else if ($type === 'all') {
  70      // We're fine.
  71  } else {
  72      css_send_css_not_found();
  73  }
  74  
  75  if (file_exists("$CFG->dirroot/theme/$themename/config.php")) {
  76      // The theme exists in standard location - ok.
  77  } else if (!empty($CFG->themedir) and file_exists("$CFG->themedir/$themename/config.php")) {
  78      // Alternative theme location contains this theme - ok.
  79  } else {
  80      header('HTTP/1.0 404 not found');
  81      die('Theme was not found, sorry.');
  82  }
  83  
  84  $candidatedir = "$CFG->localcachedir/theme/$rev/$themename/css";
  85  $etag = "$rev/$themename/$type";
  86  $candidatename = $type;
  87  if (!$usesvg) {
  88      // Add to the sheet name, one day we'll be able to just drop this.
  89      $candidatedir .= '/nosvg';
  90      $etag .= '/nosvg';
  91  }
  92  
  93  if ($chunk !== null) {
  94      $etag .= '/chunk'.$chunk;
  95      $candidatename .= '.'.$chunk;
  96  }
  97  $candidatesheet = "$candidatedir/$candidatename.css";
  98  $etag = sha1($etag);
  99  
 100  if (file_exists($candidatesheet)) {
 101      if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) || !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
 102          // We do not actually need to verify the etag value because our files
 103          // never change in cache because we increment the rev counter.
 104          css_send_unmodified(filemtime($candidatesheet), $etag);
 105      }
 106      css_send_cached_css($candidatesheet, $etag);
 107  }
 108  
 109  // Ok, now we need to start normal moodle script, we need to load all libs and $DB.
 110  define('ABORT_AFTER_CONFIG_CANCEL', true);
 111  
 112  define('NO_MOODLE_COOKIES', true); // Session not used here.
 113  define('NO_UPGRADE_CHECK', true);  // Ignore upgrade check.
 114  
 115  require("$CFG->dirroot/lib/setup.php");
 116  
 117  $theme = theme_config::load($themename);
 118  $theme->force_svg_use($usesvg);
 119  
 120  $themerev = theme_get_revision();
 121  
 122  $cache = true;
 123  if ($themerev <= 0 or $themerev != $rev) {
 124      $rev = $themerev;
 125      $cache = false;
 126  
 127      $candidatedir = "$CFG->localcachedir/theme/$rev/$themename/css";
 128      $etag = "$rev/$themename/$type";
 129      $candidatename = $type;
 130      if (!$usesvg) {
 131          // Add to the sheet name, one day we'll be able to just drop this.
 132          $candidatedir .= '/nosvg';
 133          $etag .= '/nosvg';
 134      }
 135  
 136      if ($chunk !== null) {
 137          $etag .= '/chunk'.$chunk;
 138          $candidatename .= '.'.$chunk;
 139      }
 140      $candidatesheet = "$candidatedir/$candidatename.css";
 141      $etag = sha1($etag);
 142  }
 143  
 144  make_localcache_directory('theme', false);
 145  
 146  if ($type === 'editor') {
 147      $csscontent = $theme->get_css_content_editor();
 148      css_store_css($theme, "$candidatedir/editor.css", $csscontent, false);
 149  
 150  } else {
 151  
 152      $lock = null;
 153  
 154      // Lock system to prevent concurrent requests to compile LESS, which is really slow and CPU intensive.
 155      // Each client should wait for one to finish the compilation before starting a new compiling process.
 156      // We only do this when the file will be cached...
 157      if ($type === 'less' && $cache) {
 158          $lockfactory = \core\lock\lock_config::get_lock_factory('core_theme_get_css_content');
 159          // We wait for the lock to be acquired, the timeout does not need to be strict here.
 160          $lock = $lockfactory->get_lock($themename, rand(15, 30));
 161          if (file_exists($candidatesheet)) {
 162              // The file was built while we waited for the lock, we release the lock and serve the file.
 163              if ($lock) {
 164                  $lock->release();
 165              }
 166              css_send_cached_css($candidatesheet, $etag);
 167          }
 168      }
 169  
 170      // Older IEs require smaller chunks.
 171      $csscontent = $theme->get_css_content();
 172  
 173      $relroot = preg_replace('|^http.?://[^/]+|', '', $CFG->wwwroot);
 174      if (!empty($slashargument)) {
 175          if ($usesvg) {
 176              $chunkurl = "{$relroot}/theme/styles.php/{$themename}/{$rev}/all";
 177          } else {
 178              $chunkurl = "{$relroot}/theme/styles.php/_s/{$themename}/{$rev}/all";
 179          }
 180      } else {
 181          if ($usesvg) {
 182              $chunkurl = "{$relroot}/theme/styles.php?theme={$themename}&rev={$rev}&type=all";
 183          } else {
 184              $chunkurl = "{$relroot}/theme/styles.php?theme={$themename}&rev={$rev}&type=all&svg=0";
 185          }
 186      }
 187  
 188      css_store_css($theme, "$candidatedir/all.css", $csscontent, true, $chunkurl);
 189  
 190      // Release the lock.
 191      if ($lock) {
 192          $lock->release();
 193      }
 194  }
 195  
 196  if (!$cache) {
 197      // Do not pollute browser caches if invalid revision requested,
 198      // let's ignore legacy IE breakage here too.
 199      css_send_uncached_css($csscontent);
 200  
 201  } else if ($chunk !== null and file_exists($candidatesheet)) {
 202      // Greetings stupid legacy IEs!
 203      css_send_cached_css($candidatesheet, $etag);
 204  
 205  } else {
 206      // Real browsers - this is the expected result!
 207      css_send_cached_css_content($csscontent, $etag);
 208  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1