skin.php
来自「php 开发的内容管理系统」· PHP 代码 · 共 1,500 行 · 第 1/3 页
PHP
1,500 行
function getCategoryLinks () { global $wgOut, $wgTitle, $wgUseCategoryBrowser; global $wgContLang; if( count( $wgOut->mCategoryLinks ) == 0 ) return ''; # Separator $sep = wfMsgHtml( 'catseparator' ); // Use Unicode bidi embedding override characters, // to make sure links don't smash each other up in ugly ways. $dir = $wgContLang->isRTL() ? 'rtl' : 'ltr'; $embed = "<span dir='$dir'>"; $pop = '</span>'; $t = $embed . implode ( "{$pop} {$sep} {$embed}" , $wgOut->mCategoryLinks ) . $pop; $msg = wfMsgExt('categories', array('parsemag', 'escape'), count( $wgOut->mCategoryLinks )); $s = $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Categories' ), $msg, 'article=' . urlencode( $wgTitle->getPrefixedDBkey() ) ) . ': ' . $t; # optional 'dmoz-like' category browser. Will be shown under the list # of categories an article belong to if($wgUseCategoryBrowser) { $s .= '<br /><hr />'; # get a big array of the parents tree $parenttree = $wgTitle->getParentCategoryTree(); # Skin object passed by reference cause it can not be # accessed under the method subfunction drawCategoryBrowser $tempout = explode("\n", Skin::drawCategoryBrowser($parenttree, $this) ); # Clean out bogus first entry and sort them unset($tempout[0]); asort($tempout); # Output one per line $s .= implode("<br />\n", $tempout); } return $s; } /** Render the array as a serie of links. * @param $tree Array: categories tree returned by Title::getParentCategoryTree * @param &skin Object: skin passed by reference * @return String separated by >, terminate with "\n" */ function drawCategoryBrowser($tree, &$skin) { $return = ''; foreach ($tree as $element => $parent) { if (empty($parent)) { # element start a new list $return .= "\n"; } else { # grab the others elements $return .= Skin::drawCategoryBrowser($parent, $skin) . ' > '; } # add our current element to the list $eltitle = Title::NewFromText($element); $return .= $skin->makeLinkObj( $eltitle, $eltitle->getText() ) ; } return $return; } function getCategories() { $catlinks=$this->getCategoryLinks(); if(!empty($catlinks)) { return "<p class='catlinks'>{$catlinks}</p>"; } } function getQuickbarCompensator( $rows = 1 ) { return "<td width='152' rowspan='{$rows}'> </td>"; } /** * This gets called immediately before the \</body\> tag. * @return String HTML to be put after \</body\> ??? */ function afterContent() { $printfooter = "<div class=\"printfooter\">\n" . $this->printFooter() . "</div>\n"; return $printfooter . $this->doAfterContent(); } /** @return string Retrievied from HTML text */ function printSource() { global $wgTitle; $url = htmlspecialchars( $wgTitle->getFullURL() ); return wfMsg( 'retrievedfrom', '<a href="'.$url.'">'.$url.'</a>' ); } function printFooter() { return "<p>" . $this->printSource() . "</p>\n\n<p>" . $this->pageStats() . "</p>\n"; } /** overloaded by derived classes */ function doAfterContent() { } function pageTitleLinks() { global $wgOut, $wgTitle, $wgUser, $wgRequest; extract( $wgRequest->getValues( 'oldid', 'diff' ) ); $action = $wgRequest->getText( 'action' ); $s = $this->printableLink(); $disclaimer = $this->disclaimerLink(); # may be empty if( $disclaimer ) { $s .= ' | ' . $disclaimer; } $privacy = $this->privacyLink(); # may be empty too if( $privacy ) { $s .= ' | ' . $privacy; } if ( $wgOut->isArticleRelated() ) { if ( $wgTitle->getNamespace() == NS_IMAGE ) { $name = $wgTitle->getDBkey(); $image = new Image( $wgTitle ); if( $image->exists() ) { $link = htmlspecialchars( $image->getURL() ); $style = $this->getInternalLinkAttributes( $link, $name ); $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>"; } } } if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) { $s .= ' | ' . $this->makeKnownLinkObj( $wgTitle, wfMsg( 'currentrev' ) ); } if ( $wgUser->getNewtalk() ) { # do not show "You have new messages" text when we are viewing our # own talk page if( !$wgTitle->equals( $wgUser->getTalkPage() ) ) { $tl = $this->makeKnownLinkObj( $wgUser->getTalkPage(), wfMsgHtml( 'newmessageslink' ), 'redirect=no' ); $dl = $this->makeKnownLinkObj( $wgUser->getTalkPage(), wfMsgHtml( 'newmessagesdifflink' ), 'diff=cur' ); $s.= ' | <strong>'. wfMsg( 'youhavenewmessages', $tl, $dl ) . '</strong>'; # disable caching $wgOut->setSquidMaxage(0); $wgOut->enableClientCache(false); } } $undelete = $this->getUndeleteLink(); if( !empty( $undelete ) ) { $s .= ' | '.$undelete; } return $s; } function getUndeleteLink() { global $wgUser, $wgTitle, $wgContLang, $action; if( $wgUser->isAllowed( 'deletedhistory' ) && (($wgTitle->getArticleId() == 0) || ($action == "history")) && ($n = $wgTitle->isDeleted() ) ) { if ( $wgUser->isAllowed( 'delete' ) ) { $msg = 'thisisdeleted'; } else { $msg = 'viewdeleted'; } return wfMsg( $msg, $this->makeKnownLink( $wgContLang->SpecialPage( 'Undelete/' . $wgTitle->getPrefixedDBkey() ), wfMsgExt( 'restorelink', array( 'parsemag', 'escape' ), $n ) ) ); } return ''; } function printableLink() { global $wgOut, $wgFeedClasses, $wgRequest; $baseurl = $_SERVER['REQUEST_URI']; if( strpos( '?', $baseurl ) == false ) { $baseurl .= '?'; } else { $baseurl .= '&'; } $baseurl = htmlspecialchars( $baseurl ); $printurl = $wgRequest->escapeAppendQuery( 'printable=yes' ); $s = "<a href=\"$printurl\">" . wfMsg( 'printableversion' ) . '</a>'; if( $wgOut->isSyndicated() ) { foreach( $wgFeedClasses as $format => $class ) { $feedurl = $wgRequest->escapeAppendQuery( "feed=$format" ); $s .= " | <a href=\"$feedurl\">{$format}</a>"; } } return $s; } function pageTitle() { global $wgOut; $s = '<h1 class="pagetitle">' . htmlspecialchars( $wgOut->getPageTitle() ) . '</h1>'; return $s; } function pageSubtitle() { global $wgOut; $sub = $wgOut->getSubtitle(); if ( '' == $sub ) { global $wgExtraSubtitle; $sub = wfMsg( 'tagline' ) . $wgExtraSubtitle; } $subpages = $this->subPageSubtitle(); $sub .= !empty($subpages)?"</p><p class='subpages'>$subpages":''; $s = "<p class='subtitle'>{$sub}</p>\n"; return $s; } function subPageSubtitle() { global $wgOut,$wgTitle,$wgNamespacesWithSubpages; $subpages = ''; if($wgOut->isArticle() && !empty($wgNamespacesWithSubpages[$wgTitle->getNamespace()])) { $ptext=$wgTitle->getPrefixedText(); if(preg_match('/\//',$ptext)) { $links = explode('/',$ptext); $c = 0; $growinglink = ''; foreach($links as $link) { $c++; if ($c<count($links)) { $growinglink .= $link; $getlink = $this->makeLink( $growinglink, htmlspecialchars( $link ) ); if(preg_match('/class="new"/i',$getlink)) { break; } # this is a hack, but it saves time if ($c>1) { $subpages .= ' | '; } else { $subpages .= '< '; } $subpages .= $getlink; $growinglink .= '/'; } } } } return $subpages; } function nameAndLogin() { global $wgUser, $wgTitle, $wgLang, $wgContLang, $wgShowIPinHeader; $li = $wgContLang->specialPage( 'Userlogin' ); $lo = $wgContLang->specialPage( 'Userlogout' ); $s = ''; if ( $wgUser->isAnon() ) { if( $wgShowIPinHeader && isset( $_COOKIE[ini_get('session.name')] ) ) { $n = wfGetIP(); $tl = $this->makeKnownLinkObj( $wgUser->getTalkPage(), $wgLang->getNsText( NS_TALK ) ); $s .= $n . ' ('.$tl.')'; } else { $s .= wfMsg('notloggedin'); } $rt = $wgTitle->getPrefixedURL(); if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) { $q = ''; } else { $q = "returnto={$rt}"; } $s .= "\n<br />" . $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Userlogin' ), wfMsg( 'login' ), $q ); } else { $n = $wgUser->getName(); $rt = $wgTitle->getPrefixedURL(); $tl = $this->makeKnownLinkObj( $wgUser->getTalkPage(), $wgLang->getNsText( NS_TALK ) ); $tl = " ({$tl})"; $s .= $this->makeKnownLinkObj( $wgUser->getUserPage(), $n ) . "{$tl}<br />" . $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Userlogout' ), wfMsg( 'logout' ), "returnto={$rt}" ) . ' | ' . $this->specialLink( 'preferences' ); } $s .= ' | ' . $this->makeKnownLink( wfMsgForContent( 'helppage' ), wfMsg( 'help' ) ); return $s; } function getSearchLink() { $searchPage =& Title::makeTitle( NS_SPECIAL, 'Search' ); return $searchPage->getLocalURL(); } function escapeSearchLink() { return htmlspecialchars( $this->getSearchLink() ); } function searchForm() { global $wgRequest; $search = $wgRequest->getText( 'search' ); $s = '<form name="search" class="inline" method="post" action="' . $this->escapeSearchLink() . "\">\n" . '<input type="text" name="search" size="19" value="' . htmlspecialchars(substr($search,0,256)) . "\" />\n" . '<input type="submit" name="go" value="' . wfMsg ('go') . '" /> ' . '<input type="submit" name="fulltext" value="' . wfMsg ('search') . "\" />\n</form>"; return $s; } function topLinks() { global $wgOut; $sep = " |\n"; $s = $this->mainPageLink() . $sep . $this->specialLink( 'recentchanges' ); if ( $wgOut->isArticleRelated() ) { $s .= $sep . $this->editThisPage() . $sep . $this->historyLink(); } # Many people don't like this dropdown box #$s .= $sep . $this->specialPagesList(); /* show links to different language variants */ global $wgDisableLangConversion, $wgContLang, $wgTitle; $variants = $wgContLang->getVariants(); if( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) { foreach( $variants as $code ) { $varname = $wgContLang->getVariantname( $code ); if( $varname == 'disable' ) continue; $s .= ' | <a href="' . $wgTitle->getLocalUrl( 'variant=' . $code ) . '">' . $varname . '</a>'; } } return $s; } function bottomLinks() { global $wgOut, $wgUser, $wgTitle, $wgUseTrackbacks; $sep = " |\n"; $s = ''; if ( $wgOut->isArticleRelated() ) { $s .= '<strong>' . $this->editThisPage() . '</strong>'; if ( $wgUser->isLoggedIn() ) { $s .= $sep . $this->watchThisPage(); } $s .= $sep . $this->talkLink() . $sep . $this->historyLink() . $sep . $this->whatLinksHere() . $sep . $this->watchPageLinksLink(); if ($wgUseTrackbacks) $s .= $sep . $this->trackbackLink(); if ( $wgTitle->getNamespace() == NS_USER || $wgTitle->getNamespace() == NS_USER_TALK ) { $id=User::idFromName($wgTitle->getText()); $ip=User::isIP($wgTitle->getText()); if($id || $ip) { # both anons and non-anons have contri list $s .= $sep . $this->userContribsLink(); } if( $this->showEmailUser( $id ) ) { $s .= $sep . $this->emailUserLink(); } } if ( $wgTitle->getArticleId() ) { $s .= "\n<br />"; if($wgUser->isAllowed('delete')) { $s .= $this->deleteThisPage(); } if($wgUser->isAllowed('protect')) { $s .= $sep . $this->protectThisPage(); } if($wgUser->isAllowed('move')) { $s .= $sep . $this->moveThisPage(); } } $s .= "<br />\n" . $this->otherLanguages(); } return $s; } function pageStats() { global $wgOut, $wgLang, $wgArticle, $wgRequest, $wgUser; global $wgDisableCounters, $wgMaxCredits, $wgShowCreditsIfMax, $wgTitle, $wgPageShowWatchingUsers; extract( $wgRequest->getValues( 'oldid', 'diff' ) ); if ( ! $wgOut->isArticle() ) { return ''; } if ( isset( $oldid ) || isset( $diff ) ) { return ''; } if ( 0 == $wgArticle->getID() ) { return ''; } $s = ''; if ( !$wgDisableCounters ) { $count = $wgLang->formatNum( $wgArticle->getCount() ); if ( $count ) { $s = wfMsgExt( 'viewcount', array( 'parseinline' ), $count ); } } if (isset($wgMaxCredits) && $wgMaxCredits != 0) { require_once('Credits.php'); $s .= ' ' . getCredits($wgArticle, $wgMaxCredits, $wgShowCreditsIfMax); } else { $s .= $this->lastModified(); } if ($wgPageShowWatchingUsers && $wgUser->getOption( 'shownumberswatching' )) { $dbr =& wfGetDB( DB_SLAVE ); extract( $dbr->tableNames( 'watchlist' ) ); $sql = "SELECT COUNT(*) AS n FROM $watchlist WHERE wl_title='" . $dbr->strencode($wgTitle->getDBKey()) . "' AND wl_namespace=" . $wgTitle->getNamespace() ; $res = $dbr->query( $sql, 'Skin::pageStats'); $x = $dbr->fetchObject( $res ); $s .= ' ' . wfMsg('number_of_watching_users_pageview', $x->n ); } return $s . ' ' . $this->getCopyright(); } function getCopyright( $type = 'detect' ) { global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgRequest; if ( $type == 'detect' ) { $oldid = $wgRequest->getVal( 'oldid' ); $diff = $wgRequest->getVal( 'diff' ); if ( !is_null( $oldid ) && is_null( $diff ) && wfMsgForContent( 'history_copyright' ) !== '-' ) { $type = 'history'; } else { $type = 'normal'; } } if ( $type == 'history' ) { $msg = 'history_copyright'; } else { $msg = 'copyright'; } $out = ''; if( $wgRightsPage ) { $link = $this->makeKnownLink( $wgRightsPage, $wgRightsText ); } elseif( $wgRightsUrl ) { $link = $this->makeExternalLink( $wgRightsUrl, $wgRightsText ); } else { # Give up now return $out; } $out .= wfMsgForContent( $msg, $link ); return $out; } function getCopyrightIcon() { global $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon; $out = ''; if ( isset( $wgCopyrightIcon ) && $wgCopyrightIcon ) { $out = $wgCopyrightIcon; } else if ( $wgRightsIcon ) { $icon = htmlspecialchars( $wgRightsIcon ); if ( $wgRightsUrl ) { $url = htmlspecialchars( $wgRightsUrl ); $out .= '<a href="'.$url.'">'; } $text = htmlspecialchars( $wgRightsText ); $out .= "<img src=\"$icon\" alt='$text' />"; if ( $wgRightsUrl ) { $out .= '</a>'; } } return $out; } function getPoweredBy() { global $wgStylePath; $url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" ); $img = '<a href="http://www.mediawiki.org/"><img src="'.$url.'" alt="MediaWiki" /></a>'; return $img; } function lastModified() { global $wgLang, $wgArticle, $wgLoadBalancer; $timestamp = $wgArticle->getTimestamp(); if ( $timestamp ) { $d = $wgLang->timeanddate( $timestamp, true ); $s = ' ' . wfMsg( 'lastmodified', $d ); } else { $s = ''; } if ( $wgLoadBalancer->getLaggedSlaveMode() ) { $s .= ' <strong>' . wfMsg( 'laggedslavemode' ) . '</strong>'; } return $s; } function logoText( $align = '' ) { if ( '' != $align ) { $a = " align='{$align}'"; } else { $a = ''; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?