From 10550bae422c482a2c26a795eb7bd034c5c69ed2 Mon Sep 17 00:00:00 2001 From: Willy Bahuaud Date: Thu, 1 Feb 2018 22:08:34 +0100 Subject: [PATCH] You need to use escape functions for i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hello, I suggest you 2 improvements : - the first improvment is to use escape i18n functions (like `esc_attr__` or `esc_html__`) instead of regular i18n ones. In fact, french translation break your inline script because of simple quotes into text stringsā€¦ - the second on is to pass `$` as `jQuery(document).ready()`. It allows to use `$`in place of `jQuery` inside your inline JavaScript code. --- lib/ManualImageCrop.php | 782 ++++++++++++++++++++-------------------- 1 file changed, 391 insertions(+), 391 deletions(-) diff --git a/lib/ManualImageCrop.php b/lib/ManualImageCrop.php index a7b9466..4cbb197 100644 --- a/lib/ManualImageCrop.php +++ b/lib/ManualImageCrop.php @@ -1,392 +1,392 @@ -post_mime_type)) { - $links['crop'] = '' . __('Crop','microp') . ''; - } - return $links; - } - - /** - * Adds link below "Remove featured image" in post editing form - */ - public function addCropFeatureImageEditorLink($content, $post) { - $content .= '' . __('Crop featured image','microp') . ' - '; - return $content; - } - - /** - * Adds link in the ligthbox media library - */ - public function addAttachementEditLink() { ?> - - - - filter_var($_POST['attachmentId'], FILTER_SANITIZE_NUMBER_INT), - 'editedSize' => in_array($_POST['editedSize'], $imageSizes) ? $_POST['editedSize'] : null, - 'select' => array( - 'x' => filter_var($_POST['select']['x'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), - 'y' => filter_var($_POST['select']['y'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), - 'w' => filter_var($_POST['select']['w'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), - 'h' => filter_var($_POST['select']['h'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), - ), - 'previewScale' => filter_var($_POST['previewScale'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) - - ); - - if (isset($_POST['mic_quality'])) { - $data['mic_quality'] = filter_var($_POST['mic_quality'], FILTER_SANITIZE_NUMBER_INT); - } else { - $data['mic_quality'] = 60; - } - - if (isset($_POST['make2x'])) { - $data['make2x'] = filter_var($_POST['make2x'], FILTER_VALIDATE_BOOLEAN); - } - - return $data; - } - - /** - * Crops the image based on params passed in $_POST array - */ - public function cropImage() { - global $_wp_additional_image_sizes; - - $data = $this->filterPostData(); - - $dst_file_url = wp_get_attachment_image_src($data['attachmentId'], $data['editedSize']); - - if (!$dst_file_url) { - exit; - } - - $uploadsDir = wp_upload_dir(); - - // checks for ssl. wp_upload_dir does not handle ssl (ssl admin trips on this and subsequent ajax success to browser) - if (is_ssl()) { - $uploadsDir['baseurl'] = preg_replace('#^http://#i', 'https://', $uploadsDir['baseurl']); - } - - - if ( function_exists( '_load_image_to_edit_path' ) ) { - // this function is consider as private, but it return proper image path. Notice it is in function_exists condition - $src_file = _load_image_to_edit_path( $data['attachmentId'], 'full' ); - $dst_file = _load_image_to_edit_path( $data['attachmentId'], $data['editedSize'] ); - } else { - $src_file_url = wp_get_attachment_image_src( $data['attachmentId'], 'full' ); - - if ( ! $src_file_url ) { - echo json_encode( array( 'status' => 'error', 'message' => 'wrong attachment' ) ); - exit; - } - - $src_file = str_replace( $uploadsDir['baseurl'], $uploadsDir['basedir'], $src_file_url[0] ); - $dst_file = str_replace( $uploadsDir['baseurl'], $uploadsDir['basedir'], $dst_file_url[0] ); - } - - //checks if the destination image file is present (if it's not, we want to create a new file, as the WordPress returns the original image instead of specific one) - if ($dst_file == $src_file) { - $attachmentData = wp_generate_attachment_metadata( $data['attachmentId'], $dst_file ); +post_mime_type)) { + $links['crop'] = '' . esc_html__('Crop','microp') . ''; + } + return $links; + } + + /** + * Adds link below "Remove featured image" in post editing form + */ + public function addCropFeatureImageEditorLink($content, $post) { + $content .= '' . esc_html__('Crop featured image','microp') . ' + '; + return $content; + } + + /** + * Adds link in the ligthbox media library + */ + public function addAttachementEditLink() { ?> + + + + filter_var($_POST['attachmentId'], FILTER_SANITIZE_NUMBER_INT), + 'editedSize' => in_array($_POST['editedSize'], $imageSizes) ? $_POST['editedSize'] : null, + 'select' => array( + 'x' => filter_var($_POST['select']['x'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), + 'y' => filter_var($_POST['select']['y'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), + 'w' => filter_var($_POST['select']['w'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), + 'h' => filter_var($_POST['select']['h'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), + ), + 'previewScale' => filter_var($_POST['previewScale'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) - //overwrite with previous values - $prevAttachmentData = wp_get_attachment_metadata($data['attachmentId']); - if (isset($prevAttachmentData['micSelectedArea'])) { - $attachmentData['micSelectedArea'] = $prevAttachmentData['micSelectedArea']; - } - - //saves new path to the image size in the database - wp_update_attachment_metadata( $data['attachmentId'], $attachmentData ); - - //new destination file path - replaces original file name with the correct one - $dst_file = str_replace( basename($attachmentData['file']), $attachmentData['sizes'][ $data['editedSize'] ]['file'], $dst_file); - - //retrieves the new url to file (needet to refresh the preview) - $dst_file_url = wp_get_attachment_image_src($data['attachmentId'], $data['editedSize']); - } - - //sets the destination image dimensions - if (isset($_wp_additional_image_sizes[$data['editedSize']])) { - $dst_w = min(intval($_wp_additional_image_sizes[$data['editedSize']]['width']), $data['select']['w'] * $data['previewScale']); - $dst_h = min(intval($_wp_additional_image_sizes[$data['editedSize']]['height']), $data['select']['h'] * $data['previewScale']); - } else { - $dst_w = min(get_option($data['editedSize'].'_size_w'), $data['select']['w'] * $data['previewScale']); - $dst_h = min(get_option($data['editedSize'].'_size_h'), $data['select']['h'] * $data['previewScale']); - } - - if (!$dst_w || !$dst_h) { - echo json_encode (array('status' => 'error', 'message' => 'wrong dimensions' ) ); - exit; - } - - //prepares coordinates that will be passed to cropping function - $dst_x = 0; - $dst_y = 0; - $src_x = max(0, $data['select']['x']) * $data['previewScale']; - $src_y = max(0, $data['select']['y']) * $data['previewScale']; - $src_w = max(0, $data['select']['w']) * $data['previewScale']; - $src_h = max(0, $data['select']['h']) * $data['previewScale']; - - $size = wp_get_image_editor( $src_file )->get_size(); - - $is_higher = ( $dst_h > $size["height"] ); - $is_wider = ( $dst_w > $size["width"] ); - - if ( $is_higher || $is_wider ) { - if ( $is_higher ) { - $scale = $src_h / $size["height"]; - } else { - $scale = $src_w / $size["width"]; - } - - $src_w = $src_w / $scale; - $src_h = $src_h / $scale; - $src_x = $src_x / $scale; - $src_y = $src_y / $scale; - } - - //saves the selected area - $imageMetadata = wp_get_attachment_metadata($data['attachmentId']); - $imageMetadata['micSelectedArea'][$data['editedSize']] = array( - 'x' => $data['select']['x'], - 'y' => $data['select']['y'], - 'w' => $data['select']['w'], - 'h' => $data['select']['h'], - 'scale' => $data['previewScale'], - ); - wp_update_attachment_metadata($data['attachmentId'], $imageMetadata); - - if ( function_exists('wp_get_image_editor') ) { - $img = wp_get_image_editor( $src_file ); - - if ( ! is_wp_error( $img ) ) { - - $img->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, false ); - $img->set_quality( $data['mic_quality'] ); - $saveStatus = $img->save( $dst_file ); - - if ( is_wp_error( $saveStatus ) ) { - echo json_encode( array( 'status' => 'error', 'message' => 'WP_ERROR: ' . $saveStatus->get_error_message() ) ); - exit; - } - }else { - echo json_encode (array('status' => 'error', 'message' => 'WP_ERROR: ' . $img->get_error_message() ) ); - exit; - } - } else { - //determines what's the image format - $ext = pathinfo($src_file, PATHINFO_EXTENSION); - if ($ext == "gif"){ - $src_img = imagecreatefromgif($src_file); - } else if($ext =="png"){ - $src_img = imagecreatefrompng($src_file); - } else { - $src_img = imagecreatefromjpeg($src_file); - } - - if ($src_img === false ) { - echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: Cannot create image from the source file' ) ); - exit; - } - - $dst_img = imagecreatetruecolor($dst_w, $dst_h); - $resampleReturn = imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); - - if ($resampleReturn === false ) { - echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: imagecopyresampled' ) ); - exit; - } - - $imageSaveReturn = true; - if ($ext == "gif"){ - $imageSaveReturn = imagegif($dst_img, $dst_file); - } else if($ext =="png"){ - $imageSaveReturn = imagepng($dst_img, $dst_file); - } else { - $imageSaveReturn = imagejpeg($dst_img, $dst_file, $quality); - } - - if ($imageSaveReturn === false ) { - echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: imagejpeg/imagegif/imagepng' ) ); - exit; - } - } - - // Generate Retina Image - if( isset( $data['make2x'] ) && $data['make2x'] === 'true' ) { - $dst_w2x = $dst_w * 2; - $dst_h2x = $dst_h * 2; - - $dot = strrpos($dst_file,"."); - $dst_file2x = substr($dst_file,0,$dot).'@2x'.substr($dst_file,$dot); - - // Check image size and create the retina file if possible - if ( $src_w > $dst_w2x && $src_h > $dst_h2x) { - if ( function_exists('wp_get_image_editor') ) { - $img = wp_get_image_editor( $src_file ); - if ( ! is_wp_error( $img ) ) { - $img->crop( $src_x, $src_y, $src_w, $src_h, $dst_w2x, $dst_h2x, false ); - $img->set_quality( $quality ); - $img->save($dst_file2x); - }else { - echo json_encode (array('status' => 'error', 'message' => 'WP_ERROR: ' . $img->get_error_message() ) ); - exit; - } - } else { - $dst_img2x = imagecreatetruecolor($dst_w2x, $dst_h2x); - $resampleReturn = imagecopyresampled($dst_img2x, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w2x, $dst_h2x, $src_w, $src_h); - - if ($resampleReturn === false ) { - echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: imagecopyresampled' ) ); - exit; - } - - $imageSaveReturn = true; - if ($ext == "gif"){ - $imageSaveReturn = imagegif($dst_img2x, $dst_file2x); - } else if($ext =="png"){ - $imageSaveReturn = imagepng($dst_img2x, $dst_file2x); - } else { - $imageSaveReturn = imagejpeg($dst_img2x, $dst_file2x, $quality); - } - - if ($imageSaveReturn === false ) { - echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: imagejpeg/imagegif/imagepng' ) ); - exit; - } - } - } - } - // update 'mic_make2x' option status to persist choice - if( isset( $data['make2x'] ) && $data['make2x'] !== get_option('mic_make2x') ) { - update_option('mic_make2x', $data['make2x']); - } - - //returns the url to the generated image (to allow refreshing the preview) - echo json_encode (array('status' => 'ok', 'file' => $dst_file_url[0] ) ); - exit; - } -} + ); + + if (isset($_POST['mic_quality'])) { + $data['mic_quality'] = filter_var($_POST['mic_quality'], FILTER_SANITIZE_NUMBER_INT); + } else { + $data['mic_quality'] = 60; + } + + if (isset($_POST['make2x'])) { + $data['make2x'] = filter_var($_POST['make2x'], FILTER_VALIDATE_BOOLEAN); + } + + return $data; + } + + /** + * Crops the image based on params passed in $_POST array + */ + public function cropImage() { + global $_wp_additional_image_sizes; + + $data = $this->filterPostData(); + + $dst_file_url = wp_get_attachment_image_src($data['attachmentId'], $data['editedSize']); + + if (!$dst_file_url) { + exit; + } + + $uploadsDir = wp_upload_dir(); + + // checks for ssl. wp_upload_dir does not handle ssl (ssl admin trips on this and subsequent ajax success to browser) + if (is_ssl()) { + $uploadsDir['baseurl'] = preg_replace('#^http://#i', 'https://', $uploadsDir['baseurl']); + } + + + if ( function_exists( '_load_image_to_edit_path' ) ) { + // this function is consider as private, but it return proper image path. Notice it is in function_exists condition + $src_file = _load_image_to_edit_path( $data['attachmentId'], 'full' ); + $dst_file = _load_image_to_edit_path( $data['attachmentId'], $data['editedSize'] ); + } else { + $src_file_url = wp_get_attachment_image_src( $data['attachmentId'], 'full' ); + + if ( ! $src_file_url ) { + echo json_encode( array( 'status' => 'error', 'message' => 'wrong attachment' ) ); + exit; + } + + $src_file = str_replace( $uploadsDir['baseurl'], $uploadsDir['basedir'], $src_file_url[0] ); + $dst_file = str_replace( $uploadsDir['baseurl'], $uploadsDir['basedir'], $dst_file_url[0] ); + } + + //checks if the destination image file is present (if it's not, we want to create a new file, as the WordPress returns the original image instead of specific one) + if ($dst_file == $src_file) { + $attachmentData = wp_generate_attachment_metadata( $data['attachmentId'], $dst_file ); + + //overwrite with previous values + $prevAttachmentData = wp_get_attachment_metadata($data['attachmentId']); + if (isset($prevAttachmentData['micSelectedArea'])) { + $attachmentData['micSelectedArea'] = $prevAttachmentData['micSelectedArea']; + } + + //saves new path to the image size in the database + wp_update_attachment_metadata( $data['attachmentId'], $attachmentData ); + + //new destination file path - replaces original file name with the correct one + $dst_file = str_replace( basename($attachmentData['file']), $attachmentData['sizes'][ $data['editedSize'] ]['file'], $dst_file); + + //retrieves the new url to file (needet to refresh the preview) + $dst_file_url = wp_get_attachment_image_src($data['attachmentId'], $data['editedSize']); + } + + //sets the destination image dimensions + if (isset($_wp_additional_image_sizes[$data['editedSize']])) { + $dst_w = min(intval($_wp_additional_image_sizes[$data['editedSize']]['width']), $data['select']['w'] * $data['previewScale']); + $dst_h = min(intval($_wp_additional_image_sizes[$data['editedSize']]['height']), $data['select']['h'] * $data['previewScale']); + } else { + $dst_w = min(get_option($data['editedSize'].'_size_w'), $data['select']['w'] * $data['previewScale']); + $dst_h = min(get_option($data['editedSize'].'_size_h'), $data['select']['h'] * $data['previewScale']); + } + + if (!$dst_w || !$dst_h) { + echo json_encode (array('status' => 'error', 'message' => 'wrong dimensions' ) ); + exit; + } + + //prepares coordinates that will be passed to cropping function + $dst_x = 0; + $dst_y = 0; + $src_x = max(0, $data['select']['x']) * $data['previewScale']; + $src_y = max(0, $data['select']['y']) * $data['previewScale']; + $src_w = max(0, $data['select']['w']) * $data['previewScale']; + $src_h = max(0, $data['select']['h']) * $data['previewScale']; + + $size = wp_get_image_editor( $src_file )->get_size(); + + $is_higher = ( $dst_h > $size["height"] ); + $is_wider = ( $dst_w > $size["width"] ); + + if ( $is_higher || $is_wider ) { + if ( $is_higher ) { + $scale = $src_h / $size["height"]; + } else { + $scale = $src_w / $size["width"]; + } + + $src_w = $src_w / $scale; + $src_h = $src_h / $scale; + $src_x = $src_x / $scale; + $src_y = $src_y / $scale; + } + + //saves the selected area + $imageMetadata = wp_get_attachment_metadata($data['attachmentId']); + $imageMetadata['micSelectedArea'][$data['editedSize']] = array( + 'x' => $data['select']['x'], + 'y' => $data['select']['y'], + 'w' => $data['select']['w'], + 'h' => $data['select']['h'], + 'scale' => $data['previewScale'], + ); + wp_update_attachment_metadata($data['attachmentId'], $imageMetadata); + + if ( function_exists('wp_get_image_editor') ) { + $img = wp_get_image_editor( $src_file ); + + if ( ! is_wp_error( $img ) ) { + + $img->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, false ); + $img->set_quality( $data['mic_quality'] ); + $saveStatus = $img->save( $dst_file ); + + if ( is_wp_error( $saveStatus ) ) { + echo json_encode( array( 'status' => 'error', 'message' => 'WP_ERROR: ' . $saveStatus->get_error_message() ) ); + exit; + } + }else { + echo json_encode (array('status' => 'error', 'message' => 'WP_ERROR: ' . $img->get_error_message() ) ); + exit; + } + } else { + //determines what's the image format + $ext = pathinfo($src_file, PATHINFO_EXTENSION); + if ($ext == "gif"){ + $src_img = imagecreatefromgif($src_file); + } else if($ext =="png"){ + $src_img = imagecreatefrompng($src_file); + } else { + $src_img = imagecreatefromjpeg($src_file); + } + + if ($src_img === false ) { + echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: Cannot create image from the source file' ) ); + exit; + } + + $dst_img = imagecreatetruecolor($dst_w, $dst_h); + $resampleReturn = imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); + + if ($resampleReturn === false ) { + echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: imagecopyresampled' ) ); + exit; + } + + $imageSaveReturn = true; + if ($ext == "gif"){ + $imageSaveReturn = imagegif($dst_img, $dst_file); + } else if($ext =="png"){ + $imageSaveReturn = imagepng($dst_img, $dst_file); + } else { + $imageSaveReturn = imagejpeg($dst_img, $dst_file, $quality); + } + + if ($imageSaveReturn === false ) { + echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: imagejpeg/imagegif/imagepng' ) ); + exit; + } + } + + // Generate Retina Image + if( isset( $data['make2x'] ) && $data['make2x'] === 'true' ) { + $dst_w2x = $dst_w * 2; + $dst_h2x = $dst_h * 2; + + $dot = strrpos($dst_file,"."); + $dst_file2x = substr($dst_file,0,$dot).'@2x'.substr($dst_file,$dot); + + // Check image size and create the retina file if possible + if ( $src_w > $dst_w2x && $src_h > $dst_h2x) { + if ( function_exists('wp_get_image_editor') ) { + $img = wp_get_image_editor( $src_file ); + if ( ! is_wp_error( $img ) ) { + $img->crop( $src_x, $src_y, $src_w, $src_h, $dst_w2x, $dst_h2x, false ); + $img->set_quality( $quality ); + $img->save($dst_file2x); + }else { + echo json_encode (array('status' => 'error', 'message' => 'WP_ERROR: ' . $img->get_error_message() ) ); + exit; + } + } else { + $dst_img2x = imagecreatetruecolor($dst_w2x, $dst_h2x); + $resampleReturn = imagecopyresampled($dst_img2x, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w2x, $dst_h2x, $src_w, $src_h); + + if ($resampleReturn === false ) { + echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: imagecopyresampled' ) ); + exit; + } + + $imageSaveReturn = true; + if ($ext == "gif"){ + $imageSaveReturn = imagegif($dst_img2x, $dst_file2x); + } else if($ext =="png"){ + $imageSaveReturn = imagepng($dst_img2x, $dst_file2x); + } else { + $imageSaveReturn = imagejpeg($dst_img2x, $dst_file2x, $quality); + } + + if ($imageSaveReturn === false ) { + echo json_encode (array('status' => 'error', 'message' => 'PHP ERROR: imagejpeg/imagegif/imagepng' ) ); + exit; + } + } + } + } + // update 'mic_make2x' option status to persist choice + if( isset( $data['make2x'] ) && $data['make2x'] !== get_option('mic_make2x') ) { + update_option('mic_make2x', $data['make2x']); + } + + //returns the url to the generated image (to allow refreshing the preview) + echo json_encode (array('status' => 'ok', 'file' => $dst_file_url[0] ) ); + exit; + } +}