4 # These are the INTERNAL names, which get mapped
5 # directly to class names. For display purposes, the
6 # Language class has internationalized names
8 /* private */ $wgValidSkinNames = array(
9 "Standard", "Nostalgia", "CologneBlue" #, "Smarty", "Montparnasse"
12 # For some odd PHP bug, this function can't be part of a class
13 function getCategories ()
15 global $wgOut , $wgTitle , $wgUseCategoryMagic , $wgUser ;
16 if ( !isset ( $wgUseCategoryMagic ) ||
!$wgUseCategoryMagic ) return "" ;
17 if ( count ( $wgOut->mCategoryLinks
) == 0 ) return "" ;
18 if ( !$wgOut->isArticle() ) return "" ;
19 $sk = $wgUser->getSkin() ;
22 $s .= $sk->makeKnownLink ( "Special:Categories" , "Categories" , "article=".$wgTitle->getDBkey() ) ;
23 $t = implode ( " | " , $wgOut->mCategoryLinks
) ;
24 if ( $t != "" ) $s .= " : " ;
30 class RecentChangesClass
{
31 var $secureName , $displayName , $link , $namespace ;
32 var $oldid , $diffid , $timestamp , $curlink , $lastlink , $usertalklink , $versionlink ;
33 var $usercomment , $userlink ;
34 var $isminor , $isnew , $watched , $islog ;
39 /* private */ var $lastdate, $lastline;
41 var $rc_cache ; # Cache for Enhanced Recent Changes
42 var $rccc ; # Recent Changes Cache Counter for visibility toggle
49 function getSkinNames()
51 global $wgValidSkinNames;
52 return $wgValidSkinNames;
55 function getStylesheet()
57 return "wikistandard.css";
62 global $wgOut, $wgUser;
64 if ( $wgOut->isQuickbarSupressed() ) { return 0; }
65 $q = $wgUser->getOption( "quickbar" );
66 if ( "" == $q ) { $q = 0; }
72 global $wgOut, $wgStyleSheetPath;
73 $fname = "Skin::initPage";
74 wfProfileIn( $fname );
76 $wgOut->addLink( "shortcut icon", "", "/favicon.ico" );
77 if ( $wgOut->isPrintable() ) { $ss = "wikiprintable.css"; }
78 else { $ss = $this->getStylesheet(); }
79 $wgOut->addLink( "stylesheet", "", "{$wgStyleSheetPath}/{$ss}" );
80 wfProfileOut( $fname );
83 function outputPage( &$out ) {
84 wfProfileIn( "Skin::outputPage" );
86 $out->out( $out->headElement() );
88 $out->out( "\n<body" );
89 $ops = $this->getBodyOptions();
90 foreach ( $ops as $name => $val ) {
91 $out->out( " $name='$val'" );
94 if ( $wgDebugComments ) {
95 $out->out( "<!-- Wiki debugging output:\n" .
96 $out->mDebugtext
. "-->\n" );
98 $out->out( $this->beforeContent() );
100 $out->out( $out->mBodytext
);
102 $out->out( $this->afterContent() );
105 $out->out( $out->reportTime() );
107 $out->out( "\n</body></html>" );
110 function getHeadScripts() {
111 global $wgStyleSheetPath;
112 $r = "<script type=\"text/javascript\" src=\"{$wgStyleSheetPath}/wikibits.js\"></script>\n";
116 function getUserStyles()
118 $s = "<style type='text/css'><!--\n";
119 $s .= $this->doGetUserStyles();
120 $s .= "//--></style>\n";
124 function doGetUserStyles()
129 if ( 1 == $wgUser->getOption( "underline" ) ) {
130 # Don't override browser settings
134 $s .= "a.stub, a.new, a.internal, a.external { " .
135 "text-decoration: none; }\n";
137 if ( 1 == $wgUser->getOption( "highlightbroken" ) ) {
138 $s .= "a.new, #quickbar a.new { color: #CC2200; }\n";
140 if ( 1 == $wgUser->getOption( "justify" ) ) {
141 $s .= "#article { text-align: justify; }\n";
146 function getBodyOptions()
148 global $wgUser, $wgTitle, $wgNamespaceBackgrounds, $wgOut, $oldid, $redirect, $diff,$action;
150 if ( 0 != $wgTitle->getNamespace() ) {
151 $a = array( "bgcolor" => "#ffffec" );
153 else $a = array( "bgcolor" => "#FFFFFF" );
154 if($wgOut->isArticle() && $wgUser->getOption("editondblclick")
156 (!$wgTitle->isProtected() ||
$wgUser->isSysop())
159 $n = $wgTitle->getPrefixedURL();
160 $t = wfMsg( "editthispage" );
162 if ( $redirect ) { $red = "&redirect={$redirect}"; }
163 if ( $oldid && ! isset( $diff ) ) {
164 $oid = "&oldid={$oldid}";
166 $s = wfLocalUrlE($n,"action=edit{$oid}{$red}");
167 $s = "document.location = \"" .$s ."\";";
168 $a +
= array ("ondblclick" => $s);
171 $a['onload'] = $wgOut->getOnloadHandler();
175 function getExternalLinkAttributes( $link, $text )
177 global $wgUser, $wgOut, $wgLang;
179 $link = urldecode( $link );
180 $link = $wgLang->checkTitleEncoding( $link );
181 $link = str_replace( "_", " ", $link );
182 $link = wfEscapeHTML( $link );
184 if ( $wgOut->isPrintable() ) { $r = " class='printable'"; }
185 else { $r = " class='external'"; }
187 if ( 1 == $wgUser->getOption( "hover" ) ) {
188 $r .= " title=\"{$link}\"";
193 function getInternalLinkAttributes( $link, $text, $broken = false )
195 global $wgUser, $wgOut;
197 $link = urldecode( $link );
198 $link = str_replace( "_", " ", $link );
199 $link = wfEscapeHTML( $link );
201 if ( $wgOut->isPrintable() ) {
202 $r = " class='printable'";
203 } else if ( $broken == "stub" ) {
204 $r = " class='stub'";
205 } else if ( $broken == "yes" ) {
208 $r = " class='internal'";
211 if ( 1 == $wgUser->getOption( "hover" ) ) {
212 $r .= " title=\"{$link}\"";
217 function getInternalLinkAttributesObj( &$nt, $text, $broken = false )
219 global $wgUser, $wgOut;
221 if ( $wgOut->isPrintable() ) {
222 $r = " class='printable'";
223 } else if ( $broken == "stub" ) {
224 $r = " class='stub'";
225 } else if ( $broken == "yes" ) {
228 $r = " class='internal'";
231 if ( 1 == $wgUser->getOption( "hover" ) ) {
232 $r .= ' title ="' . $nt->getEscapedText() . '"';
243 # This will be called immediately after the <body> tag. Split into
244 # two functions to make it easier to subclass.
246 function beforeContent()
248 global $wgUser, $wgOut, $wgSiteNotice;
250 if ( $wgOut->isPrintable() ) {
251 $s = $this->pageTitle() . $this->pageSubtitle() . "\n";
252 $s .= "\n<div class='bodytext'>";
255 if( $wgSiteNotice ) {
256 $note = "\n<div id='notice' style='font-weight: bold; color: red; text-align: center'>$wgSiteNotice</div>\n";
260 return $this->doBeforeContent() . $note;
263 function doBeforeContent()
265 global $wgUser, $wgOut, $wgTitle, $wgLang;
266 $fname = "Skin::doBeforeContent";
267 wfProfileIn( $fname );
270 $qb = $this->qbSetting();
272 if( $langlinks = $this->otherLanguages() ) {
278 $borderhack = "class='top'";
281 $s .= "\n<div id='content'>\n<div id='topbar'>" .
282 "<table width='98%' border=0 cellspacing=0><tr>";
285 $left = ($qb == 1 ||
$qb == 3);
286 if($wgLang->isRTL()) $left = !$left;
289 $s .= "<td class='top' align=left valign=top rowspan='{$rows}'>" .
290 $this->logoText() . "</td>";
292 $s .= $this->getQuickbarCompensator( $rows );
294 $l = $wgLang->isRTL() ?
"right" : "left";
295 $s .= "<td {$borderhack} align='$l' valign='top'>";
297 $s .= $this->topLinks() ;
298 $s .= "<p class='subtitle'>" . $this->pageTitleLinks();
300 $r = $wgLang->isRTL() ?
"left" : "right";
301 $s .= "</td>\n<td {$borderhack} valign='top' align='$r' nowrap>";
302 $s .= $this->nameAndLogin();
303 $s .= "\n<br>" . $this->searchForm() . "</td>";
306 $s .= "</tr>\n<tr><td class='top' colspan=\"2\">$langlinks</td>";
309 if ( $shove && !$left ) { # Right
310 $s .= $this->getQuickbarCompensator( $rows );
312 $s .= "</tr></table>\n</div>\n";
313 $s .= "\n<div id='article'>";
315 $s .= $this->pageTitle();
316 $s .= $this->pageSubtitle() ;
317 $s .= getCategories(); // For some odd reason, zhis can't be a function of the object
319 wfProfileOut( $fname );
323 function getQuickbarCompensator( $rows = 1 )
325 return "<td width='152' rowspan='{$rows}'> </td>";
328 # This gets called immediately before the </body> tag.
330 function afterContent()
332 global $wgUser, $wgOut, $wgServer;
335 if ( $wgOut->isPrintable() ) {
338 $u = htmlspecialchars( $wgServer . $wgTitle->getFullURL() );
339 $u = "<a href=\"$u\">$u</a>";
340 $rf = wfMsg( "retrievedfrom", $u );
342 if ( $wgOut->isArticle() ) {
343 $lm = "<br>" . $this->lastModified();
346 $cr = wfMsg( "gnunote" );
347 $s .= "<p><em>{$rf}{$lm} {$cr}</em>\n";
350 return $this->doAfterContent();
353 function doAfterContent()
355 global $wgUser, $wgOut, $wgLang;
356 $fname = "Skin::doAfterContent";
357 wfProfileIn( $fname );
358 wfProfileIn( "$fname-1" );
360 $s = "\n</div><br clear=all>\n";
361 $s .= "\n<div id='footer'>";
362 $s .= "<table width='98%' border=0 cellspacing=0><tr>";
364 wfProfileOut( "$fname-1" );
365 wfProfileIn( "$fname-2" );
367 $qb = $this->qbSetting();
369 $left = ($qb == 1 ||
$qb == 3);
370 if($wgLang->isRTL()) $left = !$left;
372 if ( $shove && $left ) { # Left
373 $s .= $this->getQuickbarCompensator();
375 wfProfileOut( "$fname-2" );
376 wfProfileIn( "$fname-3" );
377 $l = $wgLang->isRTL() ?
"right" : "left";
378 $s .= "<td class='bottom' align='$l' valign='top'>";
380 $s .= $this->bottomLinks();
381 $s .= "\n<br>" . $this->mainPageLink()
382 . " | " . $this->aboutLink()
383 . " | " . $this->specialLink( "recentchanges" )
384 . " | " . $this->searchForm()
385 . "<br>" . $this->pageStats();
388 if ( $shove && !$left ) { # Right
389 $s .= $this->getQuickbarCompensator();
391 $s .= "</tr></table>\n</div>\n</div>\n";
393 wfProfileOut( "$fname-3" );
394 wfProfileIn( "$fname-4" );
395 if ( 0 != $qb ) { $s .= $this->quickBar(); }
396 wfProfileOut( "$fname-4" );
397 wfProfileOut( $fname );
401 function pageTitleLinks()
403 global $wgOut, $wgTitle, $oldid, $action, $diff, $wgUser, $wgLang, $wgUseApproval ;
405 $s = $this->printableLink();
406 if ( wfMsg ( "disclaimers" ) != "-" ) $s .= " | " . $this->makeKnownLink( wfMsg( "disclaimerpage" ), "disclaimers" ) ;
408 if ( $wgOut->isArticle() ) {
409 if ( $wgTitle->getNamespace() == Namespace::getImage() ) {
410 $name = $wgTitle->getDBkey();
411 $link = wfEscapeHTML( wfImageUrl( $name ) );
412 $style = $this->getInternalLinkAttributes( $link, $name );
413 $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>";
415 # This will show the "Approve" link if $wgUseApproval=true;
416 if ( isset ( $wgUseApproval ) && $wgUseApproval )
418 $t = $wgTitle->getDBkey();
419 $name = "Approve this article" ;
420 $link = "http://test.wikipedia.org/w/magnus/wiki.phtml?title={$t}&action=submit&doit=1" ;
421 #wfEscapeHTML( wfImageUrl( $name ) );
422 $style = $this->getExternalLinkAttributes( $link, $name );
423 $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>" ;
425 if ( "history" == $action ||
isset( $diff ) ||
isset( $oldid ) ) {
426 $s .= " | " . $this->makeKnownLink( $wgTitle->getPrefixedText(),
427 wfMsg( "currentrev" ) );
430 if ( $wgUser->getNewtalk() ) {
431 # do not show "You have new messages" text when we are viewing our
434 if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 &&
435 $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) {
436 $n =$wgUser->getName();
437 $tl = $this->makeKnownLink( $wgLang->getNsText(
438 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
439 wfMsg("newmessageslink") );
440 $s.=" | <strong>". wfMsg( "newmessages", $tl ) . "</strong>";
443 if( $wgUser->isSysop() &&
444 (($wgTitle->getArticleId() == 0) ||
($action == "history")) &&
445 ($n = $wgTitle->isDeleted() ) ) {
446 $s .= " | " . wfMsg( "thisisdeleted",
447 $this->makeKnownLink(
448 $wgLang->SpecialPage( "Undelete/" . $wgTitle->getPrefixedDBkey() ),
449 wfMsg( "restorelink", $n ) ) );
454 function printableLink()
456 global $wgOut, $wgTitle, $oldid, $action;
459 foreach( $_GET as $var => $val ) {
460 if( $var != "title" && $var != "printable" )
461 $q .= urlencode( $var ) . "=" . urlencode( $val );
463 if( !empty( $q ) ) $q .= "&";
465 $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
466 WfMsg( "printableversion" ), "{$q}printable=yes" );
472 global $wgOut, $wgTitle, $wgUser;
474 $s = "<h1 class='pagetitle'>" . $wgOut->getPageTitle() . "</h1>";
475 if($wgUser->getOption("editsectiononrightclick") && $wgTitle->userCanEdit()) { $s=$this->editSectionScript(0,$s);}
479 function pageSubtitle()
481 global $wgOut,$wgTitle,$wgNamespacesWithSubpages;
483 $sub = $wgOut->getSubtitle();
485 global $wgExtraSubtitle;
486 $sub = wfMsg( "fromwikipedia" ) . $wgExtraSubtitle;
488 if($wgOut->isArticle() && $wgNamespacesWithSubpages[$wgTitle->getNamespace()]) {
489 $ptext=$wgTitle->getPrefixedText();
490 if(preg_match("/\//",$ptext)) {
491 $sub.="</p><p class='subpages'>";
492 $links=explode("/",$ptext);
495 foreach($links as $link) {
497 if ($c<count($links)) {
498 $growinglink .= $link;
499 $getlink = $this->makeLink( $growinglink, $link );
500 if(preg_match("/class='new'/i",$getlink)) { break; } # this is a hack, but it saves time
513 $s = "<p class='subtitle'>{$sub}\n";
517 function nameAndLogin()
519 global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader;
521 $li = $wgLang->specialPage( "Userlogin" );
522 $lo = $wgLang->specialPage( "Userlogout" );
525 if ( 0 == $wgUser->getID() ) {
526 if( $wgShowIPinHeader ) {
527 $n = getenv( "REMOTE_ADDR" );
529 $tl = $this->makeKnownLink( $wgLang->getNsText(
530 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
531 $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
533 $s .= $n . " (".$tl.")";
535 $s .= wfMsg("notloggedin");
538 $rt = $wgTitle->getPrefixedURL();
539 if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) {
541 } else { $q = "returnto={$rt}"; }
543 $s .= "\n<br>" . $this->makeKnownLink( $li,
544 wfMsg( "login" ), $q );
546 $n = $wgUser->getName();
547 $rt = $wgTitle->getPrefixedURL();
548 $tl = $this->makeKnownLink( $wgLang->getNsText(
549 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
550 $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
554 $s .= $this->makeKnownLink( $wgLang->getNsText(
555 Namespace::getUser() ) . ":{$n}", $n ) . "{$tl}<br>" .
556 $this->makeKnownLink( $lo, wfMsg( "logout" ),
557 "returnto={$rt}" ) . " | " .
558 $this->specialLink( "preferences" );
560 $s .= " | " . $this->makeKnownLink( wfMsg( "helppage" ),
566 function searchForm()
570 $s = "<form name='search' class='inline' method=get action=\""
571 . wfLocalUrl( "" ) . "\">"
572 . "<input type=text name=\"search\" size=19 value=\""
573 . htmlspecialchars(substr($search,0,256)) . "\">\n"
574 . "<input type=submit name=\"go\" value=\"" . wfMsg ("go") . "\"> "
575 . "<input type=submit value=\"" . wfMsg ("search") . "\"></form>";
585 $s = $this->mainPageLink() . $sep
586 . $this->specialLink( "recentchanges" );
588 if ( $wgOut->isArticle() ) {
589 $s .= $sep . $this->editThisPage()
590 . $sep . $this->historyLink();
592 # Many people don't like this dropdown box
593 #$s .= $sep . $this->specialPagesList();
598 function bottomLinks()
600 global $wgOut, $wgUser, $wgTitle;
604 if ( $wgOut->isArticle() ) {
605 $s .= "<strong>" . $this->editThisPage() . "</strong>";
606 if ( 0 != $wgUser->getID() ) {
607 $s .= $sep . $this->watchThisPage();
609 $s .= $sep . $this->talkLink()
610 . $sep . $this->historyLink()
611 . $sep . $this->whatLinksHere()
612 . $sep . $this->watchPageLinksLink();
614 if ( $wgTitle->getNamespace() == Namespace::getUser()
615 ||
$wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser()) )
618 $id=User
::idFromName($wgTitle->getText());
619 $ip=User
::isIP($wgTitle->getText());
621 if($id ||
$ip) { # both anons and non-anons have contri list
622 $s .= $sep . $this->userContribsLink();
624 if ( 0 != $wgUser->getID() ) { # show only to signed in users
625 if($id) { # can only email non-anons
626 $s .= $sep . $this->emailUserLink();
630 if ( $wgUser->isSysop() && $wgTitle->getArticleId() ) {
631 $s .= "\n<br>" . $this->deleteThisPage() .
632 $sep . $this->protectThisPage() .
633 $sep . $this->moveThisPage();
635 $s .= "<br>\n" . $this->otherLanguages();
642 global $wgOut, $wgLang, $wgArticle;
643 global $oldid, $diff, $wgDisableCounters;
645 if ( ! $wgOut->isArticle() ) { return ""; }
646 if ( isset( $oldid ) ||
isset( $diff ) ) { return ""; }
647 if ( 0 == $wgArticle->getID() ) { return ""; }
649 if ( $wgDisableCounters ) {
652 $count = $wgArticle->getCount();
653 $s = wfMsg( "viewcount", $count );
655 $s .= $this->lastModified();
656 $s .= " " . wfMsg( "gnunote" );
657 return "<span id='pagestats'>{$s}</span>";
660 function lastModified()
662 global $wgLang, $wgArticle;
664 $d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true );
665 $s = " " . wfMsg( "lastmodified", $d );
669 function logoText( $align = "" )
671 if ( "" != $align ) { $a = " align='{$align}'"; }
674 $mp = wfMsg( "mainpage" );
675 $s = "<a href=\"" . wfLocalUrlE( urlencode( $mp ) )
676 . "\"><img{$a} border=0 src=\""
677 . $this->getLogo() . "\" alt=\"" . "[{$mp}]\"></a>";
683 global $wgOut, $wgTitle, $wgUser, $action, $wgLang;
684 global $wpPreview, $wgDisableUploads;
686 $fname = "Skin::quickBar";
687 wfProfileIn( $fname );
689 $tns=$wgTitle->getNamespace();
691 $s = "\n<div id='quickbar'>";
692 $s .= "\n" . $this->logoText() . "\n<hr class='sep'>";
695 $s .= $this->mainPageLink()
696 . $sep . $this->specialLink( "recentchanges" )
697 . $sep . $this->specialLink( "randompage" );
698 if ($wgUser->getID()) {
699 $s.= $sep . $this->specialLink( "watchlist" ) ;
700 $s .= $sep .$this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
701 wfMsg( "mycontris" ), "target=" . wfUrlencode($wgUser->getName() ) );
704 // only show watchlist link if logged in
705 if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ;
706 $s .= "\n<br><hr class='sep'>";
707 $articleExists = $wgTitle->getArticleId();
708 if ( $wgOut->isArticle() ||
$action =="edit" ||
$action =="history" ||
$wpPreview) {
709 if($wgOut->isArticle()) {
710 $s .= "<strong>" . $this->editThisPage() . "</strong>";
711 } else { # backlink to the article in edit or history mode
712 if($articleExists){ # no backlink if no article
715 $text = wfMsg("articlepage");
718 $text = wfMsg("viewtalkpage");
721 $text = wfMsg("userpage");
724 $text = wfMsg("viewtalkpage");
727 $text = wfMsg("wikipediapage");
730 $text = wfMsg("viewtalkpage");
733 $text = wfMsg("imagepage");
736 $text = wfMsg("viewtalkpage");
739 $text= wfMsg("articlepage");
742 $link = $wgTitle->getText();
743 if ($nstext = $wgLang->getNsText($tns) ) { # add namespace if necessary
744 $link = $nstext . ":" . $link ;
747 $s .= $this->makeLink( $link, $text );
748 } elseif( $wgTitle->getNamespace() != Namespace::getSpecial() ) {
749 # we just throw in a "New page" text to tell the user that he's in edit mode,
750 # and to avoid messing with the separator that is prepended to the next item
751 $s .= "<strong>" . wfMsg("newpage") . "</strong>";
757 if( $tns%2
&& $action!="edit" && !$wpPreview) {
758 $s.="<br>".$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("postcomment"),"action=edit§ion=new");
762 watching could cause problems in edit mode:
763 if user edits article, then loads "watch this article" in background and then saves
764 article with "Watch this article" checkbox disabled, the article is transparently
765 unwatched. Therefore we do not show the "Watch this page" link in edit mode
767 if ( 0 != $wgUser->getID() && $articleExists) {
768 if($action!="edit" && $action!="history" &&
769 $action != "submit" )
771 $s .= $sep . $this->watchThisPage();
773 if ( $wgTitle->userCanEdit() )
774 $s .= $sep . $this->moveThisPage();
776 if ( $wgUser->isSysop() and $articleExists ) {
777 $s .= $sep . $this->deleteThisPage() .
778 $sep . $this->protectThisPage();
780 $s .= $sep . $this->talkLink();
781 if ($articleExists && $action !="history") {
782 $s .= $sep . $this->historyLink();
784 $s.=$sep . $this->whatLinksHere();
786 if($wgOut->isArticle()) {
787 $s .= $sep . $this->watchPageLinksLink();
790 if ( Namespace::getUser() == $wgTitle->getNamespace()
791 ||
$wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser())
794 $id=User
::idFromName($wgTitle->getText());
795 $ip=User
::isIP($wgTitle->getText());
798 $s .= $sep . $this->userContribsLink();
800 if ( 0 != $wgUser->getID() ) {
801 if($id) { # can only email real users
802 $s .= $sep . $this->emailUserLink();
806 $s .= "\n<br><hr class='sep'>";
809 if ( 0 != $wgUser->getID() && !$wgDisableUploads ) {
810 $s .= $this->specialLink( "upload" ) . $sep;
812 $s .= $this->specialLink( "specialpages" )
813 . $sep . $this->bugReportsLink();
815 global $wgSiteSupportPage;
816 if( $wgSiteSupportPage ) {
817 $s .= "\n<br><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
818 "\" class=\"internal\">" . wfMsg( "sitesupport" ) . "</a>";
821 $s .= "\n<br></div>\n";
822 wfProfileOut( $fname );
826 function specialPagesList()
828 global $wgUser, $wgOut, $wgLang, $wgServer, $wgRedirectScript;
831 $validSP = $wgLang->getValidSpecialPages();
833 foreach ( $validSP as $name => $desc ) {
834 if ( "" == $desc ) { continue; }
837 if ( $wgUser->isSysop() )
839 $sysopSP = $wgLang->getSysopSpecialPages();
841 foreach ( $sysopSP as $name => $desc ) {
842 if ( "" == $desc ) { continue; }
846 if ( $wgUser->isDeveloper() )
848 $devSP = $wgLang->getDeveloperSpecialPages();
850 foreach ( $devSP as $name => $desc ) {
851 if ( "" == $desc ) { continue; }
856 $sp = wfMsg( "specialpages" );
857 $spp = $wgLang->specialPage( "Specialpages" );
859 $s = "<form id=\"specialpages\" method=\"get\" class=\"inline\" " .
860 "action=\"{$wgServer}{$wgRedirectScript}\">\n";
861 $s .= "<select name=\"wpDropdown\">\n";
862 $s .= "<option value=\"{$spp}\">{$sp}</option>\n";
864 foreach ( $a as $name => $desc ) {
865 $p = $wgLang->specialPage( $name );
866 $s .= "<option value=\"{$p}\">{$desc}</option>\n";
869 $s .= "<input type=submit value=\"{$go}\" name=redirect>\n";
874 function mainPageLink()
876 $mp = wfMsg( "mainpage" );
877 $s = $this->makeKnownLink( $mp, $mp );
881 function copyrightLink()
883 $s = $this->makeKnownLink( wfMsg( "copyrightpage" ),
884 wfMsg( "copyrightpagename" ) );
890 $s = $this->makeKnownLink( wfMsg( "aboutpage" ),
891 wfMsg( "aboutwikipedia" ) );
896 function disclaimerLink()
898 $s = $this->makeKnownLink( wfMsg( "disclaimerpage" ),
899 wfMsg( "disclaimers" ) );
903 function editThisPage()
905 global $wgOut, $wgTitle, $oldid, $redirect, $diff;
907 if ( ! $wgOut->isArticle() ||
$diff ) {
908 $s = wfMsg( "protectedpage" );
910 $n = $wgTitle->getPrefixedText();
911 if ( $wgTitle->userCanEdit() ) {
912 $t = wfMsg( "editthispage" );
914 #$t = wfMsg( "protectedpage" );
915 $t = wfMsg( "viewsource" );
919 if ( $redirect ) { $red = "&redirect={$redirect}"; }
920 if ( $oldid && ! isset( $diff ) ) {
921 $oid = "&oldid={$oldid}";
923 $s = $this->makeKnownLink( $n, $t, "action=edit{$oid}{$red}" );
928 function deleteThisPage()
930 global $wgUser, $wgOut, $wgTitle, $diff;
932 if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) {
933 $n = $wgTitle->getPrefixedText();
934 $t = wfMsg( "deletethispage" );
936 $s = $this->makeKnownLink( $n, $t, "action=delete" );
943 function protectThisPage()
945 global $wgUser, $wgOut, $wgTitle, $diff;
947 if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) {
948 $n = $wgTitle->getPrefixedText();
950 if ( $wgTitle->isProtected() ) {
951 $t = wfMsg( "unprotectthispage" );
952 $q = "action=unprotect";
954 $t = wfMsg( "protectthispage" );
955 $q = "action=protect";
957 $s = $this->makeKnownLink( $n, $t, $q );
964 function watchThisPage()
966 global $wgUser, $wgOut, $wgTitle, $diff;
968 if ( $wgOut->isArticle() && ( ! $diff ) ) {
969 $n = $wgTitle->getPrefixedText();
971 if ( $wgTitle->userIsWatching() ) {
972 $t = wfMsg( "unwatchthispage" );
973 $q = "action=unwatch";
975 $t = wfMsg( "watchthispage" );
978 $s = $this->makeKnownLink( $n, $t, $q );
980 $s = wfMsg( "notanarticle" );
985 function moveThisPage()
987 global $wgTitle, $wgLang;
989 if ( $wgTitle->userCanEdit() ) {
990 $s = $this->makeKnownLink( $wgLang->specialPage( "Movepage" ),
991 wfMsg( "movethispage" ), "target=" . $wgTitle->getPrefixedURL() );
992 } // no message if page is protected - would be redundant
996 function historyLink()
1000 $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
1001 wfMsg( "history" ), "action=history" );
1005 function whatLinksHere()
1007 global $wgTitle, $wgLang;
1009 $s = $this->makeKnownLink( $wgLang->specialPage( "Whatlinkshere" ),
1010 wfMsg( "whatlinkshere" ), "target=" . $wgTitle->getPrefixedURL() );
1014 function userContribsLink()
1016 global $wgTitle, $wgLang;
1018 $s = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1019 wfMsg( "contributions" ), "target=" . $wgTitle->getURL() );
1023 function emailUserLink()
1025 global $wgTitle, $wgLang;
1027 $s = $this->makeKnownLink( $wgLang->specialPage( "Emailuser" ),
1028 wfMsg( "emailuser" ), "target=" . $wgTitle->getURL() );
1032 function watchPageLinksLink()
1034 global $wgOut, $wgTitle, $wgLang;
1036 if ( ! $wgOut->isArticle() ) {
1037 $s = "(" . wfMsg( "notanarticle" ) . ")";
1039 $s = $this->makeKnownLink( $wgLang->specialPage(
1040 "Recentchangeslinked" ), wfMsg( "recentchangeslinked" ),
1041 "target=" . $wgTitle->getPrefixedURL() );
1046 function otherLanguages()
1048 global $wgOut, $wgLang, $wgTitle;
1050 $a = $wgOut->getLanguageLinks();
1052 if ( 0 == count( $a ) ) {
1053 if ( !$wgUseNewInterlanguage ) return "";
1054 $ns = $wgLang->getNsIndex ( $wgTitle->getNamespace () ) ;
1055 if ( $ns != 0 AND $ns != 1 ) return "" ;
1057 $x = "mode=addlink&xt=".$wgTitle->getDBkey() ;
1058 return $this->makeKnownLink( $wgLang->specialPage( $pn ),
1059 wfMsg( "intl" ) , $x );
1062 if ( !$wgUseNewInterlanguage ) {
1063 $s = wfMsg( "otherlanguages" ) . ": ";
1065 global $wgLanguageCode ;
1066 $x = "mode=zoom&xt=".$wgTitle->getDBkey() ;
1067 $x .= "&xl=".$wgLanguageCode ;
1068 $s = $this->makeKnownLink( $wgLang->specialPage( "Intl" ),
1069 wfMsg( "otherlanguages" ) , $x ) . ": " ;
1072 $s = wfMsg( "otherlanguages" ) . ": ";
1074 if($wgLang->isRTL()) $s .= "<span dir='LTR'>";
1075 foreach( $a as $l ) {
1076 if ( ! $first ) { $s .= " | "; }
1079 $nt = Title
::newFromText( $l );
1080 $url = $nt->getFullURL();
1081 $text = $wgLang->getLanguageName( $nt->getInterwiki() );
1083 if ( "" == $text ) { $text = $l; }
1084 $style = $this->getExternalLinkAttributes( $l, $text );
1085 $s .= "<a href=\"{$url}\"{$style}>{$text}</a>";
1087 if($wgLang->isRTL()) $s .= "</span>";
1091 function bugReportsLink()
1093 $s = $this->makeKnownLink( wfMsg( "bugreportspage" ),
1094 wfMsg( "bugreports" ) );
1100 global $wgLinkCache;
1101 $t1 = Title
::newFromText( gmdate( "F j" ) );
1102 $t2 = Title
::newFromText( gmdate( "Y" ) );
1104 $wgLinkCache->suspend();
1105 $id = $t1->getArticleID();
1106 $wgLinkCache->resume();
1109 $s = $this->makeBrokenLink( $t1->getText() );
1111 $s = $this->makeKnownLink( $t1->getText() );
1115 $wgLinkCache->suspend();
1116 $id = $t2->getArticleID();
1117 $wgLinkCache->resume();
1120 $s .= $this->makeBrokenLink( $t2->getText() );
1122 $s .= $this->makeKnownLink( $t2->getText() );
1129 global $wgLang, $wgTitle, $wgLinkCache;
1131 $tns = $wgTitle->getNamespace();
1132 if ( -1 == $tns ) { return ""; }
1134 $pn = $wgTitle->getText();
1135 $tp = wfMsg( "talkpage" );
1136 if ( Namespace::isTalk( $tns ) ) {
1137 $lns = Namespace::getSubject( $tns );
1140 $text = wfMsg("articlepage");
1143 $text = wfMsg("userpage");
1146 $text = wfMsg("wikipediapage");
1149 $text = wfMsg("imagepage");
1152 $text= wfMsg("articlepage");
1156 $lns = Namespace::getTalk( $tns );
1159 $n = $wgLang->getNsText( $lns );
1160 if ( "" == $n ) { $link = $pn; }
1161 else { $link = "{$n}:{$pn}"; }
1163 $wgLinkCache->suspend();
1164 $s = $this->makeLink( $link, $text );
1165 $wgLinkCache->resume();
1170 function commentLink()
1172 global $wgLang, $wgTitle, $wgLinkCache;
1174 $tns = $wgTitle->getNamespace();
1175 if ( -1 == $tns ) { return ""; }
1177 $lns = ( Namespace::isTalk( $tns ) ) ?
$tns : Namespace::getTalk( $tns );
1179 # assert Namespace::isTalk( $lns )
1181 $n = $wgLang->getNsText( $lns );
1182 $pn = $wgTitle->getText();
1184 $link = "{$n}:{$pn}";
1186 $wgLinkCache->suspend();
1187 $s = $this->makeKnownLink($link, wfMsg("postcomment"), "action=edit§ion=new");
1188 $wgLinkCache->resume();
1193 # After all the page content is transformed into HTML, it makes
1194 # a final pass through here for things like table backgrounds.
1196 function transformContent( $text )
1201 # Note: This function MUST call getArticleID() on the link,
1202 # otherwise the cache won't get updated properly. See LINKCACHE.DOC.
1204 function makeLink( $title, $text = "", $query = "", $trail = "" ) {
1205 wfProfileIn( "Skin::makeLink" );
1206 $nt = Title
::newFromText( $title );
1208 $result = $this->makeLinkObj( Title
::newFromText( $title ), $text, $query, $trail );
1210 wfDebug( "Invalid title passed to Skin::makeLink(): \"$title\"\n" );
1211 $result = $text == "" ?
$title : $text;
1214 wfProfileOut( "Skin::makeLink" );
1218 function makeKnownLink( $title, $text = "", $query = "", $trail = "" ) {
1219 $nt = Title
::newFromText( $title );
1221 return $this->makeKnownLinkObj( Title
::newFromText( $title ), $text, $query, $trail );
1223 wfDebug( "Invalid title passed to Skin::makeKnownLink(): \"$title\"\n" );
1224 return $text == "" ?
$title : $text;
1228 function makeBrokenLink( $title, $text = "", $query = "", $trail = "" ) {
1229 $nt = Title
::newFromText( $title );
1231 return $this->makeBrokenLinkObj( Title
::newFromText( $title ), $text, $query, $trail );
1233 wfDebug( "Invalid title passed to Skin::makeBrokenLink(): \"$title\"\n" );
1234 return $text == "" ?
$title : $text;
1238 function makeStubLink( $title, $text = "", $query = "", $trail = "" ) {
1239 $nt = Title
::newFromText( $title );
1241 return $this->makeStubLinkObj( Title
::newFromText( $title ), $text, $query, $trail );
1243 wfDebug( "Invalid title passed to Skin::makeStubLink(): \"$title\"\n" );
1244 return $text == "" ?
$title : $text;
1248 # Pass a title object, not a title string
1249 function makeLinkObj( &$nt, $text= "", $query = "", $trail = "" )
1251 global $wgOut, $wgUser;
1252 if ( $nt->isExternal() ) {
1253 $u = $nt->getFullURL();
1254 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1255 $style = $this->getExternalLinkAttributes( $link, $text );
1258 if ( "" != $trail ) {
1259 if ( preg_match( "/^([a-z]+)(.*)$$/sD", $trail, $m ) ) {
1264 $retVal = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1265 } elseif ( 0 == $nt->getNamespace() && "" == $nt->getText() ) {
1266 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1267 } elseif ( ( -1 == $nt->getNamespace() ) ||
1268 ( Namespace::getImage() == $nt->getNamespace() ) ) {
1269 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1271 $aid = $nt->getArticleID() ;
1273 $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail );
1275 $threshold = $wgUser->getOption("stubthreshold") ;
1276 if ( $threshold > 0 ) {
1277 $res = wfQuery ( "SELECT HIGH_PRIORITY length(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'", DB_READ
) ;
1279 if ( wfNumRows( $res ) > 0 ) {
1280 $s = wfFetchObject( $res );
1282 if ( $s->cur_is_redirect
OR $s->cur_namespace
!= 0 ) {
1283 $size = $threshold*2 ; # Really big
1285 wfFreeResult( $res );
1287 $size = $threshold*2 ; # Really big
1292 if ( $size < $threshold ) {
1293 $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail );
1295 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1302 # Pass a title object, not a title string
1303 function makeKnownLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1305 global $wgOut, $wgTitle;
1307 $fname = "Skin::makeKnownLinkObj";
1308 wfProfileIn( $fname );
1310 $link = $nt->getPrefixedURL();
1312 if ( "" == $link ) {
1314 if ( "" == $text ) { $text = $nt->getFragment(); }
1316 $u = wfLocalUrlE( $link, $query );
1318 if ( "" != $nt->getFragment() ) {
1319 $u .= "#" . wfEscapeHTML( $nt->getFragment() );
1321 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1322 $style = $this->getInternalLinkAttributesObj( $nt, $text );
1325 if ( "" != $trail ) {
1326 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1331 $r = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1332 wfProfileOut( $fname );
1336 # Pass a title object, not a title string
1337 function makeBrokenLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1339 global $wgOut, $wgUser;
1341 $fname = "Skin::makeBrokenLinkObj";
1342 wfProfileIn( $fname );
1344 $link = $nt->getPrefixedURL();
1346 if ( "" == $query ) { $q = "action=edit"; }
1347 else { $q = "action=edit&{$query}"; }
1348 $u = wfLocalUrlE( $link, $q );
1350 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1351 $style = $this->getInternalLinkAttributesObj( $nt, $text, "yes" );
1354 if ( "" != $trail ) {
1355 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1360 if ( $wgOut->isPrintable() ||
1361 ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
1362 $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1364 $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>?</a>{$trail}";
1367 wfProfileOut( $fname );
1371 # Pass a title object, not a title string
1372 function makeStubLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1374 global $wgOut, $wgUser;
1376 $link = $nt->getPrefixedURL();
1378 $u = wfLocalUrlE( $link, $query );
1380 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1381 $style = $this->getInternalLinkAttributesObj( $nt, $text, "stub" );
1384 if ( "" != $trail ) {
1385 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1390 if ( $wgOut->isPrintable() ||
1391 ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
1392 $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1394 $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>!</a>{$trail}";
1399 function fnamePart( $url )
1401 $basename = strrchr( $url, "/" );
1402 if ( false === $basename ) { $basename = $url; }
1403 else { $basename = substr( $basename, 1 ); }
1404 return wfEscapeHTML( $basename );
1407 function makeImage( $url, $alt = "" )
1411 if ( "" == $alt ) { $alt = $this->fnamePart( $url ); }
1412 $s = "<img src=\"{$url}\" alt=\"{$alt}\">";
1416 function makeImageLink( $name, $url, $alt = "" ) {
1417 $nt = Title
::makeTitle( Namespace::getImage(), $name );
1418 return $this->makeImageLinkObj( $nt, $alt );
1421 function makeImageLinkObj( $nt, $alt = "" ) {
1422 $link = $nt->getPrefixedURL();
1423 $name = $nt->getDBKey();
1424 $url = wfImageUrl( $name );
1425 if ( empty( $alt ) ) {
1426 $alt = preg_replace( '/\.(.+?)^/', '', $name );
1428 $alt = htmlspecialchars( $alt );
1430 $u = wfLocalUrlE( $link );
1431 $s = "<a href=\"{$u}\" class='image' title=\"{$alt}\">" .
1432 "<img border=\"0\" src=\"{$url}\" alt=\"{$alt}\"></a>";
1436 function makeMediaLink( $name, $url, $alt = "" ) {
1437 $nt = Title
::makeTitle( Namespace::getMedia(), $name );
1438 return $this->makeMediaLinkObj( $nt, $alt );
1441 function makeMediaLinkObj( $nt, $alt = "" )
1443 $name = $nt->getDBKey();
1444 $url = wfImageUrl( $name );
1445 if ( empty( $alt ) ) {
1446 $alt = preg_replace( '/\.(.+?)^/', '', $name );
1449 $u = htmlspecialchars( $url );
1450 $s = "<a href=\"{$u}\" class='internal' title=\"{$alt}\">{$alt}</a>";
1454 function specialLink( $name, $key = "" )
1458 if ( "" == $key ) { $key = strtolower( $name ); }
1459 $pn = $wgLang->ucfirst( $name );
1460 return $this->makeKnownLink( $wgLang->specialPage( $pn ),
1464 # Called by history lists and recent changes
1467 function beginRecentChangesList()
1469 $rc_cache = array() ;
1471 $this->lastdate
= "";
1475 function beginImageHistoryList()
1477 $s = "\n<h2>" . wfMsg( "imghistory" ) . "</h2>\n" .
1478 "<p>" . wfMsg( "imghistlegend" ) . "\n<ul>";
1482 function endRecentChangesList()
1484 $s = $this->recentChangesBlock() ;
1489 function endImageHistoryList()
1495 function recentChangesBlockLine ( $y ) {
1496 global $wgUploadPath ;
1498 $M = wfMsg( "minoreditletter" );
1499 $N = wfMsg( "newpageletter" );
1501 $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>" ;
1503 if ( $y->isnew
) $r .= $N ;
1504 else $r .= " " ;
1505 if ( $y->isminor
) $r .= $M ;
1506 else $r .= " " ;
1507 $r .= " ".$y->timestamp
." " ;
1510 if ( $y->watched
) $link = "<strong>{$link}</strong>" ;
1516 $r .= $this->makeKnownLink( $y->secureName
, wfMsg( "hist" ), "action=history" );
1518 $r .= ") . . ".$y->userlink
;
1519 $r .= $y->usertalklink
;
1520 if ( $y->usercomment
!= "" )
1521 $r .= " <em>(".wfEscapeHTML($y->usercomment
).")</em>" ;
1526 function recentChangesBlockGroup ( $y ) {
1527 global $wgUploadPath ;
1530 $M = wfMsg( "minoreditletter" );
1531 $N = wfMsg( "newpageletter" );
1533 $userlinks = array () ;
1534 foreach ( $y AS $x ) {
1535 $oldid = $x->diffid
;
1536 if ( $x->isnew
) $isnew = true ;
1538 if ( !isset ( $userlinks[$u] ) ) $userlinks[$u] = 0 ;
1542 krsort ( $userlinks ) ;
1543 asort ( $userlinks ) ;
1545 $u = array_keys ( $userlinks ) ;
1546 foreach ( $u as $x ) {
1548 if ( $userlinks[$x] > 1 ) $z .= " ({$userlinks[$x]}×)" ;
1549 array_push ( $users , $z ) ;
1551 $users = " <font size='-1'>[".implode("; ",$users)."]</font>" ;
1554 $e = array_shift ( $e ) ;
1557 $rci = "RCI{$this->rccc}" ;
1558 $rcl = "RCL{$this->rccc}" ;
1559 $rcm = "RCM{$this->rccc}" ;
1560 $tl = "<a href='javascript:toggleVisibility(\"{$rci}\",\"{$rcm}\",\"{$rcl}\")'>" ;
1561 $tl .= "<span id='{$rcm}'><img src='{$wgUploadPath}/Arr_r.png' width=12 height=12 border=0></span>" ;
1562 $tl .= "<span id='{$rcl}' style='display:none'><img src='{$wgUploadPath}/Arr_d.png' width=12 height=12 border=0></span>" ;
1568 if ( $isnew ) $r .= $N ;
1569 else $r .= " " ;
1570 $r .= " " ; # Minor
1571 $r .= " ".$e->timestamp
." " ;
1575 if ( $e->watched
) $link = "<strong>{$link}</strong>" ;
1579 $r .= " (".count($y)." " ;
1580 if ( $isnew ) $r .= wfMsg("changes");
1581 else $r .= $this->makeKnownLink( $e->secureName
, wfMsg("changes") , "diff=0&oldid=".$oldid ) ;
1583 $r .= $this->makeKnownLink( $e->secureName
, wfMsg( "history" ), "action=history" );
1591 $r .= "<div id='{$rci}' style='display:none'>" ;
1592 foreach ( $y AS $x )
1594 $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>";
1595 $r .= "<tt> " ;
1596 if ( $x->isnew
) $r .= $N ;
1597 else $r .= " " ;
1598 if ( $x->isminor
) $r .= $M ;
1599 else $r .= " " ;
1603 if ( $x->oldid
!= 0 ) $o = "oldid=".$x->oldid
;
1604 if ( $x->islog
) $link = $x->timestamp
;
1605 else $link = $this->makeKnownLink( $x->secureName
, $x->timestamp
, $o ) ;
1606 $link = "<tt>{$link}</tt>" ;
1613 $r .= $x->lastlink
;
1614 $r .= ") . . ".$x->userlink
;
1615 $r .= $x->usertalklink
;
1616 if ( $x->usercomment
!= "" )
1617 $r .= " <em>(".wfEscapeHTML($x->usercomment
).")</em>" ;
1626 function recentChangesBlock ()
1628 global $wgUploadPath ;
1629 if ( count ( $this->rc_cache
) == 0 ) return "" ;
1630 $k = array_keys ( $this->rc_cache
) ;
1631 foreach ( $k AS $x )
1633 $y = $this->rc_cache
[$x] ;
1634 if ( count ( $y ) < 2 ) {
1635 $r .= $this->recentChangesBlockLine ( array_shift ( $y ) ) ;
1637 $r .= $this->recentChangesBlockGroup ( $y ) ;
1641 return "<div align=left>{$r}</div>" ;
1644 function recentChangesLine( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
1647 $usenew = $wgUser->getOption( "usenewrc" );
1649 $r = $this->recentChangesLineNew ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
1651 $r = $this->recentChangesLineOld ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
1655 function recentChangesLineOld( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0, $diffid = 0 )
1657 global $wgTitle, $wgLang, $wgUser;
1659 $d = $wgLang->date( $ts, true);
1661 if ( $d != $this->lastdate
) {
1662 if ( "" != $this->lastdate
) { $s .= "</ul>\n"; }
1663 $s .= "<h4>{$d}</h4>\n<ul>";
1664 $this->lastdate
= $d;
1666 $h = $wgLang->time( $ts, true );
1667 $t = Title
::makeName( $ns, $ttl );
1668 $clink = $this->makeKnownLink( $t , "" );
1669 $nt = Title
::newFromText( $t );
1672 $clink = "<strong>{$clink}</strong>";
1674 $hlink = $this->makeKnownLink( $t, wfMsg( "hist" ), "action=history" );
1675 if ( $isnew ||
$nt->isLog() ) {
1676 $dlink = wfMsg( "diff" );
1678 $dlink = $this->makeKnownLink( $t, wfMsg( "diff" ),
1679 "diff={$oldid}&oldid={$diffid}" ); # Finagle's law
1682 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1683 $ut, "target=" . $ut );
1685 $ul = $this->makeLink( $wgLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut );
1688 $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
1689 global $wgDisableAnonTalk;
1690 if( 0 == $u && $wgDisableAnonTalk ) {
1693 $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
1694 $utl= $this->makeLink($utns . ":{$ut}", $talkname );
1696 $cr = wfMsg( "currentrev" );
1698 $s .= "<li> ({$dlink}) ({$hlink}) . .";
1699 $M = wfMsg( "minoreditletter" );
1700 $N = wfMsg( "newpageletter" );
1701 if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
1702 if ( $isnew ) { $s .= "<strong>{$N}</strong>"; }
1703 $s .= " {$clink}; {$h} . . {$ul}";
1706 if ( ( 0 == $u ) && $wgUser->isSysop() ) {
1707 $blink = $this->makeKnownLink( $wgLang->specialPage(
1708 "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
1712 if($utl) $utl .= " | ";
1715 if($utl) $s.=" ({$utl})";
1717 if ( "" != $c && "*" != $c ) {
1718 $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
1725 function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
1727 global $wgTitle, $wgLang, $wgUser;
1729 $rc = new RecentChangesClass
;
1731 $d = $wgLang->date( $ts, true);
1734 if ( $d != $this->lastdate
) {
1735 $ret = $this->recentChangesBlock () ;
1736 $this->rc_cache
= array() ;
1737 $ret .= "<h4>{$d}</h4>\n";
1738 $this->lastdate
= $d;
1740 $h = $wgLang->time( $ts, true );
1741 $t = Title
::makeName( $ns, $ttl );
1742 $clink = $this->makeKnownLink( $t, "" ) ;
1743 if ( $oldid == 0 ) $c2link = $clink ;
1744 else $c2link = $this->makeKnownLink( $t, "" , "oldid={$oldid}" );
1745 $nt = Title
::newFromText( $t );
1747 $rc->timestamp
= $h ;
1748 $rc->oldid
= $oldid ;
1749 $rc->diffid
= $diffid ;
1750 $rc->watched
= $watched ;
1751 $rc->isnew
= $isnew ;
1752 $rc->isminor
= $isminor ;
1753 $rc->secureName
= $t ;
1754 $rc->displayName
= $nt ;
1755 $rc->link
= $clink ;
1756 $rc->usercomment
= $c ;
1757 $rc->islog
= $nt->isLog() ;
1759 if ( ( $isnew && $oldid == 0 ) ||
$nt->isLog() ) {
1760 $dlink = wfMsg( "cur" );
1762 $dlink = $this->makeKnownLink( $t, wfMsg( "cur" ),
1763 "diff=0&oldid={$oldid}" );
1766 if ( $diffid == 0 ||
$nt->isLog() ) {
1767 $plink = wfMsg( "last" );
1769 $plink = $this->makeKnownLink( $t, wfMsg( "last" ),
1770 "diff={$oldid}&oldid={$diffid}" );
1774 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1775 $ut, "target=" . $ut );
1776 } else { $ul = $this->makeLink( $wgLang->getNsText(
1777 Namespace::getUser() ) . ":{$ut}", $ut ); }
1779 $rc->userlink
= $ul ;
1780 $rc->lastlink
= $plink ;
1781 $rc->curlink
= $dlink ;
1783 $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
1784 $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
1785 $utl= $this->makeLink($utns . ":{$ut}", $talkname );
1787 global $wgDisableAnonTalk;
1788 if ( ( 0 == $u ) && $wgUser->isSysop() ) {
1789 $blink = $this->makeKnownLink( $wgLang->specialPage(
1790 "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
1791 if( $wgDisableAnonTalk )
1792 $rc->usertalklink
= " ({$blink})";
1794 $rc->usertalklink
= " ({$utl} | {$blink})";
1796 if( $wgDisableAnonTalk && ($u == 0) )
1797 $rc->usertalklink
= "";
1799 $rc->usertalklink
= " ({$utl})";
1802 if ( !isset ( $this->rc_cache
[$t] ) ) $this->rc_cache
[$t] = array() ;
1803 array_push ( $this->rc_cache
[$t] , $rc ) ;
1808 function imageHistoryLine( $iscur, $ts, $img, $u, $ut, $size, $c )
1810 global $wgUser, $wgLang, $wgTitle;
1812 $dt = $wgLang->timeanddate( $ts, true );
1813 $del = wfMsg( "deleteimg" );
1814 $cur = wfMsg( "cur" );
1817 $url = wfImageUrl( $img );
1819 if ( $wgUser->isSysop() ) {
1820 $link = wfLocalUrlE( $wgTitle->getPrefixedText(), "image=" . $wgTitle->getURL() .
1822 $style = $this->getInternalLinkAttributes( $link, $del );
1824 $dlink = "<a href=\"{$link}\"{$style}>{$del}</a>";
1829 $url = wfEscapeHTML( wfImageArchiveUrl( $img ) );
1830 if( $wgUser->getID() != 0 ) {
1831 $rlink = $this->makeKnownLink( $wgTitle->getPrefixedText(),
1832 wfMsg( "revertimg" ), "action=revert&oldimage=" .
1833 urlencode( $img ) );
1834 $dlink = $this->makeKnownLink( $wgTitle->getPrefixedText(),
1835 $del, "action=delete&oldimage=" . urlencode( $img ) );
1837 # Having live active links for non-logged in users
1838 # means that bots and spiders crawling our site can
1839 # inadvertently change content. Baaaad idea.
1840 $rlink = wfMsg( "revertimg" );
1844 if ( 0 == $u ) { $ul = $ut; }
1845 else { $ul = $this->makeLink( $wgLang->getNsText(
1846 Namespace::getUser() ) . ":{$ut}", $ut ); }
1848 $nb = wfMsg( "nbytes", $size );
1849 $style = $this->getInternalLinkAttributes( $url, $dt );
1851 $s = "<li> ({$dlink}) ({$rlink}) <a href=\"{$url}\"{$style}>{$dt}</a>"
1852 . " . . {$ul} ({$nb})";
1854 if ( "" != $c && "*" != $c ) {
1855 $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
1861 function tocIndent($level) {
1863 while($level-->0) $rv.="<div style=\"margin-left:2em;\">\n";
1868 function tocUnindent($level) {
1869 while($level-->0) $rv.="</div>\n";
1873 // parameter level defines if we are on an indentation level
1874 function tocLine($anchor,$tocline,$level) {
1878 return "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n";
1881 return "<div style=\"margin-bottom:0px;\">\n".
1882 "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n".
1888 function tocTable($toc) {
1889 // note to CSS fanatics: putting this in a div does not work -- div won't auto-expand
1893 $hideline = " <script type='text/javascript'>showTocToggle(\"" . wfMsg("showtoc") . "\",\"" . wfMsg("hidetoc") . "\")</script>";
1896 "<p><table border=\"0\" id=\"toc\"><tr><td align=\"center\">\n".
1897 "<b>".wfMsg("toc")."</b>" .
1899 "</td></tr><tr id='tocinside'><td align=\"left\">\n".
1900 $toc."</td></tr></table><P>\n";
1903 # These two do not check for permissions: check $wgTitle->userCanEdit before calling them
1904 function editSectionScript($section,$head) {
1906 global $wgTitle,$wgUser,$oldid;
1907 if($oldid) return $head;
1908 $url = wfLocalUrlE(urlencode($wgTitle->getPrefixedText()),"action=edit§ion=$section");
1909 return "<span onContextMenu='document.location=\"".$url."\";return false;'>{$head}</span>";
1912 function editSectionLink($section) {
1915 global $wgTitle,$wgUser,$oldid;
1916 if($oldid) return "";
1917 if ($printable) return "";
1918 $editurl="§ion={$section}";
1919 $url=$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("editsection"),"action=edit".$editurl);
1920 return "<div style=\"float:right;margin-left:5px;\"><small>[".$url."]</small></div>";
1925 include_once( "SkinStandard.php" );
1926 include_once( "SkinNostalgia.php" );
1927 include_once( "SkinCologneBlue.php" );
1929 #include_once( "SkinSmarty.php" );