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)); }
/** * 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; }
/** * 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; }
/** * 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; } }