%PDF- %PDF-
| Direktori : /home/lightco1/luminero.com.au/plugins/system/jsnmobilize/libraries/joomlashine/response/ |
| Current File : /home/lightco1/luminero.com.au/plugins/system/jsnmobilize/libraries/joomlashine/response/image.php |
<?php
/**
* @version $Id$
* @package JSN_Mobilize
* @subpackage SystemPlugin
* @author JoomlaShine Team <support@joomlashine.com>
* @copyright Copyright (C) 2012 JoomlaShine.com. All Rights Reserved.
* @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
*
* Websites: http://www.joomlashine.com
* Technical Support: Feedback - http://www.joomlashine.com/contact-us/get-support.html
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// Import Joomla libraries
jimport('joomla.filesystem.file');
jimport('joomla.installer.helper');
/**
* Class for mass resizing images loaded in HTML response body.
*
* @package JSN_Mobilize
* @subpackage SystemPlugin
* @since 1.0.0
*/
class JSNResponseImage
{
/**
* Initialize all img tags to schedule image resizing via AJAX request.
*
* @param string $path Absolute path to the directory for storing optimized image.
* @param integer $maxWidth Maximum allowed image width.
* @param string $responseBody Generated HTML response body.
* @param boolean $setNewResponse Set new response body directly or return as string.
*
* @return mixed
*/
public static function init($path, $maxWidth, $responseBody = '', $setNewResponse = true)
{
if (!JFolder::exists($path))
{
JFolder::create($path);
}
// Initialize reponse body
!empty($responseBody) OR $responseBody = JResponse::getBody();
// Get all img tags loaded in response body
if (preg_match_all('#<img([^>]+)? src=("|\')([^"\']+)("|\')([^>]+)?>#i', $responseBody, $matches, PREG_SET_ORDER))
{
foreach ($matches AS $match)
{
// Image already optimized
$replace = '';
if (is_readable($imagePath = $path . DS . $maxWidth . DS . basename($match[3])))
{
// Get link to optimized image
$link = JURI::root(true) . str_replace(
str_replace(array('/', '\\'), array('/', '/'), JPATH_ROOT),
'',
str_replace(array('/', '\\'), array('/', '/'), $path . DS . $maxWidth . DS . basename($match[3]))
);
// Get image dimension
$imageSize = @getimagesize($imagePath);
// Generate replacement
$replace = self::updateImageDimension(
str_replace('src=' . $match[2] . $match[3] . $match[4], 'src=' . $match[2] . $link . $match[4], $match[0]),
$imageSize[0],
$imageSize[1],
$match[2]
);
// Update response body
$responseBody = str_replace($match[0], $replace, $responseBody);
}
// Image not optimized
else
{
// Get image path
$imagePath = str_replace(
array(JURI::root(), JURI::root(true)),
array(JPATH_ROOT, JPATH_ROOT),
$match[3]
);
// Download remote image
if (substr($imagePath, 0, 5) == 'http:' OR substr($imagePath, 0, 6) == 'https:')
{
if (!($tmp = JInstallerHelper::downloadPackage($imagePath)))
{
continue;
}
$imagePath = $path . DS . basename($tmp);
// Move downloaded image to the directory for storing optimized image files
JFile::move(JFactory::getConfig()->get('tmp_path') . DS . $tmp, $imagePath);
}
// Get image dimension
$imageSize = @getimagesize($imagePath);
if ($imageSize[0] > $maxWidth)
{
// Replace remote image with local one if necessary
if (strpos($match[3], JURI::root()) !== 0 AND strpos($match[3], JURI::root(true)) !== 0)
{
// Generate replacement
$tmpPath = str_replace(JPATH_ROOT, JURI::root(true), $imagePath);
$replace[3] = str_replace('\\', '/', $tmpPath);
$replace[0] = str_replace($match[3], $replace[3], $match[0]);
// Update response body
$responseBody = str_replace($match[0], $replace[0], $responseBody);
// Update matching result
$match[0] = $replace[0];
$match[3] = $replace[3];
}
// Update response body
self::updateResponseBody($responseBody, $match, $path, $maxWidth, $imageSize);
}
elseif (strpos($match[0], 'width=') === false OR strpos($match[0], 'height=') === false)
{
// Generate replacement
$replace = self::updateImageDimension($match[0], $imageSize[0], $imageSize[1], $match[2]);
// Update response body
$responseBody = str_replace($match[0], $replace, $responseBody);
}
}
}
}
// Set new response body directly or return it?
return $setNewResponse ? JResponse::setBody($responseBody) : $responseBody;
}
/**
* Set image dimension to img tag.
*
* @param string $imgTag Original img tag.
* @param integer $width Image width to set to img tag.
* @param integer $height Image height to set to img tag.
* @param string $quote Quotation mark (either " or ') to wrap around attribute value.
*
* @return string
*/
protected static function updateImageDimension($imgTag, $width, $height, $quote = '"')
{
foreach (array('width' => $width, 'height' => $height) AS $attr => $value)
{
if (strpos($imgTag, "{$attr}=") === false)
{
$imgTag = str_replace('<img', "<img {$attr}=" . $quote . $value . $quote, $imgTag);
}
else
{
$imgTag = preg_replace("/{$attr}={$quote}[^\\{$quote}]*{$quote}/", "{$attr}=" . $quote . $value . $quote, $imgTag);
}
}
return $imgTag;
}
/**
* Update HTML response body.
*
* @param string &$responseBody Generated HTML response body.
* @param string $match Matched img tag.
* @param string $path Absolute path to the directory for storing optimized image.
* @param integer $maxWidth Maximum allowed image width.
* @param array $imageSize Dimension of original image: array(0 => width, 1 => height)
*
* @return void
*/
protected static function updateResponseBody(&$responseBody, $match, $path, $maxWidth, $imageSize)
{
// Shorten destination path
$path = str_replace(
str_replace(array('/', '\\'), DS, JPATH_ROOT) . DS,
'',
str_replace(array('/', '\\'), DS, $path)
);
// Generate image optimization link
$link = trim(JURI::root(), '/')
. '/plugins/system/jsnmobilize/libraries/joomlashine/response/image/resizer.php?src='
. $match[3] . '&width=' . $maxWidth . '&dest=' . $path . '&return=uri';
// Calculate optimized image dimension
$imageSize[1] = round(($maxWidth / $imageSize[0]) * $imageSize[1]);
$imageSize[0] = $maxWidth;
// Generate replacement
$replace = str_replace(
'src=' . $match[2] . $match[3] . $match[4],
'_src=' . $match[2] . $link . $match[4],
self::updateImageDimension($match[0], $imageSize[0], $imageSize[1], $match[2])
);
//var_dump($replace);
// Manipulate attributes
foreach (array('alt' => JText::_('JSN_MOBILIZE_IMAGE_LOADING'), 'class' => 'jsn-mobilize-image-loading') AS $attr => $value)
{
if (strpos($replace, "{$attr}=") === false)
{
$replace = str_replace('<img', "<img {$attr}=" . $match[2] . $value . $match[4], $replace);
}
else
{
$replace = str_replace("{$attr}=", "{$attr}=" . $match[2] . $value . $match[4] . "_{$attr}=", $replace);
}
}
// Update response body
$responseBody = str_replace($match[0], $replace, $responseBody);
}
}