type = $this->extension = $type; if (preg_match('/^\w:/', $path) || strpos($path, '/') === 0) { $path = str_replace('\\', '/', $path); foreach ($this->assets_paths() as $asset_path) { if (strpos($path, $asset_path) === 0) { $this->baseDir = $asset_path; $path = substr($path, strlen($asset_path) + 1); break; } } } $subDirs = explode('/', str_replace('\\', '/', dirname($path))); $parseExt = $path; while ($ext != $this->type) { $this->extensions[] = $ext; $parseExt = substr($parseExt, 0, (strlen($ext) + 1) * -1); $ext = pathinfo($parseExt, PATHINFO_EXTENSION); if (!$ext) { throw new Exception\InvalidArgumentException( sprintf( "Asset of type %s doesn't have the corresponding extension: %s", $this->type, $path ) ); } } $fileRoot = pathinfo($parseExt, PATHINFO_FILENAME); $this->subDirs = $subDirs; $this->fileRoot = $fileRoot; $this->validate_subdirs(); } public function base_dir($baseDir = null) { if ($baseDir) $this->baseDir = str_replace('\\', '/', $baseDir); else return $this->baseDir; } /** * Relative dir (relative to assets paths). */ public function relative_dir() { return implode('/', $this->subDirs); } public function full_dir() { $relativeDir = $this->relative_dir(); if ($relativeDir) { $relativeDir = '/' . $relativeDir; } return $this->baseDir . $relativeDir; } public function relative_path() { $full_path = implode('/', $this->subDirs) . '/' . $this->fileRoot . '.' . $this->extension; if ($this->extensions) { $full_path .= '.' . implode('.', array_reverse($this->extensions)); } return ltrim($full_path, '/'); } public function full_path() { return $this->baseDir . '/' . $this->relative_path(); } /** * Full path except file extension */ public function full_file_root_path() { $subDirs = implode('/', $this->subDirs); if ($subDirs) { $subDirs .= '/'; } return $this->baseDir . '/' . $subDirs . $this->fileRoot; } /** * Sub dirs + file root */ public function relative_file_root_path() { $subDirs = implode('/', $this->subDirs); if ($subDirs) { $subDirs .= '/'; } return $subDirs . $this->fileRoot; } public function sub_dirs() { return $this->subDirs; } public function file_root() { return $this->fileRoot; } public function extension() { return $this->extension; } public function extensions() { return $this->extensions; } public function type() { return $this->type; } /** * Creates a file "familiar": another asset file of the same type, * whose baseDir is unknown. */ public function familiar($file_path) { $dirs = explode('/', $file_path); $new_file_root = array_pop($dirs); array_unshift($dirs, reset($this->subDirs)); $file = new static($this->type); $file->subDirs = $dirs; $file->fileRoot = $new_file_root; $file->extension = $this->extension; return $file; } public function url($basePath = null, $prefix = null) { if (null === $basePath) { $basePath = Rails::assets()->base_path(); } if (null === $prefix) { $prefix = Rails::assets()->prefix(); } return $basePath . $prefix . '/' . $this->relative_file_root_path() . '.' . $this->type; } protected function assets_paths() { return Rails::assets()->paths(); } protected function validate_subdirs() { $subDirs = []; foreach ($this->subDirs as $sd) { if (preg_match('/^[\w-]+$/', $sd)) $subDirs[] = $sd; } $this->subDirs = $subDirs; } }