Merging Vector's navigation_urls and SkinTemplate's content_actions code into content...
[lhc/web/wiklou.git] / includes / GlobalFunctions.php
index 79ecb12..d636b44 100644 (file)
@@ -297,7 +297,6 @@ function wfUrlencode( $s ) {
 function wfDebug( $text, $logonly = false ) {
        global $wgOut, $wgDebugLogFile, $wgDebugComments, $wgProfileOnly, $wgDebugRawPage;
        global $wgDebugLogPrefix, $wgShowDebug;
-       static $recursion = 0;
 
        static $cache = array(); // Cache of unoutputted messages
        $text = wfDebugTimer() . $text;
@@ -310,21 +309,11 @@ function wfDebug( $text, $logonly = false ) {
        if ( ( $wgDebugComments || $wgShowDebug ) && !$logonly ) {
                $cache[] = $text;
 
-               if ( !isset( $wgOut ) ) {
-                       return;
-               }
-               if ( !StubObject::isRealObject( $wgOut ) ) {
-                       if ( $recursion ) {
-                               return;
-                       }
-                       $recursion++;
-                       $wgOut->_unstub();
-                       $recursion--;
+               if ( isset( $wgOut ) && StubObject::isRealObject( $wgOut ) ) {
+                       // add the message and any cached messages to the output
+                       array_map( array( $wgOut, 'debug' ), $cache );
+                       $cache = array();
                }
-
-               // add the message and possible cached ones to the output
-               array_map( array( $wgOut, 'debug' ), $cache );
-               $cache = array();
        }
        if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
                # Strip unprintables; they can switch terminal modes when binary data
@@ -606,6 +595,26 @@ function wfMessage( $key /*...*/) {
        return new Message( $key, $params );
 }
 
+/**
+ * This function accepts multiple message keys and returns a message instance
+ * for the first message which is non-empty. If all messages are empty then an
+ * instance of the first message key is returned.
+ * Varargs: message keys
+ * @return \type{Message}
+ * @since 1.18
+ */
+function wfMessageFallback( /*...*/ ) {
+       $keys = func_get_args();
+       $first = $keys[0];
+       foreach ( $keys as $key ) {
+               if ( wfEmptyMsg( $key ) ) {
+                       continue;
+               }
+               return wfMessage( $key );
+       }
+       return wfMessage( $first );
+}
+
 /**
  * Get a message from anywhere, for the current user language.
  *
@@ -1298,10 +1307,11 @@ function wfTime() {
 /**
  * Sets dest to source and returns the original value of dest
  * If source is NULL, it just returns the value, it doesn't set the variable
+ * If force is true, it will set the value even if source is NULL
  */
-function wfSetVar( &$dest, $source ) {
+function wfSetVar( &$dest, $source, $force = false ) {
        $temp = $dest;
-       if ( !is_null( $source ) ) {
+       if ( !is_null( $source ) || $force ) {
                $dest = $source;
        }
        return $temp;
@@ -1453,8 +1463,12 @@ function wfEscapeShellArg( ) {
                }
 
                if ( wfIsWindows() ) {
-                       // Escaping for an MSVC-style command line parser
-                       // Ref: http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
+                       // Escaping for an MSVC-style command line parser and CMD.EXE
+                       // Refs:
+                       //  * http://web.archive.org/web/20020708081031/http://mailman.lyra.org/pipermail/scite-interest/2002-March/000436.html
+                       //  * http://technet.microsoft.com/en-us/library/cc723564.aspx
+                       //  * Bug #13518
+                       //  * CR r63214
                        // Double the backslashes before any double quotes. Escape the double quotes.
                        $tokens = preg_split( '/(\\\\*")/', $arg, -1, PREG_SPLIT_DELIM_CAPTURE );
                        $arg = '';
@@ -1955,7 +1969,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
        $da = array();
        $strtime = '';
 
-       if ( $ts === 0 ) {
+       if ( !$ts ) { // We want to catch 0, '', null... but not date strings starting with a letter.
                $uts = time();
                $strtime = "@$uts";
        } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
@@ -1986,7 +2000,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
                                                        '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .  # dd Mon yyyy
                                                        '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss
                # TS_RFC2822, accepting a trailing comment. See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
-               # The regex is a superset of rfc2822 for readability 
+               # The regex is a superset of rfc2822 for readability
                $strtime = strtok( $ts, ';' );
        } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
                # TS_RFC850
@@ -1995,9 +2009,9 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
                # asctime
                $strtime = $ts;
        } else {
-               # Bogus value; fall back to the epoch...
-               wfDebug("wfTimestamp() fed bogus time value: $outputtype; $ts\n");
-               
+               # Bogus value...
+               wfDebug("wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts\n");
+
                return false;
        }
 
@@ -2032,12 +2046,12 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
                } else {
                        return false;
                }
-               
+
                if ( !$d ) {
                        wfDebug("wfTimestamp() fed bogus time value: $outputtype; $ts\n");
                        return false;
                }
-               
+
                $output = $d->format( $formats[$outputtype] );
        } else {
                if ( count( $da ) ) {
@@ -2518,7 +2532,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array() ) {
                         * Note however that the quote isn't listed there, but is needed, and the parentheses
                         * are listed there but doesn't appear to need it.
                         */
-                       $envcmd .= "set $k=" . preg_replace( '/([&|()<>^"])/', '^\\1', $v ) . ' && ';
+                       $envcmd .= "set $k=" . preg_replace( '/([&|()<>^"])/', '^\\1', $v ) . '&& ';
                } else {
                        /* Assume this is a POSIX shell, thus required to accept variable assignments before the command
                         * http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_09_01
@@ -3160,6 +3174,7 @@ function wfGetLB( $wiki = false ) {
 
 /**
  * Get the load balancer factory object
+ * @return LBFactory
  */
 function &wfGetLBFactory() {
        return LBFactory::singleton();
@@ -3381,8 +3396,8 @@ function wfWaitForSlaves( $maxLag, $wiki = false ) {
 }
 
 /**
- * Output some plain text in command-line mode or in the installer (updaters.inc).
- * Do not use it in any other context, its behaviour is subject to change.
+ * Used to be used for outputting text in the installer/updater
+ * @deprecated Warnings in 1.19, removal in 1.20
  */
 function wfOut( $s ) {
        global $wgCommandLineMode;