예제 #1
0
 public function test_css()
 {
     $css = "\nbody {\nbackground: #fff;\nmargin: 0;\npadding: 0;\ncolor: #281f18;\n}";
     $this->assertSame("body{background:#fff;margin:0;padding:0;color:#281f18}", core_minify::css($css));
 }
예제 #2
0
 /**
  * Get the whole css stylesheet for production mode.
  *
  * NOTE: this method is not expected to be used from any addons.
  *
  * @return string CSS markup compressed
  */
 public function get_css_content()
 {
     $csscontent = '';
     foreach ($this->get_css_files(false) as $type => $value) {
         foreach ($value as $identifier => $val) {
             if (is_array($val)) {
                 foreach ($val as $v) {
                     $csscontent .= file_get_contents($v) . "\n";
                 }
             } else {
                 if ($type === 'theme' && $identifier === $this->scssfile) {
                     // We need the content from SCSS because this is the SCSS file from the theme.
                     $csscontent .= $this->get_css_content_from_scss(false);
                 } else {
                     if ($type === 'theme' && $identifier === $this->lessfile) {
                         // We need the content from LESS because this is the LESS file from the theme.
                         $csscontent .= $this->get_css_content_from_less(false);
                     } else {
                         $csscontent .= file_get_contents($val) . "\n";
                     }
                 }
             }
         }
     }
     $csscontent = $this->post_process($csscontent);
     $csscontent = core_minify::css($csscontent);
     return $csscontent;
 }
예제 #3
0
 /**
  * Get the whole css stylesheet for production mode.
  *
  * NOTE: this method is not expected to be used from any addons.
  *
  * @return string CSS markup, already optimised and compressed
  */
 public function get_css_content()
 {
     global $CFG;
     require_once $CFG->dirroot . '/lib/csslib.php';
     $csscontent = '';
     foreach ($this->get_css_files(false) as $type => $value) {
         foreach ($value as $identifier => $val) {
             if (is_array($val)) {
                 foreach ($val as $v) {
                     $csscontent .= file_get_contents($v) . "\n";
                 }
             } else {
                 if ($type === 'theme' && $identifier === $this->lessfile) {
                     // We need the content from LESS because this is the LESS file from the theme.
                     $csscontent .= $this->get_css_content_from_less(false);
                 } else {
                     $csscontent .= file_get_contents($val) . "\n";
                 }
             }
         }
     }
     $csscontent = $this->post_process($csscontent);
     if (!empty($CFG->enablecssoptimiser) && $this->supportscssoptimisation) {
         // This is an experimental feature introduced in Moodle 2.3
         // The CSS optimiser organises the CSS in order to reduce the overall number
         // of rules and styles being sent to the client. It does this by collating
         // the CSS before it is cached removing excess styles and rules and stripping
         // out any extraneous content such as comments and empty rules.
         $optimiser = new css_optimiser();
         $csscontent = $optimiser->process($csscontent);
     } else {
         $csscontent = core_minify::css($csscontent);
     }
     return $csscontent;
 }
예제 #4
0
/**
 * Stores CSS in a file at the given path.
 *
 * This function either succeeds or throws an exception.
 *
 * @param theme_config $theme The theme that the CSS belongs to.
 * @param string $csspath The path to store the CSS at.
 * @param array $cssfiles The CSS files to store.
 * @param bool $chunk If set to true these files will be chunked to ensure
 *      that no one file contains more than 4095 selectors.
 * @param string $chunkurl If the CSS is be chunked then we need to know the URL
 *      to use for the chunked files.
 */
function css_store_css(theme_config $theme, $csspath, array $cssfiles, $chunk = false, $chunkurl = null)
{
    global $CFG;
    $css = '';
    foreach ($cssfiles as $file) {
        $css .= file_get_contents($file) . "\n";
    }
    // Check if both the CSS optimiser is enabled and the theme supports it.
    if (!empty($CFG->enablecssoptimiser) && $theme->supportscssoptimisation) {
        // This is an experimental feature introduced in Moodle 2.3
        // The CSS optimiser organises the CSS in order to reduce the overall number
        // of rules and styles being sent to the client. It does this by collating
        // the CSS before it is cached removing excess styles and rules and stripping
        // out any extraneous content such as comments and empty rules.
        $optimiser = new css_optimiser();
        $css = $theme->post_process($css);
        $css = $optimiser->process($css);
        // If cssoptimisestats is set then stats from the optimisation are collected
        // and output at the beginning of the CSS.
        if (!empty($CFG->cssoptimiserstats)) {
            $css = $optimiser->output_stats_css() . $css;
        }
    } else {
        // This is the default behaviour.
        // The cssoptimise setting was introduced in Moodle 2.3 and will hopefully
        // in the future be changed from an experimental setting to the default.
        // The css_minify_css will method will use the Minify library remove
        // comments, additional whitespace and other minor measures to reduce the
        // the overall CSS being sent.
        // However it has the distinct disadvantage of having to minify the CSS
        // before running the post process functions. Potentially things may break
        // here if theme designers try to push things with CSS post processing.
        $css = $theme->post_process($css);
        $css = core_minify::css($css);
    }
    clearstatcache();
    if (!file_exists(dirname($csspath))) {
        @mkdir(dirname($csspath), $CFG->directorypermissions, true);
    }
    // Prevent serving of incomplete file from concurrent request,
    // the rename() should be more atomic than fwrite().
    ignore_user_abort(true);
    // First up write out the single file for all those using decent browsers.
    css_write_file($csspath, $css);
    if ($chunk) {
        // If we need to chunk the CSS for browsers that are sub-par.
        $css = css_chunk_by_selector_count($css, $chunkurl);
        $files = count($css);
        $count = 1;
        foreach ($css as $content) {
            if ($count === $files) {
                // If there is more than one file and this IS the last file.
                $filename = preg_replace('#\\.css$#', '.0.css', $csspath);
            } else {
                // If there is more than one file and this is not the last file.
                $filename = preg_replace('#\\.css$#', '.' . $count . '.css', $csspath);
            }
            $count++;
            css_write_file($filename, $content);
        }
    }
    ignore_user_abort(false);
    if (connection_aborted()) {
        die;
    }
}