getDBkey(); $hash = md5( $name ); $url = "{$wgUploadPath}/" . $hash{0} . "/" . substr( $hash, 0, 2 ) . "/{$name}"; 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; $hash = md5( substr( $name, 15) ); $url = "{$wgUploadPath}/archive/" . $hash{0} . "/" . substr( $hash, 0, 2 ) . "/{$name}"; return wfUrlencode($url); } function wfUrlencode ( $s ) { $s = urlencode( $s ); $s = preg_replace( "/%3[Aa]/", ":", $s ); $s = preg_replace( "/%2[Ff]/", "/", $s ); return $s; } function wfUtf8Sequence($codepoint) { if($codepoint < 0x80) return chr($codepoint); if($codepoint < 0x800) return chr($codepoint >> 6 & 0x3f | 0xc0) . chr($codepoint & 0x3f | 0x80); if($codepoint < 0x10000) return chr($codepoint >> 12 & 0x0f | 0xe0) . chr($codepoint >> 6 & 0x3f | 0x80) . chr($codepoint & 0x3f | 0x80); if($codepoint < 0x100000) return chr($codepoint >> 18 & 0x07 | 0xf0) . # Double-check this chr($codepoint >> 12 & 0x3f | 0x80) . chr($codepoint >> 6 & 0x3f | 0x80) . chr($codepoint & 0x3f | 0x80); # Doesn't yet handle outside the BMP return "&#$codepoint;"; } function wfMungeToUtf8($string) { global $wgInputEncoding; # This is debatable #$string = iconv($wgInputEncoding, "UTF-8", $string); $string = preg_replace ( '/&#([0-9]+);/e', 'wfUtf8Sequence($1)', $string ); $string = preg_replace ( '/&#x([0-9a-f]+);/ie', 'wfUtf8Sequence(0x$1)', $string ); # Should also do named entities here return $string; } function wfDebug( $text, $logonly = false ) { global $wgOut, $wgDebugLogFile, $wgDebugComments, $wgProfileOnly; if ( isset( $wgOut ) && $wgDebugComments && !$logonly ) { $wgOut->debug( $text ); } if ( "" != $wgDebugLogFile && !$wgProfileOnly ) { error_log( $text, 3, $wgDebugLogFile ); } } function logProfilingData() { global $wgRequestTime, $wgDebugLogFile; global $wgProfiling, $wgProfileStack, $wgProfileLimit, $wgUser; $now = wfTime(); list( $usec, $sec ) = explode( " ", $wgRequestTime ); $start = (float)$sec + (float)$usec; $elapsed = $now - $start; if ( "" != $wgDebugLogFile ) { $prof = wfGetProfilingOutput( $start, $elapsed ); $forward = ""; if( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) $forward = " forwarded for " . $_SERVER['HTTP_X_FORWARDED_FOR']; if( !empty( $_SERVER['HTTP_CLIENT_IP'] ) ) $forward .= " client IP " . $_SERVER['HTTP_CLIENT_IP']; if( !empty( $_SERVER['HTTP_FROM'] ) ) $forward .= " from " . $_SERVER['HTTP_FROM']; if( $forward ) $forward = "\t(proxied via {$_SERVER['REMOTE_ADDR']}{$forward})"; if($wgUser->getId() == 0) $forward .= " anon"; $log = sprintf( "%s\t%04.3f\t%s\n", gmdate( "YmdHis" ), $elapsed, urldecode( $_SERVER['REQUEST_URI'] . $forward ) ); error_log( $log . $prof, 3, $wgDebugLogFile ); } } function wfReadOnly() { global $wgReadOnlyFile; if ( "" == $wgReadOnlyFile ) { return false; } return is_file( $wgReadOnlyFile ); } $wgReplacementKeys = array( "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9" ); # Get a message from anywhere function wfMsg( $key ) { $args = func_get_args(); if ( count( $args ) ) { array_shift( $args ); } return wfMsgReal( $key, $args, true ); } # Get a message from the language file function wfMsgNoDB( $key ) { $args = func_get_args(); if ( count( $args ) ) { array_shift( $args ); } return wfMsgReal( $key, $args, false ); } # Really get a message function wfMsgReal( $key, $args, $useDB ) { global $wgReplacementKeys, $wgMessageCache, $wgLang; $fname = "wfMsg"; wfProfileIn( $fname ); if ( $wgMessageCache ) { $message = $wgMessageCache->get( $key, $useDB ); } elseif ( $wgLang ) { $message = $wgLang->getMessage( $key ); } else { wfDebug( "No language object when getting $key\n" ); $message = "<$key>"; } # Replace arguments if( count( $args ) ) { $message = str_replace( $wgReplacementKeys, $args, $message ); } wfProfileOut( $fname ); return $message; } function wfCleanFormFields( $fields ) { wfDebugDieBacktrace( "Call to obsolete wfCleanFormFields(). Use wgRequest instead..." ); } function wfMungeQuotes( $in ) { $out = str_replace( "%", "%25", $in ); $out = str_replace( "'", "%27", $out ); $out = str_replace( "\"", "%22", $out ); return $out; } function wfDemungeQuotes( $in ) { $out = str_replace( "%22", "\"", $in ); $out = str_replace( "%27", "'", $out ); $out = str_replace( "%25", "%", $out ); return $out; } function wfCleanQueryVar( $var ) { wfDebugDieBacktrace( "Call to obsolete function wfCleanQueryVar(); use wgRequest instead" ); } function wfSpecialPage() { global $wgUser, $wgOut, $wgTitle, $wgLang; /* FIXME: this list probably shouldn't be language-specific, per se */ $validSP = $wgLang->getValidSpecialPages(); $sysopSP = $wgLang->getSysopSpecialPages(); $devSP = $wgLang->getDeveloperSpecialPages(); $wgOut->setArticleRelated( false ); $wgOut->setRobotpolicy( "noindex,follow" ); $bits = split( "/", $wgTitle->getDBkey(), 2 ); $t = $bits[0]; if( empty( $bits[1] ) ) { $par = NULL; } else { $par = $bits[1]; } if ( array_key_exists( $t, $validSP ) || ( $wgUser->isSysop() && array_key_exists( $t, $sysopSP ) ) || ( $wgUser->isDeveloper() && array_key_exists( $t, $devSP ) ) ) { if($par !== NULL) $wgTitle = Title::makeTitle( Namespace::getSpecial(), $t ); $wgOut->setPageTitle( wfMsg( strtolower( $wgTitle->getText() ) ) ); $inc = "Special" . $t . ".php"; include_once( $inc ); $call = "wfSpecial" . $t; $call( $par ); } else if ( array_key_exists( $t, $sysopSP ) ) { $wgOut->sysopRequired(); } else if ( array_key_exists( $t, $devSP ) ) { $wgOut->developerRequired(); } else { $wgOut->errorpage( "nosuchspecialpage", "nospecialpagetext" ); } } function wfSearch( $s ) { $se = new SearchEngine( $s ); $se->showResults(); } function wfGo( $s ) { # pick the nearest match $se = new SearchEngine( $s ); $se->goResult(); } # Just like exit() but makes a note of it. function wfAbruptExit(){ static $called = false; if ( $called ){ exit(); } $called = true; if( function_exists( "debug_backtrace" ) ){ // PHP >= 4.3 $bt = debug_backtrace(); for($i = 0; $i < count($bt) ; $i++){ $file = $bt[$i]["file"]; $line = $bt[$i]["line"]; wfDebug("WARNING: Abrupt exit in $file at line $line\n"); } } else { wfDebug("WARNING: Abrupt exit\n"); } exit(); } function wfDebugDieBacktrace( $msg = "" ) { $msg .= "\n

Backtrace:

\n