* slash, indicating that all files
* for that directory name should
* be returned.
+ * @param boolean $directories_ok When TRUE, directory names
+ * are acceptable search values,
+ * and when returning a list of
+ * directory contents, sub-directory
+ * names will also be included
+ * (optional; default FALSE).
+ * NOTE that empty directories
+ * are NOT included in the cache!
+ * @param boolean $directories_only When TRUE, only directory names
+ * are included in the returned
+ * results. (optional; default
+ * FALSE). Setting this argument
+ * to TRUE forces $directories_ok
+ * to TRUE as well.
+ * NOTE that empty directories
+ * are NOT included in the cache!
*
* @return mixed The full path to the template file or a list
* of all files in the given directory if $filename
* file is not found.
*
*/
- function get_template_file_path($filename) {
+ function get_template_file_path($filename,
+ $directories_ok=FALSE,
+ $directories_only=FALSE) {
+ if ($directories_only) $directories_ok = TRUE;
+
+
+ // only looking for directory listing first...
+ //
// return list of all files in a directory (and that
// of any ancestors)
//
// only want files in the requested directory
// (AND not in a subdirectory!)
//
- if (strpos($file, $filename) === 0
+ if (!$directories_only && strpos($file, $filename) === 0
&& strpos($file, '/', strlen($filename)) === FALSE)
$return_array[] = SM_PATH . $file_info['PATH'];
+ // directories too? detect by finding any
+ // array key that matches a file in a sub-directory
+ // of the directory being processed
+ //
+ if ($directories_ok && strpos($file, $filename) === 0
+ && ($pos = strpos($file, '/', strlen($filename))) !== FALSE
+ && strpos($file, '/', $pos + 1) === FALSE) {
+ $directory_name = SM_PATH
+ . substr($file_info['PATH'],
+ 0,
+ strrpos($file_info['PATH'], '/'));
+ if (!in_array($directory_name, $return_array))
+ $return_array[] = $directory_name;
+ }
+
}
return $return_array;
}
+
+ // just looking for singular file or directory below...
+ //
// figure out what to do with files not found
//
- if (empty($this->template_file_cache[$filename]['PATH'])) {
+ if ($directories_only || empty($this->template_file_cache[$filename]['PATH'])) {
+
+ // if looking for directories...
+ // have to iterate through cache and detect
+ // directory by matching any file inside of it
+ //
+ if ($directories_ok) {
+ foreach ($this->template_file_cache as $file => $file_info) {
+ if (strpos($file, $filename) === 0
+ && ($pos = strpos($file, '/', strlen($filename))) !== FALSE
+ && strpos($file, '/', $pos + 1) === FALSE) {
+ return SM_PATH . substr($file_info['PATH'],
+ 0,
+ strrpos($file_info['PATH'], '/'));
+ }
+ }
+
+ if ($directories_only) return '';
+ }
- // plugins get one more chance below; any other
- // files we just give up now
+ // plugins get one more chance
//
- if (strpos($filename, 'plugins/') !== 0)
- return '';
+ if (strpos($filename, 'plugins/') === 0) {
- $plugin_name = substr($filename, 8, strpos($filename, '/', 8) - 8);
- $file = substr($filename, strlen($plugin_name) + 9);
+ $plugin_name = substr($filename, 8, strpos($filename, '/', 8) - 8);
+ $file = substr($filename, strlen($plugin_name) + 9);
- if (!$this->find_and_cache_plugin_template_file($plugin_name, $file))
- return '';
+ if (!$this->find_and_cache_plugin_template_file($plugin_name, $file))
+ return '';
+ //FIXME: technically I guess we should check for directories
+ // here too, but that's overkill (no need) presently
+ // (plugin-provided alternate stylesheet dirs?!? bah.)
+
+ }
+
+ // nothing... return empty string (yes, the else is intentional!)
+ //
+ else return '';
}
/**
* Return all alternate stylesheets provided by template.
*
- * All files found in the template set's "css/alternates"
- * directory (and that of its ancestors) with the extension
- * ".css" are returned.
+ * All (non-empty) directories found in the template set's
+ * "css/alternates" directory (and that of its ancestors)
+ * are returned.
*
* Note that prettified names are constructed herein by
- * taking the file name, changing underscores to spaces,
- * removing the ".css" from the end of the file, and
- * capitalizing each word in the resultant name.
+ * taking the directory name, changing underscores to spaces
+ * and capitalizing each word in the resultant name.
*
* @param boolean $full_path When FALSE, only the file names
* are included in the return array;
// all alternate css files from ancestor
// template sets, not just this set
//
- //$directory = SM_PATH . $this->get_template_file_directory() . 'css/alternates';
- //$css_files = list_files($directory, '.css', !$full_path);
- //
- $css_files = $this->get_template_file_path('css/alternates/');
+ $css_directories = $this->get_template_file_path('css/alternates/', TRUE, TRUE);
- // parse out .css files only
+ // prettify names
//
$return_array = array();
- foreach ($css_files as $file) {
+ foreach ($css_directories as $directory) {
- if (substr($file, strlen($file) - 4) != '.css') continue;
+ // CVS directories are not wanted
+ //
+ if (strpos($directory, '/CVS') === strlen($directory) - 4) continue;
- $pretty_name = ucwords(str_replace('_', ' ', substr(basename($file), 0, -4)));
+ $pretty_name = ucwords(str_replace('_', ' ', basename($directory)));
if ($full_path) {
- $return_array[$file] = $pretty_name;
+ $return_array[$directory] = $pretty_name;
} else {
- $return_array[basename($file)] = $pretty_name;
+ $return_array[basename($directory)] = $pretty_name;
}
}