X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FGlobalFunctions.php;h=141bef85520a143a944e395c8862d6d3bab78f3d;hb=750b3928d6a885fdc01a3bd2da9025a3110707ef;hp=6ce6271591731931cb4163753abcdd39b1e02a0d;hpb=5cca2119e34c87c5e6b9da454e8aa2ff43c5f123;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 6ce6271591..141bef8552 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -311,6 +311,243 @@ function wfUrlencode( $s ) { return $s; } +/** + * This function takes two arrays as input, and returns a CGI-style string, e.g. + * "days=7&limit=100". Options in the first array override options in the second. + * Options set to "" will not be output. + * + * @param $array1 Array( String|Array ) + * @param $array2 Array( String|Array ) + * @return String + */ +function wfArrayToCGI( $array1, $array2 = null ) { + if ( !is_null( $array2 ) ) { + $array1 = $array1 + $array2; + } + + $cgi = ''; + foreach ( $array1 as $key => $value ) { + if ( $value !== '' ) { + if ( $cgi != '' ) { + $cgi .= '&'; + } + if ( is_array( $value ) ) { + $firstTime = true; + foreach ( $value as $v ) { + $cgi .= ( $firstTime ? '' : '&') . + urlencode( $key . '[]' ) . '=' . + urlencode( $v ); + $firstTime = false; + } + } else { + if ( is_object( $value ) ) { + $value = $value->__toString(); + } + $cgi .= urlencode( $key ) . '=' . + urlencode( $value ); + } + } + } + return $cgi; +} + +/** + * This is the logical opposite of wfArrayToCGI(): it accepts a query string as + * its argument and returns the same string in array form. This allows compa- + * tibility with legacy functions that accept raw query strings instead of nice + * arrays. Of course, keys and values are urldecode()d. Don't try passing in- + * valid query strings, or it will explode. + * + * @param $query String: query string + * @return array Array version of input + */ +function wfCgiToArray( $query ) { + if( isset( $query[0] ) && $query[0] == '?' ) { + $query = substr( $query, 1 ); + } + $bits = explode( '&', $query ); + $ret = array(); + foreach( $bits as $bit ) { + if( $bit === '' ) { + continue; + } + list( $key, $value ) = explode( '=', $bit ); + $key = urldecode( $key ); + $value = urldecode( $value ); + $ret[$key] = $value; + } + return $ret; +} + +/** + * Append a query string to an existing URL, which may or may not already + * have query string parameters already. If so, they will be combined. + * + * @param $url String + * @param $query Mixed: string or associative array + * @return string + */ +function wfAppendQuery( $url, $query ) { + if ( is_array( $query ) ) { + $query = wfArrayToCGI( $query ); + } + if( $query != '' ) { + if( false === strpos( $url, '?' ) ) { + $url .= '?'; + } else { + $url .= '&'; + } + $url .= $query; + } + return $url; +} + +/** + * Expand a potentially local URL to a fully-qualified URL. Assumes $wgServer + * is correct. + * + * @todo this won't work with current-path-relative URLs + * like "subdir/foo.html", etc. + * + * @param $url String: either fully-qualified or a local path + query + * @return string Fully-qualified URL + */ +function wfExpandUrl( $url ) { + global $wgServer; + if( substr( $url, 0, 2 ) == '//' ) { + $bits = wfParseUrl( $wgServer ); + $scheme = $bits ? $bits['scheme'] : 'http'; + return $scheme . ':' . $url; + } elseif( substr( $url, 0, 1 ) == '/' ) { + return $wgServer . $url; + } else { + return $url; + } +} + +/** + * Returns a regular expression of url protocols + * + * @return String + */ +function wfUrlProtocols() { + global $wgUrlProtocols; + + static $retval = null; + if ( !is_null( $retval ) ) { + return $retval; + } + + // Support old-style $wgUrlProtocols strings, for backwards compatibility + // with LocalSettings files from 1.5 + if ( is_array( $wgUrlProtocols ) ) { + $protocols = array(); + foreach ( $wgUrlProtocols as $protocol ) { + $protocols[] = preg_quote( $protocol, '/' ); + } + + $retval = implode( '|', $protocols ); + } else { + $retval = $wgUrlProtocols; + } + return $retval; +} + +/** + * parse_url() work-alike, but non-broken. Differences: + * + * 1) Does not raise warnings on bad URLs (just returns false) + * 2) Handles protocols that don't use :// (e.g., mailto: and news:) correctly + * 3) Adds a "delimiter" element to the array, either '://' or ':' (see (2)) + * + * @param $url String: a URL to parse + * @return Array: bits of the URL in an associative array, per PHP docs + */ +function wfParseUrl( $url ) { + global $wgUrlProtocols; // Allow all protocols defined in DefaultSettings/LocalSettings.php + wfSuppressWarnings(); + $bits = parse_url( $url ); + wfRestoreWarnings(); + if ( !$bits ) { + return false; + } + + // most of the protocols are followed by ://, but mailto: and sometimes news: not, check for it + if ( in_array( $bits['scheme'] . '://', $wgUrlProtocols ) ) { + $bits['delimiter'] = '://'; + } elseif ( in_array( $bits['scheme'] . ':', $wgUrlProtocols ) ) { + $bits['delimiter'] = ':'; + // parse_url detects for news: and mailto: the host part of an url as path + // We have to correct this wrong detection + if ( isset( $bits['path'] ) ) { + $bits['host'] = $bits['path']; + $bits['path'] = ''; + } + } else { + return false; + } + + /* Provide an empty host for eg. file:/// urls (see bug 28627) */ + if ( !isset( $bits['host'] ) ) { + $bits['host'] = ''; + + /* parse_url loses the third / for file:///c:/ urls (but not on variants) */ + if ( substr( $bits['path'], 0, 1 ) !== '/' ) { + $bits['path'] = '/' . $bits['path']; + } + } + return $bits; +} + +/** + * Make a URL index, appropriate for the el_index field of externallinks. + * + * @param $url String + * @return String + */ +function wfMakeUrlIndex( $url ) { + $bits = wfParseUrl( $url ); + + // Reverse the labels in the hostname, convert to lower case + // For emails reverse domainpart only + if ( $bits['scheme'] == 'mailto' ) { + $mailparts = explode( '@', $bits['host'], 2 ); + if ( count( $mailparts ) === 2 ) { + $domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) ); + } else { + // No domain specified, don't mangle it + $domainpart = ''; + } + $reversedHost = $domainpart . '@' . $mailparts[0]; + } else { + $reversedHost = strtolower( implode( '.', array_reverse( explode( '.', $bits['host'] ) ) ) ); + } + // Add an extra dot to the end + // Why? Is it in wrong place in mailto links? + if ( substr( $reversedHost, -1, 1 ) !== '.' ) { + $reversedHost .= '.'; + } + // Reconstruct the pseudo-URL + $prot = $bits['scheme']; + $index = $prot . $bits['delimiter'] . $reversedHost; + // Leave out user and password. Add the port, path, query and fragment + if ( isset( $bits['port'] ) ) { + $index .= ':' . $bits['port']; + } + if ( isset( $bits['path'] ) ) { + $index .= $bits['path']; + } else { + $index .= '/'; + } + if ( isset( $bits['query'] ) ) { + $index .= '?' . $bits['query']; + } + if ( isset( $bits['fragment'] ) ) { + $index .= '#' . $bits['fragment']; + } + return $index; +} + /** * Sends a line to the debug log if enabled or, optionally, to a comment in output. * In normal operation this is a NOP. @@ -705,9 +942,12 @@ function wfMessageFallback( /*...*/ ) { * @param $key String: lookup key for the message, usually * defined in languages/Language.php * - * This function also takes extra optional parameters (not - * shown in the function definition), which can be used to - * insert variable text into the predefined message. + * Parameters to the message, which can be used to insert variable text into + * it, can be passed to this function in the following formats: + * - One per argument, starting at the second parameter + * - As an array in the second parameter + * These are not shown in the function definition. + * * @return String */ function wfMsg( $key ) { @@ -783,38 +1023,6 @@ function wfMsgForContentNoTrans( $key ) { return wfMsgReal( $key, $args, true, $forcontent, false ); } -/** - * Get a message from the language file, for the UI elements - * - * @deprecated since 1.18; use wfMessage() - */ -function wfMsgNoDB( $key ) { - wfDeprecated( __FUNCTION__ ); - $args = func_get_args(); - array_shift( $args ); - return wfMsgReal( $key, $args, false ); -} - -/** - * Get a message from the language file, for the content - * - * @deprecated since 1.18; use wfMessage() - */ -function wfMsgNoDBForContent( $key ) { - wfDeprecated( __FUNCTION__ ); - global $wgForceUIMsgAsContentMsg; - $args = func_get_args(); - array_shift( $args ); - $forcontent = true; - if( is_array( $wgForceUIMsgAsContentMsg ) && - in_array( $key, $wgForceUIMsgAsContentMsg ) ) - { - $forcontent = false; - } - return wfMsgReal( $key, $args, false, $forcontent ); -} - - /** * Really get a message * @@ -833,22 +1041,6 @@ function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform return $message; } -/** - * This function provides the message source for messages to be edited which are *not* stored in the database. - * - * @deprecated since 1.18; use wfMessage() - * @param $key String - */ -function wfMsgWeirdKey( $key ) { - wfDeprecated( __FUNCTION__ ); - $source = wfMsgGetKey( $key, false, true, false ); - if ( wfEmptyMsg( $key ) ) { - return ''; - } else { - return $source; - } -} - /** * Fetch a message string value, but don't replace any keys yet. * @@ -1072,7 +1264,7 @@ function wfHostname() { if ( is_null( $host ) ) { if ( function_exists( 'posix_uname' ) ) { // This function not present on Windows - $uname = @posix_uname(); + $uname = posix_uname(); } else { $uname = false; } @@ -1119,7 +1311,7 @@ function wfReportTime() { * * @return array of backtrace information */ -function wfDebugBacktrace() { +function wfDebugBacktrace( $limit = 0 ) { static $disabled = null; if( extension_loaded( 'Zend Optimizer' ) ) { @@ -1141,7 +1333,11 @@ function wfDebugBacktrace() { return array(); } - return array_slice( debug_backtrace(), 1 ); + if ( $limit && version_compare( PHP_VERSION, '5.4.0', '>=' ) ) { + return array_slice( debug_backtrace( DEBUG_BACKTRACE_PROVIDE_OBJECT, 1 ), 1 ); + } else { + return array_slice( debug_backtrace(), 1 ); + } } /** @@ -1176,7 +1372,7 @@ function wfBacktrace() { $msg .= '
  • ' . $file . ' line ' . $line . ' calls '; } if( !empty( $call['class'] ) ) { - $msg .= $call['class'] . '::'; + $msg .= $call['class'] . $call['type']; } $msg .= $call['function'] . '()'; @@ -1202,7 +1398,7 @@ function wfBacktrace() { * @return Bool|string */ function wfGetCaller( $level = 2 ) { - $backtrace = wfDebugBacktrace(); + $backtrace = wfDebugBacktrace( $level ); if ( isset( $backtrace[$level] ) ) { return wfFormatStackFrame( $backtrace[$level] ); } else { @@ -1477,119 +1673,6 @@ function wfSetBit( &$dest, $bit, $state = true ) { return $temp; } -/** - * This function takes two arrays as input, and returns a CGI-style string, e.g. - * "days=7&limit=100". Options in the first array override options in the second. - * Options set to "" will not be output. - * - * @param $array1 Array( String|Array ) - * @param $array2 Array( String|Array ) - * @return String - */ -function wfArrayToCGI( $array1, $array2 = null ) { - if ( !is_null( $array2 ) ) { - $array1 = $array1 + $array2; - } - - $cgi = ''; - foreach ( $array1 as $key => $value ) { - if ( $value !== '' ) { - if ( $cgi != '' ) { - $cgi .= '&'; - } - if ( is_array( $value ) ) { - $firstTime = true; - foreach ( $value as $v ) { - $cgi .= ( $firstTime ? '' : '&') . - urlencode( $key . '[]' ) . '=' . - urlencode( $v ); - $firstTime = false; - } - } else { - if ( is_object( $value ) ) { - $value = $value->__toString(); - } - $cgi .= urlencode( $key ) . '=' . - urlencode( $value ); - } - } - } - return $cgi; -} - -/** - * This is the logical opposite of wfArrayToCGI(): it accepts a query string as - * its argument and returns the same string in array form. This allows compa- - * tibility with legacy functions that accept raw query strings instead of nice - * arrays. Of course, keys and values are urldecode()d. Don't try passing in- - * valid query strings, or it will explode. - * - * @param $query String: query string - * @return array Array version of input - */ -function wfCgiToArray( $query ) { - if( isset( $query[0] ) && $query[0] == '?' ) { - $query = substr( $query, 1 ); - } - $bits = explode( '&', $query ); - $ret = array(); - foreach( $bits as $bit ) { - if( $bit === '' ) { - continue; - } - list( $key, $value ) = explode( '=', $bit ); - $key = urldecode( $key ); - $value = urldecode( $value ); - $ret[$key] = $value; - } - return $ret; -} - -/** - * Append a query string to an existing URL, which may or may not already - * have query string parameters already. If so, they will be combined. - * - * @param $url String - * @param $query Mixed: string or associative array - * @return string - */ -function wfAppendQuery( $url, $query ) { - if ( is_array( $query ) ) { - $query = wfArrayToCGI( $query ); - } - if( $query != '' ) { - if( false === strpos( $url, '?' ) ) { - $url .= '?'; - } else { - $url .= '&'; - } - $url .= $query; - } - return $url; -} - -/** - * Expand a potentially local URL to a fully-qualified URL. Assumes $wgServer - * and $wgProto are correct. - * - * @todo this won't work with current-path-relative URLs - * like "subdir/foo.html", etc. - * - * @param $url String: either fully-qualified or a local path + query - * @return string Fully-qualified URL - */ -function wfExpandUrl( $url ) { - if( substr( $url, 0, 2 ) == '//' ) { - global $wgProto; - return $wgProto . ':' . $url; - } elseif( substr( $url, 0, 1 ) == '/' ) { - global $wgServer; - return $wgServer . $url; - } else { - return $url; - } -} - /** * Windows-compatible version of escapeshellarg() * Windows doesn't recognise single-quotes in the shell, but the escapeshellarg() @@ -1810,7 +1893,7 @@ function wfDiff( $before, $after, $params = '-u' ) { function wfVarDump( $var ) { global $wgOut; $s = str_replace( "\n", "
    \n", var_export( $var, true ) . "\n" ); - if ( headers_sent() || !@is_object( $wgOut ) ) { + if ( headers_sent() || !isset( $wgOut ) || !is_object( $wgOut ) ) { print $s; } else { $wgOut->addHTML( $s ); @@ -1933,12 +2016,12 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) { foreach( $parts as $part ) { # @todo FIXME: Doesn't deal with params like 'text/html; level=1' - @list( $value, $qpart ) = explode( ';', trim( $part ) ); + $values = explode( ';', trim( $part ) ); $match = array(); - if( !isset( $qpart ) ) { - $prefs[$value] = 1.0; - } elseif( preg_match( '/q\s*=\s*(\d*\.\d+)/', $qpart, $match ) ) { - $prefs[$value] = floatval( $match[1] ); + if ( count( $values ) == 1 ) { + $prefs[$values[0]] = 1.0; + } elseif ( preg_match( '/q\s*=\s*(\d*\.\d+)/', $values[1], $match ) ) { + $prefs[$values[0]] = floatval( $match[1] ); } } @@ -2174,8 +2257,6 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) { return false; } - - static $formats = array( TS_UNIX => 'U', TS_MW => 'YmdHis', @@ -2446,34 +2527,6 @@ function wfSpecialList( $page, $details ) { return $page . $details; } -/** - * Returns a regular expression of url protocols - * - * @return String - */ -function wfUrlProtocols() { - global $wgUrlProtocols; - - static $retval = null; - if ( !is_null( $retval ) ) { - return $retval; - } - - // Support old-style $wgUrlProtocols strings, for backwards compatibility - // with LocalSettings files from 1.5 - if ( is_array( $wgUrlProtocols ) ) { - $protocols = array(); - foreach ( $wgUrlProtocols as $protocol ) { - $protocols[] = preg_quote( $protocol, '/' ); - } - - $retval = implode( '|', $protocols ); - } else { - $retval = $wgUrlProtocols; - } - return $retval; -} - /** * Safety wrapper around ini_get() for boolean settings. * The values returned from ini_get() are pre-normalized for settings @@ -2763,103 +2816,6 @@ function wfRelativePath( $path, $from ) { return implode( DIRECTORY_SEPARATOR, $pieces ); } -/** - * parse_url() work-alike, but non-broken. Differences: - * - * 1) Does not raise warnings on bad URLs (just returns false) - * 2) Handles protocols that don't use :// (e.g., mailto: and news:) correctly - * 3) Adds a "delimiter" element to the array, either '://' or ':' (see (2)) - * - * @param $url String: a URL to parse - * @return Array: bits of the URL in an associative array, per PHP docs - */ -function wfParseUrl( $url ) { - global $wgUrlProtocols; // Allow all protocols defined in DefaultSettings/LocalSettings.php - wfSuppressWarnings(); - $bits = parse_url( $url ); - wfRestoreWarnings(); - if ( !$bits ) { - return false; - } - - // most of the protocols are followed by ://, but mailto: and sometimes news: not, check for it - if ( in_array( $bits['scheme'] . '://', $wgUrlProtocols ) ) { - $bits['delimiter'] = '://'; - } elseif ( in_array( $bits['scheme'] . ':', $wgUrlProtocols ) ) { - $bits['delimiter'] = ':'; - // parse_url detects for news: and mailto: the host part of an url as path - // We have to correct this wrong detection - if ( isset( $bits['path'] ) ) { - $bits['host'] = $bits['path']; - $bits['path'] = ''; - } - } else { - return false; - } - - return $bits; -} - -/** - * Make a URL index, appropriate for the el_index field of externallinks. - * - * @param $url String - * @return String - */ -function wfMakeUrlIndex( $url ) { - $bits = wfParseUrl( $url ); - - // Reverse the labels in the hostname, convert to lower case - // For emails reverse domainpart only - if ( $bits['scheme'] == 'mailto' ) { - $mailparts = explode( '@', $bits['host'], 2 ); - if ( count( $mailparts ) === 2 ) { - $domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) ); - } else { - // No domain specified, don't mangle it - $domainpart = ''; - } - $reversedHost = $domainpart . '@' . $mailparts[0]; - } else if ( isset( $bits['host'] ) ) { - $reversedHost = strtolower( implode( '.', array_reverse( explode( '.', $bits['host'] ) ) ) ); - } else { - // In file: URIs for instance it's common to have an empty host, - // which turns up as not getting a 'host' member from parse_url. - $reversedHost = '.'; - } - // Add an extra dot to the end - // Why? Is it in wrong place in mailto links? - if ( substr( $reversedHost, -1, 1 ) !== '.' ) { - $reversedHost .= '.'; - } - // Reconstruct the pseudo-URL - $prot = $bits['scheme']; - $index = $prot . $bits['delimiter'] . $reversedHost; - // Leave out user and password. Add the port, path, query and fragment - if ( isset( $bits['port'] ) ) { - $index .= ':' . $bits['port']; - } - if ( isset( $bits['path'] ) ) { - // parse_url() removes the initial '/' from the path - // for file: URLs with Windows-style paths, such as - // file:///c:/windows/stuff. We need to add it back - // to keep our division between host and path properly. - if ( strlen( $bits['path'] ) > 0 && substr( $bits['path'], 0, 1 ) !== '/' ) { - $index .= '/'; - } - $index .= $bits['path']; - } else { - $index .= '/'; - } - if ( isset( $bits['query'] ) ) { - $index .= '?' . $bits['query']; - } - if ( isset( $bits['fragment'] ) ) { - $index .= '#' . $bits['fragment']; - } - return $index; -} - /** * Do any deferred updates and clear the list * @@ -3526,7 +3482,7 @@ function wfBCP47( $code ) { /** * Get a cache object. * - * @param integer $inputType Cache type, one the the CACHE_* constants. + * @param $inputType integer Cache type, one the the CACHE_* constants. * @return BagOStuff */ function wfGetCache( $inputType ) {