X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fmedia%2FSVG.php;h=10be97a5cd5b8c796dd9d0d51ff1cbce1ccbdb70;hb=d4d9ff0d1152cba349024cc2ee2bf203760fd832;hp=bd78b49e5d00fcb0b5aad3cc796dc9dccc2227c4;hpb=b95ca29602793f39191c06cd6941e3f32ab1bbb8;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/media/SVG.php b/includes/media/SVG.php index bd78b49e5d..10be97a5cd 100644 --- a/includes/media/SVG.php +++ b/includes/media/SVG.php @@ -97,19 +97,50 @@ class SvgHandler extends ImageHandler { if ( isset( $metadata['translations'] ) ) { foreach ( $metadata['translations'] as $lang => $langType ) { if ( $langType === SVGReader::LANG_FULL_MATCH ) { - $langList[] = $lang; + $langList[] = strtolower( $lang ); } } } } - return $langList; + return array_unique( $langList ); } /** - * What language to render file in if none selected. + * SVG's systemLanguage matching rules state: + * 'The `systemLanguage` attribute ... [e]valuates to "true" if one of the languages indicated + * by user preferences exactly equals one of the languages given in the value of this parameter, + * or if one of the languages indicated by user preferences exactly equals a prefix of one of + * the languages given in the value of this parameter such that the first tag character + * following the prefix is "-".' * - * @param File $file - * @return string Language code. + * Return the first element of $svgLanguages that matches $userPreferredLanguage + * + * @see https://www.w3.org/TR/SVG/struct.html#SystemLanguageAttribute + * @param string $userPreferredLanguage + * @param array $svgLanguages + * @return string|null + */ + public function getMatchedLanguage( $userPreferredLanguage, array $svgLanguages ) { + foreach ( $svgLanguages as $svgLang ) { + if ( strcasecmp( $svgLang, $userPreferredLanguage ) === 0 ) { + return $svgLang; + } + $trimmedSvgLang = $svgLang; + while ( strpos( $trimmedSvgLang, '-' ) !== false ) { + $trimmedSvgLang = substr( $trimmedSvgLang, 0, strrpos( $trimmedSvgLang, '-' ) ); + if ( strcasecmp( $trimmedSvgLang, $userPreferredLanguage ) === 0 ) { + return $svgLang; + } + } + } + return null; + } + + /** + * What language to render file in if none selected + * + * @param File $file Language code + * @return string */ public function getDefaultRenderLanguage( File $file ) { return 'en'; @@ -479,9 +510,7 @@ class SvgHandler extends ImageHandler { return ( $value > 0 ); } elseif ( $name == 'lang' ) { // Validate $code - if ( $value === '' || !Language::isValidBuiltInCode( $value ) ) { - wfDebug( "Invalid user language code\n" ); - + if ( $value === '' || !Language::isValidCode( $value ) ) { return false; } @@ -499,8 +528,7 @@ class SvgHandler extends ImageHandler { public function makeParamString( $params ) { $lang = ''; if ( isset( $params['lang'] ) && $params['lang'] !== 'en' ) { - $params['lang'] = strtolower( $params['lang'] ); - $lang = "lang{$params['lang']}-"; + $lang = 'lang' . strtolower( $params['lang'] ) . '-'; } if ( !isset( $params['width'] ) ) { return false; @@ -511,7 +539,7 @@ class SvgHandler extends ImageHandler { public function parseParamString( $str ) { $m = false; - if ( preg_match( '/^lang([a-z]+(?:-[a-z]+)*)-(\d+)px$/', $str, $m ) ) { + if ( preg_match( '/^lang([a-z]+(?:-[a-z]+)*)-(\d+)px$/i', $str, $m ) ) { return [ 'width' => array_pop( $m ), 'lang' => $m[1] ]; } elseif ( preg_match( '/^(\d+)px$/', $str, $m ) ) { return [ 'width' => $m[1], 'lang' => 'en' ];