X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=languages%2FLanguage.php;h=d750f7d519a11f846ed7a6626e60e1444c047d46;hb=0e052c816b21e38096d4c6d747a9beadb9d0d575;hp=27c9faf3079280a0c75e6f372c19a4c5ceee4f00;hpb=d3538125dfe64afa94ef68aa000549a03eb49977;p=lhc%2Fweb%2Fwiklou.git diff --git a/languages/Language.php b/languages/Language.php index 27c9faf307..d750f7d519 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -2140,7 +2140,7 @@ class Language { return $ts; } - MediaWiki\suppressWarnings(); // E_STRICT system time bitching + Wikimedia\suppressWarnings(); // E_STRICT system time bitching # Generate an adjusted date; take advantage of the fact that mktime # will normalize out-of-range values so we don't have to split $minDiff # into hours and minutes. @@ -2153,7 +2153,7 @@ class Language { (int)substr( $ts, 0, 4 ) ); # Year $date = date( 'YmdHis', $t ); - MediaWiki\restoreWarnings(); + Wikimedia\restoreWarnings(); return $date; } @@ -2605,9 +2605,9 @@ class Language { # *input* string. We just ignore those too. # REF: https://bugs.php.net/bug.php?id=37166 # REF: https://phabricator.wikimedia.org/T18885 - MediaWiki\suppressWarnings(); + Wikimedia\suppressWarnings(); $text = iconv( $in, $out . '//IGNORE', $string ); - MediaWiki\restoreWarnings(); + Wikimedia\restoreWarnings(); return $text; } @@ -3472,27 +3472,103 @@ class Language { } /** - * Truncate a string to a specified length in bytes, appending an optional - * string (e.g. for ellipses) + * This method is deprecated since 1.31 and kept as alias for truncateForDatabase, which + * has replaced it. This method provides truncation suitable for DB. * * The database offers limited byte lengths for some columns in the database; * multi-byte character sets mean we need to ensure that only whole characters - * are included, otherwise broken characters can be passed to the user + * are included, otherwise broken characters can be passed to the user. * - * If $length is negative, the string will be truncated from the beginning + * @deprecated since 1.31, use truncateForDatabase or truncateForVisual as appropriate. * * @param string $string String to truncate - * @param int $length Maximum length (including ellipses) + * @param int $length Maximum length (including ellipsis) * @param string $ellipsis String to append to the truncated text * @param bool $adjustLength Subtract length of ellipsis from $length. * $adjustLength was introduced in 1.18, before that behaved as if false. * @return string */ function truncate( $string, $length, $ellipsis = '...', $adjustLength = true ) { + return $this->truncateForDatabase( $string, $length, $ellipsis, $adjustLength ); + } + + /** + * Truncate a string to a specified length in bytes, appending an optional + * string (e.g. for ellipsis) + * + * If $length is negative, the string will be truncated from the beginning + * + * @since 1.31 + * + * @param string $string String to truncate + * @param int $length Maximum length in bytes + * @param string $ellipsis String to append to the end of truncated text + * @param bool $adjustLength Subtract length of ellipsis from $length + * + * @return string + */ + function truncateForDatabase( $string, $length, $ellipsis = '...', $adjustLength = true ) { + return $this->truncateInternal( + $string, $length, $ellipsis, $adjustLength, 'strlen', 'substr' + ); + } + + /** + * Truncate a string to a specified number of characters, appending an optional + * string (e.g. for ellipsis). + * + * This provides multibyte version of truncate() method of this class, suitable for truncation + * based on number of characters, instead of number of bytes. + * + * If $length is negative, the string will be truncated from the beginning. + * + * @since 1.31 + * + * @param string $string String to truncate + * @param int $length Maximum number of characters + * @param string $ellipsis String to append to the end of truncated text + * @param bool $adjustLength Subtract length of ellipsis from $length + * + * @return string + */ + function truncateForVisual( $string, $length, $ellipsis = '...', $adjustLength = true ) { + // Passing encoding to mb_strlen and mb_substr is optional. + // Encoding defaults to mb_internal_encoding(), which is set to UTF-8 in Setup.php, so + // explicit specification of encoding is skipped. + // Note: Both multibyte methods are callables invoked in truncateInternal. + return $this->truncateInternal( + $string, $length, $ellipsis, $adjustLength, 'mb_strlen', 'mb_substr' + ); + } + + /** + * Internal method used for truncation. This method abstracts text truncation into + * one common method, allowing users to provide length measurement function and + * function for finding substring. + * + * For usages, see truncateForDatabase and truncateForVisual. + * + * @param string $string String to truncate + * @param int $length Maximum length of final text + * @param string $ellipsis String to append to the end of truncated text + * @param bool $adjustLength Subtract length of ellipsis from $length + * @param callable $measureLength Callable function used for determining the length of text + * @param callable $getSubstring Callable function used for getting the substrings + * + * @return string + */ + private function truncateInternal( + $string, $length, $ellipsis = '...', $adjustLength = true, $measureLength, $getSubstring + ) { + if ( !is_callable( $measureLength ) || !is_callable( $getSubstring ) ) { + throw new InvalidArgumentException( 'Invalid callback provided' ); + } + # Check if there is no need to truncate - if ( strlen( $string ) <= abs( $length ) ) { + if ( $measureLength( $string ) <= abs( $length ) ) { return $string; // no need to truncate } + # Use the localized ellipsis character if ( $ellipsis == '...' ) { $ellipsis = wfMessage( 'ellipsis' )->inLanguage( $this )->escaped(); @@ -3500,31 +3576,33 @@ class Language { if ( $length == 0 ) { return $ellipsis; // convention } + $stringOriginal = $string; # If ellipsis length is >= $length then we can't apply $adjustLength - if ( $adjustLength && strlen( $ellipsis ) >= abs( $length ) ) { + if ( $adjustLength && $measureLength( $ellipsis ) >= abs( $length ) ) { $string = $ellipsis; // this can be slightly unexpected # Otherwise, truncate and add ellipsis... } else { - $eLength = $adjustLength ? strlen( $ellipsis ) : 0; + $ellipsisLength = $adjustLength ? $measureLength( $ellipsis ) : 0; if ( $length > 0 ) { - $length -= $eLength; - $string = substr( $string, 0, $length ); // xyz... + $length -= $ellipsisLength; + $string = $getSubstring( $string, 0, $length ); // xyz... $string = $this->removeBadCharLast( $string ); $string = rtrim( $string ); $string = $string . $ellipsis; } else { - $length += $eLength; - $string = substr( $string, $length ); // ...xyz + $length += $ellipsisLength; + $string = $getSubstring( $string, $length ); // ...xyz $string = $this->removeBadCharFirst( $string ); $string = ltrim( $string ); $string = $ellipsis . $string; } } + # Do not truncate if the ellipsis makes the string longer/equal (T24181). # This check is *not* redundant if $adjustLength, due to the single case where # LEN($ellipsis) > ABS($limit arg); $stringOriginal could be shorter than $string. - if ( strlen( $string ) < strlen( $stringOriginal ) ) { + if ( $measureLength( $string ) < $measureLength( $stringOriginal ) ) { return $string; } else { return $stringOriginal; @@ -4070,6 +4148,18 @@ class Language { return $this->mConverter; } + /** + * convert text to a variant + * + * @param string $text text to convert + * @param string|bool $variant variant to convert to, or false to use the user's preferred + * variant (if logged in), or the project default variant + * @return string the converted string + */ + public function autoConvert( $text, $variant = false ) { + return $this->mConverter->autoConvert( $text, $variant ); + } + /** * convert text to all supported variants * @@ -4103,11 +4193,13 @@ class Language { /** * Convert a namespace index to a string in the preferred variant * - * @param int $ns - * @return string + * @param int $ns namespace index (https://www.mediawiki.org/wiki/Manual:Namespace) + * @param string|null $variant variant to convert to, or null to use the user's preferred + * variant (if logged in), or the project default variant + * @return string a string representation of the namespace */ - public function convertNamespace( $ns ) { - return $this->mConverter->convertNamespace( $ns ); + public function convertNamespace( $ns, $variant = null ) { + return $this->mConverter->convertNamespace( $ns, $variant ); } /** @@ -4744,7 +4836,7 @@ class Language { * @param string $details HTML safe text between brackets * @param bool $oppositedm Add the direction mark opposite to your * language, to display text properly - * @return HTML escaped string + * @return string HTML escaped */ function specialList( $page, $details, $oppositedm = true ) { if ( !$details ) {