X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=languages%2FLanguageConverter.php;h=f611358d94c09b5e2faa3d91b05b297cfccb397e;hb=fac144565411ba560c96b5913b2b054e48deadd7;hp=8e98abd618e4ffce26201919b1f0e7c38813f99c;hpb=f600b4ede9a6390cc5e929d2a48ed98af2edbc60;p=lhc%2Fweb%2Fwiklou.git diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index 8e98abd618..f611358d94 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -39,6 +39,7 @@ class LanguageConverter { */ static public $languagesWithVariants = [ 'en', + 'crh', 'gan', 'iu', 'kk', @@ -162,6 +163,8 @@ class LanguageConverter { $req = $this->getURLVariant(); + Hooks::run( 'GetLangPreferredVariant', [ &$req ] ); + if ( $wgUser->isSafeToLoad() && $wgUser->isLoggedIn() && !$req ) { $req = $this->getUserVariant(); } elseif ( !$req ) { @@ -353,7 +356,6 @@ class LanguageConverter { if ( $this->guessVariant( $text, $toVariant ) ) { return $text; } - /* we convert everything except: 1. HTML markups (anything between < and >) 2. HTML entities @@ -389,6 +391,7 @@ class LanguageConverter { // Guard against delimiter nulls in the input // (should never happen: see T159174) $text = str_replace( "\000", '', $text ); + $text = str_replace( "\004", '', $text ); $markupMatches = null; $elementMatches = null; @@ -403,6 +406,13 @@ class LanguageConverter { // We hit the end. $elementPos = strlen( $text ); $element = ''; + } elseif ( substr( $element, -1 ) === "\004" ) { + // This can sometimes happen if we have + // unclosed html tags (For example + // when converting a title attribute + // during a recursive call that contains + // a < e.g.
. + $element = substr( $element, 0, -1 ); } } else { // If we hit here, then Language Converter could be tricked @@ -430,7 +440,14 @@ class LanguageConverter { if ( $element !== '' && preg_match( '/^(<[^>\s]*+)\s([^>]*+)(.*+)$/', $element, $elementMatches ) ) { + // FIXME, this decodes entities, so if you have something + // like
the bar won't get + // translated since after entity decoding it looks like + // unclosed html and we call this method recursively + // on attributes. $attrs = Sanitizer::decodeTagAttributes( $elementMatches[2] ); + // Ensure self-closing tags stay self-closing. + $close = substr( $elementMatches[2], -1 ) === '/' ? ' /' : ''; $changed = false; foreach ( [ 'title', 'alt' ] as $attrName ) { if ( !isset( $attrs[$attrName] ) ) { @@ -449,7 +466,7 @@ class LanguageConverter { } if ( $changed ) { $element = $elementMatches[1] . Html::expandAttributes( $attrs ) . - $elementMatches[3]; + $close . $elementMatches[3]; } } $literalBlob .= $element . "\000"; @@ -665,9 +682,8 @@ class LanguageConverter { $noScript = '.*?<\/script>(*SKIP)(*FAIL)'; $noStyle = '.*?<\/style>(*SKIP)(*FAIL)'; - // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong + // phpcs:ignore Generic.Files.LineLength $noHtml = '<(?:[^>=]*+(?>[^>=]*+=\s*+(?:"[^"]*"|\'[^\']*\'|[^\'">\s]*+))*+[^>=]*+>|.*+)(*SKIP)(*FAIL)'; - // @codingStandardsIgnoreEnd while ( $startPos < $length && $continue ) { $continue = preg_match( // Only match -{ outside of html.