Allow theme.ini to specify external CSS URLs, such as Google Font API loaders.

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.
This commit is contained in:
Brion Vibber 2011-03-09 10:53:12 -08:00
parent 7f42e48631
commit 0a19949f6d
2 changed files with 57 additions and 4 deletions

View 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);

View 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
*