*/ class Css extends Factory { protected $assets = array(), $files = array(), $mtimes = array(); public function setFilters() { $this->setFilter('CssMin', new MinifyCssCompressorFilter) ->setFilter('CssRewrite', new CssRewriteFilter); } /** * Takes all the stylesheets enqueued to the theme and removes them from the queue */ public function extract() { global $wp_styles; if ( empty($wp_styles->queue) ) return; $profiler = array( time() ); // Trigger dependency resolution $wp_styles->all_deps($wp_styles->queue); foreach( $wp_styles->to_do as $key => $handle ) { if ( $this->manager->isFileExcluded($wp_styles->registered[$handle]->src) ) continue; //Removes absolute part of the path if it's specified in the src $style_path = $this->guessPath($wp_styles->registered[$handle]->src); // Script didn't match any case (plugin, theme or wordpress locations) if( $style_path == false ) continue; if ( !file_exists($style_path) ) continue; //Separation of stylesheets enqueue using different media $media = $wp_styles->registered[$handle]->args; if ( $media == '' ) $media = 'all'; //Separation between preprocessors and css stylesheets $ext = 'css'; $parts = explode('.', $style_path); if ( count($parts) > 0 ) { $ext = $parts[ count($parts) - 1 ]; } $this->assets[$media][$ext]['files'][$handle] = $style_path; $this->assets[$media][$ext]['mtimes'][$handle] = filemtime($style_path); //Removes css from the queue so this plugin will be //responsible to include all the stylesheets except other domains ones. $wp_styles->dequeue( $handle ); //Move the handle to the done array. $wp_styles->done[] = $handle; unset($wp_styles->to_do[$key]); } $profiler []= time(); Log::getInstance()->set( 'Css extraction', $profiler ); } /** * Takes all the stylesheets and manages their queue to compress them */ public function generate() { $profiler = array( time() ); foreach ( $this->assets as $media => $assets ) { foreach ( $assets as $ext => $content ) { $mtime = md5( json_encode($content) ); $cachefile = "$media-$ext-$mtime.css"; if ( !$this->cache->fs->has( $cachefile ) ) { $class = "AssetsMinify\\Assets\\Css\\" . ucfirst($ext); new $class( $content['files'], $cachefile, $this ); } $key = "$media-$ext-am-generated"; $this->files[$media][$key] = $this->cache->getPath() . $cachefile; $this->mtimes[$media][$key] = filemtime($this->files[$media][$key]); } } if ( empty($this->files) ) return false; foreach ( $this->files as $media => $files) { $mtime = md5( json_encode($this->mtimes[$media]) ); //Saves the asseticized stylesheets $cachedFilename = "head-$media-$mtime.css"; if ( !$this->cache->fs->has( $cachedFilename ) ) { $cssDump = $this->createAsset( $files, $this->getFilters() )->dump(); $cssDump = str_replace( 'url(/wp-', 'url(' . site_url() . '/wp-', $cssDump ); $cssDump = str_replace( 'url("/wp-', 'url("' . site_url() . '/wp-', $cssDump ); $cssDump = str_replace( "url('/wp-", "url('" . site_url() . "/wp-", $cssDump ); $this->cache->fs->set( $cachedFilename, $cssDump ); $this->cache->update(); } //Prints css inclusion in the page $this->dump( $cachedFilename, $media ); } $profiler []= time(); Log::getInstance()->set( 'Css minification', $profiler ); } /** * Prints tag to include the CSS * * @param string $filename The filename to dump * @param string $media The media attribute - Default = all */ protected function dump( $filename, $media = 'all' ) { echo ""; } }