X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSkin.php;h=5d39bc38a084219283098231d6ab450d51cea8b9;hb=73466f61ee6be0fffb275fae974df6ddc81f57de;hp=58f16de4b8ed4f7e58807eef5d0b7172f7e9fde3;hpb=2125ca097e52ba5a461520b695b0dba71283916e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Skin.php b/includes/Skin.php index 58f16de4b8..5d39bc38a0 100644 --- a/includes/Skin.php +++ b/includes/Skin.php @@ -1,34 +1,66 @@ 'Standard', - 'nostalgia' => 'Nostalgia', - 'cologneblue' => 'CologneBlue' +/* +$wgValidSkinNames = array( + 'standard' => 'Standard', + 'nostalgia' => 'Nostalgia', + 'cologneblue' => 'CologneBlue' ); if( $wgUsePHPTal ) { - #$wgValidSkinNames[] = 'PHPTal'; - #$wgValidSkinNames['davinci'] = 'DaVinci'; - #$wgValidSkinNames['mono'] = 'Mono'; - $wgValidSkinNames['monobook'] = 'MonoBook'; - $wgValidSkinNames['myskin'] = 'MySkin'; - #$wgValidSkinNames['monobookminimal'] = 'MonoBookMinimal'; + #$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 +# + +$skinDir = dir($IP.'/skins'); + +# while code from www.php.net +while (false !== ($file = $skinDir->read())) { + if(preg_match('/^(.*).php$/',$file, $matches)) { + $aSkin = $matches[1]; + $wgValidSkinNames[strtolower($aSkin)] = $aSkin; + } } +$skinDir->close(); +unset($matches); require_once( 'RecentChange.php' ); +/** + * @todo document + */ class RCCacheEntry extends RecentChange { var $secureName, $link; - var $curlink , $lastlink , $usertalklink , $versionlink ; + var $curlink , $difflink, $lastlink , $usertalklink , $versionlink ; var $userlink, $timestamp, $watched; function newFromParent( $rc ) @@ -40,35 +72,51 @@ class RCCacheEntry extends RecentChange } } ; -class Skin { - /* private */ var $lastdate, $lastline; +/** + * The main skin class that provide methods and properties for all other skins + * including PHPTal skins. + * This base class is also the "Standard" skin. + */ +class Skin { + /**#@+ + * @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() - { + function Skin() { + global $wgUseOldExistenceCheck; + $postParseLinkColour = !$wgUseOldExistenceCheck; $this->linktrail = wfMsg('linktrail'); } - function getSkinNames() - { + function getSkinNames() { global $wgValidSkinNames; return $wgValidSkinNames; } - function getStylesheet() - { + function getStylesheet() { return 'wikistandard.css'; } + function getSkinName() { - return "standard"; + return 'standard'; } - function qbSetting() - { + /** + * Get/set accessor for delayed link colouring + */ + function postParseLinkColour( $setting = NULL ) { + return wfSetVar( $this->postParseLinkColour, $setting ); + } + + function qbSetting() { global $wgOut, $wgUser; if ( $wgOut->isQuickbarSuppressed() ) { return 0; } @@ -77,18 +125,17 @@ class Skin { return $q; } - function initPage( &$out ) - { + function initPage( &$out ) { $fname = 'Skin::initPage'; wfProfileIn( $fname ); - + $out->addLink( array( 'rel' => 'shortcut icon', 'href' => '/favicon.ico' ) ); - + $this->addMetadataLinks($out); - + wfProfileOut( $fname ); } - + function addMetadataLinks( &$out ) { global $wgTitle, $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf, $wgRdfMimeType, $action; global $wgRightsPage, $wgRightsUrl; @@ -124,10 +171,10 @@ class Skin { 'href' => $copyright ) ); } } - + function outputPage( &$out ) { global $wgDebugComments; - + wfProfileIn( 'Skin::outputPage' ); $this->initPage( $out ); $out->out( $out->headElement() ); @@ -147,7 +194,7 @@ class Skin { $out->out( $out->mBodytext . "\n" ); $out->out( $this->afterContent() ); - + wfProfileClose(); $out->out( $out->reportTime() ); @@ -155,9 +202,9 @@ class Skin { } function getHeadScripts() { - global $wgStylePath, $wgUser, $wgLang; + global $wgStylePath, $wgUser, $wgLang, $wgAllowUserJs; $r = "\n"; - if( $wgUser->getID() != 0 ) { # logged in + 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')); $r .= '\n"; @@ -167,52 +214,56 @@ class Skin { # 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; + global $wgOut, $wgStylePath, $wgLang, $wgUser, $wgRequest, $wgTitle, $wgAllowUserCss; $sheet = $this->getStylesheet(); $action = $wgRequest->getText('action'); - $s = "@import url(\"$wgStylePath/$sheet\");\n"; - if($wgLang->isRTL()) $s .= "@import url(\"$wgStylePath/common_rtl.css\");\n"; - if( $wgUser->getID() != 0 ) { # logged in + $s = "@import \"$wgStylePath/$sheet\";\n"; + if($wgLang->isRTL()) $s .= "@import \"$wgStylePath/common_rtl.css\";\n"; + if( $wgAllowUserCss && $wgUser->getID() != 0 ) { # logged in if($wgTitle->isCssSubpage() and $action == 'submit' and $wgTitle->userCanEditCssJsSubpage()) { - $s .= '@import url('.$this->makeUrl('-','action=raw&gen=css&smaxage=0&maxage=0').');'."\n"; $s .= $wgRequest->getText('wpTextbox1'); } else { - $s .= '@import url('.$this->makeUrl('-','action=raw&gen=css&smaxage=0&maxage=0').');'."\n"; $userpage = $wgLang->getNsText( Namespace::getUser() ) . ":" . $wgUser->getName(); - $s.= '@import url("'.$this->makeUrl($userpage.'/'.$this->getSkinName(), 'action=raw&ctype=text/css').'");'."\n"; + $s.= '@import "'.$this->makeUrl($userpage.'/'.$this->getSkinName().'.css', 'action=raw&ctype=text/css').'";'."\n"; } } $s .= $this->doGetUserStyles(); - return $s."\n"; - } - # placeholder, returns generated js in monobook - function getUserJs() { - return; + return $s."\n"; } - - function getUserStyles() - { + + /** + * placeholder, returns generated js in monobook + */ + function getUserJs() { return; } + + /** + * Return html code that include User stylesheets + */ + function getUserStyles() { global $wgOut, $wgStylePath, $wgLang; $s = "\n"; return $s; } - function doGetUserStyles() - { - global $wgUser; + /** + * Some styles that are set by user through the user settings interface. + */ + function doGetUserStyles() { + global $wgUser, $wgLang; + + $csspage = $wgLang->getNsText( NS_MEDIAWIKI ) . ':' . $this->getSkinName() . '.css'; + $s = '@import "'.$this->makeUrl($csspage, 'action=raw&ctype=text/css')."\";\n"; - $s = ''; if ( 1 == $wgUser->getOption( 'underline' ) ) { # Don't override browser settings } else { # CHECK MERGE @@@ # Force no underline - $s .= 'a { ' . - "text-decoration: none; }\n"; + $s .= "a { text-decoration: none; }\n"; } if ( 1 == $wgUser->getOption( 'highlightbroken' ) ) { $s .= "a.new, #quickbar a.new { color: #CC2200; }\n"; @@ -223,22 +274,21 @@ class Skin { return $s; } - function getBodyOptions() - { + function getBodyOptions() { global $wgUser, $wgTitle, $wgNamespaceBackgrounds, $wgOut, $wgRequest; - + extract( $wgRequest->getValues( 'oldid', 'redirect', 'diff' ) ); if ( 0 != $wgTitle->getNamespace() ) { $a = array( 'bgcolor' => '#ffffec' ); } else $a = array( 'bgcolor' => '#FFFFFF' ); - if($wgOut->isArticle() && $wgUser->getOption('editondblclick') && + if($wgOut->isArticle() && $wgUser->getOption('editondblclick') && (!$wgTitle->isProtected() || $wgUser->isSysop()) ) { $t = wfMsg( 'editthispage' ); $oid = $red = ''; - if ( !empty($redirect) ) { - $red = "&redirect={$redirect}"; + if ( !empty($redirect) ) { + $red = "&redirect={$redirect}"; } if ( !empty($oldid) && ! isset( $diff ) ) { $oid = "&oldid={$oldid}"; @@ -252,14 +302,13 @@ class Skin { return $a; } - function getExternalLinkAttributes( $link, $text, $class='' ) - { + function getExternalLinkAttributes( $link, $text, $class='' ) { global $wgUser, $wgOut, $wgLang; $link = urldecode( $link ); $link = $wgLang->checkTitleEncoding( $link ); $link = str_replace( '_', ' ', $link ); - $link = wfEscapeHTML( $link ); + $link = htmlspecialchars( $link ); $r = ($class != '') ? " class='$class'" : " class='external'"; @@ -269,20 +318,19 @@ class Skin { return $r; } - function getInternalLinkAttributes( $link, $text, $broken = false ) - { + function getInternalLinkAttributes( $link, $text, $broken = false ) { global $wgUser, $wgOut; $link = urldecode( $link ); $link = str_replace( '_', ' ', $link ); - $link = wfEscapeHTML( $link ); + $link = htmlspecialchars( $link ); - if ( $broken == 'stub' ) { - $r = ' class="stub"'; - } else if ( $broken == 'yes' ) { - $r = ' class="new"'; - } else { - $r = ''; + if ( $broken == 'stub' ) { + $r = ' class="stub"'; + } else if ( $broken == 'yes' ) { + $r = ' class="new"'; + } else { + $r = ''; } if ( 1 == $wgUser->getOption( 'hover' ) ) { @@ -290,49 +338,47 @@ class Skin { } return $r; } - - function getInternalLinkAttributesObj( &$nt, $text, $broken = false ) - { + + /** + * @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 ( $broken == 'stub' ) { + $r = ' class="stub"'; + } else if ( $broken == 'yes' ) { + $r = ' class="new"'; + } else { + $r = ''; } if ( 1 == $wgUser->getOption( 'hover' ) ) { $r .= ' title ="' . $nt->getEscapedText() . '"'; } return $r; - } - - function getLogo() - { + } + + /** + * URL to the logo + */ + function getLogo() { global $wgLogo; return $wgLogo; } - # This will be called immediately after the tag. Split into - # two functions to make it easier to subclass. - # - function beforeContent() - { - global $wgUser, $wgOut, $wgSiteNotice; + /** + * This will be called immediately after the tag. Split into + * two functions to make it easier to subclass. + */ + function beforeContent() { + global $wgUser, $wgOut; - if( $wgSiteNotice ) { - $note = "\n
$wgSiteNotice
\n"; - } else { - $note = ''; - } - return $this->doBeforeContent() . $note; + return $this->doBeforeContent(); } - function doBeforeContent() - { - global $wgUser, $wgOut, $wgTitle, $wgLang; + function doBeforeContent() { + global $wgUser, $wgOut, $wgTitle, $wgLang, $wgSiteNotice; $fname = 'Skin::doBeforeContent'; wfProfileIn( $fname ); @@ -354,7 +400,7 @@ class Skin { $shove = ($qb != 0); $left = ($qb == 1 || $qb == 3); if($wgLang->isRTL()) $left = !$left; - + if ( !$shove ) { $s .= "\n" . $this->logoText() . ''; @@ -382,34 +428,66 @@ class Skin { $s .= "\n\n\n"; $s .= "\n
\n"; + if( $wgSiteNotice ) { + $s .= "\n
$wgSiteNotice
\n"; + } $s .= $this->pageTitle(); $s .= $this->pageSubtitle() ; $s .= $this->getCategories(); wfProfileOut( $fname ); return $s; } - + function getCategoryLinks () { global $wgOut, $wgTitle, $wgUser, $wgParser; global $wgUseCategoryMagic, $wgUseCategoryBrowser, $wgLang; + if( !$wgUseCategoryMagic ) return '' ; if( count( $wgOut->mCategoryLinks ) == 0 ) return ''; - if( !$wgOut->isArticle() ) return ''; - + + # Taken out so that they will be displayed in previews -- TS + #if( !$wgOut->isArticle() ) return ''; + $t = implode ( ' | ' , $wgOut->mCategoryLinks ) ; $s = $this->makeKnownLink( '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 .= '

'; - $catstack = array(); - $s.= $wgTitle->getAllParentCategories(&$catstack); + + # get a big array of the parents tree + $parenttree = $wgTitle->getCategorieBrowser(); + + # Render the array as a serie of links + function walkThrough ($tree) { + global $wgUser; + $sk = $wgUser->getSkin(); + $return = ''; + foreach($tree as $element => $parent) { + if(empty($parent)) { + # element start a new list + $return .= '
'; + } else { + # grab the others elements + $return .= walkThrough($parent); + } + # add our current element to the list + $eltitle = Title::NewFromText($element); + # FIXME : should be makeLink() [AV] + $return .= $sk->makeKnownLink($element, $eltitle->getText()).' > '; + } + return $return; + } + + $s .= walkThrough($parenttree); } - + return $s; } - + function getCategories() { $catlinks=$this->getCategoryLinks(); if(!empty($catlinks)) { @@ -417,31 +495,32 @@ class Skin { } } - function getQuickbarCompensator( $rows = 1 ) - { + function getQuickbarCompensator( $rows = 1 ) { return " "; } # This gets called immediately before the tag. # - function afterContent() - { + function afterContent() { global $wgUser, $wgOut, $wgServer; global $wgTitle, $wgLang; - + $printfooter = "
\n" . $this->printFooter() . "
\n"; return $printfooter . $this->doAfterContent(); } - - function printFooter() { + + function printSource() { global $wgTitle; $url = htmlspecialchars( $wgTitle->getFullURL() ); - return "

" . wfMsg( "retrievedfrom", "$url" ) . + return wfMsg( "retrievedfrom", "$url" ); + } + + function printFooter() { + return "

" . $this->printSource() . "

\n\n

" . $this->pageStats() . "

\n"; } - - function doAfterContent() - { + + function doAfterContent() { global $wgUser, $wgOut, $wgLang; $fname = 'Skin::doAfterContent'; wfProfileIn( $fname ); @@ -450,7 +529,7 @@ class Skin { $s = "\n

\n"; $s .= "\n\n\n"; - + wfProfileOut( $fname.'-3' ); wfProfileIn( $fname.'-4' ); if ( 0 != $qb ) { $s .= $this->quickBar(); } @@ -488,8 +567,7 @@ class Skin { return $s; } - function pageTitleLinks() - { + function pageTitleLinks() { global $wgOut, $wgTitle, $wgUser, $wgLang, $wgUseApproval, $wgRequest; extract( $wgRequest->getValues( 'oldid', 'diff' ) ); @@ -501,7 +579,7 @@ class Skin { if ( $wgOut->isArticleRelated() ) { if ( $wgTitle->getNamespace() == Namespace::getImage() ) { $name = $wgTitle->getDBkey(); - $link = wfEscapeHTML( Image::wfImageUrl( $name ) ); + $link = htmlspecialchars( Image::wfImageUrl( $name ) ); $style = $this->getInternalLinkAttributes( $link, $name ); $s .= " | {$name}"; } @@ -509,12 +587,12 @@ class Skin { if ( isset ( $wgUseApproval ) && $wgUseApproval ) { $t = $wgTitle->getDBkey(); - $name = 'Approve this article' ; + $name = 'Approve this article' ; $link = "http://test.wikipedia.org/w/magnus/wiki.phtml?title={$t}&action=submit&doit=1" ; - #wfEscapeHTML( wfImageUrl( $name ) ); + #htmlspecialchars( wfImageUrl( $name ) ); $style = $this->getExternalLinkAttributes( $link, $name ); $s .= " | {$name}" ; - } + } } if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) { $s .= ' | ' . $this->makeKnownLink( $wgTitle->getPrefixedText(), @@ -522,8 +600,8 @@ class Skin { } if ( $wgUser->getNewtalk() ) { - # do not show "You have new messages" text when we are viewing our - # own talk page + # do not show "You have new messages" text when we are viewing our + # own talk page if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 && $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) { @@ -532,9 +610,11 @@ class Skin { Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", wfMsg('newmessageslink') ); $s.= ' | '. wfMsg( 'newmessages', $tl ) . ''; + # disable caching + $wgOut->setSquidMaxage(0); } } - + $undelete = $this->getUndeleteLink(); if( !empty( $undelete ) ) { $s .= ' | '.$undelete; @@ -554,9 +634,8 @@ class Skin { } return ''; } - - function printableLink() - { + + function printableLink() { global $wgOut, $wgFeedClasses, $wgRequest; $baseurl = $_SERVER['REQUEST_URI']; @@ -567,7 +646,7 @@ class Skin { } $baseurl = htmlspecialchars( $baseurl ); $printurl = $wgRequest->escapeAppendQuery( 'printable=yes' ); - + $s = "" . wfMsg( 'printableversion' ) . ''; if( $wgOut->isSyndicated() ) { foreach( $wgFeedClasses as $format => $class ) { @@ -578,8 +657,7 @@ class Skin { return $s; } - function pageTitle() - { + function pageTitle() { global $wgOut, $wgTitle, $wgUser; $s = '

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

'; @@ -587,8 +665,7 @@ class Skin { return $s; } - function pageSubtitle() - { + function pageSubtitle() { global $wgOut; $sub = $wgOut->getSubtitle(); @@ -602,8 +679,7 @@ class Skin { return $s; } - function subPageSubtitle() - { + function subPageSubtitle() { global $wgOut,$wgTitle,$wgNamespacesWithSubpages; $subpages = ''; if($wgOut->isArticle() && !empty($wgNamespacesWithSubpages[$wgTitle->getNamespace()])) { @@ -632,8 +708,7 @@ class Skin { return $subpages; } - function nameAndLogin() - { + function nameAndLogin() { global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader, $wgIP; $li = $wgLang->specialPage( 'Userlogin' ); @@ -647,17 +722,17 @@ class Skin { $tl = $this->makeKnownLink( $wgLang->getNsText( Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", $wgLang->getNsText( Namespace::getTalk( 0 ) ) ); - + $s .= $n . ' ('.$tl.')'; } else { $s .= wfMsg('notloggedin'); } - + $rt = $wgTitle->getPrefixedURL(); if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) { $q = ''; } else { $q = "returnto={$rt}"; } - + $s .= "\n
" . $this->makeKnownLink( $li, wfMsg( 'login' ), $q ); } else { @@ -667,8 +742,8 @@ class Skin { Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}", $wgLang->getNsText( Namespace::getTalk( 0 ) ) ); - $tl = " ({$tl})"; - + $tl = " ({$tl})"; + $s .= $this->makeKnownLink( $wgLang->getNsText( Namespace::getUser() ) . ":{$n}", $n ) . "{$tl}
" . $this->makeKnownLink( $lo, wfMsg( 'logout' ), @@ -676,25 +751,24 @@ class Skin { $this->specialLink( 'preferences' ); } $s .= ' | ' . $this->makeKnownLink( wfMsg( 'helppage' ), - wfMsg( 'help' ) ); + wfMsg( 'help' ) ); return $s; } - + function getSearchLink() { $searchPage =& Title::makeTitle( NS_SPECIAL, 'Search' ); return $searchPage->getLocalURL(); } - + function escapeSearchLink() { return htmlspecialchars( $this->getSearchLink() ); } - - function searchForm() - { + + function searchForm() { global $wgRequest; $search = $wgRequest->getText( 'search' ); - + $s = '
\n" . 'getNamespace() == Namespace::getUser() || $wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser()) ) - + { $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(); } @@ -765,10 +837,9 @@ class Skin { return $s; } - function pageStats() - { + function pageStats() { global $wgOut, $wgLang, $wgArticle, $wgRequest; - global $wgDisableCounters; + global $wgDisableCounters, $wgMaxCredits, $wgShowCreditsIfMax; extract( $wgRequest->getValues( 'oldid', 'diff' ) ); if ( ! $wgOut->isArticle() ) { return ''; } @@ -783,96 +854,29 @@ class Skin { } } - $s .= ' ' . $this->getCredits(); - - return $s . ' ' . $this->getCopyright(); - } - - function getCredits() { - global $wgMaxCredits; - - $s = ''; - - if (!isset($wgMaxCredits) || $wgMaxCredits == 0) { - $s = $this->lastModified(); - } else { - $s = $this->getAuthorCredits(); - if ($wgMaxCredits > 1) { - $s .= ' ' . $this->getContributorCredits(); - } - } - - return $s; - } - - function getAuthorCredits() { - global $wgLang, $wgArticle; - - $last_author = $wgArticle->getUser(); - - if ($last_author == 0) { - $author_credit = wfMsg('anonymous'); + if (isset($wgMaxCredits) && $wgMaxCredits != 0) { + require_once("Credits.php"); + $s .= ' ' . getCredits($wgArticle, $wgMaxCredits, $wgShowCreditsIfMax); } else { - $real_name = User::whoIsReal($last_author); - if (!empty($real_name)) { - $author_credit = $real_name; - } else { - $author_credit = wfMsg('siteuser', User::whoIs($last_author)); - } - } - - $timestamp = $wgArticle->getTimestamp(); - if ( $timestamp ) { - $d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true ); - } else { - $d = ''; + $s .= $this->lastModified(); } - return wfMsg('lastmodifiedby', $d, $author_credit); - } - function getContributorCredits() { - - global $wgArticle, $wgMaxCredits, $wgLang; + return $s . ' ' . $this->getCopyright(); + } - # don't count last editor + function getCopyright() { + global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgRequest; - $contributors = $wgArticle->getContributors($wgMaxCredits - 1); - - $real_names = array(); - $user_names = array(); - # Sift for real versus user names - - foreach ($contributors as $user_id => $user_parts) { - if ($user_id != 0) { - if (!empty($user_parts[1])) { - $real_names[$user_id] = $user_parts[1]; - } else { - $user_names[$user_id] = $user_parts[0]; - } - } - } - - $real = $wgLang->listToText(array_values($real_names)); - $user = $wgLang->listToText(array_values($user_names)); + $oldid = $wgRequest->getVal( 'oldid' ); + $diff = $wgRequest->getVal( 'diff' ); - if (!empty($user)) { - $user = wfMsg('siteusers', $user); - } - - if ($contributors[0] && $contributors[0][0] > 0) { - $anon = wfMsg('anonymous'); + if ( !is_null( $oldid ) && is_null( $diff ) && wfMsg( 'history_copyright' ) !== '-' ) { + $msg = 'history_copyright'; } else { - $anon = ''; + $msg = 'copyright'; } - - $creds = $wgLang->listToText(array($real, $user, $anon)); - - return wfMsg('othercontribs', $creds); - } - - function getCopyright() { - global $wgRightsPage, $wgRightsUrl, $wgRightsText; + $out = ''; if( $wgRightsPage ) { $link = $this->makeKnownLink( $wgRightsPage, $wgRightsText ); @@ -882,10 +886,10 @@ class Skin { # Give up now return $out; } - $out .= wfMsg( 'copyright', $link ); + $out .= wfMsg( $msg, $link ); return $out; } - + function getCopyrightIcon() { global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgRightsIcon; $out = ''; @@ -903,7 +907,7 @@ class Skin { } return $out; } - + function getPoweredBy() { global $wgStylePath; $url = htmlspecialchars( "$wgStylePath/images/poweredby_mediawiki_88x31.png" ); @@ -911,10 +915,9 @@ class Skin { return $img; } - function lastModified() - { + function lastModified() { global $wgLang, $wgArticle; - + $timestamp = $wgArticle->getTimestamp(); if ( $timestamp ) { $d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true ); @@ -925,24 +928,27 @@ class Skin { return $s; } - function logoText( $align = '' ) - { - if ( '' != $align ) { $a = ' align="'.$align.'"'; } + function logoText( $align = '' ) { + if ( '' != $align ) { $a = " align='{$align}'"; } else { $a = ''; } - + $mp = wfMsg( 'mainpage' ); $titleObj = Title::newFromText( $mp ); - $s = '"; + if ( is_object( $titleObj ) ) { + $url = $titleObj->escapeLocalURL(); + } else { + $url = ''; + } + + $logourl = $this->getLogo(); + $s = ""; return $s; } - function quickBar() - { + function quickBar() { global $wgOut, $wgTitle, $wgUser, $wgRequest, $wgLang; global $wgDisableUploads, $wgRemoteUploads; - + $fname = 'Skin::quickBar'; wfProfileIn( $fname ); @@ -957,17 +963,17 @@ class Skin { $s .= $this->mainPageLink() . $sep . $this->specialLink( 'recentchanges' ) . $sep . $this->specialLink( 'randompage' ); - if ($wgUser->getID()) { - $s.= $sep . $this->specialLink( 'watchlist' ) ; + if ($wgUser->getID()) { + $s.= $sep . $this->specialLink( 'watchlist' ) ; $s .= $sep .$this->makeKnownLink( $wgLang->specialPage( 'Contributions' ), - wfMsg( 'mycontris' ), 'target=' . wfUrlencode($wgUser->getName() ) ); - + 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() || $action =='edit' || $action =='history' || $wpPreview) { if($wgOut->isArticle()) { $s .= '' . $this->editThisPage() . ''; } else { # backlink to the article in edit or history mode @@ -980,15 +986,15 @@ class Skin { $text = wfMsg('viewtalkpage'); break; case 2: - $text = wfMsg('userpage'); + $text = wfMsg('userpage'); break; case 3: $text = wfMsg('viewtalkpage'); - break; - case 4: + break; + case 4: $text = wfMsg('wikipediapage'); break; - case 5: + case 5: $text = wfMsg('viewtalkpage'); break; case 6: @@ -1000,11 +1006,11 @@ class Skin { 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() ) { @@ -1012,9 +1018,9 @@ class Skin { # 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'); @@ -1043,64 +1049,64 @@ class Skin { $s .= $sep . $this->historyLink(); } $s.=$sep . $this->whatLinksHere(); - + if($wgOut->isArticleRelated()) { $s .= $sep . $this->watchPageLinksLink(); } - if ( Namespace::getUser() == $wgTitle->getNamespace() + 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 .= $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; } - function specialPagesList() - { + function specialPagesList() { global $wgUser, $wgOut, $wgLang, $wgServer, $wgRedirectScript; + require_once('SpecialPage.php'); $a = array(); $pages = SpecialPage::getPages(); - + 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() ; } @@ -1124,43 +1130,38 @@ class Skin { return $s; } - function mainPageLink() - { + function mainPageLink() { $mp = wfMsg( 'mainpage' ); $s = $this->makeKnownLink( $mp, $mp ); return $s; } - function copyrightLink() - { + function copyrightLink() { $s = $this->makeKnownLink( wfMsg( 'copyrightpage' ), wfMsg( 'copyrightpagename' ) ); return $s; } - function aboutLink() - { + function aboutLink() { $s = $this->makeKnownLink( wfMsg( 'aboutpage' ), wfMsg( 'aboutwikipedia' ) ); return $s; } - function disclaimerLink() - { + function disclaimerLink() { $s = $this->makeKnownLink( wfMsg( 'disclaimerpage' ), wfMsg( 'disclaimers' ) ); return $s; } - function editThisPage() - { + function editThisPage() { global $wgOut, $wgTitle, $wgRequest; - + $oldid = $wgRequest->getVal( 'oldid' ); $diff = $wgRequest->getVal( 'diff' ); $redirect = $wgRequest->getVal( 'redirect' ); - + if ( ! $wgOut->isArticleRelated() ) { $s = wfMsg( 'protectedpage' ); } else { @@ -1175,15 +1176,14 @@ class Skin { if ( !is_null( $redirect ) ) { $red = "&redirect={$redirect}"; } if ( $oldid && ! isset( $diff ) ) { - $oid = "&oldid={$oldid}"; + $oid = '&oldid='.$oldid; } $s = $this->makeKnownLink( $n, $t, "action=edit{$oid}{$red}" ); } return $s; } - function deleteThisPage() - { + function deleteThisPage() { global $wgUser, $wgOut, $wgTitle, $wgRequest; $diff = $wgRequest->getVal( 'diff' ); @@ -1198,8 +1198,7 @@ class Skin { return $s; } - function protectThisPage() - { + function protectThisPage() { global $wgUser, $wgOut, $wgTitle, $wgRequest; $diff = $wgRequest->getVal( 'diff' ); @@ -1220,8 +1219,7 @@ class Skin { return $s; } - function watchThisPage() - { + function watchThisPage() { global $wgUser, $wgOut, $wgTitle; if ( $wgOut->isArticleRelated() ) { @@ -1241,8 +1239,7 @@ class Skin { return $s; } - function moveThisPage() - { + function moveThisPage() { global $wgTitle, $wgLang; if ( $wgTitle->userCanEdit() ) { @@ -1252,8 +1249,7 @@ class Skin { return $s; } - function historyLink() - { + function historyLink() { global $wgTitle; $s = $this->makeKnownLink( $wgTitle->getPrefixedText(), @@ -1261,8 +1257,7 @@ class Skin { return $s; } - function whatLinksHere() - { + function whatLinksHere() { global $wgTitle, $wgLang; $s = $this->makeKnownLink( $wgLang->specialPage( 'Whatlinkshere' ), @@ -1270,8 +1265,7 @@ class Skin { return $s; } - function userContribsLink() - { + function userContribsLink() { global $wgTitle, $wgLang; $s = $this->makeKnownLink( $wgLang->specialPage( 'Contributions' ), @@ -1279,8 +1273,7 @@ class Skin { return $s; } - function emailUserLink() - { + function emailUserLink() { global $wgTitle, $wgLang; $s = $this->makeKnownLink( $wgLang->specialPage( 'Emailuser' ), @@ -1288,8 +1281,7 @@ class Skin { return $s; } - function watchPageLinksLink() - { + function watchPageLinksLink() { global $wgOut, $wgTitle, $wgLang; if ( ! $wgOut->isArticleRelated() ) { @@ -1302,8 +1294,7 @@ class Skin { return $s; } - function otherLanguages() - { + function otherLanguages() { global $wgOut, $wgLang, $wgTitle, $wgUseNewInterlanguage; $a = $wgOut->getLanguageLinks(); @@ -1346,15 +1337,13 @@ class Skin { return $s; } - function bugReportsLink() - { + function bugReportsLink() { $s = $this->makeKnownLink( wfMsg( 'bugreportspage' ), wfMsg( 'bugreports' ) ); return $s; } - function dateLink() - { + function dateLink() { global $wgLinkCache; $t1 = Title::newFromText( gmdate( 'F j' ) ); $t2 = Title::newFromText( gmdate( 'Y' ) ); @@ -1382,15 +1371,14 @@ class Skin { return $s; } - function talkLink() - { + function talkLink() { global $wgLang, $wgTitle, $wgLinkCache; $tns = $wgTitle->getNamespace(); if ( -1 == $tns ) { return ''; } $pn = $wgTitle->getText(); - $tp = wfMsg( 'talkpage' ); + $tp = wfMsg( 'talkpage' ); if ( Namespace::isTalk( $tns ) ) { $lns = Namespace::getSubject( $tns ); switch($tns) { @@ -1400,7 +1388,7 @@ class Skin { case 3: $text = wfMsg('userpage'); break; - case 5: + case 5: $text = wfMsg('wikipediapage'); break; case 7: @@ -1412,7 +1400,7 @@ class Skin { } else { $lns = Namespace::getTalk( $tns ); - $text=$tp; + $text=$tp; } $n = $wgLang->getNsText( $lns ); if ( '' == $n ) { $link = $pn; } @@ -1425,8 +1413,7 @@ class Skin { return $s; } - function commentLink() - { + function commentLink() { global $wgLang, $wgTitle, $wgLinkCache; $tns = $wgTitle->getNamespace(); @@ -1448,17 +1435,19 @@ class Skin { return $s; } - # After all the page content is transformed into HTML, it makes - # a final pass through here for things like table backgrounds. - # - function transformContent( $text ) - { + /** + * 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; } - # Note: This function MUST call getArticleID() on the link, - # otherwise the cache won't get updated properly. See LINKCACHE.DOC. - # + /** + * 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 ); @@ -1492,10 +1481,10 @@ class Skin { return $text == '' ? $title : $text; } } - + function makeStubLink( $title, $text = '', $query = '', $trail = '' ) { $nt = Title::newFromText( $title ); - if ($nt) { + if ($nt) { return $this->makeStubLinkObj( Title::newFromText( $title ), $text, $query, $trail ); } else { wfDebug( 'Invalid title passed to Skin::makeStubLink(): "'.$title."\"\n" ); @@ -1503,10 +1492,17 @@ class Skin { } } - # Pass a title object, not a title string - function makeLinkObj( &$nt, $text= '', $query = '', $trail = '', $prefix = '' ) - { + /** + * 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(); @@ -1527,46 +1523,67 @@ class Skin { ( Namespace::getImage() == $nt->getNamespace() ) ) { $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix ); } else { - $aid = $nt->getArticleID() ; - if ( 0 == $aid ) { - $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail, $prefix ); + 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 { - $threshold = $wgUser->getOption('stubthreshold') ; - if ( $threshold > 0 ) { - $res = wfQuery ( "SELECT LENGTH(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'", DB_READ ) ; - - if ( wfNumRows( $res ) > 0 ) { - $s = wfFetchObject( $res ); - $size = $s->x; - if ( $s->cur_is_redirect OR $s->cur_namespace != 0 ) { + # 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 } - wfFreeResult( $res ); } else { - $size = $threshold*2 ; # Really big + $size = 1 ; + } + if ( $size < $threshold ) { + $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail, $prefix ); + } else { + $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix ); } - } 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; } - # Pass a title object, not a title string - function makeKnownLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '') - { - global $wgOut, $wgTitle; + /** + * 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 = ''; @@ -1577,7 +1594,12 @@ class Skin { $u = $nt->escapeLocalURL( $query ); } if ( '' != $nt->getFragment() ) { - $u .= '#' . htmlspecialchars( $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() ); @@ -1596,11 +1618,16 @@ class Skin { return $r; } - # Pass a title object, not a title string - function makeBrokenLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' ) - { + /** + * 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 ); @@ -1632,10 +1659,11 @@ class Skin { wfProfileOut( $fname ); return $s; } - - # Pass a title object, not a title string - function makeStubLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' ) - { + + /** + * Pass a title object, not a title string + */ + function makeStubLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' ) { global $wgOut, $wgUser; $link = $nt->getPrefixedURL(); @@ -1661,9 +1689,8 @@ class Skin { } return $s; } - - function makeSelfLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' ) - { + + function makeSelfLinkObj( &$nt, $text = '', $query = '', $trail = '', $prefix = '' ) { $u = $nt->escapeLocalURL( $query ); if ( '' == $text ) { $text = htmlspecialchars( $nt->getPrefixedText() ); @@ -1681,103 +1708,106 @@ class Skin { /* 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); + $this->checkTitle($title, $name); return $title->getLocalURL( $urlaction ); } /*static*/ function makeTalkUrl ( $name, $urlaction='' ) { $title = Title::newFromText( $name ); $title = $title->getTalkPage(); - $this->checkTitle($title, $name); + $this->checkTitle($title, $name); return $title->getLocalURL( $urlaction ); } /*static*/ function makeArticleUrl ( $name, $urlaction='' ) { $title = Title::newFromText( $name ); $title= $title->getSubjectPage(); - $this->checkTitle($title, $name); + $this->checkTitle($title, $name); return $title->getLocalURL( $urlaction ); } /*static*/ function makeI18nUrl ( $name, $urlaction='' ) { $title = Title::newFromText( wfMsg($name) ); - $this->checkTitle($title, $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->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::makeTitle( $namespace, $name ); - $this->checkTitle($title, $name); + $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( + 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( + 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( + 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( + 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 ) { + /*static*/ function checkTitle ( &$title, &$name ) { if(!is_object($title)) { $title = Title::newFromText( $name ); if(!is_object($title)) { - $title = Title::newFromText( '' ); + $title = Title::newFromText( '--error: link target missing--' ); } } } - function fnamePart( $url ) - { + function fnamePart( $url ) { $basename = strrchr( $url, '/' ); - if ( false === $basename ) { $basename = $url; } - else { $basename = substr( $basename, 1 ); } - return wfEscapeHTML( $basename ); + if ( false === $basename ) { + $basename = $url; + } else { + $basename = substr( $basename, 1 ); + } + return htmlspecialchars( $basename ); } - function makeImage( $url, $alt = '' ) - { + function makeImage( $url, $alt = '' ) { global $wgOut; - if ( '' == $alt ) { $alt = $this->fnamePart( $url ); } + if ( '' == $alt ) { + $alt = $this->fnamePart( $url ); + } $s = ''.$alt.''; return $s; } - + function makeImageLink( $name, $url, $alt = '' ) { - $nt = Title::makeTitle( Namespace::getImage(), $name ); + $nt = Title::makeTitleSafe( NS_IMAGE, $name ); return $this->makeImageLinkObj( $nt, $alt ); } @@ -1799,9 +1829,9 @@ class Skin { # * ___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 ); @@ -1812,10 +1842,17 @@ class Skin { $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'; @@ -1846,9 +1883,9 @@ class Skin { $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 @@ -1862,23 +1899,23 @@ class Skin { if ( ! isset($width) ) { $width = 180; } - return $prefix.$this->makeThumbLinkObj( $img, $alt, $align, $width, $height, $framed ).$postfix; - + 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 ) + 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(); } - $url = $img->createThumb( $width ); + if ( '' == $manual_thumb ) $url = $img->createThumb( $width ); } } # endif $wgUseImageResize - + if ( empty( $alt ) ) { $alt = preg_replace( '/\.(.+?)^/', '', $img->getName() ); } @@ -1887,7 +1924,7 @@ class Skin { $u = $nt->escapeLocalURL(); if ( $url == '' ) { - $s = str_replace( "$1", $img->getName(), wfMsg('missingimage') ); + $s = wfMsg( 'missingimage', $img->getName() ); $s .= "
{$alt}
{$url}
\n"; } else { $s = '' . @@ -1899,23 +1936,33 @@ class Skin { return str_replace("\n", ' ',$prefix.$s.$postfix); } - - function makeThumbLinkObj( $img, $label = '', $align = 'right', $boxwidth = 180, $boxheight=false, $framed=false ) { + /** + * 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::makeTitle( Namespace::getImage(), $name ); + # $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(); - } else { + } + if ( 0 == $width || 0 == $height ) + { $width = $height = 200; } + if ( $boxwidth == 0 ) + { + $boxwidth = 200; + } if ( $framed ) { // Use image dimensions, don't scale @@ -1932,7 +1979,22 @@ class Skin { } else { $boxheight = $h; } - $thumbUrl = $img->createThumb( $boxwidth ); + 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(); @@ -1943,7 +2005,7 @@ class Skin { $s = "
"; if ( $thumbUrl == '' ) { - $s .= str_replace( "$1", $img->getName(), wfMsg('missingimage') ); + $s .= wfMsg( 'missingimage', $img->getName() ); $zoomicon = ''; } else { $s .= ''. @@ -1962,16 +2024,15 @@ class Skin { return str_replace("\n", ' ', $s); } - function makeMediaLink( $name, $url, $alt = "" ) { - $nt = Title::makeTitle( Namespace::getMedia(), $name ); + function makeMediaLink( $name, $url, $alt = '' ) { + $nt = Title::makeTitleSafe( Namespace::getMedia(), $name ); return $this->makeMediaLinkObj( $nt, $alt ); } - function makeMediaLinkObj( $nt, $alt = "" ) - { + function makeMediaLinkObj( $nt, $alt = '' ) { if ( ! isset( $nt ) ) { - ### HOTFIX. Instead of breaking, return empry string. + ### HOTFIX. Instead of breaking, return empty string. $s = $alt; } else { $name = $nt->getDBKey(); @@ -1979,15 +2040,14 @@ class Skin { if ( empty( $alt ) ) { $alt = preg_replace( '/\.(.+?)^/', '', $name ); } - + $u = htmlspecialchars( $url ); $s = "{$alt}"; } return $s; } - function specialLink( $name, $key = "" ) - { + function specialLink( $name, $key = '' ) { global $wgLang; if ( '' == $key ) { $key = strtolower( $name ); } @@ -1995,7 +2055,7 @@ class Skin { return $this->makeKnownLink( $wgLang->specialPage( $pn ), wfMsg( $key ) ); } - + function makeExternalLink( $url, $text, $escape = true ) { $style = $this->getExternalLinkAttributes( $url, $text ); $url = htmlspecialchars( $url ); @@ -2009,8 +2069,7 @@ class Skin { # # Returns text for the start of the tabular part of RC - function beginRecentChangesList() - { + function beginRecentChangesList() { $this->rc_cache = array() ; $this->rcMoveIndex = 0; $this->rcCacheIndex = 0 ; @@ -2019,17 +2078,17 @@ class Skin { return ''; } - function beginImageHistoryList() - { + function beginImageHistoryList() { $s = "\n

" . wfMsg( 'imghistory' ) . "

\n" . "

" . wfMsg( 'imghistlegend' ) . "

\n".'
    '; return $s; } - # Returns text for the end of RC - # If enhanced RC is in use, returns pretty much all the text - function endRecentChangesList() - { + /** + * Returns text for the end of RC + * If enhanced RC is in use, returns pretty much all the text + */ + function endRecentChangesList() { $s = $this->recentChangesBlock() ; if( $this->rclistOpen ) { $s .= "
\n"; @@ -2037,9 +2096,10 @@ class Skin { return $s; } - # Enhanced RC ungrouped line - function recentChangesBlockLine ( $rcObj ) - { + /** + * Enhanced RC ungrouped line + */ + function recentChangesBlockLine ( $rcObj ) { global $wgStylePath, $wgLang ; # Get rc_xxxx variables @@ -2052,7 +2112,7 @@ class Skin { $r .= '' ; $r .= '' ; - if ( $rc_type == RC_MOVE ) { + if ( $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) { $r .= '  '; } else { # M & N (minor & new) @@ -2080,9 +2140,9 @@ class Skin { if ( $rcObj->watched ) $link = ''.$link.'' ; $r .= $link ; - # Cur + # Diff $r .= ' (' ; - $r .= $rcObj->curlink ; + $r .= $rcObj->difflink ; $r .= '; ' ; # Hist @@ -2093,8 +2153,8 @@ class Skin { $r .= $rcObj->usertalklink ; # Comment - if ( $rc_comment != '' && $rc_type != RC_MOVE ) { - $rc_comment=$this->formatComment($rc_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.')' ); } @@ -2102,9 +2162,10 @@ class Skin { return $r ; } - # Enhanced RC group - function recentChangesBlockGroup ( $block ) - { + /** + * Enhanced RC group + */ + function recentChangesBlockGroup ( $block ) { global $wgStylePath, $wgLang ; $r = '' ; @@ -2137,7 +2198,7 @@ class Skin { $rci = 'RCI'.$this->rcCacheIndex ; $rcl = 'RCL'.$this->rcCacheIndex ; $rcm = 'RCM'.$this->rcCacheIndex ; - $toggleLink = 'javascript:toggleVisibility("'.$rci.'","'.$rcm.'","'.$rcl.'")' ; + $toggleLink = "javascript:toggleVisibility('$rci','$rcm','$rcl')" ; $arrowdir = $wgLang->isRTL() ? 'l' : 'r'; $tl = '' ; $tl .= '' ; @@ -2158,13 +2219,13 @@ class Skin { $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') , + else $r .= $this->makeKnownLinkObj( $block[0]->getTitle() , wfMsg('changes') , $curIdEq.'&diff=0&oldid='.$oldid ) ; $r .= '; ' ; @@ -2181,7 +2242,7 @@ class Skin { foreach ( $block AS $rcObj ) { # Get rc_xxxx variables extract( $rcObj->mAttribs ); - + $r .= ''; $r .= '       ' ; if ( $rc_new ) $r .= $N ; @@ -2209,7 +2270,7 @@ class Skin { $r .= ') . . '.$rcObj->userlink ; $r .= $rcObj->usertalklink ; if ( $rc_comment != '' ) { - $rc_comment=$this->formatComment($rc_comment); + $rc_comment=$this->formatComment($rc_comment, $rcObj->getTitle()); $r .= $wgLang->emphasize( ' ('.$rc_comment.')' ) ; } $r .= "
\n" ; @@ -2220,10 +2281,11 @@ class Skin { return $r ; } - # If enhanced RC is in use, this function takes the previously cached - # RC lines, arranges them, and outputs the HTML - function recentChangesBlock () - { + /** + * 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 = ''; @@ -2238,10 +2300,11 @@ class Skin { 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 ) - { + /** + * 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 ) @@ -2251,9 +2314,8 @@ class Skin { return $line ; } - function recentChangesLineOld( &$rc, $watched = false ) - { - global $wgTitle, $wgLang, $wgUser, $wgRCSeconds; + function recentChangesLineOld( &$rc, $watched = false ) { + global $wgTitle, $wgLang, $wgUser, $wgRCSeconds, $wgUseRCPatrol, $wgOnlySysopsCanPatrol; # Extract DB fields into local scope extract( $rc->mAttribs ); @@ -2268,27 +2330,39 @@ class Skin { $this->lastdate = $date; $this->rclistOpen = true; } - $s .= '
  • '; - if ( $rc_type == RC_MOVE ) { + # If this edit has not yet been patrolled, make it stick out + $s .= ( ! $wgUseRCPatrol || $rc_patrolled ) ? '
  • ' : '
  • '; + + if ( $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) { # Diff $s .= '(' . wfMsg( 'diff' ) . ') ('; # Hist $s .= $this->makeKnownLinkObj( $rc->getMovedToTitle(), wfMsg( 'hist' ), 'action=history' ) . ') . . '; - - # "[[x]] moved to [[y]]" - $s .= wfMsg( '1movedto2', $this->makeKnownLinkObj( $rc->getTitle(), '', 'redirect=no' ), + # "[[x]] moved to [[y]]" + $msg = ( $rc_type == RC_MOVE ) ? '1movedto2' : '1movedto2_redir'; + $s .= wfMsg( $msg, $this->makeKnownLinkObj( $rc->getTitle(), '', 'redirect=no' ), $this->makeKnownLinkObj( $rc->getMovedToTitle(), '' ) ); - + } elseif( $rc_namespace == NS_SPECIAL && preg_match( '!^Log/(.*)$!', $rc_title, $matches ) ) { + # Log updates, etc + $logtype = $matches[1]; + $logname = LogPage::logName( $logtype ); + $s .= '(' . $this->makeKnownLinkObj( $rc->getTitle(), $logname ) . ')'; } else { # Diff link if ( $rc_type == RC_NEW || $rc_type == RC_LOG ) { $diffLink = wfMsg( 'diff' ); } else { + if ( $wgUseRCPatrol && $rc_patrolled == 0 && $wgUser->getID() != 0 && + ( $wgUser->isSysop() || !$wgOnlySysopsCanPatrol ) ) + $rcidparam = "&rcid={$rc_id}"; + else + $rcidparam = ""; $diffLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( 'diff' ), - $curIdEq.'&diff='.$rc_this_oldid.'&oldid='.$rc_last_oldid ,'' ,'' , ' tabindex="'.$rc->counter.'"'); + "{$curIdEq}&diff={$rc_this_oldid}&oldid={$rc_last_oldid}{$rcidparam}", + '', '', ' tabindex="'.$rc->counter.'"'); } $s .= '('.$diffLink.') ('; @@ -2297,13 +2371,17 @@ class Skin { $s .= ') . . '; # M and N (minor and new) - $M = wfMsg( 'minoreditletter' ); - $N = wfMsg( 'newpageletter' ); - if ( $rc_minor ) { $s .= ' '.$M.''; } - if ( $rc_type == RC_NEW ) { $s .= ''.$N.''; } + if ( $rc_minor ) { $s .= ' '.wfMsg( "minoreditletter" ).''; } + if ( $rc_type == RC_NEW ) { $s .= ''.wfMsg( "newpageletter" ).''; } # Article link - $articleLink = $this->makeKnownLinkObj( $rc->getTitle(), '' ); + # If it's a new article, there is no diff link, but if it hasn't been + # patrolled yet, we need to give users a way to do so + if ( $wgUseRCPatrol && $rc_type == RC_NEW && $rc_patrolled == 0 && + $wgUser->getID() != 0 && ( $wgUser->isSysop() || !$wgOnlySysopsCanPatrol ) ) + $articleLink = $this->makeKnownLinkObj( $rc->getTitle(), '', "rcid={$rc_id}" ); + else + $articleLink = $this->makeKnownLinkObj( $rc->getTitle(), '' ); if ( $watched ) { $articleLink = ''.$articleLink.''; @@ -2347,8 +2425,8 @@ class Skin { if($userTalkLink) $s.=' ('.$userTalkLink.')'; # Add comment - if ( '' != $rc_comment && '*' != $rc_comment && $rc_type != RC_MOVE ) { - $rc_comment=$this->formatComment($rc_comment); + if ( '' != $rc_comment && '*' != $rc_comment && $rc_type != RC_MOVE && $rc_type != RC_MOVE_OVER_REDIRECT ) { + $rc_comment=$this->formatComment($rc_comment,$rc->getTitle()); $s .= $wgLang->emphasize(' (' . $rc_comment . ')'); } $s .= "
  • \n"; @@ -2356,9 +2434,7 @@ class Skin { return $s; } -# function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 ) - function recentChangesLineNew( &$baseRC, $watched = false ) - { + function recentChangesLineNew( &$baseRC, $watched = false ) { global $wgTitle, $wgLang, $wgUser, $wgRCSeconds; # Create a specialised object @@ -2370,7 +2446,7 @@ class Skin { # If it's a new day, add the headline and flush the cache $date = $wgLang->date( $rc_timestamp, true); - $ret = '' ; + $ret = ''; if ( $date != $this->lastdate ) { # Process current cache $ret = $this->recentChangesBlock () ; @@ -2378,32 +2454,40 @@ class Skin { $ret .= "

    {$date}

    \n"; $this->lastdate = $date; } - + # Make article link - if ( $rc_type == RC_MOVE ) { - $clink = $this->makeKnownLinkObj( $rc->getTitle(), '', 'redirect=no' ); - $clink .= ' ' . wfMsg('movedto') . ' '; - $clink .= $this->makeKnownLinkObj( $rc->getMovedToTitle(), '' ); + if ( $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) { + $msg = ( $rc_type == RC_MOVE ) ? "1movedto2" : "1movedto2_redir"; + $clink = wfMsg( $msg, $this->makeKnownLinkObj( $rc->getTitle(), '', 'redirect=no' ), + $this->makeKnownLinkObj( $rc->getMovedToTitle(), '' ) ); + } elseif( $rc_namespace == NS_SPECIAL && preg_match( '!^Log/(.*)$!', $rc_title, $matches ) ) { + # Log updates, etc + $logtype = $matches[1]; + $logname = LogPage::logName( $logtype ); + $clink = '(' . $this->makeKnownLinkObj( $rc->getTitle(), $logname ) . ')'; } else { $clink = $this->makeKnownLinkObj( $rc->getTitle(), '' ) ; } - + $time = $wgLang->time( $rc_timestamp, true, $wgRCSeconds ); $rc->watched = $watched ; $rc->link = $clink ; $rc->timestamp = $time; - - # Make "cur" link - if ( ( $rc_type == RC_NEW && $rc_this_oldid == 0 ) || $rc_type == RC_LOG || $rc_type == RC_MOVE) { + + # Make "cur" and "diff" links + if ( ( $rc_type == RC_NEW && $rc_this_oldid == 0 ) || $rc_type == RC_LOG || $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) { $curLink = wfMsg( 'cur' ); + $diffLink = wfMsg( 'diff' ); } else { - $curLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( 'cur' ), - $curIdEq.'&diff=0&oldid='.$rc_this_oldid ,'' ,'' , ' tabindex="'.$baseRC->counter.'"' ); + $query = $curIdEq.'&diff=0&oldid='.$rc_this_oldid; + $aprops = ' tabindex="'.$baseRC->counter.'"'; + $curLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( 'cur' ), $query, '' ,'' , $aprops ); + $diffLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( 'diff'), $query, '' ,'' , $aprops ); } # Make "last" link $titleObj = $rc->getTitle(); - if ( $rc_last_oldid == 0 || $rc_type == RC_LOG || $rc_type == RC_MOVE ) { + if ( $rc_last_oldid == 0 || $rc_type == RC_LOG || $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) { $lastLink = wfMsg( 'last' ); } else { $lastLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( 'last' ), @@ -2411,23 +2495,24 @@ class Skin { } # Make user link (or user contributions for unregistered users) - if ( 0 == $rc_user ) { + if ( $rc_user == 0 ) { $userLink = $this->makeKnownLink( $wgLang->specialPage( 'Contributions' ), $rc_user_text, 'target=' . $rc_user_text ); - } else { + } else { $userLink = $this->makeLink( $wgLang->getNsText( - Namespace::getUser() ) . ':'.$rc_user_text, $rc_user_text ); + Namespace::getUser() ) . ':'.$rc_user_text, $rc_user_text ); } - $rc->userlink = $userLink ; - $rc->lastlink = $lastLink ; - $rc->curlink = $curLink ; + $rc->userlink = $userLink; + $rc->lastlink = $lastLink; + $rc->curlink = $curLink; + $rc->difflink = $diffLink; - # Make user talk link + # Make user talk link $utns=$wgLang->getNsText(NS_USER_TALK); $talkname=$wgLang->getNsText(NS_TALK); # use the shorter name - $userTalkLink= $this->makeLink($utns . ':'.$rc_user_text, $talkname ); - + $userTalkLink= $this->makeLink($utns . ':'.$rc_user_text, $talkname ); + global $wgDisableAnonTalk; if ( ( 0 == $rc_user ) && $wgUser->isSysop() ) { $blockLink = $this->makeKnownLink( $wgLang->specialPage( @@ -2447,7 +2532,7 @@ class Skin { # Page moves go on their own line $title = $rc->getTitle(); $secureName = $title->getPrefixedDBkey(); - if ( $rc_type == RC_MOVE ) { + if ( $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) { # Use an @ character to prevent collision with page names $this->rc_cache['@@' . ($this->rcMoveIndex++)] = array($rc); } else { @@ -2457,22 +2542,28 @@ class Skin { return $ret; } - function endImageHistoryList() - { + function endImageHistoryList() { $s = "\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]]. - Main author: Erik Möller (moeller@scireview.de) - */ - function formatComment($comment) - { + /** + * 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=wfEscapeHTML($comment); + $comment = htmlspecialchars( $comment ); # The pattern for autogen comments is / * foo * /, which makes for # some nasty regex. @@ -2482,7 +2573,18 @@ class Skin { $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.''; @@ -2491,34 +2593,41 @@ class Skin { # format regular and media links - all other wiki formatting # is ignored - while(preg_match('/\[\[(.*?)(\|(.*?))*\]\]/',$comment,$match)) { - - $medians = $wgLang->getNsText(Namespace::getMedia()); - $func='makeLink'; - if(preg_match('/^'.$medians.'/i',$match[1])) { - $func='makeMediaLink'; + $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(isset($match[3]) ) { - $comment= - preg_replace('/\[\[(.*?)\]\]/', - $this->$func($match[1],$match[3]),$comment,1); + if( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) { + # Media link; trail not supported. + $linkRegexp = '/\[\[(.*?)\]\]/'; + $thelink = $this->makeMediaLink( $submatch[1], "", $text ); } else { - $comment= - preg_replace('/\[\[(.*?)\]\]/', - $this->$func($match[1],$match[1]),$comment,1); + # 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 ) - { + 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 ) { @@ -2527,15 +2636,15 @@ class Skin { if ( $wgUser->isSysop() ) { $link = $wgTitle->escapeLocalURL( 'image=' . $wgTitle->getPartialURL() . '&action=delete' ); - $style = $this->getInternalLinkAttributes( $link, $del ); + $style = $this->getInternalLinkAttributes( $link, $delall ); - $dlink = ''.$del.''; + $dlink = ''.$delall.''; } else { $dlink = $del; } } else { - $url = wfEscapeHTML( wfImageArchiveUrl( $img ) ); - if( $wgUser->getID() != 0 ) { + $url = htmlspecialchars( wfImageArchiveUrl( $img ) ); + if( $wgUser->getID() != 0 && $wgTitle->userCanEdit() ) { $rlink = $this->makeKnownLink( $wgTitle->getPrefixedText(), wfMsg( 'revertimg' ), 'action=revert&oldimage=' . urlencode( $img ) ); @@ -2563,7 +2672,7 @@ class Skin { if ( '' != $description && '*' != $description ) { $sk=$wgUser->getSkin(); - $s .= $wgLang->emphasize(' (' . $sk->formatComment($description) . ')'); + $s .= $wgLang->emphasize(' (' . $sk->formatComment($description,$wgTitle) . ')'); } $s .= "\n"; return $s; @@ -2577,7 +2686,9 @@ class Skin { return str_repeat( "
    \n", $level>0 ? $level : 0 ); } - # parameter level defines if we are on an indentation level + /** + * parameter level defines if we are on an indentation level + */ function tocLine( $anchor, $tocline, $level ) { $link = ''.$tocline.'
    '; if($level) { @@ -2593,14 +2704,17 @@ class Skin { # try min-width & co when somebody gets a chance $hideline = ' '; return - '
    '."\n". + '
    '."\n". ''.wfMsg('toc').'' . $hideline . '
    '."\n". $toc."
    \n"; } - # These two do not check for permissions: check $wgTitle->userCanEdit before calling them + /** + * 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' ) ) { @@ -2635,102 +2749,107 @@ class Skin { } - // This function is called by EditPage.php and shows a bulletin board style - // toolbar for common editing functions. It can be disabled in the user preferences. - // The necsesary JavaScript code can be found in style/wikibits.js. + /** + * This function is called by EditPage.php and shows a bulletin board style + * toolbar for common editing functions. It can be disabled in the user + * preferences. + * The necsesary JavaScript code can be found in style/wikibits.js. + */ function getEditToolbar() { global $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 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' + '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_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_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_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_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_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_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_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_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_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" + 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; + } } -require_once( 'SkinStandard.php' ); -require_once( 'SkinNostalgia.php' ); -require_once( 'SkinCologneBlue.php' ); - -if( $wgUsePHPTal ) { - require_once( 'SkinPHPTal.php' ); } - - ?>