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 .= " " ; $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 + -
显示快捷键?