diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php index 0be1668..e9b1412 100644 --- a/inc/poche/Poche.class.php +++ b/inc/poche/Poche.class.php @@ -22,16 +22,6 @@ class Poche private $currentTheme = ''; private $currentLanguage = ''; private $notInstalledMessage = array(); - - # @todo make this dynamic (actually install themes and save them in the database including author information et cetera) - private $installedThemes = array( - 'default' => array('requires' => array()), - 'dark' => array('requires' => array('default')), - 'dmagenta' => array('requires' => array('default')), - 'solarized' => array('requires' => array('default')), - 'solarized-dark' => array('requires' => array('default')), - 'courgette' => array('requires' => array()) - ); public function __construct() { @@ -124,21 +114,26 @@ class Poche } # Check if the selected theme and its requirements are present - if ($this->getTheme() != '' && ! is_dir(THEME . '/' . $this->getTheme())) { - $this->notInstalledMessage[] = 'The currently selected theme (' . $this->getTheme() . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $this->getTheme() . ')'; + $theme = $this->getTheme(); + + if ($theme != '' && ! is_dir(THEME . '/' . $theme)) { + $this->notInstalledMessage[] = 'The currently selected theme (' . $theme . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $theme . ')'; self::$canRenderTemplates = false; $passTheme = FALSE; } - foreach ($this->installedThemes[$this->getTheme()]['requires'] as $requiredTheme) { - if (! is_dir(THEME . '/' . $requiredTheme)) { - $this->notInstalledMessage[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $this->getTheme() . ')'; + $themeInfo = $this->getThemeInfo($theme); + if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { + foreach ($themeInfo['requirements'] as $requiredTheme) { + if (! is_dir(THEME . '/' . $requiredTheme)) { + $this->notInstalledMessage[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'; - self::$canRenderTemplates = false; + self::$canRenderTemplates = false; - $passTheme = FALSE; + $passTheme = FALSE; + } } } @@ -194,32 +189,36 @@ class Poche private function initTpl() { $loaderChain = new Twig_Loader_Chain(); + $theme = $this->getTheme(); # add the current theme as first to the loader chain so Twig will look there first for overridden template files try { - $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $this->getTheme())); + $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $theme)); } catch (Twig_Error_Loader $e) { # @todo isInstalled() should catch this, inject Twig later - die('The currently selected theme (' . $this->getTheme() . ') does not seem to be properly installed (' . THEME . '/' . $this->getTheme() .' is missing)'); + die('The currently selected theme (' . $theme . ') does not seem to be properly installed (' . THEME . '/' . $theme .' is missing)'); } # add all required themes to the loader chain - foreach ($this->installedThemes[$this->getTheme()]['requires'] as $requiredTheme) { - try { - $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . DEFAULT_THEME)); - } catch (Twig_Error_Loader $e) { - # @todo isInstalled() should catch this, inject Twig later - die('The required "' . $requiredTheme . '" theme is missing for the current theme (' . $this->getTheme() . ')'); + $themeInfo = $this->getThemeInfo($theme); + if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { + foreach ($themeInfo['requirements'] as $requiredTheme) { + try { + $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $requiredTheme)); + } catch (Twig_Error_Loader $e) { + # @todo isInstalled() should catch this, inject Twig later + die('The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'); + } } } if (DEBUG_POCHE) { - $twig_params = array(); + $twigParams = array(); } else { - $twig_params = array('cache' => CACHE); + $twigParams = array('cache' => CACHE); } - $this->tpl = new Twig_Environment($loaderChain, $twig_params); + $this->tpl = new Twig_Environment($loaderChain, $twigParams); $this->tpl->addExtension(new Twig_Extensions_Extension_I18n()); # filter to display domain name of an url @@ -235,7 +234,7 @@ class Poche $this->tpl->addFilter($filter); } - private function install() + private function install() { Tools::logm('poche still not installed'); echo $this->tpl->render('install.twig', array( @@ -266,34 +265,59 @@ class Poche return $this->currentTheme; } - public function getLanguage() { - return $this->currentLanguage; + /** + * Provides theme information by parsing theme.ini file if present in the theme's root directory. + * In all cases, the following data will be returned: + * - name: theme's name, or key if the theme is unnamed, + * - current: boolean informing if the theme is the current user theme. + * + * @param string $theme Theme key (directory name) + * @return array|boolean Theme information, or false if the theme doesn't exist. + */ + public function getThemeInfo($theme) { + if (!is_dir(THEME . '/' . $theme)) { + return false; + } + + $themeIniFile = THEME . '/' . $theme . '/theme.ini'; + $themeInfo = array(); + + if (is_file($themeIniFile) && is_readable($themeIniFile)) { + $themeInfo = parse_ini_file($themeIniFile); + } + + if ($themeInfo === false) { + $themeInfo = array(); + } + if (!isset($themeInfo['name'])) { + $themeInfo['name'] = $theme; + } + $themeInfo['current'] = ($theme === $this->getTheme()); + + return $themeInfo; } public function getInstalledThemes() { $handle = opendir(THEME); $themes = array(); - + while (($theme = readdir($handle)) !== false) { # Themes are stored in a directory, so all directory names are themes # @todo move theme installation data to database - if (! is_dir(THEME . '/' . $theme) || in_array($theme, array('..', '.'))) { + if (!is_dir(THEME . '/' . $theme) || in_array($theme, array('.', '..'))) { continue; } - - $current = false; - - if ($theme === $this->getTheme()) { - $current = true; - } - - $themes[] = array('name' => $theme, 'current' => $current); + + $themes[$theme] = $this->getThemeInfo($theme); } - - sort($themes); + return $themes; } + public function getLanguage() { + return $this->currentLanguage; + } + public function getInstalledLanguages() { $handle = opendir(LOCALE); $languages = array(); @@ -600,8 +624,8 @@ class Poche $themes = $this->getInstalledThemes(); $actualTheme = false; - foreach ($themes as $theme) { - if ($theme['name'] == $_POST['theme']) { + foreach (array_keys($themes) as $theme) { + if ($theme == $_POST['theme']) { $actualTheme = true; break; } diff --git a/themes/courgette/_top.twig b/themes/courgette/_top.twig index a2a4b28..792687c 100755 --- a/themes/courgette/_top.twig +++ b/themes/courgette/_top.twig @@ -1,6 +1,6 @@

