]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/theme.php
Restructure theme.php to define a class Theme
[quix0rs-gnu-social.git] / lib / theme.php
index 08e3e85383b18fc92d5241891d1acb1dff8f57b0..c658058ffcc134841e50174c75ee4fc711c1776f 100644 (file)
@@ -23,7 +23,7 @@
  * @package   StatusNet
  * @author    Evan Prodromou <evan@status.net>
  * @author    Sarven Capadisli <csarven@status.net>
- * @copyright 2008 StatusNet, Inc.
+ * @copyright 2008-2009 StatusNet, Inc.
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link      http://status.net/
  */
@@ -33,62 +33,146 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
 }
 
 /**
- * Gets the full path of a file in a theme dir based on its relative name
+ * Class for querying and manipulating a theme
  *
- * @param string $relative relative path within the theme directory
- * @param string $theme    name of the theme; defaults to current theme
+ * Themes are directories with some expected sub-directories and files
+ * in them. They're found in either local/theme (for locally-installed themes)
+ * or theme/ subdir of installation dir.
  *
- * @return string File path to the theme file
+ * This used to be a couple of functions, but for various reasons it's nice
+ * to have a class instead.
+ *
+ * @category Output
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
  */
 
-function theme_file($relative, $theme=null)
+class Theme
 {
-    if (empty($theme)) {
-        $theme = common_config('site', 'theme');
-    }
-    $dir = common_config('theme', 'dir');
-    if (empty($dir)) {
-        $dir = INSTALLDIR.'/theme';
-    }
-    return $dir.'/'.$theme.'/'.$relative;
-}
+    var $dir  = null;
+    var $path = null;
 
-/**
- * Gets the full URL of a file in a theme dir based on its relative name
- *
- * @param string $relative relative path within the theme directory
- * @param string $theme    name of the theme; defaults to current theme
- *
- * @return string URL of the file
- */
+    /**
+     * Constructor
+     *
+     * Determines the proper directory and path for this theme.
+     *
+     * @param string $name Name of the theme; defaults to config value
+     */
 
-function theme_path($relative, $theme=null)
-{
-    if (empty($theme)) {
-        $theme = common_config('site', 'theme');
-    }
+    function __construct($name=null)
+    {
+        if (empty($name)) {
+            $name = common_config('site', 'theme');
+        }
+
+        // Check to see if it's in the local dir
+
+        $localroot = INSTALLDIR.'/local/theme';
+
+        $fulldir = $localroot.'/'.$name;
+
+        if (file_exists($fulldir) && is_dir($fulldir)) {
+            $this->dir  = $fulldir;
+            $this->path = common_path('local/theme/'.$name.'/');
+            return;
+        }
+
+        // Check to see if it's in the distribution dir
 
-    $path = common_config('theme', 'path');
+        $instroot = common_config('theme', 'dir');
 
-    if (empty($path)) {
-        $path = common_config('site', 'path') . '/theme/';
+        if (empty($instroot)) {
+            $instroot = INSTALLDIR.'/theme';
+        }
+
+        $fulldir = $instroot.'/'.$name;
+
+        if (file_exists($fulldir) && is_dir($fulldir)) {
+
+            $this->dir = $fulldir;
+
+            $path = common_config('theme', 'path');
+
+            if (empty($path)) {
+                $path = common_config('site', 'path') . '/theme/';
+            }
+
+            if ($path[strlen($path)-1] != '/') {
+                $path .= '/';
+            }
+
+            if ($path[0] != '/') {
+                $path = '/'.$path;
+            }
+
+            $server = common_config('theme', 'server');
+
+            if (empty($server)) {
+                $server = common_config('site', 'server');
+            }
+
+            // XXX: protocol
+
+            $this->path = 'http://'.$server.$path.$name;
+        }
     }
 
-    if ($path[strlen($path)-1] != '/') {
-        $path .= '/';
+    /**
+     * Gets the full local filename of a file in this theme.
+     *
+     * @param string $relative relative name, like 'logo.png'
+     *
+     * @return string full pathname, like /var/www/mublog/theme/default/logo.png
+     */
+
+    function getFile($relative)
+    {
+        return $this->dir.'/'.$relative;
     }
 
-    if ($path[0] != '/') {
-        $path = '/'.$path;
+    /**
+     * Gets the full HTTP url of a file in this theme
+     *
+     * @param string $relative relative name, like 'logo.png'
+     *
+     * @return string full URL, like 'http://example.com/theme/default/logo.png'
+     */
+
+    function getPath($relative)
+    {
+        return $this->path.'/'.$relative;
     }
 
-    $server = common_config('theme', 'server');
+    /**
+     * Gets the full path of a file in a theme dir based on its relative name
+     *
+     * @param string $relative relative path within the theme directory
+     * @param string $name     name of the theme; defaults to current theme
+     *
+     * @return string File path to the theme file
+     */
 
-    if (empty($server)) {
-        $server = common_config('site', 'server');
+    static function file($relative, $name=null)
+    {
+        $theme = new Theme($name);
+        return $theme->getFile($relative);
     }
 
-    // XXX: protocol
+    /**
+     * Gets the full URL of a file in a theme dir based on its relative name
+     *
+     * @param string $relative relative path within the theme directory
+     * @param string $name     name of the theme; defaults to current theme
+     *
+     * @return string URL of the file
+     */
 
-    return 'http://'.$server.$path.$theme.'/'.$relative;
+    static function path($relative, $name=null)
+    {
+        $theme = new Theme($name);
+        return $theme->getPath($relative);
+    }
 }