From acbc733dce0ed4bcdbea6a0ce88da7a18e2dffa0 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 28 Apr 2018 18:28:23 -0400 Subject: [PATCH 1/5] Fix formatting in Core\Theme --- src/Core/Theme.php | 312 ++++++++++++++++++++++----------------------- 1 file changed, 153 insertions(+), 159 deletions(-) diff --git a/src/Core/Theme.php b/src/Core/Theme.php index 9133eae187..16eb7939c5 100644 --- a/src/Core/Theme.php +++ b/src/Core/Theme.php @@ -1,7 +1,9 @@ - * * Maintainer: Jane - * * - * \endcode - * @param string $theme the name of the theme - * @return array - */ + /** + * @brief Parse theme comment in search of theme infos. + * + * like + * \code + * ..* Name: My Theme + * * Description: My Cool Theme + * . * Version: 1.2.3 + * * Author: John + * * Maintainer: Jane + * * + * \endcode + * @param string $theme the name of the theme + * @return array + */ + public static function getInfo($theme) + { + $info = [ + 'name' => $theme, + 'description' => "", + 'author' => [], + 'maintainer' => [], + 'version' => "", + 'credits' => "", + 'experimental' => file_exists("view/theme/$theme/experimental"), + 'unsupported' => file_exists("view/theme/$theme/unsupported") + ]; - public static function getInfo($theme) - { - $info=[ - 'name' => $theme, - 'description' => "", - 'author' => [], - 'maintainer' => [], - 'version' => "", - 'credits' => "", - 'experimental' => false, - 'unsupported' => false - ]; + if (!is_file("view/theme/$theme/theme.php")) { + return $info; + } - if (file_exists("view/theme/$theme/experimental")) - $info['experimental'] = true; - if (file_exists("view/theme/$theme/unsupported")) - $info['unsupported'] = true; + $a = get_app(); + $stamp1 = microtime(true); + $theme_file = file_get_contents("view/theme/$theme/theme.php"); + $a->save_timestamp($stamp1, "file"); - if (!is_file("view/theme/$theme/theme.php")) return $info; + $result = preg_match("|/\*.*\*/|msU", $theme_file, $matches); - $a = get_app(); - $stamp1 = microtime(true); - $f = file_get_contents("view/theme/$theme/theme.php"); - $a->save_timestamp($stamp1, "file"); + if ($result) { + $comment_lines = explode("\n", $matches[0]); + foreach ($comment_lines as $comment_line) { + $comment_line = trim($comment_line, "\t\n\r */"); + if ($comment_line != "") { + list($key, $value) = array_map("trim", explode(":", $comment_line, 2)); + $key = strtolower($key); + if ($key == "author") { + $result = preg_match("|([^<]+)<([^>]+)>|", $value, $matches); + if ($result) { + $info['author'][] = ['name' => $matches[1], 'link' => $matches[2]]; + } else { + $info['author'][] = ['name' => $value]; + } + } elseif ($key == "maintainer") { + $result = preg_match("|([^<]+)<([^>]+)>|", $value, $matches); + if ($result) { + $info['maintainer'][] = ['name' => $matches[1], 'link' => $matches[2]]; + } else { + $info['maintainer'][] = ['name' => $value]; + } + } elseif (array_key_exists($key, $info)) { + $info[$key] = $value; + } + } + } + } + return $info; + } - $r = preg_match("|/\*.*\*/|msU", $f, $m); + /** + * @brief Returns the theme's screenshot. + * + * The screenshot is expected as view/theme/$theme/screenshot.[png|jpg]. + * + * @param sring $theme The name of the theme + * @return string + */ + public static function getScreenshot($theme) + { + $exts = ['.png', '.jpg']; + foreach ($exts as $ext) { + if (file_exists('view/theme/' . $theme . '/screenshot' . $ext)) { + return(System::baseUrl() . '/view/theme/' . $theme . '/screenshot' . $ext); + } + } + return(System::baseUrl() . '/images/blank.png'); + } - if ($r) { - $ll = explode("\n", $m[0]); - foreach ( $ll as $l ) { - $l = trim($l,"\t\n\r */"); - if ($l != "") { - list($k, $v) = array_map("trim", explode(":", $l, 2)); - $k= strtolower($k); - if ($k == "author") { + // install and uninstall theme + public static function uninstall($theme) + { + logger("Addons: uninstalling theme " . $theme); - $r=preg_match("|([^<]+)<([^>]+)>|", $v, $m); - if ($r) { - $info['author'][] = ['name'=>$m[1], 'link'=>$m[2]]; - } else { - $info['author'][] = ['name'=>$v]; - } - } elseif ($k == "maintainer") { - $r=preg_match("|([^<]+)<([^>]+)>|", $v, $m); - if ($r) { - $info['maintainer'][] = ['name'=>$m[1], 'link'=>$m[2]]; - } else { - $info['maintainer'][] = ['name'=>$v]; - } - } else { - if (array_key_exists($k, $info)) { - $info[$k] = $v; - } - } - } - } - } - return $info; - } + include_once "view/theme/$theme/theme.php"; + if (function_exists("{$theme}_uninstall")) { + $func = "{$theme}_uninstall"; + $func(); + } + } - /** - * @brief Returns the theme's screenshot. - * - * The screenshot is expected as view/theme/$theme/screenshot.[png|jpg]. - * - * @param sring $theme The name of the theme - * @return string - */ - public static function getScreenshot($theme) - { - $exts = ['.png','.jpg']; - foreach ($exts as $ext) { - if (file_exists('view/theme/' . $theme . '/screenshot' . $ext)) { - return(System::baseUrl() . '/view/theme/' . $theme . '/screenshot' . $ext); - } - } - return(System::baseUrl() . '/images/blank.png'); - } + public static function install($theme) + { + // silently fail if theme was removed - // install and uninstall theme - public static function uninstall($theme) - { - logger("Addons: uninstalling theme " . $theme); + if (!file_exists("view/theme/$theme/theme.php")) { + return false; + } - include_once("view/theme/$theme/theme.php"); - if (function_exists("{$theme}_uninstall")) { - $func = "{$theme}_uninstall"; - $func(); - } - } + logger("Addons: installing theme $theme"); - public static function install($theme) - { - // silently fail if theme was removed + include_once "view/theme/$theme/theme.php"; - if (! file_exists("view/theme/$theme/theme.php")) { - return false; - } + if (function_exists("{$theme}_install")) { + $func = "{$theme}_install"; + $func(); + return true; + } else { + logger("Addons: FAILED installing theme $theme"); + return false; + } + } - logger("Addons: installing theme $theme"); + /** + * @brief Get the full path to relevant theme files by filename + * + * This function search in the theme directory (and if not present in global theme directory) + * if there is a directory with the file extension and for a file with the given + * filename. + * + * @param string $file Filename + * @param string $root Full root path + * @return string Path to the file or empty string if the file isn't found + */ + public static function getPathForFile($file, $root = '') + { + $file = basename($file); - include_once("view/theme/$theme/theme.php"); - - if (function_exists("{$theme}_install")) { - $func = "{$theme}_install"; - $func(); - return true; - } else { - logger("Addons: FAILED installing theme $theme"); - return false; - } - - } - - /** - * @brief Get the full path to relevant theme files by filename - * - * This function search in the theme directory (and if not present in global theme directory) - * if there is a directory with the file extension and for a file with the given - * filename. - * - * @param string $file Filename - * @param string $root Full root path - * @return string Path to the file or empty string if the file isn't found - */ - public static function getPathForFile($file, $root = '') - { - $file = basename($file); - - // Make sure $root ends with a slash / if it's not blank - if ($root !== '' && $root[strlen($root)-1] !== '/') { - $root = $root . '/'; - } - $theme_info = get_app()->theme_info; - if (is_array($theme_info) && array_key_exists('extends',$theme_info)) { - $parent = $theme_info['extends']; - } else { - $parent = 'NOPATH'; - } - $theme = current_theme(); - $thname = $theme; - $ext = substr($file,strrpos($file,'.')+1); - $paths = [ - "{$root}view/theme/$thname/$ext/$file", - "{$root}view/theme/$parent/$ext/$file", - "{$root}view/$ext/$file", - ]; - foreach ($paths as $p) { - // strpos() is faster than strstr when checking if one string is in another (http://php.net/manual/en/function.strstr.php) - if (strpos($p,'NOPATH') !== false) { - continue; - } elseif (file_exists($p)) { - return $p; - } - } - return ''; - } + // Make sure $root ends with a slash / if it's not blank + if ($root !== '' && $root[strlen($root) - 1] !== '/') { + $root = $root . '/'; + } + $theme_info = get_app()->theme_info; + if (is_array($theme_info) && array_key_exists('extends', $theme_info)) { + $parent = $theme_info['extends']; + } else { + $parent = 'NOPATH'; + } + $theme = current_theme(); + $thname = $theme; + $ext = substr($file, strrpos($file, '.') + 1); + $paths = [ + "{$root}view/theme/$thname/$ext/$file", + "{$root}view/theme/$parent/$ext/$file", + "{$root}view/$ext/$file", + ]; + foreach ($paths as $p) { + // strpos() is faster than strstr when checking if one string is in another (http://php.net/manual/en/function.strstr.php) + if (strpos($p, 'NOPATH') !== false) { + continue; + } elseif (file_exists($p)) { + return $p; + } + } + return ''; + } } From 964bf3f3cc1f8c00a0c204f04057bffaeda25db1 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 28 Apr 2018 18:30:13 -0400 Subject: [PATCH 2/5] Add new methods to src - Add App::getCurrentTheme() - Add App::getCurrentThemeStylesheetPath() - Add Theme::getStylesheetPath() --- src/App.php | 81 ++++++++++++++++++++++++++++++++++++++++++++++ src/Core/Theme.php | 21 ++++++++++++ 2 files changed, 102 insertions(+) diff --git a/src/App.php b/src/App.php index d76351b97a..815a02f281 100644 --- a/src/App.php +++ b/src/App.php @@ -1067,4 +1067,85 @@ class App return $sender_email; } + + /** + * Returns the current theme name. + * + * @return string + */ + public function getCurrentTheme() + { + if (!$this->current_theme) { + $this->computeCurrentTheme(); + } + + return $this->current_theme; + } + + /** + * Computes the current theme name based on the node settings, the user settings and the device type + * + * @throws Exception + */ + private function computeCurrentTheme() + { + $system_theme = Config::get('system', 'theme'); + if (!$system_theme) { + throw new Exception(L10n::t('No system theme config value set.')); + } + + // Sane default + $this->current_theme = $system_theme; + + $allowed_themes = explode(',', Config::get('system', 'allowed_themes', $system_theme)); + + $page_theme = null; + // Find the theme that belongs to the user whose stuff we are looking at + if ($this->profile_uid && ($this->profile_uid != local_user())) { + // Allow folks to override user themes and always use their own on their own site. + // This works only if the user is on the same server + $user = dba::selectFirst('user', ['theme'], ['uid' => $this->profile_uid]); + if (DBM::is_result($user) && !PConfig::get(local_user(), 'system', 'always_my_theme')) { + $page_theme = $user['theme']; + } + } + + $user_theme = defaults($_SESSION, 'theme', $system_theme); + // Specific mobile theme override + if (($this->is_mobile || $this->is_tablet) && defaults($_SESSION, 'show-mobile', true)) { + $system_mobile_theme = Config::get('system', 'mobile-theme'); + $user_mobile_theme = defaults($_SESSION, 'mobile-theme', $system_mobile_theme); + + // --- means same mobile theme as desktop + if (!empty($user_mobile_theme) && $user_mobile_theme !== '---') { + $user_theme = $user_mobile_theme; + } + } + + if ($page_theme) { + $theme_name = $page_theme; + } else { + $theme_name = $user_theme; + } + + if ($theme_name + && in_array($theme_name, $allowed_themes) + && (file_exists('view/theme/' . $theme_name . '/style.css') + || file_exists('view/theme/' . $theme_name . '/style.php')) + ) { + $this->current_theme = $theme_name; + } + } + + /** + * @brief Return full URL to theme which is currently in effect. + * + * Provide a sane default if nothing is chosen or the specified theme does not exist. + * + * @return string + */ + public function getCurrentThemeStylesheetPath() + { + return Core\Theme::getStylesheetPath($this->getCurrentTheme()); + } } diff --git a/src/Core/Theme.php b/src/Core/Theme.php index 16eb7939c5..fe38d09ede 100644 --- a/src/Core/Theme.php +++ b/src/Core/Theme.php @@ -180,4 +180,25 @@ class Theme } return ''; } + + /** + * @brief Return relative path to theme stylesheet file + * + * Provide a sane default if nothing is chosen or the specified theme does not exist. + * + * @param string $theme Theme name + * + * @return string + */ + public static function getStylesheetPath($theme) + { + $a = get_app(); + + $opts = (($a->profile_uid) ? '?f=&puid=' . $a->profile_uid : ''); + if (file_exists('view/theme/' . $theme . '/style.php')) { + return 'view/theme/' . $theme . '/style.pcss' . $opts; + } + + return 'view/theme/' . $theme . '/style.css'; + } } From 3213715b6001cb01cb158b191c8fad38db715619 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 28 Apr 2018 18:33:52 -0400 Subject: [PATCH 3/5] Fix formatting in frio_boot.php --- view/theme/frio/php/frio_boot.php | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/view/theme/frio/php/frio_boot.php b/view/theme/frio/php/frio_boot.php index 1f816c5b2f..243ea5c72c 100644 --- a/view/theme/frio/php/frio_boot.php +++ b/view/theme/frio/php/frio_boot.php @@ -14,24 +14,23 @@ use Friendica\App; * * @todo Check if this is really needed. */ -function load_page(App $a) { - if(isset($_GET["mode"]) && ($_GET["mode"] == "minimal")) { - require "view/theme/frio/minimal.php"; - } elseif((isset($_GET["mode"]) && ($_GET["mode"] == "none"))) { - require "view/theme/frio/none.php"; +function load_page(App $a) +{ + if (isset($_GET['mode']) && ($_GET['mode'] == 'minimal')) { + require 'view/theme/frio/minimal.php'; + } elseif ((isset($_GET['mode']) && ($_GET['mode'] == 'none'))) { + require 'view/theme/frio/none.php'; } else { $template = 'view/theme/' . current_theme() . '/' - . ((x($a->page,'template')) ? $a->page['template'] : 'default' ) . '.php'; - if(file_exists($template)) - require_once($template); - else - require_once(str_replace('theme/' . current_theme() . '/', '', $template)); + . ((x($a->page, 'template')) ? $a->page['template'] : 'default' ) . '.php'; + if (file_exists($template)) { + require_once $template; + } else { + require_once str_replace('theme/' . current_theme() . '/', '', $template); + } } - - } - /** * @brief Check if page is a modal page * From fde3d6f8705906f8b04da381194e68128f7a78e4 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 28 Apr 2018 18:37:04 -0400 Subject: [PATCH 4/5] Replace current_theme() and current_theme_url() calls --- include/text.php | 2 +- index.php | 12 ++++++------ src/Core/Addon.php | 11 ++++++----- src/Core/Theme.php | 2 +- src/Model/Profile.php | 2 +- src/Render/FriendicaSmarty.php | 2 +- src/Render/FriendicaSmartyEngine.php | 2 +- view/theme/frio/php/frio_boot.php | 4 ++-- view/theme/frio/php/scheme.php | 4 +++- 9 files changed, 22 insertions(+), 19 deletions(-) diff --git a/include/text.php b/include/text.php index 5e189d58f1..52b51bdb0c 100644 --- a/include/text.php +++ b/include/text.php @@ -513,7 +513,7 @@ function load_view_file($s) { return $content; } - $theme = current_theme(); + $theme = $a->getCurrentTheme(); if (file_exists("$d/theme/$theme/$b")) { $stamp1 = microtime(true); diff --git a/index.php b/index.php index 2f23ea791a..b7ae6f1d4a 100644 --- a/index.php +++ b/index.php @@ -330,7 +330,7 @@ if (strlen($a->module)) { /** * Load current theme info */ -$theme_info_file = "view/theme/".current_theme()."/theme.php"; +$theme_info_file = 'view/theme/' . $a->getCurrentTheme() . '/theme.php'; if (file_exists($theme_info_file)) { require_once $theme_info_file; } @@ -363,8 +363,8 @@ if ($a->module_loaded) { $func($a); } - if (function_exists(str_replace('-', '_', current_theme()) . '_init')) { - $func = str_replace('-', '_', current_theme()) . '_init'; + if (function_exists(str_replace('-', '_', $a->getCurrentTheme()) . '_init')) { + $func = str_replace('-', '_', $a->getCurrentTheme()) . '_init'; $func($a); } @@ -402,8 +402,8 @@ if ($a->module_loaded) { $a->page['content'] .= $arr['content']; } - if (function_exists(str_replace('-', '_', current_theme()) . '_content_loaded')) { - $func = str_replace('-', '_', current_theme()) . '_content_loaded'; + if (function_exists(str_replace('-', '_', $a->getCurrentTheme()) . '_content_loaded')) { + $func = str_replace('-', '_', $a->getCurrentTheme()) . '_content_loaded'; $func($a); } } @@ -478,7 +478,7 @@ if ($a->is_mobile || $a->is_tablet) { */ if (!$a->theme['stylesheet']) { - $stylesheet = current_theme_url(); + $stylesheet = $a->getCurrentThemeStylesheetPath(); } else { $stylesheet = $a->theme['stylesheet']; } diff --git a/src/Core/Addon.php b/src/Core/Addon.php index 3adc7fc0ec..50247d240f 100644 --- a/src/Core/Addon.php +++ b/src/Core/Addon.php @@ -228,14 +228,15 @@ class Addon /** * @brief Calls a single hook. * - * @param string $name of the hook to call - * @param array $hook Hook data - * @param string|array &$data to transmit to the callback handler + * @param \Friendica\App $a + * @param string $name of the hook to call + * @param array $hook Hook data + * @param string|array &$data to transmit to the callback handler */ - public static function callSingleHook($a, $name, $hook, &$data = null) + public static function callSingleHook(\Friendica\App $a, $name, $hook, &$data = null) { // Don't run a theme's hook if the user isn't using the theme - if (strpos($hook[0], 'view/theme/') !== false && strpos($hook[0], 'view/theme/'.current_theme()) === false) { + if (strpos($hook[0], 'view/theme/') !== false && strpos($hook[0], 'view/theme/' . $a->getCurrentTheme()) === false) { return; } diff --git a/src/Core/Theme.php b/src/Core/Theme.php index fe38d09ede..c64ed08d3b 100644 --- a/src/Core/Theme.php +++ b/src/Core/Theme.php @@ -162,7 +162,7 @@ class Theme } else { $parent = 'NOPATH'; } - $theme = current_theme(); + $theme = get_app()->getCurrentTheme(); $thname = $theme; $ext = substr($file, strrpos($file, '.') + 1); $paths = [ diff --git a/src/Model/Profile.php b/src/Model/Profile.php index d4773a8062..8bb519448e 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -152,7 +152,7 @@ class Profile $a->set_template_engine(); // reset the template engine to the default in case the user's theme doesn't specify one - $theme_info_file = 'view/theme/' . current_theme() . '/theme.php'; + $theme_info_file = 'view/theme/' . $a->getCurrentTheme() . '/theme.php'; if (file_exists($theme_info_file)) { require_once $theme_info_file; } diff --git a/src/Render/FriendicaSmarty.php b/src/Render/FriendicaSmarty.php index ab19993081..8c8e637630 100644 --- a/src/Render/FriendicaSmarty.php +++ b/src/Render/FriendicaSmarty.php @@ -22,7 +22,7 @@ class FriendicaSmarty extends Smarty parent::__construct(); $a = get_app(); - $theme = current_theme(); + $theme = $a->getCurrentTheme(); // setTemplateDir can be set to an array, which Smarty will parse in order. // The order is thus very important here diff --git a/src/Render/FriendicaSmartyEngine.php b/src/Render/FriendicaSmartyEngine.php index 949ac58c82..c6e95ee068 100644 --- a/src/Render/FriendicaSmartyEngine.php +++ b/src/Render/FriendicaSmartyEngine.php @@ -62,7 +62,7 @@ class FriendicaSmartyEngine implements ITemplateEngine $root = $root . '/'; } - $theme = current_theme(); + $theme = $a->getCurrentTheme(); $filename = $template::SMARTY3_TEMPLATE_FOLDER . '/' . $file; if (file_exists("{$root}view/theme/$theme/$filename")) { diff --git a/view/theme/frio/php/frio_boot.php b/view/theme/frio/php/frio_boot.php index 243ea5c72c..3f8ed1ed0b 100644 --- a/view/theme/frio/php/frio_boot.php +++ b/view/theme/frio/php/frio_boot.php @@ -21,12 +21,12 @@ function load_page(App $a) } elseif ((isset($_GET['mode']) && ($_GET['mode'] == 'none'))) { require 'view/theme/frio/none.php'; } else { - $template = 'view/theme/' . current_theme() . '/' + $template = 'view/theme/' . $a->getCurrentTheme() . '/' . ((x($a->page, 'template')) ? $a->page['template'] : 'default' ) . '.php'; if (file_exists($template)) { require_once $template; } else { - require_once str_replace('theme/' . current_theme() . '/', '', $template); + require_once str_replace('theme/' . $a->getCurrentTheme() . '/', '', $template); } } } diff --git a/view/theme/frio/php/scheme.php b/view/theme/frio/php/scheme.php index 02de0a0359..538839b2c2 100644 --- a/view/theme/frio/php/scheme.php +++ b/view/theme/frio/php/scheme.php @@ -19,9 +19,11 @@ */ use Friendica\Core\PConfig; +require_once 'boot.php'; + function get_scheme_info($scheme) { - $theme = current_theme(); + $theme = get_app()->getCurrentTheme(); $themepath = 'view/theme/' . $theme . '/'; $scheme = PConfig::get(local_user(), 'frio', 'scheme', PConfig::get(local_user(), 'frio', 'scheme')); From 220242b55ae3f6f61432f1114b179a4753268af3 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 28 Apr 2018 18:37:41 -0400 Subject: [PATCH 5/5] Remove current_theme() and current_theme_url() functions --- boot.php | 108 ------------------------------------------------------- 1 file changed, 108 deletions(-) diff --git a/boot.php b/boot.php index 1ca8b8d8d8..c0f16b0557 100644 --- a/boot.php +++ b/boot.php @@ -1018,114 +1018,6 @@ function get_max_import_size() return (x($a->config, 'max_import_size') ? $a->config['max_import_size'] : 0); } - -function current_theme() -{ - $app_base_themes = ['duepuntozero', 'dispy', 'quattro']; - - $a = get_app(); - - $page_theme = null; - - // Find the theme that belongs to the user whose stuff we are looking at - - if ($a->profile_uid && ($a->profile_uid != local_user())) { - $r = q( - "select theme from user where uid = %d limit 1", - intval($a->profile_uid) - ); - if (DBM::is_result($r)) { - $page_theme = $r[0]['theme']; - } - } - - // Allow folks to over-rule user themes and always use their own on their own site. - // This works only if the user is on the same server - - if ($page_theme && local_user() && (local_user() != $a->profile_uid)) { - if (PConfig::get(local_user(), 'system', 'always_my_theme')) { - $page_theme = null; - } - } - -// $mobile_detect = new Mobile_Detect(); -// $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet(); - $is_mobile = $a->is_mobile || $a->is_tablet; - - $standard_system_theme = Config::get('system', 'theme', ''); - $standard_theme_name = ((isset($_SESSION) && x($_SESSION, 'theme')) ? $_SESSION['theme'] : $standard_system_theme); - - if ($is_mobile) { - if (isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) { - $theme_name = $standard_theme_name; - } else { - $system_theme = Config::get('system', 'mobile-theme', ''); - if ($system_theme == '') { - $system_theme = $standard_system_theme; - } - $theme_name = ((isset($_SESSION) && x($_SESSION, 'mobile-theme')) ? $_SESSION['mobile-theme'] : $system_theme); - - if ($theme_name === '---') { - // user has selected to have the mobile theme be the same as the normal one - $theme_name = $standard_theme_name; - - if ($page_theme) { - $theme_name = $page_theme; - } - } - } - } else { - $theme_name = $standard_theme_name; - - if ($page_theme) { - $theme_name = $page_theme; - } - } - - if ($theme_name - && (file_exists('view/theme/' . $theme_name . '/style.css') - || file_exists('view/theme/' . $theme_name . '/style.php')) - ) { - return($theme_name); - } - - foreach ($app_base_themes as $t) { - if (file_exists('view/theme/' . $t . '/style.css') - || file_exists('view/theme/' . $t . '/style.php') - ) { - return($t); - } - } - - $fallback = array_merge(glob('view/theme/*/style.css'), glob('view/theme/*/style.php')); - if (count($fallback)) { - return (str_replace('view/theme/', '', substr($fallback[0], 0, -10))); - } - - /// @TODO No final return statement? -} - -/** - * @brief Return full URL to theme which is currently in effect. - * - * Provide a sane default if nothing is chosen or the specified theme does not exist. - * - * @return string - */ -function current_theme_url() -{ - $a = get_app(); - - $t = current_theme(); - - $opts = (($a->profile_uid) ? '?f=&puid=' . $a->profile_uid : ''); - if (file_exists('view/theme/' . $t . '/style.php')) { - return('view/theme/' . $t . '/style.pcss' . $opts); - } - - return('view/theme/' . $t . '/style.css'); -} - function feed_birthday($uid, $tz) { /**