specialrecentchanges.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 710 行 · 第 1/2 页

PHP
710
字号
				> wfTimestamp( TS_UNIX, $lastmod ) ) {			wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );			$cachedFeed = $messageMemc->get( $key );		} else {			wfDebug( "RC: cached feed timestamp check failed ($feedLastmod; $lastmod)\n" );		}	}	if( is_string( $cachedFeed ) ) {		wfDebug( "RC: Outputting cached feed\n" );		$feed->httpHeaders();		echo $cachedFeed;	} else {		wfDebug( "RC: rendering new feed and caching it\n" );		ob_start();		rcDoOutputFeed( $rows, $feed );		$cachedFeed = ob_get_contents();		ob_end_flush();		$expire = 3600 * 24; # One day		$messageMemc->set( $key, $cachedFeed );		$messageMemc->set( $timekey, wfTimestamp( TS_MW ), $expire );	}	return true;}function rcDoOutputFeed( $rows, &$feed ) {	$fname = 'rcDoOutputFeed';	wfProfileIn( $fname );	$feed->outHeader();	# Merge adjacent edits by one user	$sorted = array();	$n = 0;	foreach( $rows as $obj ) {		if( $n > 0 &&			$obj->rc_namespace >= 0 &&			$obj->rc_cur_id == $sorted[$n-1]->rc_cur_id &&			$obj->rc_user_text == $sorted[$n-1]->rc_user_text ) {			$sorted[$n-1]->rc_last_oldid = $obj->rc_last_oldid;		} else {			$sorted[$n] = $obj;			$n++;		}		$first = false;	}	foreach( $sorted as $obj ) {		$title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );		$talkpage = $title->getTalkPage();		$item = new FeedItem(			$title->getPrefixedText(),			rcFormatDiff( $obj ),			$title->getFullURL(),			$obj->rc_timestamp,			$obj->rc_user_text,			$talkpage->getFullURL()			);		$feed->outItem( $item );	}	$feed->outFooter();	wfProfileOut( $fname );}/** * */function rcCountLink( $lim, $d, $page='Recentchanges', $more='' ) {	global $wgUser, $wgLang, $wgContLang;	$sk = $wgUser->getSkin();	$s = $sk->makeKnownLink( $wgContLang->specialPage( $page ),	  ($lim ? $wgLang->formatNum( "{$lim}" ) : wfMsg( 'recentchangesall' ) ), "{$more}" .	  ($d ? "days={$d}&" : '') . 'limit='.$lim );	return $s;}/** * */function rcDaysLink( $lim, $d, $page='Recentchanges', $more='' ) {	global $wgUser, $wgLang, $wgContLang;	$sk = $wgUser->getSkin();	$s = $sk->makeKnownLink( $wgContLang->specialPage( $page ),	  ($d ? $wgLang->formatNum( "{$d}" ) : wfMsg( 'recentchangesall' ) ), $more.'days='.$d .	  ($lim ? '&limit='.$lim : '') );	return $s;}/** * Used by Recentchangeslinked */function rcDayLimitLinks( $days, $limit, $page='Recentchanges', $more='', $doall = false, $minorLink = '',	$botLink = '', $liuLink = '', $patrLink = '', $myselfLink = '' ) {	if ($more != '') $more .= '&';	$cl = rcCountLink( 50, $days, $page, $more ) . ' | ' .	  rcCountLink( 100, $days, $page, $more  ) . ' | ' .	  rcCountLink( 250, $days, $page, $more  ) . ' | ' .	  rcCountLink( 500, $days, $page, $more  ) .	  ( $doall ? ( ' | ' . rcCountLink( 0, $days, $page, $more ) ) : '' );	$dl = rcDaysLink( $limit, 1, $page, $more  ) . ' | ' .	  rcDaysLink( $limit, 3, $page, $more  ) . ' | ' .	  rcDaysLink( $limit, 7, $page, $more  ) . ' | ' .	  rcDaysLink( $limit, 14, $page, $more  ) . ' | ' .	  rcDaysLink( $limit, 30, $page, $more  ) .	  ( $doall ? ( ' | ' . rcDaysLink( $limit, 0, $page, $more ) ) : '' );		$linkParts = array( 'minorLink' => 'minor', 'botLink' => 'bots', 'liuLink' => 'liu', 'patrLink' => 'patr', 'myselfLink' => 'mine' );	foreach( $linkParts as $linkVar => $linkMsg ) {		if( $$linkVar != '' )			$links[] = wfMsgHtml( 'rcshowhide' . $linkMsg, $$linkVar );	}		$shm = implode( ' | ', $links );	$note = wfMsg( 'rclinks', $cl, $dl, $shm );	return $note;}/** * Makes change an option link which carries all the other options * @param $title @see Title * @param $override * @param $options */function makeOptionsLink( $title, $override, $options ) {	global $wgUser, $wgContLang;	$sk = $wgUser->getSkin();	return $sk->makeKnownLink( $wgContLang->specialPage( 'Recentchanges' ),		$title, wfArrayToCGI( $override, $options ) );}/** * Creates the options panel. * @param $defaults * @param $nondefaults */function rcOptionsPanel( $defaults, $nondefaults ) {	global $wgLang, $wgUseRCPatrol;	$options = $nondefaults + $defaults;	if( $options['from'] )		$note = wfMsgExt( 'rcnotefrom', array( 'parseinline' ),			$wgLang->formatNum( $options['limit'] ),			$wgLang->timeanddate( $options['from'], true ) );	else		$note = wfMsgExt( 'rcnote', array( 'parseinline' ),			$wgLang->formatNum( $options['limit'] ),			$wgLang->formatNum( $options['days'] ),			$wgLang->timeAndDate( wfTimestampNow(), true ) );	// limit links	$options_limit = array(50, 100, 250, 500);	foreach( $options_limit as $value ) {		$cl[] = makeOptionsLink( $wgLang->formatNum( $value ),			array( 'limit' => $value ), $nondefaults) ;	}	$cl = implode( ' | ', $cl);	// day links, reset 'from' to none	$options_days = array(1, 3, 7, 14, 30);	foreach( $options_days as $value ) {		$dl[] = makeOptionsLink( $wgLang->formatNum( $value ),			array( 'days' => $value, 'from' => ''  ), $nondefaults) ;	}	$dl = implode( ' | ', $dl);	// show/hide links	$showhide = array( wfMsg( 'show' ), wfMsg( 'hide' ));	$minorLink = makeOptionsLink( $showhide[1-$options['hideminor']],		array( 'hideminor' => 1-$options['hideminor'] ), $nondefaults);	$botLink = makeOptionsLink( $showhide[1-$options['hidebots']],		array( 'hidebots' => 1-$options['hidebots'] ), $nondefaults);	$anonsLink = makeOptionsLink( $showhide[ 1 - $options['hideanons'] ],		array( 'hideanons' => 1 - $options['hideanons'] ), $nondefaults );	$liuLink   = makeOptionsLink( $showhide[1-$options['hideliu']],		array( 'hideliu' => 1-$options['hideliu'] ), $nondefaults);	$patrLink  = makeOptionsLink( $showhide[1-$options['hidepatrolled']],		array( 'hidepatrolled' => 1-$options['hidepatrolled'] ), $nondefaults);	$myselfLink = makeOptionsLink( $showhide[1-$options['hidemyself']],		array( 'hidemyself' => 1-$options['hidemyself'] ), $nondefaults);			$links[] = wfMsgHtml( 'rcshowhideminor', $minorLink );	$links[] = wfMsgHtml( 'rcshowhidebots', $botLink );	$links[] = wfMsgHtml( 'rcshowhideanons', $anonsLink );	$links[] = wfMsgHtml( 'rcshowhideliu', $liuLink );	if( $wgUseRCPatrol )		$links[] = wfMsgHtml( 'rcshowhidepatr', $patrLink );	$links[] = wfMsgHtml( 'rcshowhidemine', $myselfLink );	$hl = implode( ' | ', $links );			// show from this onward link	$now = $wgLang->timeanddate( wfTimestampNow(), true );	$tl =  makeOptionsLink( $now, array( 'from' => wfTimestampNow()), $nondefaults );	$rclinks = wfMsgExt( 'rclinks', array( 'parseinline', 'replaceafter'),		$cl, $dl, $hl );	$rclistfrom = wfMsgExt( 'rclistfrom', array( 'parseinline', 'replaceafter'), $tl );	return "$note<br />$rclinks<br />$rclistfrom";}/** * Creates the choose namespace selection * * @private * * @param $namespace Mixed: the key of the currently selected namespace, empty string *              if there is none * @param $invert Bool: whether to invert the namespace selection * @param $nondefaults Array: an array of non default options to be remembered * @param $categories_any Bool: Default value for the checkbox * * @return string */function rcNamespaceForm( $namespace, $invert, $nondefaults, $categories_any ) {	global $wgScript, $wgAllowCategorizedRecentChanges, $wgRequest;	$t = Title::makeTitle( NS_SPECIAL, 'Recentchanges' );	$namespaceselect = HTMLnamespaceselector($namespace, '');	$submitbutton = '<input type="submit" value="' . wfMsgHtml( 'allpagessubmit' ) . "\" />\n";	$invertbox = "<input type='checkbox' name='invert' value='1' id='nsinvert'" . ( $invert ? ' checked="checked"' : '' ) . ' />';		if ( $wgAllowCategorizedRecentChanges ) {		$categories = trim ( $wgRequest->getVal ( 'categories' , "" ) ) ;		$cb_arr = array( 'type' => 'checkbox', 'name' => 'categories_any', 'value' => "1" ) ;		if ( $categories_any ) $cb_arr['checked'] = "checked" ;		$catbox = "<br />" ;		$catbox .= wfMsgExt('rc_categories', array('parseinline')) . " ";		$catbox .= wfElement('input', array( 'type' => 'text', 'name' => 'categories', 'value' => $categories));		$catbox .= " &nbsp;" ;		$catbox .= wfElement('input', $cb_arr );		$catbox .= wfMsgExt('rc_categories_any', array('parseinline'));	} else {		$catbox = "" ;	}		$out = "<div class='namespacesettings'><form method='get' action='{$wgScript}'>\n";	foreach ( $nondefaults as $key => $value ) {		if ($key != 'namespace' && $key != 'invert')			$out .= wfElement('input', array( 'type' => 'hidden', 'name' => $key, 'value' => $value));	}	$out .= '<input type="hidden" name="title" value="'.$t->getPrefixedText().'" />';	$out .= "<div id='nsselect' class='recentchanges'>	<label for='namespace'>" . wfMsgHtml('namespace') . "</label>	{$namespaceselect}{$submitbutton}{$invertbox} <label for='nsinvert'>" . wfMsgHtml('invert') . "</label>{$catbox}\n</div>";	$out .= '</form></div>';	return $out;}/** * Format a diff for the newsfeed */function rcFormatDiff( $row ) {	$titleObj = Title::makeTitle( $row->rc_namespace, $row->rc_title );	return rcFormatDiffRow( $titleObj,		$row->rc_last_oldid, $row->rc_this_oldid,		$row->rc_timestamp,		$row->rc_comment );}function rcFormatDiffRow( $title, $oldid, $newid, $timestamp, $comment ) {	global $wgFeedDiffCutoff, $wgContLang, $wgUser;	$fname = 'rcFormatDiff';	wfProfileIn( $fname );	require_once( 'DifferenceEngine.php' );	$skin = $wgUser->getSkin();	$completeText = '<p>' . $skin->formatComment( $comment ) . "</p>\n";	if( $title->getNamespace() >= 0 ) {		if( $oldid ) {			wfProfileIn( "$fname-dodiff" );			$de = new DifferenceEngine( $title, $oldid, $newid );			#$diffText = $de->getDiff( wfMsg( 'revisionasof',			#	$wgContLang->timeanddate( $timestamp ) ),			#	wfMsg( 'currentrev' ) );			$diffText = $de->getDiff(				wfMsg( 'previousrevision' ), // hack				wfMsg( 'revisionasof',					$wgContLang->timeanddate( $timestamp ) ) );							if ( strlen( $diffText ) > $wgFeedDiffCutoff ) {				// Omit large diffs				$diffLink = $title->escapeFullUrl(					'diff=' . $newid .					'&oldid=' . $oldid );				$diffText = '<a href="' .					$diffLink .					'">' .					htmlspecialchars( wfMsgForContent( 'difference' ) ) .					'</a>';			} elseif ( $diffText === false ) {				// Error in diff engine, probably a missing revision				$diffText = "<p>Can't load revision $newid</p>";			} else {				// Diff output fine, clean up any illegal UTF-8				$diffText = UtfNormal::cleanUp( $diffText );				$diffText = rcApplyDiffStyle( $diffText );			}			wfProfileOut( "$fname-dodiff" );		} else {			$rev = Revision::newFromId( $newid );			if( is_null( $rev ) ) {				$newtext = '';			} else {				$newtext = $rev->getText();			}			$diffText = '<p><b>' . wfMsg( 'newpage' ) . '</b></p>' .				'<div>' . nl2br( htmlspecialchars( $newtext ) ) . '</div>';		}		$completeText .= $diffText;	}	wfProfileOut( $fname );	return $completeText;}/** * Hacky application of diff styles for the feeds. * Might be 'cleaner' to use DOM or XSLT or something, * but *gack* it's a pain in the ass. * * @param $text String: * @return string * @private */function rcApplyDiffStyle( $text ) {	$styles = array(		'diff'             => 'background-color: white;',		'diff-otitle'      => 'background-color: white;',		'diff-ntitle'      => 'background-color: white;',		'diff-addedline'   => 'background: #cfc; font-size: smaller;',		'diff-deletedline' => 'background: #ffa; font-size: smaller;',		'diff-context'     => 'background: #eee; font-size: smaller;',		'diffchange'       => 'color: red; font-weight: bold;',	);		foreach( $styles as $class => $style ) {		$text = preg_replace( "/(<[^>]+)class=(['\"])$class\\2([^>]*>)/",			"\\1style=\"$style\"\\3", $text );	}		return $text;}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?