Fix for compatibility with short_open_tag = Off
[lhc/web/wiklou.git] / includes / GlobalFunctions.php
index 63ad667..c9cbe1b 100644 (file)
@@ -1,4 +1,4 @@
-<?
+<?php
 # Global functions used everywhere
 
 $wgNumberOfArticles = -1; # Unset
@@ -64,8 +64,10 @@ function wfLocalUrl( $a, $q = "" )
                }       
        } else if ( "" == $q ) {
                $a = str_replace( "$1", $a, $wgArticlePath );
-       } else {
+       } else if ($wgScript != '' ) {
                $a = "{$wgScript}?title={$a}&{$q}";     
+       } else { //XXX ugly hack for toplevel wikis
+               $a = "/{$a}&{$q}";      
        }
        return $a;
 }
@@ -99,6 +101,47 @@ function wfImageUrl( $img )
        return wfUrlencode( $url );
 }
 
+function wfImagePath( $img )
+{
+       global $wgUploadDirectory;
+
+       $nt = Title::newFromText( $img );
+       if( !$nt ) return "";
+
+       $name = $nt->getDBkey();
+       $hash = md5( $name );
+
+       $path = "{$wgUploadDirectory}/" . $hash{0} . "/" .
+         substr( $hash, 0, 2 ) . "/{$name}";
+       return $path;
+}
+
+function wfThumbUrl( $img )
+{
+       global $wgUploadPath;
+
+       $nt = Title::newFromText( $img );
+       if( !$nt ) return "";
+
+       $name = $nt->getDBkey();
+       $hash = md5( $name );
+
+       $url = "{$wgUploadPath}/thumb/" . $hash{0} . "/" .
+         substr( $hash, 0, 2 ) . "/{$name}";
+       return wfUrlencode( $url );
+}
+
+
+function wfImageThumbUrl( $name, $subdir="thumb" )
+{
+       global $wgUploadPath;
+
+       $hash = md5( $name );
+       $url = "{$wgUploadPath}/{$subdir}/" . $hash{0} . "/" .
+         substr( $hash, 0, 2 ) . "/{$name}";
+       return wfUrlencode($url);
+}
+
 function wfImageArchiveUrl( $name )
 {
        global $wgUploadPath;
@@ -106,7 +149,7 @@ function wfImageArchiveUrl( $name )
        $hash = md5( substr( $name, 15) );
        $url = "{$wgUploadPath}/archive/" . $hash{0} . "/" .
          substr( $hash, 0, 2 ) . "/{$name}";
-       return $url;
+       return wfUrlencode($url);
 }
 
 function wfUrlencode ( $s )
@@ -304,7 +347,7 @@ function wfSpecialPage()
        $sysopSP = $wgLang->getSysopSpecialPages();
        $devSP = $wgLang->getDeveloperSpecialPages();
 
-       $wgOut->setArticleFlag( false );
+       $wgOut->setArticleRelated( false );
        $wgOut->setRobotpolicy( "noindex,follow" );
 
        $par = NULL;
@@ -429,13 +472,18 @@ function wfImageDir( $fname )
        return $dest;
 }
 
-function wfImageArchiveDir( $fname )
+function wfImageThumbDir( $fname , $subdir="thumb")
+{
+       return wfImageArchiveDir( $fname, $subdir );
+}
+
+function wfImageArchiveDir( $fname , $subdir="archive")
 {
        global $wgUploadDirectory;
 
        $hash = md5( $fname );
        $oldumask = umask(0);
-       $archive = "{$wgUploadDirectory}/archive";
+       $archive = "{$wgUploadDirectory}/{$subdir}";
        if ( ! is_dir( $archive ) ) { mkdir( $archive, 0777 ); }
        $archive .= "/" . $hash{0};
        if ( ! is_dir( $archive ) ) { mkdir( $archive, 0777 ); }
@@ -552,7 +600,7 @@ function wfShowingResultsNum( $offset, $limit, $num )
        return wfMsg( "showingresultsnum", $limit, $offset+1, $num );
 }
 
