-<?
+<?php
+
+include_once( "Feed.php" );
+
# See skin.doc
# These are the INTERNAL names, which get mapped
/* private */ $wgValidSkinNames = array(
"Standard", "Nostalgia", "CologneBlue"
);
+if( $wgUseSmarty ) {
+ $wgValidSkinNames[] = "Smarty";
+ $wgValidSkinNames[] = "Montparnasse";
+}
+if( $wgUsePHPTal ) {
+ #$wgValidSkinNames[] = "PHPTal";
+ $wgValidSkinNames[] = "DaVinci";
+}
+
+include_once( "RecentChange.php" );
# For some odd PHP bug, this function can't be part of a class
function getCategories ()
{
- global $wgOut , $wgTitle , $wgUseCategoryMagic , $wgUser ;
+ global $wgOut , $wgTitle , $wgUseCategoryMagic , $wgUser , $wgParser ;
if ( !isset ( $wgUseCategoryMagic ) || !$wgUseCategoryMagic ) return "" ;
- if ( count ( $wgOut->mCategoryLinks ) == 0 ) return "" ;
+ if ( count ( $wgParser->mCategoryLinks ) == 0 ) return "" ;
if ( !$wgOut->isArticle() ) return "" ;
$sk = $wgUser->getSkin() ;
$s = "" ;
$s .= "\n<br>\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()
{
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;
- wfProfileIn( "Skin::initPage" );
+ global $wgStyleSheetPath;
+ $fname = "Skin::initPage";
+ wfProfileIn( $fname );
+
+ $out->addLink( "shortcut icon", "", "/favicon.ico" );
+
+ wfProfileOut( $fname );
+ }
+
+ function outputPage( &$out ) {
+ global $wgDebugComments;
+
+ wfProfileIn( "Skin::outputPage" );
+ $this->initPage( $out );
+ $out->out( $out->headElement() );
+
+ $out->out( "\n<body" );
+ $ops = $this->getBodyOptions();
+ foreach ( $ops as $name => $val ) {
+ $out->out( " $name='$val'" );
+ }
+ $out->out( ">\n" );
+ if ( $wgDebugComments ) {
+ $out->out( "<!-- Wiki debugging output:\n" .
+ $out->mDebugtext . "-->\n" );
+ }
+ $out->out( $this->beforeContent() );
+
+ $out->out( $out->mBodytext );
+
+ $out->out( $this->afterContent() );
+
+ wfProfileClose();
+ $out->out( $out->reportTime() );
- $wgOut->addLink( "shortcut icon", "", "/favicon.ico" );
- if ( $wgOut->isPrintable() ) { $ss = "wikiprintable.css"; }
- else { $ss = $this->getStylesheet(); }
- $wgOut->addLink( "stylesheet", "", "{$wgStyleSheetPath}/{$ss}" );
- wfProfileOut();
+ $out->out( "\n</body></html>" );
}
function getHeadScripts() {
function getUserStyles()
{
+ global $wgOut, $wgStyleSheetPath;
+ $sheet = $this->getStylesheet();
$s = "<style type='text/css'><!--\n";
+ $s .= "/*/*/\n"; # <-- Hide the styles from Netscape 4 without hiding them from IE/Mac
+ $s .= "@import url(\"$wgStyleSheetPath/$sheet\");\n";
$s .= $this->doGetUserStyles();
+ $s .= "/* */\n";
$s .= "//--></style>\n";
return $s;
}
if ( 1 == $wgUser->getOption( "underline" ) ) {
# Don't override browser settings
} else {
+ # CHECK MERGE @@@
# Force no underline
$s .= "a.stub, a.new, a.internal, a.external { " .
"text-decoration: none; }\n";
(!$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);
}
- if($action=="edit") { # set focus in edit box
- $foc = "document.editform.wpTextbox1.focus()";
- if($a['onload']) {
- $a['onload'] .= ";$foc";
- } else {
- $a['onload'] = $foc;
- }
- }
+ $a['onload'] = $wgOut->getOnloadHandler();
return $a;
}
$link = str_replace( "_", " ", $link );
$link = wfEscapeHTML( $link );
- if ( $wgOut->isPrintable() ) { $r = " class='printable'"; }
- else { $r = " class='external'"; }
+ $r = " class='external'";
if ( 1 == $wgUser->getOption( "hover" ) ) {
$r .= " title=\"{$link}\"";
$link = str_replace( "_", " ", $link );
$link = wfEscapeHTML( $link );
- if ( $wgOut->isPrintable() ) { $r = " class='printable'"; }
- else if ( $broken == "stub" ) { $r = " class='stub'"; }
- else if ( $broken == "yes" ) { $r = " class='new'"; }
- else { $r = " class='internal'"; }
+ if ( $broken == "stub" ) {
+ $r = " class='stub'";
+ } else if ( $broken == "yes" ) {
+ $r = " class='new'";
+ } else {
+ $r = "";
+ }
if ( 1 == $wgUser->getOption( "hover" ) ) {
$r .= " title=\"{$link}\"";
}
return $r;
}
+
+ function getInternalLinkAttributesObj( &$nt, $text, $broken = false )
+ {
+ global $wgUser, $wgOut;
+ if ( $broken == "stub" ) {
+ $r = " class='stub'";
+ } else if ( $broken == "yes" ) {
+ $r = " class='new'";
+ } else {
+ $r = "";
+ }
+
+ if ( 1 == $wgUser->getOption( "hover" ) ) {
+ $r .= ' title ="' . $nt->getEscapedText() . '"';
+ }
+ return $r;
+ }
+
function getLogo()
{
global $wgLogo;
#
function beforeContent()
{
- global $wgUser, $wgOut;
+ global $wgUser, $wgOut, $wgSiteNotice;
- if ( $wgOut->isPrintable() ) {
- $s = $this->pageTitle() . $this->pageSubtitle() . "\n";
- $s .= "\n<div class='bodytext'>";
- return $s;
+ if( $wgSiteNotice ) {
+ $note = "\n<div id='notice' style='font-weight: bold; color: red; text-align: center'>$wgSiteNotice</div>\n";
+ } else {
+ $note = "";
}
- return $this->doBeforeContent();
+ return $this->doBeforeContent() . $note;
}
function doBeforeContent()
{
global $wgUser, $wgOut, $wgTitle, $wgLang;
- wfProfileIn( "Skin::doBeforeContent" );
+ $fname = "Skin::doBeforeContent";
+ wfProfileIn( $fname );
$s = "";
$qb = $this->qbSetting();
}
$s .= "\n<div id='content'>\n<div id='topbar'>" .
- "<table width='98%' border=0 cellspacing=0><tr>";
+ "<table border=0 cellspacing=0><tr>";
$shove = ($qb != 0);
$left = ($qb == 1 || $qb == 3);
$s .= $this->pageTitle();
$s .= $this->pageSubtitle() ;
- $s .= getCategories(); // For some odd reason, zhis can't be a function of the object
+ $s .= getCategories(); // For some odd reason, zhis can't be a function of the object
$s .= "\n<p>";
- wfProfileOut();
+ wfProfileOut( $fname );
return $s;
}
#
function afterContent()
{
- global $wgUser, $wgOut, $wgServer, $HTTP_SERVER_VARS;
- global $wgTitle;
+ global $wgUser, $wgOut, $wgServer;
+ global $wgTitle, $wgLang;
- if ( $wgOut->isPrintable() ) {
- $s = "\n</div>\n";
-
- $u = $wgServer . $wgTitle->getFullURL();
- $rf = wfMsg( "retrievedfrom", $u );
-
- if ( $wgOut->isArticle() ) {
- $lm = "<br>" . $this->lastModified();
- } else { $lm = ""; }
-
- $cr = wfMsg( "gnunote" );
- $s .= "<p><em>{$rf}{$lm} {$cr}</em>\n";
- return $s;
- }
- return $this->doAfterContent();
+ $printfooter = "<div class=\"printfooter\">" . $this->printFooter() . "</div>\n";
+ return $printfooter . $this->doAfterContent();
}
-
+
+ function printFooter() {
+ global $wgTitle;
+ $url = htmlspecialchars( $wgTitle->getFullURL() );
+ return "<p>" . wfMsg( "retrievedfrom", "<a href=\"$url\">$url</a>" ) .
+ "</p>\n\n<p>" . $this->pageStats() . "</p>\n";
+ }
+
function doAfterContent()
{
global $wgUser, $wgOut, $wgLang;
- wfProfileIn( "Skin::doAfterContent" );
+ $fname = "Skin::doAfterContent";
+ wfProfileIn( $fname );
+ wfProfileIn( "$fname-1" );
$s = "\n</div><br clear=all>\n";
-
$s .= "\n<div id='footer'>";
- $s .= "<table width='98%' border=0 cellspacing=0><tr>";
+ $s .= "<table border=0 cellspacing=0><tr>";
+
+ wfProfileOut( "$fname-1" );
+ wfProfileIn( "$fname-2" );
$qb = $this->qbSetting();
$shove = ($qb != 0);
if ( $shove && $left ) { # Left
$s .= $this->getQuickbarCompensator();
}
+ wfProfileOut( "$fname-2" );
+ wfProfileIn( "$fname-3" );
$l = $wgLang->isRTL() ? "right" : "left";
$s .= "<td class='bottom' align='$l' valign='top'>";
. " | " . $this->aboutLink()
. " | " . $this->specialLink( "recentchanges" )
. " | " . $this->searchForm()
- . "<br>" . $this->pageStats();
+ . "<br><span id='pagestats'>" . $this->pageStats() . "</span>";
$s .= "</td>";
if ( $shove && !$left ) { # Right
$s .= $this->getQuickbarCompensator();
}
$s .= "</tr></table>\n</div>\n</div>\n";
-
+
+ wfProfileOut( "$fname-3" );
+ wfProfileIn( "$fname-4" );
if ( 0 != $qb ) { $s .= $this->quickBar(); }
- wfProfileOut();
+ wfProfileOut( "$fname-4" );
+ wfProfileOut( $fname );
return $s;
}
function pageTitleLinks()
{
- global $wgOut, $wgTitle, $oldid, $action, $diff, $wgUser, $wgLang;
+ global $wgOut, $wgTitle, $oldid, $action, $diff, $wgUser, $wgLang, $wgUseApproval;
$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 ) );
$style = $this->getInternalLinkAttributes( $link, $name );
$s .= " | <a href=\"{$link}\"{$style}>{$name}</a>";
}
+ # This will show the "Approve" link if $wgUseApproval=true;
+ if ( isset ( $wgUseApproval ) && $wgUseApproval )
+ {
+ $t = $wgTitle->getDBkey();
+ $name = "Approve this article" ;
+ $link = "http://test.wikipedia.org/w/magnus/wiki.phtml?title={$t}&action=submit&doit=1" ;
+ #wfEscapeHTML( wfImageUrl( $name ) );
+ $style = $this->getExternalLinkAttributes( $link, $name );
+ $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>" ;
+ }
}
if ( "history" == $action || isset( $diff ) || isset( $oldid ) ) {
$s .= " | " . $this->makeKnownLink( $wgTitle->getPrefixedText(),
- wfMsg( "currentrev" ) );
+ wfMsg( "currentrev" ) );
}
if ( $wgUser->getNewtalk() ) {
- # do not show "You have new messages" text when we are viewing our
- # own talk page
-
+ # 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()))) {
+ $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) {
$n =$wgUser->getName();
$tl = $this->makeKnownLink( $wgLang->getNsText(
- Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
- wfMsg("newmessageslink") );
- $s.=" | <strong>". str_replace( "$1", $tl, wfMsg("newmessages") ) . "</strong>";
+ Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
+ wfMsg("newmessageslink") );
+ $s.=" | <strong>". wfMsg( "newmessages", $tl ) . "</strong>";
}
}
if( $wgUser->isSysop() &&
- ($n = $wgTitle->isDeleted() ) ) {
- $s .= " | <strong>" . wfMsg( "thisisdeleted",
+ (($wgTitle->getArticleId() == 0) || ($action == "history")) &&
+ ($n = $wgTitle->isDeleted() ) ) {
+ $s .= " | " . wfMsg( "thisisdeleted",
$this->makeKnownLink(
- $wgLang->SpecialPage( "Undelete/" . $wgTitle->getText() ),
- wfMsg( "restorelink", $n ) ) ) . "</strong>";
+ $wgLang->SpecialPage( "Undelete/" . $wgTitle->getPrefixedDBkey() ),
+ wfMsg( "restorelink", $n ) ) );
}
return $s;
}
function printableLink()
{
- global $wgOut, $wgTitle, $oldid, $action;
-
- if ( "history" == $action ) { $q = "action=history&"; }
- else { $q = ""; }
+ global $wgOut, $wgFeedClasses, $wgRequest;
- $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
- WfMsg( "printableversion" ), "{$q}printable=yes" );
+ $baseurl = $_SERVER['REQUEST_URI'];
+ if( strpos( "?", $baseurl ) == false ) {
+ $baseurl .= "?";
+ } else {
+ $baseurl .= "&";
+ }
+ $baseurl = htmlspecialchars( $baseurl );
+ $printurl = $wgRequest->escapeAppendQuery( "printable=yes" );
+
+ $s = "<a href=\"$printurl\">" . wfMsg( "printableversion" ) . "</a>";
+ if( $wgOut->isSyndicated() ) {
+ foreach( $wgFeedClasses as $format => $class ) {
+ $feedurl = $wgRequest->escapeAppendQuery( "feed=$format" );
+ $s .= " | <a href=\"$feedurl\">{$format}</a>";
+ }
+ }
return $s;
}
global $wgOut,$wgTitle,$wgNamespacesWithSubpages;
$sub = $wgOut->getSubtitle();
- if ( "" == $sub ) { $sub = wfMsg( "fromwikipedia" ); }
+ if ( "" == $sub ) {
+ global $wgExtraSubtitle;
+ $sub = wfMsg( "fromwikipedia" ) . $wgExtraSubtitle;
+ }
if($wgOut->isArticle() && $wgNamespacesWithSubpages[$wgTitle->getNamespace()]) {
- $ptext=$wgTitle->getPrefixedText();
- if(preg_match("/\//",$ptext)) {
- $sub.="</p><p class='subpages'>";
+ $ptext=$wgTitle->getPrefixedText();
+ if(preg_match("/\//",$ptext)) {
+ $sub.="</p><p class='subpages'>";
$links=explode("/",$ptext);
$c=0;
$growinglink="";
foreach($links as $link) {
$c++;
- if ($c<count($links)) {
- $growinglink.=$link;
- $getlink=$this->makeLink($growinglink,$link);
+ if ($c<count($links)) {
+ $growinglink .= $link;
+ $getlink = $this->makeLink( $growinglink, $link );
if(preg_match("/class='new'/i",$getlink)) { break; } # this is a hack, but it saves time
- if ($c>1) {
+ if ($c>1) {
$sub .= " | ";
} else {
$sub .="< ";
}
}
}
- $s = "<p class='subtitle'>{$sub}\n";
+ $s = "<p class='subtitle'>{$sub}\n";
return $s;
}
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(
+ $tl = $this->makeKnownLink( $wgLang->getNsText(
Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
$wgLang->getNsText( Namespace::getTalk( 0 ) ) );
{
global $search;
- $s = "<form name='search' class='inline' method=get action=\""
+ $s = "<form name='search' class='inline' method=post action=\""
. wfLocalUrl( "" ) . "\">"
. "<input type=text name=\"search\" size=19 value=\""
. htmlspecialchars(substr($search,0,256)) . "\">\n"
. "<input type=submit name=\"go\" value=\"" . wfMsg ("go") . "\"> "
- . "<input type=submit value=\"" . wfMsg ("search") . "\"></form>";
+ . "<input type=submit name=\"fulltext\" value=\"" . wfMsg ("search") . "\"></form>";
return $s;
}
$s = $this->mainPageLink() . $sep
. $this->specialLink( "recentchanges" );
- if ( $wgOut->isArticle() ) {
+ if ( $wgOut->isArticleRelated() ) {
$s .= $sep . $this->editThisPage()
. $sep . $this->historyLink();
}
$sep = " |\n";
$s = "";
- if ( $wgOut->isArticle() ) {
+ if ( $wgOut->isArticleRelated() ) {
$s .= "<strong>" . $this->editThisPage() . "</strong>";
if ( 0 != $wgUser->getID() ) {
$s .= $sep . $this->watchThisPage();
if ( $wgDisableCounters ) {
$s = "";
} else {
- $count = $wgArticle->getCount();
- $s = str_replace( "$1", $count, wfMsg( "viewcount" ) );
+ $count = $wgLang->formatNum( $wgArticle->getCount() );
+ $s = wfMsg( "viewcount", $count );
}
$s .= $this->lastModified();
$s .= " " . wfMsg( "gnunote" );
- return "<span id='pagestats'>{$s}</span>";
+ return $s;
}
function lastModified()
global $wgLang, $wgArticle;
$d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true );
- $s = " " . str_replace( "$1", $d, wfMsg( "lastmodified" ) );
+ $s = " " . wfMsg( "lastmodified", $d );
return $s;
}
{
if ( "" != $align ) { $a = " align='{$align}'"; }
else { $a = ""; }
-
+
$mp = wfMsg( "mainpage" );
- $s = "<a href=\"" . wfLocalUrlE( $mp ) . "\"><img{$a} border=0 src=\""
- . $this->getLogo() . "\" alt=\"" . "[{$mp}]\"></a>";
+ $titleObj = Title::newFromText( $mp );
+ $s = "<a href=\"" . $titleObj->escapeLocalURL()
+ . "\"><img{$a} border=0 src=\""
+ . $this->getLogo() . "\" alt=\"" . "[{$mp}]\" /></a>";
return $s;
}
function quickBar()
{
global $wgOut, $wgTitle, $wgUser, $action, $wgLang;
- global $wpPreview;
- wfProfileIn( "Skin::quickBar" );
+ global $wpPreview, $wgDisableUploads, $wgRemoteUploads;
+
+ $fname = "Skin::quickBar";
+ wfProfileIn( $fname );
+
$tns=$wgTitle->getNamespace();
$s = "\n<div id='quickbar'>";
}
// only show watchlist link if logged in
- if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ;
- $s .= "\n<br><hr class='sep'>";
+ if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ;
+ $s .= "\n<br><hr class='sep'>";
$articleExists = $wgTitle->getArticleId();
- if ( $wgOut->isArticle() || $action =="edit" || $action =="history" || $wpPreview) {
-
+ if ( $wgOut->isArticle() || $action =="edit" || $action =="history" || $wpPreview) {
if($wgOut->isArticle()) {
$s .= "<strong>" . $this->editThisPage() . "</strong>";
} else { # backlink to the article in edit or history mode
if ($nstext = $wgLang->getNsText($tns) ) { # add namespace if necessary
$link = $nstext . ":" . $link ;
}
- $s .= $this->makeLink($link, $text );
+
+ $s .= $this->makeLink( $link, $text );
} elseif( $wgTitle->getNamespace() != Namespace::getSpecial() ) {
# we just throw in a "New page" text to tell the user that he's in edit mode,
# and to avoid messing with the separator that is prepended to the next item
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" )
- {$s .= $sep . $this->watchThisPage(); }
- if ( $wgTitle->userCanEdit() ) $s .= $sep . $this->moveThisPage();
+ if($action!="edit" && $action != "submit" )
+ {
+ $s .= $sep . $this->watchThisPage();
+ }
+ if ( $wgTitle->userCanEdit() )
+ $s .= $sep . $this->moveThisPage();
}
if ( $wgUser->isSysop() and $articleExists ) {
$s .= $sep . $this->deleteThisPage() .
$sep . $this->protectThisPage();
}
$s .= $sep . $this->talkLink();
- if ($articleExists && $action !="history") { $s .= $sep . $this->historyLink();}
+ if ($articleExists && $action !="history") {
+ $s .= $sep . $this->historyLink();
+ }
$s.=$sep . $this->whatLinksHere();
- if($wgOut->isArticle()) {
+ if($wgOut->isArticleRelated()) {
$s .= $sep . $this->watchPageLinksLink();
}
$s .= "\n<br><hr class='sep'>";
}
- if ( 0 != $wgUser->getID() ) {
+ if ( 0 != $wgUser->getID() && ( !$wgDisableUploads || $wgRemoteUploads ) ) {
$s .= $this->specialLink( "upload" ) . $sep;
}
$s .= $this->specialLink( "specialpages" )
. $sep . $this->bugReportsLink();
-
+
+ global $wgSiteSupportPage;
+ if( $wgSiteSupportPage ) {
+ $s .= "\n<br><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
+ "\" class=\"internal\">" . wfMsg( "sitesupport" ) . "</a>";
+ }
+
$s .= "\n<br></div>\n";
- wfProfileOut();
+ wfProfileOut( $fname );
return $s;
}
return $s;
}
+
+ function disclaimerLink()
+ {
+ $s = $this->makeKnownLink( wfMsg( "disclaimerpage" ),
+ wfMsg( "disclaimers" ) );
+ return $s;
+ }
+
function editThisPage()
{
global $wgOut, $wgTitle, $oldid, $redirect, $diff;
- if ( ! $wgOut->isArticle() || $diff ) {
+ if ( ! $wgOut->isArticleRelated() ) {
$s = wfMsg( "protectedpage" );
- } else if ( $wgTitle->userCanEdit() ) {
+ } else {
$n = $wgTitle->getPrefixedText();
- $t = wfMsg( "editthispage" );
+ if ( $wgTitle->userCanEdit() ) {
+ $t = wfMsg( "editthispage" );
+ } else {
+ #$t = wfMsg( "protectedpage" );
+ $t = wfMsg( "viewsource" );
+ }
$oid = $red = "";
if ( $redirect ) { $red = "&redirect={$redirect}"; }
$oid = "&oldid={$oldid}";
}
$s = $this->makeKnownLink( $n, $t, "action=edit{$oid}{$red}" );
- } else {
- $s = wfMsg( "protectedpage" );
}
return $s;
}
$s = $this->makeKnownLink( $n, $t, "action=delete" );
} else {
- $s = wfMsg( "error" );
+ $s = "";
}
return $s;
}
}
$s = $this->makeKnownLink( $n, $t, $q );
} else {
- $s = wfMsg( "error" );
+ $s = "";
}
return $s;
}
{
global $wgUser, $wgOut, $wgTitle, $diff;
- if ( $wgOut->isArticle() && ( ! $diff ) ) {
+ if ( $wgOut->isArticleRelated() ) {
$n = $wgTitle->getPrefixedText();
if ( $wgTitle->userIsWatching() ) {
global $wgTitle, $wgLang;
$s = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
- wfMsg( "contributions" ), "target=" . $wgTitle->getURL() );
+ wfMsg( "contributions" ), "target=" . $wgTitle->getPartialURL() );
return $s;
}
global $wgTitle, $wgLang;
$s = $this->makeKnownLink( $wgLang->specialPage( "Emailuser" ),
- wfMsg( "emailuser" ), "target=" . $wgTitle->getURL() );
+ wfMsg( "emailuser" ), "target=" . $wgTitle->getPartialURL() );
return $s;
}
{
global $wgOut, $wgTitle, $wgLang;
- if ( ! $wgOut->isArticle() ) {
+ if ( ! $wgOut->isArticleRelated() ) {
$s = "(" . wfMsg( "notanarticle" ) . ")";
} else {
$s = $this->makeKnownLink( $wgLang->specialPage(
function otherLanguages()
{
- global $wgOut, $wgLang, $wgTitle , $wgUseNewInterlanguage ;
+ global $wgOut, $wgLang, $wgTitle, $wgUseNewInterlanguage;
$a = $wgOut->getLanguageLinks();
+ # TEST THIS @@@
if ( 0 == count( $a ) ) {
if ( !$wgUseNewInterlanguage ) return "";
$ns = $wgLang->getNsIndex ( $wgTitle->getNamespace () ) ;
if ( $ns != 0 AND $ns != 1 ) return "" ;
- $pn = "Intl" ;
+ $pn = "Intl" ;
$x = "mode=addlink&xt=".$wgTitle->getDBkey() ;
return $this->makeKnownLink( $wgLang->specialPage( $pn ),
wfMsg( "intl" ) , $x );
wfMsg( "otherlanguages" ) , $x ) . ": " ;
}
+ $s = wfMsg( "otherlanguages" ) . ": ";
$first = true;
if($wgLang->isRTL()) $s .= "<span dir='LTR'>";
foreach( $a as $l ) {
return $s;
}
+ function commentLink()
+ {
+ global $wgLang, $wgTitle, $wgLinkCache;
+
+ $tns = $wgTitle->getNamespace();
+ if ( -1 == $tns ) { return ""; }
+
+ $lns = ( Namespace::isTalk( $tns ) ) ? $tns : Namespace::getTalk( $tns );
+
+ # assert Namespace::isTalk( $lns )
+
+ $n = $wgLang->getNsText( $lns );
+ $pn = $wgTitle->getText();
+
+ $link = "{$n}:{$pn}";
+
+ $wgLinkCache->suspend();
+ $s = $this->makeKnownLink($link, wfMsg("postcomment"), "action=edit§ion=new");
+ $wgLinkCache->resume();
+
+ return $s;
+ }
+
# After all the page content is transformed into HTML, it makes
# a final pass through here for things like table backgrounds.
#
function transformContent( $text )
- {
+ {
return $text;
}
# Note: This function MUST call getArticleID() on the link,
# otherwise the cache won't get updated properly. See LINKCACHE.DOC.
#
- function makeLink( $title, $text= "", $query = "", $trail = "" )
- {
- global $wgOut, $wgUser;
+ function makeLink( $title, $text = "", $query = "", $trail = "" ) {
+ wfProfileIn( "Skin::makeLink" );
+ $nt = Title::newFromText( $title );
+ if ($nt) {
+ $result = $this->makeLinkObj( Title::newFromText( $title ), $text, $query, $trail );
+ } else {
+ wfDebug( "Invalid title passed to Skin::makeLink(): \"$title\"\n" );
+ $result = $text == "" ? $title : $text;
+ }
+
+ wfProfileOut( "Skin::makeLink" );
+ return $result;
+ }
+
+ function makeKnownLink( $title, $text = "", $query = "", $trail = "" ) {
+ $nt = Title::newFromText( $title );
+ if ($nt) {
+ return $this->makeKnownLinkObj( Title::newFromText( $title ), $text, $query, $trail );
+ } else {
+ wfDebug( "Invalid title passed to Skin::makeKnownLink(): \"$title\"\n" );
+ return $text == "" ? $title : $text;
+ }
+ }
+ function makeBrokenLink( $title, $text = "", $query = "", $trail = "" ) {
$nt = Title::newFromText( $title );
+ if ($nt) {
+ return $this->makeBrokenLinkObj( Title::newFromText( $title ), $text, $query, $trail );
+ } else {
+ wfDebug( "Invalid title passed to Skin::makeBrokenLink(): \"$title\"\n" );
+ return $text == "" ? $title : $text;
+ }
+ }
+
+ function makeStubLink( $title, $text = "", $query = "", $trail = "" ) {
+ $nt = Title::newFromText( $title );
+ if ($nt) {
+ return $this->makeStubLinkObj( Title::newFromText( $title ), $text, $query, $trail );
+ } else {
+ wfDebug( "Invalid title passed to Skin::makeStubLink(): \"$title\"\n" );
+ return $text == "" ? $title : $text;
+ }
+ }
+ # Pass a title object, not a title string
+ function makeLinkObj( &$nt, $text= "", $query = "", $trail = "", $prefix = "" )
+ {
+ global $wgOut, $wgUser;
if ( $nt->isExternal() ) {
$u = $nt->getFullURL();
if ( "" == $text ) { $text = $nt->getPrefixedText(); }
$trail = $m[2];
}
}
- return "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
- }
- if ( 0 == $nt->getNamespace() && "" == $nt->getText() ) {
- return $this->makeKnownLink( $title, $text, $query, $trail );
- }
- if ( ( -1 == $nt->getNamespace() ) ||
+ $retVal = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
+ } elseif ( 0 == $nt->getNamespace() && "" == $nt->getText() ) {
+ $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix );
+ } elseif ( ( -1 == $nt->getNamespace() ) ||
( Namespace::getImage() == $nt->getNamespace() ) ) {
- return $this->makeKnownLink( $title, $text, $query, $trail );
- }
- $aid = $nt->getArticleID() ;
- if ( 0 == $aid ) {
- return $this->makeBrokenLink( $title, $text, $query, $trail );
+ $retVal = $this->makeKnownLinkObj( $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}'" ) ;
-
- if ( wfNumRows( $res ) > 0 ) {
- $s = wfFetchObject( $res );
- $size = $s->x;
- if ( $s->cur_is_redirect OR $s->cur_namespace != 0 )
+ $aid = $nt->getArticleID() ;
+ if ( 0 == $aid ) {
+ $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail, $prefix );
+ } else {
+ $threshold = $wgUser->getOption("stubthreshold") ;
+ if ( $threshold > 0 ) {
+ $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 );
+ $size = $s->x;
+ if ( $s->cur_is_redirect OR $s->cur_namespace != 0 ) {
+ $size = $threshold*2 ; # Really big
+ }
+ wfFreeResult( $res );
+ } else {
$size = $threshold*2 ; # Really big
- wfFreeResult( $res );
- } else $size = $threshold*2 ; # Really big
- } else $size = 1 ;
-
- if ( $size < $threshold )
- return $this->makeStubLink( $title, $text, $query, $trail );
- return $this->makeKnownLink( $title, $text, $query, $trail );
+ }
+ } else {
+ $size = 1 ;
+ }
+ if ( $size < $threshold ) {
+ $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail, $prefix );
+ } else {
+ $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix );
+ }
+ }
}
+ return $retVal;
}
- function makeKnownLink( $title, $text = "", $query = "", $trail = "" )
+ # Pass a title object, not a title string
+ function makeKnownLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" )
{
global $wgOut, $wgTitle;
- $nt = Title::newFromText( $title );
+ $fname = "Skin::makeKnownLinkObj";
+ wfProfileIn( $fname );
+
$link = $nt->getPrefixedURL();
if ( "" == $link ) {
$u = "";
if ( "" == $text ) { $text = $nt->getFragment(); }
} else {
- $u = wfLocalUrlE( $link, $query );
+ $u = $nt->escapeLocalURL( $query );
}
if ( "" != $nt->getFragment() ) {
$u .= "#" . wfEscapeHTML( $nt->getFragment() );
}
if ( "" == $text ) { $text = $nt->getPrefixedText(); }
- $style = $this->getInternalLinkAttributes( $link, $text );
+ $style = $this->getInternalLinkAttributesObj( $nt, $text );
$inside = "";
if ( "" != $trail ) {
- if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
+ if ( preg_match( $this->linktrail, $trail, $m ) ) {
$inside = $m[1];
$trail = $m[2];
}
}
- $r = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
+ $r = "<a href=\"{$u}\"{$style}>{$prefix}{$text}{$inside}</a>{$trail}";
+ wfProfileOut( $fname );
return $r;
}
-
- function makeBrokenLink( $title, $text = "", $query = "", $trail = "" )
+
+ # Pass a title object, not a title string
+ function makeBrokenLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" )
{
global $wgOut, $wgUser;
+
+ $fname = "Skin::makeBrokenLinkObj";
+ wfProfileIn( $fname );
- $nt = Title::newFromText( $title );
- $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->getInternalLinkAttributes( $link, $text, "yes" );
+ $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 = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
+ if ( $wgUser->getOption( "highlightbroken" ) ) {
+ $s = "<a href=\"{$u}\"{$style}>{$prefix}{$text}{$inside}</a>{$trail}";
} else {
- $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>?</a>{$trail}";
+ $s = "{$prefix}{$text}{$inside}<a href=\"{$u}\"{$style}>?</a>{$trail}";
}
+
+ wfProfileOut( $fname );
return $s;
}
+
+ # Pass a title object, not a title string
+ function makeStubLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" )
+ {
+ global $wgOut, $wgUser;
- function makeStubLink( $title, $text = "", $query = "", $trail = "" )
- {
- global $wgOut, $wgUser;
-
- $nt = Title::newFromText( $title );
- $link = $nt->getPrefixedURL();
+ $link = $nt->getPrefixedURL();
- $u = wfLocalUrlE( $link, $query );
+ $u = $nt->escapeLocalURL( $query );
- if ( "" == $text ) { $text = $nt->getPrefixedText(); }
- $style = $this->getInternalLinkAttributes( $link, $text, "stub" );
+ if ( "" == $text ) { $text = $nt->getPrefixedText(); }
+ $style = $this->getInternalLinkAttributesObj( $nt, $text, "stub" );
- $inside = "";
- if ( "" != $trail ) {
- if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
- $inside = $m[1];
- $trail = $m[2];
- }
- }
- if ( $wgOut->isPrintable() ||
- ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
- $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
- } else {
- $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>!</a>{$trail}";
- }
- return $s;
- }
+ $inside = "";
+ if ( "" != $trail ) {
+ if ( preg_match( $this->linktrail, $trail, $m ) ) {
+ $inside = $m[1];
+ $trail = $m[2];
+ }
+ }
+ if ( $wgUser->getOption( "highlightbroken" ) ) {
+ $s = "<a href=\"{$u}\"{$style}>{$prefix}{$text}{$inside}</a>{$trail}";
+ } else {
+ $s = "{$prefix}{$text}{$inside}<a href=\"{$u}\"{$style}>!</a>{$trail}";
+ }
+ return $s;
+ }
function fnamePart( $url )
{
global $wgOut;
if ( "" == $alt ) { $alt = $this->fnamePart( $url ); }
- $s = "<img src=\"{$url}\" alt=\"{$alt}\">";
+ $s = "<img src=\"{$url}\" alt=\"{$alt}\" />";
return $s;
}
+
+ function makeImageLink( $name, $url, $alt = "" ) {
+ $nt = Title::makeTitle( Namespace::getImage(), $name );
+ return $this->makeImageLinkObj( $nt, $alt );
+ }
+
+ function makeImageLinkObj( $nt, $alt = "" ) {
+ 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 = "<center>";
+ $postfix = "</center>";
+ $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 );
- function makeImageLink( $name, $url, $alt = "" )
- {
- global $wgOut, $wgTitle, $wgLang;
+ $u = $nt->escapeLocalURL();
+ if ( $url == "" )
+ {
+ $s = str_replace( "$1", $name, wfMsg("missingimage") );
+ } else {
+ $s = "\n <a href=\"{$u}\" class='image' title=\"{$alt}\">\n" .
+ " <img border=\"0\" src=\"{$url}\" alt=\"{$alt}\" />\n </a>";
+ }
+ if ( "" != $align ) {
+ $s = "<div class=\"float{$align}\">{$s}\n</div>";
+ }
+ 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);
+ }
- $nt = Title::newFromText( $wgLang->getNsText(
- Namespace::getImage() ) . ":{$name}" );
- $link = $nt->getPrefixedURL();
- if ( "" == $alt ) { $alt = $name; }
+ 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, $wgLang;
+ $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" ) );
+ $magnifyalign = $wgLang->isRTL() ? "left" : "right";
+ $textalign = $wgLang->isRTL() ? " style=\"text-align:right\"" : "";
- $u = wfLocalUrlE( $link );
- $s = "<a href=\"{$u}\" class='image' title=\"{$alt}\">" .
- "<img border=0 src=\"{$url}\" alt=\"{$alt}\"></a>";
+ $s = "<div class=\"thumbnail-{$align}\" style=\"width:{$boxwidth}px;\">";
+ if ( $thumbUrl == "" ) {
+ $s .= str_replace( "$1", $name, wfMsg("missingimage") );
+ } else {
+ $s .= "\n".' <a href="'.$u.'" class="internal" title="'.$alt.'">'."\n".
+ ' <img border="0" src="'.$thumbUrl.'" alt="'.$alt.'" ' .
+ ' width="'.$boxwidth.'" height="'.$boxheight.'" /></a>' ."\n".
+ ' <a href="'.$u.'" class="internal" title="'.$more.'"> ' ."\n".
+ ' <img border="0" src="'.$wgUploadPath.'/magnify-clip.png" ' .
+ 'width="26" height="24" align="'.$magnifyalign.'" alt="'.$more.'" /> </a>'."\n";
+ }
+ $s .= ' <p'.$textalign.'>'.$label."</p>\n</div>";
return $s;
}
- function makeMediaLink( $name, $url, $alt = "" )
+ function makeMediaLink( $name, $url, $alt = "" ) {
+ $nt = Title::makeTitle( Namespace::getMedia(), $name );
+ return $this->makeMediaLinkObj( $nt, $alt );
+ }
+
+ function makeMediaLinkObj( $nt, $alt = "" )
{
- global $wgOut, $wgTitle;
+ $name = $nt->getDBKey();
+ $url = wfImageUrl( $name );
+ if ( empty( $alt ) ) {
+ $alt = preg_replace( '/\.(.+?)^/', '', $name );
+ }
- if ( "" == $alt ) { $alt = $name; }
- $u = wfEscapeHTML( $url );
+ $u = htmlspecialchars( $url );
$s = "<a href=\"{$u}\" class='internal' title=\"{$alt}\">{$alt}</a>";
return $s;
}
# 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 "";
}
- function beginHistoryList()
- {
- $this->lastdate = $this->lastline = "";
- $s = "\n<p>" . wfMsg( "histlegend" ) . "\n<ul>";
- return $s;
- }
-
function beginImageHistoryList()
{
$s = "\n<h2>" . wfMsg( "imghistory" ) . "</h2>\n" .
- "<p>" . wfMsg( "imghistlegend" ) . "\n<ul>";
+ "<p>" . wfMsg( "imghistlegend" ) . "\n<ul class='special'>";
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() ;
return $s;
}
- function endHistoryList()
- {
- $last = wfMsg( "last" );
-
- $s = preg_replace( "/!OLDID![0-9]+!/", $last, $this->lastline );
- $s .= "</ul>\n";
- return $s;
- }
-
- function endImageHistoryList()
+ # Enhanced RC ungrouped line
+ function recentChangesBlockLine ( $rcObj )
{
- $s = "</ul>\n";
- return $s;
- }
-
- function historyLine( $ts, $u, $ut, $ns, $ttl, $oid, $c, $isminor )
- {
- global $wgLang;
-
- $artname = Title::makeName( $ns, $ttl );
- $last = wfMsg( "last" );
- $cur = wfMsg( "cur" );
- $cr = wfMsg( "currentrev" );
-
- if ( $oid && $this->lastline ) {
- $ret = preg_replace( "/!OLDID!([0-9]+)!/", $this->makeKnownLink(
- $artname, $last, "diff=\\1&oldid={$oid}" ), $this->lastline );
- } else {
- $ret = "";
- }
- $dt = $wgLang->timeanddate( $ts, true );
-
- if ( $oid ) { $q = "oldid={$oid}"; }
- else { $q = ""; }
- $link = $this->makeKnownLink( $artname, $dt, $q );
-
- if ( 0 == $u ) {
- $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
- $ut, "target=" . $ut );
- } else { $ul = $this->makeLink( $wgLang->getNsText(
- Namespace::getUser() ) . ":{$ut}", $ut ); }
-
- $s = "<li>";
- if ( $oid ) {
- $curlink = $this->makeKnownLink( $artname, $cur,
- "diff=0&oldid={$oid}" );
+ global $wgUploadPath, $wgLang ;
+
+ # Get rc_xxxx variables
+ extract( $rcObj->mAttribs ) ;
+ $curIdEq = "curid=$rc_cur_id";
+
+ # Spacer image
+ $r = "" ;
+ $r .= "<img src='{$wgUploadPath}/Arr_.png' width='12' height='12' border='0' />" ; $r .= "<tt>" ;
+
+ if ( $rc_type == RC_MOVE ) {
+ $r .= " ";
} else {
- $curlink = $cur;
+ # 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 .= " " ;
+ }
}
- $s .= "({$curlink}) (!OLDID!{$oid}!) . .";
-
- $M = wfMsg( "minoreditletter" );
- if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
- $s .= " {$link} . . {$ul}";
-
- if ( "" != $c && "*" != $c ) { $s .= " <em>(" . wfEscapeHTML($c) . ")</em>"; }
- $s .= "</li>\n";
-
- $this->lastline = $s;
- return $ret;
- }
-
- function recentChangesBlockLine ( $y ) {
- global $wgUploadPath ;
-
- $M = wfMsg( "minoreditletter" );
- $N = wfMsg( "newpageletter" );
- $r = "" ;
- $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>" ;
- $r .= "<tt>" ;
- if ( $y->isnew ) $r .= $N ;
- else $r .= " " ;
- if ( $y->isminor ) $r .= $M ;
- else $r .= " " ;
- $r .= " ".$y->timestamp." " ;
+
+ # Timestamp
+ $r .= " ".$rcObj->timestamp." " ;
$r .= "</tt>" ;
- $link = $y->link ;
- if ( $y->watched ) $link = "<strong>{$link}</strong>" ;
+
+ # Article link
+ $link = $rcObj->link ;
+ if ( $rcObj->watched ) $link = "<strong>{$link}</strong>" ;
$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 .= " <em>(".wfEscapeHTML($y->usercomment).")</em>" ;
+ # User/talk
+ $r .= ") . . ".$rcObj->userlink ;
+ $r .= $rcObj->usertalklink ;
+
+ # Comment
+ if ( $rc_comment != "" && $rc_type != RC_MOVE ) {
+ $r .= $wgLang->emphasize( " (".wfEscapeHTML($rc_comment).")" );
+ }
$r .= "<br>\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 = " <font size='-1'>[".implode("; ",$users)."]</font>" ;
- $e = $y ;
- $e = array_shift ( $e ) ;
-
# Arrow
- $rci = "RCI{$this->rccc}" ;
- $rcl = "RCL{$this->rccc}" ;
- $rcm = "RCM{$this->rccc}" ;
- $tl = "<a href='javascript:toggleVisibility(\"{$rci}\",\"{$rcm}\",\"{$rcl}\")'>" ;
- $tl .= "<span id='{$rcm}'><img src='{$wgUploadPath}/Arr_r.png' width=12 height=12 border=0></span>" ;
- $tl .= "<span id='{$rcl}' style='display:none'><img src='{$wgUploadPath}/Arr_d.png' width=12 height=12 border=0></span>" ;
- $tl .= "</a>" ;
+ $rci = "RCI{$this->rcCacheIndex}" ;
+ $rcl = "RCL{$this->rcCacheIndex}" ;
+ $rcm = "RCM{$this->rcCacheIndex}" ;
+ $toggleLink = "javascript:toggleVisibility(\"{$rci}\",\"{$rcm}\",\"{$rcl}\")" ;
+ $arrowdir = $wgLang->isRTL() ? "l" : "r";
+ $tl = "<span id='{$rcm}'><a href='$toggleLink'><img src='{$wgUploadPath}/Arr_{$arrowdir}.png' width='12' height='12' border='0' /></a></span>" ;
+ $tl .= "<span id='{$rcl}' style='display:none'><a href='$toggleLink'><img src='{$wgUploadPath}/Arr_d.png' width='12' height='12' border='0' /></a></span>" ;
$r .= $tl ;
# Main line
+ # M/N
$r .= "<tt>" ;
if ( $isnew ) $r .= $N ;
else $r .= " " ;
$r .= " " ; # Minor
- $r .= " ".$e->timestamp." " ;
- $r .= "</tt>" ;
- $link = $e->link ;
- if ( $e->watched ) $link = "<strong>{$link}</strong>" ;
+ # Timestamp
+ $r .= " ".$block[0]->timestamp." " ;
+ $r .= "</tt>" ;
+
+ # Article link
+ $link = $block[0]->link ;
+ if ( $block[0]->watched ) $link = "<strong>{$link}</strong>" ;
$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 .= "<br>\n" ;
# Sub-entries
$r .= "<div id='{$rci}' style='display:none'>" ;
- foreach ( $y AS $x )
- {
- $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>";
+ foreach ( $block AS $rcObj ) {
+ # Get rc_xxxx variables
+ extract( $rcObj->mAttribs );
+
+ $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0 />";
$r .= "<tt> " ;
- if ( $x->isnew ) $r .= $N ;
+ if ( $rc_new ) $r .= $N ;
else $r .= " " ;
- if ( $x->isminor ) $r .= $M ;
+ if ( $rc_minor ) $r .= $M ;
else $r .= " " ;
$r .= "</tt>" ;
$o = "" ;
- if ( $x->oldid != 0 ) $o = "oldid=".$x->oldid ;
- if ( $x->islog ) $link = $x->timestamp ;
- else $link = $this->makeKnownLink( $x->secureName, $x->timestamp , $o ) ;
+ if ( $rc_last_oldid != 0 ) {
+ $o = "oldid=".$rc_last_oldid ;
+ }
+ if ( $rc_type == RC_LOG ) {
+ $link = $rcObj->timestamp ;
+ } else {
+ $link = $this->makeKnownLinkObj( $rcObj->getTitle(), $rcObj->timestamp , "{$curIdEq}&$o" ) ;
+ }
$link = "<tt>{$link}</tt>" ;
-
$r .= $link ;
$r .= " (" ;
- $r .= $x->curlink ;
+ $r .= $rcObj->curlink ;
$r .= "; " ;
- $r .= $x->lastlink ;
- $r .= ") . . ".$x->userlink ;
- $r .= $x->usertalklink ;
- if ( $x->usercomment != "" )
- $r .= " <em>(".wfEscapeHTML($x->usercomment).")</em>" ;
- $r .= "<br>\n" ;
+ $r .= $rcObj->lastlink ;
+ $r .= ") . . ".$rcObj->userlink ;
+ $r .= $rcObj->usertalklink ;
+ if ( $rc_comment != "" ) {
+ $r .= $wgLang->emphasize( " (".wfEscapeHTML($rc_comment).")" ) ;
}
+ $r .= "<br>\n" ;
+ }
$r .= "</div>\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 "<div align=left>{$r}</div>" ;
+ return "<div>{$blockOut}</div>" ;
}
- 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 .= "</ul>\n"; }
- $s .= "<h4>{$d}</h4>\n<ul>";
- $this->lastdate = $d;
+ $s .= "<h4>{$date}</h4>\n<ul class='special'>";
+ $this->lastdate = $date;
}
- $h = $wgLang->time( $ts, true );
- $t = Title::makeName( $ns, $ttl );
- $clink = $this->makeKnownLink( $t , "" );
- $nt = Title::newFromText( $t );
+ $s .= "<li> ";
+
+ if ( $rc_type == RC_MOVE ) {
+ # Diff
+ $s .= "(" . wfMsg( "diff" ) . ") (";
+ # Hist
+ $s .= $this->makeKnownLinkObj( $rc->getMovedToTitle(), wfMsg( "hist" ), "action=history" ) .
+ ") . . ";
+
+ # "[[x]] moved to [[y]]"
- if ( $watched ) {
- $clink = "<strong>{$clink}</strong>";
- }
- $hlink = $this->makeKnownLink( $t, wfMsg( "hist" ), "action=history" );
- if ( $isnew || $nt->isLog() ) {
- $dlink = wfMsg( "diff" );
- } else {
- $dlink = $this->makeKnownLink( $t, wfMsg( "diff" ),
- "diff={$oldid}&oldid={$diffid}" ); # Finagle's law
- }
- if ( 0 == $u ) {
- $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
- $ut, "target=" . $ut );
- } else { $ul = $this->makeLink( $wgLang->getNsText(
- Namespace::getUser() ) . ":{$ut}", $ut ); }
-
- $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
- $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
- $utl= $this->makeLink($utns . ":{$ut}", $talkname );
- $cr = wfMsg( "currentrev" );
+ $s .= wfMsg( "1movedto2", $this->makeKnownLinkObj( $rc->getTitle(), "", "redirect=no" ),
+ $this->makeKnownLinkObj( $rc->getMovedToTitle(), "" ) );
- $s .= "<li> ({$dlink}) ({$hlink}) . .";
- $M = wfMsg( "minoreditletter" );
- $N = wfMsg( "newpageletter" );
- if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
- if ( $isnew ) { $s .= "<strong>{$N}</strong>"; }
- $s .= " {$clink}; {$h} . . {$ul}";
-
- $blink="";
- if ( ( 0 == $u ) && $wgUser->isSysop() ) {
- $blink = $this->makeKnownLink( $wgLang->specialPage(
- "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
+ } else {
+ # Diff link
+ if ( $rc_type == RC_NEW || $rc_type == RC_LOG ) {
+ $diffLink = wfMsg( "diff" );
+ } else {
+ $diffLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( "diff" ),
+ "{$curIdEq}&diff={$rc_this_oldid}&oldid={$rc_last_oldid}" );
+ }
+ $s .= "($diffLink) (";
+ # History link
+ $s .= $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( "hist" ), "{$curIdEq}&action=history" );
+ $s .= ") . . ";
+
+ # M and N (minor and new)
+ $M = wfMsg( "minoreditletter" );
+ $N = wfMsg( "newpageletter" );
+ if ( $rc_minor ) { $s .= " <strong>{$M}</strong>"; }
+ if ( $rc_type == RC_NEW ) { $s .= "<strong>{$N}</strong>"; }
+
+ # Article link
+ $articleLink = $this->makeKnownLinkObj( $rc->getTitle(), "" );
+
+ if ( $watched ) {
+ $articleLink = "<strong>{$articleLink}</strong>";
+ }
+ $s .= " $articleLink";
+
+ }
+
+ # Timestamp
+ $s .= "; " . $wgLang->time( $rc_timestamp, true ) . " . . ";
+
+ # User link (or contributions for unregistered users)
+ if ( 0 == $rc_user ) {
+ $userLink = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
+ $rc_user_text, "target=" . $rc_user_text );
+ } else {
+ $userLink = $this->makeLink( $wgLang->getNsText( NS_USER ) . ":{$rc_user_text}", $rc_user_text );
}
- if(!$blink) {
- $utl = "({$utl})";
+ $s .= $userLink;
+
+ # User talk link
+ $talkname=$wgLang->getNsText(NS_TALK); # use the shorter name
+ global $wgDisableAnonTalk;
+ if( 0 == $rc_user && $wgDisableAnonTalk ) {
+ $userTalkLink = "";
} else {
- $utl = "({$utl} | {$blink})";
+ $utns=$wgLang->getNsText(NS_USER_TALK);
+ $userTalkLink= $this->makeLink($utns . ":{$rc_user_text}", $talkname );
+ }
+ # Block link
+ $blockLink="";
+ if ( ( 0 == $rc_user ) && $wgUser->isSysop() ) {
+ $blockLink = $this->makeKnownLink( $wgLang->specialPage(
+ "Blockip" ), wfMsg( "blocklink" ), "ip={$rc_user_text}" );
+
+ }
+ if($blockLink) {
+ if($userTalkLink) $userTalkLink .= " | ";
+ $userTalkLink .= $blockLink;
}
- $s.=" {$utl}";
+ if($userTalkLink) $s.=" ({$userTalkLink})";
- if ( "" != $c && "*" != $c ) {
- $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
+ # Add comment
+ if ( "" != $rc_comment && "*" != $rc_comment && $rc_type != RC_MOVE ) {
+ $s .= $wgLang->emphasize(" (" . wfEscapeHTML( $rc_comment ) . ")");
}
$s .= "</li>\n";
return $s;
}
-
- function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
+
+# function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
+ function recentChangesLineNew( &$baseRC, $watched = false )
{
global $wgTitle, $wgLang, $wgUser;
- $rc = new RecentChangesClass ;
+ # Create a specialised object
+ $rc = RCCacheEntry::newFromParent( $baseRC ) ;
- $d = $wgLang->date( $ts, true);
- $s = "";
+ # Extract fields from DB into the function scope (rc_xxxx variables)
+ extract( $rc->mAttribs );
+ $curIdEq = "curid=" . $rc_cur_id;
+
+ # If it's a new day, add the headline and flush the cache
+ $date = $wgLang->date( $rc_timestamp, true);
$ret = "" ;
- if ( $d != $this->lastdate ) {
+ if ( $date != $this->lastdate ) {
+ # Process current cache
$ret = $this->recentChangesBlock () ;
$this->rc_cache = array() ;
- $ret .= "<h4>{$d}</h4>\n";
- $this->lastdate = $d;
- }
- $h = $wgLang->time( $ts, true );
- $t = Title::makeName( $ns, $ttl );
- $clink = $this->makeKnownLink( $t, "" ) ;
- if ( $oldid == 0 ) $c2link = $clink ;
- else $c2link = $this->makeKnownLink( $t, "" , "oldid={$oldid}" );
- $nt = Title::newFromText( $t );
-
- $rc->timestamp = $h ;
- $rc->oldid = $oldid ;
- $rc->diffid = $diffid ;
+ $ret .= "<h4>{$date}</h4>\n";
+ $this->lastdate = $date;
+ }
+
+ # Make article link
+ if ( $rc_type == RC_MOVE ) {
+ $clink = $this->makeKnownLinkObj( $rc->getTitle(), "", "redirect=no" );
+ $clink .= " " . wfMsg("movedto") . " ";
+ $clink .= $this->makeKnownLinkObj( $rc->getMovedToTitle(), "" );
+ } else {
+ $clink = $this->makeKnownLinkObj( $rc->getTitle(), "" ) ;
+ }
+
+ $time = $wgLang->time( $rc_timestamp, true );
$rc->watched = $watched ;
- $rc->isnew = $isnew ;
- $rc->isminor = $isminor ;
- $rc->secureName = $t ;
- $rc->displayName = $nt ;
$rc->link = $clink ;
- $rc->usercomment = $c ;
- $rc->islog = $nt->isLog() ;
-
- if ( ( $isnew && $oldid == 0 ) || $nt->isLog() ) {
- $dlink = wfMsg( "cur" );
+ $rc->timestamp = $time;
+
+ # Make "cur" link
+ if ( ( $rc_type == RC_NEW && $rc_this_oldid == 0 ) || $rc_type == RC_LOG || $rc_type == RC_MOVE) {
+ $curLink = wfMsg( "cur" );
} else {
- $dlink = $this->makeKnownLink( $t, wfMsg( "cur" ),
- "diff=0&oldid={$oldid}" );
+ $curLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( "cur" ),
+ "{$curIdEq}&diff=0&oldid={$rc_this_oldid}" );
}
- if ( $diffid == 0 || $nt->isLog() ) {
- $plink = wfMsg( "last" );
+ # Make "last" link
+ $titleObj = $rc->getTitle();
+ if ( $rc_last_oldid == 0 || $rc_type == RC_LOG || $rc_type == RC_MOVE ) {
+ $lastLink = wfMsg( "last" );
} else {
- $plink = $this->makeKnownLink( $t, wfMsg( "last" ),
- "diff={$oldid}&oldid={$diffid}" );
+ $lastLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( "last" ),
+ "{$curIdEq}&diff={$rc_this_oldid}&oldid={$rc_last_oldid}" );
}
- if ( 0 == $u ) {
- $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
- $ut, "target=" . $ut );
- } else { $ul = $this->makeLink( $wgLang->getNsText(
- Namespace::getUser() ) . ":{$ut}", $ut ); }
-
- $rc->userlink = $ul ;
- $rc->lastlink = $plink ;
- $rc->curlink = $dlink ;
+ # Make user link (or user contributions for unregistered users)
+ if ( 0 == $rc_user ) {
+ $userLink = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
+ $rc_user_text, "target=" . $rc_user_text );
+ } else {
+ $userLink = $this->makeLink( $wgLang->getNsText(
+ Namespace::getUser() ) . ":{$rc_user_text}", $rc_user_text );
+ }
- $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
- $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
- $utl= $this->makeLink($utns . ":{$ut}", $talkname );
+ $rc->userlink = $userLink ;
+ $rc->lastlink = $lastLink ;
+ $rc->curlink = $curLink ;
- if ( ( 0 == $u ) && $wgUser->isSysop() ) {
- $blink = $this->makeKnownLink( $wgLang->specialPage(
- "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
- $rc->usertalklink= " ({$utl} | {$blink})";
+ # Make user talk link
+ $utns=$wgLang->getNsText(NS_USER_TALK);
+ $talkname=$wgLang->getNsText(NS_TALK); # use the shorter name
+ $userTalkLink= $this->makeLink($utns . ":{$rc_user_text}", $talkname );
+
+ global $wgDisableAnonTalk;
+ if ( ( 0 == $rc_user ) && $wgUser->isSysop() ) {
+ $blockLink = $this->makeKnownLink( $wgLang->specialPage(
+ "Blockip" ), wfMsg( "blocklink" ), "ip={$rc_user_text}" );
+ if( $wgDisableAnonTalk )
+ $rc->usertalklink = " ({$blockLink})";
+ else
+ $rc->usertalklink = " ({$userTalkLink} | {$blockLink})";
} else {
- $rc->usertalklink=" ({$utl})";
+ if( $wgDisableAnonTalk && ($rc_user == 0) )
+ $rc->usertalklink = "";
+ else
+ $rc->usertalklink = " ({$userTalkLink})";
+ }
+
+ # Put accumulated information into the cache, for later display
+ # Page moves go on their own line
+ $title = $rc->getTitle();
+ $secureName = $title->getPrefixedDBkey();
+ if ( $rc_type == RC_MOVE ) {
+ # Use an @ character to prevent collision with page names
+ $this->rc_cache["@@" . ($this->rcMoveIndex++)] = array($rc);
+ } else {
+ if ( !isset ( $this->rc_cache[$secureName] ) ) $this->rc_cache[$secureName] = array() ;
+ array_push ( $this->rc_cache[$secureName] , $rc ) ;
}
-
- if ( !isset ( $this->rc_cache[$t] ) ) $this->rc_cache[$t] = array() ;
- array_push ( $this->rc_cache[$t] , $rc ) ;
return $ret;
}
+ function endImageHistoryList()
+ {
+ $s = "</ul>\n";
+ return $s;
+ }
function imageHistoryLine( $iscur, $ts, $img, $u, $ut, $size, $c )
{
$url = wfImageUrl( $img );
$rlink = $cur;
if ( $wgUser->isSysop() ) {
- $link = wfLocalUrlE( "", "image=" . $wgTitle->getURL() .
+ $link = $wgTitle->escapeLocalURL( "image=" . $wgTitle->getPartialURL() .
"&action=delete" );
$style = $this->getInternalLinkAttributes( $link, $del );
else { $ul = $this->makeLink( $wgLang->getNsText(
Namespace::getUser() ) . ":{$ut}", $ut ); }
- $nb = str_replace( "$1", $size, wfMsg( "nbytes" ) );
+ $nb = wfMsg( "nbytes", $size );
$style = $this->getInternalLinkAttributes( $url, $dt );
$s = "<li> ({$dlink}) ({$rlink}) <a href=\"{$url}\"{$style}>{$dt}</a>"
. " . . {$ul} ({$nb})";
if ( "" != $c && "*" != $c ) {
- $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
+ $s .= $wgLang->emphasize(" (" . wfEscapeHTML( $c ) . ")");
}
$s .= "</li>\n";
return $s;
}
function tocIndent($level) {
-
- while($level-->0) $rv.="<div style=\"margin-left:2em;\">\n";
- return $rv;
-
+ return str_repeat( "<div class='tocindent'>\n", $level );
}
function tocUnindent($level) {
- while($level-->0) $rv.="</div>\n";
- return $rv;
+ return str_repeat( "</div>\n", $level );
}
- // parameter level defines if we are on an indentation level
- function tocLine($anchor,$tocline,$level) {
-
- if($level) {
-
- return "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n";
- } else {
-
- return "<div style=\"margin-bottom:0px;\">\n".
- "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n".
- "</div>\n";
+ # parameter level defines if we are on an indentation level
+ function tocLine( $anchor, $tocline, $level ) {
+ $link = "<a href=\"#$anchor\">$tocline</a><br />";
+ if($level) {
+ return "$link\n";
+ } else {
+ return "<div class='tocline'>$link</div>\n";
}
}
function tocTable($toc) {
- // note to CSS fanatics: putting this in a div does not work -- div won't auto-expand
- global $printable;
-
- if (!$printable) {
- $hideline = " <script type='text/javascript'>showTocToggle(\"" . wfMsg("showtoc") . "\",\"" . wfMsg("hidetoc") . "\")</script>";
- }
- return
- "<p><table border=\"0\" id=\"toc\"><tr><td align=\"center\">\n".
- "<b>".wfMsg("toc")."</b>" .
- $hideline .
- "</td></tr><tr id='tocinside'><td align=\"left\">\n".
- $toc."</td></tr></table><P>\n";
+ # note to CSS fanatics: putting this in a div does not work -- div won't auto-expand
+ # try min-width & co when somebody gets a chance
+ $hideline = " <script type='text/javascript'>showTocToggle(\"" . addslashes( wfMsg("showtoc") ) . "\",\"" . addslashes( wfMsg("hidetoc") ) . "\")</script>";
+ return
+ "<p><table border=\"0\" id=\"toc\"><tr><td align=\"center\">\n".
+ "<b>".wfMsg("toc")."</b>" .
+ $hideline .
+ "</td></tr><tr id='tocinside'><td>\n".
+ $toc."</td></tr></table><P>\n";
}
# These two do not check for permissions: check $wgTitle->userCanEdit before calling them
- function editSectionScript($section,$head) {
-
- global $wgTitle,$wgUser,$oldid;
- if($oldid) return $head;
- $url = wfLocalUrlE(urlencode($wgTitle->getPrefixedText()),"action=edit§ion=$section");
- return "<span onContextMenu='document.location=\"".$url."\";return false;'>{$head}</span>";
+ function editSectionScript( $section, $head ) {
+ global $wgTitle, $wgRequest;
+ if( $wgRequest->getInt( "oldid" ) && ( $wgRequest->getVal( "diff" ) != "0" ) ) {
+ return $head;
+ }
+ $url = $wgTitle->escapeLocalURL( "action=edit§ion=$section" );
+ return "<span oncontextmenu='document.location=\"$url\";return false;'>{$head}</span>";
}
- function editSectionLink($section) {
+ function editSectionLink( $section ) {
+ global $wgRequest;
+ global $wgTitle, $wgUser, $wgLang;
+
+ if( $wgRequest->getInt( "oldid" ) && ( $wgRequest->getVal( "diff" ) != "0" ) ) {
+ # Section edit links would be out of sync on an old page.
+ # But, if we're diffing to the current page, they'll be
+ # correct.
+ return "";
+ }
- global $printable;
- global $wgTitle,$wgUser,$oldid;
- if($oldid) return "";
- if ($printable) return "";
- $editurl="§ion={$section}";
- $url=$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("editsection"),"action=edit".$editurl);
- return "<div style=\"float:right;margin-left:5px;\"><small>[".$url."]</small></div>";
+ $editurl = "§ion={$section}";
+ $url = $this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("editsection"),"action=edit".$editurl);
+ if( $wgLang->isRTL() ) {
+ $farside = "left";
+ $nearside = "right";
+ } else {
+ $farside = "right";
+ $nearside = "left";
+ }
+ return "<div class=\"editsection\" style=\"float:$farside;margin-$nearside:5px;\">[".$url."]</div>";
+
+ }
+
+ // This function is called by EditPage.php and shows a bulletin board style
+ // toolbar for common editing functions. It can be disabled in the user preferences.
+ // The necsesary JavaScript code can be found in style/wikibits.js.
+ function getEditToolbar() {
+
+ global $wgUploadPath,$wgLang;
+
+ // toolarray an array of arrays which each include the filename of
+ // the button image (without path), the opening tag, the closing tag,
+ // and optionally a sample text that is inserted between the two when no
+ // selection is highlighted.
+ // The tip text is shown when the user moves the mouse over the button.
+ $toolarray=array(
+ array( "image"=>"button_bold.png",
+ "open"=>"\'\'\'",
+ "close"=>"\'\'\'",
+ "sample"=>wfMsg("bold_sample"),
+ "tip"=>wfMsg("bold_tip")),
+ array( "image"=>"button_italic.png",
+ "open"=>"\'\'",
+ "close"=>"\'\'",
+ "sample"=>wfMsg("italic_sample"),
+ "tip"=>wfMsg("italic_tip")),
+ array( "image"=>"button_link.png",
+ "open"=>"[[",
+ "close"=>"]]",
+ "sample"=>wfMsg("link_sample"),
+ "tip"=>wfMsg("link_tip")),
+ array( "image"=>"button_extlink.png",
+ "open"=>"[",
+ "close"=>"]",
+ "sample"=>wfMsg("extlink_sample"),
+ "tip"=>wfMsg("extlink_tip")),
+ array( "image"=>"button_headline.png",
+ "open"=>"\\n== ",
+ "close"=>" ==\\n",
+ "sample"=>wfMsg("headline_sample"),
+ "tip"=>wfMsg("headline_tip")),
+ array( "image"=>"button_image.png",
+ "open"=>"[[".$wgLang->getNsText(NS_IMAGE).":",
+ "close"=>"]]",
+ "sample"=>wfMsg("image_sample"),
+ "tip"=>wfMsg("image_tip")),
+ array( "image"=>"button_media.png",
+ "open"=>"[[".$wgLang->getNsText(NS_MEDIA).":",
+ "close"=>"]]",
+ "sample"=>wfMsg("media_sample"),
+ "tip"=>wfMsg("media_tip")),
+ array( "image"=>"button_math.png",
+ "open"=>"\\<math\\>",
+ "close"=>"\\</math\\>",
+ "sample"=>wfMsg("math_sample"),
+ "tip"=>wfMsg("math_tip")),
+ array( "image"=>"button_nowiki.png",
+ "open"=>"\\<nowiki\\>",
+ "close"=>"\\</nowiki\\>",
+ "sample"=>wfMsg("nowiki_sample"),
+ "tip"=>wfMsg("nowiki_tip")),
+ array( "image"=>"button_sig.png",
+ "open"=>"--~~~~",
+ "close"=>"",
+ "sample"=>"",
+ "tip"=>wfMsg("sig_tip")),
+ array( "image"=>"button_hr.png",
+ "open"=>"\\n----\\n",
+ "close"=>"",
+ "sample"=>"",
+ "tip"=>wfMsg("hr_tip"))
+ );
+ $toolbar ="<script type='text/javascript'>\n";
+ $toolbar.="document.writeln(\"<div id='toolbar'>\");\n";
+ foreach($toolarray as $tool) {
+
+ $image=$wgUploadPath."/".$tool["image"];
+ $open=$tool["open"];
+ $close=$tool["close"];
+ $sample = addslashes( $tool["sample"] );
+
+ // Note that we use the tip both for the ALT tag and the TITLE tag of the image.
+ // Older browsers show a "speedtip" type message only for ALT.
+ // Ideally these should be different, realistically they
+ // probably don't need to be.
+ $tip = addslashes( $tool["tip"] );
+ $toolbar.="addButton('$image','$tip','$open','$close','$sample');\n";
+ }
+
+ $toolbar.="addInfobox('" . addslashes( wfMsg( "infobox" ) ) . "','" . addslashes(wfMsg("infobox_alert")) . "','" . addslashes(wfMsg("infobox_mozvote"))."');\n";
+ $toolbar.="document.writeln(\"</div>\");\n</script>";
+ return $toolbar;
}
}
include_once( "SkinNostalgia.php" );
include_once( "SkinCologneBlue.php" );
+if( $wgUseSmarty ) {
+ include_once( "SkinSmarty.php" );
+}
+if( $wgUsePHPTal ) {
+ include_once( "SkinPHPTal.php" );
+}
+
+
?>