<?php namespace MediaWiki\Extension\Notifications\Formatters; use InvalidArgumentException; use UnexpectedValueException; class EchoIcon { /** * @param string $icon Name of icon as registered in BeforeCreateEchoEvent hook * @param string $dir either 'ltr' or 'rtl' * @return string */ public static function getUrl( $icon, $dir ) { global $wgEchoNotificationIcons, $wgExtensionAssetsPath; if ( !isset( $wgEchoNotificationIcons[$icon] ) ) { throw new InvalidArgumentException( "The $icon icon is not registered" ); } $iconInfo = $wgEchoNotificationIcons[$icon]; $needsPrefixing = true; // Now we need to check it has a valid url/path if ( isset( $iconInfo['url'] ) && $iconInfo['url'] ) { $iconUrl = $iconInfo['url']; $needsPrefixing = false; } elseif ( isset( $iconInfo['path'] ) && $iconInfo['path'] ) { $iconUrl = $iconInfo['path']; } else { // Fallback to hardcoded 'placeholder'. This is used if someone // doesn't configure the 'site' icon for example. $icon = 'placeholder'; $iconUrl = $wgEchoNotificationIcons['placeholder']['path']; } // Might be an array with different icons for ltr/rtl if ( is_array( $iconUrl ) ) { if ( !isset( $iconUrl[$dir] ) ) { throw new UnexpectedValueException( "Icon type $icon doesn't have an icon for $dir directionality" ); } $iconUrl = $iconUrl[$dir]; } // And if it was a 'path', stick the assets path in front if ( $needsPrefixing ) { $iconUrl = "$wgExtensionAssetsPath/$iconUrl"; } return $iconUrl; } /** * Get a link to a rasterized version of the icon * * @param string $icon Icon name * @param string $lang * @return string URL to the rasterized version of the icon */ public static function getRasterizedUrl( $icon, $lang ) { global $wgEchoNotificationIcons; if ( !isset( $wgEchoNotificationIcons[$icon] ) ) { throw new InvalidArgumentException( "The $icon icon is not registered" ); } $url = $wgEchoNotificationIcons[ $icon ][ 'url' ] ?? null; // If the defined URL is explicitly false, use placeholder if ( $url === false ) { $icon = 'placeholder'; } // If the URL is null or false call the resource loader // rasterizing module if ( $url === false || $url === null ) { $iconUrl = wfScript( 'load' ) . '?' . wfArrayToCgi( [ 'modules' => 'ext.echo.emailicons', 'image' => $icon, 'lang' => $lang, 'format' => 'rasterized' ] ); } else { // For icons that are defined by URL $iconUrl = $wgEchoNotificationIcons[ $icon ][ 'url' ]; } return $iconUrl; } }