From 08aa4418c30cfc18ccc69a0f0f9cb9e17be6c196 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Mon, 12 Aug 2013 09:28:15 +0200 Subject: Update to MediaWiki 1.21.1 --- includes/media/SVG.php | 67 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 26 deletions(-) (limited to 'includes/media/SVG.php') diff --git a/includes/media/SVG.php b/includes/media/SVG.php index 55fa5547..cddab51d 100644 --- a/includes/media/SVG.php +++ b/includes/media/SVG.php @@ -120,6 +120,12 @@ class SvgHandler extends ImageHandler { return new ThumbnailImage( $image, $dstUrl, $dstPath, $params ); } + $metadata = $this->unpackMetadata( $image->getMetadata() ); + if ( isset( $metadata['error'] ) ) { // sanity check + $err = wfMessage( 'svg-long-error', $metadata['error']['message'] )->text(); + return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $err ); + } + if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) { return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, wfMessage( 'thumbnail_dest_directory' )->text() ); @@ -127,7 +133,7 @@ class SvgHandler extends ImageHandler { $srcPath = $image->getLocalRefPath(); $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight ); - if( $status === true ) { + if ( $status === true ) { return new ThumbnailImage( $image, $dstUrl, $dstPath, $params ); } else { return $status; // MediaTransformError @@ -135,14 +141,15 @@ class SvgHandler extends ImageHandler { } /** - * Transform an SVG file to PNG - * This function can be called outside of thumbnail contexts - * @param string $srcPath - * @param string $dstPath - * @param string $width - * @param string $height - * @return bool|MediaTransformError - */ + * Transform an SVG file to PNG + * This function can be called outside of thumbnail contexts + * @param string $srcPath + * @param string $dstPath + * @param string $width + * @param string $height + * @throws MWException + * @return bool|MediaTransformError + */ public function rasterize( $srcPath, $dstPath, $width, $height ) { global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath; $err = false; @@ -163,14 +170,14 @@ class SvgHandler extends ImageHandler { $cmd = str_replace( array( '$path/', '$width', '$height', '$input', '$output' ), array( $wgSVGConverterPath ? wfEscapeShellArg( "$wgSVGConverterPath/" ) : "", - intval( $width ), - intval( $height ), - wfEscapeShellArg( $srcPath ), - wfEscapeShellArg( $dstPath ) ), + intval( $width ), + intval( $height ), + wfEscapeShellArg( $srcPath ), + wfEscapeShellArg( $dstPath ) ), $wgSVGConverters[$wgSVGConverter] ) . " 2>&1"; wfProfileIn( 'rsvg' ); - wfDebug( __METHOD__.": $cmd\n" ); + wfDebug( __METHOD__ . ": $cmd\n" ); $err = wfShellExec( $cmd, $retval ); wfProfileOut( 'rsvg' ); } @@ -178,7 +185,7 @@ class SvgHandler extends ImageHandler { $removed = $this->removeBadFile( $dstPath, $retval ); if ( $retval != 0 || $removed ) { wfDebugLog( 'thumbnail', sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"', - wfHostname(), $retval, trim($err), $cmd ) ); + wfHostname(), $retval, trim( $err ), $cmd ) ); return new MediaTransformError( 'thumbnail_error', $width, $height, $err ); } return true; @@ -213,6 +220,8 @@ class SvgHandler extends ImageHandler { if ( isset( $metadata['width'] ) && isset( $metadata['height'] ) ) { return array( $metadata['width'], $metadata['height'], 'SVG', "width=\"{$metadata['width']}\" height=\"{$metadata['height']}\"" ); + } else { // error + return array( 0, 0, 'SVG', "width=\"0\" height=\"0\"" ); } } @@ -231,6 +240,12 @@ class SvgHandler extends ImageHandler { */ function getLongDesc( $file ) { global $wgLang; + + $metadata = $this->unpackMetadata( $file->getMetadata() ); + if ( isset( $metadata['error'] ) ) { + return wfMessage( 'svg-long-error', $metadata['error']['message'] )->text(); + } + $size = $wgLang->formatSize( $file->getSize() ); if ( $this->isAnimatedImage( $file ) ) { @@ -239,23 +254,23 @@ class SvgHandler extends ImageHandler { $msg = wfMessage( 'svg-long-desc' ); } - $msg->numParams( - $file->getWidth(), - $file->getHeight() - ); - $msg->Params( $size ); + $msg->numParams( $file->getWidth(), $file->getHeight() )->params( $size ); + return $msg->parse(); } function getMetadata( $file, $filename ) { + $metadata = array( 'version' => self::SVG_METADATA_VERSION ); try { - $metadata = SVGMetadataExtractor::getMetadata( $filename ); - } catch( Exception $e ) { - // Broken file? + $metadata += SVGMetadataExtractor::getMetadata( $filename ); + } catch( MWException $e ) { // @TODO: SVG specific exceptions + // File not found, broken, etc. + $metadata['error'] = array( + 'message' => $e->getMessage(), + 'code' => $e->getCode() + ); wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" ); - return '0'; } - $metadata['version'] = self::SVG_METADATA_VERSION; return serialize( $metadata ); } @@ -305,7 +320,7 @@ class SvgHandler extends ImageHandler { return false; } $metadata = $this->unpackMetadata( $metadata ); - if ( !$metadata ) { + if ( !$metadata || isset( $metadata['error'] ) ) { return false; } -- cgit v1.2.2 From 4ac9fa081a7c045f6a9f1cfc529d82423f485b2e Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sun, 8 Dec 2013 09:55:49 +0100 Subject: Update to MediaWiki 1.22.0 --- includes/media/SVG.php | 92 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 83 insertions(+), 9 deletions(-) (limited to 'includes/media/SVG.php') diff --git a/includes/media/SVG.php b/includes/media/SVG.php index cddab51d..72a9696c 100644 --- a/includes/media/SVG.php +++ b/includes/media/SVG.php @@ -56,7 +56,7 @@ class SvgHandler extends ImageHandler { $metadata = $file->getMetadata(); if ( $metadata ) { $metadata = $this->unpackMetadata( $metadata ); - if( isset( $metadata['animated'] ) ) { + if ( isset( $metadata['animated'] ) ) { return $metadata['animated']; } } @@ -115,6 +115,7 @@ class SvgHandler extends ImageHandler { $clientHeight = $params['height']; $physicalWidth = $params['physicalWidth']; $physicalHeight = $params['physicalHeight']; + $lang = isset( $params['lang'] ) ? $params['lang'] : 'en'; if ( $flags & self::TRANSFORM_LATER ) { return new ThumbnailImage( $image, $dstUrl, $dstPath, $params ); @@ -132,7 +133,7 @@ class SvgHandler extends ImageHandler { } $srcPath = $image->getLocalRefPath(); - $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight ); + $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight, $lang ); if ( $status === true ) { return new ThumbnailImage( $image, $dstUrl, $dstPath, $params ); } else { @@ -147,10 +148,11 @@ class SvgHandler extends ImageHandler { * @param string $dstPath * @param string $width * @param string $height + * @param string $lang Language code of the language to render the SVG in * @throws MWException * @return bool|MediaTransformError */ - public function rasterize( $srcPath, $dstPath, $width, $height ) { + public function rasterize( $srcPath, $dstPath, $width, $height, $lang = false ) { global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath; $err = false; $retval = ''; @@ -158,7 +160,7 @@ class SvgHandler extends ImageHandler { if ( is_array( $wgSVGConverters[$wgSVGConverter] ) ) { // This is a PHP callable $func = $wgSVGConverters[$wgSVGConverter][0]; - $args = array_merge( array( $srcPath, $dstPath, $width, $height ), + $args = array_merge( array( $srcPath, $dstPath, $width, $height, $lang ), array_slice( $wgSVGConverters[$wgSVGConverter], 1 ) ); if ( !is_callable( $func ) ) { throw new MWException( "$func is not callable" ); @@ -175,10 +177,16 @@ class SvgHandler extends ImageHandler { wfEscapeShellArg( $srcPath ), wfEscapeShellArg( $dstPath ) ), $wgSVGConverters[$wgSVGConverter] - ) . " 2>&1"; + ); + + $env = array(); + if ( $lang !== false ) { + $env['LANG'] = $lang; + } + wfProfileIn( 'rsvg' ); wfDebug( __METHOD__ . ": $cmd\n" ); - $err = wfShellExec( $cmd, $retval ); + $err = wfShellExecWithStderr( $cmd, $retval, $env ); wfProfileOut( 'rsvg' ); } } @@ -263,11 +271,11 @@ class SvgHandler extends ImageHandler { $metadata = array( 'version' => self::SVG_METADATA_VERSION ); try { $metadata += SVGMetadataExtractor::getMetadata( $filename ); - } catch( MWException $e ) { // @TODO: SVG specific exceptions + } catch ( MWException $e ) { // @todo SVG specific exceptions // File not found, broken, etc. $metadata['error'] = array( 'message' => $e->getMessage(), - 'code' => $e->getCode() + 'code' => $e->getCode() ); wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" ); } @@ -340,6 +348,7 @@ class SvgHandler extends ImageHandler { 'description' => 'imagedescription', 'title' => 'objectname', ); + $showMeta = false; foreach ( $metadata as $name => $value ) { $tag = strtolower( $name ); if ( isset( $conversion[$tag] ) ) { @@ -348,6 +357,7 @@ class SvgHandler extends ImageHandler { // Do not output other metadata not in list continue; } + $showMeta = true; self::addMeta( $result, in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed', 'exif', @@ -355,6 +365,70 @@ class SvgHandler extends ImageHandler { $value ); } - return $result; + return $showMeta ? $result : false; + } + + + /** + * @param string $name Parameter name + * @param $string $value Parameter value + * @return bool Validity + */ + function validateParam( $name, $value ) { + if ( in_array( $name, array( 'width', 'height' ) ) ) { + // Reject negative heights, widths + return ( $value > 0 ); + } elseif ( $name == 'lang' ) { + // Validate $code + if ( !Language::isValidBuiltinCode( $value ) ) { + wfDebug( "Invalid user language code\n" ); + return false; + } + return true; + } + // Only lang, width and height are acceptable keys + return false; + } + + /** + * @param array $params name=>value pairs of parameters + * @return string Filename to use + */ + function makeParamString( $params ) { + $lang = ''; + if ( isset( $params['lang'] ) && $params['lang'] !== 'en' ) { + $params['lang'] = mb_strtolower( $params['lang'] ); + $lang = "lang{$params['lang']}-"; + } + if ( !isset( $params['width'] ) ) { + return false; + } + return "$lang{$params['width']}px"; + } + + function parseParamString( $str ) { + $m = false; + if ( preg_match( '/^lang([a-z]+(?:-[a-z]+)*)-(\d+)px$/', $str, $m ) ) { + return array( 'width' => array_pop( $m ), 'lang' => $m[1] ); + } elseif ( preg_match( '/^(\d+)px$/', $str, $m ) ) { + return array( 'width' => $m[1], 'lang' => 'en' ); + } else { + return false; + } + } + + function getParamMap() { + return array( 'img_lang' => 'lang', 'img_width' => 'width' ); + } + + /** + * @param $params + * @return array + */ + function getScriptParams( $params ) { + return array( + 'width' => $params['width'], + 'lang' => $params['lang'], + ); } } -- cgit v1.2.2