X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;ds=sidebyside;f=includes%2Fmedia%2FMediaTransformOutput.php;h=463a7948d92e55c6aeaa1091b3fd8f16be09272b;hb=694ca68b234bd7a24f8abba85a2c2288331de1b2;hp=87b4be78031d4e266eb680c8859bd7be33004493;hpb=ba32e133e97b0f1f6b9ddb7e3c7a9cc79d0be977;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/media/MediaTransformOutput.php b/includes/media/MediaTransformOutput.php index 87b4be7803..463a7948d9 100644 --- a/includes/media/MediaTransformOutput.php +++ b/includes/media/MediaTransformOutput.php @@ -202,7 +202,8 @@ abstract class MediaTransformOutput { return Status::newFatal( 'backend-fail-stream', '' ); } elseif ( FileBackend::isStoragePath( $this->path ) ) { $be = $this->file->getRepo()->getBackend(); - return $be->streamFile( [ 'src' => $this->path, 'headers' => $headers ] ); + return Status::wrap( + $be->streamFile( [ 'src' => $this->path, 'headers' => $headers ] ) ); } else { // FS-file $success = StreamFile::stream( $this->getLocalCopyPath(), $headers ); return $success ? Status::newGood() : Status::newFatal( 'backend-fail-stream', $this->path ); @@ -268,270 +269,3 @@ abstract class MediaTransformOutput { return $attribs; } } - -/** - * Media transform output for images - * - * @ingroup Media - */ -class ThumbnailImage extends MediaTransformOutput { - private static $firstNonIconImageRendered = false; - - /** - * Get a thumbnail object from a file and parameters. - * If $path is set to null, the output file is treated as a source copy. - * If $path is set to false, no output file will be created. - * $parameters should include, as a minimum, (file) 'width' and 'height'. - * It may also include a 'page' parameter for multipage files. - * - * @param File $file - * @param string $url URL path to the thumb - * @param string|bool $path Filesystem path to the thumb - * @param array $parameters Associative array of parameters - */ - function __construct( $file, $url, $path = false, $parameters = [] ) { - # Previous parameters: - # $file, $url, $width, $height, $path = false, $page = false - - $defaults = [ - 'page' => false, - 'lang' => false - ]; - - if ( is_array( $parameters ) ) { - $actualParams = $parameters + $defaults; - } else { - # Using old format, should convert. Later a warning could be added here. - $numArgs = func_num_args(); - $actualParams = [ - 'width' => $path, - 'height' => $parameters, - 'page' => ( $numArgs > 5 ) ? func_get_arg( 5 ) : false - ] + $defaults; - $path = ( $numArgs > 4 ) ? func_get_arg( 4 ) : false; - } - - $this->file = $file; - $this->url = $url; - $this->path = $path; - - # These should be integers when they get here. - # If not, there's a bug somewhere. But let's at - # least produce valid HTML code regardless. - $this->width = round( $actualParams['width'] ); - $this->height = round( $actualParams['height'] ); - - $this->page = $actualParams['page']; - $this->lang = $actualParams['lang']; - } - - /** - * Return HTML tag for the thumbnail, will include - * width and height attributes and a blank alt text (as required). - * - * @param array $options Associative array of options. Boolean options - * should be indicated with a value of true for true, and false or - * absent for false. - * - * alt HTML alt attribute - * title HTML title attribute - * desc-link Boolean, show a description link - * file-link Boolean, show a file download link - * valign vertical-align property, if the output is an inline element - * img-class Class applied to the \ tag, if there is such a tag - * desc-query String, description link query params - * override-width Override width attribute. Should generally not set - * override-height Override height attribute. Should generally not set - * no-dimensions Boolean, skip width and height attributes (useful if - * set in CSS) - * custom-url-link Custom URL to link to - * custom-title-link Custom Title object to link to - * custom target-link Value of the target attribute, for custom-target-link - * parser-extlink-* Attributes added by parser for external links: - * parser-extlink-rel: add rel="nofollow" - * parser-extlink-target: link target, but overridden by custom-target-link - * - * For images, desc-link and file-link are implemented as a click-through. For - * sounds and videos, they may be displayed in other ways. - * - * @throws MWException - * @return string - */ - function toHtml( $options = [] ) { - global $wgPriorityHints; - - if ( count( func_get_args() ) == 2 ) { - throw new MWException( __METHOD__ . ' called in the old style' ); - } - - $alt = $options['alt'] ?? ''; - - $query = $options['desc-query'] ?? ''; - - $attribs = [ - 'alt' => $alt, - 'src' => $this->url, - 'decoding' => 'async', - ]; - - if ( $wgPriorityHints - && !self::$firstNonIconImageRendered - && $this->width * $this->height > 100 * 100 ) { - self::$firstNonIconImageRendered = true; - - $attribs['importance'] = 'high'; - } - - if ( !empty( $options['custom-url-link'] ) ) { - $linkAttribs = [ 'href' => $options['custom-url-link'] ]; - if ( !empty( $options['title'] ) ) { - $linkAttribs['title'] = $options['title']; - } - if ( !empty( $options['custom-target-link'] ) ) { - $linkAttribs['target'] = $options['custom-target-link']; - } elseif ( !empty( $options['parser-extlink-target'] ) ) { - $linkAttribs['target'] = $options['parser-extlink-target']; - } - if ( !empty( $options['parser-extlink-rel'] ) ) { - $linkAttribs['rel'] = $options['parser-extlink-rel']; - } - } elseif ( !empty( $options['custom-title-link'] ) ) { - /** @var Title $title */ - $title = $options['custom-title-link']; - $linkAttribs = [ - 'href' => $title->getLinkURL(), - 'title' => empty( $options['title'] ) ? $title->getFullText() : $options['title'] - ]; - } elseif ( !empty( $options['desc-link'] ) ) { - $linkAttribs = $this->getDescLinkAttribs( - empty( $options['title'] ) ? null : $options['title'], - $query - ); - } elseif ( !empty( $options['file-link'] ) ) { - $linkAttribs = [ 'href' => $this->file->getUrl() ]; - } else { - $linkAttribs = false; - if ( !empty( $options['title'] ) ) { - $attribs['title'] = $options['title']; - } - } - - if ( empty( $options['no-dimensions'] ) ) { - $attribs['width'] = $this->width; - $attribs['height'] = $this->height; - } - if ( !empty( $options['valign'] ) ) { - $attribs['style'] = "vertical-align: {$options['valign']}"; - } - if ( !empty( $options['img-class'] ) ) { - $attribs['class'] = $options['img-class']; - } - if ( isset( $options['override-height'] ) ) { - $attribs['height'] = $options['override-height']; - } - if ( isset( $options['override-width'] ) ) { - $attribs['width'] = $options['override-width']; - } - - // Additional densities for responsive images, if specified. - // If any of these urls is the same as src url, it'll be excluded. - $responsiveUrls = array_diff( $this->responsiveUrls, [ $this->url ] ); - if ( !empty( $responsiveUrls ) ) { - $attribs['srcset'] = Html::srcSet( $responsiveUrls ); - } - - Hooks::run( 'ThumbnailBeforeProduceHTML', [ $this, &$attribs, &$linkAttribs ] ); - - return $this->linkWrap( $linkAttribs, Xml::element( 'img', $attribs ) ); - } -} - -/** - * Basic media transform error class - * - * @ingroup Media - */ -class MediaTransformError extends MediaTransformOutput { - /** @var Message */ - private $msg; - - function __construct( $msg, $width, $height /*, ... */ ) { - $args = array_slice( func_get_args(), 3 ); - $this->msg = wfMessage( $msg )->params( $args ); - $this->width = intval( $width ); - $this->height = intval( $height ); - $this->url = false; - $this->path = false; - } - - function toHtml( $options = [] ) { - return "
width}px; height: {$this->height}px; display:inline-block;\">" . - $this->getHtmlMsg() . - "
"; - } - - function toText() { - return $this->msg->text(); - } - - function getHtmlMsg() { - return $this->msg->escaped(); - } - - function getMsg() { - return $this->msg; - } - - function isError() { - return true; - } - - function getHttpStatusCode() { - return 500; - } -} - -/** - * Shortcut class for parameter validation errors - * - * @ingroup Media - */ -class TransformParameterError extends MediaTransformError { - function __construct( $params ) { - parent::__construct( 'thumbnail_error', - max( $params['width'] ?? 0, 120 ), - max( $params['height'] ?? 0, 120 ), - wfMessage( 'thumbnail_invalid_params' ) - ); - } - - function getHttpStatusCode() { - return 400; - } -} - -/** - * Shortcut class for parameter file size errors - * - * @ingroup Media - * @since 1.25 - */ -class TransformTooBigImageAreaError extends MediaTransformError { - function __construct( $params, $maxImageArea ) { - $msg = wfMessage( 'thumbnail_toobigimagearea' ); - $msg->params( - $msg->getLanguage()->formatComputingNumbers( $maxImageArea, 1000, "size-$1pixel" ) - ); - - parent::__construct( 'thumbnail_error', - max( $params['width'] ?? 0, 120 ), - max( $params['height'] ?? 0, 120 ), - $msg - ); - } - - function getHttpStatusCode() { - return 400; - } -}