Restructure theme.php to define a class Theme

For various reasons, it's nicer to have a class for theme-file paths
and such. So, I've rewritten the code for determining the locations of
theme files to be more OOPy.

I changed all the uses of the two functions in the module (theme_file
and theme_path) to use Theme::file and Theme::path respectively.

I've also removed the code in common.php that require's the module;
using a class means we can autoload it instead.
This commit is contained in:
Evan Prodromou 2009-11-08 17:04:46 -05:00
parent 321ac38884
commit b7e2e3fd2b
8 changed files with 150 additions and 67 deletions

View File

@ -75,7 +75,7 @@ class OpensearchAction extends Action
$this->element('Url', array('type' => 'text/html', 'method' => 'get', $this->element('Url', array('type' => 'text/html', 'method' => 'get',
'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---'))))); 'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---')))));
$this->element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico')); $this->element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico'));
$this->element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), theme_path('logo.png')); $this->element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), Theme::path('logo.png'));
$this->element('AdultContent', null, 'false'); $this->element('AdultContent', null, 'false');
$this->element('Language', null, common_language()); $this->element('Language', null, common_language());
$this->element('OutputEncoding', null, 'UTF-8'); $this->element('OutputEncoding', null, 'UTF-8');

View File

@ -102,6 +102,6 @@ class Avatar extends Memcached_DataObject
static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
AVATAR_STREAM_SIZE => 'stream', AVATAR_STREAM_SIZE => 'stream',
AVATAR_MINI_SIZE => 'mini'); AVATAR_MINI_SIZE => 'mini');
return theme_path('default-avatar-'.$sizenames[$size].'.png'); return Theme::path('default-avatar-'.$sizenames[$size].'.png');
} }
} }

View File

@ -34,7 +34,7 @@ class User_group extends Memcached_DataObject
static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile',
AVATAR_STREAM_SIZE => 'stream', AVATAR_STREAM_SIZE => 'stream',
AVATAR_MINI_SIZE => 'mini'); AVATAR_MINI_SIZE => 'mini');
return theme_path('default-avatar-'.$sizenames[$size].'.png'); return Theme::path('default-avatar-'.$sizenames[$size].'.png');
} }
function homeUrl() function homeUrl()

View File

