| Server IP : 180.180.241.3 / Your IP : 216.73.216.35 Web Server : Microsoft-IIS/7.5 System : Windows NT NETWORK-NHRC 6.1 build 7601 (Windows Server 2008 R2 Standard Edition Service Pack 1) i586 User : IUSR ( 0) PHP Version : 5.3.28 Disable Function : NONE MySQL : ON | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /AppServ/www/app/webroot/new_news/wp-content/plugins/foogallery/includes/WPThumb/ |
Upload File : |
<?php
/*
Plugin Name: WP Thumb
Plugin URI: https://github.com/humanmade/WPThumb
Description: An on-demand image generation replacement for WordPress' image resizing.
Author: Human Made Limited
Version: 0.10
Author URI: http://www.hmn.md/
*/
/* Copyright 2014 Human Made Limited (email : hello@humanmade.co.uk)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
define( 'WP_THUMB_PATH', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
define( 'WP_THUMB_URL', plugin_dir_url( __FILE__ ) );
// TODO wpthumb_create_args_from_size filter can pass string or array which makes it difficult to hook into
// Load the watermarking class
include_once( WP_THUMB_PATH . '/wpthumb.watermark.php' );
include_once( WP_THUMB_PATH . '/wpthumb.background-fill.php' );
include_once( WP_THUMB_PATH . '/wpthumb.crop-from-position.php' );
include_once( WP_THUMB_PATH . '/wpthumb.shortcodes.php' );
/**
* Base WP_Thumb class
*
*/
class WP_Thumb {
/**
* Array of image args
*
* @var array
* @access private
*/
private $args;
/**
* The file path the original image
*
* @var string
* @access private
*/
private $file_path;
private static $wp_upload_dir;
private static function uploadDir() {
if ( empty( self::$wp_upload_dir ) ) {
self::$wp_upload_dir = wp_upload_dir();
}
// if blogs are ever switched we need to clear the cache
add_action( 'switch_blog', array( 'WP_Thumb', 'clearUploadDirCache' ) );
return self::$wp_upload_dir;
}
/**
* Clear the internally cached upload dir. WP Thumb cached the results of wp_upload_dir()
* for performance, however it's sometimes necessary to clear the internal cache, such as switching
* blogs in multisite
*/
public static function clearUploadDirCache() {
self::$wp_upload_dir = null;
}
private static function get_home_path() {
return str_replace( str_replace( home_url(), '', site_url() ), '', ABSPATH );
}
/**
* Setup phpthumb, parse the args and generate the cache file
*
* @access public
*
* @param string $file_path . (default: null)
* @param array $args . (default: array())
*/
public function __construct( $file_path = null, $args = array() ) {
if ( $file_path ) {
$this->setFilePath( $file_path );
}
if ( $args ) {
$this->setArgs( $args );
}
if ( $this->getFilePath() && ! $this->errored() ) {
if ( ! file_exists( $this->getCacheFilePath() ) || ! $this->args['cache'] ) {
$this->generateCacheFile();
}
}
}
/**
* Set the file path of the original image
*
* Will convert URLS to paths.
*
* @param string $file_path
*/
public function setFilePath( $file_path ) {
$upload_dir = self::uploadDir();
$this->_file_path = null;
if ( strpos( $file_path, self::get_home_path() ) === 0 ) {
$this->file_path = $file_path;
return;
}
// If it's an uploaded file
if ( strpos( $file_path, $upload_dir['baseurl'] ) !== false ) {
$this->file_path = str_replace( $upload_dir['baseurl'], $upload_dir['basedir'], $file_path );
} else {
$this->file_path = str_replace( trailingslashit( home_url() ), self::get_home_path(), $file_path );
}
// if it's a local path, lets check it now
if ( strpos( $this->file_path, '/' ) === 0 && strpos( $this->file_path, '//' ) !== 0 && ! file_exists( $this->file_path ) ) {
$this->error = new WP_Error( 'file-not-found' );
}
}
/**
* Parse the args and merge with defaults
*
* @param array $args
*/
public function setArgs( $args ) {
$arg_defaults = array(
'width' => 0,
'height' => 0,
'crop' => false,
'crop_from_position' => 'center,center',
'resize' => true,
'watermark_options' => array(),
'cache' => true,
'skip_remote_check' => false,
'default' => null,
'jpeg_quality' => 90,
'resize_animations' => true,
'return' => 'url',
'custom' => false,
'background_fill' => null,
'output_file' => false,
'cache_with_query_params' => false
);
$args = wp_parse_args( $args, $arg_defaults );
$new_args = array();
if ( $args['width'] === 'thumbnail' ) {
$new_args = array(
'width' => get_option( 'thumbnail_size_w' ),
'height' => get_option( 'thumbnail_size_h' ),
'crop' => get_option( 'thumbnail_crop' )
);
} elseif ( $args['width'] === 'medium' ) {
$new_args = array( 'width' => get_option( 'medium_size_w' ), 'height' => get_option( 'medium_size_h' ) );
} elseif ( $args['width'] === 'large' ) {
$new_args = array( 'width' => get_option( 'large_size_w' ), 'height' => get_option( 'large_size_h' ) );
} elseif ( is_string( $args['width'] ) && $args['width'] ) {
$new_args = apply_filters( 'wpthumb_create_args_from_size', $args );
} elseif ( is_array( $args['width'] ) ) {
$new_args = $args;
}
$args = wp_parse_args( $new_args, $args );
// Cast some args
$args['crop'] = (bool) $args['crop'];
$args['resize'] = (bool) $args['resize'];
$args['cache'] = (bool) $args['cache'];
$args['width'] = (int) $args['width'];
$args['height'] = (int) $args['height'];
// Format the crop from position arg
if ( is_string( $args['crop_from_position'] ) && $args['crop_from_position'] ) {
$args['crop_from_position'] = explode( ',', $args['crop_from_position'] );
}
$this->args = $args;
}
/**
* Return the file path to the original image
*
* @return string
*/
public function getFilePath() {
if ( ! empty( $this->_file_path ) ) {
return $this->_file_path;
}
if ( strpos( $this->file_path, '/' ) === 0 && ! file_exists( $this->file_path ) && $this->args['default'] ) {
$this->file_path = $this->args['default'];
} elseif ( ( ! $this->file_path ) && $this->args['default'] && file_exists( $this->args['default'] ) ) {
$this->file_path = $this->args['default'];
}
if ( $this->getArg( 'cache_with_query_params' ) ) {
return $this->file_path;
}
$path_bits = explode( '?', $this->file_path );
$this->_file_path = reset( $path_bits );
return $this->_file_path;
}
/**
* Return the array of args
*
* @return array
*/
public function getArgs() {
return (array) $this->args;
}
/**
* Get a specific arg
*
* @access public
*
* @param string $arg
* @return mixed
*/
public function getArg( $arg ) {
if ( isset( $this->args[ $arg ] ) ) {
return $this->args[ $arg ];
}
return false;
}
/**
* Get the extension of the original image
*
* @return string
*/
public function getFileExtension() {
$ext = pathinfo( $this->getFilePath(), PATHINFO_EXTENSION );
if ( ! $ext ) {
// Seems like we dont have an ext, lets guess at JPG
$ext = 'jpg';
}
return strtolower( $ext );
}
/**
* Get the filepath to the cache file
*
* @access public
* @return string
*/
public function getCacheFilePath() {
$path = $this->getFilePath();
if ( ! $path ) {
return '';
}
return apply_filters( 'wpthumb_cache_file_path', trailingslashit( $this->getCacheFileDirectory() ) . $this->getCacheFileName(), $this );
}
/**
* Get the directory that the cache file should be saved too
*
* @return string
*/
public function getCacheFileDirectory() {
if ( $this->getArg( 'output_file' ) ) {
return dirname( $this->getArg( 'output_file' ) );
}
$path = $this->getFilePath();
if ( ! $path ) {
return '';
}
$original_filename = basename( $this->getFilePath() );
// TODO use pathinfo
$parts = explode( '.', $original_filename );
array_pop( $parts );
$filename_nice = implode( '_', $parts );
$upload_dir = self::uploadDir();
if ( strpos( $this->getFilePath(), $upload_dir['basedir'] ) === 0 ) :
$subdir = dirname( str_replace( $upload_dir['basedir'], '', $this->getFilePath() ) );
$new_dir = $upload_dir['basedir'] . '/cache' . trailingslashit( $subdir ) . $filename_nice;
elseif ( strpos( $this->getFilePath(), WP_CONTENT_DIR ) === 0 ) :
$subdir = dirname( str_replace( WP_CONTENT_DIR, '', $this->getFilePath() ) );
$new_dir = $upload_dir['basedir'] . '/cache' . trailingslashit( $subdir ) . $filename_nice;
elseif ( strpos( $this->getFilePath(), self::get_home_path() ) === 0 ) :
$new_dir = $upload_dir['basedir'] . '/cache/local';
else :
$parts = parse_url( $this->getFilePath() );
if ( ! empty( $parts['host'] ) )
$new_dir = $upload_dir['basedir'] . '/cache/remote/' . sanitize_title( $parts['host'] );
else
$new_dir = $upload_dir['basedir'] . '/cache/remote';
endif;
// TODO unit test for whether this is needed or not
$new_dir = str_replace( '/cache/cache', '/cache', $new_dir );
return $new_dir;
}
/**
* Get the filename of the cache file
*
* @return string
*/
public function getCacheFileName() {
if ( $this->getArg( 'output_file' ) )
return basename( $this->getArg( 'output_file' ) );
$path = $this->getFilePath();
if ( ! $path )
return '';
// Generate a short unique filename
$serialize = crc32( serialize( array_merge( $this->getArgs(), array( $this->getFilePath() ) ) ) );
// Gifs are converted to pngs
if ( $this->getFileExtension() == 'gif' )
return $serialize . '.png';
return $serialize . '.' . $this->getFileExtension();
}
public function isRemote() {
return strpos( $this->getFilePath(), self::get_home_path() ) !== 0;
}
/**
* Generate the new cache file using the original image and args
*
* @return string new filepath
*/
public function generateCacheFile() {
$new_filepath = $this->getCacheFilePath();
$file_path = $this->getFilePath();
// Up the php memory limit
@ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', '256M' ) );
// Create the image
$editor = wp_get_image_editor( $file_path, array( 'methods' => array( 'get_image' ) ) );
/**
* Workaround to preserve image blending when images are not specifically resized (smaller than dimensions for example)
*/
if ( is_a( $editor, 'WP_Thumb_Image_Editor_GD' ) ) {
imagealphablending( $editor->get_image(), false );
imagesavealpha( $editor->get_image(), true );
}
if ( is_wp_error( $editor ) ) {
$this->error = $editor;
return $this->returnImage();
}
wp_mkdir_p( $this->getCacheFileDirectory() );
// Convert gif images to png before resizing
if ( $this->getFileExtension() == 'gif' ) :
// Save the converted image
$editor->save( $new_filepath, 'image/png' );
// Pass the new file back through the function so they are resized
return new WP_Thumb( $new_filepath, array_merge( $this->args, array(
'output_file' => $new_filepath,
'cache' => false
) ) );
endif;
// Apply JPEG quality settings args
$editor->set_quality( $this->args['jpeg_quality'] );
apply_filters( 'wpthumb_image_pre', $editor, $this->args );
if (is_array($this->args)) extract( $this->args );
// Cropping
if ( $crop && $crop_from_position && $crop_from_position !== array( 'center', 'center' ) ) :
$this->crop_from_position( $editor, $width, $height, $crop_from_position, $resize );
elseif ( $crop === true && $resize === true ) :
$editor->resize( $width, $height, true );
elseif ( $crop === true && $resize === false ) :
$this->crop_from_center( $editor, $width, $height );
else :
$editor->resize( $width, $height );
endif;
apply_filters( 'wpthumb_image_post', $editor, $this->args );
$editor->save( $new_filepath );
do_action( 'wpthumb_saved_cache_image', $this );
}
private function crop_from_center( $editor, $width, $height ) {
$size = $editor->get_size();
$crop = array( 'x' => 0, 'y' => 0, 'width' => $size['width'], 'height' => $size['height'] );
if ( $width < $size['width'] ) {
$crop['x'] = intval( ( $size['width'] - $width ) / 2 );
$crop['width'] = $width;
}
if ( $height < $size['height'] ) {
$crop['y'] = intval( ( $size['height'] - $height ) / 2 );
$crop['height'] = $height;
}
return $editor->crop( $crop['x'], $crop['y'], $crop['width'], $crop['height'] );
}
private function crop_from_position( $editor, $width, $height, $position, $resize = true ) {
$size = $editor->get_size();
// resize to the largest dimension
if ( $resize ) {
$ratio1 = $size['width'] / $size['height'];
$ratio2 = $width / $height;
if ( $ratio1 < $ratio2 ) {
$_width = $width;
$_height = $width / $ratio1;
} else {
$_height = $height;
$_width = $height * $ratio1;
}
$editor->resize( $_width, $_height );
}
$size = $editor->get_size();
$crop = array( 'x' => 0, 'y' => 0 );
if ( $position[0] == 'right' )
$crop['x'] = absint( $size['width'] - $width );
else if ( $position[0] == 'center' )
$crop['x'] = intval( absint( $size['width'] - $width ) / 2 );
if ( $position[1] == 'bottom' )
$crop['y'] = absint( $size['height'] - $height );
else if ( $position[1] == 'center' )
$crop['y'] = intval( absint( $size['height'] - $height ) / 2 );
return $editor->crop( $crop['x'], $crop['y'], $width, $height );
}
/**
* Is there an error
*
* @access public
* @return null
*/
public function errored() {
return ! empty( $this->error );
}
/**
* Returns the error
*
* @access public
* @return null
*/
public function error() {
return empty( $this->error ) ? null : $this->error;
}
/**
* Return the finished image
*
* If there was an error, return the original
*
* @access public
* @return null
*/
public function returnImage() {
if ( $this->errored() ) {
$path = $this->getFilePath();
} else {
$path = $this->getCacheFilePath();
}
if ( $this->args['return'] == 'path' )
return $path;
return $path ? $this->getFileURLForFilePath( $path ) : $path;
}
/**
* Get the url for the cache file
*
* @return string
*/
public function getCacheFileURL() {
return $this->getFileURLForFilePath( $this->getCacheFilePath() );
}
/**
* Get the url for the original file
*
* @access public
* @return null
*/
public function getFileURL() {
return $this->getFileURLForFilePath( $this->getFilePath() );
}
/**
* Convert a path into a url
*
* @param string $path
* @return string url
*/
private function getFileURLForFilePath( $path ) {
$upload_dir = self::uploadDir();
if ( strpos( $path, $upload_dir['basedir'] ) !== false ) {
return str_replace( $upload_dir['basedir'], $upload_dir['baseurl'], $path );
} else {
return str_replace( self::get_home_path(), trailingslashit( home_url() ), $path );
}
}
}
/**
* Resizes a given image (local).
*
* @param mixed absolute path to the image
* @param int $width .
* @param int $height .
* @param bool $crop . (default: false)
* @return (string) url to the image
*/
function wpthumb( $url, $args = array() ) {
$thumb = new WP_Thumb( $url, $args );
$return = $thumb->returnImage();
return $return;
}
/**
* Hook WP Thumb into the WordPress image functions
*
* Usage `the_post_thumbnail( 'width=100&height=200&crop=1' );`
*
* @param null $null
* @param int $id
* @param array $args
* @return null
*/
function wpthumb_post_image( $null, $id, $args ) {
// check if $args is a WP Thumb argument list, or native WordPress one
// wp thumb looks like this: 'width=300&height=120&crop=1'
// native looks like 'thumbnail'
if ( is_string( $args ) && ! strpos( (string) $args, '=' ) ) {
$original_args = $args;
if ( $original_args === ( $args = apply_filters( 'wpthumb_create_args_from_size', $args ) ) ) {
return $null;
}
}
$args = wp_parse_args( $args );
if ( ! empty( $args[0] ) )
$args['width'] = $args[0];
if ( ! empty( $args[1] ) )
$args['height'] = $args[1];
if ( ! empty( $args['crop'] ) && $args['crop'] && empty( $args['crop_from_position'] ) )
$args['crop_from_position'] = get_post_meta( $id, 'wpthumb_crop_pos', true );
if ( empty( $path ) )
$path = get_attached_file( $id );
$path = apply_filters( 'wpthumb_post_image_path', $path, $id, $args );
$args = apply_filters( 'wpthumb_post_image_args', $args, $id );
$image = new WP_Thumb( $path, $args );
$args = $image->getArgs();
extract( $args );
if ( ! $image->errored() ) {
$image_src = $image->returnImage();
$crop = (bool) ( empty( $crop ) ) ? false : $crop;
if ( ! $image->errored() && $image_meta = @getimagesize( $image->getCacheFilePath() ) ) :
$html_width = $image_meta[0];
$html_height = $image_meta[1];
else :
$html_width = $html_height = false;
endif;
} else {
$html_width = $width;
$html_height = $height;
$image_src = $image->getFileURL();
}
return array( $image_src, $html_width, $html_height, true );
}
add_filter( 'image_downsize', 'wpthumb_post_image', 99, 3 );
/**
* Hook into wp_delete_file and delete the associated cache files
*
* @param string $file
*
* @return string
*/
function wpthumb_delete_cache_for_file( $file ) {
$upload_dir = wp_upload_dir();
$wpthumb = new WP_Thumb( trailingslashit( $upload_dir['basedir'] ) . $file );
wpthumb_rmdir_recursive( $wpthumb->getCacheFileDirectory() );
return $file;
}
add_filter( 'wp_delete_file', 'wpthumb_delete_cache_for_file' );
/**
* Removes a dir tree. I.e. recursive rmdir
*
* @param string $dir
* @return bool - success / failure
*/
function wpthumb_rmdir_recursive( $dir ) {
if ( ! is_dir( $dir ) )
return false;
$dir = trailingslashit( $dir );
$handle = opendir( $dir );
while ( false !== ( $file = readdir( $handle ) ) ) {
if ( $file == '.' || $file == '..' )
continue;
$path = $dir . $file;
if ( is_dir( $path ) )
wpthumb_rmdir_recursive( $path );
else
unlink( $path );
}
closedir( $handle );
rmdir( $dir );
}
/**
* wpthumb_errors function.
*
* @access public
* @return null
*/
function wpthumb_errors() {
$dir_upload = wp_upload_dir();
$dir_upload = $dir_upload['path'];
if ( file_exists( $dir_upload ) && ! is_writable( $dir_upload ) )
echo '<div id="wpthumb-warning" class="updated fade"><p><strong>' . __( 'WPThumb has detected a problem.', 'wpthumb' ) . '</strong> ' . sprintf( __( 'The directory <code>%s</code> is not writable.', 'wpthumb' ), $dir_upload ) . '</p></div>';
}
add_action( 'admin_notices', 'wpthumb_errors' );
function wpthumb_add_image_editors( $editors ) {
require_once( WP_THUMB_PATH . '/wpthumb.image-editor.php' );
$wpthumb_editors = array(
'WP_Thumb_Image_Editor_Imagick',
'WP_Thumb_Image_Editor_GD'
);
return array_unique( array_merge( $wpthumb_editors, $editors ) );
}
add_filter( 'wp_image_editors', 'wpthumb_add_image_editors', 99 );
function wpthumb_create_args_from_size( $args = '' ) {
$new_args = array();
if ( 'thumbnail' === $args ) {
$new_args = array(
'width' => get_option( 'thumbnail_size_w' ),
'height' => get_option( 'thumbnail_size_h' ),
'crop' => get_option( 'thumbnail_crop' ),
);
} elseif ( 'medium' === $args ) {
$new_args = array(
'width' => get_option( 'medium_size_w' ),
'height' => get_option( 'medium_size_h' ),
);
} elseif ( 'large' === $args ) {
$new_args = array(
'width' => get_option( 'large_size_w' ),
'height' => get_option( 'large_size_h' ),
);
}
if ( ! empty( $new_args ) && ! empty( $new_args['width'] ) && ! empty( $new_args['height'] ) ) {
return $new_args;
}
return $args;
}
add_filter( 'wpthumb_create_args_from_size', 'wpthumb_create_args_from_size' );