Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update how custom svg dimesions are applied #216

Merged
merged 13 commits into from
Nov 20, 2024
54 changes: 37 additions & 17 deletions safe-svg.php
Original file line number Diff line number Diff line change
Expand Up @@ -395,9 +395,9 @@ public function fix_admin_preview( $response, $attachment, $meta ) {
*/
public function one_pixel_fix( $image, $attachment_id, $size, $icon ) {
if ( get_post_mime_type( $attachment_id ) === 'image/svg+xml' ) {
$dimensions = $this->svg_dimensions( $attachment_id );
$dimensions = $this->set_svg_dimensions( $attachment_id, $size );

if ( $dimensions ) {
if ( $dimensions && $dimensions['height'] && $dimensions['width'] ) {
$image[1] = $dimensions['width'];
$image[2] = $dimensions['height'];
} else {
Expand Down Expand Up @@ -450,23 +450,12 @@ public function load_custom_admin_style() {
*/
public function get_image_tag_override( $html, $id, $alt, $title, $align, $size ) {
$mime = get_post_mime_type( $id );

if ( 'image/svg+xml' === $mime ) {
if ( is_array( $size ) ) {
$width = $size[0];
$height = $size[1];
// phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.Found, Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure
} elseif ( 'full' === $size && $dimensions = $this->svg_dimensions( $id ) ) {
$width = $dimensions['width'];
$height = $dimensions['height'];
} else {
$width = get_option( "{$size}_size_w", false );
$height = get_option( "{$size}_size_h", false );
}
$dimensions = $this->set_svg_dimensions( $id, $size );

if ( $height && $width ) {
$html = str_replace( 'width="1" ', sprintf( 'width="%s" ', $width ), $html );
$html = str_replace( 'height="1" ', sprintf( 'height="%s" ', $height ), $html );
if ( $dimensions['height'] && $dimensions['width'] ) {
$html = str_replace( 'width="1" ', sprintf( 'width="%s" ', $dimensions['width'] ), $html );
$html = str_replace( 'height="1" ', sprintf( 'height="%s" ', $dimensions['height'] ), $html );
} else {
$html = str_replace( 'width="1" ', '', $html );
$html = str_replace( 'height="1" ', '', $html );
Expand Down Expand Up @@ -728,6 +717,37 @@ protected function str_ends_with( $haystack, $needle ) {
return 0 === substr_compare( $haystack, $needle, -$len, $len );
}

/**
* Set custom width or height of the SVG image.
dkotter marked this conversation as resolved.
Show resolved Hide resolved
*
* @param int $id Image attachment ID.
* @param string|array $size Size of image. Image size or array of width and height values
* (in that order). Default 'thumbnail'.
*
* @return int|false Width or height of the SVG image, or false if not found.
dkotter marked this conversation as resolved.
Show resolved Hide resolved
*/
protected function set_svg_dimensions( $id, $size ) {
dkotter marked this conversation as resolved.
Show resolved Hide resolved
$dimensions = $this->svg_dimensions( $id );

if ( is_array( $size ) ) {
$width = $size[0];
$height = $size[1];
} elseif ( 'full' === $size && $dimensions ) {
dkotter marked this conversation as resolved.
Show resolved Hide resolved
$width = $dimensions['width'];
$height = $dimensions['height'];
} else {
$width = get_option( "{$size}_size_w", false );
$height = get_option( "{$size}_size_h", false );
}

if ( $dimensions ) {
$dimensions['width'] = $width;
$dimensions['height'] = $height;
}

return $dimensions;
}

}
}

Expand Down
2 changes: 1 addition & 1 deletion tests/unit/test-safe-svg.php
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ public function test_one_pixel_fix() {
);

// Test SVG Dimensions
$image_sizes = $this->instance->one_pixel_fix( array(), 1, 'thumbnail', false );
$image_sizes = $this->instance->one_pixel_fix( array(), 1, 'full', false );
if ( ! empty( $image_sizes ) ) {
$image_sizes = array_map( 'intval', $image_sizes );
}
Expand Down
Loading