1<?php
2
3/*
4 * This file is part of the Assetic package, an OpenSky project.
5 *
6 * (c) 2010-2014 OpenSky Project Inc
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Assetic;
13
14use Assetic\Asset\AssetInterface;
15use Assetic\Util\VarUtils;
16
17/**
18 * Writes assets to the filesystem.
19 *
20 * @author Kris Wallsmith <kris.wallsmith@gmail.com>
21 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
22 */
23class AssetWriter
24{
25    private $dir;
26    private $values;
27
28    /**
29     * Constructor.
30     *
31     * @param string $dir    The base web directory
32     * @param array  $values Variable values
33     *
34     * @throws \InvalidArgumentException if a variable value is not a string
35     */
36    public function __construct($dir, array $values = array())
37    {
38        foreach ($values as $var => $vals) {
39            foreach ($vals as $value) {
40                if (!is_string($value)) {
41                    throw new \InvalidArgumentException(sprintf('All variable values must be strings, but got %s for variable "%s".', json_encode($value), $var));
42                }
43            }
44        }
45
46        $this->dir = $dir;
47        $this->values = $values;
48    }
49
50    public function writeManagerAssets(AssetManager $am)
51    {
52        foreach ($am->getNames() as $name) {
53            $this->writeAsset($am->get($name));
54        }
55    }
56
57    public function writeAsset(AssetInterface $asset)
58    {
59        foreach (VarUtils::getCombinations($asset->getVars(), $this->values) as $combination) {
60            $asset->setValues($combination);
61
62            static::write(
63                $this->dir.'/'.VarUtils::resolve(
64                    $asset->getTargetPath(),
65                    $asset->getVars(),
66                    $asset->getValues()
67                ),
68                $asset->dump()
69            );
70        }
71    }
72
73    protected static function write($path, $contents)
74    {
75        if (!is_dir($dir = dirname($path)) && false === @mkdir($dir, 0777, true)) {
76            throw new \RuntimeException('Unable to create directory '.$dir);
77        }
78
79        if (false === @file_put_contents($path, $contents)) {
80            throw new \RuntimeException('Unable to write file '.$path);
81        }
82    }
83
84    /**
85     * Not used.
86     *
87     * This method is provided for backward compatibility with certain versions
88     * of AsseticBundle.
89     */
90    private function getCombinations(array $vars)
91    {
92        return VarUtils::getCombinations($vars, $this->values);
93    }
94}
95