X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSkin.php;h=36752f585b838270b13407792495615da900bfe8;hb=51f738ea9a198d11e78cf030dce54f814fa8bc69;hp=e5638f77c97248c3771ed8f99d67bcde42437760;hpb=7fd73cbe63f95ea4d945656c80485addd8fb491b;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Skin.php b/includes/Skin.php index e5638f77c9..36752f585b 100644 --- a/includes/Skin.php +++ b/includes/Skin.php @@ -1,4 +1,4 @@ -mCategoryLinks ) == 0 ) return "" ; + if ( count ( $wgParser->mCategoryLinks ) == 0 ) return "" ; if ( !$wgOut->isArticle() ) return "" ; $sk = $wgUser->getSkin() ; $s = "" ; $s .= "\n
\n"; $s .= $sk->makeKnownLink ( "Special:Categories" , "Categories" , "article=".$wgTitle->getDBkey() ) ; - $t = implode ( " | " , $wgOut->mCategoryLinks ) ; + $t = implode ( " | " , $wgParser->mCategoryLinks ) ; if ( $t != "" ) $s .= " : " ; $s .= $t ; return $s ; } +class RCCacheEntry extends RecentChange +{ + var $secureName, $link; + var $curlink , $lastlink , $usertalklink , $versionlink ; + var $userlink, $timestamp, $watched; -class RecentChangesClass { - var $secureName , $displayName , $link , $namespace ; - var $oldid , $diffid , $timestamp , $curlink , $lastlink , $usertalklink , $versionlink ; - var $usercomment , $userlink ; - var $isminor , $isnew , $watched , $islog ; - } ; + function newFromParent( $rc ) + { + $rc2 = new RCCacheEntry; + $rc2->mAttribs = $rc->mAttribs; + $rc2->mExtra = $rc->mExtra; + return $rc2; + } +} ; class Skin { /* private */ var $lastdate, $lastline; - + var $linktrail ; # linktrail regexp var $rc_cache ; # Cache for Enhanced Recent Changes - var $rccc ; # Recent Changes Cache Counter for visibility toggle - + var $rcCacheIndex ; # Recent Changes Cache Counter for visibility toggle + var $rcMoveIndex; function Skin() { + $this->linktrail = wfMsg("linktrail"); } function getSkinNames() @@ -61,22 +71,20 @@ class Skin { { global $wgOut, $wgUser; - if ( $wgOut->isQuickbarSupressed() ) { return 0; } + if ( $wgOut->isQuickbarSuppressed() ) { return 0; } $q = $wgUser->getOption( "quickbar" ); if ( "" == $q ) { $q = 0; } return $q; } - function initPage() + function initPage( &$out ) { - global $wgOut, $wgStyleSheetPath; + global $wgStyleSheetPath; $fname = "Skin::initPage"; wfProfileIn( $fname ); - - $wgOut->addLink( "shortcut icon", "", "/favicon.ico" ); - if ( $wgOut->isPrintable() ) { $ss = "wikiprintable.css"; } - else { $ss = $this->getStylesheet(); } - $wgOut->addLink( "stylesheet", "", "{$wgStyleSheetPath}/{$ss}" ); + + $out->addLink( "shortcut icon", "", "/favicon.ico" ); + wfProfileOut( $fname ); } @@ -84,7 +92,7 @@ class Skin { global $wgDebugComments; wfProfileIn( "Skin::outputPage" ); - $this->initPage(); + $this->initPage( $out ); $out->out( $out->headElement() ); $out->out( "\nisPrintable() ) { + $sheet = "wikiprintable.css"; + } else { + $sheet = $this->getStylesheet(); + } $s = "\n"; return $s; } @@ -158,14 +175,13 @@ class Skin { (!$wgTitle->isProtected() || $wgUser->isSysop()) ) { - $n = $wgTitle->getPrefixedURL(); $t = wfMsg( "editthispage" ); $oid = $red = ""; if ( $redirect ) { $red = "&redirect={$redirect}"; } if ( $oldid && ! isset( $diff ) ) { $oid = "&oldid={$oldid}"; } - $s = wfLocalUrlE($n,"action=edit{$oid}{$red}"); + $s = $wgTitle->getFullURL( "action=edit{$oid}{$red}" ); $s = "document.location = \"" .$s ."\";"; $a += array ("ondblclick" => $s); @@ -332,7 +348,7 @@ class Skin { function afterContent() { global $wgUser, $wgOut, $wgServer; - global $wgTitle; + global $wgTitle, $wgLang; if ( $wgOut->isPrintable() ) { $s = "\n\n"; @@ -346,7 +362,7 @@ class Skin { } else { $lm = ""; } $cr = wfMsg( "gnunote" ); - $s .= "

{$rf}{$lm} {$cr}\n"; + $s .= "

" . $wgLang->emphasize("{$rf}{$lm} {$cr}\n"); return $s; } return $this->doAfterContent(); @@ -407,7 +423,7 @@ class Skin { $s = $this->printableLink(); if ( wfMsg ( "disclaimers" ) != "-" ) $s .= " | " . $this->makeKnownLink( wfMsg( "disclaimerpage" ), wfMsg( "disclaimers" ) ) ; - if ( $wgOut->isArticle() ) { + if ( $wgOut->isArticleRelated() ) { if ( $wgTitle->getNamespace() == Namespace::getImage() ) { $name = $wgTitle->getDBkey(); $link = wfEscapeHTML( wfImageUrl( $name ) ); @@ -423,33 +439,34 @@ class Skin { #wfEscapeHTML( wfImageUrl( $name ) ); $style = $this->getExternalLinkAttributes( $link, $name ); $s .= " | {$name}" ; - } } - if ( "history" == $action || isset( $diff ) || isset( $oldid ) ) { - $s .= " | " . $this->makeKnownLink( $wgTitle->getPrefixedText(), - wfMsg( "currentrev" ) ); - } + } + } + if ( "history" == $action || isset( $diff ) || isset( $oldid ) ) { + $s .= " | " . $this->makeKnownLink( $wgTitle->getPrefixedText(), + wfMsg( "currentrev" ) ); + } - if ( $wgUser->getNewtalk() ) { - # do not show "You have new messages" text when we are viewing our - # own talk page - - if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 && - $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) { - $n =$wgUser->getName(); - $tl = $this->makeKnownLink( $wgLang->getNsText( - Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", - wfMsg("newmessageslink") ); - $s.=" | ". wfMsg( "newmessages", $tl ) . ""; - } - } - if( $wgUser->isSysop() && - (($wgTitle->getArticleId() == 0) || ($action == "history")) && - ($n = $wgTitle->isDeleted() ) ) { - $s .= " | " . wfMsg( "thisisdeleted", - $this->makeKnownLink( - $wgLang->SpecialPage( "Undelete/" . $wgTitle->getPrefixedDBkey() ), - wfMsg( "restorelink", $n ) ) ); + if ( $wgUser->getNewtalk() ) { + # do not show "You have new messages" text when we are viewing our + # own talk page + + if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 && + $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) { + $n =$wgUser->getName(); + $tl = $this->makeKnownLink( $wgLang->getNsText( + Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", + wfMsg("newmessageslink") ); + $s.=" | ". wfMsg( "newmessages", $tl ) . ""; } + } + if( $wgUser->isSysop() && + (($wgTitle->getArticleId() == 0) || ($action == "history")) && + ($n = $wgTitle->isDeleted() ) ) { + $s .= " | " . wfMsg( "thisisdeleted", + $this->makeKnownLink( + $wgLang->SpecialPage( "Undelete/" . $wgTitle->getPrefixedDBkey() ), + wfMsg( "restorelink", $n ) ) ); + } return $s; } @@ -518,15 +535,15 @@ class Skin { function nameAndLogin() { - global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader; + global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader, $wgIP; $li = $wgLang->specialPage( "Userlogin" ); $lo = $wgLang->specialPage( "Userlogout" ); $s = ""; if ( 0 == $wgUser->getID() ) { - if( $wgShowIPinHeader ) { - $n = getenv( "REMOTE_ADDR" ); + if( $wgShowIPinHeader && isset( $_COOKIE[ini_get("session.name")] ) ) { + $n = $wgIP; $tl = $this->makeKnownLink( $wgLang->getNsText( Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", @@ -569,12 +586,12 @@ class Skin { { global $search; - $s = "

" . "\n" . " " - . "
"; + . ""; return $s; } @@ -587,7 +604,7 @@ class Skin { $s = $this->mainPageLink() . $sep . $this->specialLink( "recentchanges" ); - if ( $wgOut->isArticle() ) { + if ( $wgOut->isArticleRelated() ) { $s .= $sep . $this->editThisPage() . $sep . $this->historyLink(); } @@ -603,7 +620,7 @@ class Skin { $sep = " |\n"; $s = ""; - if ( $wgOut->isArticle() ) { + if ( $wgOut->isArticleRelated() ) { $s .= "" . $this->editThisPage() . ""; if ( 0 != $wgUser->getID() ) { $s .= $sep . $this->watchThisPage(); @@ -651,7 +668,7 @@ class Skin { if ( $wgDisableCounters ) { $s = ""; } else { - $count = $wgArticle->getCount(); + $count = $wgLang->formatNum( $wgArticle->getCount() ); $s = wfMsg( "viewcount", $count ); } $s .= $this->lastModified(); @@ -672,9 +689,10 @@ class Skin { { if ( "" != $align ) { $a = " align='{$align}'"; } else { $a = ""; } - + $mp = wfMsg( "mainpage" ); - $s = "escapeLocalURL() . "\">getLogo() . "\" alt=\"" . "[{$mp}]\">"; return $s; @@ -683,7 +701,7 @@ class Skin { function quickBar() { global $wgOut, $wgTitle, $wgUser, $action, $wgLang; - global $wpPreview, $wgDisableUploads; + global $wpPreview, $wgDisableUploads, $wgRemoteUploads; $fname = "Skin::quickBar"; wfProfileIn( $fname ); @@ -767,8 +785,7 @@ class Skin { unwatched. Therefore we do not show the "Watch this page" link in edit mode */ if ( 0 != $wgUser->getID() && $articleExists) { - if($action!="edit" && $action!="history" && - $action != "submit" ) + if($action!="edit" && $action != "submit" ) { $s .= $sep . $this->watchThisPage(); } @@ -785,7 +802,7 @@ class Skin { } $s.=$sep . $this->whatLinksHere(); - if($wgOut->isArticle()) { + if($wgOut->isArticleRelated()) { $s .= $sep . $this->watchPageLinksLink(); } @@ -808,7 +825,7 @@ class Skin { $s .= "\n

"; } - if ( 0 != $wgUser->getID() && !$wgDisableUploads ) { + if ( 0 != $wgUser->getID() && ( !$wgDisableUploads || $wgRemoteUploads ) ) { $s .= $this->specialLink( "upload" ) . $sep; } $s .= $this->specialLink( "specialpages" ) @@ -906,7 +923,7 @@ class Skin { { global $wgOut, $wgTitle, $oldid, $redirect, $diff; - if ( ! $wgOut->isArticle() || $diff ) { + if ( ! $wgOut->isArticleRelated() ) { $s = wfMsg( "protectedpage" ); } else { $n = $wgTitle->getPrefixedText(); @@ -967,7 +984,7 @@ class Skin { { global $wgUser, $wgOut, $wgTitle, $diff; - if ( $wgOut->isArticle() && ( ! $diff ) ) { + if ( $wgOut->isArticleRelated() ) { $n = $wgTitle->getPrefixedText(); if ( $wgTitle->userIsWatching() ) { @@ -1018,7 +1035,7 @@ class Skin { global $wgTitle, $wgLang; $s = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ), - wfMsg( "contributions" ), "target=" . $wgTitle->getURL() ); + wfMsg( "contributions" ), "target=" . $wgTitle->getPartialURL() ); return $s; } @@ -1027,7 +1044,7 @@ class Skin { global $wgTitle, $wgLang; $s = $this->makeKnownLink( $wgLang->specialPage( "Emailuser" ), - wfMsg( "emailuser" ), "target=" . $wgTitle->getURL() ); + wfMsg( "emailuser" ), "target=" . $wgTitle->getPartialURL() ); return $s; } @@ -1035,7 +1052,7 @@ class Skin { { global $wgOut, $wgTitle, $wgLang; - if ( ! $wgOut->isArticle() ) { + if ( ! $wgOut->isArticleRelated() ) { $s = "(" . wfMsg( "notanarticle" ) . ")"; } else { $s = $this->makeKnownLink( $wgLang->specialPage( @@ -1248,7 +1265,7 @@ class Skin { } # Pass a title object, not a title string - function makeLinkObj( &$nt, $text= "", $query = "", $trail = "" ) + function makeLinkObj( &$nt, $text= "", $query = "", $trail = "", $prefix = "" ) { global $wgOut, $wgUser; if ( $nt->isExternal() ) { @@ -1265,18 +1282,18 @@ class Skin { } $retVal = "{$text}{$inside}{$trail}"; } elseif ( 0 == $nt->getNamespace() && "" == $nt->getText() ) { - $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail ); + $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix ); } elseif ( ( -1 == $nt->getNamespace() ) || ( Namespace::getImage() == $nt->getNamespace() ) ) { - $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail ); + $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix ); } else { $aid = $nt->getArticleID() ; if ( 0 == $aid ) { - $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail ); + $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail, $prefix ); } else { $threshold = $wgUser->getOption("stubthreshold") ; if ( $threshold > 0 ) { - $res = wfQuery ( "SELECT HIGH_PRIORITY length(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'", DB_READ ) ; + $res = wfQuery ( "SELECT LENGTH(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'", DB_READ ) ; if ( wfNumRows( $res ) > 0 ) { $s = wfFetchObject( $res ); @@ -1292,9 +1309,9 @@ class Skin { $size = 1 ; } if ( $size < $threshold ) { - $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail ); + $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail, $prefix ); } else { - $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail ); + $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix ); } } } @@ -1302,7 +1319,7 @@ class Skin { } # Pass a title object, not a title string - function makeKnownLinkObj( &$nt, $text = "", $query = "", $trail = "" ) + function makeKnownLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" ) { global $wgOut, $wgTitle; @@ -1315,7 +1332,7 @@ class Skin { $u = ""; if ( "" == $text ) { $text = $nt->getFragment(); } } else { - $u = wfLocalUrlE( $link, $query ); + $u = $nt->escapeLocalURL( $query ); } if ( "" != $nt->getFragment() ) { $u .= "#" . wfEscapeHTML( $nt->getFragment() ); @@ -1325,45 +1342,46 @@ class Skin { $inside = ""; if ( "" != $trail ) { - if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) { + if ( preg_match( $this->linktrail, $trail, $m ) ) { $inside = $m[1]; $trail = $m[2]; } } - $r = "{$text}{$inside}{$trail}"; + $r = "{$prefix}{$text}{$inside}{$trail}"; wfProfileOut( $fname ); return $r; } # Pass a title object, not a title string - function makeBrokenLinkObj( &$nt, $text = "", $query = "", $trail = "" ) + function makeBrokenLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" ) { global $wgOut, $wgUser; $fname = "Skin::makeBrokenLinkObj"; wfProfileIn( $fname ); - $link = $nt->getPrefixedURL(); - - if ( "" == $query ) { $q = "action=edit"; } - else { $q = "action=edit&{$query}"; } - $u = wfLocalUrlE( $link, $q ); + if ( "" == $query ) { + $q = "action=edit"; + } else { + $q = "action=edit&{$query}"; + } + $u = $nt->escapeLocalURL( $q ); if ( "" == $text ) { $text = $nt->getPrefixedText(); } $style = $this->getInternalLinkAttributesObj( $nt, $text, "yes" ); $inside = ""; if ( "" != $trail ) { - if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) { + if ( preg_match( $this->linktrail, $trail, $m ) ) { $inside = $m[1]; $trail = $m[2]; } } if ( $wgOut->isPrintable() || ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) { - $s = "{$text}{$inside}{$trail}"; + $s = "{$prefix}{$text}{$inside}{$trail}"; } else { - $s = "{$text}{$inside}?{$trail}"; + $s = "{$prefix}{$text}{$inside}?{$trail}"; } wfProfileOut( $fname ); @@ -1371,29 +1389,29 @@ class Skin { } # Pass a title object, not a title string - function makeStubLinkObj( &$nt, $text = "", $query = "", $trail = "" ) + function makeStubLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" ) { global $wgOut, $wgUser; $link = $nt->getPrefixedURL(); - $u = wfLocalUrlE( $link, $query ); + $u = $nt->escapeLocalURL( $query ); if ( "" == $text ) { $text = $nt->getPrefixedText(); } $style = $this->getInternalLinkAttributesObj( $nt, $text, "stub" ); $inside = ""; if ( "" != $trail ) { - if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) { + if ( preg_match( $this->linktrail, $trail, $m ) ) { $inside = $m[1]; $trail = $m[2]; } } if ( $wgOut->isPrintable() || ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) { - $s = "{$text}{$inside}{$trail}"; + $s = "{$prefix}{$text}{$inside}{$trail}"; } else { - $s = "{$text}{$inside}!{$trail}"; + $s = "{$prefix}{$text}{$inside}!{$trail}"; } return $s; } @@ -1421,17 +1439,247 @@ class Skin { } function makeImageLinkObj( $nt, $alt = "" ) { - $link = $nt->getPrefixedURL(); - $name = $nt->getDBKey(); - $url = wfImageUrl( $name ); + global $wgLang, $wgUseImageResize; + $name = $nt->getDBKey(); + $url = wfImageUrl( $name ); + $align = ""; + $prefix = $postfix = ""; + + if ( $wgUseImageResize ) { + # Check if the alt text is of the form "options|alt text" + # Options are: + # * thumbnail make a thumbnail with enlarge-icon and caption, alignment depends on lang + # * left no resizing, just left align. label is used for alt= only + # * right same, but right aligned + # * none same, but not aligned + # * ___px scale to ___ pixels width, no aligning. e.g. use in taxobox + + $part = explode( "|", $alt); + + $mwThumb =& MagicWord::get( MAG_IMG_THUMBNAIL ); + $mwLeft =& MagicWord::get( MAG_IMG_LEFT ); + $mwRight =& MagicWord::get( MAG_IMG_RIGHT ); + $mwNone =& MagicWord::get( MAG_IMG_NONE ); + $mwWidth =& MagicWord::get( MAG_IMG_WIDTH ); + $mwCenter =& MagicWord::get( MAG_IMG_CENTER ); + $alt = $part[count($part)-1]; + + $thumb=false; + + foreach( $part as $key => $val ) { + if ( ! is_null( $mwThumb->matchVariableStartToEnd($val) ) ) { + $thumb=true; + } elseif ( ! is_null( $mwRight->matchVariableStartToEnd($val) ) ) { + # remember to set an alignment, don't render immediately + $align = "right"; + } elseif ( ! is_null( $mwLeft->matchVariableStartToEnd($val) ) ) { + # remember to set an alignment, don't render immediately + $align = "left"; + } elseif ( ! is_null( $mwCenter->matchVariableStartToEnd($val) ) ) { + # remember to set an alignment, don't render immediately + $align = "center"; + } elseif ( ! is_null( $mwNone->matchVariableStartToEnd($val) ) ) { + # remember to set an alignment, don't render immediately + $align = "none"; + } elseif ( ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) { + # $match is the image width in pixels + $width = intval($match); + } + } + if ( "center" == $align ) + { + $prefix = "
"; + $postfix = "
"; + $align = "none"; + } + + if ( $thumb ) { + + # Create a thumbnail. Alignment depends on language + # writing direction, # right aligned for left-to-right- + # languages ("Western languages"), left-aligned + # for right-to-left-languages ("Semitic languages") + # + # If thumbnail width has not been provided, it is set + # here to 180 pixels + if ( $align == "" ) { + $align = $wgLang->isRTL() ? "left" : "right"; + } + if ( ! isset($width) ) { + $width = 180; + } + return $prefix.$this->makeThumbLinkObj( $nt, $alt, $align, $width ).$postfix; + + } elseif ( isset($width) ) { + + # Create a resized image, without the additional thumbnail + # features + $url = $this->createThumb( $name, $width ); + } + } # endif $wgUseImageResize + if ( empty( $alt ) ) { $alt = preg_replace( '/\.(.+?)^/', '', $name ); } $alt = htmlspecialchars( $alt ); - $u = wfLocalUrlE( $link ); - $s = "" . - "\"{$alt}\""; + $u = $nt->escapeLocalURL(); + if ( $url == "" ) + { + $s = str_replace( "$1", $name, wfMsg("missingimage") ); + } else { + $s = "" . + "\"{$alt}\""; + } + if ( "" != $align ) { + $s = "
{$s}
"; + } + return $prefix.$s.$postfix; + } + + function createThumb( $name, $width ) { + global $wgUploadDirectory; + global $wgImageMagickConvertCommand; + global $wgUseImageMagick; + global $wgUseSquid, $wgInternalServer; + $imgPath = wfImagePath( $name ); + $thumbName = $width."px-".$icon.$name; + $thumbPath = wfImageThumbDir( $thumbName )."/".$thumbName; + $thumbUrl = wfImageThumbUrl( $thumbName ); + + if ( ! file_exists( $imgPath ) ) + { + # If there is no image, there will be no thumbnail + return ""; + } + + if ( (! file_exists( $thumbPath ) ) + || ( filemtime($thumbPath) < filemtime($imgPath) ) ) { + # Squid purging + if ( $wgUseSquid ) { + $urlArr = Array( + $wgInternalServer.$thumbUrl + ); + wfPurgeSquidServers($urlArr); + } + + if ( $wgUseImageMagick ) { + # use ImageMagick + $cmd = $wgImageMagickConvertCommand . + " -quality 85 -geometry {$width} ". + escapeshellarg($imgPath) . " " . + escapeshellarg($thumbPath); + $conv = shell_exec( $cmd ); + } else { + # Use PHP's builtin GD library functions. + # + # First find out what kind of file this is, and select the correct + # input routine for this. + list($src_width, $src_height, $src_type, $src_attr) = getimagesize( $imgPath ); + switch( $src_type ) { + case 1: # GIF + $src_image = imagecreatefromgif( $imgPath ); + break; + case 2: # JPG + $src_image = imagecreatefromjpeg( $imgPath ); + break; + case 3: # PNG + $src_image = imagecreatefrompng( $imgPath ); + break; + case 15: # WBMP for WML + $src_image = imagecreatefromwbmp( $imgPath ); + break; + case 16: # XBM + $src_image = imagecreatefromxbm( $imgPath ); + break; + default: + return "Image type not supported"; + break; + } + $height = floor( $src_height * ( $width/$src_width ) ); + $dst_image = imagecreatetruecolor( $width, $height ); + imagecopyresampled( $dst_image, $src_image, + 0,0,0,0, + $width, $height, $src_width, $src_height ); + switch( $src_type ) { + case 1: # GIF + case 3: # PNG + case 15: # WBMP + case 16: # XBM + #$thumbUrl .= ".png"; + #$thumbPath .= ".png"; + imagepng( $dst_image, $thumbPath ); + break; + case 2: # JPEG + #$thumbUrl .= ".jpg"; + #$thumbPath .= ".jpg"; + imageinterlace( $dst_image ); + imagejpeg( $dst_image, $thumbPath, 95 ); + break; + default: + break; + } + imagedestroy( $dst_image ); + imagedestroy( $src_image ); + + + } + # + # Check for zero-sized thumbnails. Those can be generated when + # no disk space is available or some other error occurs + # + $thumbstat = stat( $thumbPath ); + $imgstat = stat( $imgPath ); + if( $thumbstat["size"] == 0 ) + { + unlink( $thumbPath ); + } + + } + return $thumbUrl; + } + + function makeThumbLinkObj( $nt, $label = "", $align = "right", $boxwidth = 180 ) { + global $wgUploadPath; + $name = $nt->getDBKey(); + $image = Title::makeTitle( Namespace::getImage(), $name ); + $url = wfImageUrl( $name ); + $path = wfImagePath( $name ); + + #$label = htmlspecialchars( $label ); + $alt = preg_replace( "/<[^>]*>/", "", $label); + $alt = htmlspecialchars( $alt ); + + if ( file_exists( $path ) ) + { + list($width, $height, $type, $attr) = getimagesize( $path ); + } else { + $width = $height = 200; + } + $boxheight = intval( $height/($width/$boxwidth) ); + if ( $boxwidth > $width ) { + $boxwidth = $width; + $boxheight = $height; + } + + $thumbUrl = $this->createThumb( $name, $boxwidth ); + + $u = $nt->escapeLocalURL(); + + $more = htmlspecialchars(wfMsg( "thumbnail-more" )); + + $s = "
"; + if ( $thumbUrl == "" ) { + $s .= str_replace( "$1", $name, wfMsg("missingimage") ); + } else { + $s .= "" . + "\"{$alt}\"" . + "" . + "\"{$more}\""; + } + $s .= "

{$label}

"; return $s; } @@ -1466,10 +1714,12 @@ class Skin { # Called by history lists and recent changes # + # Returns text for the start of the tabular part of RC function beginRecentChangesList() { - $rc_cache = array() ; - $rccc = 0 ; + $this->rc_cache = array() ; + $this->rcMoveIndex = 0; + $this->rcCacheIndex = 0 ; $this->lastdate = ""; return ""; } @@ -1481,6 +1731,8 @@ class Skin { return $s; } + # Returns text for the end of RC + # If enhanced RC is in use, returns pretty much all the text function endRecentChangesList() { $s = $this->recentChangesBlock() ; @@ -1488,77 +1740,102 @@ class Skin { return $s; } - function endImageHistoryList() + # Enhanced RC ungrouped line + function recentChangesBlockLine ( $rcObj ) { - $s = "\n"; - return $s; - } - - function recentChangesBlockLine ( $y ) { - global $wgUploadPath ; - - $M = wfMsg( "minoreditletter" ); - $N = wfMsg( "newpageletter" ); + global $wgUploadPath, $wgLang ; + + # Get rc_xxxx variables + extract( $rcObj->mAttribs ) ; + $curIdEq = "curid=$rc_cur_id"; + + # Spacer image $r = "" ; - $r .= "" ; - $r .= "" ; - if ( $y->isnew ) $r .= $N ; - else $r .= " " ; - if ( $y->isminor ) $r .= $M ; - else $r .= " " ; - $r .= " ".$y->timestamp." " ; + $r .= "" ; $r .= "" ; + + if ( $rc_type == RC_MOVE ) { + $r .= "  "; + } else { + # M & N (minor & new) + $M = wfMsg( "minoreditletter" ); + $N = wfMsg( "newpageletter" ); + + if ( $rc_type == RC_NEW ) { + $r .= $N ; + } else { + $r .= " " ; + } + if ( $rc_minor ) { + $r .= $M ; + } else { + $r .= " " ; + } + } + + # Timestamp + $r .= " ".$rcObj->timestamp." " ; $r .= "" ; - $link = $y->link ; - if ( $y->watched ) $link = "{$link}" ; + + # Article link + $link = $rcObj->link ; + if ( $rcObj->watched ) $link = "{$link}" ; $r .= $link ; + # Cur $r .= " (" ; - $r .= $y->curlink ; + $r .= $rcObj->curlink ; $r .= "; " ; - $r .= $this->makeKnownLink( $y->secureName, wfMsg( "hist" ), "action=history" ); + + # Hist + $r .= $this->makeKnownLinkObj( $rcObj->getTitle(), wfMsg( "hist" ), "{$curIdEq}&action=history" ); - $r .= ") . . ".$y->userlink ; - $r .= $y->usertalklink ; - if ( $y->usercomment != "" ) - $r .= " (".wfEscapeHTML($y->usercomment).")" ; + # User/talk + $r .= ") . . ".$rcObj->userlink ; + $r .= $rcObj->usertalklink ; + + # Comment + if ( $rc_comment != "" && $rc_type != RC_MOVE ) { + $r .= $wgLang->emphasize( " (".wfEscapeHTML($rc_comment).")" ); + } $r .= "
\n" ; return $r ; - } - - function recentChangesBlockGroup ( $y ) { - global $wgUploadPath ; + } + # Enhanced RC group + function recentChangesBlockGroup ( $block ) + { + global $wgUploadPath, $wgLang ; + $r = "" ; $M = wfMsg( "minoreditletter" ); $N = wfMsg( "newpageletter" ); + + # Collate list of users $isnew = false ; $userlinks = array () ; - foreach ( $y AS $x ) { - $oldid = $x->diffid ; - if ( $x->isnew ) $isnew = true ; - $u = $x->userlink ; + foreach ( $block AS $rcObj ) { + $oldid = $rcObj->mAttribs['rc_last_oldid']; + if ( $rcObj->mAttribs['rc_new'] ) $isnew = true ; + $u = $rcObj->userlink ; if ( !isset ( $userlinks[$u] ) ) $userlinks[$u] = 0 ; $userlinks[$u]++ ; - } - + } + + # Sort the list and convert to text krsort ( $userlinks ) ; asort ( $userlinks ) ; $users = array () ; - $u = array_keys ( $userlinks ) ; - foreach ( $u as $x ) { - $z = $x ; - if ( $userlinks[$x] > 1 ) $z .= " ({$userlinks[$x]}×)" ; - array_push ( $users , $z ) ; - } + foreach ( $userlinks as $userlink => $count) { + $text = $userlink ; + if ( $count > 1 ) $text .= " ({$count}×)" ; + array_push ( $users , $text ) ; + } $users = " [".implode("; ",$users)."]" ; - $e = $y ; - $e = array_shift ( $e ) ; - # Arrow - $rci = "RCI{$this->rccc}" ; - $rcl = "RCL{$this->rccc}" ; - $rcm = "RCM{$this->rccc}" ; + $rci = "RCI{$this->rcCacheIndex}" ; + $rcl = "RCL{$this->rcCacheIndex}" ; + $rcm = "RCM{$this->rcCacheIndex}" ; $tl = "" ; $tl .= "" ; $tl .= "" ; @@ -1566,246 +1843,321 @@ class Skin { $r .= $tl ; # Main line + # M/N $r .= "" ; if ( $isnew ) $r .= $N ; else $r .= " " ; $r .= " " ; # Minor - $r .= " ".$e->timestamp." " ; - $r .= "" ; - $link = $e->link ; - if ( $e->watched ) $link = "{$link}" ; + # Timestamp + $r .= " ".$block[0]->timestamp." " ; + $r .= "
" ; + + # Article link + $link = $block[0]->link ; + if ( $block[0]->watched ) $link = "{$link}" ; $r .= $link ; - - if ( !$e->islog ) { - $r .= " (".count($y)." " ; + + $curIdEq = "curid=" . $block[0]->mAttribs['rc_cur_id']; + if ( $block[0]->mAttribs['rc_type'] != RC_LOG ) { + # Changes + $r .= " (".count($block)." " ; if ( $isnew ) $r .= wfMsg("changes"); - else $r .= $this->makeKnownLink( $e->secureName , wfMsg("changes") , "diff=0&oldid=".$oldid ) ; + else $r .= $this->makeKnownLinkObj( $block[0]->getTitle() , wfMsg("changes") , + "{$curIdEq}&diff=0&oldid=".$oldid ) ; $r .= "; " ; - $r .= $this->makeKnownLink( $e->secureName, wfMsg( "history" ), "action=history" ); + + # History + $r .= $this->makeKnownLinkObj( $block[0]->getTitle(), wfMsg( "history" ), "{$curIdEq}&action=history" ); $r .= ")" ; - } + } $r .= $users ; $r .= "
\n" ; # Sub-entries $r .= "\n" ; - $this->rccc++ ; + $this->rcCacheIndex++ ; return $r ; - } + } + # If enhanced RC is in use, this function takes the previously cached + # RC lines, arranges them, and outputs the HTML function recentChangesBlock () { global $wgUploadPath ; if ( count ( $this->rc_cache ) == 0 ) return "" ; - $k = array_keys ( $this->rc_cache ) ; - foreach ( $k AS $x ) - { - $y = $this->rc_cache[$x] ; - if ( count ( $y ) < 2 ) { - $r .= $this->recentChangesBlockLine ( array_shift ( $y ) ) ; + $blockOut = ""; + foreach ( $this->rc_cache AS $secureName => $block ) { + if ( count ( $block ) < 2 ) { + $blockOut .= $this->recentChangesBlockLine ( array_shift ( $block ) ) ; } else { - $r .= $this->recentChangesBlockGroup ( $y ) ; - } + $blockOut .= $this->recentChangesBlockGroup ( $block ) ; } + } - return "
{$r}
" ; + return "
{$blockOut}
" ; } - function recentChangesLine( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 ) + # Called in a loop over all displayed RC entries + # Either returns the line, or caches it for later use + function recentChangesLine( &$rc, $watched = false ) { global $wgUser ; $usenew = $wgUser->getOption( "usenewrc" ); if ( $usenew ) - $r = $this->recentChangesLineNew ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ; + $line = $this->recentChangesLineNew ( $rc, $watched ) ; else - $r = $this->recentChangesLineOld ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ; - return $r ; + $line = $this->recentChangesLineOld ( $rc, $watched ) ; + return $line ; } - - function recentChangesLineOld( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0, $diffid = 0 ) + + function recentChangesLineOld( &$rc, $watched = false ) { global $wgTitle, $wgLang, $wgUser; - - $d = $wgLang->date( $ts, true); + + # Extract DB fields into local scope + extract( $rc->mAttribs ); + $curIdEq = "curid=" . $rc_cur_id; + + # Make date header if necessary + $date = $wgLang->date( $rc_timestamp, true); $s = ""; - if ( $d != $this->lastdate ) { + if ( $date != $this->lastdate ) { if ( "" != $this->lastdate ) { $s .= "\n"; } - $s .= "

{$d}

\n