*/ class Js extends Factory { protected $assets = array(), $files = array(), $mtimes = array(), $localized = array(); public function setFilters() { $this->setFilter( 'JSqueeze', new JSqueezeFilter ); } /** * Takes all the scripts enqueued to the theme and removes them from the queue */ public function extract() { global $wp_scripts; if ( empty($wp_scripts->queue) ) return; $profiler = array( time() ); // Trigger dependency resolution $wp_scripts->all_deps($wp_scripts->queue); foreach( $wp_scripts->to_do as $key => $handle ) { if ( $this->manager->isFileExcluded($wp_scripts->registered[$handle]->src) ) continue; $script_path = $this->guessPath($wp_scripts->registered[$handle]->src); // Script didn't match any case (plugin, theme or wordpress locations) if( $script_path === false ) continue; $where = 'footer'; if ( empty($wp_scripts->registered[$handle]->extra) && empty($wp_scripts->registered[$handle]->args) ) $where = 'header'; if ( empty($script_path) || !is_file($script_path) ) continue; $ext = 'js'; $parts = explode('.', $script_path); if ( count($parts) > 0 ) { $ext = $parts[ count($parts) - 1 ]; } if ( !empty($wp_scripts->registered[$handle]->extra['data']) ) { $this->localized[$where][] = $wp_scripts->registered[$handle]->extra['data']; } $this->assets[$where][$ext]['files'][$handle] = $script_path; $this->assets[$where][$ext]['mtimes'][$handle] = filemtime($script_path); //Removes scripts from the queue so this plugin will be //responsible to include all the scripts except other domains ones. $wp_scripts->dequeue( $handle ); //Move the handle to the done array. $wp_scripts->done[] = $handle; unset($wp_scripts->to_do[$key]); } $profiler []= time(); Log::getInstance()->set( 'Js extraction', $profiler ); } /** * Takes all the JavaScript and manages the queue to compress them * * @param string $where The page's place to dump the scripts in (header or footer) */ public function generate($where) { $profiler = array( time() ); if ( !isset($this->assets[$where]) ) return false; foreach ( $this->assets[$where] as $ext => $content ) { $mtime = md5( json_encode($content) ); $cachefile = "$where-$ext-$mtime.js"; if ( !$this->cache->fs->has( $cachefile ) ) { $class = "AssetsMinify\\Assets\\Js\\" . ucfirst($ext); new $class( $content['files'], $cachefile, $this ); } $key = "$ext-am-generated"; $this->files[$where][$key] = $this->cache->getPath() . $cachefile; $this->mtimes[$where][$key] = filemtime($this->files[$where][$key]); } if ( empty($this->files[$where]) ) return false; $mtime = md5( json_encode($this->mtimes[$where]) ); //Saves the asseticized header scripts if ( !$this->cache->fs->has( "$where-$mtime.js" ) ) { $this->cache->fs->set( "$where-$mtime.js", $this->createAsset( $this->files[$where], $this->getFilters() )->dump() ); $this->cache->update(); } //Prints "; } /** * Combines the script data from all minified scripts * * @param string $where The page's place to dump the scripts in (header or footer) * @return string The script to include within the page */ protected function buildScriptData( $where ) { $data = ''; if ( empty($this->localized[$where]) ) return ''; foreach ($this->localized[$where] as $script) { $data .= $script; } $asset = new StringAsset( $data, array(new JSqueezeFilter) ); return $asset->dump(); } /** * Prints \n"; } }