134 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
| * @package     FrameworkOnFramework
 | |
| * @subpackage  platform
 | |
|  * @copyright   Copyright (C) 2010-2016 Nicholas K. Dionysopoulos / Akeeba Ltd. All rights reserved.
 | |
| * @license     GNU General Public License version 2 or later; see LICENSE.txt
 | |
| */
 | |
| // Protect from unauthorized access
 | |
| defined('F0F_INCLUDED') or die;
 | |
| 
 | |
| abstract class F0FPlatformFilesystem implements F0FPlatformFilesystemInterface
 | |
| {
 | |
|     /**
 | |
|      * The list of paths where platform class files will be looked for
 | |
|      *
 | |
|      * @var  array
 | |
|      */
 | |
|     protected static $paths = array();
 | |
| 
 | |
|     /**
 | |
|      * This method will crawl a starting directory and get all the valid files that will be analyzed by getInstance.
 | |
|      * Then it organizes them into an associative array.
 | |
|      *
 | |
|      * @param   string  $path               Folder where we should start looking
 | |
|      * @param   array   $ignoreFolders      Folder ignore list
 | |
|      * @param   array   $ignoreFiles        File ignore list
 | |
|      *
 | |
|      * @return  array   Associative array, where the `fullpath` key contains the path to the file,
 | |
|      *                  and the `classname` key contains the name of the class
 | |
|      */
 | |
|     protected static function getFiles($path, array $ignoreFolders = array(), array $ignoreFiles = array())
 | |
|     {
 | |
|         $return = array();
 | |
| 
 | |
|         $files  = self::scanDirectory($path, $ignoreFolders, $ignoreFiles);
 | |
| 
 | |
|         // Ok, I got the files, now I have to organize them
 | |
|         foreach($files as $file)
 | |
|         {
 | |
|             $clean = str_replace($path, '', $file);
 | |
|             $clean = trim(str_replace('\\', '/', $clean), '/');
 | |
| 
 | |
|             $parts = explode('/', $clean);
 | |
| 
 | |
|             // If I have less than 3 fragments, it means that the file was inside the generic folder
 | |
|             // (interface + abstract) so I have to skip it
 | |
|             if(count($parts) < 3)
 | |
|             {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             $return[] = array(
 | |
|                 'fullpath'  => $file,
 | |
|                 'classname' => 'F0FPlatform'.ucfirst($parts[0]).ucfirst(basename($parts[1], '.php'))
 | |
|             );
 | |
|         }
 | |
| 
 | |
|         return $return;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Recursive function that will scan every directory unless it's in the ignore list. Files that aren't in the
 | |
|      * ignore list are returned.
 | |
|      *
 | |
|      * @param   string  $path               Folder where we should start looking
 | |
|      * @param   array   $ignoreFolders      Folder ignore list
 | |
|      * @param   array   $ignoreFiles        File ignore list
 | |
|      *
 | |
|      * @return  array   List of all the files
 | |
|      */
 | |
|     protected static function scanDirectory($path, array $ignoreFolders = array(), array $ignoreFiles = array())
 | |
|     {
 | |
|         $return = array();
 | |
| 
 | |
|         $handle = @opendir($path);
 | |
| 
 | |
|         if(!$handle)
 | |
|         {
 | |
|             return $return;
 | |
|         }
 | |
| 
 | |
|         while (($file = readdir($handle)) !== false)
 | |
|         {
 | |
|             if($file == '.' || $file == '..')
 | |
|             {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             $fullpath = $path . '/' . $file;
 | |
| 
 | |
|             if((is_dir($fullpath) && in_array($file, $ignoreFolders)) || (is_file($fullpath) && in_array($file, $ignoreFiles)))
 | |
|             {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             if(is_dir($fullpath))
 | |
|             {
 | |
|                 $return = array_merge(self::scanDirectory($fullpath, $ignoreFolders, $ignoreFiles), $return);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 $return[] = $path . '/' . $file;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $return;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Gets the extension of a file name
 | |
|      *
 | |
|      * @param   string  $file  The file name
 | |
|      *
 | |
|      * @return  string  The file extension
 | |
|      */
 | |
|     public function getExt($file)
 | |
|     {
 | |
|         $dot = strrpos($file, '.') + 1;
 | |
| 
 | |
|         return substr($file, $dot);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Strips the last extension off of a file name
 | |
|      *
 | |
|      * @param   string  $file  The file name
 | |
|      *
 | |
|      * @return  string  The file name without the extension
 | |
|      */
 | |
|     public function stripExt($file)
 | |
|     {
 | |
|         return preg_replace('#\.[^.]*$#', '', $file);
 | |
|     }
 | |
| } |