*/
class Theme
{
+ const FALLBACK = 'neo';
+
var $name = null;
var $dir = null;
var $path = null;
+ protected $metadata = null; // access via getMetadata() lazy-loader
+ protected $externals = null;
+ protected $deps = null;
/**
* Constructor
if (file_exists($fulldir) && is_dir($fulldir)) {
$this->dir = $fulldir;
$this->path = $this->relativeThemePath('theme', 'theme', $name);
+ return;
}
+
+ // Ruh roh. Fall back to default, then.
+
+ common_log(LOG_WARNING, sprintf("Unable to find theme '%s', falling back to default theme '%s'",
+ $name,
+ Theme::FALLBACK));
+
+ $this->name = Theme::FALLBACK;
+ $this->dir = $instroot.'/'.Theme::FALLBACK;
+ $this->path = $this->relativeThemePath('theme', 'theme', Theme::FALLBACK);
+
}
/**
*/
protected function relativeThemePath($group, $fallbackSubdir, $name)
{
- if (StatusNet::isHTTPS()) {
+ if (GNUsocial::isHTTPS()) {
$sslserver = common_config($group, 'sslserver');
if (empty($sslserver)) {
*/
function getDeps()
{
- $chain = $this->doGetDeps(array($this->name));
- array_pop($chain); // Drop us back off
- return $chain;
+ if ($this->deps === null) {
+ $chain = $this->doGetDeps(array($this->name));
+ array_pop($chain); // Drop us back off
+ $this->deps = $chain;
+ }
+ return $this->deps;
}
protected function doGetDeps($chain)
* @return associative array of strings
*/
function getMetadata()
+ {
+ if ($this->metadata == null) {
+ $this->metadata = $this->doGetMetadata();
+ }
+ return $this->metadata;
+ }
+
+ /**
+ * Pull data from the theme's theme.ini file.
+ * @fixme calling getFile will fall back to default theme, this may be unsafe.
+ *
+ * @return associative array of strings
+ */
+ private function doGetMetadata()
{
$iniFile = $this->getFile('theme.ini');
if (file_exists($iniFile)) {
}
}
+ /**
+ * Get list of any external URLs required by this theme and any
+ * dependencies. These are lazy-loaded from theme.ini.
+ *
+ * @return array of URL strings
+ */
+ function getExternals()
+ {
+ if ($this->externals == null) {
+ $data = $this->getMetadata();
+ if (!empty($data['external'])) {
+ $ext = (array)$data['external'];
+ } else {
+ $ext = array();
+ }
+
+ if (!empty($data['include'])) {
+ $theme = new Theme($data['include']);
+ $ext = array_merge($ext, $theme->getExternals());
+ }
+
+ $this->externals = array_unique($ext);
+ }
+ return $this->externals;
+ }
+
/**
* Gets the full path of a file in a theme dir based on its relative name
*