public function testExternalSource()
 {
     $asset = new StringAsset('body { background: url(../images/bg.gif); }', array(), 'http://www.example.com', 'css/main.css');
     $asset->setTargetPath('css/packed/main.css');
     $asset->load();
     $filter = new CssRewriteFilter();
     $filter->filterDump($asset);
     $this->assertContains('http://www.example.com/css/../images/bg.gif', $asset->getContent(), '->filterDump() rewrites references in external stylesheets');
 }
 /**
  * @dataProvider provideUrls
  */
 public function testUrls($before, $after)
 {
     $asset = new StringAsset($before, array(), null, '.');
     $asset->setTargetPath('.');
     $asset->load();
     $filter = new CachebusterFilter('v=bar');
     $filter->filterDump($asset);
     $this->assertEquals($after, $asset->getContent());
 }
 public function testEmptyUrl()
 {
     $asset = new StringAsset('body { background: url(); }', array(), 'http://www.example.com', 'css/main.css');
     $asset->setTargetPath('css/packed/main.css');
     $asset->load();
     $filter = new CssRewriteFilter();
     $filter->filterDump($asset);
     // no error is thrown
 }
 /**
  * @dataProvider provideMultipleUrls
  */
 public function testMultipleUrls($format, $sourcePath, $targetPath, $inputUrl1, $inputUrl2, $expectedUrl1, $expectedUrl2)
 {
     $asset = new StringAsset(sprintf($format, $inputUrl1, $inputUrl2), array(), null, $sourcePath);
     $asset->setTargetPath($targetPath);
     $asset->load();
     $filter = new CssRewriteFilter();
     $filter->filterLoad($asset);
     $filter->filterDump($asset);
     $this->assertEquals(sprintf($format, $expectedUrl1, $expectedUrl2), $asset->getContent(), '->filterDump() rewrites relative urls');
 }
 public function testSimple()
 {
     $directory = $this->getMockBuilder('Alex\\AsseticExtraBundle\\Assetic\\Util\\AssetDirectory')->disableOriginalConstructor()->getMock();
     $directory->expects($this->any())->method('getTarget')->will($this->returnValue('assets'));
     $directory->expects($this->once())->method('add')->with('images/foo.png')->will($this->returnValue('assets/foo.png'));
     $filter = new AssetDirectoryFilter($directory);
     $asset = new StringAsset('body { background: url("../images/foo.png"); }', array($filter), null, 'css/main.css');
     $asset->setTargetPath('css/main.css');
     $asset->load();
     $filter->filterLoad($asset);
     $filter->filterDump($asset);
     $this->assertEquals('body { background: url("../assets/foo.png"); }', $asset->getContent(), 'AssetDirectoryFilter filters URL');
 }
 /**
  * @param string $content
  * @param string $filename
  * @return StringAsset
  */
 private function getStringAsset($content, $filename)
 {
     $asset = new StringAsset($content);
     $asset->setTargetPath($filename);
     return $asset;
 }
 private function createSimpleTestAsset()
 {
     $asset = new StringAsset('.hidden {display: none;}');
     $asset->setTargetPath('base.css');
     return $asset;
 }
Beispiel #8
0
 public function processFile($path, $config = [])
 {
     $rel = b::param('rel', false, $config);
     $url = b::param('url', false, $config);
     $useGlobalFilters = b::param('useGlobalFilters', true, $config);
     // get the file
     $file = $this->getFile($path);
     $root = pathinfo($path)['dirname'];
     $ext = pathinfo($path)['extension'];
     // get it's tree
     $content = $file->getContent();
     if (empty($content)) {
         return $content;
     }
     $inc = [];
     // parse the string
     $found = $this->parseString($content, $root);
     if (b::param('filterOnly', false, $config) === 'true') {
         $found = ['filter' => $found['filter']];
     }
     $tree = $this->getCombinedTree($found, $ext);
     $reduce = function ($items, $reduce) {
         $resp = [];
         foreach ($items as $key => $files) {
             $resp[] = $key;
             $resp += $reduce($files, $reduce);
         }
         return $resp;
     };
     // loop through each file and append
     foreach (array_unique($reduce($tree, $reduce)) as $f) {
         if ($f === $path) {
             continue;
         }
         $inc[] = $this->processFile($f);
     }
     $source = false;
     $sourcePath = false;
     $targetPath = false;
     if ($url) {
         $parts = parse_url($url);
         $source = "{$parts['scheme']}://{$parts['host']}";
         $targetPath = trim($parts['path'], '/');
         $sourcePath = $targetPath . '/' . trim($rel, '/');
     }
     $inc[] = $content;
     $a = new StringAsset(implode("\n", $inc), [], $source, $sourcePath);
     if ($targetPath) {
         $a->setTargetPath($targetPath);
     }
     // use filters
     if ($useGlobalFilters !== false) {
         if (array_key_exists($ext, $this->_filters)) {
             foreach ($this->_filters[$ext] as $filter) {
                 if ($filter[1] === false and b::env() === 'dev') {
                     continue;
                 }
                 $a->ensureFilter(new $filter[0]());
             }
         }
         foreach ($this->_filters['*'] as $filter) {
             if ($filter[1] === false and b::env() === 'dev') {
                 continue;
             }
             $a->ensureFilter(new $filter[0]());
         }
     }
     $a->ensureFilter(new CssRewriteFilter());
     return trim($a->dump());
 }
 /**
  * Filter resource.
  *
  * Filter resource, applying filters and saving output into output location.
  *
  * @param ResourceInterface $resource Resource to filter.
  * @return ResourceInterface Resulting filtered resources.
  */
 private function filterResource(ResourceInterface $resource, array $filters)
 {
     if ($resource instanceof FileResource) {
         $asset = new FileAsset($resource->getSource(), $filters);
     } elseif ($resource instanceof HttpResource) {
         $asset = new HttpAsset($resource->getSource(), $filters);
     } elseif ($resource instanceof StringResource) {
         $asset = new StringAsset($resource->getSource(), $filters, $resource->getSourceRoot());
     } else {
         throw new InvalidArgumentException(sprintf('Instance of "%s" expected, "%s" given.', implode('", "', array('RunOpenCode\\AssetsInjection\\Resource\\FileResource', 'RunOpenCode\\AssetsInjection\\Resource\\HttpResource', 'RunOpenCode\\AssetsInjection\\Resource\\StringResource')), get_class($resource)));
     }
     $asset->setTargetPath($this->calculateTargetFilename($resource));
     $path = sprintf('%s%s%s', $this->options['output_dir'], DIRECTORY_SEPARATOR, $asset->getTargetPath());
     if (!file_exists($path) || filectime($path) !== $resource->getLastModified()) {
         $this->assetWriter->writeAsset($asset);
         touch($path, $resource->getLastModified() ? $resource->getLastModified() : time());
     }
     return new FileResource($path);
 }