- {% if view == 'home' %}{% block logo %}logo poche{% endblock %} + {% if view == 'home' %}{% block logo %}logo poche{% endblock %} {% elseif view == 'fav' %}{{ block('logo') }} Favoris {% elseif view == 'archive' %}{{ block('logo') }} Archive {% else %}{{ block('logo') }} diff --git a/themes/courgette/config.twig b/themes/courgette/config.twig index fdeb464..3ab1d92 100755 --- a/themes/courgette/config.twig +++ b/themes/courgette/config.twig @@ -35,8 +35,8 @@
diff --git a/themes/courgette/img/logo.svg b/themes/courgette/img/logo.svg new file mode 100644 index 0000000..865da44 --- /dev/null +++ b/themes/courgette/img/logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/themes/courgette/theme.ini b/themes/courgette/theme.ini new file mode 100644 index 0000000..996d171 --- /dev/null +++ b/themes/courgette/theme.ini @@ -0,0 +1,3 @@ +name = Courgette +description = Responsive black and white theme especially adapted to smartphones. +requirements[] = default diff --git a/themes/dark/theme.ini b/themes/dark/theme.ini new file mode 100644 index 0000000..4b020d3 --- /dev/null +++ b/themes/dark/theme.ini @@ -0,0 +1,2 @@ +name = Dark +requirements[] = default diff --git a/themes/default/config.twig b/themes/default/config.twig index ada238d..df62520 100644 --- a/themes/default/config.twig +++ b/themes/default/config.twig @@ -49,8 +49,8 @@
diff --git a/themes/default/theme.ini b/themes/default/theme.ini new file mode 100644 index 0000000..9f3cfb6 --- /dev/null +++ b/themes/default/theme.ini @@ -0,0 +1 @@ +name = Default \ No newline at end of file diff --git a/themes/dmagenta/theme.ini b/themes/dmagenta/theme.ini new file mode 100644 index 0000000..24ff3c4 --- /dev/null +++ b/themes/dmagenta/theme.ini @@ -0,0 +1,2 @@ +name = Dark Magenta +requirements[] = default diff --git a/themes/solarized-dark/theme.ini b/themes/solarized-dark/theme.ini new file mode 100644 index 0000000..7b6b341 --- /dev/null +++ b/themes/solarized-dark/theme.ini @@ -0,0 +1,2 @@ +name = Dark Solarized +requirements[] = default diff --git a/themes/solarized/theme.ini b/themes/solarized/theme.ini new file mode 100644 index 0000000..703997b --- /dev/null +++ b/themes/solarized/theme.ini @@ -0,0 +1,2 @@ +name = Solarized +requirements[] = default