From 1b203b4df8810da493c7a13898fade3a77665f66 Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Thu, 15 Jan 2009 11:05:05 -0700 Subject: [PATCH] Allow remaining images on DIMP main page to be loaded via Data URL Loading DIMP's index page on a supported browser, with CSS/JS caching, now results in 0 images that need to be separately loaded. Should probably move this to Horde core proper ASAP (along with all JS/CSS caching code) so that other apps can make use of this. This is less effective for non-AJAXy applications since the data needs to be sent on every page load (vs. the image data being cached in CSS). However, some images are generated on the fly/don't reside in the app themes directory so they aren't available to be served via CSS. --- imp/lib/DIMP.php | 6 ++-- imp/lib/IMAP/Thread.php | 11 +++++-- imp/lib/IMP.php | 74 ++++++++++++++++++++++++++++++++++++++++--- imp/templates/index/index.inc | 10 +++--- 4 files changed, 85 insertions(+), 16 deletions(-) diff --git a/imp/lib/DIMP.php b/imp/lib/DIMP.php index 07a7d1b5f..9658c98c3 100644 --- a/imp/lib/DIMP.php +++ b/imp/lib/DIMP.php @@ -50,8 +50,8 @@ class DIMP empty($params['id']) ? array() : array('id' => $params['id']), !empty($title)) . (!empty($params['icon']) - ? Horde::img($params['icon'], $title, '', - $GLOBALS['registry']->getImageDir(empty($params['app']) ? 'imp' : $params['app'])) + ? IMP::img($params['icon'], $title, '', + $GLOBALS['registry']->getImageDir(empty($params['app']) ? 'imp' : $params['app'])) : '') . $title . ''; } @@ -422,7 +422,7 @@ class DIMP if ($elt['user_icon']) { $ob->cl = 'custom'; - $ob->i = Horde::img($elt['icon'], $elt['alt'], '', $elt['icondir']); + $ob->i = IMP::img($elt['icon'], $elt['alt'], '', $elt['icondir']); } return $ob; diff --git a/imp/lib/IMAP/Thread.php b/imp/lib/IMAP/Thread.php index 8a8ebec42..911ccff7c 100644 --- a/imp/lib/IMAP/Thread.php +++ b/imp/lib/IMAP/Thread.php @@ -133,12 +133,13 @@ class IMP_IMAP_Thread /** * Get potential image URLs that may be used to display a thread. * - * @param ids $ids Add unique DOM ID to each image? + * @param ids $ids Add unique DOM ID to each image? + * @param ids $datauri Output data URIs, if possible? * * @return array An array with the image code as a key and the image url * as the value. */ - static public function getImageUrls($ids = true) + static public function getImageUrls($ids = true, $datauri = false) { $graphicsdir = $GLOBALS['registry']->getImageDir('horde'); $args = array(); @@ -147,7 +148,11 @@ class IMP_IMAP_Thread if ($ids) { $args['id'] = 'thread_img_' . $key; } - $out[$key] = Horde::img('tree/' . (($key != 0 && !empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) ? ('rev-' . $val) : $val), '', $args, $graphicsdir); + if ($datauri) { + $out[$key] = IMP::img('tree/' . (($key != 0 && !empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) ? ('rev-' . $val) : $val), '', $args, $graphicsdir); + } else { + $out[$key] = Horde::img('tree/' . (($key != 0 && !empty($GLOBALS['nls']['rtl'][$GLOBALS['language']])) ? ('rev-' . $val) : $val), '', $args, $graphicsdir); + } } return $out; diff --git a/imp/lib/IMP.php b/imp/lib/IMP.php index b3553ba9b..74a4a3ef7 100644 --- a/imp/lib/IMP.php +++ b/imp/lib/IMP.php @@ -1723,14 +1723,20 @@ class IMP } /** - * TODO + * TODO - Move to Horde core */ public function stylesheetCallback($matches) { - return $matches[1] . - 'data:image/' . substr($matches[2], strrpos($matches[2], '.') + 1) . ';base64,' . - base64_encode(file_get_contents(dirname(realpath($GLOBALS['registry']->get('fileroot', 'horde'))) . $matches[2])) . - $matches[3]; + return $matches[1] . IMP::base64ImgData($matches[2]) . $matches[3]; + } + + /** + * TODO - Move to Horde core + */ + public function base64ImgData($file) + { + return 'data:image/' . substr($file, strrpos($file, '.') + 1) . ';base64,' . + base64_encode(file_get_contents(dirname(realpath($GLOBALS['registry']->get('fileroot', 'horde'))) . $file)); } /** @@ -1812,6 +1818,64 @@ class IMP } /** + * Constructs a correctly-pathed link to an image. + * TODO - Move to Horde core + * + * @param string $src The image file. + * @param string $alt Text describing the image. + * @param mixed $attr 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. + * @param string $dir The root graphics directory. + * + * @return string The full image tag. + */ + static public function img($src, $alt = '', $attr = '', $dir = null) + { + /* If browser does not support images, simply return the ALT text. */ + if (!$GLOBALS['browser']->hasFeature('images') || + !$GLOBALS['browser']->hasFeature('dataurl')) { + return Horde::img($src, $alt, $attr, $dir); + } + + /* If no directory has been specified, get it from the registry. */ + if (is_null($dir)) { + $dir = $GLOBALS['registry']->getImageDir(); + } + + /* If a directory has been provided, prepend it to the image source. */ + if (!empty($dir)) { + $src = $dir . '/' . $src; + } + + /* Build all of the tag attributes. */ + $attributes = array('alt' => $alt); + if (is_array($attr)) { + $attributes = array_merge($attributes, $attr); + } + if (empty($attributes['title'])) { + $attributes['title'] = ''; + } + + $img = ' $value) { + $img .= ' ' . $attribute . '="' . ($attribute == 'src' ? $value : htmlspecialchars($value, ENT_COMPAT, $charset)) . '"'; + } + error_reporting($old_error); + + /* If the user supplied a pre-built string of attributes, add that. */ + if (is_string($attr) && !empty($attr)) { + $img .= ' ' . $attr; + } + + /* Return the closed image tag. */ + return $img . ' src="' . IMP::base64ImgData($src) . '" />'; + } + + + /** * Do garbage collection in the statically served file directory. * * @param string $type Either 'css' or 'js'. diff --git a/imp/templates/index/index.inc b/imp/templates/index/index.inc index 30bd697f6..e774978f1 100644 --- a/imp/templates/index/index.inc +++ b/imp/templates/index/index.inc @@ -3,13 +3,13 @@ $hordeimg = $registry->getImageDir('horde'); // Thread images -$thread_imgs = IMP_IMAP_Thread::getImageUrls(); +$thread_imgs = IMP_IMAP_Thread::getImageUrls(true, true); // Attachment images $imp_ui = new IMP_UI_Mailbox('INBOX'); $atc_imgs = array(); foreach ($imp_ui->getAttachmentAltList() as $k => $v) { - $atc_imgs[] = Horde::img($k . '.png', $v, array('id' => 'atc_img_' . $k)); + $atc_imgs[] = IMP::img($k . '.png', $v, array('id' => 'atc_img_' . $k)); } $usetrash = $prefs->getValue('use_trash'); @@ -47,8 +47,8 @@ function _simpleButton($id, $text, $image, $imagedir = null) . (strlen($id) ? ' id="' . $id . '"' : '') . (strlen($ak) ? ' accesskey="' . $ak . '"' : '') . '>' . ($imagedir - ? Horde::img($image, Horde::stripAccessKey($text), '', $imagedir) - : Horde::img($image, Horde::stripAccessKey($text))) + ? IMP::img($image, Horde::stripAccessKey($text), '', $imagedir) + : IMP::img($image, Horde::stripAccessKey($text))) . '' . Horde::highlightAccessKey($text, $ak) . ''; } @@ -287,7 +287,7 @@ function _simpleButton($id, $text, $image, $imagedir = null)