35use Wikimedia\AtEase\AtEase;
41use Wikimedia\RequestTimeout\RequestTimeout;
56 $path =
"$wgExtensionDirectory/$ext/extension.json";
58 ExtensionRegistry::getInstance()->queue(
$path );
76 $registry = ExtensionRegistry::getInstance();
77 foreach ( $exts as $ext ) {
78 $registry->queue(
"$wgExtensionDirectory/$ext/extension.json" );
93 $path =
"$wgStyleDirectory/$skin/skin.json";
95 ExtensionRegistry::getInstance()->queue(
$path );
107 $registry = ExtensionRegistry::getInstance();
108 foreach ( $skins as $skin ) {
109 $registry->queue(
"$wgStyleDirectory/$skin/skin.json" );
126 $comparator =
static function ( $a, $b ):
int {
127 if ( is_string( $a ) && is_string( $b ) ) {
128 return strcmp( $a, $b );
130 if ( !is_array( $a ) && !is_array( $b ) ) {
131 throw new InvalidArgumentException(
132 'This function assumes that array elements are all strings or all arrays'
135 if ( count( $a ) !== count( $b ) ) {
136 return count( $a ) <=> count( $b );
140 while ( key( $a ) !==
null && key( $b ) !==
null ) {
141 $valueA = current( $a );
142 $valueB = current( $b );
143 $cmp = strcmp( $valueA, $valueB );
153 return array_udiff( $arr1, $arr2, $comparator );
179 foreach ( $args as $errors ) {
180 foreach ( $errors as
$params ) {
185 # @todo FIXME: Sometimes get nested arrays for $params,
186 # which leads to E_NOTICEs
187 $spec = implode(
"\t",
$params );
188 $out[$spec] = $originalParams;
191 return array_values( $out );
205 $keys = array_keys( $array );
206 $offsetByKey = array_flip( $keys );
208 if ( !\array_key_exists( $after, $offsetByKey ) ) {
211 $offset = $offsetByKey[$after];
214 $before = array_slice( $array, 0, $offset + 1,
true );
215 $after = array_slice( $array, $offset + 1, count( $array ) - $offset,
true );
217 $output = $before + $insert + $after;
232 if ( is_object( $objOrArray ) ) {
233 $objOrArray = get_object_vars( $objOrArray );
235 foreach ( $objOrArray as $key => $value ) {
236 if ( $recursive && ( is_object( $value ) || is_array( $value ) ) ) {
240 $array[$key] = $value;
259 $max = mt_getrandmax() + 1;
260 $rand = number_format( ( mt_rand() * $max + mt_rand() ) / $max / $max, 12,
'.',
'' );
276 for ( $n = 0; $n < $length; $n += 7 ) {
277 $str .= sprintf(
'%07x', mt_rand() & 0xfffffff );
279 return substr( $str, 0, $length );
318 if ( $needle ===
null ) {
319 $needle = [
'%3B',
'%40',
'%24',
'%21',
'%2A',
'%28',
'%29',
'%2C',
'%2F',
'%7E' ];
320 if ( !isset( $_SERVER[
'SERVER_SOFTWARE'] ) ||
321 !str_contains( $_SERVER[
'SERVER_SOFTWARE'],
'Microsoft-IIS/7' )
327 $s = urlencode( $s );
330 [
';',
'@',
'$',
'!',
'*',
'(',
')',
',',
'/',
'~',
':' ],
348 if ( $array2 !==
null ) {
353 foreach ( $array1 as $key => $value ) {
354 if ( $value !==
null && $value !==
false ) {
358 if ( $prefix !==
'' ) {
359 $key = $prefix .
"[$key]";
361 if ( is_array( $value ) ) {
363 foreach ( $value as $k => $v ) {
364 $cgi .= $firstTime ?
'' :
'&';
365 if ( is_array( $v ) ) {
368 $cgi .= urlencode( $key .
"[$k]" ) .
'=' . urlencode( $v );
373 if ( is_object( $value ) ) {
374 $value = $value->__toString();
376 $cgi .= urlencode( $key ) .
'=' . urlencode( $value );
393 if ( isset( $query[0] ) && $query[0] ==
'?' ) {
394 $query = substr( $query, 1 );
396 $bits = explode(
'&', $query );
398 foreach ( $bits as $bit ) {
402 if ( strpos( $bit,
'=' ) ===
false ) {
407 [ $key, $value ] = explode(
'=', $bit );
409 $key = urldecode( $key );
410 $value = urldecode( $value );
411 if ( strpos( $key,
'[' ) !==
false ) {
412 $keys = array_reverse( explode(
'[', $key ) );
413 $key = array_pop( $keys );
415 foreach ( $keys as $k ) {
416 $k = substr( $k, 0, -1 );
417 $temp = [ $k => $temp ];
419 if ( isset( $ret[$key] ) && is_array( $ret[$key] ) ) {
420 $ret[$key] = array_merge( $ret[$key], $temp );
440 if ( is_array( $query ) ) {
443 if ( $query !=
'' ) {
446 $hashPos = strpos(
$url,
'#' );
447 if ( $hashPos !==
false ) {
448 $fragment = substr(
$url, $hashPos );
453 if ( strpos(
$url,
'?' ) ===
false ) {
461 if ( $fragment !==
false ) {
477 if ( MediaWikiServices::hasInstance() ) {
478 $services = MediaWikiServices::getInstance();
479 if ( $services->hasService(
'UrlUtils' ) ) {
480 return $services->getUrlUtils();
557 return UrlUtils::assemble( (array)$urlParts );
571 return $includeProtocolRelative ?
wfGetUrlUtils()->validProtocols() :
663function wfDebug( $text, $dest =
'all', array $context = [] ) {
670 $text = trim( $text );
675 $context[
'private'] = ( $dest ===
false || $dest ===
'private' );
677 $logger = LoggerFactory::getInstance(
'wfDebug' );
678 $logger->debug( $text, $context );
687 if ( $cache !==
null ) {
692 if ( ( isset( $_GET[
'action'] ) && $_GET[
'action'] ==
'raw' )
728 $logGroup, $text, $dest =
'all', array $context = []
730 $text = trim( $text );
732 $logger = LoggerFactory::getInstance( $logGroup );
733 $context[
'private'] = ( $dest ===
false || $dest ===
'private' );
734 $logger->info( $text, $context );
746 $logger = LoggerFactory::getInstance(
'wfLogDBError' );
747 $logger->error( trim( $text ), $context );
766function wfDeprecated( $function, $version =
false, $component =
false, $callerOffset = 2 ) {
767 if ( !is_string( $version ) && $version !==
false ) {
768 throw new InvalidArgumentException(
769 "MediaWiki version must either be a string or false. " .
770 "Example valid version: '1.33'"
774 MWDebug::deprecated( $function, $version, $component, $callerOffset + 1 );
797function wfDeprecatedMsg( $msg, $version =
false, $component =
false, $callerOffset = 2 ) {
798 MWDebug::deprecatedMsg( $msg, $version, $component,
799 $callerOffset ===
false ?
false : $callerOffset + 1 );
812function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
813 MWDebug::warning( $msg, $callerOffset + 1, $level,
'auto' );
825function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
826 MWDebug::warning( $msg, $callerOffset + 1, $level,
'production' );
852 if ( is_array( $key ) ) {
856 $message = Message::newFromSpecifier( $key );
861 $message->params( ...
$params );
880 return Message::newFallbackSequence( ...$keys );
892 # Fix windows line-endings
893 # Some messages are split with explode("\n", $msg)
894 $message = str_replace(
"\r",
'', $message );
897 if ( is_array( $args ) && $args ) {
898 if ( is_array( $args[0] ) ) {
899 $args = array_values( $args[0] );
901 $replacementKeys = [];
902 foreach ( $args as $n => $param ) {
903 $replacementKeys[
'$' . ( $n + 1 )] = $param;
905 $message = strtr( $message, $replacementKeys );
926 return php_uname(
'n' ) ?:
'unknown';
940 static $disabled =
null;
942 if ( $disabled ===
null ) {
943 $disabled = !function_exists(
'debug_backtrace' );
945 wfDebug(
"debug_backtrace() is disabled" );
953 return array_slice( debug_backtrace( DEBUG_BACKTRACE_PROVIDE_OBJECT, $limit + 1 ), 1 );
955 return array_slice( debug_backtrace(), 1 );
970 $frameFormat =
"%s line %s calls %s()\n";
973 $frameFormat =
"<li>%s line %s calls %s()</li>\n";
974 $traceFormat =
"<ul>\n%s</ul>\n";
977 $frames = array_map(
static function ( $frame ) use ( $frameFormat ) {
978 $file = !empty( $frame[
'file'] ) ? basename( $frame[
'file'] ) :
'-';
979 $line = $frame[
'line'] ??
'-';
980 $call = $frame[
'function'];
981 if ( !empty( $frame[
'class'] ) ) {
982 $call = $frame[
'class'] . $frame[
'type'] . $call;
984 return sprintf( $frameFormat, $file, $line, $call );
987 return sprintf( $traceFormat, implode(
'', $frames ) );
1002 if ( isset( $backtrace[$level] ) ) {
1018 if ( !$limit || $limit > count( $trace ) - 1 ) {
1019 $limit = count( $trace ) - 1;
1021 $trace = array_slice( $trace, -$limit - 1, $limit );
1022 return implode(
'/', array_map(
'wfFormatStackFrame', $trace ) );
1038 if ( !isset( $frame[
'function'] ) ) {
1039 return 'NO_FUNCTION_GIVEN';
1041 return isset( $frame[
'class'] ) && isset( $frame[
'type'] ) ?
1042 $frame[
'class'] . $frame[
'type'] . $frame[
'function'] :
1056 static $result =
null;
1057 if ( $result ===
null || $force ) {
1059 if ( isset( $_SERVER[
'HTTP_ACCEPT_ENCODING'] ) ) {
1060 # @todo FIXME: We may want to disallow some broken browsers
1063 '/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/',
1064 $_SERVER[
'HTTP_ACCEPT_ENCODING'],
1068 if ( isset( $m[2] ) && ( $m[1] ==
'q' ) && ( $m[2] == 0 ) ) {
1071 wfDebug(
"wfClientAcceptsGzip: client accepts gzip." );
1091 static $repl =
null, $repl2 =
null, $repl3 =
null, $repl4 =
null;
1092 if ( $repl ===
null || defined(
'MW_PARSER_TEST' ) || defined(
'MW_PHPUNIT_TEST' ) ) {
1096 '"' =>
'"',
'&' =>
'&',
"'" =>
''',
'<' =>
'<',
1097 '=' =>
'=',
'>' =>
'>',
'[' =>
'[',
']' =>
']',
1098 '{' =>
'{',
'|' =>
'|',
'}' =>
'}',
1101 "\n!" =>
"\n!",
"\r!" =>
"\r!",
1102 "\n#" =>
"\n#",
"\r#" =>
"\r#",
1103 "\n*" =>
"\n*",
"\r*" =>
"\r*",
1104 "\n:" =>
"\n:",
"\r:" =>
"\r:",
1105 "\n " =>
"\n ",
"\r " =>
"\r ",
1106 "\n\n" =>
"\n ",
"\r\n" =>
" \n",
1107 "\n\r" =>
"\n ",
"\r\r" =>
"\r ",
1108 "\n\t" =>
"\n	",
"\r\t" =>
"\r	",
1109 "\n----" =>
"\n----",
"\r----" =>
"\r----",
1110 '__' =>
'__',
'://' =>
'://',
1111 '~~~' =>
'~~~',
1116 foreach ( $magicLinks as $magic ) {
1117 $repl[
"$magic "] =
"$magic ";
1118 $repl[
"$magic\t"] =
"$magic	";
1119 $repl[
"$magic\r"] =
"$magic ";
1120 $repl[
"$magic\n"] =
"$magic ";
1121 $repl[
"$magic\f"] =
"$magic";
1129 '+' =>
'+',
'-' =>
'-',
'_' =>
'_',
'~' =>
'~',
1137 '_' =>
'_',
'~' =>
'~',
1138 "\n" =>
" ",
"\r" =>
" ",
1146 if ( substr( $prot, -1 ) ===
':' ) {
1147 $repl2[] = preg_quote( substr( $prot, 0, -1 ),
'/' );
1150 $repl2 = $repl2 ?
'/\b(' . implode(
'|', $repl2 ) .
'):/i' :
'/^(?!)/';
1153 '@phan-var string $repl2';
1154 '@phan-var string $repl3';
1155 '@phan-var string $repl4';
1157 $text = substr( strtr(
"\n$input", $repl ), 1 );
1158 if ( $text ===
'' ) {
1161 $first = strtr( $text[0], $repl3 );
1162 if ( strlen( $text ) > 1 ) {
1163 $text = $first . substr( $text, 1, -1 ) .
1164 strtr( substr( $text, -1 ), $repl4 );
1167 $text = strtr( $first, $repl4 );
1169 $text = preg_replace( $repl2,
'$1:', $text );
1185 if (
$source !==
null || $force ) {
1201 $temp = (bool)( $dest & $bit );
1202 if ( $state !==
null ) {
1220 $s = str_replace(
"\n",
"<br />\n", var_export( $var,
true ) .
"\n" );
1221 if ( headers_sent() || !isset(
$wgOut ) || !is_object(
$wgOut ) ) {
1237 HttpStatus::header( $code );
1240 $wgOut->sendCacheControl();
1243 \MediaWiki\Request\HeaderCallback::warnIfHeadersSent();
1244 header(
'Content-type: text/html; charset=utf-8' );
1246 print
'<!DOCTYPE html>' .
1247 '<html><head><title>' .
1248 htmlspecialchars( $label ) .
1249 '</title></head><body><h1>' .
1250 htmlspecialchars( $label ) .
1252 nl2br( htmlspecialchars( $desc ) ) .
1253 "</p></body></html>\n";
1254 header(
'Content-Length: ' . ob_get_length() );
1280 while ( $status = ob_get_status() ) {
1281 if ( isset( $status[
'flags'] ) ) {
1282 $flags = PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_REMOVABLE;
1283 $deleteable = ( $status[
'flags'] & $flags ) === $flags;
1284 } elseif ( isset( $status[
'del'] ) ) {
1285 $deleteable = $status[
'del'];
1288 $deleteable = $status[
'type'] !== 0;
1290 if ( !$deleteable ) {
1295 if ( $status[
'name'] ===
'MediaWikiIntegrationTestCase::wfResetOutputBuffersBarrier' ) {
1299 if ( !ob_end_clean() ) {
1304 if ( $resetGzipEncoding && $status[
'name'] ==
'ob_gzhandler' ) {
1307 header_remove(
'Content-Encoding' );
1324 $ret = MWTimestamp::convert( $outputtype, $ts );
1325 if ( $ret ===
false ) {
1326 wfDebug(
"wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts" );
1340 if ( $ts ===
null ) {
1353 return MWTimestamp::now( TS_MW );
1374 return TempFSFile::getUsableTempDirectory();
1388 if ( FileBackend::isStoragePath( $dir ) ) {
1389 throw new LogicException( __FUNCTION__ .
" given storage path '$dir'." );
1391 if ( $caller !==
null ) {
1392 wfDebug(
"$caller: called wfMkdirParents($dir)" );
1394 if ( strval( $dir ) ===
'' ) {
1398 $dir = str_replace( [
'\\',
'/' ], DIRECTORY_SEPARATOR, $dir );
1408 $ok = is_dir( $dir ) || @mkdir( $dir, $mode,
true ) || is_dir( $dir );
1410 trigger_error( sprintf(
"failed to mkdir \"%s\" mode 0%o", $dir, $mode ), E_USER_WARNING );
1423 if ( is_dir( $dir ) ) {
1424 $objects = scandir( $dir );
1425 foreach ( $objects as $object ) {
1426 if ( $object !=
"." && $object !=
".." ) {
1427 if ( filetype( $dir .
'/' . $object ) ==
"dir" ) {
1430 unlink( $dir .
'/' . $object );
1444function wfPercent( $nr,
int $acc = 2,
bool $round =
true ) {
1445 $accForFormat = $acc >= 0 ? $acc : 0;
1446 $ret = sprintf(
"%.{$accForFormat}f", $nr );
1447 return $round ? round( (
float)$ret, $acc ) .
'%' :
"$ret%";
1490 $val = strtolower( $val );
1495 || preg_match(
"/^\s*[+-]?0*[1-9]/", $val );
1512 return Shell::escape( ...$args );
1540 $limits = [], $options = []
1542 if ( Shell::isDisabled() ) {
1545 return 'Unable to run external programs, proc_open() is disabled.';
1548 if ( is_array( $cmd ) ) {
1549 $cmd = Shell::escape( $cmd );
1552 $includeStderr = isset( $options[
'duplicateStderr'] ) && $options[
'duplicateStderr'];
1553 $profileMethod = $options[
'profileMethod'] ??
wfGetCaller();
1556 $result = Shell::command( [] )
1557 ->unsafeParams( (array)$cmd )
1558 ->environment( $environ )
1560 ->includeStderr( $includeStderr )
1561 ->profileMethod( $profileMethod )
1563 ->restrict( Shell::RESTRICT_NONE )
1570 $retval = $result->getExitCode();
1572 return $result->getStdout();
1593 return wfShellExec( $cmd, $retval, $environ, $limits,
1594 [
'duplicateStderr' =>
true,
'profileMethod' =>
wfGetCaller() ] );
1616 (
new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
1617 ->onWfShellWikiCmd( $script, $parameters, $options );
1618 $cmd = [ $options[
'php'] ??
$wgPhpCli ];
1619 if ( isset( $options[
'wrapper'] ) ) {
1620 $cmd[] = $options[
'wrapper'];
1624 return Shell::escape( array_merge( $cmd, $parameters ) );
1647 ?
string &$simplisticMergeAttempt,
1648 ?
string &$mergeLeftovers =
null
1652 # This check may also protect against code injection in
1653 # case of broken installations.
1654 AtEase::suppressWarnings();
1656 AtEase::restoreWarnings();
1658 if ( !$haveDiff3 ) {
1663 # Make temporary files
1665 $oldtextFile = fopen( $oldtextName = tempnam( $td,
'merge-old-' ),
'w' );
1666 $mytextFile = fopen( $mytextName = tempnam( $td,
'merge-mine-' ),
'w' );
1667 $yourtextFile = fopen( $yourtextName = tempnam( $td,
'merge-your-' ),
'w' );
1669 # NOTE: diff3 issues a warning to stderr if any of the files does not end with
1670 # a newline character. To avoid this, we normalize the trailing whitespace before
1671 # creating the diff.
1673 fwrite( $oldtextFile, rtrim( $old ) .
"\n" );
1674 fclose( $oldtextFile );
1675 fwrite( $mytextFile, rtrim( $mine ) .
"\n" );
1676 fclose( $mytextFile );
1677 fwrite( $yourtextFile, rtrim( $yours ) .
"\n" );
1678 fclose( $yourtextFile );
1680 # Check for a conflict
1681 $cmd = Shell::escape(
$wgDiff3,
'--text',
'--overlap-only', $mytextName,
1682 $oldtextName, $yourtextName );
1683 $handle = popen( $cmd,
'r' );
1685 $mergeLeftovers =
'';
1687 $data = fread( $handle, 8192 );
1688 if ( strlen( $data ) == 0 ) {
1691 $mergeLeftovers .= $data;
1695 $conflict = $mergeLeftovers !==
'';
1697 # Merge differences automatically where possible, preferring "my" text for conflicts.
1698 $cmd = Shell::escape(
$wgDiff3,
'--text',
'--ed',
'--merge', $mytextName,
1699 $oldtextName, $yourtextName );
1700 $handle = popen( $cmd,
'r' );
1701 $simplisticMergeAttempt =
'';
1703 $data = fread( $handle, 8192 );
1704 if ( strlen( $data ) == 0 ) {
1707 $simplisticMergeAttempt .= $data;
1710 unlink( $mytextName );
1711 unlink( $oldtextName );
1712 unlink( $yourtextName );
1714 if ( $simplisticMergeAttempt ===
'' && $old !==
'' && !$conflict ) {
1715 wfDebug(
"Unexpected null result from diff3. Command: $cmd" );
1734 if ( $suffix ==
'' ) {
1737 $encSuffix =
'(?:' . preg_quote( $suffix,
'#' ) .
')?';
1741 if ( preg_match(
"#([^/\\\\]*?){$encSuffix}[/\\\\]*$#",
$path,
$matches ) ) {
1759 $path = str_replace(
'/', DIRECTORY_SEPARATOR,
$path );
1760 $from = str_replace(
'/', DIRECTORY_SEPARATOR, $from );
1764 $from = rtrim( $from, DIRECTORY_SEPARATOR );
1766 $pieces = explode( DIRECTORY_SEPARATOR, dirname(
$path ) );
1767 $against = explode( DIRECTORY_SEPARATOR, $from );
1769 if ( $pieces[0] !== $against[0] ) {
1776 while ( count( $pieces ) && count( $against )
1777 && $pieces[0] == $against[0] ) {
1778 array_shift( $pieces );
1779 array_shift( $against );
1783 while ( count( $against ) ) {
1784 array_unshift( $pieces,
'..' );
1785 array_shift( $against );
1790 return implode( DIRECTORY_SEPARATOR, $pieces );
1830function wfGetDB( $db, $groups = [], $wiki =
false ) {
1833 if ( $wiki ===
false ) {
1834 return MediaWikiServices::getInstance()
1835 ->getDBLoadBalancer()
1836 ->getMaintenanceConnectionRef( $db, $groups, $wiki );
1838 return MediaWikiServices::getInstance()
1839 ->getDBLoadBalancerFactory()
1840 ->getMainLB( $wiki )
1841 ->getMaintenanceConnectionRef( $db, $groups, $wiki );
1856 if ( $script ===
'index' ) {
1858 } elseif ( $script ===
'load' ) {
1861 return "{$wgScriptPath}/{$script}.php";
1873 return $value ?
'true' :
'false';
1896 $name = preg_replace(
1897 "/[^" . Title::legalChars() .
"]" . $illegalFileChars .
"/",
1915 if ( $oldLimit != -1 ) {
1917 if ( $newLimit == -1 ) {
1918 wfDebug(
"Removing PHP's memory limit" );
1919 AtEase::suppressWarnings();
1920 ini_set(
'memory_limit', $newLimit );
1921 AtEase::restoreWarnings();
1922 } elseif ( $newLimit > $oldLimit ) {
1923 wfDebug(
"Raising PHP's memory limit to $newLimit bytes" );
1924 AtEase::suppressWarnings();
1925 ini_set(
'memory_limit', $newLimit );
1926 AtEase::restoreWarnings();
1940 $timeout = RequestTimeout::singleton();
1941 $timeLimit = $timeout->getWallTimeLimit();
1942 if ( $timeLimit !== INF ) {
1949 $timeLimit = (int)ini_get(
'max_execution_time' );
1955 ignore_user_abort(
true );
1968 $string = trim( $string ??
'' );
1969 if ( $string ===
'' ) {
1972 $last = $string[strlen( $string ) - 1];
1973 $val = intval( $string );
2000 return in_array( $str, ExpiryDef::INFINITY_VALS );
2020 $multipliers = [ 1 ];
2024 $multipliers[] = 1.5;
2029 if ( !$handler || !isset(
$params[
'width'] ) ) {
2034 if ( isset(
$params[
'page'] ) ) {
2035 $basicParams[
'page'] =
$params[
'page'];
2041 foreach ( $multipliers as $multiplier ) {
2042 $thumbLimits = array_merge( $thumbLimits, array_map(
2043 static function ( $width ) use ( $multiplier ) {
2044 return round( $width * $multiplier );
2047 $imageLimits = array_merge( $imageLimits, array_map(
2048 static function ( $pair ) use ( $multiplier ) {
2050 round( $pair[0] * $multiplier ),
2051 round( $pair[1] * $multiplier ),
2058 if ( in_array(
$params[
'width'], $thumbLimits ) ) {
2059 $normalParams = $basicParams + [
'width' =>
$params[
'width'] ];
2061 $handler->normaliseParams( $file, $normalParams );
2065 foreach ( $imageLimits as $pair ) {
2066 $normalParams = $basicParams + [
'width' => $pair[0],
'height' => $pair[1] ];
2069 $handler->normaliseParams( $file, $normalParams );
2071 if ( $normalParams[
'width'] ==
$params[
'width'] ) {
2082 foreach (
$params as $key => $value ) {
2083 if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) {
2105 foreach ( $baseArray as $name => &$groupVal ) {
2106 if ( isset( $newValues[$name] ) ) {
2107 $groupVal += $newValues[$name];
2111 $baseArray += $newValues;
wfIsWindows()
Check if the operating system is Windows.
wfThumbIsStandard(File $file, array $params)
Returns true if these thumbnail parameters match one that MediaWiki requests from file description pa...
wfVarDump( $var)
A wrapper around the PHP function var_export().
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfRandom()
Get a random decimal value in the domain of [0, 1), in a way not likely to give duplicate values for ...
wfUrlencode( $s)
We want some things to be included as literal characters in our title URLs for prettiness,...
wfParseUrl( $url)
parse_url() work-alike, but non-broken.
wfTempDir()
Tries to get the system directory for temporary files.
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
wfRandomString( $length=32)
Get a random string containing a number of pseudo-random hex characters.
wfTimestampOrNull( $outputtype=TS_UNIX, $ts=null)
Return a formatted timestamp, or null if input is null.
wfBaseName( $path, $suffix='')
Return the final portion of a pathname.
wfTimestampNow()
Convenience function; returns MediaWiki timestamp for the present time.
wfClientAcceptsGzip( $force=false)
Whether the client accept gzip encoding.
wfEscapeShellArg(... $args)
Locale-independent version of escapeshellarg()
wfLogDBError( $text, array $context=[])
Log for database errors.
wfLoadSkins(array $skins)
Load multiple skins at once.
wfEscapeWikiText( $input)
Escapes the given text so that it may be output using addWikiText() without any linking,...
wfUrlProtocolsWithoutProtRel()
Like wfUrlProtocols(), but excludes '//' from the protocol list.
wfRecursiveRemoveDir( $dir)
Remove a directory and all its content.
wfLoadExtension( $ext, $path=null)
Load an extension.
wfMemoryLimit( $newLimit)
Raise PHP's memory limit (if needed).
wfSetBit(&$dest, $bit, $state=true)
As for wfSetVar except setting a bit.
wfIniGetBool( $setting)
Safety wrapper around ini_get() for boolean settings.
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
wfShorthandToInteger(?string $string='', int $default=-1)
Converts shorthand byte notation to integer form.
wfBacktrace( $raw=null)
Get a debug backtrace as a string.
wfArrayDiff2( $arr1, $arr2)
Like array_diff( $arr1, $arr2 ) except that it works with two-dimensional arrays.
wfGetCaller( $level=2)
Get the name of the function which called this function wfGetCaller( 1 ) is the function with the wfG...
wfExpandIRI( $url)
Take a URL, make sure it's expanded to fully qualified, and replace any encoded non-ASCII Unicode cha...
wfMergeErrorArrays(... $args)
Merge arrays in the style of PermissionManager::getPermissionErrors, with duplicate removal e....
wfDeprecatedMsg( $msg, $version=false, $component=false, $callerOffset=2)
Log a deprecation warning with arbitrary message text.
wfShellExec( $cmd, &$retval=null, $environ=[], $limits=[], $options=[])
Execute a shell command, with time and memory limits mirrored from the PHP configuration if supported...
wfIsDebugRawPage()
Returns true if debug logging should be suppressed if $wgDebugRawPage = false.
wfHostname()
Get host name of the current machine, for use in error reporting.
wfExpandUrl( $url, $defaultProto=PROTO_CURRENT)
Expand a potentially local URL to a fully-qualified URL using $wgServer (or one of its alternatives).
wfShellWikiCmd( $script, array $parameters=[], array $options=[])
Generate a shell-escaped command line string to run a MediaWiki cli script.
wfPercent( $nr, int $acc=2, bool $round=true)
wfSetVar(&$dest, $source, $force=false)
Sets dest to source and returns the original value of dest If source is NULL, it just returns the val...
wfShellExecWithStderr( $cmd, &$retval=null, $environ=[], $limits=[])
Execute a shell command, returning both stdout and stderr.
wfGetNull()
Get a platform-independent path to the null file, e.g.
wfRelativePath( $path, $from)
Generate a relative path name to the given file.
wfHttpError( $code, $label, $desc)
Provide a simple HTTP error.
wfUrlProtocols( $includeProtocolRelative=true)
Returns a partial regular expression of recognized URL protocols, e.g.
wfMessageFallback(... $keys)
This function accepts multiple message keys and returns a message instance for the first message whic...
wfMerge(string $old, string $mine, string $yours, ?string &$simplisticMergeAttempt, ?string &$mergeLeftovers=null)
wfMerge attempts to merge differences between three texts.
wfGetAllCallers( $limit=3)
Return a string consisting of callers in the stack.
wfArrayPlus2d(array $baseArray, array $newValues)
Merges two (possibly) 2 dimensional arrays into the target array ($baseArray).
wfLogWarning( $msg, $callerOffset=1, $level=E_USER_WARNING)
Send a warning as a PHP error and the debug log.
wfTransactionalTimeLimit()
Raise the request time limit to $wgTransactionalTimeLimit.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
wfObjectToArray( $objOrArray, $recursive=true)
Recursively converts the parameter (an object) to an array with the same data.
wfLoadSkin( $skin, $path=null)
Load a skin.
wfMsgReplaceArgs( $message, $args)
Replace message parameter keys on the given formatted output.
wfGetServerUrl( $proto)
Get the wiki's "server", i.e.
wfStringToBool( $val)
Convert string value to boolean, when the following are interpreted as true:
wfDebugBacktrace( $limit=0)
Safety wrapper for debug_backtrace().
wfAppendQuery( $url, $query)
Append a query string to an existing URL, which may or may not already have query string parameters a...
wfStripIllegalFilenameChars( $name)
Replace all invalid characters with '-'.
wfFormatStackFrame( $frame)
Return a string representation of frame.
wfArrayToCgi( $array1, $array2=null, $prefix='')
This function takes one or two arrays as input, and returns a CGI-style string, e....
wfScript( $script='index')
Get the URL path to a MediaWiki entry point.
wfCgiToArray( $query)
This is the logical opposite of wfArrayToCgi(): it accepts a query string as its argument and returns...
wfMatchesDomainList( $url, $domains)
Check whether a given URL has a domain that occurs in a given set of domains.
wfIsInfinity( $str)
Determine input string is represents as infinity.
wfMkdirParents( $dir, $mode=null, $caller=null)
Make directory, and make all parent directories if they don't exist.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
wfLoadExtensions(array $exts)
Load multiple extensions at once.
wfBoolToStr( $value)
Convenience function converts boolean values into "true" or "false" (string) values.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
wfDeprecated( $function, $version=false, $component=false, $callerOffset=2)
Logs a warning that a deprecated feature was used.
wfArrayInsertAfter(array $array, array $insert, $after)
Insert an array into another array after the specified key.
wfAssembleUrl( $urlParts)
This function will reassemble a URL parsed with wfParseURL.
wfResetOutputBuffers( $resetGzipEncoding=true)
Clear away any user-level output buffers, discarding contents.
if(!defined( 'MW_NO_SESSION') &&MW_ENTRY_POINT !=='cli' $wgOut
array $params
The job parameters.
Implements some public methods and some protected utility functions which are required by multiple ch...
getHandler()
Get a MediaHandler instance for this file.
$wgScript
Config variable stub for the Script setting, for use by phpdoc and IDEs.
$wgInternalServer
Config variable stub for the InternalServer setting, for use by phpdoc and IDEs.
$wgThumbLimits
Config variable stub for the ThumbLimits setting, for use by phpdoc and IDEs.
$wgDebugLogPrefix
Config variable stub for the DebugLogPrefix setting, for use by phpdoc and IDEs.
$wgPhpCli
Config variable stub for the PhpCli setting, for use by phpdoc and IDEs.
$wgOverrideHostname
Config variable stub for the OverrideHostname setting, for use by phpdoc and IDEs.
$wgImageLimits
Config variable stub for the ImageLimits setting, for use by phpdoc and IDEs.
$wgTmpDirectory
Config variable stub for the TmpDirectory setting, for use by phpdoc and IDEs.
$wgStyleDirectory
Config variable stub for the StyleDirectory setting, for use by phpdoc and IDEs.
$wgTransactionalTimeLimit
Config variable stub for the TransactionalTimeLimit setting, for use by phpdoc and IDEs.
$wgIllegalFileChars
Config variable stub for the IllegalFileChars setting, for use by phpdoc and IDEs.
$wgDirectoryMode
Config variable stub for the DirectoryMode setting, for use by phpdoc and IDEs.
$wgDiff3
Config variable stub for the Diff3 setting, for use by phpdoc and IDEs.
$wgUrlProtocols
Config variable stub for the UrlProtocols setting, for use by phpdoc and IDEs.
$wgResponsiveImages
Config variable stub for the ResponsiveImages setting, for use by phpdoc and IDEs.
$wgDebugRawPage
Config variable stub for the DebugRawPage setting, for use by phpdoc and IDEs.
$wgEnableMagicLinks
Config variable stub for the EnableMagicLinks setting, for use by phpdoc and IDEs.
$wgScriptPath
Config variable stub for the ScriptPath setting, for use by phpdoc and IDEs.
$wgExtensionDirectory
Config variable stub for the ExtensionDirectory setting, for use by phpdoc and IDEs.
$wgLoadScript
Config variable stub for the LoadScript setting, for use by phpdoc and IDEs.
$wgCanonicalServer
Config variable stub for the CanonicalServer setting, for use by phpdoc and IDEs.
$wgServer
Config variable stub for the Server setting, for use by phpdoc and IDEs.
$wgHttpsPort
Config variable stub for the HttpsPort setting, for use by phpdoc and IDEs.