X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;ds=sidebyside;f=includes%2FSkin.php;h=be60733968fba14fc5737063f428e6dabedaa967;hb=b11a6d9e1601290c297f2a10eff25b3da1c44a66;hp=262c497f4ea81b0388a4a87bf822932fdf3fe416;hpb=e57ac87ceb707957788885963befa7ad68d0798a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Skin.php b/includes/Skin.php index 262c497f4e..be60733968 100644 --- a/includes/Skin.php +++ b/includes/Skin.php @@ -3,6 +3,7 @@ /** * * @package MediaWiki + * @subpackage Skins */ /** @@ -10,30 +11,10 @@ */ if( defined( "MEDIAWIKI" ) ) { -# See skin.doc +# See skin.txt +require_once( 'Linker.php' ); require_once( 'Image.php' ); -# These are the INTERNAL names, which get mapped directly to class names and -# file names in ./skins/. For display purposes, the Language class has -# internationalized names -# -/* -$wgValidSkinNames = array( - 'standard' => 'Standard', - 'nostalgia' => 'Nostalgia', - 'cologneblue' => 'CologneBlue' -); -if( $wgUsePHPTal ) { - #$wgValidSkinNames[] = 'PHPTal'; - #$wgValidSkinNames['davinci'] = 'DaVinci'; - #$wgValidSkinNames['mono'] = 'Mono'; - #$wgValidSkinNames['monobookminimal'] = 'MonoBookMinimal'; - $wgValidSkinNames['monobook'] = 'MonoBook'; - $wgValidSkinNames['myskin'] = 'MySkin'; - $wgValidSkinNames['chick'] = 'Chick'; -} -*/ - # Get a list of all skins available in /skins/ # Build using the regular expression '^(.*).php$' # Array keys are all lower case, array value keep the case used by filename @@ -43,9 +24,9 @@ $skinDir = dir($IP.'/skins'); # while code from www.php.net while (false !== ($file = $skinDir->read())) { - if(preg_match('/^(.*).php$/',$file, $matches)) { + if(preg_match('/^([^.].*)\.php$/',$file, $matches)) { $aSkin = $matches[1]; - $wgValidSkinNames[strtolower($aSkin)] = $aSkin; + $wgValidSkinNames[strtolower($aSkin)] = $aSkin; } } $skinDir->close(); @@ -53,6 +34,17 @@ unset($matches); require_once( 'RecentChange.php' ); +global $wgLinkHolders; +$wgLinkHolders = array( + 'namespaces' => array(), + 'dbkeys' => array(), + 'queries' => array(), + 'texts' => array(), + 'titles' => array() +); +global $wgInterwikiLinkHolders; +$wgInterwikiLinkHolders = array(); + /** * @todo document * @package MediaWiki @@ -79,44 +71,32 @@ class RCCacheEntry extends RecentChange * This base class is also the "Standard" skin. * @package MediaWiki */ -class Skin { +class Skin extends Linker { /**#@+ * @access private */ var $lastdate, $lastline; - var $linktrail ; # linktrail regexp var $rc_cache ; # Cache for Enhanced Recent Changes var $rcCacheIndex ; # Recent Changes Cache Counter for visibility toggle var $rcMoveIndex; - var $postParseLinkColour = true; /**#@-*/ - function Skin() { - global $wgUseOldExistenceCheck; - $postParseLinkColour = !$wgUseOldExistenceCheck; - $this->linktrail = wfMsg('linktrail'); - } + /** Constructor, call parent constructor */ + function Skin() { parent::Linker(); } function getSkinNames() { global $wgValidSkinNames; return $wgValidSkinNames; } - function getStylesheet() { - return 'common/wikistandard.css'; - } + /** @return string path to the skin stylesheet */ + function getStylesheet() { return 'common/wikistandard.css'; } + /** @return string skin name */ function getSkinName() { return 'standard'; } - /** - * Get/set accessor for delayed link colouring - */ - function postParseLinkColour( $setting = NULL ) { - return wfSetVar( $this->postParseLinkColour, $setting ); - } - function qbSetting() { global $wgOut, $wgUser; @@ -203,29 +183,57 @@ class Skin { } function getHeadScripts() { - global $wgStylePath, $wgUser, $wgLang, $wgAllowUserJs; + global $wgStylePath, $wgUser, $wgContLang, $wgAllowUserJs; $r = "\n"; - if( $wgAllowUserJs && $wgUser->getID() != 0 ) { # logged in - $userpage = $wgLang->getNsText( Namespace::getUser() ) . ":" . $wgUser->getName(); - $userjs = htmlspecialchars($this->makeUrl($userpage.'/'.$this->getSkinName().'.js', 'action=raw&ctype=text/javascript')); + if( $wgAllowUserJs && $wgUser->isLoggedIn() ) { + $userpage = $wgUser->getUserPage(); + $userjs = htmlspecialchars( $this->makeUrl( + $userpage->getPrefixedText().'/'.$this->getSkinName().'.js', + 'action=raw&ctype=text/javascript')); $r .= '\n"; } return $r; } + /** + * To make it harder for someone to slip a user a fake + * user-JavaScript or user-CSS preview, a random token + * is associated with the login session. If it's not + * passed back with the preview request, we won't render + * the code. + * + * @param string $action + * @return bool + * @access private + */ + function userCanPreview( $action ) { + global $wgTitle, $wgRequest, $wgUser; + + if( $action != 'submit' ) + return false; + if( !$wgRequest->wasPosted() ) + return false; + if( !$wgTitle->userCanEditCssJsSubpage() ) + return false; + return $wgUser->matchEditToken( + $wgRequest->getVal( 'wpEditToken' ) ); + } + # get the user/site-specific stylesheet, SkinPHPTal called from RawPage.php (settings are cached that way) function getUserStylesheet() { - global $wgOut, $wgStylePath, $wgLang, $wgUser, $wgRequest, $wgTitle, $wgAllowUserCss; + global $wgOut, $wgStylePath, $wgContLang, $wgUser, $wgRequest, $wgTitle, $wgAllowUserCss; $sheet = $this->getStylesheet(); $action = $wgRequest->getText('action'); $s = "@import \"$wgStylePath/$sheet\";\n"; - if($wgLang->isRTL()) $s .= "@import \"$wgStylePath/common/common_rtl.css\";\n"; - if( $wgAllowUserCss && $wgUser->getID() != 0 ) { # logged in - if($wgTitle->isCssSubpage() and $action == 'submit' and $wgTitle->userCanEditCssJsSubpage()) { + if($wgContLang->isRTL()) $s .= "@import \"$wgStylePath/common/common_rtl.css\";\n"; + if( $wgAllowUserCss && $wgUser->isLoggedIn() ) { # logged in + if($wgTitle->isCssSubpage() && $this->userCanPreview( $action ) ) { $s .= $wgRequest->getText('wpTextbox1'); } else { - $userpage = $wgLang->getNsText( Namespace::getUser() ) . ":" . $wgUser->getName(); - $s.= '@import "'.$this->makeUrl($userpage.'/'.$this->getSkinName().'.css', 'action=raw&ctype=text/css').'";'."\n"; + $userpage = $wgUser->getUserPage(); + $s.= '@import "'.$this->makeUrl( + $userpage->getPrefixedText().'/'.$this->getSkinName().'.css', + 'action=raw&ctype=text/css').'";'."\n"; } } $s .= $this->doGetUserStyles(); @@ -254,24 +262,46 @@ class Skin { * Some styles that are set by user through the user settings interface. */ function doGetUserStyles() { - global $wgUser, $wgLang; + global $wgUser, $wgContLang; - $csspage = $wgLang->getNsText( NS_MEDIAWIKI ) . ':' . $this->getSkinName() . '.css'; + $csspage = $wgContLang->getNsText( NS_MEDIAWIKI ) . ':' . $this->getSkinName() . '.css'; $s = '@import "'.$this->makeUrl($csspage, 'action=raw&ctype=text/css')."\";\n"; - if ( 1 == $wgUser->getOption( 'underline' ) ) { - # Don't override browser settings - } else { - # CHECK MERGE @@@ - # Force no underline - $s .= "a { text-decoration: none; }\n"; - } - if ( 1 == $wgUser->getOption( 'highlightbroken' ) ) { + return $s . $this->reallyDoGetUserStyles(); + } + + function reallyDoGetUserStyles() { + global $wgUser; + $s = ''; + $underline = $wgUser->getOption( "underline" ) ? 'underline' : 'none'; + $s .= "a { text-decoration: $underline; }\n"; + if( $wgUser->getOption( 'highlightbroken' ) ) { $s .= "a.new, #quickbar a.new { color: #CC2200; }\n"; + } else { + $s .= <<getOption( 'justify' ) ) { + if( $wgUser->getOption( 'justify' ) ) { $s .= "#article { text-align: justify; }\n"; } + if( !$wgUser->getOption( 'showtoc' ) ) { + $s .= "#toc { display: none; }\n"; + } return $s; } @@ -285,14 +315,14 @@ class Skin { } else $a = array( 'bgcolor' => '#FFFFFF' ); if($wgOut->isArticle() && $wgUser->getOption('editondblclick') && - (!$wgTitle->isProtected() || $wgUser->isSysop()) ) { + (!$wgTitle->isProtected() || $wgUser->isAllowed('protect')) ) { $t = wfMsg( 'editthispage' ); $oid = $red = ''; - if ( !empty($redirect) ) { + if ( !empty($redirect) && $redirect == 'no' ) { $red = "&redirect={$redirect}"; } if ( !empty($oldid) && ! isset( $diff ) ) { - $oid = "&oldid={$oldid}"; + $oid = "&oldid=" . IntVal( $oldid ); } $s = $wgTitle->getFullURL( "action=edit{$oid}{$red}" ); $s = 'document.location = "' .$s .'";'; @@ -300,64 +330,13 @@ class Skin { } $a['onload'] = $wgOut->getOnloadHandler(); - return $a; - } - - function getExternalLinkAttributes( $link, $text, $class='' ) { - global $wgUser, $wgOut, $wgLang; - - $link = urldecode( $link ); - $link = $wgLang->checkTitleEncoding( $link ); - $link = str_replace( '_', ' ', $link ); - $link = htmlspecialchars( $link ); - - $r = ($class != '') ? " class='$class'" : " class='external'"; - - if ( 1 == $wgUser->getOption( 'hover' ) ) { - $r .= " title=\"{$link}\""; - } - return $r; - } - - function getInternalLinkAttributes( $link, $text, $broken = false ) { - global $wgUser, $wgOut; - - $link = urldecode( $link ); - $link = str_replace( '_', ' ', $link ); - $link = htmlspecialchars( $link ); - - if ( $broken == 'stub' ) { - $r = ' class="stub"'; - } else if ( $broken == 'yes' ) { - $r = ' class="new"'; - } else { - $r = ''; - } - - if ( 1 == $wgUser->getOption( 'hover' ) ) { - $r .= " title=\"{$link}\""; - } - return $r; - } - - /** - * @param bool $broken - */ - function getInternalLinkAttributesObj( &$nt, $text, $broken = false ) { - global $wgUser, $wgOut; - - if ( $broken == 'stub' ) { - $r = ' class="stub"'; - } else if ( $broken == 'yes' ) { - $r = ' class="new"'; - } else { - $r = ''; - } - - if ( 1 == $wgUser->getOption( 'hover' ) ) { - $r .= ' title ="' . $nt->getEscapedText() . '"'; + if( $wgUser->getOption( 'editsectiononrightclick' ) ) { + if( $a['onload'] != '' ) { + $a['onload'] .= ';'; + } + $a['onload'] .= 'setupRightClickEdit()'; } - return $r; + return $a; } /** @@ -373,13 +352,11 @@ class Skin { * two functions to make it easier to subclass. */ function beforeContent() { - global $wgUser, $wgOut; - return $this->doBeforeContent(); } function doBeforeContent() { - global $wgUser, $wgOut, $wgTitle, $wgLang, $wgSiteNotice; + global $wgOut, $wgTitle, $wgContLang; $fname = 'Skin::doBeforeContent'; wfProfileIn( $fname ); @@ -400,7 +377,7 @@ class Skin { $shove = ($qb != 0); $left = ($qb == 1 || $qb == 3); - if($wgLang->isRTL()) $left = !$left; + if($wgContLang->isRTL()) $left = !$left; if ( !$shove ) { $s .= "\n" . @@ -408,13 +385,13 @@ class Skin { } elseif( $left ) { $s .= $this->getQuickbarCompensator( $rows ); } - $l = $wgLang->isRTL() ? 'right' : 'left'; + $l = $wgContLang->isRTL() ? 'right' : 'left'; $s .= "\n"; $s .= $this->topLinks() ; $s .= "

" . $this->pageTitleLinks() . "

\n"; - $r = $wgLang->isRTL() ? "left" : "right"; + $r = $wgContLang->isRTL() ? "left" : "right"; $s .= "\n"; $s .= $this->nameAndLogin(); $s .= "\n
" . $this->searchForm() . ""; @@ -429,8 +406,9 @@ class Skin { $s .= "\n\n\n"; $s .= "\n
\n"; - if( $wgSiteNotice ) { - $s .= "\n
$wgSiteNotice
\n"; + $notice = wfGetSiteNotice(); + if( $notice ) { + $s .= "\n
$notice
\n"; } $s .= $this->pageTitle(); $s .= $this->pageSubtitle() ; @@ -439,8 +417,9 @@ class Skin { return $s; } + function getCategoryLinks () { - global $wgOut, $wgTitle, $wgUser, $wgParser; + global $wgOut, $wgTitle, $wgParser; global $wgUseCategoryMagic, $wgUseCategoryBrowser, $wgLang; if( !$wgUseCategoryMagic ) return '' ; @@ -450,22 +429,21 @@ class Skin { #if( !$wgOut->isArticle() ) return ''; $t = implode ( ' | ' , $wgOut->mCategoryLinks ) ; - $s = $this->makeKnownLink( 'Special:Categories', + $s = $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Categories' ), wfMsg( 'categories' ), '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 .= '

'; + $s .= '

'; # get a big array of the parents tree - $parenttree = $wgTitle->getCategorieBrowser(); + $parenttree = $wgTitle->getParentCategoryTree(); # Render the array as a serie of links - function walkThrough ($tree) { - global $wgUser; - $sk = $wgUser->getSkin(); + # Need to give skin cause $this is undefined at this level + function walkThrough ($tree, &$skin) { $return = ''; foreach($tree as $element => $parent) { if(empty($parent)) { @@ -473,17 +451,19 @@ class Skin { $return .= '
'; } else { # grab the others elements - $return .= walkThrough($parent); + $return .= walkThrough($parent, $skin); } # add our current element to the list $eltitle = Title::NewFromText($element); - # FIXME : should be makeLink() [AV] - $return .= $sk->makeKnownLink($element, $eltitle->getText()).' > '; + if(!empty($parent)) $return .= ' > '; + $return .= $skin->makeLinkObj( $eltitle, $eltitle->getText() ) ; } return $return; } - $s .= walkThrough($parenttree); + # Skin object passed by reference cause it can not be + # accessed under the method subfunction walkThrough. + $s .= walkThrough($parenttree, $this); } return $s; @@ -500,20 +480,20 @@ class Skin { return " "; } - # This gets called immediately before the tag. - # + /** + * This gets called immediately before the tag. + * @return string HTML to be put after ??? + */ function afterContent() { - global $wgUser, $wgOut, $wgServer; - global $wgTitle, $wgLang; - $printfooter = "
\n" . $this->printFooter() . "
\n"; return $printfooter . $this->doAfterContent(); } + /** @return string Retrievied from HTML text */ function printSource() { global $wgTitle; $url = htmlspecialchars( $wgTitle->getFullURL() ); - return wfMsg( "retrievedfrom", "$url" ); + return wfMsg( 'retrievedfrom', ''.$url.'' ); } function printFooter() { @@ -521,68 +501,30 @@ class Skin { "

\n\n

" . $this->pageStats() . "

\n"; } - function doAfterContent() { - global $wgUser, $wgOut, $wgLang; - $fname = 'Skin::doAfterContent'; - wfProfileIn( $fname ); - wfProfileIn( $fname.'-1' ); - - $s = "\n

\n"; - $s .= "\n\n\n"; - - wfProfileOut( $fname.'-3' ); - wfProfileIn( $fname.'-4' ); - if ( 0 != $qb ) { $s .= $this->quickBar(); } - wfProfileOut( $fname.'-4' ); - wfProfileOut( $fname ); - return $s; - } + /** overloaded by derived classes */ + function doAfterContent() { } function pageTitleLinks() { - global $wgOut, $wgTitle, $wgUser, $wgLang, $wgUseApproval, $wgRequest; + global $wgOut, $wgTitle, $wgUser, $wgContLang, $wgUseApproval, $wgRequest; extract( $wgRequest->getValues( 'oldid', 'diff' ) ); $action = $wgRequest->getText( 'action' ); $s = $this->printableLink(); - if ( wfMsg ( 'disclaimers' ) != '-' ) $s .= ' | ' . $this->makeKnownLink( wfMsg( 'disclaimerpage' ), wfMsg( 'disclaimers' ) ) ; + $disclaimer = $this->disclaimerLink(); # may be empty + if( $disclaimer ) { + $s .= ' | ' . $disclaimer; + } if ( $wgOut->isArticleRelated() ) { - if ( $wgTitle->getNamespace() == Namespace::getImage() ) { + if ( $wgTitle->getNamespace() == NS_IMAGE ) { $name = $wgTitle->getDBkey(); - $link = htmlspecialchars( Image::wfImageUrl( $name ) ); - $style = $this->getInternalLinkAttributes( $link, $name ); - $s .= " | {$name}"; + $image = new Image( $wgTitle ); + if( $image->exists() ) { + $link = htmlspecialchars( $image->getURL() ); + $style = $this->getInternalLinkAttributes( $link, $name ); + $s .= " | {$name}"; + } } # This will show the "Approve" link if $wgUseApproval=true; if ( isset ( $wgUseApproval ) && $wgUseApproval ) @@ -596,7 +538,7 @@ class Skin { } } if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) { - $s .= ' | ' . $this->makeKnownLink( $wgTitle->getPrefixedText(), + $s .= ' | ' . $this->makeKnownLinkObj( $wgTitle, wfMsg( 'currentrev' ) ); } @@ -604,15 +546,13 @@ class Skin { # do not show "You have new messages" text when we are viewing our # own talk page - if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 && - $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) { - $n =$wgUser->getName(); - $tl = $this->makeKnownLink( $wgLang->getNsText( - Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", + if( $wgTitle->equals( $wgUser->getTalkPage() ) ) { + $tl = $this->makeKnownLinkObj( $wgUser->getTalkPage(), wfMsg('newmessageslink') ); $s.= ' | '. wfMsg( 'newmessages', $tl ) . ''; # disable caching $wgOut->setSquidMaxage(0); + $wgOut->enableClientCache(false); } } @@ -624,13 +564,13 @@ class Skin { } function getUndeleteLink() { - global $wgUser, $wgTitle, $wgLang, $action; - if( $wgUser->isSysop() && + global $wgUser, $wgTitle, $wgContLang, $action; + if( $wgUser->isAllowed('rollback') && (($wgTitle->getArticleId() == 0) || ($action == "history")) && ($n = $wgTitle->isDeleted() ) ) { return wfMsg( 'thisisdeleted', $this->makeKnownLink( - $wgLang->SpecialPage( 'Undelete/' . $wgTitle->getPrefixedDBkey() ), + $wgContLang->SpecialPage( 'Undelete/' . $wgTitle->getPrefixedDBkey() ), wfMsg( 'restorelink', $n ) ) ); } return ''; @@ -662,7 +602,6 @@ class Skin { global $wgOut, $wgTitle, $wgUser; $s = '

' . htmlspecialchars( $wgOut->getPageTitle() ) . '

'; - if($wgUser->getOption( 'editsectiononrightclick' ) && $wgTitle->userCanEdit()) { $s=$this->editSectionScript(0,$s);} return $s; } @@ -710,19 +649,18 @@ class Skin { } function nameAndLogin() { - global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader, $wgIP; + global $wgUser, $wgTitle, $wgLang, $wgContLang, $wgShowIPinHeader, $wgIP; - $li = $wgLang->specialPage( 'Userlogin' ); - $lo = $wgLang->specialPage( 'Userlogout' ); + $li = $wgContLang->specialPage( 'Userlogin' ); + $lo = $wgContLang->specialPage( 'Userlogout' ); $s = ''; - if ( 0 == $wgUser->getID() ) { - if( $wgShowIPinHeader && isset( $_COOKIE[ini_get('session.name')] ) ) { + if ( $wgUser->isAnon() ) { + if( $wgShowIPinHeader && isset( $_COOKIE[ini_get('session.name')] ) ) { $n = $wgIP; - $tl = $this->makeKnownLink( $wgLang->getNsText( - Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", - $wgLang->getNsText( Namespace::getTalk( 0 ) ) ); + $tl = $this->makeKnownLinkObj( $wgUser->getTalkPage(), + $wgContLang->getNsText( NS_TALK ) ); $s .= $n . ' ('.$tl.')'; } else { @@ -734,24 +672,24 @@ class Skin { $q = ''; } else { $q = "returnto={$rt}"; } - $s .= "\n
" . $this->makeKnownLink( $li, - wfMsg( 'login' ), $q ); + $s .= "\n
" . $this->makeKnownLinkObj( + Title::makeTitle( NS_SPECIAL, 'Userlogin' ), + wfMsg( 'login' ), $q ); } else { $n = $wgUser->getName(); $rt = $wgTitle->getPrefixedURL(); - $tl = $this->makeKnownLink( $wgLang->getNsText( - Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", - $wgLang->getNsText( Namespace::getTalk( 0 ) ) ); + $tl = $this->makeKnownLinkObj( $wgUser->getTalkPage(), + $wgContLang->getNsText( NS_TALK ) ); $tl = " ({$tl})"; - $s .= $this->makeKnownLink( $wgLang->getNsText( - Namespace::getUser() ) . ":{$n}", $n ) . "{$tl}
" . - $this->makeKnownLink( $lo, wfMsg( 'logout' ), + $s .= $this->makeKnownLinkObj( $wgUser->getUserPage(), + $n ) . "{$tl}
" . + $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Userlogout' ), wfMsg( 'logout' ), "returnto={$rt}" ) . ' | ' . $this->specialLink( 'preferences' ); } - $s .= ' | ' . $this->makeKnownLink( wfMsg( 'helppage' ), + $s .= ' | ' . $this->makeKnownLink( wfMsgForContent( 'helppage' ), wfMsg( 'help' ) ); return $s; @@ -794,6 +732,18 @@ class Skin { # 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 .= ' | ' . $varname . ''; + } + } + return $s; } @@ -804,7 +754,7 @@ class Skin { $s = ''; if ( $wgOut->isArticleRelated() ) { $s .= '' . $this->editThisPage() . ''; - if ( 0 != $wgUser->getID() ) { + if ( $wgUser->isLoggedIn() ) { $s .= $sep . $this->watchThisPage(); } $s .= $sep . $this->talkLink() @@ -812,8 +762,8 @@ class Skin { . $sep . $this->whatLinksHere() . $sep . $this->watchPageLinksLink(); - if ( $wgTitle->getNamespace() == Namespace::getUser() - || $wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser()) ) + if ( $wgTitle->getNamespace() == NS_USER + || $wgTitle->getNamespace() == NS_USER_TALK ) { $id=User::idFromName($wgTitle->getText()); @@ -822,16 +772,15 @@ class Skin { if($id || $ip) { # both anons and non-anons have contri list $s .= $sep . $this->userContribsLink(); } - if ( 0 != $wgUser->getID() ) { # show only to signed in users - if($id) { # can only email non-anons - $s .= $sep . $this->emailUserLink(); - } + if( $this->showEmailUser( $id ) ) { + $s .= $sep . $this->emailUserLink(); } } - if ( $wgUser->isSysop() && $wgTitle->getArticleId() ) { - $s .= "\n
" . $this->deleteThisPage() . - $sep . $this->protectThisPage() . - $sep . $this->moveThisPage(); + if ( $wgTitle->getArticleId() ) { + $s .= "\n
"; + if($wgUser->isAllowed('delete')) { $s .= $this->deleteThisPage(); } + if($wgUser->isAllowed('protect')) { $s .= $sep . $this->protectThisPage(); } + if($wgUser->isAllowed('move')) { $s .= $sep . $this->moveThisPage(); } } $s .= "
\n" . $this->otherLanguages(); } @@ -839,8 +788,8 @@ class Skin { } function pageStats() { - global $wgOut, $wgLang, $wgArticle, $wgRequest; - global $wgDisableCounters, $wgMaxCredits, $wgShowCreditsIfMax; + global $wgOut, $wgLang, $wgArticle, $wgRequest, $wgUser; + global $wgDisableCounters, $wgMaxCredits, $wgShowCreditsIfMax, $wgTitle, $wgPageShowWatchingUsers; extract( $wgRequest->getValues( 'oldid', 'diff' ) ); if ( ! $wgOut->isArticle() ) { return ''; } @@ -856,12 +805,23 @@ class Skin { } if (isset($wgMaxCredits) && $wgMaxCredits != 0) { - require_once("Credits.php"); + 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(); } @@ -872,7 +832,7 @@ class Skin { $oldid = $wgRequest->getVal( 'oldid' ); $diff = $wgRequest->getVal( 'diff' ); - if ( !is_null( $oldid ) && is_null( $diff ) && wfMsg( 'history_copyright' ) !== '-' ) { + if ( !is_null( $oldid ) && is_null( $diff ) && wfMsgForContent( 'history_copyright' ) !== '-' ) { $msg = 'history_copyright'; } else { $msg = 'copyright'; @@ -887,22 +847,24 @@ class Skin { # Give up now return $out; } - $out .= wfMsg( $msg, $link ); + $out .= wfMsgForContent( $msg, $link ); return $out; } function getCopyrightIcon() { - global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgRightsIcon; + global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon; $out = ''; - if( $wgRightsIcon ) { + if ( isset( $wgCopyrightIcon ) && $wgCopyrightIcon ) { + $out = $wgCopyrightIcon; + } else if ( $wgRightsIcon ) { $icon = htmlspecialchars( $wgRightsIcon ); - if( $wgRightsUrl ) { + if ( $wgRightsUrl ) { $url = htmlspecialchars( $wgRightsUrl ); $out .= ''; } $text = htmlspecialchars( $wgRightsText ); $out .= "$text"; - if( $wgRightsUrl ) { + if ( $wgRightsUrl ) { $out .= ''; } } @@ -917,15 +879,18 @@ class Skin { } function lastModified() { - global $wgLang, $wgArticle; + global $wgLang, $wgArticle, $wgLoadBalancer; $timestamp = $wgArticle->getTimestamp(); if ( $timestamp ) { - $d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true ); + $d = $wgLang->timeanddate( $timestamp, true ); $s = ' ' . wfMsg( 'lastmodified', $d ); } else { $s = ''; } + if ( $wgLoadBalancer->getLaggedSlaveMode() ) { + $s .= ' ' . wfMsg( 'laggedslavemode' ) . ''; + } return $s; } @@ -946,183 +911,46 @@ class Skin { return $s; } - function quickBar() { - global $wgOut, $wgTitle, $wgUser, $wgRequest, $wgLang; - global $wgDisableUploads, $wgRemoteUploads; - - $fname = 'Skin::quickBar'; - wfProfileIn( $fname ); - - $action = $wgRequest->getText( 'action' ); - $wpPreview = $wgRequest->getBool( 'wpPreview' ); - $tns=$wgTitle->getNamespace(); - - $s = "\n
"; - $s .= "\n" . $this->logoText() . "\n
"; - - $sep = "\n
"; - $s .= $this->mainPageLink() - . $sep . $this->specialLink( 'recentchanges' ) - . $sep . $this->specialLink( 'randompage' ); - if ($wgUser->getID()) { - $s.= $sep . $this->specialLink( 'watchlist' ) ; - $s .= $sep .$this->makeKnownLink( $wgLang->specialPage( 'Contributions' ), - wfMsg( 'mycontris' ), 'target=' . wfUrlencode($wgUser->getName() ) ); - - } - // only show watchlist link if logged in - if ( wfMsg ( 'currentevents' ) != '-' ) $s .= $sep . $this->makeKnownLink( wfMsg( 'currentevents' ), '' ) ; - $s .= "\n

"; - $articleExists = $wgTitle->getArticleId(); - if ( $wgOut->isArticle() || $action =='edit' || $action =='history' || $wpPreview) { - if($wgOut->isArticle()) { - $s .= '' . $this->editThisPage() . ''; - } else { # backlink to the article in edit or history mode - if($articleExists){ # no backlink if no article - switch($tns) { - case 0: - $text = wfMsg('articlepage'); - break; - case 1: - $text = wfMsg('viewtalkpage'); - break; - case 2: - $text = wfMsg('userpage'); - break; - case 3: - $text = wfMsg('viewtalkpage'); - break; - case 4: - $text = wfMsg('wikipediapage'); - break; - case 5: - $text = wfMsg('viewtalkpage'); - break; - case 6: - $text = wfMsg('imagepage'); - break; - case 7: - $text = wfMsg('viewtalkpage'); - break; - default: - $text= wfMsg('articlepage'); - } - - $link = $wgTitle->getText(); - if ($nstext = $wgLang->getNsText($tns) ) { # add namespace if necessary - $link = $nstext . ':' . $link ; - } - - $s .= $this->makeLink( $link, $text ); - } elseif( $wgTitle->getNamespace() != Namespace::getSpecial() ) { - # we just throw in a "New page" text to tell the user that he's in edit mode, - # and to avoid messing with the separator that is prepended to the next item - $s .= '' . wfMsg('newpage') . ''; - } - - } - - - if( $tns%2 && $action!='edit' && !$wpPreview) { - $s.= '
'.$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg('postcomment'),'action=edit§ion=new'); - } - - /* - watching could cause problems in edit mode: - if user edits article, then loads "watch this article" in background and then saves - article with "Watch this article" checkbox disabled, the article is transparently - unwatched. Therefore we do not show the "Watch this page" link in edit mode - */ - if ( 0 != $wgUser->getID() && $articleExists) { - if($action!='edit' && $action != 'submit' ) - { - $s .= $sep . $this->watchThisPage(); - } - if ( $wgTitle->userCanEdit() ) - $s .= $sep . $this->moveThisPage(); - } - if ( $wgUser->isSysop() and $articleExists ) { - $s .= $sep . $this->deleteThisPage() . - $sep . $this->protectThisPage(); - } - $s .= $sep . $this->talkLink(); - if ($articleExists && $action !='history') { - $s .= $sep . $this->historyLink(); - } - $s.=$sep . $this->whatLinksHere(); - - if($wgOut->isArticleRelated()) { - $s .= $sep . $this->watchPageLinksLink(); - } - - if ( Namespace::getUser() == $wgTitle->getNamespace() - || $wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser()) - ) { - - $id=User::idFromName($wgTitle->getText()); - $ip=User::isIP($wgTitle->getText()); - - if($id||$ip) { - $s .= $sep . $this->userContribsLink(); - } - if ( 0 != $wgUser->getID() ) { - if($id) { # can only email real users - $s .= $sep . $this->emailUserLink(); - } - } - } - $s .= "\n

"; - } - - if ( 0 != $wgUser->getID() && ( !$wgDisableUploads || $wgRemoteUploads ) ) { - $s .= $this->specialLink( 'upload' ) . $sep; - } - $s .= $this->specialLink( 'specialpages' ) - . $sep . $this->bugReportsLink(); - - global $wgSiteSupportPage; - if( $wgSiteSupportPage ) { - $s .= "\n
' . wfMsg( 'sitesupport' ) . ''; - } - - $s .= "\n
\n"; - wfProfileOut( $fname ); - return $s; - } - + /** + * show a drop-down box of special pages + * @TODO crash bug913. Need to be rewrote completly. + */ function specialPagesList() { - global $wgUser, $wgOut, $wgLang, $wgServer, $wgRedirectScript; + global $wgUser, $wgOut, $wgContLang, $wgServer, $wgRedirectScript, $wgAvailableRights; require_once('SpecialPage.php'); $a = array(); $pages = SpecialPage::getPages(); + // special pages without access restriction foreach ( $pages[''] as $name => $page ) { $a[$name] = $page->getDescription(); } - if ( $wgUser->isSysop() ) - { - foreach ( $pages['sysop'] as $name => $page ) { - $a[$name] = $page->getDescription(); - } - } - if ( $wgUser->isDeveloper() ) - { - foreach ( $pages['developer'] as $name => $page ) { - $a[$name] = $page->getDescription() ; + + // Other special pages that are restricted. + // Copied from SpecialSpecialpages.php + foreach($wgAvailableRights as $right) { + if( $wgUser->isAllowed($right) ) { + /** Add all pages for this right */ + if(isset($pages[$right])) { + foreach($pages[$right] as $name => $page) { + $a[$name] = $page->getDescription(); + } + } } } + $go = wfMsg( 'go' ); $sp = wfMsg( 'specialpages' ); - $spp = $wgLang->specialPage( 'Specialpages' ); + $spp = $wgContLang->specialPage( 'Specialpages' ); $s = '
\n"; $s .= "\n"; @@ -1132,28 +960,33 @@ class Skin { } function mainPageLink() { - $mp = wfMsg( 'mainpage' ); - $s = $this->makeKnownLink( $mp, $mp ); + $mp = wfMsgForContent( 'mainpage' ); + $mptxt = wfMsg( 'mainpage'); + $s = $this->makeKnownLink( $mp, $mptxt ); return $s; } function copyrightLink() { - $s = $this->makeKnownLink( wfMsg( 'copyrightpage' ), + $s = $this->makeKnownLink( wfMsgForContent( 'copyrightpage' ), wfMsg( 'copyrightpagename' ) ); return $s; } function aboutLink() { - $s = $this->makeKnownLink( wfMsg( 'aboutpage' ), + $s = $this->makeKnownLink( wfMsgForContent( 'aboutpage' ), wfMsg( 'aboutsite' ) ); return $s; } function disclaimerLink() { - $s = $this->makeKnownLink( wfMsg( 'disclaimerpage' ), - wfMsg( 'disclaimers' ) ); - return $s; + $disclaimers = wfMsg( 'disclaimers' ); + if ($disclaimers == '-') { + return ''; + } else { + return $this->makeKnownLink( wfMsgForContent( 'disclaimerpage' ), + $disclaimers ); + } } function editThisPage() { @@ -1166,11 +999,9 @@ class Skin { if ( ! $wgOut->isArticleRelated() ) { $s = wfMsg( 'protectedpage' ); } else { - $n = $wgTitle->getPrefixedText(); if ( $wgTitle->userCanEdit() ) { $t = wfMsg( 'editthispage' ); } else { - #$t = wfMsg( "protectedpage" ); $t = wfMsg( 'viewsource' ); } $oid = $red = ''; @@ -1179,7 +1010,7 @@ class Skin { if ( $oldid && ! isset( $diff ) ) { $oid = '&oldid='.$oldid; } - $s = $this->makeKnownLink( $n, $t, "action=edit{$oid}{$red}" ); + $s = $this->makeKnownLinkObj( $wgTitle, $t, "action=edit{$oid}{$red}" ); } return $s; } @@ -1188,11 +1019,10 @@ class Skin { global $wgUser, $wgOut, $wgTitle, $wgRequest; $diff = $wgRequest->getVal( 'diff' ); - if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) { - $n = $wgTitle->getPrefixedText(); + if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isAllowed('delete') ) { $t = wfMsg( 'deletethispage' ); - $s = $this->makeKnownLink( $n, $t, 'action=delete' ); + $s = $this->makeKnownLinkObj( $wgTitle, $t, 'action=delete' ); } else { $s = ''; } @@ -1203,9 +1033,7 @@ class Skin { global $wgUser, $wgOut, $wgTitle, $wgRequest; $diff = $wgRequest->getVal( 'diff' ); - if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) { - $n = $wgTitle->getPrefixedText(); - + if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isAllowed('protect') ) { if ( $wgTitle->isProtected() ) { $t = wfMsg( 'unprotectthispage' ); $q = 'action=unprotect'; @@ -1213,7 +1041,7 @@ class Skin { $t = wfMsg( 'protectthispage' ); $q = 'action=protect'; } - $s = $this->makeKnownLink( $n, $t, $q ); + $s = $this->makeKnownLinkObj( $wgTitle, $t, $q ); } else { $s = ''; } @@ -1224,8 +1052,6 @@ class Skin { global $wgUser, $wgOut, $wgTitle; if ( $wgOut->isArticleRelated() ) { - $n = $wgTitle->getPrefixedText(); - if ( $wgTitle->userIsWatching() ) { $t = wfMsg( 'unwatchthispage' ); $q = 'action=unwatch'; @@ -1233,7 +1059,7 @@ class Skin { $t = wfMsg( 'watchthispage' ); $q = 'action=watch'; } - $s = $this->makeKnownLink( $n, $t, $q ); + $s = $this->makeKnownLinkObj( $wgTitle, $t, $q ); } else { $s = wfMsg( 'notanarticle' ); } @@ -1241,105 +1067,97 @@ class Skin { } function moveThisPage() { - global $wgTitle, $wgLang; + global $wgTitle; - if ( $wgTitle->userCanEdit() ) { - $s = $this->makeKnownLink( $wgLang->specialPage( 'Movepage' ), + if ( $wgTitle->userCanMove() ) { + return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Movepage' ), wfMsg( 'movethispage' ), 'target=' . $wgTitle->getPrefixedURL() ); - } // no message if page is protected - would be redundant - return $s; + } else { + // no message if page is protected - would be redundant + return ''; + } } function historyLink() { global $wgTitle; - $s = $this->makeKnownLink( $wgTitle->getPrefixedText(), + return $this->makeKnownLinkObj( $wgTitle, wfMsg( 'history' ), 'action=history' ); - return $s; } function whatLinksHere() { - global $wgTitle, $wgLang; + global $wgTitle; - $s = $this->makeKnownLink( $wgLang->specialPage( 'Whatlinkshere' ), + return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Whatlinkshere' ), wfMsg( 'whatlinkshere' ), 'target=' . $wgTitle->getPrefixedURL() ); - return $s; } function userContribsLink() { - global $wgTitle, $wgLang; + global $wgTitle; - $s = $this->makeKnownLink( $wgLang->specialPage( 'Contributions' ), + return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Contributions' ), wfMsg( 'contributions' ), 'target=' . $wgTitle->getPartialURL() ); - return $s; } + function showEmailUser( $id ) { + global $wgEnableEmail, $wgEnableUserEmail, $wgUser; + return $wgEnableEmail && + $wgEnableUserEmail && + $wgUser->isLoggedIn() && # show only to signed in users + 0 != $id; # we can only email to non-anons .. +# '' != $id->getEmail() && # who must have an email address stored .. +# 0 != $id->getEmailauthenticationtimestamp() && # .. which is authenticated +# 1 != $wgUser->getOption('disablemail'); # and not disabled + } + function emailUserLink() { - global $wgTitle, $wgLang; + global $wgTitle; - $s = $this->makeKnownLink( $wgLang->specialPage( 'Emailuser' ), + return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Emailuser' ), wfMsg( 'emailuser' ), 'target=' . $wgTitle->getPartialURL() ); - return $s; } function watchPageLinksLink() { - global $wgOut, $wgTitle, $wgLang; + global $wgOut, $wgTitle; if ( ! $wgOut->isArticleRelated() ) { - $s = '(' . wfMsg( 'notanarticle' ) . ')'; + return '(' . wfMsg( 'notanarticle' ) . ')'; } else { - $s = $this->makeKnownLink( $wgLang->specialPage( + return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Recentchangeslinked' ), wfMsg( 'recentchangeslinked' ), 'target=' . $wgTitle->getPrefixedURL() ); } - return $s; } function otherLanguages() { - global $wgOut, $wgLang, $wgTitle, $wgUseNewInterlanguage; + global $wgOut, $wgContLang, $wgTitle; $a = $wgOut->getLanguageLinks(); if ( 0 == count( $a ) ) { - if ( !$wgUseNewInterlanguage ) return ''; - $ns = $wgLang->getNsIndex ( $wgTitle->getNamespace () ) ; - if ( $ns != 0 AND $ns != 1 ) return '' ; - $pn = 'Intl' ; - $x = 'mode=addlink&xt='.$wgTitle->getDBkey() ; - return $this->makeKnownLink( $wgLang->specialPage( $pn ), - wfMsg( 'intl' ) , $x ); - } - - if ( !$wgUseNewInterlanguage ) { - $s = wfMsg( 'otherlanguages' ) . ': '; - } else { - global $wgLanguageCode ; - $x = 'mode=zoom&xt='.$wgTitle->getDBkey() ; - $x .= '&xl='.$wgLanguageCode ; - $s = $this->makeKnownLink( $wgLang->specialPage( 'Intl' ), - wfMsg( 'otherlanguages' ) , $x ) . ': ' ; - } + return ''; + } $s = wfMsg( 'otherlanguages' ) . ': '; $first = true; - if($wgLang->isRTL()) $s .= ''; + if($wgContLang->isRTL()) $s .= ''; foreach( $a as $l ) { if ( ! $first ) { $s .= ' | '; } $first = false; $nt = Title::newFromText( $l ); - $url = $nt->getFullURL(); - $text = $wgLang->getLanguageName( $nt->getInterwiki() ); + $url = $nt->escapeFullURL(); + $text = $wgContLang->getLanguageName( $nt->getInterwiki() ); if ( '' == $text ) { $text = $l; } $style = $this->getExternalLinkAttributes( $l, $text ); $s .= "{$text}"; } - if($wgLang->isRTL()) $s .= ''; + if($wgContLang->isRTL()) $s .= ''; return $s; } function bugReportsLink() { - $s = $this->makeKnownLink( wfMsg( 'bugreportspage' ), + $s = $this->makeKnownLink( wfMsgForContent( 'bugreportspage' ), wfMsg( 'bugreports' ) ); return $s; } @@ -1373,1516 +1191,108 @@ class Skin { } function talkLink() { - global $wgLang, $wgTitle, $wgLinkCache; + global $wgTitle, $wgLinkCache; - $tns = $wgTitle->getNamespace(); - if ( -1 == $tns ) { return ''; } + if ( NS_SPECIAL == $wgTitle->getNamespace() ) { + # No discussion links for special pages + return ''; + } - $pn = $wgTitle->getText(); - $tp = wfMsg( 'talkpage' ); - if ( Namespace::isTalk( $tns ) ) { - $lns = Namespace::getSubject( $tns ); - switch($tns) { - case 1: + if( $wgTitle->isTalkPage() ) { + $link = $wgTitle->getSubjectPage(); + switch( $link->getNamespace() ) { + case NS_MAIN: $text = wfMsg('articlepage'); break; - case 3: + case NS_USER: $text = wfMsg('userpage'); break; - case 5: + case NS_PROJECT: $text = wfMsg('wikipediapage'); break; - case 7: + case NS_IMAGE: $text = wfMsg('imagepage'); break; - default: + default: $text= wfMsg('articlepage'); } } else { - - $lns = Namespace::getTalk( $tns ); - $text=$tp; + $link = $wgTitle->getTalkPage(); + $text = wfMsg( 'talkpage' ); } - $n = $wgLang->getNsText( $lns ); - if ( '' == $n ) { $link = $pn; } - else { $link = $n.':'.$pn; } $wgLinkCache->suspend(); - $s = $this->makeLink( $link, $text ); + $s = $this->makeLinkObj( $link, $text ); $wgLinkCache->resume(); return $s; } function commentLink() { - global $wgLang, $wgTitle, $wgLinkCache; - - $tns = $wgTitle->getNamespace(); - if ( -1 == $tns ) { return ''; } - - $lns = ( Namespace::isTalk( $tns ) ) ? $tns : Namespace::getTalk( $tns ); - - # assert Namespace::isTalk( $lns ) - - $n = $wgLang->getNsText( $lns ); - $pn = $wgTitle->getText(); - - $link = $n.':'.$pn; + global $wgContLang, $wgTitle, $wgLinkCache; - $wgLinkCache->suspend(); - $s = $this->makeKnownLink($link, wfMsg('postcomment'), 'action=edit§ion=new'); - $wgLinkCache->resume(); - - return $s; + if ( $wgTitle->getNamespace() == NS_SPECIAL ) { + return ''; + } + return $this->makeKnownLinkObj( $wgTitle->getTalkPage(), + wfMsg( 'postcomment' ), 'action=edit§ion=new' ); } - /** - * After all the page content is transformed into HTML, it makes - * a final pass through here for things like table backgrounds. - * @todo probably deprecated [AV] - */ - function transformContent( $text ) { - return $text; + /* these are used extensively in SkinPHPTal, but also some other places */ + /*static*/ function makeSpecialUrl( $name, $urlaction='' ) { + $title = Title::makeTitle( NS_SPECIAL, $name ); + return $title->getLocalURL( $urlaction ); } - - /** - * Note: This function MUST call getArticleID() on the link, - * otherwise the cache won't get updated properly. See LINKCACHE.DOC. - */ - function makeLink( $title, $text = '', $query = '', $trail = '' ) { - wfProfileIn( 'Skin::makeLink' ); - $nt = Title::newFromText( $title ); - if ($nt) { - $result = $this->makeLinkObj( Title::newFromText( $title ), $text, $query, $trail ); - } else { - wfDebug( 'Invalid title passed to Skin::makeLink(): "'.$title."\"\n" ); - $result = $text == "" ? $title : $text; - } - - wfProfileOut( 'Skin::makeLink' ); - return $result; + + /*static*/ function makeI18nUrl ( $name, $urlaction='' ) { + $title = Title::newFromText( wfMsgForContent($name) ); + $this->checkTitle($title, $name); + return $title->getLocalURL( $urlaction ); } - - function makeKnownLink( $title, $text = '', $query = '', $trail = '', $prefix = '',$aprops = '') { - $nt = Title::newFromText( $title ); - if ($nt) { - return $this->makeKnownLinkObj( Title::newFromText( $title ), $text, $query, $trail, $prefix , $aprops ); - } else { - wfDebug( 'Invalid title passed to Skin::makeKnownLink(): "'.$title."\"\n" ); - return $text == '' ? $title : $text; - } + + /*static*/ function makeUrl ( $name, $urlaction='' ) { + $title = Title::newFromText( $name ); + $this->checkTitle($title, $name); + return $title->getLocalURL( $urlaction ); } - function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) { - $nt = Title::newFromText( $title ); - if ($nt) { - return $this->makeBrokenLinkObj( Title::newFromText( $title ), $text, $query, $trail ); + # If url string starts with http, consider as external URL, else + # internal + /*static*/ function makeInternalOrExternalUrl( $name ) { + if ( strncmp( $name, 'http', 4 ) == 0 ) { + return $name; } else { - wfDebug( 'Invalid title passed to Skin::makeBrokenLink(): "'.$title."\"\n" ); - return $text == '' ? $title : $text; + return $this->makeUrl( $name ); } } - function makeStubLink( $title, $text = '', $query = '', $trail = '' ) { - $nt = Title::newFromText( $title ); - if ($nt) { - return $this->makeStubLinkObj( Title::newFromText( $title ), $text, $query, $trail ); - } else { - wfDebug( 'Invalid title passed to Skin::makeStubLink(): "'.$title."\"\n" ); - return $text == '' ? $title : $text; - } + # this can be passed the NS number as defined in Language.php + /*static*/ function makeNSUrl( $name, $urlaction='', $namespace=NS_MAIN ) { + $title = Title::makeTitleSafe( $namespace, $name ); + $this->checkTitle($title, $name); + return $title->getLocalURL( $urlaction ); } - /** - * Pass a title object, not a title string - */ - function makeLinkObj( &$nt, $text= '', $query = '', $trail = '', $prefix = '' ) { - global $wgOut, $wgUser; - $fname = 'Skin::makeLinkObj'; - - # Fail gracefully - if ( ! isset($nt) ) - return "{$prefix}{$text}{$trail}"; - - if ( $nt->isExternal() ) { - $u = $nt->getFullURL(); - $link = $nt->getPrefixedURL(); - if ( '' == $text ) { $text = $nt->getPrefixedText(); } - $style = $this->getExternalLinkAttributes( $link, $text, 'extiw' ); - - $inside = ''; - if ( '' != $trail ) { - if ( preg_match( '/^([a-z]+)(.*)$$/sD', $trail, $m ) ) { - $inside = $m[1]; - $trail = $m[2]; - } - } - $retVal = "{$text}{$inside}{$trail}"; - } elseif ( 0 == $nt->getNamespace() && "" == $nt->getText() ) { - $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix ); - } elseif ( ( -1 == $nt->getNamespace() ) || - ( Namespace::getImage() == $nt->getNamespace() ) ) { - $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix ); - } else { - if ( $this->postParseLinkColour() ) { - $inside = ''; - if ( '' != $trail ) { - if ( preg_match( $this->linktrail, $trail, $m ) ) { - $inside = $m[1]; - $trail = $m[2]; - } - } - - # Allows wiki to bypass using linkcache, see OutputPage::parseLinkHolders() - $retVal = '{$trail}"; - } else { - # Work out link colour immediately - $aid = $nt->getArticleID() ; - if ( 0 == $aid ) { - $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail, $prefix ); - } else { - $threshold = $wgUser->getOption('stubthreshold') ; - if ( $threshold > 0 ) { - $dbr =& wfGetDB( DB_SLAVE ); - $s = $dbr->selectRow( 'cur', array( 'LENGTH(cur_text) AS x', 'cur_namespace', - 'cur_is_redirect' ), array( 'cur_id' => $aid ), $fname ) ; - if ( $s !== false ) { - $size = $s->x; - if ( $s->cur_is_redirect OR $s->cur_namespace != 0 ) { - $size = $threshold*2 ; # Really big - } - $dbr->freeResult( $res ); - } else { - $size = $threshold*2 ; # Really big - } - } else { - $size = 1 ; - } - if ( $size < $threshold ) { - $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail, $prefix ); - } else { - $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix ); - } - } - } - } - return $retVal; + /* these return an array with the 'href' and boolean 'exists' */ + /*static*/ function makeUrlDetails ( $name, $urlaction='' ) { + $title = Title::newFromText( $name ); + $this->checkTitle($title, $name); + return array( + 'href' => $title->getLocalURL( $urlaction ), + 'exists' => $title->getArticleID() != 0?true:false + ); } - /** - * Pass a title object, not a title string - */ - function makeKnownLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '' ) { - global $wgOut, $wgTitle, $wgInputEncoding; - - $fname = 'Skin::makeKnownLinkObj'; - wfProfileIn( $fname ); - - if ( !is_object( $nt ) ) { - return $text; - } - $link = $nt->getPrefixedURL(); -# if ( '' != $section && substr($section,0,1) != "#" ) { -# $section = '' - - if ( '' == $link ) { - $u = ''; - if ( '' == $text ) { - $text = htmlspecialchars( $nt->getFragment() ); - } - } else { - $u = $nt->escapeLocalURL( $query ); - } - if ( '' != $nt->getFragment() ) { - $anchor = urlencode( do_html_entity_decode( str_replace(' ', '_', $nt->getFragment()), ENT_COMPAT, $wgInputEncoding ) ); - $replacearray = array( - '%3A' => ':', - '%' => '.' - ); - $u .= '#' . str_replace(array_keys($replacearray),array_values($replacearray),$anchor); - } - if ( '' == $text ) { - $text = htmlspecialchars( $nt->getPrefixedText() ); - } - $style = $this->getInternalLinkAttributesObj( $nt, $text ); - - $inside = ''; - if ( '' != $trail ) { - if ( preg_match( $this->linktrail, $trail, $m ) ) { - $inside = $m[1]; - $trail = $m[2]; + # make sure we have some title to operate on + /*static*/ function checkTitle ( &$title, &$name ) { + if(!is_object($title)) { + $title = Title::newFromText( $name ); + if(!is_object($title)) { + $title = Title::newFromText( '--error: link target missing--' ); } } - $r = "{$prefix}{$text}{$inside}{$trail}"; - wfProfileOut( $fname ); - return $r; } - /** - * Pass a title object, not a title string - */ - function makeBrokenLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' ) { - global $wgOut, $wgUser; - - # Fail gracefully - if ( ! isset($nt) ) - return "{$prefix}{$text}{$trail}"; - - $fname = 'Skin::makeBrokenLinkObj'; - wfProfileIn( $fname ); - - if ( '' == $query ) { - $q = 'action=edit'; - } else { - $q = 'action=edit&'.$query; - } - $u = $nt->escapeLocalURL( $q ); - - if ( '' == $text ) { - $text = htmlspecialchars( $nt->getPrefixedText() ); - } - $style = $this->getInternalLinkAttributesObj( $nt, $text, "yes" ); - - $inside = ''; - if ( '' != $trail ) { - if ( preg_match( $this->linktrail, $trail, $m ) ) { - $inside = $m[1]; - $trail = $m[2]; - } - } - if ( $wgUser->getOption( 'highlightbroken' ) ) { - $s = "{$prefix}{$text}{$inside}{$trail}"; - } else { - $s = "{$prefix}{$text}{$inside}?{$trail}"; - } - - wfProfileOut( $fname ); - return $s; - } - - /** - * Pass a title object, not a title string - */ - function makeStubLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' ) { - global $wgOut, $wgUser; - - $link = $nt->getPrefixedURL(); - - $u = $nt->escapeLocalURL( $query ); - - if ( '' == $text ) { - $text = htmlspecialchars( $nt->getPrefixedText() ); - } - $style = $this->getInternalLinkAttributesObj( $nt, $text, 'stub' ); - - $inside = ''; - if ( '' != $trail ) { - if ( preg_match( $this->linktrail, $trail, $m ) ) { - $inside = $m[1]; - $trail = $m[2]; - } - } - if ( $wgUser->getOption( 'highlightbroken' ) ) { - $s = "{$prefix}{$text}{$inside}{$trail}"; - } else { - $s = "{$prefix}{$text}{$inside}!{$trail}"; - } - return $s; - } - - function makeSelfLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' ) { - $u = $nt->escapeLocalURL( $query ); - if ( '' == $text ) { - $text = htmlspecialchars( $nt->getPrefixedText() ); - } - $inside = ''; - if ( '' != $trail ) { - if ( preg_match( $this->linktrail, $trail, $m ) ) { - $inside = $m[1]; - $trail = $m[2]; - } - } - return "{$prefix}{$text}{$inside}{$trail}"; - } - - /* these are used extensively in SkinPHPTal, but also some other places */ - /*static*/ function makeSpecialUrl( $name, $urlaction='' ) { - $title = Title::makeTitle( NS_SPECIAL, $name ); - $this->checkTitle($title, $name); - return $title->getLocalURL( $urlaction ); - } - /*static*/ function makeTalkUrl ( $name, $urlaction='' ) { - $title = Title::newFromText( $name ); - $title = $title->getTalkPage(); - $this->checkTitle($title, $name); - return $title->getLocalURL( $urlaction ); - } - /*static*/ function makeArticleUrl ( $name, $urlaction='' ) { - $title = Title::newFromText( $name ); - $title= $title->getSubjectPage(); - $this->checkTitle($title, $name); - return $title->getLocalURL( $urlaction ); - } - /*static*/ function makeI18nUrl ( $name, $urlaction='' ) { - $title = Title::newFromText( wfMsg($name) ); - $this->checkTitle($title, $name); - return $title->getLocalURL( $urlaction ); - } - /*static*/ function makeUrl ( $name, $urlaction='' ) { - $title = Title::newFromText( $name ); - $this->checkTitle($title, $name); - return $title->getLocalURL( $urlaction ); - } - # this can be passed the NS number as defined in Language.php - /*static*/ function makeNSUrl( $name, $urlaction='', $namespace=0 ) { - $title = Title::makeTitleSafe( $namespace, $name ); - $this->checkTitle($title, $name); - return $title->getLocalURL( $urlaction ); - } - - /* these return an array with the 'href' and boolean 'exists' */ - /*static*/ function makeUrlDetails ( $name, $urlaction='' ) { - $title = Title::newFromText( $name ); - $this->checkTitle($title, $name); - return array( - 'href' => $title->getLocalURL( $urlaction ), - 'exists' => $title->getArticleID() != 0?true:false - ); - } - /*static*/ function makeTalkUrlDetails ( $name, $urlaction='' ) { - $title = Title::newFromText( $name ); - $title = $title->getTalkPage(); - $this->checkTitle($title, $name); - return array( - 'href' => $title->getLocalURL( $urlaction ), - 'exists' => $title->getArticleID() != 0?true:false - ); - } - /*static*/ function makeArticleUrlDetails ( $name, $urlaction='' ) { - $title = Title::newFromText( $name ); - $title= $title->getSubjectPage(); - $this->checkTitle($title, $name); - return array( - 'href' => $title->getLocalURL( $urlaction ), - 'exists' => $title->getArticleID() != 0?true:false - ); - } - /*static*/ function makeI18nUrlDetails ( $name, $urlaction='' ) { - $title = Title::newFromText( wfMsg($name) ); - $this->checkTitle($title, $name); - return array( - 'href' => $title->getLocalURL( $urlaction ), - 'exists' => $title->getArticleID() != 0?true:false - ); - } - - # make sure we have some title to operate on - /*static*/ function checkTitle ( &$title, &$name ) { - if(!is_object($title)) { - $title = Title::newFromText( $name ); - if(!is_object($title)) { - $title = Title::newFromText( '--error: link target missing--' ); - } - } - } - - function fnamePart( $url ) { - $basename = strrchr( $url, '/' ); - if ( false === $basename ) { - $basename = $url; - } else { - $basename = substr( $basename, 1 ); - } - return htmlspecialchars( $basename ); - } - - function makeImage( $url, $alt = '' ) { - global $wgOut; - - if ( '' == $alt ) { - $alt = $this->fnamePart( $url ); - } - $s = ''.$alt.''; - return $s; - } - - function makeImageLink( $name, $url, $alt = '' ) { - $nt = Title::makeTitleSafe( NS_IMAGE, $name ); - return $this->makeImageLinkObj( $nt, $alt ); - } - - function makeImageLinkObj( $nt, $alt = '' ) { - global $wgLang, $wgUseImageResize; - $img = Image::newFromTitle( $nt ); - $url = $img->getURL(); - - $align = ''; - $prefix = $postfix = ''; - - if ( $wgUseImageResize ) { - # Check if the alt text is of the form "options|alt text" - # Options are: - # * thumbnail make a thumbnail with enlarge-icon and caption, alignment depends on lang - # * left no resizing, just left align. label is used for alt= only - # * right same, but right aligned - # * none same, but not aligned - # * ___px scale to ___ pixels width, no aligning. e.g. use in taxobox - # * center center the image - # * framed Keep original image size, no magnify-button. - - $part = explode( '|', $alt); - - $mwThumb =& MagicWord::get( MAG_IMG_THUMBNAIL ); - $mwLeft =& MagicWord::get( MAG_IMG_LEFT ); - $mwRight =& MagicWord::get( MAG_IMG_RIGHT ); - $mwNone =& MagicWord::get( MAG_IMG_NONE ); - $mwWidth =& MagicWord::get( MAG_IMG_WIDTH ); - $mwCenter =& MagicWord::get( MAG_IMG_CENTER ); - $mwFramed =& MagicWord::get( MAG_IMG_FRAMED ); - $alt = $part[count($part)-1]; - - $height = $framed = $thumb = false; - $manual_thumb = "" ; - - foreach( $part as $key => $val ) { - $val_parts = explode ( "=" , $val , 2 ) ; - $left_part = array_shift ( $val_parts ) ; - if ( ! is_null( $mwThumb->matchVariableStartToEnd($val) ) ) { - $thumb=true; - } elseif ( count ( $val_parts ) == 1 && ! is_null( $mwThumb->matchVariableStartToEnd($left_part) ) ) { - # use manually specified thumbnail - $thumb=true; - $manual_thumb = array_shift ( $val_parts ) ; - } elseif ( ! is_null( $mwRight->matchVariableStartToEnd($val) ) ) { - # remember to set an alignment, don't render immediately - $align = 'right'; - } elseif ( ! is_null( $mwLeft->matchVariableStartToEnd($val) ) ) { - # remember to set an alignment, don't render immediately - $align = 'left'; - } elseif ( ! is_null( $mwCenter->matchVariableStartToEnd($val) ) ) { - # remember to set an alignment, don't render immediately - $align = 'center'; - } elseif ( ! is_null( $mwNone->matchVariableStartToEnd($val) ) ) { - # remember to set an alignment, don't render immediately - $align = 'none'; - } elseif ( ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) { - # $match is the image width in pixels - if ( preg_match( '/^([0-9]*)x([0-9]*)$/', $match, $m ) ) { - $width = intval( $m[1] ); - $height = intval( $m[2] ); - } else { - $width = intval($match); - } - } elseif ( ! is_null( $mwFramed->matchVariableStartToEnd($val) ) ) { - $framed=true; - } - } - if ( 'center' == $align ) - { - $prefix = ''; - $postfix = ''; - $align = 'none'; - } - - if ( $thumb || $framed ) { - - # Create a thumbnail. Alignment depends on language - # writing direction, # right aligned for left-to-right- - # languages ("Western languages"), left-aligned - # for right-to-left-languages ("Semitic languages") - # - # If thumbnail width has not been provided, it is set - # here to 180 pixels - if ( $align == '' ) { - $align = $wgLang->isRTL() ? 'left' : 'right'; - } - if ( ! isset($width) ) { - $width = 180; - } - return $prefix.$this->makeThumbLinkObj( $img, $alt, $align, $width, $height, $framed, $manual_thumb ).$postfix; - - } elseif ( isset($width) ) { - - # Create a resized image, without the additional thumbnail - # features - - if ( ( ! $height === false ) - && ( $img->getHeight() * $width / $img->getWidth() > $height ) ) { - print "height=$height
\nimg->getHeight() = ".$img->getHeight()."
\n"; - print 'rescaling by factor '. $height / $img->getHeight() . "
\n"; - $width = $img->getWidth() * $height / $img->getHeight(); - } - if ( '' == $manual_thumb ) $url = $img->createThumb( $width ); - } - } # endif $wgUseImageResize - - if ( empty( $alt ) ) { - $alt = preg_replace( '/\.(.+?)^/', '', $img->getName() ); - } - $alt = htmlspecialchars( $alt ); - - $u = $nt->escapeLocalURL(); - if ( $url == '' ) - { - $s = wfMsg( 'missingimage', $img->getName() ); - $s .= "
{$alt}
{$url}
\n"; - } else { - $s = '' . - ''.$alt.''; - } - if ( '' != $align ) { - $s = "
{$s}
"; - } - return str_replace("\n", ' ',$prefix.$s.$postfix); - } - - /** - * Make HTML for a thumbnail including image, border and caption - * $img is an Image object - */ - function makeThumbLinkObj( $img, $label = '', $align = 'right', $boxwidth = 180, $boxheight=false, $framed=false , $manual_thumb = "" ) { - global $wgStylePath, $wgLang; - # $image = Title::makeTitleSafe( NS_IMAGE, $name ); - $url = $img->getURL(); - - #$label = htmlspecialchars( $label ); - $alt = preg_replace( '/<[^>]*>/', '', $label); - $alt = htmlspecialchars( $alt ); - - $width = $height = 0; - if ( $img->exists() ) - { - $width = $img->getWidth(); - $height = $img->getHeight(); - } - if ( 0 == $width || 0 == $height ) - { - $width = $height = 200; - } - if ( $boxwidth == 0 ) - { - $boxwidth = 200; - } - if ( $framed ) - { - // Use image dimensions, don't scale - $boxwidth = $width; - $oboxwidth = $boxwidth + 2; - $boxheight = $height; - $thumbUrl = $url; - } else { - $h = intval( $height/($width/$boxwidth) ); - $oboxwidth = $boxwidth + 2; - if ( ( ! $boxheight === false ) && ( $h > $boxheight ) ) - { - $boxwidth *= $boxheight/$h; - } else { - $boxheight = $h; - } - if ( '' == $manual_thumb ) $thumbUrl = $img->createThumb( $boxwidth ); - } - - if ( $manual_thumb != '' ) # Use manually specified thumbnail - { - $manual_title = Title::makeTitleSafe( NS_IMAGE, $manual_thumb ); #new Title ( $manual_thumb ) ; - $manual_img = Image::newFromTitle( $manual_title ); - $thumbUrl = $manual_img->getURL(); - if ( $manual_img->exists() ) - { - $width = $manual_img->getWidth(); - $height = $manual_img->getHeight(); - $boxwidth = $width ; - $boxheight = $height ; - $oboxwidth = $boxwidth + 2 ; - } - } - - $u = $img->getEscapeLocalURL(); - - $more = htmlspecialchars( wfMsg( 'thumbnail-more' ) ); - $magnifyalign = $wgLang->isRTL() ? 'left' : 'right'; - $textalign = $wgLang->isRTL() ? ' style="text-align:right"' : ''; - - $s = "
"; - if ( $thumbUrl == '' ) { - $s .= wfMsg( 'missingimage', $img->getName() ); - $zoomicon = ''; - } else { - $s .= ''. - ''.$alt.''; - if ( $framed ) { - $zoomicon=""; - } else { - $zoomicon = '
'. - ''. - ''.$more.'
'; - } - } - $s .= '
'.$zoomicon.$label."
"; - return str_replace("\n", ' ', $s); - } - - function makeMediaLink( $name, $url, $alt = '' ) { - $nt = Title::makeTitleSafe( Namespace::getMedia(), $name ); - return $this->makeMediaLinkObj( $nt, $alt ); - } - - function makeMediaLinkObj( $nt, $alt = '' ) { - if ( ! isset( $nt ) ) - { - ### HOTFIX. Instead of breaking, return empty string. - $s = $alt; - } else { - $name = $nt->getDBKey(); - $url = Image::wfImageUrl( $name ); - if ( empty( $alt ) ) { - $alt = preg_replace( '/\.(.+?)^/', '', $name ); - } - - $u = htmlspecialchars( $url ); - $s = "{$alt}"; - } - return $s; - } - - function specialLink( $name, $key = '' ) { - global $wgLang; - - if ( '' == $key ) { $key = strtolower( $name ); } - $pn = $wgLang->ucfirst( $name ); - return $this->makeKnownLink( $wgLang->specialPage( $pn ), - wfMsg( $key ) ); - } - - function makeExternalLink( $url, $text, $escape = true ) { - $style = $this->getExternalLinkAttributes( $url, $text ); - $url = htmlspecialchars( $url ); - if( $escape ) { - $text = htmlspecialchars( $text ); - } - return ''.$text.''; - } - - # Called by history lists and recent changes - # - - # Returns text for the start of the tabular part of RC - function beginRecentChangesList() { - $this->rc_cache = array() ; - $this->rcMoveIndex = 0; - $this->rcCacheIndex = 0 ; - $this->lastdate = ''; - $this->rclistOpen = false; - return ''; - } - - function beginImageHistoryList() { - $s = "\n

" . wfMsg( 'imghistory' ) . "

\n" . - "

" . wfMsg( 'imghistlegend' ) . "

\n".'\n"; - } - return $s; - } - - /** - * Enhanced RC ungrouped line - */ - function recentChangesBlockLine ( $rcObj ) { - global $wgStylePath, $wgLang ; - - # Get rc_xxxx variables - extract( $rcObj->mAttribs ) ; - $curIdEq = 'curid='.$rc_cur_id; - - # Spacer image - $r = '' ; - - $r .= '' ; - $r .= '' ; - - if ( $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) { - $r .= '  '; - } else { - # M & N (minor & new) - $M = wfMsg( 'minoreditletter' ); - $N = wfMsg( 'newpageletter' ); - - if ( $rc_type == RC_NEW ) { - $r .= $N ; - } else { - $r .= ' ' ; - } - if ( $rc_minor ) { - $r .= $M ; - } else { - $r .= ' ' ; - } - } - - # Timestamp - $r .= ' '.$rcObj->timestamp.' ' ; - $r .= '' ; - - # Article link - $link = $rcObj->link ; - if ( $rcObj->watched ) $link = ''.$link.'' ; - $r .= $link ; - - # Diff - $r .= ' (' ; - $r .= $rcObj->difflink ; - $r .= '; ' ; - - # Hist - $r .= $this->makeKnownLinkObj( $rcObj->getTitle(), wfMsg( 'hist' ), $curIdEq.'&action=history' ); - - # User/talk - $r .= ') . . '.$rcObj->userlink ; - $r .= $rcObj->usertalklink ; - - # Comment - if ( $rc_comment != '' && $rc_type != RC_MOVE && $rc_type != RC_MOVE_OVER_REDIRECT ) { - $rc_comment=$this->formatComment($rc_comment, $rcObj->getTitle()); - $r .= $wgLang->emphasize( ' ('.$rc_comment.')' ); - } - - $r .= "
\n" ; - return $r ; - } - - /** - * Enhanced RC group - */ - function recentChangesBlockGroup ( $block ) { - global $wgStylePath, $wgLang ; - - $r = '' ; - $M = wfMsg( 'minoreditletter' ); - $N = wfMsg( 'newpageletter' ); - - # Collate list of users - $isnew = false ; - $userlinks = array () ; - foreach ( $block AS $rcObj ) { - $oldid = $rcObj->mAttribs['rc_last_oldid']; - if ( $rcObj->mAttribs['rc_new'] ) $isnew = true ; - $u = $rcObj->userlink ; - if ( !isset ( $userlinks[$u] ) ) $userlinks[$u] = 0 ; - $userlinks[$u]++ ; - } - - # Sort the list and convert to text - krsort ( $userlinks ) ; - asort ( $userlinks ) ; - $users = array () ; - foreach ( $userlinks as $userlink => $count) { - $text = $userlink ; - if ( $count > 1 ) $text .= " ({$count}×)" ; - array_push ( $users , $text ) ; - } - $users = ' ['.implode('; ',$users).']' ; - - # Arrow - $rci = 'RCI'.$this->rcCacheIndex ; - $rcl = 'RCL'.$this->rcCacheIndex ; - $rcm = 'RCM'.$this->rcCacheIndex ; - $toggleLink = "javascript:toggleVisibility('$rci','$rcm','$rcl')" ; - $arrowdir = $wgLang->isRTL() ? 'l' : 'r'; - $tl = '' ; - $tl .= '' ; - $r .= $tl ; - - # Main line - # M/N - $r .= '' ; - if ( $isnew ) $r .= $N ; - else $r .= ' ' ; - $r .= ' ' ; # Minor - - # Timestamp - $r .= ' '.$block[0]->timestamp.' ' ; - $r .= '' ; - - # Article link - $link = $block[0]->link ; - if ( $block[0]->watched ) $link = ''.$link.'' ; - $r .= $link ; - - $curIdEq = 'curid=' . $block[0]->mAttribs['rc_cur_id']; - if ( $block[0]->mAttribs['rc_type'] != RC_LOG ) { - # Changes - $r .= ' ('.count($block).' ' ; - if ( $isnew ) $r .= wfMsg('changes'); - else $r .= $this->makeKnownLinkObj( $block[0]->getTitle() , wfMsg('changes') , - $curIdEq.'&diff=0&oldid='.$oldid ) ; - $r .= '; ' ; - - # History - $r .= $this->makeKnownLinkObj( $block[0]->getTitle(), wfMsg( 'history' ), $curIdEq.'&action=history' ); - $r .= ')' ; - } - - $r .= $users ; - $r .= "
\n" ; - - # Sub-entries - $r .= '\n" ; - - $this->rcCacheIndex++ ; - return $r ; - } - - /** - * If enhanced RC is in use, this function takes the previously cached - * RC lines, arranges them, and outputs the HTML - */ - function recentChangesBlock () { - global $wgStylePath ; - if ( count ( $this->rc_cache ) == 0 ) return '' ; - $blockOut = ''; - foreach ( $this->rc_cache AS $secureName => $block ) { - if ( count ( $block ) < 2 ) { - $blockOut .= $this->recentChangesBlockLine ( array_shift ( $block ) ) ; - } else { - $blockOut .= $this->recentChangesBlockGroup ( $block ) ; - } - } - - return '
'.$blockOut.'
' ; - } - - /** - * Called in a loop over all displayed RC entries - * Either returns the line, or caches it for later use - */ - function recentChangesLine( &$rc, $watched = false ) { - global $wgUser ; - $usenew = $wgUser->getOption( 'usenewrc' ); - if ( $usenew ) - $line = $this->recentChangesLineNew ( $rc, $watched ) ; - else - $line = $this->recentChangesLineOld ( $rc, $watched ) ; - return $line ; - } - - function recentChangesLineOld( &$rc, $watched = false ) { - global $wgTitle, $wgLang, $wgUser, $wgRCSeconds, $wgUseRCPatrol, $wgOnlySysopsCanPatrol; - - # Extract DB fields into local scope - extract( $rc->mAttribs ); - $curIdEq = 'curid=' . $rc_cur_id; - - # Make date header if necessary - $date = $wgLang->date( $rc_timestamp, true); - $s = ''; - if ( $date != $this->lastdate ) { - if ( '' != $this->lastdate ) { $s .= "\n"; } - $s .= "

{$date}

\n\n"; - return $s; - } - - /** - * This function is called by all recent changes variants, by the page history, - * and by the user contributions list. It is responsible for formatting edit - * comments. It escapes any HTML in the comment, but adds some CSS to format - * auto-generated comments (from section editing) and formats [[wikilinks]]. - * - * The &$title parameter must be a title OBJECT. It is used to generate a - * direct link to the section in the autocomment. - * @author Erik Moeller - * - * Note: there's not always a title to pass to this function. - * Since you can't set a default parameter for a reference, I've turned it - * temporarily to a value pass. Should be adjusted further. --brion - */ - function formatComment($comment, $title = NULL) { - global $wgLang; - $comment = htmlspecialchars( $comment ); - - # The pattern for autogen comments is / * foo * /, which makes for - # some nasty regex. - # We look for all comments, match any text before and after the comment, - # add a separator where needed and format the comment itself with CSS - while (preg_match('/(.*)\/\*\s*(.*?)\s*\*\/(.*)/', $comment,$match)) { - $pre=$match[1]; - $auto=$match[2]; - $post=$match[3]; - $link=''; - if($title) { - $section=$auto; - - # This is hackish but should work in most cases. - $section=str_replace('[[','',$section); - $section=str_replace(']]','',$section); - $title->mFragment=$section; - $link=$this->makeKnownLinkObj($title,wfMsg('sectionlink')); - } - $sep='-'; - $auto=$link.$auto; - if($pre) { $auto = $sep.' '.$auto; } - if($post) { $auto .= ' '.$sep; } - $auto=''.$auto.''; - $comment=$pre.$auto.$post; - } - - # format regular and media links - all other wiki formatting - # is ignored - $medians = $wgLang->getNsText(Namespace::getMedia()).':'; - while(preg_match('/\[\[(.*?)(\|(.*?))*\]\](.*)$/',$comment,$match)) { - # Handle link renaming [[foo|text]] will show link as "text" - if( "" != $match[3] ) { - $text = $match[3]; - } else { - $text = $match[1]; - } - if( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) { - # Media link; trail not supported. - $linkRegexp = '/\[\[(.*?)\]\]/'; - $thelink = $this->makeMediaLink( $submatch[1], "", $text ); - } else { - # Other kind of link - if( preg_match( wfMsg( "linktrail" ), $match[4], $submatch ) ) { - $trail = $submatch[1]; - } else { - $trail = ""; - } - $linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/'; - if ($match[1][0] == ':') - $match[1] = substr($match[1], 1); - $thelink = $this->makeLink( $match[1], $text, "", $trail ); - } - $comment = preg_replace( $linkRegexp, $thelink, $comment, 1 ); - } - return $comment; - } - - function imageHistoryLine( $iscur, $timestamp, $img, $user, $usertext, $size, $description ) { - global $wgUser, $wgLang, $wgTitle; - - $datetime = $wgLang->timeanddate( $timestamp, true ); - $del = wfMsg( 'deleteimg' ); - $delall = wfMsg( 'deleteimgcompletely' ); - $cur = wfMsg( 'cur' ); - - if ( $iscur ) { - $url = Image::wfImageUrl( $img ); - $rlink = $cur; - if ( $wgUser->isSysop() ) { - $link = $wgTitle->escapeLocalURL( 'image=' . $wgTitle->getPartialURL() . - '&action=delete' ); - $style = $this->getInternalLinkAttributes( $link, $delall ); - - $dlink = ''.$delall.''; - } else { - $dlink = $del; - } - } else { - $url = htmlspecialchars( wfImageArchiveUrl( $img ) ); - if( $wgUser->getID() != 0 && $wgTitle->userCanEdit() ) { - $rlink = $this->makeKnownLink( $wgTitle->getPrefixedText(), - wfMsg( 'revertimg' ), 'action=revert&oldimage=' . - urlencode( $img ) ); - $dlink = $this->makeKnownLink( $wgTitle->getPrefixedText(), - $del, 'action=delete&oldimage=' . urlencode( $img ) ); - } else { - # Having live active links for non-logged in users - # means that bots and spiders crawling our site can - # inadvertently change content. Baaaad idea. - $rlink = wfMsg( 'revertimg' ); - $dlink = $del; - } - } - if ( 0 == $user ) { - $userlink = $usertext; - } else { - $userlink = $this->makeLink( $wgLang->getNsText( Namespace::getUser() ) . - ':'.$usertext, $usertext ); - } - $nbytes = wfMsg( 'nbytes', $size ); - $style = $this->getInternalLinkAttributes( $url, $datetime ); - - $s = "
  • ({$dlink}) ({$rlink}) {$datetime}" - . " . . {$userlink} ({$nbytes})"; - - if ( '' != $description && '*' != $description ) { - $sk=$wgUser->getSkin(); - $s .= $wgLang->emphasize(' (' . $sk->formatComment($description,$wgTitle) . ')'); - } - $s .= "
  • \n"; - return $s; - } - - function tocIndent($level) { - return str_repeat( '
    '."\n", $level>0 ? $level : 0 ); - } - - function tocUnindent($level) { - return str_repeat( "
    \n", $level>0 ? $level : 0 ); - } - - /** - * parameter level defines if we are on an indentation level - */ - function tocLine( $anchor, $tocline, $level ) { - $link = ''.$tocline.'
    '; - if($level) { - return $link."\n"; - } else { - return '
    '.$link."
    \n"; - } - - } - - function tocTable($toc) { - # note to CSS fanatics: putting this in a div does not work -- div won't auto-expand - # try min-width & co when somebody gets a chance - $hideline = ' '; - return - '
    '."\n". - ''.wfMsg('toc').'' . - $hideline . - '
    '."\n". - $toc."
    \n"; - } - - /** - * These two do not check for permissions: check $wgTitle->userCanEdit - * before calling them - */ - function editSectionScript( $section, $head ) { - global $wgTitle, $wgRequest; - if( $wgRequest->getInt( 'oldid' ) && ( $wgRequest->getVal( 'diff' ) != '0' ) ) { - return $head; - } - $url = $wgTitle->escapeLocalURL( 'action=edit§ion='.$section ); - return ''.$head.''; - } - - function editSectionLink( $section ) { - global $wgRequest; - global $wgTitle, $wgUser, $wgLang; - - if( $wgRequest->getInt( 'oldid' ) && ( $wgRequest->getVal( 'diff' ) != '0' ) ) { - # Section edit links would be out of sync on an old page. - # But, if we're diffing to the current page, they'll be - # correct. - return ''; - } - - $editurl = '§ion='.$section; - $url = $this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg('editsection'),'action=edit'.$editurl); - - if( $wgLang->isRTL() ) { - $farside = 'left'; - $nearside = 'right'; - } else { - $farside = 'right'; - $nearside = 'left'; - } - return "
    [".$url."]
    "; - - } - - /** - * This function is called by EditPage.php and shows a bulletin board style - * toolbar for common editing functions. It can be disabled in the user - * preferences. - * The necessary JavaScript code can be found in style/wikibits.js. - */ - function getEditToolbar() { - global $wgStylePath, $wgLang, $wgMimeType; - - /** - * toolarray an array of arrays which each include the filename of - * the button image (without path), the opening tag, the closing tag, - * and optionally a sample text that is inserted between the two when no - * selection is highlighted. - * The tip text is shown when the user moves the mouse over the button. - * - * Already here are accesskeys (key), which are not used yet until someone - * can figure out a way to make them work in IE. However, we should make - * sure these keys are not defined on the edit page. - */ - $toolarray=array( - array( 'image'=>'button_bold.png', - 'open' => "\'\'\'", - 'close' => "\'\'\'", - 'sample'=> wfMsg('bold_sample'), - 'tip' => wfMsg('bold_tip'), - 'key' => 'B' - ), - array( 'image'=>'button_italic.png', - 'open' => "\'\'", - 'close' => "\'\'", - 'sample'=> wfMsg('italic_sample'), - 'tip' => wfMsg('italic_tip'), - 'key' => 'I' - ), - array( 'image'=>'button_link.png', - 'open' => '[[', - 'close' => ']]', - 'sample'=> wfMsg('link_sample'), - 'tip' => wfMsg('link_tip'), - 'key' => 'L' - ), - array( 'image'=>'button_extlink.png', - 'open' => '[', - 'close' => ']', - 'sample'=> wfMsg('extlink_sample'), - 'tip' => wfMsg('extlink_tip'), - 'key' => 'X' - ), - array( 'image'=>'button_headline.png', - 'open' => "\\n== ", - 'close' => " ==\\n", - 'sample'=> wfMsg('headline_sample'), - 'tip' => wfMsg('headline_tip'), - 'key' => 'H' - ), - array( 'image'=>'button_image.png', - 'open' => '[['.$wgLang->getNsText(NS_IMAGE).":", - 'close' => ']]', - 'sample'=> wfMsg('image_sample'), - 'tip' => wfMsg('image_tip'), - 'key' => 'D' - ), - array( 'image' => 'button_media.png', - 'open' => '[['.$wgLang->getNsText(NS_MEDIA).':', - 'close' => ']]', - 'sample'=> wfMsg('media_sample'), - 'tip' => wfMsg('media_tip'), - 'key' => 'M' - ), - array( 'image' => 'button_math.png', - 'open' => "\\", - 'close' => "\\", - 'sample'=> wfMsg('math_sample'), - 'tip' => wfMsg('math_tip'), - 'key' => 'C' - ), - array( 'image' => 'button_nowiki.png', - 'open' => "\\", - 'close' => "\\", - 'sample'=> wfMsg('nowiki_sample'), - 'tip' => wfMsg('nowiki_tip'), - 'key' => 'N' - ), - array( 'image' => 'button_sig.png', - 'open' => '--~~~~', - 'close' => '', - 'sample'=> '', - 'tip' => wfMsg('sig_tip'), - 'key' => 'Y' - ), - array( 'image' => 'button_hr.png', - 'open' => "\\n----\\n", - 'close' => '', - 'sample'=> '', - 'tip' => wfMsg('hr_tip'), - 'key' => 'R' - ) - ); - $toolbar =""; - return $toolbar; - } - - /** - * @access public - */ - function suppressUrlExpansion() { - return false; - } } }