]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Allow theme.ini to specify external CSS URLs, such as Google Font API loaders.
authorBrion Vibber <brion@pobox.com>
Wed, 9 Mar 2011 18:53:12 +0000 (10:53 -0800)
committerBrion Vibber <brion@pobox.com>
Wed, 9 Mar 2011 19:38:43 +0000 (11:38 -0800)
Example theme.ini:

  external="http://fonts.googleapis.com/css?family=Lato:100,100italic,300,300italic,400,400italic,700,700italic,900,900italic"
  include=rebase

Notes:
* URLs must be quoted in the .ini file or the .ini file parser explodes!
* To do multiples, list as external[] instead of external.
* If there's an included base theme, any externals it lists will be included first.
* All externals are loaded before any local styles.

lib/action.php
lib/theme.php

index ca380cc02ce4d13cd302dc88d5d8e000f22c6be9..ea3b50a229af4e4c50ebf582ffef038d24a40e73 100644 (file)
@@ -267,9 +267,16 @@ class Action extends HTMLOutputter // lawsuit
 
     function primaryCssLink($mainTheme=null, $media=null)
     {
+        $theme = new Theme($mainTheme);
+
+        // Some themes may have external stylesheets, such as using the
+        // Google Font APIs to load webfonts.
+        foreach ($theme->getExternals() as $url) {
+            $this->cssLink($url, $mainTheme, $media);
+        }
+
         // If the currently-selected theme has dependencies on other themes,
         // we'll need to load their display.css files as well in order.
-        $theme = new Theme($mainTheme);
         $baseThemes = $theme->getDeps();
         foreach ($baseThemes as $baseTheme) {
             $this->cssLink('css/display.css', $baseTheme, $media);
index 5caa046c208c05d13f6b4b6d37e913042608d545..b5f2b58cf2401ba142f8cbdbc242a831b63d8944 100644 (file)
@@ -56,6 +56,9 @@ class Theme
     var $name = null;
     var $dir  = null;
     var $path = null;
+    protected $metadata = null; // access via getMetadata() lazy-loader
+    protected $externals = null;
+    protected $deps = null;
 
     /**
      * Constructor
@@ -199,9 +202,12 @@ class Theme
      */
     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)
@@ -233,6 +239,20 @@ class Theme
      * @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)) {
@@ -242,6 +262,32 @@ class Theme
         }
     }
 
+    /**
+     * 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
      *