Beispiel #10
0
 public function run()
 {
     /** @var RenderModeDeterminer $renderModeDeterminer */
     $renderModeDeterminer = $GLOBALS['container']['theme-plus-render-mode-determiner'];
     $renderMode = $renderModeDeterminer->determineMode();
     if (RenderMode::DESIGN == $renderMode) {
         $user = FrontendUser::getInstance();
         $user->authenticate();
         /** @var DeveloperTool $developerTool */
         $developerTool = $GLOBALS['container']['theme-plus-developer-tools'];
         $pathInfo = \Environment::get('pathInfo');
         list($type, $id) = explode('/', substr($pathInfo, 1));
         // output headers
         header("Cache-Control: public");
         switch ($type) {
             case 'css':
                 header('Content-Type: text/css; charset=utf-8');
                 break;
             case 'js':
                 header('Content-Type: text/javascript; charset=utf-8');
                 break;
         }
         if (isset($_SESSION['THEME_PLUS_ASSETS'][$id])) {
             $session = unserialize($_SESSION['THEME_PLUS_ASSETS'][$id]);
             // load asset from session
             /** @var AssetInterface $asset */
             $asset = $session->asset;
             /** @var AssetInterface $cache */
             $cache = $session->cache;
             if (false && $cache && $cache->getLastModified() >= $asset->getLastModified()) {
                 header('X-Theme-Plus-Rendering: cached');
                 echo $cache->getContent();
                 ob_flush();
                 return;
             }
             header('X-Theme-Plus-Rendering: live');
             // load page from session
             $GLOBALS['objPage'] = $page = \PageModel::findWithDetails($session->page);
             /** @var AsseticFactory $asseticFactory */
             $asseticFactory = $GLOBALS['container']['assetic.factory'];
             // default filter
             $defaultFilters = $asseticFactory->createFilterOrChain($page->layout->asseticStylesheetFilter, true);
             // remove css rewrite filter
             foreach ($defaultFilters as $index => $filter) {
                 if ($filter instanceof CssRewriteFilter) {
                     unset($defaultFilters[$index]);
                 }
             }
             // update the target path
             $asset->setTargetPath('assets/theme-plus/proxy.php/:type/:id/:name');
             // create debug informations
             $buffer = '/*' . PHP_EOL;
             $buffer .= ' * DEBUG' . PHP_EOL;
             $buffer .= $developerTool->getAssetDebugString($asset, ' * ') . PHP_EOL;
             $buffer .= ' * END' . PHP_EOL;
             $buffer .= ' */' . PHP_EOL . PHP_EOL;
             // dump the asset
             $buffer .= $asset->dump($defaultFilters);
             $cachedAsset = new StringAsset($buffer, [], $asset->getSourceRoot(), $asset->getSourcePath());
             $cachedAsset->setTargetPath($asset->getTargetPath());
             $cachedAsset->setLastModified($asset->getLastModified());
             $cachedAsset->load();
             $session->cache = $cachedAsset;
             $_SESSION['THEME_PLUS_ASSETS'][$id] = serialize($session);
             // update advanced asset cache meta
             if (!$GLOBALS['TL_CONFIG']['theme_plus_disabled_advanced_asset_caching']) {
                 /** @var Cache $cache */
                 $cache = $GLOBALS['container']['theme-plus-assets-cache'];
                 $latestTimestamp = $cache->fetch(ThemePlus::CACHE_LATEST_ASSET_TIMESTAMP);
                 if (!$latestTimestamp || $latestTimestamp < $asset->getLastModified()) {
                     $cache->save(ThemePlus::CACHE_LATEST_ASSET_TIMESTAMP, $asset->getLastModified());
                 }
             }
             echo $buffer;
             ob_flush();
             return;
         }
     }
     header('HTTP/1.1 403 Forbidden');
     header('Status: 403 Forbidden');
     header('Content-Type: text/plain; charset=UTF-8');
     echo '403 Forbidden';
 }