vendor/assetic/src/Assetic/Factory/Resource/DirectoryResource.php
author ymh <ymh.work@gmail.com>
Fri, 18 Nov 2011 17:54:18 +0100
changeset 38 bbdc7f9aa25e
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
Added tag V00.01 for changeset c67bc03ec09c
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\Resource;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * A resource is something formulae can be loaded from.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * @author Kris Wallsmith <kris.wallsmith@gmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
class DirectoryResource implements IteratorResourceInterface
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    private $path;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    private $pattern;
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
     * Constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
     * @param string $path    A directory path
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
     * @param string $pattern A filename pattern
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    public function __construct($path, $pattern = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
        if (DIRECTORY_SEPARATOR != substr($path, -1)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
            $path .= DIRECTORY_SEPARATOR;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
        $this->path = $path;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        $this->pattern = $pattern;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    public function isFresh($timestamp)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        if (!is_dir($this->path) || filemtime($this->path) > $timestamp) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
            return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        foreach ($this as $resource) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            if (!$resource->isFresh($timestamp)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
                return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        return true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
     * Returns the combined content of all inner resources.
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 getContent()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        $content = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        foreach ($this as $resource) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
            $content[] = $resource->getContent();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        return implode("\n", $content);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
    }
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 __toString()
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->path;
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
    public function getIterator()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
        return is_dir($this->path)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            ? new DirectoryResourceIterator($this->getInnerIterator())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
            : new \EmptyIterator();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    protected function getInnerIterator()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        return new DirectoryResourceFilterIterator(new \RecursiveDirectoryIterator($this->path), $this->pattern);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
 * An iterator that converts file objects into file resources.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
 * @author Kris Wallsmith <kris.wallsmith@gmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
 * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
class DirectoryResourceIterator extends \RecursiveIteratorIterator
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    public function current()
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 new FileResource(parent::current()->getPathname());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
 * Filters files by a basename pattern.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
 * @author Kris Wallsmith <kris.wallsmith@gmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
 * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
class DirectoryResourceFilterIterator extends \RecursiveFilterIterator
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    protected $pattern;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    public function __construct(\RecursiveDirectoryIterator $iterator, $pattern = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        parent::__construct($iterator);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
        $this->pattern = $pattern;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    public function accept()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        $file = $this->current();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        $name = $file->getBasename();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        if ($file->isDir()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
            return '.' != $name[0];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
            return null === $this->pattern || 0 < preg_match($this->pattern, $name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    public function getChildren()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
        return new self(new \RecursiveDirectoryIterator($this->current()->getPathname()), $this->pattern);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
}