/** * @param $path String target path * @return \Assetic\Filter\FileAsset */ public function asset($opts = array()) { $asset = new FileAsset($this->real_path); $ext = strtolower(substr($this->real_path, strrpos($this->real_path, '.'))); if (in_array($ext, array('.css', '.scss'))) { //il faut rajouter la méthode asset-url $scss = new ScssphpFilter(); if (isset($opts['compass']) && $opts['compass']) { $scss->enableCompass(true); } $scss->registerFunction('aphet_url', function ($args, $scss) { if ($args[0][0] === 'string') { $url = is_array($args[0][2][0]) ? $args[0][2][0][2][0] : $args[0][2][0]; } else { throw new \Exception('je ne sais pas quoi faire là'); } if (strpos($url, '?') !== false) { list($url, $query) = explode('?', $url); } else { $query = null; } if (strpos($url, '#') !== false) { list($url, $hash) = explode('#', $url); } else { $hash = null; } return 'url(' . aphet_url($url) . ($query ? "?{$query}" : '') . ($hash ? "?{$hash}" : '') . ')'; }); $asset->ensureFilter($scss); } elseif ($ext === '.js') { $filter = new \Assetic\Filter\CallablesFilter(function ($asset) { $asset->setContent(preg_replace_callback('/aphet_url\\((.*)\\)/', function ($match) { return '\'' . aphet_url(json_decode($match[1])) . '\''; }, $asset->getContent())); }); $asset->ensureFilter($filter); } return $asset; }
public function filterDump(AssetInterface $asset) { $sourceBase = $asset->getSourceRoot(); $sourcePath = $asset->getSourcePath(); $targetPath = $asset->getTargetPath(); $sourceDir = $asset->getSourceDirectory(); if (null === $sourcePath || null === $targetPath || $sourcePath == $targetPath) { return; } // learn how to get from the target back to the source if (false !== strpos($sourceBase, '://')) { list($scheme, $url) = explode('://', $sourceBase . '/' . $sourcePath, 2); list($host, $path) = explode('/', $url, 2); $host = $scheme . '://' . $host . '/'; $path = false === strpos($path, '/') ? '' : dirname($path); $path .= '/'; } else { // assume source and target are on the same host $host = ''; // pop entries off the target until it fits in the source if ('.' == dirname($sourcePath)) { $path = str_repeat('../', substr_count($targetPath, '/')); } elseif ('.' == ($targetDir = dirname($targetPath))) { $path = dirname($sourcePath) . '/'; } else { $path = ''; while (0 !== strpos($sourcePath, $targetDir)) { if (false !== ($pos = strrpos($targetDir, '/'))) { $targetDir = substr($targetDir, 0, $pos); $path .= '../'; } else { $targetDir = ''; $path .= '../'; break; } } $path .= ltrim(substr(dirname($sourcePath) . '/', strlen($targetDir)), '/'); } } $content = $this->filterReferences($asset->getContent(), function ($matches) use($sourceDir, $host) { $path = $sourceDir; if (false !== strpos($matches['url'], '://') || 0 === strpos($matches['url'], '//') || 0 === strpos($matches['url'], 'data:')) { // absolute or protocol-relative or data uri return $matches[0]; } if (isset($matches['url'][0]) && '/' == $matches['url'][0]) { // root relative return str_replace($matches['url'], $host . $matches['url'], $matches[0]); } // document relative $url = $matches['url']; while (0 === strpos($url, '../') && 2 <= substr_count($path, '/')) { $path = substr($path, 0, strrpos(rtrim($path, '/'), '/') + 1); $url = substr($url, 3); } $originalAsset = $path . $url; $originalAsset = reset(preg_split("/[#?]/", $originalAsset)); $rootDir = $this->kernel->getRootDir(); $rootDir = substr($rootDir, 0, -3); $relativeAsset = substr($originalAsset, strlen($rootDir)); $assetName = $this->assetFactory->generateAssetName($relativeAsset); $targetAssetPath = $rootDir . 'web/' . $url; $targetParts = explode('/', $targetAssetPath); $fileName = $assetName . '_' . array_pop($targetParts); array_push($targetParts, $fileName); $targetAssetPath = implode('/', $targetParts); $targetAssetPath = reset(preg_split("/[#?]/", $targetAssetPath)); $urlParts = explode('/', $matches['url']); array_pop($urlParts); array_push($urlParts, $fileName); $urlNew = implode('/', $urlParts); if (!is_dir($dir = dirname($targetAssetPath))) { if (false === @mkdir($dir, 0777, true)) { throw new \RuntimeException('Unable to create directory ' . $dir); } } $asset = new FileAsset($originalAsset); try { $contents = $asset->dump(); } catch (\Exception $e) { echo 'WARNING: ' . $e->getMessage(); } if (false === @file_put_contents($targetAssetPath, $contents)) { throw new \RuntimeException('Unable to write file ' . $targetAssetPath); } $result = str_replace($matches['url'], $urlNew, $matches[0]); return $result; }); $asset->setContent($content); }