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 '' . 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; } } }