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 global $wgDebugComments;
86 wfProfileIn( "Skin::outputPage" );
88 $out->out( $out->headElement() );
90 $out->out( "\n<body" );
91 $ops = $this->getBodyOptions();
92 foreach ( $ops as $name => $val ) {
93 $out->out( " $name='$val'" );
96 if ( $wgDebugComments ) {
97 $out->out( "<!-- Wiki debugging output:\n" .
98 $out->mDebugtext
. "-->\n" );
100 $out->out( $this->beforeContent() );
102 $out->out( $out->mBodytext
);
104 $out->out( $this->afterContent() );
107 $out->out( $out->reportTime() );
109 $out->out( "\n</body></html>" );
112 function getHeadScripts() {
113 global $wgStyleSheetPath;
114 $r = "<script type=\"text/javascript\" src=\"{$wgStyleSheetPath}/wikibits.js\"></script>\n";
118 function getUserStyles()
120 $s = "<style type='text/css'><!--\n";
121 $s .= $this->doGetUserStyles();
122 $s .= "//--></style>\n";
126 function doGetUserStyles()
131 if ( 1 == $wgUser->getOption( "underline" ) ) {
132 # Don't override browser settings
136 $s .= "a.stub, a.new, a.internal, a.external { " .
137 "text-decoration: none; }\n";
139 if ( 1 == $wgUser->getOption( "highlightbroken" ) ) {
140 $s .= "a.new, #quickbar a.new { color: #CC2200; }\n";
142 if ( 1 == $wgUser->getOption( "justify" ) ) {
143 $s .= "#article { text-align: justify; }\n";
148 function getBodyOptions()
150 global $wgUser, $wgTitle, $wgNamespaceBackgrounds, $wgOut, $oldid, $redirect, $diff,$action;
152 if ( 0 != $wgTitle->getNamespace() ) {
153 $a = array( "bgcolor" => "#ffffec" );
155 else $a = array( "bgcolor" => "#FFFFFF" );
156 if($wgOut->isArticle() && $wgUser->getOption("editondblclick")
158 (!$wgTitle->isProtected() ||
$wgUser->isSysop())
161 $n = $wgTitle->getPrefixedURL();
162 $t = wfMsg( "editthispage" );
164 if ( $redirect ) { $red = "&redirect={$redirect}"; }
165 if ( $oldid && ! isset( $diff ) ) {
166 $oid = "&oldid={$oldid}";
168 $s = wfLocalUrlE($n,"action=edit{$oid}{$red}");
169 $s = "document.location = \"" .$s ."\";";
170 $a +
= array ("ondblclick" => $s);
173 $a['onload'] = $wgOut->getOnloadHandler();
177 function getExternalLinkAttributes( $link, $text )
179 global $wgUser, $wgOut, $wgLang;
181 $link = urldecode( $link );
182 $link = $wgLang->checkTitleEncoding( $link );
183 $link = str_replace( "_", " ", $link );
184 $link = wfEscapeHTML( $link );
186 if ( $wgOut->isPrintable() ) { $r = " class='printable'"; }
187 else { $r = " class='external'"; }
189 if ( 1 == $wgUser->getOption( "hover" ) ) {
190 $r .= " title=\"{$link}\"";
195 function getInternalLinkAttributes( $link, $text, $broken = false )
197 global $wgUser, $wgOut;
199 $link = urldecode( $link );
200 $link = str_replace( "_", " ", $link );
201 $link = wfEscapeHTML( $link );
203 if ( $wgOut->isPrintable() ) {
204 $r = " class='printable'";
205 } else if ( $broken == "stub" ) {
206 $r = " class='stub'";
207 } else if ( $broken == "yes" ) {
210 $r = " class='internal'";
213 if ( 1 == $wgUser->getOption( "hover" ) ) {
214 $r .= " title=\"{$link}\"";
219 function getInternalLinkAttributesObj( &$nt, $text, $broken = false )
221 global $wgUser, $wgOut;
223 if ( $wgOut->isPrintable() ) {
224 $r = " class='printable'";
225 } else if ( $broken == "stub" ) {
226 $r = " class='stub'";
227 } else if ( $broken == "yes" ) {
230 $r = " class='internal'";
233 if ( 1 == $wgUser->getOption( "hover" ) ) {
234 $r .= ' title ="' . $nt->getEscapedText() . '"';
245 # This will be called immediately after the <body> tag. Split into
246 # two functions to make it easier to subclass.
248 function beforeContent()
250 global $wgUser, $wgOut, $wgSiteNotice;
252 if ( $wgOut->isPrintable() ) {
253 $s = $this->pageTitle() . $this->pageSubtitle() . "\n";
254 $s .= "\n<div class='bodytext'>";
257 if( $wgSiteNotice ) {
258 $note = "\n<div id='notice' style='font-weight: bold; color: red; text-align: center'>$wgSiteNotice</div>\n";
262 return $this->doBeforeContent() . $note;
265 function doBeforeContent()
267 global $wgUser, $wgOut, $wgTitle, $wgLang;
268 $fname = "Skin::doBeforeContent";
269 wfProfileIn( $fname );
272 $qb = $this->qbSetting();
274 if( $langlinks = $this->otherLanguages() ) {
280 $borderhack = "class='top'";
283 $s .= "\n<div id='content'>\n<div id='topbar'>" .
284 "<table width='98%' border=0 cellspacing=0><tr>";
287 $left = ($qb == 1 ||
$qb == 3);
288 if($wgLang->isRTL()) $left = !$left;
291 $s .= "<td class='top' align=left valign=top rowspan='{$rows}'>" .
292 $this->logoText() . "</td>";
294 $s .= $this->getQuickbarCompensator( $rows );
296 $l = $wgLang->isRTL() ?
"right" : "left";
297 $s .= "<td {$borderhack} align='$l' valign='top'>";
299 $s .= $this->topLinks() ;
300 $s .= "<p class='subtitle'>" . $this->pageTitleLinks();
302 $r = $wgLang->isRTL() ?
"left" : "right";
303 $s .= "</td>\n<td {$borderhack} valign='top' align='$r' nowrap>";
304 $s .= $this->nameAndLogin();
305 $s .= "\n<br>" . $this->searchForm() . "</td>";
308 $s .= "</tr>\n<tr><td class='top' colspan=\"2\">$langlinks</td>";
311 if ( $shove && !$left ) { # Right
312 $s .= $this->getQuickbarCompensator( $rows );
314 $s .= "</tr></table>\n</div>\n";
315 $s .= "\n<div id='article'>";
317 $s .= $this->pageTitle();
318 $s .= $this->pageSubtitle() ;
319 $s .= getCategories(); // For some odd reason, zhis can't be a function of the object
321 wfProfileOut( $fname );
325 function getQuickbarCompensator( $rows = 1 )
327 return "<td width='152' rowspan='{$rows}'> </td>";
330 # This gets called immediately before the </body> tag.
332 function afterContent()
334 global $wgUser, $wgOut, $wgServer;
337 if ( $wgOut->isPrintable() ) {
340 $u = htmlspecialchars( $wgServer . $wgTitle->getFullURL() );
341 $u = "<a href=\"$u\">$u</a>";
342 $rf = wfMsg( "retrievedfrom", $u );
344 if ( $wgOut->isArticle() ) {
345 $lm = "<br>" . $this->lastModified();
348 $cr = wfMsg( "gnunote" );
349 $s .= "<p><em>{$rf}{$lm} {$cr}</em>\n";
352 return $this->doAfterContent();
355 function doAfterContent()
357 global $wgUser, $wgOut, $wgLang;
358 $fname = "Skin::doAfterContent";
359 wfProfileIn( $fname );
360 wfProfileIn( "$fname-1" );
362 $s = "\n</div><br clear=all>\n";
363 $s .= "\n<div id='footer'>";
364 $s .= "<table width='98%' border=0 cellspacing=0><tr>";
366 wfProfileOut( "$fname-1" );
367 wfProfileIn( "$fname-2" );
369 $qb = $this->qbSetting();
371 $left = ($qb == 1 ||
$qb == 3);
372 if($wgLang->isRTL()) $left = !$left;
374 if ( $shove && $left ) { # Left
375 $s .= $this->getQuickbarCompensator();
377 wfProfileOut( "$fname-2" );
378 wfProfileIn( "$fname-3" );
379 $l = $wgLang->isRTL() ?
"right" : "left";
380 $s .= "<td class='bottom' align='$l' valign='top'>";
382 $s .= $this->bottomLinks();
383 $s .= "\n<br>" . $this->mainPageLink()
384 . " | " . $this->aboutLink()
385 . " | " . $this->specialLink( "recentchanges" )
386 . " | " . $this->searchForm()
387 . "<br>" . $this->pageStats();
390 if ( $shove && !$left ) { # Right
391 $s .= $this->getQuickbarCompensator();
393 $s .= "</tr></table>\n</div>\n</div>\n";
395 wfProfileOut( "$fname-3" );
396 wfProfileIn( "$fname-4" );
397 if ( 0 != $qb ) { $s .= $this->quickBar(); }
398 wfProfileOut( "$fname-4" );
399 wfProfileOut( $fname );
403 function pageTitleLinks()
405 global $wgOut, $wgTitle, $oldid, $action, $diff, $wgUser, $wgLang, $wgUseApproval ;
407 $s = $this->printableLink();
408 if ( wfMsg ( "disclaimers" ) != "-" ) $s .= " | " . $this->makeKnownLink( wfMsg( "disclaimerpage" ), wfMsg( "disclaimers" ) ) ;
410 if ( $wgOut->isArticle() ) {
411 if ( $wgTitle->getNamespace() == Namespace::getImage() ) {
412 $name = $wgTitle->getDBkey();
413 $link = wfEscapeHTML( wfImageUrl( $name ) );
414 $style = $this->getInternalLinkAttributes( $link, $name );
415 $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>";
417 # This will show the "Approve" link if $wgUseApproval=true;
418 if ( isset ( $wgUseApproval ) && $wgUseApproval )
420 $t = $wgTitle->getDBkey();
421 $name = "Approve this article" ;
422 $link = "http://test.wikipedia.org/w/magnus/wiki.phtml?title={$t}&action=submit&doit=1" ;
423 #wfEscapeHTML( wfImageUrl( $name ) );
424 $style = $this->getExternalLinkAttributes( $link, $name );
425 $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>" ;
427 if ( "history" == $action ||
isset( $diff ) ||
isset( $oldid ) ) {
428 $s .= " | " . $this->makeKnownLink( $wgTitle->getPrefixedText(),
429 wfMsg( "currentrev" ) );
432 if ( $wgUser->getNewtalk() ) {
433 # do not show "You have new messages" text when we are viewing our
436 if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 &&
437 $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) {
438 $n =$wgUser->getName();
439 $tl = $this->makeKnownLink( $wgLang->getNsText(
440 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
441 wfMsg("newmessageslink") );
442 $s.=" | <strong>". wfMsg( "newmessages", $tl ) . "</strong>";
445 if( $wgUser->isSysop() &&
446 (($wgTitle->getArticleId() == 0) ||
($action == "history")) &&
447 ($n = $wgTitle->isDeleted() ) ) {
448 $s .= " | " . wfMsg( "thisisdeleted",
449 $this->makeKnownLink(
450 $wgLang->SpecialPage( "Undelete/" . $wgTitle->getPrefixedDBkey() ),
451 wfMsg( "restorelink", $n ) ) );
456 function printableLink()
458 global $wgOut, $wgTitle, $oldid, $action;
461 foreach( $_GET as $var => $val ) {
462 if( $var != "title" && $var != "printable" )
463 $q .= urlencode( $var ) . "=" . urlencode( $val );
465 if( !empty( $q ) ) $q .= "&";
467 $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
468 WfMsg( "printableversion" ), "{$q}printable=yes" );
474 global $wgOut, $wgTitle, $wgUser;
476 $s = "<h1 class='pagetitle'>" . $wgOut->getPageTitle() . "</h1>";
477 if($wgUser->getOption("editsectiononrightclick") && $wgTitle->userCanEdit()) { $s=$this->editSectionScript(0,$s);}
481 function pageSubtitle()
483 global $wgOut,$wgTitle,$wgNamespacesWithSubpages;
485 $sub = $wgOut->getSubtitle();
487 global $wgExtraSubtitle;
488 $sub = wfMsg( "fromwikipedia" ) . $wgExtraSubtitle;
490 if($wgOut->isArticle() && $wgNamespacesWithSubpages[$wgTitle->getNamespace()]) {
491 $ptext=$wgTitle->getPrefixedText();
492 if(preg_match("/\//",$ptext)) {
493 $sub.="</p><p class='subpages'>";
494 $links=explode("/",$ptext);
497 foreach($links as $link) {
499 if ($c<count($links)) {
500 $growinglink .= $link;
501 $getlink = $this->makeLink( $growinglink, $link );
502 if(preg_match("/class='new'/i",$getlink)) { break; } # this is a hack, but it saves time
515 $s = "<p class='subtitle'>{$sub}\n";
519 function nameAndLogin()
521 global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader;
523 $li = $wgLang->specialPage( "Userlogin" );
524 $lo = $wgLang->specialPage( "Userlogout" );
527 if ( 0 == $wgUser->getID() ) {
528 if( $wgShowIPinHeader ) {
529 $n = getenv( "REMOTE_ADDR" );
531 $tl = $this->makeKnownLink( $wgLang->getNsText(
532 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
533 $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
535 $s .= $n . " (".$tl.")";
537 $s .= wfMsg("notloggedin");
540 $rt = $wgTitle->getPrefixedURL();
541 if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) {
543 } else { $q = "returnto={$rt}"; }
545 $s .= "\n<br>" . $this->makeKnownLink( $li,
546 wfMsg( "login" ), $q );
548 $n = $wgUser->getName();
549 $rt = $wgTitle->getPrefixedURL();
550 $tl = $this->makeKnownLink( $wgLang->getNsText(
551 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
552 $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
556 $s .= $this->makeKnownLink( $wgLang->getNsText(
557 Namespace::getUser() ) . ":{$n}", $n ) . "{$tl}<br>" .
558 $this->makeKnownLink( $lo, wfMsg( "logout" ),
559 "returnto={$rt}" ) . " | " .
560 $this->specialLink( "preferences" );
562 $s .= " | " . $this->makeKnownLink( wfMsg( "helppage" ),
568 function searchForm()
572 $s = "<form name='search' class='inline' method=get action=\""
573 . wfLocalUrl( "" ) . "\">"
574 . "<input type=text name=\"search\" size=19 value=\""
575 . htmlspecialchars(substr($search,0,256)) . "\">\n"
576 . "<input type=submit name=\"go\" value=\"" . wfMsg ("go") . "\"> "
577 . "<input type=submit value=\"" . wfMsg ("search") . "\"></form>";
587 $s = $this->mainPageLink() . $sep
588 . $this->specialLink( "recentchanges" );
590 if ( $wgOut->isArticle() ) {
591 $s .= $sep . $this->editThisPage()
592 . $sep . $this->historyLink();
594 # Many people don't like this dropdown box
595 #$s .= $sep . $this->specialPagesList();
600 function bottomLinks()
602 global $wgOut, $wgUser, $wgTitle;
606 if ( $wgOut->isArticle() ) {
607 $s .= "<strong>" . $this->editThisPage() . "</strong>";
608 if ( 0 != $wgUser->getID() ) {
609 $s .= $sep . $this->watchThisPage();
611 $s .= $sep . $this->talkLink()
612 . $sep . $this->historyLink()
613 . $sep . $this->whatLinksHere()
614 . $sep . $this->watchPageLinksLink();
616 if ( $wgTitle->getNamespace() == Namespace::getUser()
617 ||
$wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser()) )
620 $id=User
::idFromName($wgTitle->getText());
621 $ip=User
::isIP($wgTitle->getText());
623 if($id ||
$ip) { # both anons and non-anons have contri list
624 $s .= $sep . $this->userContribsLink();
626 if ( 0 != $wgUser->getID() ) { # show only to signed in users
627 if($id) { # can only email non-anons
628 $s .= $sep . $this->emailUserLink();
632 if ( $wgUser->isSysop() && $wgTitle->getArticleId() ) {
633 $s .= "\n<br>" . $this->deleteThisPage() .
634 $sep . $this->protectThisPage() .
635 $sep . $this->moveThisPage();
637 $s .= "<br>\n" . $this->otherLanguages();
644 global $wgOut, $wgLang, $wgArticle;
645 global $oldid, $diff, $wgDisableCounters;
647 if ( ! $wgOut->isArticle() ) { return ""; }
648 if ( isset( $oldid ) ||
isset( $diff ) ) { return ""; }
649 if ( 0 == $wgArticle->getID() ) { return ""; }
651 if ( $wgDisableCounters ) {
654 $count = $wgArticle->getCount();
655 $s = wfMsg( "viewcount", $count );
657 $s .= $this->lastModified();
658 $s .= " " . wfMsg( "gnunote" );
659 return "<span id='pagestats'>{$s}</span>";
662 function lastModified()
664 global $wgLang, $wgArticle;
666 $d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true );
667 $s = " " . wfMsg( "lastmodified", $d );
671 function logoText( $align = "" )
673 if ( "" != $align ) { $a = " align='{$align}'"; }
676 $mp = wfMsg( "mainpage" );
677 $s = "<a href=\"" . wfLocalUrlE( urlencode( $mp ) )
678 . "\"><img{$a} border=0 src=\""
679 . $this->getLogo() . "\" alt=\"" . "[{$mp}]\"></a>";
685 global $wgOut, $wgTitle, $wgUser, $action, $wgLang;
686 global $wpPreview, $wgDisableUploads, $wgRemoteUploads;
688 $fname = "Skin::quickBar";
689 wfProfileIn( $fname );
691 $tns=$wgTitle->getNamespace();
693 $s = "\n<div id='quickbar'>";
694 $s .= "\n" . $this->logoText() . "\n<hr class='sep'>";
697 $s .= $this->mainPageLink()
698 . $sep . $this->specialLink( "recentchanges" )
699 . $sep . $this->specialLink( "randompage" );
700 if ($wgUser->getID()) {
701 $s.= $sep . $this->specialLink( "watchlist" ) ;
702 $s .= $sep .$this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
703 wfMsg( "mycontris" ), "target=" . wfUrlencode($wgUser->getName() ) );
706 // only show watchlist link if logged in
707 if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ;
708 $s .= "\n<br><hr class='sep'>";
709 $articleExists = $wgTitle->getArticleId();
710 if ( $wgOut->isArticle() ||
$action =="edit" ||
$action =="history" ||
$wpPreview) {
711 if($wgOut->isArticle()) {
712 $s .= "<strong>" . $this->editThisPage() . "</strong>";
713 } else { # backlink to the article in edit or history mode
714 if($articleExists){ # no backlink if no article
717 $text = wfMsg("articlepage");
720 $text = wfMsg("viewtalkpage");
723 $text = wfMsg("userpage");
726 $text = wfMsg("viewtalkpage");
729 $text = wfMsg("wikipediapage");
732 $text = wfMsg("viewtalkpage");
735 $text = wfMsg("imagepage");
738 $text = wfMsg("viewtalkpage");
741 $text= wfMsg("articlepage");
744 $link = $wgTitle->getText();
745 if ($nstext = $wgLang->getNsText($tns) ) { # add namespace if necessary
746 $link = $nstext . ":" . $link ;
749 $s .= $this->makeLink( $link, $text );
750 } elseif( $wgTitle->getNamespace() != Namespace::getSpecial() ) {
751 # we just throw in a "New page" text to tell the user that he's in edit mode,
752 # and to avoid messing with the separator that is prepended to the next item
753 $s .= "<strong>" . wfMsg("newpage") . "</strong>";
759 if( $tns%2
&& $action!="edit" && !$wpPreview) {
760 $s.="<br>".$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("postcomment"),"action=edit§ion=new");
764 watching could cause problems in edit mode:
765 if user edits article, then loads "watch this article" in background and then saves
766 article with "Watch this article" checkbox disabled, the article is transparently
767 unwatched. Therefore we do not show the "Watch this page" link in edit mode
769 if ( 0 != $wgUser->getID() && $articleExists) {
770 if($action!="edit" && $action!="history" &&
771 $action != "submit" )
773 $s .= $sep . $this->watchThisPage();
775 if ( $wgTitle->userCanEdit() )
776 $s .= $sep . $this->moveThisPage();
778 if ( $wgUser->isSysop() and $articleExists ) {
779 $s .= $sep . $this->deleteThisPage() .
780 $sep . $this->protectThisPage();
782 $s .= $sep . $this->talkLink();
783 if ($articleExists && $action !="history") {
784 $s .= $sep . $this->historyLink();
786 $s.=$sep . $this->whatLinksHere();
788 if($wgOut->isArticle()) {
789 $s .= $sep . $this->watchPageLinksLink();
792 if ( Namespace::getUser() == $wgTitle->getNamespace()
793 ||
$wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser())
796 $id=User
::idFromName($wgTitle->getText());
797 $ip=User
::isIP($wgTitle->getText());
800 $s .= $sep . $this->userContribsLink();
802 if ( 0 != $wgUser->getID() ) {
803 if($id) { # can only email real users
804 $s .= $sep . $this->emailUserLink();
808 $s .= "\n<br><hr class='sep'>";
811 if ( 0 != $wgUser->getID() && ( !$wgDisableUploads ||
$wgRemoteUploads ) ) {
812 $s .= $this->specialLink( "upload" ) . $sep;
814 $s .= $this->specialLink( "specialpages" )
815 . $sep . $this->bugReportsLink();
817 global $wgSiteSupportPage;
818 if( $wgSiteSupportPage ) {
819 $s .= "\n<br><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
820 "\" class=\"internal\">" . wfMsg( "sitesupport" ) . "</a>";
823 $s .= "\n<br></div>\n";
824 wfProfileOut( $fname );
828 function specialPagesList()
830 global $wgUser, $wgOut, $wgLang, $wgServer, $wgRedirectScript;
833 $validSP = $wgLang->getValidSpecialPages();
835 foreach ( $validSP as $name => $desc ) {
836 if ( "" == $desc ) { continue; }
839 if ( $wgUser->isSysop() )
841 $sysopSP = $wgLang->getSysopSpecialPages();
843 foreach ( $sysopSP as $name => $desc ) {
844 if ( "" == $desc ) { continue; }
848 if ( $wgUser->isDeveloper() )
850 $devSP = $wgLang->getDeveloperSpecialPages();
852 foreach ( $devSP as $name => $desc ) {
853 if ( "" == $desc ) { continue; }
858 $sp = wfMsg( "specialpages" );
859 $spp = $wgLang->specialPage( "Specialpages" );
861 $s = "<form id=\"specialpages\" method=\"get\" class=\"inline\" " .
862 "action=\"{$wgServer}{$wgRedirectScript}\">\n";
863 $s .= "<select name=\"wpDropdown\">\n";
864 $s .= "<option value=\"{$spp}\">{$sp}</option>\n";
866 foreach ( $a as $name => $desc ) {
867 $p = $wgLang->specialPage( $name );
868 $s .= "<option value=\"{$p}\">{$desc}</option>\n";
871 $s .= "<input type=submit value=\"{$go}\" name=redirect>\n";
876 function mainPageLink()
878 $mp = wfMsg( "mainpage" );
879 $s = $this->makeKnownLink( $mp, $mp );
883 function copyrightLink()
885 $s = $this->makeKnownLink( wfMsg( "copyrightpage" ),
886 wfMsg( "copyrightpagename" ) );
892 $s = $this->makeKnownLink( wfMsg( "aboutpage" ),
893 wfMsg( "aboutwikipedia" ) );
898 function disclaimerLink()
900 $s = $this->makeKnownLink( wfMsg( "disclaimerpage" ),
901 wfMsg( "disclaimers" ) );
905 function editThisPage()
907 global $wgOut, $wgTitle, $oldid, $redirect, $diff;
909 if ( ! $wgOut->isArticle() ||
$diff ) {
910 $s = wfMsg( "protectedpage" );
912 $n = $wgTitle->getPrefixedText();
913 if ( $wgTitle->userCanEdit() ) {
914 $t = wfMsg( "editthispage" );
916 #$t = wfMsg( "protectedpage" );
917 $t = wfMsg( "viewsource" );
921 if ( $redirect ) { $red = "&redirect={$redirect}"; }
922 if ( $oldid && ! isset( $diff ) ) {
923 $oid = "&oldid={$oldid}";
925 $s = $this->makeKnownLink( $n, $t, "action=edit{$oid}{$red}" );
930 function deleteThisPage()
932 global $wgUser, $wgOut, $wgTitle, $diff;
934 if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) {
935 $n = $wgTitle->getPrefixedText();
936 $t = wfMsg( "deletethispage" );
938 $s = $this->makeKnownLink( $n, $t, "action=delete" );
945 function protectThisPage()
947 global $wgUser, $wgOut, $wgTitle, $diff;
949 if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) {
950 $n = $wgTitle->getPrefixedText();
952 if ( $wgTitle->isProtected() ) {
953 $t = wfMsg( "unprotectthispage" );
954 $q = "action=unprotect";
956 $t = wfMsg( "protectthispage" );
957 $q = "action=protect";
959 $s = $this->makeKnownLink( $n, $t, $q );
966 function watchThisPage()
968 global $wgUser, $wgOut, $wgTitle, $diff;
970 if ( $wgOut->isArticle() && ( ! $diff ) ) {
971 $n = $wgTitle->getPrefixedText();
973 if ( $wgTitle->userIsWatching() ) {
974 $t = wfMsg( "unwatchthispage" );
975 $q = "action=unwatch";
977 $t = wfMsg( "watchthispage" );
980 $s = $this->makeKnownLink( $n, $t, $q );
982 $s = wfMsg( "notanarticle" );
987 function moveThisPage()
989 global $wgTitle, $wgLang;
991 if ( $wgTitle->userCanEdit() ) {
992 $s = $this->makeKnownLink( $wgLang->specialPage( "Movepage" ),
993 wfMsg( "movethispage" ), "target=" . $wgTitle->getPrefixedURL() );
994 } // no message if page is protected - would be redundant
998 function historyLink()
1002 $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
1003 wfMsg( "history" ), "action=history" );
1007 function whatLinksHere()
1009 global $wgTitle, $wgLang;
1011 $s = $this->makeKnownLink( $wgLang->specialPage( "Whatlinkshere" ),
1012 wfMsg( "whatlinkshere" ), "target=" . $wgTitle->getPrefixedURL() );
1016 function userContribsLink()
1018 global $wgTitle, $wgLang;
1020 $s = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1021 wfMsg( "contributions" ), "target=" . $wgTitle->getURL() );
1025 function emailUserLink()
1027 global $wgTitle, $wgLang;
1029 $s = $this->makeKnownLink( $wgLang->specialPage( "Emailuser" ),
1030 wfMsg( "emailuser" ), "target=" . $wgTitle->getURL() );
1034 function watchPageLinksLink()
1036 global $wgOut, $wgTitle, $wgLang;
1038 if ( ! $wgOut->isArticle() ) {
1039 $s = "(" . wfMsg( "notanarticle" ) . ")";
1041 $s = $this->makeKnownLink( $wgLang->specialPage(
1042 "Recentchangeslinked" ), wfMsg( "recentchangeslinked" ),
1043 "target=" . $wgTitle->getPrefixedURL() );
1048 function otherLanguages()
1050 global $wgOut, $wgLang, $wgTitle, $wgUseNewInterlanguage;
1052 $a = $wgOut->getLanguageLinks();
1054 if ( 0 == count( $a ) ) {
1055 if ( !$wgUseNewInterlanguage ) return "";
1056 $ns = $wgLang->getNsIndex ( $wgTitle->getNamespace () ) ;
1057 if ( $ns != 0 AND $ns != 1 ) return "" ;
1059 $x = "mode=addlink&xt=".$wgTitle->getDBkey() ;
1060 return $this->makeKnownLink( $wgLang->specialPage( $pn ),
1061 wfMsg( "intl" ) , $x );
1064 if ( !$wgUseNewInterlanguage ) {
1065 $s = wfMsg( "otherlanguages" ) . ": ";
1067 global $wgLanguageCode ;
1068 $x = "mode=zoom&xt=".$wgTitle->getDBkey() ;
1069 $x .= "&xl=".$wgLanguageCode ;
1070 $s = $this->makeKnownLink( $wgLang->specialPage( "Intl" ),
1071 wfMsg( "otherlanguages" ) , $x ) . ": " ;
1074 $s = wfMsg( "otherlanguages" ) . ": ";
1076 if($wgLang->isRTL()) $s .= "<span dir='LTR'>";
1077 foreach( $a as $l ) {
1078 if ( ! $first ) { $s .= " | "; }
1081 $nt = Title
::newFromText( $l );
1082 $url = $nt->getFullURL();
1083 $text = $wgLang->getLanguageName( $nt->getInterwiki() );
1085 if ( "" == $text ) { $text = $l; }
1086 $style = $this->getExternalLinkAttributes( $l, $text );
1087 $s .= "<a href=\"{$url}\"{$style}>{$text}</a>";
1089 if($wgLang->isRTL()) $s .= "</span>";
1093 function bugReportsLink()
1095 $s = $this->makeKnownLink( wfMsg( "bugreportspage" ),
1096 wfMsg( "bugreports" ) );
1102 global $wgLinkCache;
1103 $t1 = Title
::newFromText( gmdate( "F j" ) );
1104 $t2 = Title
::newFromText( gmdate( "Y" ) );
1106 $wgLinkCache->suspend();
1107 $id = $t1->getArticleID();
1108 $wgLinkCache->resume();
1111 $s = $this->makeBrokenLink( $t1->getText() );
1113 $s = $this->makeKnownLink( $t1->getText() );
1117 $wgLinkCache->suspend();
1118 $id = $t2->getArticleID();
1119 $wgLinkCache->resume();
1122 $s .= $this->makeBrokenLink( $t2->getText() );
1124 $s .= $this->makeKnownLink( $t2->getText() );
1131 global $wgLang, $wgTitle, $wgLinkCache;
1133 $tns = $wgTitle->getNamespace();
1134 if ( -1 == $tns ) { return ""; }
1136 $pn = $wgTitle->getText();
1137 $tp = wfMsg( "talkpage" );
1138 if ( Namespace::isTalk( $tns ) ) {
1139 $lns = Namespace::getSubject( $tns );
1142 $text = wfMsg("articlepage");
1145 $text = wfMsg("userpage");
1148 $text = wfMsg("wikipediapage");
1151 $text = wfMsg("imagepage");
1154 $text= wfMsg("articlepage");
1158 $lns = Namespace::getTalk( $tns );
1161 $n = $wgLang->getNsText( $lns );
1162 if ( "" == $n ) { $link = $pn; }
1163 else { $link = "{$n}:{$pn}"; }
1165 $wgLinkCache->suspend();
1166 $s = $this->makeLink( $link, $text );
1167 $wgLinkCache->resume();
1172 function commentLink()
1174 global $wgLang, $wgTitle, $wgLinkCache;
1176 $tns = $wgTitle->getNamespace();
1177 if ( -1 == $tns ) { return ""; }
1179 $lns = ( Namespace::isTalk( $tns ) ) ?
$tns : Namespace::getTalk( $tns );
1181 # assert Namespace::isTalk( $lns )
1183 $n = $wgLang->getNsText( $lns );
1184 $pn = $wgTitle->getText();
1186 $link = "{$n}:{$pn}";
1188 $wgLinkCache->suspend();
1189 $s = $this->makeKnownLink($link, wfMsg("postcomment"), "action=edit§ion=new");
1190 $wgLinkCache->resume();
1195 # After all the page content is transformed into HTML, it makes
1196 # a final pass through here for things like table backgrounds.
1198 function transformContent( $text )
1203 # Note: This function MUST call getArticleID() on the link,
1204 # otherwise the cache won't get updated properly. See LINKCACHE.DOC.
1206 function makeLink( $title, $text = "", $query = "", $trail = "" ) {
1207 wfProfileIn( "Skin::makeLink" );
1208 $nt = Title
::newFromText( $title );
1210 $result = $this->makeLinkObj( Title
::newFromText( $title ), $text, $query, $trail );
1212 wfDebug( "Invalid title passed to Skin::makeLink(): \"$title\"\n" );
1213 $result = $text == "" ?
$title : $text;
1216 wfProfileOut( "Skin::makeLink" );
1220 function makeKnownLink( $title, $text = "", $query = "", $trail = "" ) {
1221 $nt = Title
::newFromText( $title );
1223 return $this->makeKnownLinkObj( Title
::newFromText( $title ), $text, $query, $trail );
1225 wfDebug( "Invalid title passed to Skin::makeKnownLink(): \"$title\"\n" );
1226 return $text == "" ?
$title : $text;
1230 function makeBrokenLink( $title, $text = "", $query = "", $trail = "" ) {
1231 $nt = Title
::newFromText( $title );
1233 return $this->makeBrokenLinkObj( Title
::newFromText( $title ), $text, $query, $trail );
1235 wfDebug( "Invalid title passed to Skin::makeBrokenLink(): \"$title\"\n" );
1236 return $text == "" ?
$title : $text;
1240 function makeStubLink( $title, $text = "", $query = "", $trail = "" ) {
1241 $nt = Title
::newFromText( $title );
1243 return $this->makeStubLinkObj( Title
::newFromText( $title ), $text, $query, $trail );
1245 wfDebug( "Invalid title passed to Skin::makeStubLink(): \"$title\"\n" );
1246 return $text == "" ?
$title : $text;
1250 # Pass a title object, not a title string
1251 function makeLinkObj( &$nt, $text= "", $query = "", $trail = "" )
1253 global $wgOut, $wgUser;
1254 if ( $nt->isExternal() ) {
1255 $u = $nt->getFullURL();
1256 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1257 $style = $this->getExternalLinkAttributes( $link, $text );
1260 if ( "" != $trail ) {
1261 if ( preg_match( "/^([a-z]+)(.*)$$/sD", $trail, $m ) ) {
1266 $retVal = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1267 } elseif ( 0 == $nt->getNamespace() && "" == $nt->getText() ) {
1268 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1269 } elseif ( ( -1 == $nt->getNamespace() ) ||
1270 ( Namespace::getImage() == $nt->getNamespace() ) ) {
1271 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1273 $aid = $nt->getArticleID() ;
1275 $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail );
1277 $threshold = $wgUser->getOption("stubthreshold") ;
1278 if ( $threshold > 0 ) {
1279 $res = wfQuery ( "SELECT HIGH_PRIORITY length(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'", DB_READ
) ;
1281 if ( wfNumRows( $res ) > 0 ) {
1282 $s = wfFetchObject( $res );
1284 if ( $s->cur_is_redirect
OR $s->cur_namespace
!= 0 ) {
1285 $size = $threshold*2 ; # Really big
1287 wfFreeResult( $res );
1289 $size = $threshold*2 ; # Really big
1294 if ( $size < $threshold ) {
1295 $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail );
1297 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1304 # Pass a title object, not a title string
1305 function makeKnownLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1307 global $wgOut, $wgTitle;
1309 $fname = "Skin::makeKnownLinkObj";
1310 wfProfileIn( $fname );
1312 $link = $nt->getPrefixedURL();
1314 if ( "" == $link ) {
1316 if ( "" == $text ) { $text = $nt->getFragment(); }
1318 $u = wfLocalUrlE( $link, $query );
1320 if ( "" != $nt->getFragment() ) {
1321 $u .= "#" . wfEscapeHTML( $nt->getFragment() );
1323 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1324 $style = $this->getInternalLinkAttributesObj( $nt, $text );
1327 if ( "" != $trail ) {
1328 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1333 $r = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1334 wfProfileOut( $fname );
1338 # Pass a title object, not a title string
1339 function makeBrokenLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1341 global $wgOut, $wgUser;
1343 $fname = "Skin::makeBrokenLinkObj";
1344 wfProfileIn( $fname );
1346 $link = $nt->getPrefixedURL();
1348 if ( "" == $query ) { $q = "action=edit"; }
1349 else { $q = "action=edit&{$query}"; }
1350 $u = wfLocalUrlE( $link, $q );
1352 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1353 $style = $this->getInternalLinkAttributesObj( $nt, $text, "yes" );
1356 if ( "" != $trail ) {
1357 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1362 if ( $wgOut->isPrintable() ||
1363 ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
1364 $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1366 $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>?</a>{$trail}";
1369 wfProfileOut( $fname );
1373 # Pass a title object, not a title string
1374 function makeStubLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1376 global $wgOut, $wgUser;
1378 $link = $nt->getPrefixedURL();
1380 $u = wfLocalUrlE( $link, $query );
1382 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1383 $style = $this->getInternalLinkAttributesObj( $nt, $text, "stub" );
1386 if ( "" != $trail ) {
1387 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1392 if ( $wgOut->isPrintable() ||
1393 ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
1394 $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1396 $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>!</a>{$trail}";
1401 function fnamePart( $url )
1403 $basename = strrchr( $url, "/" );
1404 if ( false === $basename ) { $basename = $url; }
1405 else { $basename = substr( $basename, 1 ); }
1406 return wfEscapeHTML( $basename );
1409 function makeImage( $url, $alt = "" )
1413 if ( "" == $alt ) { $alt = $this->fnamePart( $url ); }
1414 $s = "<img src=\"{$url}\" alt=\"{$alt}\">";
1418 function makeImageLink( $name, $url, $alt = "" ) {
1419 $nt = Title
::makeTitle( Namespace::getImage(), $name );
1420 return $this->makeImageLinkObj( $nt, $alt );
1423 function makeImageLinkObj( $nt, $alt = "" ) {
1424 global $wgLang, $wgUseImageResize;
1425 $link = $nt->getPrefixedURL();
1426 $name = $nt->getDBKey();
1427 $url = wfImageUrl( $name );
1430 if ( $wgUseImageResize ) {
1431 # Check if the alt text is of the form "options|alt text"
1433 # * thumbnail make a thumbnail with enlarge-icon and caption, alignment depends on lang
1434 # * left no resizing, just left align. label is used for alt= only
1435 # * right same, but right aligned
1436 # * none same, but not aligned
1437 # * ___px scale to ___ pixels width, no aligning. e.g. use in taxobox
1439 $part = explode( "|", $alt);
1441 if ( count($part) > 1 ) {
1442 $mwThumb =& MagicWord
::get( MAG_IMG_THUMBNAIL
);
1443 $mwLeft =& MagicWord
::get( MAG_IMG_LEFT
);
1444 $mwRight =& MagicWord
::get( MAG_IMG_RIGHT
);
1445 $mwNone =& MagicWord
::get( MAG_IMG_NONE
);
1446 $mwWidth =& MagicWord
::get( MAG_IMG_WIDTH
);
1447 $alt = $part[count($part)-1];
1451 foreach( $part as $key => $val ) {
1452 if ( ! is_null( $mwThumb->matchVariableStartToEnd($val) ) ) {
1454 } elseif ( ! is_null( $mwRight->matchVariableStartToEnd($val) ) ) {
1455 # remember to set an alignment, don't render immediately
1457 } elseif ( ! is_null( $mwLeft->matchVariableStartToEnd($val) ) ) {
1458 # remember to set an alignment, don't render immediately
1460 } elseif ( ! is_null( $mwNone->matchVariableStartToEnd($val) ) ) {
1461 # remember to set an alignment, don't render immediately
1463 } elseif ( ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) {
1464 # $match is the image width in pixels
1465 $width = intval($match);
1472 # Create a thumbnail. Alignment depends on language
1473 # writing direction, # right aligned for left-to-right-
1474 # languages ("Western languages"), left-aligned
1475 # for right-to-left-languages ("Semitic languages")
1477 # If thumbnail width has not been provided, it is set
1478 # here to 180 pixels
1479 if ( $align == "" ) {
1480 $align = $wgLang->isRTL() ?
"left" : "right";
1482 if ( ! isset($width) ) {
1485 return $this->makeThumbLinkObj( $nt, $alt, $align, $width );
1487 } elseif ( isset($width) ) {
1489 # Create a resized image, without the additional thumbnail
1491 $url = $this->createThumb( $name, $width );
1493 } # endif $wgUseImageResize
1495 if ( empty( $alt ) ) {
1496 $alt = preg_replace( '/\.(.+?)^/', '', $name );
1498 $alt = htmlspecialchars( $alt );
1500 $u = wfLocalUrlE( $link );
1501 $s = "<a href=\"{$u}\" class='image' title=\"{$alt}\">" .
1502 "<img border=\"0\" src=\"{$url}\" alt=\"{$alt}\"></a>";
1503 if ( "" != $align ) {
1504 $s = "<div class=\"float{$align}\">{$s}</div>";
1509 function createThumb( $name, $width ) {
1510 global $wgUploadDirectory;
1511 global $wgImageMagickConvertCommand;
1512 global $wgUseImageMagick;
1513 $imgPath = wfImagePath( $name );
1514 $thumbName = $width."px-".$icon.$name;
1515 $thumbPath = wfImageArchiveDir( $thumbName, "thumb" )."/".$thumbName;
1516 $thumbUrl = wfImageArchiveUrl( $thumbName, "thumb" );
1518 if ( (! file_exists( $thumbPath ))
1519 ||
( filemtime($thumbPath) < filemtime($imgPath) ) ) {
1520 if ( $wgUseImageMagick ) {
1522 $cmd = $wgImageMagickConvertCommand .
1523 " -quality 95 -geometry {$width}x ".
1524 escapeshellarg($imgPath) . " " .
1525 escapeshellarg($thumbPath);
1526 $conv = shell_exec( $cmd );
1528 # Use PHP's builtin GD library functions.
1530 # First find out what kind of file this is, and select the correct
1531 # input routine for this.
1532 list($src_width, $src_height, $src_type, $src_attr) = getimagesize( $imgPath );
1533 switch( $src_type ) {
1535 $src_image = imagecreatefromgif( $imgPath );
1538 $src_image = imagecreatefromjpeg( $imgPath );
1541 $src_image = imagecreatefrompng( $imgPath );
1543 case 15: # WBMP for WML
1544 $src_image = imagecreatefromwbmp( $imgPath );
1547 $src_image = imagecreatefromxbm( $imgPath );
1550 return "Image type not supported";
1553 $height = floor( $src_height * ( $width/$src_width ) );
1554 $dst_image = imagecreatetruecolor( $width, $height );
1555 imagecopyresampled( $dst_image, $src_image,
1557 $width, $height, $src_width, $src_height );
1558 switch( $src_type ) {
1563 #$thumbUrl .= ".png";
1564 #$thumbPath .= ".png";
1565 imagepng( $dst_image, $thumbPath );
1568 #$thumbUrl .= ".jpg";
1569 #$thumbPath .= ".jpg";
1570 imageinterlace( $dst_image );
1571 imagejpeg( $dst_image, $thumbPath, 95 );
1576 imagedestroy( $dst_image );
1577 imagedestroy( $src_image );
1586 function makeThumbLinkObj( $nt, $label = "", $align = "right", $boxwidth = 180 ) {
1587 global $wgUploadPath;
1588 $name = $nt->getDBKey();
1589 $image = Title
::makeTitle( Namespace::getImage(), $name );
1590 $link = $image->getPrefixedURL();
1591 $url = wfImageUrl( $name );
1592 $path = wfImagePath( $name );
1594 list($width, $height, $type, $attr) = getimagesize( $path );
1595 $cwidth = $boxwidth;
1596 $cheight = intval( $height/($width/$cwidth) );
1597 if ($cheight > $boxwidth*1.5) {
1598 $cheight = $boxwidth*1.3;
1599 $cwidth = intval( $width/($height/$cheight) );
1601 if ( $cwidth > $width ) {
1606 $thumbUrl = $this->createThumb( $name, $cwidth );
1608 $u = wfLocalUrlE( $link );
1610 $more = wfMsg( "thumbnail-more" );
1612 $s = "<div class=\"thumbnail-{$align}\" style=\"width:{$boxwidth}px;\">" .
1613 "<a href=\"{$u}\" class=\"internal\" title=\"{$label}\">" .
1614 "<img border=\"0\" src=\"{$thumbUrl}\" alt=\"{$label}\" width=\"{$cwidth}\" height=\"{$cheight}\"></a>" .
1615 "<a href=\"{$u}\" class=\"internal\" title=\"{$more}\">" .
1616 "<img border=\"0\" src=\"{$wgUploadPath}/magnify-clip.png\" width=\"26\" height=\"24\" align=\"right\" alt=\"{$more}\"></a>" .
1617 "<p>{$label}</div></p>";
1621 function makeMediaLink( $name, $url, $alt = "" ) {
1622 $nt = Title
::makeTitle( Namespace::getMedia(), $name );
1623 return $this->makeMediaLinkObj( $nt, $alt );
1626 function makeMediaLinkObj( $nt, $alt = "" )
1628 $name = $nt->getDBKey();
1629 $url = wfImageUrl( $name );
1630 if ( empty( $alt ) ) {
1631 $alt = preg_replace( '/\.(.+?)^/', '', $name );
1634 $u = htmlspecialchars( $url );
1635 $s = "<a href=\"{$u}\" class='internal' title=\"{$alt}\">{$alt}</a>";
1639 function specialLink( $name, $key = "" )
1643 if ( "" == $key ) { $key = strtolower( $name ); }
1644 $pn = $wgLang->ucfirst( $name );
1645 return $this->makeKnownLink( $wgLang->specialPage( $pn ),
1649 # Called by history lists and recent changes
1652 function beginRecentChangesList()
1654 $rc_cache = array() ;
1656 $this->lastdate
= "";
1660 function beginImageHistoryList()
1662 $s = "\n<h2>" . wfMsg( "imghistory" ) . "</h2>\n" .
1663 "<p>" . wfMsg( "imghistlegend" ) . "\n<ul>";
1667 function endRecentChangesList()
1669 $s = $this->recentChangesBlock() ;
1674 function endImageHistoryList()
1680 function recentChangesBlockLine ( $y ) {
1681 global $wgUploadPath ;
1683 $M = wfMsg( "minoreditletter" );
1684 $N = wfMsg( "newpageletter" );
1686 $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>" ;
1688 if ( $y->isnew
) $r .= $N ;
1689 else $r .= " " ;
1690 if ( $y->isminor
) $r .= $M ;
1691 else $r .= " " ;
1692 $r .= " ".$y->timestamp
." " ;
1695 if ( $y->watched
) $link = "<strong>{$link}</strong>" ;
1701 $r .= $this->makeKnownLink( $y->secureName
, wfMsg( "hist" ), "action=history" );
1703 $r .= ") . . ".$y->userlink
;
1704 $r .= $y->usertalklink
;
1705 if ( $y->usercomment
!= "" )
1706 $r .= " <em>(".wfEscapeHTML($y->usercomment
).")</em>" ;
1711 function recentChangesBlockGroup ( $y ) {
1712 global $wgUploadPath ;
1715 $M = wfMsg( "minoreditletter" );
1716 $N = wfMsg( "newpageletter" );
1718 $userlinks = array () ;
1719 foreach ( $y AS $x ) {
1720 $oldid = $x->diffid
;
1721 if ( $x->isnew
) $isnew = true ;
1723 if ( !isset ( $userlinks[$u] ) ) $userlinks[$u] = 0 ;
1727 krsort ( $userlinks ) ;
1728 asort ( $userlinks ) ;
1730 $u = array_keys ( $userlinks ) ;
1731 foreach ( $u as $x ) {
1733 if ( $userlinks[$x] > 1 ) $z .= " ({$userlinks[$x]}×)" ;
1734 array_push ( $users , $z ) ;
1736 $users = " <font size='-1'>[".implode("; ",$users)."]</font>" ;
1739 $e = array_shift ( $e ) ;
1742 $rci = "RCI{$this->rccc}" ;
1743 $rcl = "RCL{$this->rccc}" ;
1744 $rcm = "RCM{$this->rccc}" ;
1745 $tl = "<a href='javascript:toggleVisibility(\"{$rci}\",\"{$rcm}\",\"{$rcl}\")'>" ;
1746 $tl .= "<span id='{$rcm}'><img src='{$wgUploadPath}/Arr_r.png' width=12 height=12 border=0></span>" ;
1747 $tl .= "<span id='{$rcl}' style='display:none'><img src='{$wgUploadPath}/Arr_d.png' width=12 height=12 border=0></span>" ;
1753 if ( $isnew ) $r .= $N ;
1754 else $r .= " " ;
1755 $r .= " " ; # Minor
1756 $r .= " ".$e->timestamp
." " ;
1760 if ( $e->watched
) $link = "<strong>{$link}</strong>" ;
1764 $r .= " (".count($y)." " ;
1765 if ( $isnew ) $r .= wfMsg("changes");
1766 else $r .= $this->makeKnownLink( $e->secureName
, wfMsg("changes") , "diff=0&oldid=".$oldid ) ;
1768 $r .= $this->makeKnownLink( $e->secureName
, wfMsg( "history" ), "action=history" );
1776 $r .= "<div id='{$rci}' style='display:none'>" ;
1777 foreach ( $y AS $x )
1779 $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>";
1780 $r .= "<tt> " ;
1781 if ( $x->isnew
) $r .= $N ;
1782 else $r .= " " ;
1783 if ( $x->isminor
) $r .= $M ;
1784 else $r .= " " ;
1788 if ( $x->oldid
!= 0 ) $o = "oldid=".$x->oldid
;
1789 if ( $x->islog
) $link = $x->timestamp
;
1790 else $link = $this->makeKnownLink( $x->secureName
, $x->timestamp
, $o ) ;
1791 $link = "<tt>{$link}</tt>" ;
1798 $r .= $x->lastlink
;
1799 $r .= ") . . ".$x->userlink
;
1800 $r .= $x->usertalklink
;
1801 if ( $x->usercomment
!= "" )
1802 $r .= " <em>(".wfEscapeHTML($x->usercomment
).")</em>" ;
1811 function recentChangesBlock ()
1813 global $wgUploadPath ;
1814 if ( count ( $this->rc_cache
) == 0 ) return "" ;
1815 $k = array_keys ( $this->rc_cache
) ;
1816 foreach ( $k AS $x )
1818 $y = $this->rc_cache
[$x] ;
1819 if ( count ( $y ) < 2 ) {
1820 $r .= $this->recentChangesBlockLine ( array_shift ( $y ) ) ;
1822 $r .= $this->recentChangesBlockGroup ( $y ) ;
1826 return "<div align=left>{$r}</div>" ;
1829 function recentChangesLine( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
1832 $usenew = $wgUser->getOption( "usenewrc" );
1834 $r = $this->recentChangesLineNew ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
1836 $r = $this->recentChangesLineOld ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
1840 function recentChangesLineOld( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0, $diffid = 0 )
1842 global $wgTitle, $wgLang, $wgUser;
1844 $d = $wgLang->date( $ts, true);
1846 if ( $d != $this->lastdate
) {
1847 if ( "" != $this->lastdate
) { $s .= "</ul>\n"; }
1848 $s .= "<h4>{$d}</h4>\n<ul>";
1849 $this->lastdate
= $d;
1851 $h = $wgLang->time( $ts, true );
1852 $t = Title
::makeName( $ns, $ttl );
1853 $clink = $this->makeKnownLink( $t , "" );
1854 $nt = Title
::newFromText( $t );
1857 $clink = "<strong>{$clink}</strong>";
1859 $hlink = $this->makeKnownLink( $t, wfMsg( "hist" ), "action=history" );
1860 if ( $isnew ||
$nt->isLog() ) {
1861 $dlink = wfMsg( "diff" );
1863 $dlink = $this->makeKnownLink( $t, wfMsg( "diff" ),
1864 "diff={$oldid}&oldid={$diffid}" ); # Finagle's law
1867 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1868 $ut, "target=" . $ut );
1870 $ul = $this->makeLink( $wgLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut );
1873 $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
1874 global $wgDisableAnonTalk;
1875 if( 0 == $u && $wgDisableAnonTalk ) {
1878 $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
1879 $utl= $this->makeLink($utns . ":{$ut}", $talkname );
1881 $cr = wfMsg( "currentrev" );
1883 $s .= "<li> ({$dlink}) ({$hlink}) . .";
1884 $M = wfMsg( "minoreditletter" );
1885 $N = wfMsg( "newpageletter" );
1886 if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
1887 if ( $isnew ) { $s .= "<strong>{$N}</strong>"; }
1888 $s .= " {$clink}; {$h} . . {$ul}";
1891 if ( ( 0 == $u ) && $wgUser->isSysop() ) {
1892 $blink = $this->makeKnownLink( $wgLang->specialPage(
1893 "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
1897 if($utl) $utl .= " | ";
1900 if($utl) $s.=" ({$utl})";
1902 if ( "" != $c && "*" != $c ) {
1903 $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
1910 function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
1912 global $wgTitle, $wgLang, $wgUser;
1914 $rc = new RecentChangesClass
;
1916 $d = $wgLang->date( $ts, true);
1919 if ( $d != $this->lastdate
) {
1920 $ret = $this->recentChangesBlock () ;
1921 $this->rc_cache
= array() ;
1922 $ret .= "<h4>{$d}</h4>\n";
1923 $this->lastdate
= $d;
1925 $h = $wgLang->time( $ts, true );
1926 $t = Title
::makeName( $ns, $ttl );
1927 $clink = $this->makeKnownLink( $t, "" ) ;
1928 if ( $oldid == 0 ) $c2link = $clink ;
1929 else $c2link = $this->makeKnownLink( $t, "" , "oldid={$oldid}" );
1930 $nt = Title
::newFromText( $t );
1932 $rc->timestamp
= $h ;
1933 $rc->oldid
= $oldid ;
1934 $rc->diffid
= $diffid ;
1935 $rc->watched
= $watched ;
1936 $rc->isnew
= $isnew ;
1937 $rc->isminor
= $isminor ;
1938 $rc->secureName
= $t ;
1939 $rc->displayName
= $nt ;
1940 $rc->link
= $clink ;
1941 $rc->usercomment
= $c ;
1942 $rc->islog
= $nt->isLog() ;
1944 if ( ( $isnew && $oldid == 0 ) ||
$nt->isLog() ) {
1945 $dlink = wfMsg( "cur" );
1947 $dlink = $this->makeKnownLink( $t, wfMsg( "cur" ),
1948 "diff=0&oldid={$oldid}" );
1951 if ( $diffid == 0 ||
$nt->isLog() ) {
1952 $plink = wfMsg( "last" );
1954 $plink = $this->makeKnownLink( $t, wfMsg( "last" ),
1955 "diff={$oldid}&oldid={$diffid}" );
1959 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1960 $ut, "target=" . $ut );
1961 } else { $ul = $this->makeLink( $wgLang->getNsText(
1962 Namespace::getUser() ) . ":{$ut}", $ut ); }
1964 $rc->userlink
= $ul ;
1965 $rc->lastlink
= $plink ;
1966 $rc->curlink
= $dlink ;
1968 $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
1969 $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
1970 $utl= $this->makeLink($utns . ":{$ut}", $talkname );
1972 global $wgDisableAnonTalk;
1973 if ( ( 0 == $u ) && $wgUser->isSysop() ) {
1974 $blink = $this->makeKnownLink( $wgLang->specialPage(
1975 "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
1976 if( $wgDisableAnonTalk )
1977 $rc->usertalklink
= " ({$blink})";
1979 $rc->usertalklink
= " ({$utl} | {$blink})";
1981 if( $wgDisableAnonTalk && ($u == 0) )
1982 $rc->usertalklink
= "";
1984 $rc->usertalklink
= " ({$utl})";
1987 if ( !isset ( $this->rc_cache
[$t] ) ) $this->rc_cache
[$t] = array() ;
1988 array_push ( $this->rc_cache
[$t] , $rc ) ;
1993 function imageHistoryLine( $iscur, $ts, $img, $u, $ut, $size, $c )
1995 global $wgUser, $wgLang, $wgTitle;
1997 $dt = $wgLang->timeanddate( $ts, true );
1998 $del = wfMsg( "deleteimg" );
1999 $cur = wfMsg( "cur" );
2002 $url = wfImageUrl( $img );
2004 if ( $wgUser->isSysop() ) {
2005 $link = wfLocalUrlE( $wgTitle->getPrefixedText(), "image=" . $wgTitle->getURL() .
2007 $style = $this->getInternalLinkAttributes( $link, $del );
2009 $dlink = "<a href=\"{$link}\"{$style}>{$del}</a>";
2014 $url = wfEscapeHTML( wfImageArchiveUrl( $img ) );
2015 if( $wgUser->getID() != 0 ) {
2016 $rlink = $this->makeKnownLink( $wgTitle->getPrefixedText(),
2017 wfMsg( "revertimg" ), "action=revert&oldimage=" .
2018 urlencode( $img ) );
2019 $dlink = $this->makeKnownLink( $wgTitle->getPrefixedText(),
2020 $del, "action=delete&oldimage=" . urlencode( $img ) );
2022 # Having live active links for non-logged in users
2023 # means that bots and spiders crawling our site can
2024 # inadvertently change content. Baaaad idea.
2025 $rlink = wfMsg( "revertimg" );
2029 if ( 0 == $u ) { $ul = $ut; }
2030 else { $ul = $this->makeLink( $wgLang->getNsText(
2031 Namespace::getUser() ) . ":{$ut}", $ut ); }
2033 $nb = wfMsg( "nbytes", $size );
2034 $style = $this->getInternalLinkAttributes( $url, $dt );
2036 $s = "<li> ({$dlink}) ({$rlink}) <a href=\"{$url}\"{$style}>{$dt}</a>"
2037 . " . . {$ul} ({$nb})";
2039 if ( "" != $c && "*" != $c ) {
2040 $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
2046 function tocIndent($level) {
2048 while($level-->0) $rv.="<div style=\"margin-left:2em;\">\n";
2053 function tocUnindent($level) {
2055 while($level-->0) $rv.="</div>\n";
2059 // parameter level defines if we are on an indentation level
2060 function tocLine($anchor,$tocline,$level) {
2064 return "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n";
2067 return "<div style=\"margin-bottom:0px;\">\n".
2068 "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n".
2074 function tocTable($toc) {
2075 // note to CSS fanatics: putting this in a div does not work -- div won't auto-expand
2079 $hideline = " <script type='text/javascript'>showTocToggle(\"" . wfMsg("showtoc") . "\",\"" . wfMsg("hidetoc") . "\")</script>";
2082 "<p><table border=\"0\" id=\"toc\"><tr><td align=\"center\">\n".
2083 "<b>".wfMsg("toc")."</b>" .
2085 "</td></tr><tr id='tocinside'><td align=\"left\">\n".
2086 $toc."</td></tr></table><P>\n";
2089 # These two do not check for permissions: check $wgTitle->userCanEdit before calling them
2090 function editSectionScript($section,$head) {
2092 global $wgTitle,$wgUser,$oldid;
2093 if($oldid) return $head;
2094 $url = wfLocalUrlE(urlencode($wgTitle->getPrefixedText()),"action=edit§ion=$section");
2095 return "<span onContextMenu='document.location=\"".$url."\";return false;'>{$head}</span>";
2098 function editSectionLink($section) {
2101 global $wgTitle,$wgUser,$oldid;
2102 if($oldid) return "";
2103 if ($printable) return "";
2104 $editurl="§ion={$section}";
2105 $url=$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("editsection"),"action=edit".$editurl);
2106 return "<div style=\"float:right;margin-left:5px;\"><small>[".$url."]</small></div>";
2110 // This function is called by EditPage.php and shows a bulletin board style
2111 // toolbar for common editing functions. It can be disabled in the user preferences.
2112 // The necsesary JavaScript code can be found in style/wikibits.js.
2113 function getEditToolbar() {
2115 global $wgUploadPath;
2117 // toolarray an array of arrays which each include the filename of
2118 // the button image (without path), the opening tag, the closing tag,
2119 // and optionally a sample text that is inserted between the two when no
2120 // selection is highlighted.
2121 // The tip text is shown when the user moves the mouse over the button.
2123 array( "image"=>"button_bold.gif",
2124 "open"=>"\\'\\'\\'",
2125 "close"=>"\\'\\'\\'",
2126 "sample"=>wfMsg("bold_sample"),
2127 "tip"=>wfMsg("bold_tip")),
2128 array( "image"=>"button_italic.gif",
2131 "sample"=>wfMsg("italic_sample"),
2132 "tip"=>wfMsg("italic_tip")),
2133 array( "image"=>"button_link.gif",
2136 "sample"=>wfMsg("link_sample"),
2137 "tip"=>wfMsg("link_tip")),
2138 array( "image"=>"button_extlink.gif",
2141 "sample"=>wfMsg("extlink_sample"),
2142 "tip"=>wfMsg("extlink_tip")),
2143 array( "image"=>"button_headline.gif",
2146 "sample"=>wfMsg("headline_sample"),
2147 "tip"=>wfMsg("headline_tip")),
2148 array( "image"=>"button_math.gif",
2149 "open"=>"\\<math\\>",
2150 "close"=>"\\</math\\>",
2151 "sample"=>wfMsg("math_sample"),
2152 "tip"=>wfMsg("math_tip")),
2153 array( "image"=>"button_image.gif",
2156 "sample"=>wfMsg("image_sample"),
2157 "tip"=>wfMsg("image_tip")),
2158 array( "image"=>"button_media.gif",
2161 "sample"=>wfMsg("media_sample"),
2162 "tip"=>wfMsg("media_tip")),
2163 array( "image"=>"button_sig.gif",
2167 "tip"=>wfMsg("sig_tip")),
2168 array( "image"=>"button_hr.gif",
2169 "open"=>"\\n----\\n",
2172 "tip"=>wfMsg("hr_tip"))
2175 <div id=\"toolbar\">";
2176 foreach($toolarray as $tool) {
2178 $image=$tool["image"];
2179 $open=$tool["open"];
2180 $close=$tool["close"];
2181 $sample=$tool["sample"];
2183 // Note that we use the tip both for the ALT tag and the TITLE tag of the image.
2184 // Older browsers show a "speedtip" type message only for ALT.
2185 // Ideally these should be different, realistically they
2186 // probably don't need to be.
2191 "onclick=\"javascript:insertTags('$open','$close','$sample');\">".
2192 "<img src=\"$wgUploadPath/$image\" border=\"0\" ALT=\"$tip\" TITLE=\"$tip\">".
2203 include_once( "SkinStandard.php" );
2204 include_once( "SkinNostalgia.php" );
2205 include_once( "SkinCologneBlue.php" );
2207 #include_once( "SkinSmarty.php" );