478 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			478 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | require_once ('global.php'); | ||
|  | require_once (CRAYON_LANGS_PHP); | ||
|  | require_once (CRAYON_THEMES_PHP); | ||
|  | require_once (CRAYON_FONTS_PHP); | ||
|  | 
 | ||
|  | class CrayonResources { | ||
|  | 	private static $langs = NULL; | ||
|  | 	private static $themes = NULL; | ||
|  | 	private static $fonts = NULL; | ||
|  | 
 | ||
|  | 	private function __construct() {} | ||
|  | 
 | ||
|  | 	public static function langs() { | ||
|  |         if (self::$langs == NULL) { | ||
|  |             self::$langs = new CrayonLangs(); | ||
|  |         } | ||
|  | 		return self::$langs; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function themes() { | ||
|  |         if (self::$themes == NULL) { | ||
|  |             self::$themes = new CrayonThemes(); | ||
|  |         } | ||
|  | 		return self::$themes; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function fonts() { | ||
|  |         if (self::$fonts == NULL) { | ||
|  |             self::$fonts = new CrayonFonts(); | ||
|  |         } | ||
|  | 		return self::$fonts; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | class CrayonResourceCollection { | ||
|  | 	// Properties and Constants ===============================================
 | ||
|  | 
 | ||
|  | 	// Loaded resources
 | ||
|  | 
 | ||
|  | 	private $collection = array(); | ||
|  | 	// Loading state
 | ||
|  | 
 | ||
|  | 	private $state = self::UNLOADED; | ||
|  | 	// Directory containing resources
 | ||
|  | 
 | ||
|  | 	private $dir = ''; | ||
|  | 	private $default_id = ''; | ||
|  | 	private $default_name = ''; | ||
|  | 	const UNLOADED = -1; | ||
|  | 	const LOADING = 0; | ||
|  | 	const LOADED = 1; | ||
|  | 
 | ||
|  | 	// Methods ================================================================
 | ||
|  | 
 | ||
|  | 	/* Override in subclasses. Returns the absolute path for a given resource. Does not check for its existence. */ | ||
|  | 	public function path($id) { | ||
|  | 		return ''; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* Verifies a resource exists. */ | ||
|  | 	public function exists($id) { | ||
|  | 		return file_exists($this->path($id)); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* Load all the available languages. Doesn't parse them for their names and regex. */ | ||
|  | 	public function load() { | ||
|  | 		// Load only once
 | ||
|  | 
 | ||
|  | 		if (!$this->is_state_unloaded()) { | ||
|  | 			return; | ||
|  | 		} | ||
|  | 		$this->state = self::LOADING; | ||
|  | 		$this->load_process(); | ||
|  | 		$this->state = self::LOADED; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function load_resources($dir = NULL) { | ||
|  |         if ($dir === NULL) { | ||
|  |             $dir = $this->dir; | ||
|  |         } | ||
|  | 
 | ||
|  | 		if (!$this->is_state_loading()) { | ||
|  |             // Load only once
 | ||
|  | 			return; | ||
|  | 		} | ||
|  | 		try { | ||
|  | 			// Look in directory for resources
 | ||
|  | 
 | ||
|  | 			if (!is_dir($dir)) { | ||
|  | 				CrayonLog::syslog('The resource directory is missing, should be at \'' . $dir . '\'.'); | ||
|  | 			} else if (($handle = @opendir($dir)) != FALSE) { | ||
|  | 				// Loop over directory contents
 | ||
|  | 				while (($file = readdir($handle)) !== FALSE) { | ||
|  | 					if ($file != "." && $file != "..") { | ||
|  | 						// Check if $file is directory, remove extension when checking for existence.
 | ||
|  | 
 | ||
|  | 						if (!is_dir($dir . $file)) { | ||
|  | 							$file = CrayonUtil::path_rem_ext($file); | ||
|  | 						} | ||
|  | 						if ($this->exists($file)) { | ||
|  | 							$this->add_resource($this->resource_instance($file)); | ||
|  | 						} | ||
|  | 					} | ||
|  | 				} | ||
|  | 				closedir($handle); | ||
|  | 			} | ||
|  | 		} catch (Exception $e) { | ||
|  | 			CrayonLog::syslog('An error occured when trying to load resources: ' . $e->getFile() . $e->getLine()); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* Override in subclasses. */ | ||
|  | 	public function load_process() { | ||
|  | 		if (!$this->is_state_loading()) { | ||
|  | 			return; | ||
|  | 		} | ||
|  | 		$this->load_resources(); | ||
|  | 		$this->add_default(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* Override in subclasses */ | ||
|  | 	public function add_default() { | ||
|  | 		if (!$this->is_state_loading()) { | ||
|  | 			return FALSE; | ||
|  | 		} else if (!$this->is_loaded($this->default_id)) { | ||
|  | 			CrayonLog::syslog('The default resource could not be loaded from \'' . $this->dir . '\'.'); | ||
|  | 			// Add the default, but it will not be functionable
 | ||
|  | 
 | ||
|  | 			$default = $this->resource_instance($this->default_id, $this->default_name); | ||
|  | 			$this->add($this->default_id, $default); | ||
|  | 			return TRUE; | ||
|  | 		} | ||
|  | 		return FALSE; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* Returns the default resource */ | ||
|  | 	public function set_default($id, $name) { | ||
|  | 		$this->default_id = $id; | ||
|  | 		$this->default_name = $name; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* Returns the default resource */ | ||
|  | 	public function get_default() { | ||
|  | 		return $this->get($this->default_id); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* Override in subclasses to create subclass object if needed */ | ||
|  | 	public function resource_instance($id, $name = NULL) { | ||
|  | 		return new CrayonResource($id, $name); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function add($id, $resource) { | ||
|  | 		if (is_string($id) && !empty($id)) { | ||
|  | 			$this->collection[$id] = $resource; | ||
|  | 			asort($this->collection); | ||
|  |             CrayonLog::debug('Added resource: ' . $this->path($id)); | ||
|  | 		} else { | ||
|  |             CrayonLog::syslog('Could not add resource: ', $id); | ||
|  |         } | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function add_resource($resource) { | ||
|  | 		$this->add($resource->id(), $resource); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function remove($name) { | ||
|  | 		if (is_string($name) && !empty($name) && array_key_exists($name, $this->collection)) { | ||
|  | 			unset($this->collection[$name]); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function remove_all() { | ||
|  | 		$this->collection = array(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* Returns the resource for the given id or NULL if it can't be found */ | ||
|  | 	public function get($id = NULL) { | ||
|  | 		$this->load(); | ||
|  | 		if ($id === NULL) { | ||
|  | 			return $this->collection; | ||
|  | 		} else if (is_string($id) && $this->is_loaded($id)) { | ||
|  | 			return $this->collection[$id]; | ||
|  | 		} | ||
|  | 		return NULL; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function get_array() { | ||
|  | 		$array = array(); | ||
|  | 		foreach ($this->get() as $resource) { | ||
|  | 			$array[$resource->id()] = $resource->name(); | ||
|  | 		} | ||
|  | 		return $array; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function is_loaded($id) { | ||
|  | 		if (is_string($id)) { | ||
|  | 			return array_key_exists($id, $this->collection); | ||
|  | 		} | ||
|  | 		return FALSE; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function get_state() { | ||
|  | 		return $this->state; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function is_state_loaded() { | ||
|  | 		return $this->state == self::LOADED; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function is_state_loading() { | ||
|  | 		return $this->state == self::LOADING; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function is_state_unloaded() { | ||
|  | 		return $this->state == self::UNLOADED; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function directory($dir = NULL) { | ||
|  |         if ($dir === NULL) { | ||
|  |             return $this->dir; | ||
|  |         } else { | ||
|  |             $this->dir = CrayonUtil::path_slash($dir); | ||
|  |         } | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function url($id) { | ||
|  | 		return ''; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function get_css($id, $ver = NULL) { | ||
|  | 		$resource = $this->get($id); | ||
|  | 		return '<link rel="stylesheet" type="text/css" href="' . $this->url($resource->id()) . ($ver ? "?ver=$ver" : '') . '" />' . CRAYON_NL; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | class CrayonUsedResourceCollection extends CrayonResourceCollection { | ||
|  | 
 | ||
|  | 	// Checks if any resoruces are being used
 | ||
|  | 	public function is_used($id = NULL) { | ||
|  | 		if ($id === NULL) { | ||
|  | 			foreach ($this->get() as $resource) { | ||
|  | 				if ($resource->used()) { | ||
|  | 					return TRUE; | ||
|  | 				} | ||
|  | 			} | ||
|  | 			return FALSE; | ||
|  | 		} else { | ||
|  | 			$resource = $this->get($id); | ||
|  | 			if (!$resource) { | ||
|  | 				return FALSE; | ||
|  | 			} else { | ||
|  | 				return $resource->used(); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function set_used($id, $value = TRUE) { | ||
|  | 		$resource = $this->get($id); | ||
|  | 		if ($resource !== NULL && !$resource->used()) { | ||
|  | 			$resource->used($value == TRUE); | ||
|  | 			return TRUE; | ||
|  | 		} | ||
|  | 		return FALSE; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function get_used() { | ||
|  | 		$used = array(); | ||
|  | 		foreach ($this->get() as $resource) { | ||
|  | 			if ($resource->used()) { | ||
|  | 				$used[] = $resource; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		return $used; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// XXX Override
 | ||
|  | 	public function resource_instance($id, $name = NULL) { | ||
|  | 		return new CrayonUsedResource($id, $name); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function get_used_css() { | ||
|  | 		$used = $this->get_used(); | ||
|  | 		$css = array(); | ||
|  | 		foreach ($used as $resource) { | ||
|  | 			$url = $this->url($resource->id()); | ||
|  | 			$css[$resource->id()] = $url; | ||
|  | 		} | ||
|  | 		return $css; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | class CrayonUserResourceCollection extends CrayonUsedResourceCollection { | ||
|  |     private $user_dir = ''; | ||
|  |     private $curr_dir = NULL; | ||
|  |     // TODO better to use a base dir and relative
 | ||
|  |     private $relative_directory = NULL; | ||
|  |     // TODO move this higher up inheritance
 | ||
|  |     private $extension = ''; | ||
|  | 
 | ||
|  |     // XXX Override
 | ||
|  |     public function resource_instance($id, $name = NULL) { | ||
|  |         $resource = $this->create_user_resource_instance($id, $name); | ||
|  |         $resource->user($this->curr_dir == $this->user_directory()); | ||
|  |         return $resource; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function create_user_resource_instance($id, $name = NULL) { | ||
|  |         return new CrayonUserResource($id, $name); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function user_directory($dir = NULL) { | ||
|  |         if ($dir === NULL) { | ||
|  |             return $this->user_dir; | ||
|  |         } else { | ||
|  |             $this->user_dir = CrayonUtil::path_slash($dir); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public function relative_directory($relative_directory = NULL) { | ||
|  |         if ($relative_directory == NULL) { | ||
|  |             return $this->relative_directory; | ||
|  |         } | ||
|  |         $this->relative_directory = $relative_directory; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function extension($extension = NULL) { | ||
|  |         if ($extension == NULL) { | ||
|  |             return $this->extension; | ||
|  |         } | ||
|  |         $this->extension = $extension; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function load_resources($dir = NULL) { | ||
|  |         $this->curr_dir = $this->directory(); | ||
|  |         parent::load_resources($this->curr_dir); | ||
|  |         $this->curr_dir = $this->user_directory(); | ||
|  |         parent::load_resources($this->curr_dir); | ||
|  |         $this->curr_dir = NULL; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function current_directory() { | ||
|  |         return $this->curr_dir; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function dir_is_user($id, $user = NULL) { | ||
|  |         if ($user === NULL) { | ||
|  |             if ($this->is_state_loading()) { | ||
|  |                 // We seem to be loading resources - use current directory
 | ||
|  |                 $user = $this->current_directory() == $this->user_directory(); | ||
|  |             } else { | ||
|  |                 $theme = $this->get($id); | ||
|  |                 if ($theme) { | ||
|  |                     $user = $theme->user(); | ||
|  |                 } else { | ||
|  |                     $user = FALSE; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         return $user; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function dirpath($user = NULL) { | ||
|  |         $path = $user ? $this->user_directory() : $this->directory(); | ||
|  |         return CrayonUtil::path_slash($path); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function dirpath_for_id($id, $user = NULL) { | ||
|  |         $user = $this->dir_is_user($id, $user); | ||
|  |         return $this->dirpath($user) . $id; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function dirurl($user = NULL) { | ||
|  |         $path = $user ? CrayonGlobalSettings::upload_url() : CrayonGlobalSettings::plugin_path(); | ||
|  |         return CrayonUtil::path_slash($path . $this->relative_directory()); | ||
|  |     } | ||
|  | 
 | ||
|  |     // XXX Override
 | ||
|  |     public function path($id, $user = NULL) { | ||
|  |         $user = $this->dir_is_user($id, $user); | ||
|  |         return $this->dirpath($user) . $this->filename($id, $user); | ||
|  |     } | ||
|  | 
 | ||
|  |     // XXX Override
 | ||
|  |     public function url($id, $user = NULL) { | ||
|  |         $user = $this->dir_is_user($id, $user); | ||
|  |         return $this->dirurl($user) . $this->filename($id, $user); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function filename($id, $user = NULL) { | ||
|  |         return "$id.$this->extension"; | ||
|  |     } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | class CrayonResource { | ||
|  | 	private $id = ''; | ||
|  | 	private $name = ''; | ||
|  | 
 | ||
|  | 	function __construct($id, $name = NULL) { | ||
|  | 		$id = $this->clean_id($id); | ||
|  | 		CrayonUtil::str($this->id, $id); | ||
|  | 		( empty($name) ) ? $this->name( self::clean_name($this->id) ) : $this->name($name); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function __tostring() { | ||
|  | 		return $this->name; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function id() { | ||
|  | 		return $this->id; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function name($name = NULL) { | ||
|  | 		if ($name === NULL) { | ||
|  | 			return $this->name; | ||
|  | 		} else { | ||
|  | 			$this->name = $name; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function clean_id($id) { | ||
|  |         $id = CrayonUtil::space_to_hyphen( strtolower(trim($id)) ); | ||
|  |         return preg_replace('#[^\w-]#msi', '', $id); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function clean_name($id) { | ||
|  | 		$id = CrayonUtil::hyphen_to_space( strtolower(trim($id)) ); | ||
|  | 		return CrayonUtil::ucwords($id); | ||
|  | 	} | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | class CrayonUsedResource extends CrayonResource { | ||
|  |     // Keeps track of usage
 | ||
|  | 	private $used = FALSE; | ||
|  | 
 | ||
|  | 	function used($used = NULL) { | ||
|  | 		if ($used === NULL) { | ||
|  | 			return $this->used; | ||
|  | 		} else { | ||
|  | 			$this->used = ($used ? TRUE : FALSE); | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | class CrayonUserResource extends CrayonUsedResource { | ||
|  |     // Keeps track of user modifications
 | ||
|  |     private $user = FALSE; | ||
|  | 
 | ||
|  |     function user($user = NULL) { | ||
|  |         if ($user === NULL) { | ||
|  |             return $this->user; | ||
|  |         } else { | ||
|  |             $this->user = ($user ? TRUE : FALSE); | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class CrayonVersionResource extends CrayonUserResource { | ||
|  |     // Adds version
 | ||
|  | 	private $version = ''; | ||
|  | 
 | ||
|  | 	function __construct($id, $name = NULL, $version = NULL) { | ||
|  | 		parent::__construct($id, $name); | ||
|  | 		$this->version($version); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function version($version = NULL) { | ||
|  | 		if ($version === NULL) { | ||
|  | 			return $this->version; | ||
|  | 		} else if (is_string($version)) { | ||
|  | 			$this->version = $version; | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | ?>
 |