Files
server/usr/share/psa-pear/pear/php/Horde/Themes/Css.php
2026-01-07 20:52:11 +01:00

259 lines
7.8 KiB
PHP

<?php
/**
* This class provides an interface to handling CSS stylesheets for Horde
* applications.
*
* Copyright 2010-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl21.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Core
*/
class Horde_Themes_Css
{
/**
* @deprecated
* @since Horde 2.3.0
*/
const CSS_URL_REGEX = '/url\s*\(["\']?(.*?)["\']?\)/i';
/**
* The theme cache ID.
*
* @var string
*/
protected $_cacheid;
/**
* A list of additional stylesheet files to add to the output.
*
* @var array
*/
protected $_cssFiles = array();
/**
* A list of additional themed stylesheet files to add to the output.
*
* @var array
*/
protected $_cssThemeFiles = array();
/**
* Adds an external stylesheet to the output.
*
* @param string $file The CSS filepath.
* @param string $url The CSS URL.
*/
public function addStylesheet($file, $url)
{
$this->_cssFiles[$file] = $url;
}
/**
* Adds a themed stylesheet to the output.
*
* @param string $file The stylesheet name.
*/
public function addThemeStylesheet($file)
{
$this->_cssThemeFiles[$file] = true;
}
/**
* Generate the stylesheet URLs needed to display the current page.
* Honors configuration choices as to stylesheet caching.
*
* @param array $opts Additional options:
* <pre>
* - app: (string) The current application.
* - nobase: (boolean) If true, don't load base stylesheets.
* - nocache: (boolean) If true, don't load files from cache.
* - nohorde: (boolean) If true, don't load files from Horde.
* - sub: (string) A subdirectory containing additional CSS files to
* load as an overlay to the base CSS files.
* - subonly: (boolean) If true, only load the files in 'sub', not
* the default theme files.
* - theme: (string) Use this theme instead of the default.
* - themeonly: (boolean) If true, only load the theme files.
* </pre>
*
* @return array The list of URLs to display (Horde_Url objects).
*/
public function getStylesheetUrls(array $opts = array())
{
global $conf, $injector, $prefs;
$theme = isset($opts['theme'])
? $opts['theme']
: $prefs->getValue('theme');
$css = $this->getStylesheets($theme, $opts);
if (!count($css)) {
return array();
}
$cache_ob = empty($opts['nocache'])
? $injector->getInstance('Horde_Core_CssCache')
: new Horde_Themes_Css_Cache_Null();
return $cache_ob->process($css, $this->_cacheid);
}
/**
* Return the list of base stylesheets to display.
*
* @param mixed $theme The theme to use; specify an empty value to
* retrieve the theme from user preferences, and
* false for no theme.
* @param array $opts Additional options:
* <pre>
* - app: (string) The current application.
* - nobase: (boolean) If true, don't load base stylesheets.
* - nohorde: (boolean) If true, don't load files from Horde.
* - sub: (string) A subdirectory containing additional CSS files to
* load as an overlay to the base CSS files.
* - subonly: (boolean) If true, only load the files in 'sub', not
* the default theme files.
* - themeonly: (boolean) If true, only load the theme files.
* </pre>
*
* @return array An array of 2-element array arrays containing 2 keys:
* <pre>
* - app: (string) App of the CSS file.
* - fs: (string) Filesystem location of stylesheet.
* - uri: (string) URI of stylesheet.
* </pre>
*/
public function getStylesheets($theme = '', array $opts = array())
{
global $injector, $prefs, $registry;
if (($theme === '') && isset($prefs)) {
$theme = $prefs->getValue('theme');
}
$add_css = $css_out = array();
$css_list = empty($opts['nobase'])
? $this->getBaseStylesheetList()
: array();
$css_list = array_unique(array_merge($css_list, array_keys($this->_cssThemeFiles)));
$curr_app = empty($opts['app'])
? $registry->getApp()
: $opts['app'];
$mask = empty($opts['nohorde'])
? 0
: Horde_Themes_Cache::APP_DEFAULT | Horde_Themes_Cache::APP_THEME;
$sub = empty($opts['sub'])
? null
: $opts['sub'];
$cache = $injector->getInstance('Horde_Core_Factory_ThemesCache')->create($curr_app, $theme);
$this->_cacheid = $cache->getCacheId();
/* Add external stylesheets first, since they are ALWAYS overwritable
* by Horde code. */
foreach ($this->_cssFiles as $f => $u) {
if (file_exists($f)) {
$css_out[] = array(
'app' => null,
'fs' => $f,
'uri' => $u
);
}
}
/* Add theme stylesheets. */
foreach ($css_list as $css_name) {
if (empty($opts['subonly'])) {
$css_out = array_merge($css_out, array_reverse($cache->getAll($css_name, $mask)));
}
if ($sub) {
$css_out = array_merge($css_out, array_reverse($cache->getAll($sub . '/' . $css_name, $mask)));
}
}
/* Add user-defined additional stylesheets. */
$hooks = $injector->getInstance('Horde_Core_Hooks');
try {
$add_css = array_merge($add_css, $hooks->callHook('cssfiles', 'horde', array($theme)));
} catch (Horde_Exception_HookNotSet $e) {}
if ($curr_app != 'horde') {
try {
$add_css = array_merge($add_css, $hooks->callHook('cssfiles', $curr_app, array($theme)));
} catch (Horde_Exception_HookNotSet $e) {}
}
foreach ($add_css as $f => $u) {
$css_out[] = array(
'app' => $curr_app,
'fs' => $f,
'uri' => $u
);
}
return $css_out;
}
/**
* Returns the list of base stylesheets, based on the current language
* and browser settings.
*
* @return array A list of base CSS files to load.
*/
public function getBaseStylesheetList()
{
$css_list = array('screen.css');
if ($GLOBALS['registry']->nlsconfig->curr_rtl) {
$css_list[] = 'rtl.css';
}
/* Collect browser specific stylesheets if needed. */
switch ($GLOBALS['browser']->getBrowser()) {
case 'msie':
$ie_major = $GLOBALS['browser']->getMajor();
if ($ie_major == 8) {
$css_list[] = 'ie8.css';
}
break;
case 'opera':
$css_list[] = 'opera.css';
break;
case 'mozilla':
$css_list[] = 'mozilla.css';
break;
case 'webkit':
$css_list[] = 'webkit.css';
}
return $css_list;
}
/**
* Loads CSS files, cleans up the input, and concatenates to a string.
*
* @deprecated Use Horde_Themes_Css_Compress instead.
*
* @param array $files List of CSS files as returned from
* getStylesheets().
*
* @return string CSS data.
*/
public function loadCssFiles($files)
{
$compress = new Horde_Themes_Css_Compress();
return $compress->compress($files);
}
}