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

151 lines
4.6 KiB
PHP

<?php
/**
* 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.
*
* @category Horde
* @copyright 2010-2017 Horde LLC
* @license http://www.horde.org/licenses/lgpl21 LGPL
* @package Core
*/
/**
* An object-oriented interface to a themed image.
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2010-2017 Horde LLC
* @license http://www.horde.org/licenses/lgpl21 LGPL
* @package Core
*
* @property-read string $base64img See Horde_Themes_Image::base64ImgData()
* (since 2.10.0).
*/
class Horde_Themes_Image extends Horde_Themes_Element
{
/**
* The default directory name for this element type.
*
* @var string
*/
protected $_dirname = 'graphics';
/**
*/
public function __get($name)
{
switch ($name) {
case 'base64img':
return self::base64ImgData($this);
default:
return parent::__get($name);
}
}
/**
* Constructs a correctly-pathed tag to an image.
*
* @param mixed $src The image file (either a string or a
* Horde_Themes_Image object).
* @param array $opts Additional options:
* - alt: (string) Text describing the image.
* - attr: (mixed) Any additional attributes for the image tag. Can be a
* pre-built string or an array of key/value pairs that will be
* assembled and html-encoded.
* - fullsrc: (boolean) TODO
* - imgopts: (array) TODO
*
* @return string The full image tag.
*/
public static function tag($src, array $opts = array())
{
global $browser, $conf;
$opts = array_merge(array(
'alt' => '',
'attr' => array(),
'fullsrc' => false,
'imgopts' => array()
), $opts);
/* If browser does not support images, simply return the ALT text. */
if (!$browser->hasFeature('images')) {
return htmlspecialchars($opts['alt']);
}
$xml = new SimpleXMLElement('<root><img ' . (is_array($opts['attr']) ? '' : $opts['attr']) . '/></root>');
$img = $xml->img;
if (is_array($opts['attr'])) {
foreach ($opts['attr'] as $key => $val) {
$img->addAttribute($key, $val);
}
}
if (strlen($opts['alt'])) {
$img->addAttribute('alt', $opts['alt']);
}
/* If no directory has been specified, get it from the registry. */
if (!($src instanceof Horde_Themes_Image) &&
(substr($src, 0, 1) != '/')) {
$src = Horde_Themes::img($src, $opts['imgopts']);
}
if (empty($conf['nobase64_img'])) {
$src = self::base64ImgData($src);
}
if ($opts['fullsrc'] && (substr($src, 0, 10) != 'data:image')) {
$src = Horde::url($src, true, array('append_session' => -1));
}
$img->addAttribute('src', $src);
return $img->asXML();
}
/*
* Generate RFC 2397-compliant image data strings.
*
* @param mixed $in URI or Horde_Themes_Image object containing
* image data.
* @param integer $limit Sets a hard size limit for image data; if
* exceeded, will not string encode.
*
* @return string The string to use in the image 'src' attribute; either
* the image data if the browser supports, or the URI
* if not.
*/
public static function base64ImgData($in, $limit = null)
{
if (!($dataurl = $GLOBALS['browser']->hasFeature('dataurl'))) {
return $in;
}
if (!is_null($limit) &&
(is_bool($dataurl) || ($limit < $dataurl))) {
$dataurl = $limit;
}
/* Only encode image files if they are below the dataurl limit. */
if (!($in instanceof Horde_Themes_Image)) {
$in = self::fromUri($in);
}
if (!file_exists($in->fs)) {
return $in->uri;
}
/* Delete approx. 50 chars from the limit to account for the various
* data/base64 header text. Multiply by 0.75 to determine the
* base64 encoded size. */
return (($dataurl === true) ||
(filesize($in->fs) <= (($dataurl * 0.75) - 50)))
? strval(Horde_Url_Data::create(Horde_Mime_Magic::extToMime(substr($in->uri, strrpos($in->uri, '.') + 1)), file_get_contents($in->fs)))
: $in->uri;
}
}