From df5f7f489042fde7c9041c628a3a53eaaa0c5937 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 16 Oct 2018 13:00:16 +0300 Subject: [PATCH] Remove old assets class --- system/src/Grav/Common/Assets.old.php | 1438 ------------------------- 1 file changed, 1438 deletions(-) delete mode 100644 system/src/Grav/Common/Assets.old.php diff --git a/system/src/Grav/Common/Assets.old.php b/system/src/Grav/Common/Assets.old.php deleted file mode 100644 index 247605ba6..000000000 --- a/system/src/Grav/Common/Assets.old.php +++ /dev/null @@ -1,1438 +0,0 @@ - or \n"; - } - - - return $output; - } - - /** - * Build the JavaScript script tags. - * - * @param string $group name of the group - * @param array $attributes - * - * @return string - */ - public function js($group = 'head', $attributes = []) - { - if (!$this->js && !$this->inline_js) { - return null; - } - - // Sort array by priorities (larger priority first) - uasort($this->js, array($this, 'sortAssetsByPriorityThenOrder')); - uasort($this->inline_js, array($this, 'sortAssetsByPriorityThenOrder')); - - $inlineGroup = array_key_exists('loading', $attributes) && $attributes['loading'] === 'inline'; - - $attributes = $this->attributes($attributes); - - $output = ''; - $inline_js = ''; - - if ($this->js_pipeline) { - $pipeline_result = $this->pipelineJs($group, !$inlineGroup); - $pipeline_html = ($inlineGroup ? '' : '' . "\n"); - - if ($this->js_pipeline_before_excludes && $pipeline_result) { - if ($inlineGroup) { - $inline_js .= $pipeline_result; - } - else { - $output .= $pipeline_html; - } - } - foreach ($this->js_no_pipeline as $file) { - if ($group && $file['group'] == $group) { - if ($file['loading'] === 'inline') { - $inline_js .= $this->gatherLinks([$file], JS_ASSET) . "\n"; - } - else { - $output .= '' . "\n"; - } - } - } - if (!$this->js_pipeline_before_excludes && $pipeline_result) { - if ($inlineGroup) { - $inline_js .= $pipeline_result; - } - else { - $output .= $pipeline_html; - } - } - } else { - foreach ($this->js as $file) { - if ($group && $file['group'] == $group) { - if ($inlineGroup || $file['loading'] === 'inline') { - $inline_js .= $this->gatherLinks([$file], JS_ASSET) . "\n"; - } - else { - $output .= '' . "\n"; - } - } - } - } - - // Render Inline JS - foreach ($this->inline_js as $inline) { - if ($group && $inline['group'] == $group) { - $inline_js .= $inline['asset'] . "\n"; - } - } - - if ($inline_js) { - $attribute_string = isset($inline) && $inline['type'] ? " type=\"" . $inline['type'] . "\"" : ''; - $output .= "\n\n" . $inline_js . "\n\n"; - } - - return $output; - } - - /** - * Minify and concatenate CSS - * - * @param string $group - * @param bool $returnURL true if pipeline should return the URL, otherwise the content - * - * @return bool|string URL or generated content if available, else false - */ - protected function pipelineCss($group = 'head', $returnURL = true) - { - // temporary list of assets to pipeline - $temp_css = []; - - // clear no-pipeline assets lists - $this->css_no_pipeline = []; - - // Compute uid based on assets and timestamp - $uid = md5(json_encode($this->css) . $this->css_minify . $this->css_rewrite . $group); - $file = $uid . '.css'; - $inline_file = $uid . '-inline.css'; - - $relative_path = "{$this->base_url}{$this->assets_url}/{$file}"; - - // If inline files exist set them on object - if (file_exists($this->assets_dir . $inline_file)) { - $this->css_no_pipeline = json_decode(file_get_contents($this->assets_dir . $inline_file), true); - } - - // If pipeline exist return its URL or content - if (file_exists($this->assets_dir . $file)) { - if ($returnURL) { - return $relative_path . $this->getTimestamp(); - } - else { - return file_get_contents($this->assets_dir . $file) . "\n"; - } - } - - // Remove any non-pipeline files - foreach ($this->css as $id => $asset) { - if ($asset['group'] == $group) { - if (!$asset['pipeline'] || - ($asset['remote'] && $this->css_pipeline_include_externals === false)) { - $this->css_no_pipeline[$id] = $asset; - } else { - $temp_css[$id] = $asset; - } - } - } - - //if nothing found get out of here! - if (count($temp_css) == 0) { - return false; - } - - // Write non-pipeline files out - if (!empty($this->css_no_pipeline)) { - file_put_contents($this->assets_dir . $inline_file, json_encode($this->css_no_pipeline)); - } - - - $css_minify = $this->css_minify; - - // If this is a Windows server, and minify_windows is false (default value) skip the - // minification process because it will cause Apache to die/crash due to insufficient - // ThreadStackSize in httpd.conf - See: https://bugs.php.net/bug.php?id=47689 - if (strtoupper(substr(php_uname('s'), 0, 3)) === 'WIN' && !$this->css_minify_windows) { - $css_minify = false; - } - - // Concatenate files - $buffer = $this->gatherLinks($temp_css, CSS_ASSET); - if ($css_minify) { - $minifier = new \MatthiasMullie\Minify\CSS(); - $minifier->add($buffer); - $buffer = $minifier->minify(); - } - - // Write file - if (strlen(trim($buffer)) > 0) { - file_put_contents($this->assets_dir . $file, $buffer); - - if ($returnURL) { - return $relative_path . $this->getTimestamp(); - } - else { - return $buffer . "\n"; - } - } else { - return false; - } - } - - /** - * Minify and concatenate JS files. - * - * @param string $group - * @param bool $returnURL true if pipeline should return the URL, otherwise the content - * - * @return bool|string URL or generated content if available, else false - */ - protected function pipelineJs($group = 'head', $returnURL = true) - { - // temporary list of assets to pipeline - $temp_js = []; - - // clear no-pipeline assets lists - $this->js_no_pipeline = []; - - // Compute uid based on assets and timestamp - $uid = md5(json_encode($this->js) . $this->js_minify . $group); - $file = $uid . '.js'; - $inline_file = $uid . '-inline.js'; - - $relative_path = "{$this->base_url}{$this->assets_url}/{$file}"; - - // If inline files exist set them on object - if (file_exists($this->assets_dir . $inline_file)) { - $this->js_no_pipeline = json_decode(file_get_contents($this->assets_dir . $inline_file), true); - } - - // If pipeline exist return its URL or content - if (file_exists($this->assets_dir . $file)) { - if ($returnURL) { - return $relative_path . $this->getTimestamp(); - } - else { - return file_get_contents($this->assets_dir . $file) . "\n"; - } - } - - // Remove any non-pipeline files - foreach ($this->js as $id => $asset) { - if ($asset['group'] == $group) { - if (!$asset['pipeline'] || - ($asset['remote'] && $this->js_pipeline_include_externals === false)) { - $this->js_no_pipeline[] = $asset; - } else { - $temp_js[$id] = $asset; - } - } - } - - //if nothing found get out of here! - if (count($temp_js) == 0) { - return false; - } - - // Write non-pipeline files out - if (!empty($this->js_no_pipeline)) { - file_put_contents($this->assets_dir . $inline_file, json_encode($this->js_no_pipeline)); - } - - // Concatenate files - $buffer = $this->gatherLinks($temp_js, JS_ASSET); - if ($this->js_minify) { - $minifier = new \MatthiasMullie\Minify\JS(); - $minifier->add($buffer); - $buffer = $minifier->minify(); - } - - // Write file - if (strlen(trim($buffer)) > 0) { - file_put_contents($this->assets_dir . $file, $buffer); - - if ($returnURL) { - return $relative_path . $this->getTimestamp(); - } - else { - return $buffer . "\n"; - } - } else { - return false; - } - } - - /** - * Return the array of all the registered CSS assets - * If a $key is provided, it will try to return only that asset - * else it will return null - * - * @param null|string $key the asset key - * @return array - */ - public function getCss($key = null) - { - if (!empty($key)) { - $asset_key = md5($key); - if (isset($this->css[$asset_key])) { - return $this->css[$asset_key]; - } else { - return null; - } - } - - return $this->css; - } - - /** - * Return the array of all the registered JS assets - * If a $key is provided, it will try to return only that asset - * else it will return null - * - * @param null|string $key the asset key - * @return array - */ - public function getJs($key = null) - { - if (!empty($key)) { - $asset_key = md5($key); - if (isset($this->js[$asset_key])) { - return $this->js[$asset_key]; - } else { - return null; - } - } - - return $this->js; - } - - /** - * Set the whole array of CSS assets - * - * @param $css - */ - public function setCss($css) - { - $this->css = $css; - } - - /** - * Set the whole array of JS assets - * - * @param $js - */ - public function setJs($js) - { - $this->js = $js; - } - - /** - * Removes an item from the CSS array if set - * - * @param string $key The asset key - */ - public function removeCss($key) - { - $asset_key = md5($key); - if (isset($this->css[$asset_key])) { - unset($this->css[$asset_key]); - } - } - - /** - * Removes an item from the JS array if set - * - * @param string $key The asset key - */ - public function removeJs($key) - { - $asset_key = md5($key); - if (isset($this->js[$asset_key])) { - unset($this->js[$asset_key]); - } - } - - /** - * Return the array of all the registered collections - * - * @return array - */ - public function getCollections() - { - return $this->collections; - } - - /** - * Set the array of collections explicitly - * - * @param $collections - */ - public function setCollection($collections) - { - $this->collections = $collections; - } - - /** - * Determines if an asset exists as a collection, CSS or JS reference - * - * @param $asset - * - * @return bool - */ - public function exists($asset) - { - if (isset($this->collections[$asset]) || isset($this->css[$asset]) || isset($this->js[$asset])) { - return true; - } else { - return false; - } - } - - /** - * Add/replace collection. - * - * @param string $collectionName - * @param array $assets - * @param bool $overwrite - * - * @return $this - */ - public function registerCollection($collectionName, Array $assets, $overwrite = false) - { - if ($overwrite || !isset($this->collections[$collectionName])) { - $this->collections[$collectionName] = $assets; - } - - return $this; - } - - /** - * Reset all assets. - * - * @return $this - */ - public function reset() - { - return $this->resetCss()->resetJs(); - } - - /** - * Reset JavaScript assets. - * - * @return $this - */ - public function resetJs() - { - $this->js = []; - $this->inline_js = []; - - return $this; - } - - /** - * Reset CSS assets. - * - * @return $this - */ - public function resetCss() - { - $this->css = []; - $this->inline_css = []; - - return $this; - } - - /** - * Add all JavaScript assets within $directory - * - * @param string $directory Relative to the Grav root path, or a stream identifier - * - * @return $this - */ - public function addDirJs($directory) - { - return $this->addDir($directory, self::JS_REGEX); - } - - /** - * Add all CSS assets within $directory - * - * @param string $directory Relative to the Grav root path, or a stream identifier - * - * @return $this - */ - public function addDirCss($directory) - { - return $this->addDir($directory, self::CSS_REGEX); - } - - /** - * Add all assets matching $pattern within $directory. - * - * @param string $directory Relative to the Grav root path, or a stream identifier - * @param string $pattern (regex) - * - * @return $this - * @throws Exception - */ - public function addDir($directory, $pattern = self::DEFAULT_REGEX) - { - $root_dir = rtrim(ROOT_DIR, '/'); - - // Check if $directory is a stream. - if (strpos($directory, '://')) { - $directory = Grav::instance()['locator']->findResource($directory, null); - } - - // Get files - $files = $this->rglob($root_dir . DIRECTORY_SEPARATOR . $directory, $pattern, $root_dir . '/'); - - // No luck? Nothing to do - if (!$files) { - return $this; - } - - // Add CSS files - if ($pattern === self::CSS_REGEX) { - foreach ($files as $file) { - $this->addCss($file); - } - - return $this; - } - - // Add JavaScript files - if ($pattern === self::JS_REGEX) { - foreach ($files as $file) { - $this->addJs($file); - } - - return $this; - } - - // Unknown pattern. - foreach ($files as $asset) { - $this->add($asset); - } - - return $this; - } - - /** - * Determine whether a link is local or remote. - * - * Understands both "http://" and "https://" as well as protocol agnostic links "//" - * - * @param string $link - * - * @return bool - */ - protected function isRemoteLink($link) - { - $base = Grav::instance()['uri']->rootUrl(true); - - // sanity check for local URLs with absolute URL's enabled - if (Utils::startsWith($link, $base)) { - return false; - } - - return ('http://' === substr($link, 0, 7) || 'https://' === substr($link, 0, 8) || '//' === substr($link, 0, - 2)); - } - - /** - * Build local links including grav asset shortcodes - * - * @param string $asset the asset string reference - * @param bool $absolute build absolute asset link - * - * @return string the final link url to the asset - */ - protected function buildLocalLink($asset, $absolute = false) - { - try { - $asset = Grav::instance()['locator']->findResource($asset, $absolute); - } catch (\Exception $e) { - } - - $uri = $absolute ? $asset : $this->base_url . ltrim($asset, '/'); - return $asset ? $uri : false; - } - - /** - * Get the last modification time of asset - * - * @param string $asset the asset string reference - * - * @return string the last modifcation time or false on error - */ - protected function getLastModificationTime($asset) - { - $file = GRAV_ROOT . $asset; - if (Grav::instance()['locator']->isStream($asset)) { - $file = $this->buildLocalLink($asset, true); - } - - return file_exists($file) ? filemtime($file) : false; - } - - /** - * Build an HTML attribute string from an array. - * - * @param array $attributes - * - * @return string - */ - protected function attributes(array $attributes) - { - $html = ''; - $no_key = ['loading']; - - foreach ($attributes as $key => $value) { - // For numeric keys we will assume that the key and the value are the same - // as this will convert HTML attributes such as "required" to a correct - // form like required="required" instead of using incorrect numerics. - if (is_numeric($key)) { - $key = $value; - } - if (is_array($value)) { - $value = implode(' ', $value); - } - - if (in_array($key, $no_key)) { - $element = htmlentities($value, ENT_QUOTES, 'UTF-8', false); - } else { - $element = $key . '="' . htmlentities($value, ENT_QUOTES, 'UTF-8', false) . '"'; - } - - $html .= ' ' . $element; - } - - return $html; - } - - /** - * Download and concatenate the content of several links. - * - * @param array $links - * @param bool $css - * - * @return string - */ - protected function gatherLinks(array $links, $css = true) - { - $buffer = ''; - - - foreach ($links as $asset) { - $relative_dir = ''; - $local = true; - - $link = $asset['asset']; - $relative_path = $link; - - if ($this->isRemoteLink($link)) { - $local = false; - if ('//' === substr($link, 0, 2)) { - $link = 'http:' . $link; - } - } else { - // Fix to remove relative dir if grav is in one - if (($this->base_url != '/') && (strpos($this->base_url, $link) == 0)) { - $base_url = '#' . preg_quote($this->base_url, '#') . '#'; - $relative_path = ltrim(preg_replace($base_url, '/', $link, 1), '/'); - } - - $relative_dir = dirname($relative_path); - $link = ROOT_DIR . $relative_path; - } - - $file = ($this->fetch_command instanceof Closure) ? @$this->fetch_command->__invoke($link) : @file_get_contents($link); - - // No file found, skip it... - if ($file === false) { - continue; - } - - // Double check last character being - if (!$css) { - $file = rtrim($file, ' ;') . ';'; - } - - // If this is CSS + the file is local + rewrite enabled - if ($css && $local && $this->css_rewrite) { - $file = $this->cssRewrite($file, $relative_dir); - } - - $file = rtrim($file) . PHP_EOL; - $buffer .= $file; - } - - // Pull out @imports and move to top - if ($css) { - $buffer = $this->moveImports($buffer); - } - - return $buffer; - } - - /** - * Finds relative CSS urls() and rewrites the URL with an absolute one - * - * @param string $file the css source file - * @param string $relative_path relative path to the css file - * - * @return mixed - */ - protected function cssRewrite($file, $relative_path) - { - // Strip any sourcemap comments - $file = preg_replace(self::CSS_SOURCEMAP_REGEX, '', $file); - - // Find any css url() elements, grab the URLs and calculate an absolute path - // Then replace the old url with the new one - $file = preg_replace_callback(self::CSS_URL_REGEX, function ($matches) use ($relative_path) { - - $old_url = $matches[2]; - - // Ensure link is not rooted to webserver, a data URL, or to a remote host - if (Utils::startsWith($old_url, '/') || Utils::startsWith($old_url, 'data:') || $this->isRemoteLink($old_url)) { - return $matches[0]; - } - - $new_url = $this->base_url . ltrim(Utils::normalizePath($relative_path . '/' . $old_url), '/'); - - return str_replace($old_url, $new_url, $matches[0]); - }, $file); - - return $file; - } - - /** - * Moves @import statements to the top of the file per the CSS specification - * - * @param string $file the file containing the combined CSS files - * - * @return string the modified file with any @imports at the top of the file - */ - protected function moveImports($file) - { - $this->imports = []; - - $file = preg_replace_callback(self::CSS_IMPORT_REGEX, function ($matches) { - $this->imports[] = $matches[0]; - - return ''; - }, $file); - - return implode("\n", $this->imports) . "\n\n" . $file; - } - - /** - * Recursively get files matching $pattern within $directory. - * - * @param string $directory - * @param string $pattern (regex) - * @param string $ltrim Will be trimmed from the left of the file path - * - * @return array - */ - protected function rglob($directory, $pattern, $ltrim = null) - { - $iterator = new RegexIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, - FilesystemIterator::SKIP_DOTS)), $pattern); - $offset = strlen($ltrim); - $files = []; - - foreach ($iterator as $file) { - $files[] = substr($file->getPathname(), $offset); - } - - return $files; - } - - /** - * Sets the state of CSS Pipeline - * - * @param boolean $value - */ - public function setCssPipeline($value) - { - $this->css_pipeline = (bool)$value; - } - - /** - * Sets the state of JS Pipeline - * - * @param boolean $value - */ - public function setJsPipeline($value) - { - $this->js_pipeline = (bool)$value; - } - - /** - * Explicitly set's a timestamp for assets - * - * @param $value - */ - public function setTimestamp($value) - { - $this->timestamp = $value; - } - - /** - * Get the timestamp for assets - * - * @return string - */ - public function getTimestamp($include_join = true) - { - if ($this->timestamp) { - $timestamp = $include_join ? '?' . $this->timestamp : $this->timestamp; - return $timestamp; - } - return; - } - - /** - * - * - * @param $asset - * @return string - */ - public function getQuerystring($asset) - { - $querystring = ''; - - if (!empty($asset['query'])) { - if (Utils::contains($asset['asset'], '?')) { - $querystring .= '&' . $asset['query']; - } else { - $querystring .= '?' . $asset['query']; - } - } - - if ($this->timestamp) { - if (Utils::contains($asset['asset'], '?') || $querystring) { - $querystring .= '&' . $this->timestamp; - } else { - $querystring .= '?' . $this->timestamp; - } - } - - return $querystring; - } - - /** - * @return string - */ - public function __toString() - { - return ''; - } - - /** - * @param $a - * @param $b - * - * @return mixed - */ - protected function sortAssetsByPriorityThenOrder($a, $b) - { - if ($a['priority'] == $b['priority']) { - return $a['order'] - $b['order']; - } - - return $b['priority'] - $a['priority']; - } - -}