123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- <?php
- require_once( dirname(__FILE__).'/Version.php');
- class Less_Cache{
-
- public static $cache_dir = false;
-
- public static $prefix = 'lessphp_';
-
- public static $prefix_vars = 'lessphpvars_';
-
- public static $gc_lifetime = 604800;
-
- public static function Get( $less_files, $parser_options = array(), $modify_vars = array() ){
-
- if( isset($parser_options['cache_dir']) ){
- Less_Cache::$cache_dir = $parser_options['cache_dir'];
- }
- if( empty(Less_Cache::$cache_dir) ){
- throw new Exception('cache_dir not set');
- }
- if( isset($parser_options['prefix']) ){
- Less_Cache::$prefix = $parser_options['prefix'];
- }
- if( empty(Less_Cache::$prefix) ){
- throw new Exception('prefix not set');
- }
- if( isset($parser_options['prefix_vars']) ){
- Less_Cache::$prefix_vars = $parser_options['prefix_vars'];
- }
- if( empty(Less_Cache::$prefix_vars) ){
- throw new Exception('prefix_vars not set');
- }
- self::CheckCacheDir();
- $less_files = (array)$less_files;
-
- if( !empty($modify_vars) ){
- $lessvars = Less_Parser::serializeVars($modify_vars);
- $vars_file = Less_Cache::$cache_dir . Less_Cache::$prefix_vars . sha1($lessvars) . '.less';
- if( !file_exists($vars_file) ){
- file_put_contents($vars_file, $lessvars);
- }
- $less_files += array($vars_file => '/');
- }
-
- $hash = md5(json_encode($less_files));
- $list_file = Less_Cache::$cache_dir . Less_Cache::$prefix . $hash . '.list';
-
- if( !isset($parser_options['use_cache']) || $parser_options['use_cache'] === true ){
- if( file_exists($list_file) ){
- self::ListFiles($list_file, $list, $cached_name);
- $compiled_name = self::CompiledName($list);
-
- if( !$cached_name || $cached_name === $compiled_name ){
- $output_file = self::OutputFile($compiled_name, $parser_options );
- if( $output_file && file_exists($output_file) ){
- @touch($list_file);
- return basename($output_file);
- }
- }
- }
- }
- $compiled = self::Cache( $less_files, $parser_options );
- if( !$compiled ){
- return false;
- }
- $compiled_name = self::CompiledName( $less_files );
- $output_file = self::OutputFile($compiled_name, $parser_options );
-
- $list = $less_files;
- $list[] = $compiled_name;
- $cache = implode("\n",$list);
- file_put_contents( $list_file, $cache );
-
- file_put_contents( $output_file, $compiled );
-
- self::CleanCache();
- return basename($output_file);
- }
-
- public static function Regen( $less_files, $parser_options = array(), $modify_vars = array() ){
- $parser_options['use_cache'] = false;
- return self::Get( $less_files, $parser_options, $modify_vars );
- }
- public static function Cache( &$less_files, $parser_options = array() ){
-
- $file = dirname(__FILE__) . '/Less.php';
- if( file_exists($file) && !class_exists('Less_Parser') ){
- require_once($file);
- }
- $parser_options['cache_dir'] = Less_Cache::$cache_dir;
- $parser = new Less_Parser($parser_options);
-
- foreach($less_files as $file_path => $uri_or_less ){
-
- if( strpos($uri_or_less,"\n") !== false ){
- $parser->Parse( $uri_or_less );
- continue;
- }
- $parser->ParseFile( $file_path, $uri_or_less );
- }
- $compiled = $parser->getCss();
- $less_files = $parser->allParsedFiles();
- return $compiled;
- }
- private static function OutputFile( $compiled_name, $parser_options ){
-
- if( !empty($parser_options['output']) ){
-
- if( preg_match('#[\\\\/]#',$parser_options['output']) ){
- return $parser_options['output'];
- }
- return Less_Cache::$cache_dir.$parser_options['output'];
- }
- return Less_Cache::$cache_dir.$compiled_name;
- }
- private static function CompiledName( $files ){
-
- $temp = array(Less_Version::cache_version);
- foreach($files as $file){
- $temp[] = filemtime($file)."\t".filesize($file)."\t".$file;
- }
- return Less_Cache::$prefix.sha1(json_encode($temp)).'.css';
- }
- public static function SetCacheDir( $dir ){
- Less_Cache::$cache_dir = $dir;
- }
- public static function CheckCacheDir(){
- Less_Cache::$cache_dir = str_replace('\\','/',Less_Cache::$cache_dir);
- Less_Cache::$cache_dir = rtrim(Less_Cache::$cache_dir,'/').'/';
- if( !file_exists(Less_Cache::$cache_dir) ){
- if( !mkdir(Less_Cache::$cache_dir) ){
- throw new Less_Exception_Parser('Less.php cache directory couldn\'t be created: '.Less_Cache::$cache_dir);
- }
- }elseif( !is_dir(Less_Cache::$cache_dir) ){
- throw new Less_Exception_Parser('Less.php cache directory doesn\'t exist: '.Less_Cache::$cache_dir);
- }elseif( !is_writable(Less_Cache::$cache_dir) ){
- throw new Less_Exception_Parser('Less.php cache directory isn\'t writable: '.Less_Cache::$cache_dir);
- }
- }
-
- public static function CleanCache(){
- static $clean = false;
- if( $clean ){
- return;
- }
- $files = scandir(Less_Cache::$cache_dir);
- if( $files ){
- $check_time = time() - self::$gc_lifetime;
- foreach($files as $file){
-
- if( strpos($file,Less_Cache::$prefix) !== 0 ){
- continue;
- }
- $full_path = Less_Cache::$cache_dir.'/'.$file;
-
-
- if( !file_exists($full_path) ){
- continue;
- }
- $mtime = filemtime($full_path);
-
- if( $mtime > $check_time ){
- continue;
- }
- $parts = explode('.',$file);
- $type = array_pop($parts);
-
- if( $type === 'css' ){
- continue;
- }
-
- if( $type === 'list' ){
- self::ListFiles($full_path, $list, $css_file_name);
- if( $css_file_name ){
- $css_file = Less_Cache::$cache_dir.'/'.$css_file_name;
- if( file_exists($css_file) ){
- unlink($css_file);
- }
- }
- }
- unlink($full_path);
- }
- }
- $clean = true;
- }
-
- static function ListFiles($list_file, &$list, &$css_file_name ){
- $list = explode("\n",file_get_contents($list_file));
-
- $css_file_name = array_pop($list);
- if( !preg_match('/^' . Less_Cache::$prefix . '[a-f0-9]+\.css$/',$css_file_name) ){
- $list[] = $css_file_name;
- $css_file_name = false;
- }
- }
- }
|