-function wfViewPrevNext( $offset, $limit, $link, $query = "" )
+function wfViewPrevNext( $offset, $limit, $link, $query = "", $atend = false )
 {
        global $wgUser;
        $prev = wfMsg( "prevn", $limit );
@@ -571,7 +619,11 @@ function wfViewPrevNext( $offset, $limit, $link, $query = "" )
        $q = "limit={$limit}&offset={$no}";
        if ( "" != $query ) { $q .= "&{$query}"; }
 
-       $nlink = "<a href=\"" . wfLocalUrlE( $link, $q ) . "\">{$next}</a>";
+       if ( $atend ) {
+               $nlink = $next;
+       } else {
+               $nlink = "<a href=\"" . wfLocalUrlE( $link, $q ) . "\">{$next}</a>";
+       }
        $nums = wfNumLink( $offset, 20, $link , $query ) . " | " .
          wfNumLink( $offset, 50, $link, $query ) . " | " .
          wfNumLink( $offset, 100, $link, $query ) . " | " .
@@ -683,4 +735,104 @@ function &wfSetRef( &$dest, $source )
        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.
+function wfArrayToCGI( $array1, $array2 = NULL ) 
+{
+       if ( !is_null( $array2 ) ) {
+               $array1 = $array1 + $array2;
+       }
+
+       $cgi = "";
+       foreach ( $array1 as $key => $value ) {
+               if ( "" !== $value ) {
+                       if ( "" != $cgi ) {
+                               $cgi .= "&";
+                       }
+                       $cgi .= "{$key}={$value}";
+               }
+       }
+       return $cgi;
+}
+
+/* Purges a list of Squids defined in $wgSquidServers.
+$urlArr should contain the full URLs to purge as values 
+(example: $urlArr[] = 'http://my.host/something')
+XXX report broken Squids per mail or log */
+
+function wfPurgeSquidServers ($urlArr) {
+    global  $wgSquidServers;
+    $maxsocketspersquid = 8; //  socket cap per Squid
+    $urlspersocket = 400; // 400 seems to be a good tradeoff, opening a socket takes a while
+    $sockspersq =  ceil(count($urlArr) / $urlspersocket );
+    if ($sockspersq == 1) {
+       /* the most common case */
+        $urlspersocket = count($urlArr);
+    } else if ($sockspersq > $maxsocketspersquid ) {
+       $urlspersocket = ceil(count($urlArr) / $maxsocketspersquid);
+       $sockspersq = $maxsocketspersquid;
+    }
+    $totalsockets = count($wgSquidServers) * $sockspersq;
+    $sockets = Array();
+    
+    /* this sets up the sockets and tests the first socket for each server. */
+    for ($ss=0;$ss < count($wgSquidServers);$ss++) {
+        $failed = false;
+        $so = 0;
+        while ($so < $sockspersq && !$failed) {
+            if ($so == 0) {
+               /* first socket for this server, do the tests */
+                $socket = @fsockopen($wgSquidServers[$ss], 80, $error, $errstr, 3);
+                if (!$socket) {
+                    $failed = true;
+                    $totalsockets -= $sockspersq;
+                } else {
+                    @fputs($socket,"PURGE " . $urlArr[0] . " HTTP/1.0\r\n".
+                    "Connection: Keep-Alive\r\n\r\n");
+                   $res = @fread($socket,512);
+                   /* Squid only returns http headers with 200 or 404 status, 
+                   if there's more returned something's wrong */
+                   if (strlen($res) > 250) {
+                        fclose($socket);
+                        $failed = true;
+                        $totalsockets -= $sockspersq;
+                    } else {
+                        @stream_set_blocking($socket,false);
+                        $sockets[] = $socket;
+                    }
+                } 
+            } else {
+               /* open the remaining sockets for this server */
+                $sockets[] = @fsockopen($wgSquidServers[$ss], 80, $error, $errstr, 2);
+                @stream_set_blocking($sockets[$s],false);
+            }
+            $so++;
+        }
+    }
+    
+    if ($urlspersocket > 1) {
+        /* now do the heavy lifting. The fread() relies on Squid returning only the headers */
+        for ($r=0;$r < $urlspersocket;$r++) {
+            for ($s=0;$s < $totalsockets;$s++) {
+               if($r != 0) {
+                   $res = '';
+                   $esc = 0;
+                   while (strlen($res) < 100 && $esc < 20  ) {
+                       $res .= @fread($sockets[$s],512);
+                       $esc++;
+                   }
+               }
+                $urindex = $r + $urlspersocket * ($s - $sockspersq * floor($s / $sockspersq));
+                @fputs($sockets[$s],"PURGE " . $urlArr[$urindex] . " HTTP/1.0\r\n".
+                "Connection: Keep-Alive\r\n\r\n");
+            }
+        }
+    }
+
+    foreach ($sockets as $socket) {
+        @fclose($sockets);
+    }
+    return;
+}
 ?>