@ -168,7 +168,7 @@ class Action extends HTMLOutputter // lawsuit
{ {
if (is_readable(INSTALLDIR . '/theme/' . common_config('site', 'theme') . '/favicon.ico')) { if (is_readable(INSTALLDIR . '/theme/' . common_config('site', 'theme') . '/favicon.ico')) {
$this->element('link', array('rel' => 'shortcut icon', $this->element('link', array('rel' => 'shortcut icon',
'href' => theme_path('favicon.ico'))); 'href' => Theme::path('favicon.ico')));
} else { } else {
$this->element('link', array('rel' => 'shortcut icon', $this->element('link', array('rel' => 'shortcut icon',
'href' => common_path('favicon.ico'))); 'href' => common_path('favicon.ico')));
@ -177,7 +177,7 @@ class Action extends HTMLOutputter // lawsuit
if (common_config('site', 'mobile')) { if (common_config('site', 'mobile')) {
if (is_readable(INSTALLDIR . '/theme/' . common_config('site', 'theme') . '/apple-touch-icon.png')) { if (is_readable(INSTALLDIR . '/theme/' . common_config('site', 'theme') . '/apple-touch-icon.png')) {
$this->element('link', array('rel' => 'apple-touch-icon', $this->element('link', array('rel' => 'apple-touch-icon',
'href' => theme_path('apple-touch-icon.png'))); 'href' => Theme::path('apple-touch-icon.png')));
} else { } else {
$this->element('link', array('rel' => 'apple-touch-icon', $this->element('link', array('rel' => 'apple-touch-icon',
'href' => common_path('apple-touch-icon.png'))); 'href' => common_path('apple-touch-icon.png')));
@ -210,16 +210,16 @@ class Action extends HTMLOutputter // lawsuit
if (Event::handle('StartShowUAStyles', array($this))) { if (Event::handle('StartShowUAStyles', array($this))) {
$this->comment('[if IE]><link rel="stylesheet" type="text/css" '. $this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
'href="'.theme_path('css/ie.css', 'base').'?version='.STATUSNET_VERSION.'" /><![endif]'); 'href="'.Theme::path('css/ie.css', 'base').'?version='.STATUSNET_VERSION.'" /><![endif]');
foreach (array(6,7) as $ver) { foreach (array(6,7) as $ver) {
if (file_exists(theme_file('css/ie'.$ver.'.css', 'base'))) { if (file_exists(Theme::file('css/ie'.$ver.'.css', 'base'))) {
// Yes, IE people should be put in jail. // Yes, IE people should be put in jail.
$this->comment('[if lte IE '.$ver.']><link rel="stylesheet" type="text/css" '. $this->comment('[if lte IE '.$ver.']><link rel="stylesheet" type="text/css" '.
'href="'.theme_path('css/ie'.$ver.'.css', 'base').'?version='.STATUSNET_VERSION.'" /><![endif]'); 'href="'.Theme::path('css/ie'.$ver.'.css', 'base').'?version='.STATUSNET_VERSION.'" /><![endif]');
} }
} }
$this->comment('[if IE]><link rel="stylesheet" type="text/css" '. $this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
'href="'.theme_path('css/ie.css', null).'?version='.STATUSNET_VERSION.'" /><![endif]'); 'href="'.Theme::path('css/ie.css', null).'?version='.STATUSNET_VERSION.'" /><![endif]');
Event::handle('EndShowUAStyles', array($this)); Event::handle('EndShowUAStyles', array($this));
} }
@ -391,9 +391,9 @@ class Action extends HTMLOutputter // lawsuit
if (Event::handle('StartAddressData', array($this))) { if (Event::handle('StartAddressData', array($this))) {
$this->elementStart('a', array('class' => 'url home bookmark', $this->elementStart('a', array('class' => 'url home bookmark',
'href' => common_local_url('public'))); 'href' => common_local_url('public')));
if (common_config('site', 'logo') || file_exists(theme_file('logo.png'))) { if (common_config('site', 'logo') || file_exists(Theme::file('logo.png'))) {
$this->element('img', array('class' => 'logo photo', $this->element('img', array('class' => 'logo photo',
'src' => (common_config('site', 'logo')) ? common_config('site', 'logo') : theme_path('logo.png'), 'src' => (common_config('site', 'logo')) ? common_config('site', 'logo') : Theme::path('logo.png'),
'alt' => common_config('site', 'name'))); 'alt' => common_config('site', 'name')));
} }
$this->element('span', array('class' => 'fn org'), common_config('site', 'name')); $this->element('span', array('class' => 'fn org'), common_config('site', 'name'));

View File

@ -227,7 +227,6 @@ require_once 'markdown.php';
require_once INSTALLDIR.'/lib/util.php'; require_once INSTALLDIR.'/lib/util.php';
require_once INSTALLDIR.'/lib/action.php'; require_once INSTALLDIR.'/lib/action.php';
require_once INSTALLDIR.'/lib/theme.php';
require_once INSTALLDIR.'/lib/mail.php'; require_once INSTALLDIR.'/lib/mail.php';
require_once INSTALLDIR.'/lib/subs.php'; require_once INSTALLDIR.'/lib/subs.php';
require_once INSTALLDIR.'/lib/Shorturl_api.php'; require_once INSTALLDIR.'/lib/Shorturl_api.php';

View File

@ -375,8 +375,8 @@ class HTMLOutputter extends XMLOutputter
$url = parse_url($src); $url = parse_url($src);
if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment)) if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment))
{ {
if(file_exists(theme_file($src,$theme))){ if(file_exists(Theme::file($src,$theme))){
$src = theme_path($src, $theme) . '?version=' . STATUSNET_VERSION; $src = Theme::path($src, $theme) . '?version=' . STATUSNET_VERSION;
}else{ }else{
$src = common_path($src); $src = common_path($src);
} }

View File

@ -114,7 +114,7 @@ class NoticeSection extends Section
$att_class = 'attachments'; $att_class = 'attachments';
} }
$clip = theme_path('images/icons/clip.png', 'base'); $clip = Theme::path('images/icons/clip.png', 'base');
$this->out->elementStart('a', array('class' => $att_class, 'style' => "font-style: italic;", 'href' => $href, 'title' => "# of attachments: $count")); $this->out->elementStart('a', array('class' => $att_class, 'style' => "font-style: italic;", 'href' => $href, 'title' => "# of attachments: $count"));
$this->out->raw(" ($count&nbsp"); $this->out->raw(" ($count&nbsp");
$this->out->element('img', array('style' => 'display: inline', 'align' => 'top', 'width' => 20, 'height' => 20, 'src' => $clip, 'alt' => 'alt')); $this->out->element('img', array('style' => 'display: inline', 'align' => 'top', 'width' => 20, 'height' => 20, 'src' => $clip, 'alt' => 'alt'));

View File

@ -23,7 +23,7 @@
* @package StatusNet * @package StatusNet
* @author Evan Prodromou <evan@status.net> * @author Evan Prodromou <evan@status.net>
* @author Sarven Capadisli <csarven@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 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @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 * Themes are directories with some expected sub-directories and files
* @param string $theme name of the theme; defaults to current theme * 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)) { var $dir = null;
$theme = common_config('site', 'theme'); var $path = null;
/**
* Constructor
*
* Determines the proper directory and path for this theme.
*
* @param string $name Name of the theme; defaults to config value
*/
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
$instroot = common_config('theme', 'dir');
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;
}
} }
$dir = common_config('theme', 'dir');
if (empty($dir)) { /**
$dir = INSTALLDIR.'/theme'; * 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;
}
/**
* 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;
}
/**
* 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
*/
static function file($relative, $name=null)
{
$theme = new Theme($name);
return $theme->getFile($relative);
}
/**
* 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
*/
static function path($relative, $name=null)
{
$theme = new Theme($name);
return $theme->getPath($relative);
} }
return $dir.'/'.$theme.'/'.$relative;
}
/**
* 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
*/
function theme_path($relative, $theme=null)
{
if (empty($theme)) {
$theme = common_config('site', 'theme');
}
$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
return 'http://'.$server.$path.$theme.'/'.$relative;
} }