vendor/assetic/src/Assetic/Factory/AssetFactory.php
author ymh <ymh.work@gmail.com>
Sun, 06 Nov 2011 23:44:37 +0100
changeset 27 1df556b2c0f9
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
Correct memory problem
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Assetic package, an OpenSky project.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) 2010-2011 OpenSky Project Inc
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Assetic\Factory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Assetic\Asset\AssetCollection;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
use Assetic\Asset\AssetInterface;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
use Assetic\Asset\AssetReference;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
use Assetic\Asset\FileAsset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
use Assetic\Asset\GlobAsset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
use Assetic\Asset\HttpAsset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
use Assetic\AssetManager;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
use Assetic\Factory\Worker\WorkerInterface;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
use Assetic\FilterManager;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
 * The asset factory creates asset objects.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
 * @author Kris Wallsmith <kris.wallsmith@gmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
class AssetFactory
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    private $root;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    private $debug;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    private $output;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    private $workers;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    private $am;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    private $fm;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
     * Constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
     * @param string  $root   The default root directory
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
     * @param string  $output The default output string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
     * @param Boolean $debug  Filters prefixed with a "?" will be omitted in debug mode
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    public function __construct($root, $debug = false)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        $this->root    = rtrim($root, '/');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        $this->debug   = $debug;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        $this->output  = 'assetic/*';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        $this->workers = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     * Sets debug mode for the current factory.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
     * @param Boolean $debug Debug mode
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    public function setDebug($debug)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        $this->debug = $debug;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
     * Checks if the factory is in debug mode.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     * @return Boolean Debug mode
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    public function isDebug()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        return $this->debug;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
     * Sets the default output string.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
     * @param string $output The default output string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    public function setDefaultOutput($output)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        $this->output = $output;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
     * Adds a factory worker.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
     * @param WorkerInterface $worker A worker
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    public function addWorker(WorkerInterface $worker)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        $this->workers[] = $worker;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
     * Returns the current asset manager.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
     * @return AssetManager|null The asset manager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    public function getAssetManager()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        return $this->am;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
     * Sets the asset manager to use when creating asset references.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
     * @param AssetManager $am The asset manager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    public function setAssetManager(AssetManager $am)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        $this->am = $am;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
     * Returns the current filter manager.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
     * @return FilterManager|null The filter manager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    public function getFilterManager()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        return $this->fm;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
     * Sets the filter manager to use when adding filters.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
     * @param FilterManager $fm The filter manager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    public function setFilterManager(FilterManager $fm)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        $this->fm = $fm;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
     * Creates a new asset.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
     * Prefixing a filter name with a question mark will cause it to be
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
     * omitted when the factory is in debug mode.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
     * Available options:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
     *  * output: An output string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
     *  * name:   An asset name for interpolation in output patterns
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
     *  * debug:  Forces debug mode on or off for this asset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
     *  * root:   An array or string of more root directories
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
     * @param array|string $inputs  An array of input strings
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
     * @param array|string $filters An array of filter names
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
     * @param array        $options An array of options
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
     * @return AssetCollection An asset collection
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    public function createAsset($inputs = array(), $filters = array(), array $options = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
        if (!is_array($inputs)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
            $inputs = array($inputs);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
        if (!is_array($filters)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
            $filters = array($filters);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
        if (!isset($options['output'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
            $options['output'] = $this->output;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
        if (!isset($options['name'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
            $options['name'] = $this->generateAssetName($inputs, $filters, $options);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
        if (!isset($options['debug'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
            $options['debug'] = $this->debug;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
        if (!isset($options['root'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
            $options['root'] = array($this->root);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
            if (!is_array($options['root'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
                $options['root'] = array($options['root']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
            $options['root'][] = $this->root;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
        $asset = $this->createAssetCollection();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
        $extensions = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
        // inner assets
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
        foreach ($inputs as $input) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
            if (is_array($input)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
                // nested formula
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
                $asset->add(call_user_func_array(array($this, 'createAsset'), $input));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
                $asset->add($this->parseInput($input, $options));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
                $extensions[pathinfo($input, PATHINFO_EXTENSION)] = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
        // filters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
        foreach ($filters as $filter) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
            if ('?' != $filter[0]) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
                $asset->ensureFilter($this->getFilter($filter));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
            } elseif (!$options['debug']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
                $asset->ensureFilter($this->getFilter(substr($filter, 1)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
        // append consensus extension if missing
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
        if (1 == count($extensions) && !pathinfo($options['output'], PATHINFO_EXTENSION) && $extension = key($extensions)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
            $options['output'] .= '.'.$extension;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
        // output --> target url
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
        $asset->setTargetPath(str_replace('*', $options['name'], $options['output']));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
        // apply workers
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
        $this->processAsset($asset);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        return $asset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
    public function generateAssetName($inputs, $filters, $options = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
        foreach (array_diff(array_keys($options), array('output', 'debug', 'root')) as $key) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
            unset($options[$key]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
        ksort($options);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        return substr(sha1(serialize($inputs).serialize($filters).serialize($options)), 0, 7);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
     * Parses an input string string into an asset.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
     * The input string can be one of the following:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
     *  * A reference:     If the string starts with an "at" sign it will be interpreted as a reference to an asset in the asset manager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
     *  * An absolute URL: If the string contains "://" or starts with "//" it will be interpreted as an HTTP asset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
     *  * A glob:          If the string contains a "*" it will be interpreted as a glob
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
     *  * A path:          Otherwise the string is interpreted as a filesystem path
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
     * Both globs and paths will be absolutized using the current root directory.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
     * @param string $input   An input string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
     * @param array  $options An array of options
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
     * @return AssetInterface An asset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
    protected function parseInput($input, array $options = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
        if ('@' == $input[0]) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
            return $this->createAssetReference(substr($input, 1));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
        if (false !== strpos($input, '://') || 0 === strpos($input, '//')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
            return $this->createHttpAsset($input);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
        if (self::isAbsolutePath($input)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
            if ($root = self::findRootDir($input, $options['root'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
                $path = ltrim(substr($input, strlen($root)), '/');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
                $path = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
            $root  = $this->root;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
            $path  = $input;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
            $input = $this->root.'/'.$path;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        if (false !== strpos($input, '*')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
            return $this->createGlobAsset($input, $root);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
            return $this->createFileAsset($input, $root, $path);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
    protected function createAssetCollection()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
        return new AssetCollection();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    protected function createAssetReference($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
        if (!$this->am) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
            throw new \LogicException('There is no asset manager.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
        return new AssetReference($this->am, $name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
    protected function createHttpAsset($sourceUrl)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
        return new HttpAsset($sourceUrl);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
    protected function createGlobAsset($glob, $root = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
        return new GlobAsset($glob, array(), $root);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
    protected function createFileAsset($source, $root = null, $path = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
        return new FileAsset($source, array(), $root, $path);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    protected function getFilter($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
        if (!$this->fm) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
            throw new \LogicException('There is no filter manager.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
        return $this->fm->get($name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
     * Filters an asset through the factory workers.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
     * Each leaf asset will be processed first if the asset is traversable,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
     * followed by the asset itself.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
     * @param AssetInterface $asset An asset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
    private function processAsset(AssetInterface $asset)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
        if ($asset instanceof \Traversable) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
            foreach ($asset as $leaf) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
                foreach ($this->workers as $worker) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
                    $worker->process($leaf);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
        foreach ($this->workers as $worker) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
            $worker->process($asset);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
    static private function isAbsolutePath($path)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
        return '/' == $path[0] || '\\' == $path[0] || (3 < strlen($path) && ctype_alpha($path[0]) && $path[1] == ':' && ('\\' == $path[2] || '/' == $path[2]));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
     * Loops through the root directories and returns the first match.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
     * @param string $path  An absolute path
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
     * @param array  $roots An array of root directories
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
     * @return string|null The matching root directory, if found
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
    static private function findRootDir($path, array $roots)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
        foreach ($roots as $root) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
            if (0 === strpos($path, $root)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
                return $root;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
}