summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorZach Copley <zach@status.net>2009-11-10 00:43:58 -0800
committerZach Copley <zach@status.net>2009-11-10 00:43:58 -0800
commitcae06a49ea60cacb926f27b18b88a8a7f801f011 (patch)
tree4a1a8b448666f1dd7ff1a8395d7ce75ef4933956 /lib
parentdbb86f948684cd5a5a49f6881f50082698fd39d1 (diff)
parent223fee2ad1430e827830265c9fe97f4d025bb060 (diff)
Merge branch '0.9.x' into finish-account-api
* 0.9.x: (26 commits) just sent a http 200 for the check-fancy from install.php Add a new event: CanUserChangeField shorten flag notification and include a class Added flag icon for UserFlag plugin Fixed notice option alignment in IE add a method to Theme class to list available themes Updated Realtime plugin to use the util's NoticeReply object Localisation updates from translatewiki.net (2009-11-08) Update pot again Rebuild pot file *without* --join-existing to get rid of the cruft. Not sure why "--join-existing" must be in. Only thing I can think of is manual additions, which I could not find. Revert "More precise field label" Remove more contractions Revert "* [Cc]an't -> [Cc]annot" Revert "More specifics on 'address'" * [Cc]an't -> [Cc]annot Revert "* check usage of 'people' in UI and change it to 'users' or something else in most places" add utilities for calculating local and installation theme root dirs Harmonise UI message "No such user." Restructure theme.php to define a class Theme entity_action responses look more inactive now ...
Diffstat (limited to 'lib')
-rw-r--r--lib/accountsettingsaction.php35
-rw-r--r--lib/action.php36
-rw-r--r--lib/api.php14
-rw-r--r--lib/apiauth.php2
-rw-r--r--lib/common.php3
-rw-r--r--lib/dberroraction.php6
-rw-r--r--lib/error.php4
-rw-r--r--lib/htmloutputter.php6
-rw-r--r--lib/imagefile.php2
-rw-r--r--lib/jabber.php2
-rw-r--r--lib/mail.php6
-rw-r--r--lib/noticelist.php6
-rw-r--r--lib/noticesection.php2
-rw-r--r--lib/oauthstore.php4
-rw-r--r--lib/queuehandler.php12
-rw-r--r--lib/right.php3
-rw-r--r--lib/rssaction.php2
-rw-r--r--lib/search_engines.php2
-rw-r--r--lib/theme.php227
-rw-r--r--lib/util.php12
-rw-r--r--lib/xmloutputter.php2
-rw-r--r--lib/xmppqueuehandler.php2
22 files changed, 284 insertions, 106 deletions
diff --git a/lib/accountsettingsaction.php b/lib/accountsettingsaction.php
index a004a3ed9..9865e1748 100644
--- a/lib/accountsettingsaction.php
+++ b/lib/accountsettingsaction.php
@@ -102,26 +102,31 @@ class AccountSettingsNav extends Widget
$this->action->elementStart('ul', array('class' => 'nav'));
if (Event::handle('StartAccountSettingsNav', array(&$this->action))) {
+ $user = common_current_user();
- $menu =
- array('profilesettings' =>
+ $menu = array();
+ $menu['profilesettings'] =
array(_('Profile'),
- _('Change your profile settings')),
- 'avatarsettings' =>
- array(_('Avatar'),
- _('Upload an avatar')),
- 'passwordsettings' =>
- array(_('Password'),
- _('Change your password')),
- 'emailsettings' =>
+ _('Change your profile settings'));
+ if(Event::handle('CanUserChangeField', array($user->nickname, 'avatar'))){
+ $menu['avatarsettings'] =
+ array(_('Avatar'),
+ _('Upload an avatar'));
+ }
+ if(Event::handle('CanUserChangeField', array($user->nickname, 'password'))){
+ $menu['passwordsettings'] =
+ array(_('Password'),
+ _('Change your password'));
+ }
+ $menu['emailsettings'] =
array(_('Email'),
- _('Change email handling')),
- 'userdesignsettings' =>
+ _('Change email handling'));
+ $menu['userdesignsettings'] =
array(_('Design'),
- _('Design your profile')),
- 'othersettings' =>
+ _('Design your profile'));
+ $menu['othersettings'] =
array(_('Other'),
- _('Other options')));
+ _('Other options'));
foreach ($menu as $menuaction => $menudesc) {
$this->action->menuItem(common_local_url($menuaction),
diff --git a/lib/action.php b/lib/action.php
index 776549854..80f398fbd 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -168,7 +168,7 @@ class Action extends HTMLOutputter // lawsuit
{
if (is_readable(INSTALLDIR . '/theme/' . common_config('site', 'theme') . '/favicon.ico')) {
$this->element('link', array('rel' => 'shortcut icon',
- 'href' => theme_path('favicon.ico')));
+ 'href' => Theme::path('favicon.ico')));
} else {
$this->element('link', array('rel' => 'shortcut icon',
'href' => common_path('favicon.ico')));
@@ -177,7 +177,7 @@ class Action extends HTMLOutputter // lawsuit
if (common_config('site', 'mobile')) {
if (is_readable(INSTALLDIR . '/theme/' . common_config('site', 'theme') . '/apple-touch-icon.png')) {
$this->element('link', array('rel' => 'apple-touch-icon',
- 'href' => theme_path('apple-touch-icon.png')));
+ 'href' => Theme::path('apple-touch-icon.png')));
} else {
$this->element('link', array('rel' => 'apple-touch-icon',
'href' => common_path('apple-touch-icon.png')));
@@ -210,16 +210,16 @@ class Action extends HTMLOutputter // lawsuit
if (Event::handle('StartShowUAStyles', array($this))) {
$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) {
- 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.
$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" '.
- '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));
}
@@ -391,9 +391,9 @@ class Action extends HTMLOutputter // lawsuit
if (Event::handle('StartAddressData', array($this))) {
$this->elementStart('a', array('class' => 'url home bookmark',
'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',
- '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')));
}
$this->element('span', array('class' => 'fn org'), common_config('site', 'name'));
@@ -456,7 +456,7 @@ class Action extends HTMLOutputter // lawsuit
_('Help'), _('Help me!'), false, 'nav_help');
if ($user || !common_config('site', 'private')) {
$this->menuItem(common_local_url('peoplesearch'),
- _('Search'), _('Search for users or text'), false, 'nav_search');
+ _('Search'), _('Search for people or text'), false, 'nav_search');
}
Event::handle('EndPrimaryNav', array($this));
}
@@ -1101,4 +1101,22 @@ class Action extends HTMLOutputter // lawsuit
{
return Design::siteDesign();
}
+
+ /**
+ * Check the session token.
+ *
+ * Checks that the current form has the correct session token,
+ * and throw an exception if it does not.
+ *
+ * @return void
+ */
+
+ function checkSessionToken()
+ {
+ // CSRF protection
+ $token = $this->trimmed('token');
+ if (empty($token) || $token != common_session_token()) {
+ $this->clientError(_('There was a problem with your session token.'));
+ }
+ }
}
diff --git a/lib/api.php b/lib/api.php
index 45762ef0d..5da9d4982 100644
--- a/lib/api.php
+++ b/lib/api.php
@@ -66,7 +66,7 @@ class ApiAction extends Action
*
* @param array $args Web and URL arguments
*
- * @return boolean false if user doesn't exist
+ * @return boolean false if user does not exist
*/
function prepare($args)
@@ -138,7 +138,7 @@ class ApiAction extends Action
$design = null;
$user = $profile->getUser();
- // Note: some profiles don't have an associated user
+ // Note: some profiles do not have an associated user
if (!empty($user)) {
$design = $user->getDesign();
@@ -208,7 +208,7 @@ class ApiAction extends Action
if ($get_notice) {
$notice = $profile->getCurrentNotice();
if ($notice) {
- # don't get user!
+ # do not get user!
$twitter_user['status'] = $this->twitterStatusArray($notice, false);
}
}
@@ -268,7 +268,7 @@ class ApiAction extends Action
}
if ($include_user) {
- # Don't get notice (recursive!)
+ # Do not get notice (recursive!)
$twitter_user = $this->twitterUserArray($profile, false);
$twitter_status['user'] = $twitter_user;
}
@@ -1079,7 +1079,7 @@ class ApiAction extends Action
function initTwitterAtom()
{
$this->startXML();
- // FIXME: don't hardcode the language here!
+ // FIXME: do not hardcode the language here!
$this->elementStart('feed', array('xmlns' => 'http://www.w3.org/2005/Atom',
'xml:lang' => 'en-US',
'xmlns:thr' => 'http://purl.org/syndication/thread/1.0'));
@@ -1121,7 +1121,7 @@ class ApiAction extends Action
return User::staticGet('nickname', $nickname);
} else if ($this->arg('user_id')) {
// This is to ensure that a non-numeric user_id still
- // overrides screen_name even if it doesn't get used
+ // overrides screen_name even if it does not get used
if (is_numeric($this->arg('user_id'))) {
return User::staticGet('id', $this->arg('user_id'));
}
@@ -1151,7 +1151,7 @@ class ApiAction extends Action
return User_group::staticGet('nickname', $nickname);
} else if ($this->arg('group_id')) {
// This is to ensure that a non-numeric user_id still
- // overrides screen_name even if it doesn't get used
+ // overrides screen_name even if it does not get used
if (is_numeric($this->arg('group_id'))) {
return User_group::staticGet('id', $this->arg('group_id'));
}
diff --git a/lib/apiauth.php b/lib/apiauth.php
index 2f2e44a26..b8189f15d 100644
--- a/lib/apiauth.php
+++ b/lib/apiauth.php
@@ -87,7 +87,7 @@ class ApiAuthAction extends ApiAction
}
/**
- * Check for a user specified via HTTP basic auth. If there isn't
+ * Check for a user specified via HTTP basic auth. If there is not
* one, try to get one by outputting the basic auth header.
*
* @return boolean true or false
diff --git a/lib/common.php b/lib/common.php
index 68bdbf229..c473d9cdb 100644
--- a/lib/common.php
+++ b/lib/common.php
@@ -38,6 +38,8 @@ define('FOREIGN_NOTICE_SEND_REPLY', 4);
define('FOREIGN_FRIEND_SEND', 1);
define('FOREIGN_FRIEND_RECV', 2);
+if ( $_REQUEST['p'] == 'check-fancy') { exit; } //exit with 200 response, if this is checking fancy from the installer
+
define_syslog_variables();
# append our extlib dir as the last-resort place to find libs
@@ -227,7 +229,6 @@ require_once 'markdown.php';
require_once INSTALLDIR.'/lib/util.php';
require_once INSTALLDIR.'/lib/action.php';
-require_once INSTALLDIR.'/lib/theme.php';
require_once INSTALLDIR.'/lib/mail.php';
require_once INSTALLDIR.'/lib/subs.php';
require_once INSTALLDIR.'/lib/Shorturl_api.php';
diff --git a/lib/dberroraction.php b/lib/dberroraction.php
index 2cb66a022..893797b70 100644
--- a/lib/dberroraction.php
+++ b/lib/dberroraction.php
@@ -39,7 +39,7 @@ require_once INSTALLDIR.'/lib/servererroraction.php';
*
* This only occurs if there's been a DB_DataObject_Error that's
* reported through PEAR, so we try to avoid doing anything that connects
- * to the DB, so we don't trigger it again.
+ * to the DB, so we do not trigger it again.
*
* @category Action
* @package StatusNet
@@ -62,12 +62,12 @@ class DBErrorAction extends ServerErrorAction
function getLanguage()
{
- // Don't try to figure out user's language; just show the page
+ // Do not try to figure out user's language; just show the page
return common_config('site', 'language');
}
function showPrimaryNav()
{
- // don't show primary nav
+ // do not show primary nav
}
}
diff --git a/lib/error.php b/lib/error.php
index 3162cfe65..5ed5dec1b 100644
--- a/lib/error.php
+++ b/lib/error.php
@@ -104,11 +104,11 @@ class ErrorAction extends Action
{
parent::showPage();
- // We don't want to have any more output after this
+ // We do not want to have any more output after this
exit();
}
- // Overload a bunch of stuff so the page isn't too bloated
+ // Overload a bunch of stuff so the page is not too bloated
function showBody()
{
diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php
index ce83295fb..73bd9ce81 100644
--- a/lib/htmloutputter.php
+++ b/lib/htmloutputter.php
@@ -76,7 +76,7 @@ class HTMLOutputter extends XMLOutputter
/**
* Start an HTML document
*
- * If $type isn't specified, will attempt to do content negotiation.
+ * If $type is not specified, will attempt to do content negotiation.
*
* Attempts to do content negotiation for language, also.
*
@@ -375,8 +375,8 @@ class HTMLOutputter extends XMLOutputter
$url = parse_url($src);
if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment))
{
- if(file_exists(theme_file($src,$theme))){
- $src = theme_path($src, $theme) . '?version=' . STATUSNET_VERSION;
+ if(file_exists(Theme::file($src,$theme))){
+ $src = Theme::path($src, $theme) . '?version=' . STATUSNET_VERSION;
}else{
$src = common_path($src);
}
diff --git a/lib/imagefile.php b/lib/imagefile.php
index cf1668f20..edc7218d0 100644
--- a/lib/imagefile.php
+++ b/lib/imagefile.php
@@ -119,7 +119,7 @@ class ImageFile
return;
}
- // Don't crop/scale if it isn't necessary
+ // Do not crop/scale if it is not necessary
if ($size === $this->width
&& $size === $this->height
&& $x === 0
diff --git a/lib/jabber.php b/lib/jabber.php
index 73f2ec660..d666fcbb3 100644
--- a/lib/jabber.php
+++ b/lib/jabber.php
@@ -437,7 +437,7 @@ function jabber_public_notice($notice)
$public = common_config('xmpp', 'public');
- // FIXME PRIV don't send out private messages here
+ // FIXME PRIV do not send out private messages here
// XXX: should we send out non-local messages if public,localonly
// = false? I think not
diff --git a/lib/mail.php b/lib/mail.php
index 5218059e9..79630b721 100644
--- a/lib/mail.php
+++ b/lib/mail.php
@@ -467,7 +467,7 @@ function mail_notify_nudge($from, $to)
"these days and is inviting you to post some news.\n\n".
"So let's hear from you :)\n\n".
"%3\$s\n\n".
- "Don't reply to this email; it won't get to them.\n\n".
+ "Do not reply to this email. It will not get to them.\n\n".
"With kind regards,\n".
"%4\$s\n"),
$from_profile->getBestName(),
@@ -516,7 +516,7 @@ function mail_notify_message($message, $from=null, $to=null)
"------------------------------------------------------\n\n".
"You can reply to their message here:\n\n".
"%4\$s\n\n".
- "Don't reply to this email; it won't get to them.\n\n".
+ "Do not reply to this email. It will not get to them.\n\n".
"With kind regards,\n".
"%5\$s\n"),
$from_profile->getBestName(),
@@ -532,7 +532,7 @@ function mail_notify_message($message, $from=null, $to=null)
/**
* notify a user that one of their notices has been chosen as a 'fave'
*
- * Doesn't check that the user has an email address nor if they
+ * Does not check that the user has an email address nor if they
* want to receive notification of faves. Maybe this happens higher
* up the stack...?
*
diff --git a/lib/noticelist.php b/lib/noticelist.php
index 8b3015cc3..4e5623ded 100644
--- a/lib/noticelist.php
+++ b/lib/noticelist.php
@@ -347,7 +347,7 @@ class NoticeListItem extends Widget
* show the link to the main page for the notice
*
* Displays a link to the page for a notice, with "relative" time. Tries to
- * get remote notice URLs correct, but doesn't always succeed.
+ * get remote notice URLs correct, but does not always succeed.
*
* @return void
*/
@@ -483,7 +483,7 @@ class NoticeListItem extends Widget
* show a link to reply to the current notice
*
* Should either do the reply in the current notice form (if available), or
- * link out to the notice-posting form. A little flakey, doesn't always work.
+ * link out to the notice-posting form. A little flakey, does not always work.
*
* @return void
*/
@@ -513,7 +513,7 @@ class NoticeListItem extends Widget
$user = common_current_user();
if (!empty($user) &&
- ($this->notice->profile_id == $user->id || $user->hasRight(Right::deleteOthersNotice))) {
+ ($this->notice->profile_id == $user->id || $user->hasRight(Right::DELETEOTHERSNOTICE))) {
$deleteurl = common_local_url('deletenotice',
array('notice' => $this->notice->id));
diff --git a/lib/noticesection.php b/lib/noticesection.php
index b223932ef..24465f8ba 100644
--- a/lib/noticesection.php
+++ b/lib/noticesection.php
@@ -114,7 +114,7 @@ class NoticeSection extends Section
$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->raw(" ($count&nbsp");
$this->out->element('img', array('style' => 'display: inline', 'align' => 'top', 'width' => 20, 'height' => 20, 'src' => $clip, 'alt' => 'alt'));
diff --git a/lib/oauthstore.php b/lib/oauthstore.php
index d617a7df7..a4ea5ad4d 100644
--- a/lib/oauthstore.php
+++ b/lib/oauthstore.php
@@ -351,7 +351,7 @@ class StatusNetOAuthDataStore extends OAuthDataStore
$author = User::staticGet('uri', $author_uri);
}
if (!$author) {
- throw new Exception('No such user');
+ throw new Exception('No such user.');
}
common_log(LOG_DEBUG, print_r($author, true), __FILE__);
@@ -407,7 +407,7 @@ class StatusNetOAuthDataStore extends OAuthDataStore
$user = User::staticGet('uri', $uri);
}
if (!$user) {
- throw new Exception('No such user');
+ throw new Exception('No such user.');
}
return $user;
}
diff --git a/lib/queuehandler.php b/lib/queuehandler.php
index cd43b1e09..7c07ca4f9 100644
--- a/lib/queuehandler.php
+++ b/lib/queuehandler.php
@@ -96,8 +96,8 @@ class QueueHandler extends Daemon
* Initialization, run when the queue handler starts.
* If this function indicates failure, the handler run will be aborted.
*
- * @fixme run() will abort if this doesn't return true,
- * but some subclasses don't bother.
+ * @fixme run() will abort if this does not return true,
+ * but some subclasses do not bother.
* @return boolean true on success, false on failure
*/
function start()
@@ -108,8 +108,8 @@ class QueueHandler extends Daemon
* Cleanup, run when the queue handler ends.
* If this function indicates failure, a warning will be logged.
*
- * @fixme run() will throw warnings if this doesn't return true,
- * but many subclasses don't bother.
+ * @fixme run() will throw warnings if this does not return true,
+ * but many subclasses do not bother.
* @return boolean true on success, false on failure
*/
function finish()
@@ -137,7 +137,7 @@ class QueueHandler extends Daemon
* method, which passes control back to our handle_notice() method for
* each notice that comes in on the queue.
*
- * Most of the time this won't need to be overridden in a subclass.
+ * Most of the time this will not need to be overridden in a subclass.
*
* @return boolean true on success, false on failure
*/
@@ -173,7 +173,7 @@ class QueueHandler extends Daemon
* Called by QueueHandler after each handled item or empty polling cycle.
* This is a good time to e.g. service your XMPP connection.
*
- * Doesn't need to be overridden if there's no maintenance to do.
+ * Does not need to be overridden if there's no maintenance to do.
*
* @param int $timeout seconds to sleep if there's nothing to do
*/
diff --git a/lib/right.php b/lib/right.php
index 4e0096d46..4fc981af0 100644
--- a/lib/right.php
+++ b/lib/right.php
@@ -45,6 +45,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
class Right
{
- const deleteOthersNotice = 'deleteothersnotice';
+ const DELETEOTHERSNOTICE = 'deleteothersnotice';
+ const CONFIGURESITE = 'configuresite';
}
diff --git a/lib/rssaction.php b/lib/rssaction.php
index faf6bec7d..0e84a65e9 100644
--- a/lib/rssaction.php
+++ b/lib/rssaction.php
@@ -386,7 +386,7 @@ class Rss10Action extends Action
return null;
}
- // FIXME: doesn't handle modified profiles, avatars, deleted notices
+ // FIXME: does not handle modified profiles, avatars, deleted notices
return strtotime($this->notices[0]->created);
}
diff --git a/lib/search_engines.php b/lib/search_engines.php
index 69f6ff468..82713235c 100644
--- a/lib/search_engines.php
+++ b/lib/search_engines.php
@@ -119,7 +119,7 @@ class MySQLSearch extends SearchEngine
return true;
} else if ('identica_notices' === $this->table) {
- // Don't show imported notices
+ // Do not show imported notices
$this->target->whereAdd('notice.is_local != ' . Notice::GATEWAY);
if (strtolower($q) != $q) {
diff --git a/lib/theme.php b/lib/theme.php
index 08e3e8538..020ce1ac4 100644
--- a/lib/theme.php
+++ b/lib/theme.php
@@ -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,215 @@ 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');
+ var $dir = null;
+ 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 = self::localRoot();
+
+ $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 = self::installRoot();
+
+ $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;
}
- 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
- */
+ /**
+ * 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 theme_path($relative, $theme=null)
-{
- if (empty($theme)) {
- $theme = common_config('site', 'theme');
+ 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);
}
- $path = common_config('theme', 'path');
+ /**
+ * 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
+ */
- if (empty($path)) {
- $path = common_config('site', 'path') . '/theme/';
+ static function path($relative, $name=null)
+ {
+ $theme = new Theme($name);
+ return $theme->getPath($relative);
}
- if ($path[strlen($path)-1] != '/') {
- $path .= '/';
+ /**
+ * list available theme names
+ *
+ * @return array list of available theme names
+ */
+
+ static function listAvailable()
+ {
+ $local = self::subdirsOf(self::localRoot());
+ $install = self::subdirsOf(self::installRoot());
+
+ $i = array_search('base', $install);
+
+ unset($install[$i]);
+
+ return array_merge($local, $install);
}
- if ($path[0] != '/') {
- $path = '/'.$path;
+ /**
+ * Utility for getting subdirs of a directory
+ *
+ * @param string $dir full path to directory to check
+ *
+ * @return array relative filenames of subdirs, or empty array
+ */
+
+ protected static function subdirsOf($dir)
+ {
+ $subdirs = array();
+
+ if (is_dir($dir)) {
+ if ($dh = opendir($dir)) {
+ while (($filename = readdir($dh)) !== false) {
+ if ($filename != '..' && $filename !== '.' &&
+ is_dir($dir.'/'.$filename)) {
+ $subdirs[] = $filename;
+ }
+ }
+ closedir($dh);
+ }
+ }
+
+ return $subdirs;
}
- $server = common_config('theme', 'server');
+ /**
+ * Local root dir for themes
+ *
+ * @return string local root dir for themes
+ */
- if (empty($server)) {
- $server = common_config('site', 'server');
+ protected static function localRoot()
+ {
+ return INSTALLDIR.'/local/theme';
}
- // XXX: protocol
+ /**
+ * Root dir for themes that are shipped with StatusNet
+ *
+ * @return string root dir for StatusNet themes
+ */
+
+ protected static function installRoot()
+ {
+ $instroot = common_config('theme', 'dir');
- return 'http://'.$server.$path.$theme.'/'.$relative;
+ if (empty($instroot)) {
+ $instroot = INSTALLDIR.'/theme';
+ }
+
+ return $instroot;
+ }
}
diff --git a/lib/util.php b/lib/util.php
index a4865c46c..b4f5af1af 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -62,7 +62,7 @@ function common_init_language()
$locale_set = common_init_locale($language);
setlocale(LC_CTYPE, 'C');
- // So we don't have to make people install the gettext locales
+ // So we do not have to make people install the gettext locales
$path = common_config('site','locale_path');
bindtextdomain("statusnet", $path);
bind_textdomain_codeset("statusnet", "UTF-8");
@@ -139,7 +139,7 @@ function common_check_user($nickname, $password)
}
}
}else{
- //no handler indicated the credentials were valid, and we know their not valid because the user isn't in the database
+ //no handler indicated the credentials were valid, and we know their not valid because the user is not in the database
return false;
}
} else {
@@ -396,7 +396,7 @@ function common_current_user()
}
// Logins that are 'remembered' aren't 'real' -- they're subject to
-// cookie-stealing. So, we don't let them do certain things. New reg,
+// cookie-stealing. So, we do not let them do certain things. New reg,
// OpenID, and password logins _are_ real.
function common_real_login($real=true)
@@ -1147,7 +1147,7 @@ function common_accept_to_prefs($accept, $def = '*/*')
$parts = explode(',', $accept);
foreach($parts as $part) {
- // FIXME: doesn't deal with params like 'text/html; level=1'
+ // FIXME: does not deal with params like 'text/html; level=1'
@list($value, $qpart) = explode(';', trim($part));
$match = array();
if(!isset($qpart)) {
@@ -1346,7 +1346,7 @@ function common_error_handler($errno, $errstr, $errfile, $errline, $errcontext)
}
// FIXME: show error page if we're on the Web
- /* Don't execute PHP internal error handler */
+ /* Do not execute PHP internal error handler */
return true;
}
@@ -1448,7 +1448,7 @@ function common_shorten_url($long_url)
}
global $_shorteners;
if (!isset($_shorteners[$svc])) {
- //the user selected service doesn't exist, so default to ur1.ca
+ //the user selected service does not exist, so default to ur1.ca
$svc = 'ur1.ca';
}
if (!isset($_shorteners[$svc])) {
diff --git a/lib/xmloutputter.php b/lib/xmloutputter.php
index 5f06e491d..9d862b2d0 100644
--- a/lib/xmloutputter.php
+++ b/lib/xmloutputter.php
@@ -112,7 +112,7 @@ class XMLOutputter
*
* Utility for outputting an XML element. A convenient wrapper
* for a bunch of longer XMLWriter calls. This is best for
- * when an element doesn't have any sub-elements; if that's the
+ * when an element does not have any sub-elements; if that's the
* case, use elementStart() and elementEnd() instead.
*
* The $content element will be escaped for XML. If you need
diff --git a/lib/xmppqueuehandler.php b/lib/xmppqueuehandler.php
index f28fc9088..7caa078ae 100644
--- a/lib/xmppqueuehandler.php
+++ b/lib/xmppqueuehandler.php
@@ -37,7 +37,7 @@ class XmppQueueHandler extends QueueHandler
function start()
{
- # Low priority; we don't want to receive messages
+ # Low priority; we do not want to receive messages
$this->log(LOG_INFO, "INITIALIZE");
$this->conn = jabber_connect($this->_id.$this->transport());