MediaWiki REL1_34
ChangesList.php
Go to the documentation of this file.
1<?php
28
30 const CSS_CLASS_PREFIX = 'mw-changeslist-';
31
35 public $skin;
36
37 protected $watchlist = false;
38 protected $lastdate;
39 protected $message;
40 protected $rc_cache;
41 protected $rcCacheIndex;
42 protected $rclistOpen;
43 protected $rcMoveIndex;
44
47
49 protected $watchMsgCache;
50
54 protected $linkRenderer;
55
59 protected $filterGroups;
60
65 public function __construct( $obj, array $filterGroups = [] ) {
66 if ( $obj instanceof IContextSource ) {
67 $this->setContext( $obj );
68 $this->skin = $obj->getSkin();
69 } else {
70 $this->setContext( $obj->getContext() );
71 $this->skin = $obj;
72 }
73 $this->preCacheMessages();
74 $this->watchMsgCache = new MapCacheLRU( 50 );
75 $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
76 $this->filterGroups = $filterGroups;
77 }
78
87 public static function newFromContext( IContextSource $context, array $groups = [] ) {
88 $user = $context->getUser();
89 $sk = $context->getSkin();
90 $list = null;
91 if ( Hooks::run( 'FetchChangesList', [ $user, &$sk, &$list, $groups ] ) ) {
92 $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
93
94 return $new ?
95 new EnhancedChangesList( $context, $groups ) :
96 new OldChangesList( $context, $groups );
97 } else {
98 return $list;
99 }
100 }
101
113 public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
114 throw new RuntimeException( 'recentChangesLine should be implemented' );
115 }
116
123 protected function getHighlightsContainerDiv() {
124 $highlightColorDivs = '';
125 foreach ( [ 'none', 'c1', 'c2', 'c3', 'c4', 'c5' ] as $color ) {
126 $highlightColorDivs .= Html::rawElement(
127 'div',
128 [
129 'class' => 'mw-rcfilters-ui-highlights-color-' . $color,
130 'data-color' => $color
131 ]
132 );
133 }
134
135 return Html::rawElement(
136 'div',
137 [ 'class' => 'mw-rcfilters-ui-highlights' ],
138 $highlightColorDivs
139 );
140 }
141
146 public function setWatchlistDivs( $value = true ) {
147 $this->watchlist = $value;
148 }
149
154 public function isWatchlist() {
155 return (bool)$this->watchlist;
156 }
157
162 private function preCacheMessages() {
163 if ( !isset( $this->message ) ) {
164 $this->message = [];
165 foreach ( [
166 'cur', 'diff', 'hist', 'enhancedrc-history', 'last', 'blocklink', 'history',
167 'semicolon-separator', 'pipe-separator' ] as $msg
168 ) {
169 $this->message[$msg] = $this->msg( $msg )->escaped();
170 }
171 }
172 }
173
180 public function recentChangesFlags( $flags, $nothing = "\u{00A0}" ) {
181 $f = '';
182 foreach ( array_keys( $this->getConfig()->get( 'RecentChangesFlags' ) ) as $flag ) {
183 $f .= isset( $flags[$flag] ) && $flags[$flag]
184 ? self::flag( $flag, $this->getContext() )
185 : $nothing;
186 }
187
188 return $f;
189 }
190
199 protected function getHTMLClasses( $rc, $watched ) {
200 $classes = [ self::CSS_CLASS_PREFIX . 'line' ];
201 $logType = $rc->mAttribs['rc_log_type'];
202
203 if ( $logType ) {
204 $classes[] = self::CSS_CLASS_PREFIX . 'log';
205 $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'log-' . $logType );
206 } else {
207 $classes[] = self::CSS_CLASS_PREFIX . 'edit';
208 $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns' .
209 $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
210 }
211
212 // Indicate watched status on the line to allow for more
213 // comprehensive styling.
214 $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
215 ? self::CSS_CLASS_PREFIX . 'line-watched'
216 : self::CSS_CLASS_PREFIX . 'line-not-watched';
217
218 $classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rc ) );
219
220 return $classes;
221 }
222
230 protected function getHTMLClassesForFilters( $rc ) {
231 $classes = [];
232
233 $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns-' .
234 $rc->mAttribs['rc_namespace'] );
235
236 $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
237 $classes[] = Sanitizer::escapeClass(
238 self::CSS_CLASS_PREFIX .
239 'ns-' .
240 ( $nsInfo->isTalk( $rc->mAttribs['rc_namespace'] ) ? 'talk' : 'subject' )
241 );
242
243 if ( $this->filterGroups !== null ) {
244 foreach ( $this->filterGroups as $filterGroup ) {
245 foreach ( $filterGroup->getFilters() as $filter ) {
246 $filter->applyCssClassIfNeeded( $this, $rc, $classes );
247 }
248 }
249 }
250
251 return $classes;
252 }
253
262 public static function flag( $flag, IContextSource $context = null ) {
263 static $map = [ 'minoredit' => 'minor', 'botedit' => 'bot' ];
264 static $flagInfos = null;
265
266 if ( is_null( $flagInfos ) ) {
268 $flagInfos = [];
269 foreach ( $wgRecentChangesFlags as $key => $value ) {
270 $flagInfos[$key]['letter'] = $value['letter'];
271 $flagInfos[$key]['title'] = $value['title'];
272 // Allow customized class name, fall back to flag name
273 $flagInfos[$key]['class'] = $value['class'] ?? $key;
274 }
275 }
276
277 $context = $context ?: RequestContext::getMain();
278
279 // Inconsistent naming, kepted for b/c
280 if ( isset( $map[$flag] ) ) {
281 $flag = $map[$flag];
282 }
283
284 $info = $flagInfos[$flag];
285 return Html::element( 'abbr', [
286 'class' => $info['class'],
287 'title' => wfMessage( $info['title'] )->setContext( $context )->text(),
288 ], wfMessage( $info['letter'] )->setContext( $context )->text() );
289 }
290
295 public function beginRecentChangesList() {
296 $this->rc_cache = [];
297 $this->rcMoveIndex = 0;
298 $this->rcCacheIndex = 0;
299 $this->lastdate = '';
300 $this->rclistOpen = false;
301 $this->getOutput()->addModuleStyles( [
302 'mediawiki.interface.helpers.styles',
303 'mediawiki.special.changeslist'
304 ] );
305
306 return '<div class="mw-changeslist">';
307 }
308
312 public function initChangesListRows( $rows ) {
313 Hooks::run( 'ChangesListInitRows', [ $this, $rows ] );
314 }
315
326 public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
327 if ( !$context ) {
328 $context = RequestContext::getMain();
329 }
330
331 $new = (int)$new;
332 $old = (int)$old;
333 $szdiff = $new - $old;
334
336 $config = $context->getConfig();
337 $code = $lang->getCode();
338 static $fastCharDiff = [];
339 if ( !isset( $fastCharDiff[$code] ) ) {
340 $fastCharDiff[$code] = $config->get( 'MiserMode' )
341 || $context->msg( 'rc-change-size' )->plain() === '$1';
342 }
343
344 $formattedSize = $lang->formatNum( $szdiff );
345
346 if ( !$fastCharDiff[$code] ) {
347 $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
348 }
349
350 if ( abs( $szdiff ) > abs( $config->get( 'RCChangedSizeThreshold' ) ) ) {
351 $tag = 'strong';
352 } else {
353 $tag = 'span';
354 }
355
356 if ( $szdiff === 0 ) {
357 $formattedSizeClass = 'mw-plusminus-null';
358 } elseif ( $szdiff > 0 ) {
359 $formattedSize = '+' . $formattedSize;
360 $formattedSizeClass = 'mw-plusminus-pos';
361 } else {
362 $formattedSizeClass = 'mw-plusminus-neg';
363 }
364 $formattedSizeClass .= ' mw-diff-bytes';
365
366 $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
367
368 return Html::element( $tag,
369 [ 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ],
370 $formattedSize ) . $lang->getDirMark();
371 }
372
380 public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
381 $oldlen = $old->mAttribs['rc_old_len'];
382
383 if ( $new ) {
384 $newlen = $new->mAttribs['rc_new_len'];
385 } else {
386 $newlen = $old->mAttribs['rc_new_len'];
387 }
388
389 if ( $oldlen === null || $newlen === null ) {
390 return '';
391 }
392
393 return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
394 }
395
400 public function endRecentChangesList() {
401 $out = $this->rclistOpen ? "</ul>\n" : '';
402 $out .= '</div>';
403
404 return $out;
405 }
406
418 public static function revDateLink( Revision $rev, User $user, Language $lang, $title = null ) {
419 $ts = $rev->getTimestamp();
420 $date = $lang->userTimeAndDate( $ts, $user );
421 if ( $rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
422 $link = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
423 $title ?? $rev->getTitle(),
424 $date,
425 [ 'class' => 'mw-changeslist-date' ],
426 [ 'oldid' => $rev->getId() ]
427 );
428 } else {
429 $link = htmlspecialchars( $date );
430 }
431 if ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
432 $link = "<span class=\"history-deleted mw-changeslist-date\">$link</span>";
433 }
434 return $link;
435 }
436
441 public function insertDateHeader( &$s, $rc_timestamp ) {
442 # Make date header if necessary
443 $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
444 if ( $date != $this->lastdate ) {
445 if ( $this->lastdate != '' ) {
446 $s .= "</ul>\n";
447 }
448 $s .= Xml::element( 'h4', null, $date ) . "\n<ul class=\"special\">";
449 $this->lastdate = $date;
450 $this->rclistOpen = true;
451 }
452 }
453
460 public function insertLog( &$s, $title, $logtype, $useParentheses = true ) {
461 $page = new LogPage( $logtype );
462 $logname = $page->getName()->setContext( $this->getContext() )->text();
463 $link = $this->linkRenderer->makeKnownLink( $title, $logname, [
464 'class' => $useParentheses ? '' : 'mw-changeslist-links'
465 ] );
466 if ( $useParentheses ) {
467 $s .= $this->msg( 'parentheses' )->rawParams(
468 $link
469 )->escaped();
470 } else {
471 $s .= $link;
472 }
473 }
474
480 public function insertDiffHist( &$s, &$rc, $unpatrolled = null ) {
481 # Diff link
482 if (
483 $rc->mAttribs['rc_type'] == RC_NEW ||
484 $rc->mAttribs['rc_type'] == RC_LOG ||
485 $rc->mAttribs['rc_type'] == RC_CATEGORIZE
486 ) {
487 $diffLink = $this->message['diff'];
488 } elseif ( !self::userCan( $rc, RevisionRecord::DELETED_TEXT, $this->getUser() ) ) {
489 $diffLink = $this->message['diff'];
490 } else {
491 $query = [
492 'curid' => $rc->mAttribs['rc_cur_id'],
493 'diff' => $rc->mAttribs['rc_this_oldid'],
494 'oldid' => $rc->mAttribs['rc_last_oldid']
495 ];
496
497 $diffLink = $this->linkRenderer->makeKnownLink(
498 $rc->getTitle(),
499 new HtmlArmor( $this->message['diff'] ),
500 [ 'class' => 'mw-changeslist-diff' ],
501 $query
502 );
503 }
504 if ( $rc->mAttribs['rc_type'] == RC_CATEGORIZE ) {
505 $histLink = $this->message['hist'];
506 } else {
507 $histLink = $this->linkRenderer->makeKnownLink(
508 $rc->getTitle(),
509 new HtmlArmor( $this->message['hist'] ),
510 [ 'class' => 'mw-changeslist-history' ],
511 [
512 'curid' => $rc->mAttribs['rc_cur_id'],
513 'action' => 'history'
514 ]
515 );
516 }
517
518 $s .= Html::rawElement( 'div', [ 'class' => 'mw-changeslist-links' ],
519 Html::rawElement( 'span', [], $diffLink ) .
520 Html::rawElement( 'span', [], $histLink )
521 ) .
522 ' <span class="mw-changeslist-separator"></span> ';
523 }
524
532 public function getArticleLink( &$rc, $unpatrolled, $watched ) {
533 $params = [];
534 if ( $rc->getTitle()->isRedirect() ) {
535 $params = [ 'redirect' => 'no' ];
536 }
537
538 $articlelink = $this->linkRenderer->makeLink(
539 $rc->getTitle(),
540 null,
541 [ 'class' => 'mw-changeslist-title' ],
542 $params
543 );
544 if ( $this->isDeleted( $rc, RevisionRecord::DELETED_TEXT ) ) {
545 $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
546 }
547 # To allow for boldening pages watched by this user
548 $articlelink = "<span class=\"mw-title\">{$articlelink}</span>";
549 # RTL/LTR marker
550 $articlelink .= $this->getLanguage()->getDirMark();
551
552 # TODO: Deprecate the $s argument, it seems happily unused.
553 $s = '';
554 # Avoid PHP 7.1 warning from passing $this by reference
555 $changesList = $this;
556 Hooks::run( 'ChangesListInsertArticleLink',
557 [ &$changesList, &$articlelink, &$s, &$rc, $unpatrolled, $watched ] );
558
559 return "{$s} {$articlelink}";
560 }
561
570 public function getTimestamp( $rc ) {
571 // @todo FIXME: Hard coded ". .". Is there a message for this? Should there be?
572 return $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
573 htmlspecialchars( $this->getLanguage()->userTime(
574 $rc->mAttribs['rc_timestamp'],
575 $this->getUser()
576 ) ) . '</span> <span class="mw-changeslist-separator"></span> ';
577 }
578
585 public function insertTimestamp( &$s, $rc ) {
586 $s .= $this->getTimestamp( $rc );
587 }
588
595 public function insertUserRelatedLinks( &$s, &$rc ) {
596 if ( $this->isDeleted( $rc, RevisionRecord::DELETED_USER ) ) {
597 $s .= ' <span class="history-deleted">' .
598 $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
599 } else {
600 $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
601 $rc->mAttribs['rc_user_text'] );
603 $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'],
604 false, 0, null,
605 // The text content of tools is not wrapped with parenthesises or "piped".
606 // This will be handled in CSS (T205581).
607 false
608 );
609 }
610 }
611
618 public function insertLogEntry( $rc ) {
619 $formatter = LogFormatter::newFromRow( $rc->mAttribs );
620 $formatter->setContext( $this->getContext() );
621 $formatter->setShowUserToolLinks( true );
622 $mark = $this->getLanguage()->getDirMark();
623
624 return Html::openElement( 'span', [ 'class' => 'mw-changeslist-log-entry' ] )
625 . $formatter->getActionText() . " $mark" . $formatter->getComment()
626 . Html::closeElement( 'span' );
627 }
628
634 public function insertComment( $rc ) {
635 if ( $this->isDeleted( $rc, RevisionRecord::DELETED_COMMENT ) ) {
636 return ' <span class="history-deleted comment">' .
637 $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
638 } else {
639 return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle(),
640 // Whether section links should refer to local page (using default false)
641 false,
642 // wikid to generate links for (using default null) */
643 null,
644 // whether parentheses should be rendered as part of the message
645 false );
646 }
647 }
648
654 protected function numberofWatchingusers( $count ) {
655 if ( $count <= 0 ) {
656 return '';
657 }
658
659 return $this->watchMsgCache->getWithSetCallback(
660 "watching-users-msg:$count",
661 function () use ( $count ) {
662 return $this->msg( 'number-of-watching-users-for-recent-changes' )
663 ->numParams( $count )->escaped();
664 }
665 );
666 }
667
674 public static function isDeleted( $rc, $field ) {
675 return ( $rc->mAttribs['rc_deleted'] & $field ) == $field;
676 }
677
687 public static function userCan( $rc, $field, User $user = null ) {
688 if ( $user === null ) {
689 $user = RequestContext::getMain()->getUser();
690 }
691
692 if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
693 return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
694 }
695
696 return RevisionRecord::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
697 }
698
704 protected function maybeWatchedLink( $link, $watched = false ) {
705 if ( $watched ) {
706 return '<strong class="mw-watched">' . $link . '</strong>';
707 } else {
708 return '<span class="mw-rc-unwatched">' . $link . '</span>';
709 }
710 }
711
718 public function insertRollback( &$s, &$rc ) {
719 if ( $rc->mAttribs['rc_type'] == RC_EDIT
720 && $rc->mAttribs['rc_this_oldid']
721 && $rc->mAttribs['rc_cur_id']
722 && $rc->getAttribute( 'page_latest' ) == $rc->mAttribs['rc_this_oldid']
723 ) {
724 $title = $rc->getTitle();
728 if ( MediaWikiServices::getInstance()->getPermissionManager()
729 ->quickUserCan( 'rollback', $this->getUser(), $title )
730 ) {
731 $rev = new Revision( [
732 'title' => $title,
733 'id' => $rc->mAttribs['rc_this_oldid'],
734 'user' => $rc->mAttribs['rc_user'],
735 'user_text' => $rc->mAttribs['rc_user_text'],
736 'actor' => $rc->mAttribs['rc_actor'] ?? null,
737 'deleted' => $rc->mAttribs['rc_deleted']
738 ] );
739 $s .= ' ' . Linker::generateRollback( $rev, $this->getContext(),
740 [ 'noBrackets' ] );
741 }
742 }
743 }
744
750 public function getRollback( RecentChange $rc ) {
751 $s = '';
752 $this->insertRollback( $s, $rc );
753 return $s;
754 }
755
761 public function insertTags( &$s, &$rc, &$classes ) {
762 if ( empty( $rc->mAttribs['ts_tags'] ) ) {
763 return;
764 }
765
766 list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow(
767 $rc->mAttribs['ts_tags'],
768 'changeslist',
769 $this->getContext()
770 );
771 $classes = array_merge( $classes, $newClasses );
772 $s .= ' ' . $tagSummary;
773 }
774
781 public function getTags( RecentChange $rc, array &$classes ) {
782 $s = '';
783 $this->insertTags( $s, $rc, $classes );
784 return $s;
785 }
786
787 public function insertExtra( &$s, &$rc, &$classes ) {
788 // Empty, used for subclasses to add anything special.
789 }
790
791 protected function showAsUnpatrolled( RecentChange $rc ) {
792 return self::isUnpatrolled( $rc, $this->getUser() );
793 }
794
800 public static function isUnpatrolled( $rc, User $user ) {
801 if ( $rc instanceof RecentChange ) {
802 $isPatrolled = $rc->mAttribs['rc_patrolled'];
803 $rcType = $rc->mAttribs['rc_type'];
804 $rcLogType = $rc->mAttribs['rc_log_type'];
805 } else {
806 $isPatrolled = $rc->rc_patrolled;
807 $rcType = $rc->rc_type;
808 $rcLogType = $rc->rc_log_type;
809 }
810
811 if ( !$isPatrolled ) {
812 if ( $user->useRCPatrol() ) {
813 return true;
814 }
815 if ( $user->useNPPatrol() && $rcType == RC_NEW ) {
816 return true;
817 }
818 if ( $user->useFilePatrol() && $rcLogType == 'upload' ) {
819 return true;
820 }
821 }
822
823 return false;
824 }
825
835 protected function isCategorizationWithoutRevision( $rcObj ) {
836 return intval( $rcObj->getAttribute( 'rc_type' ) ) === RC_CATEGORIZE
837 && intval( $rcObj->getAttribute( 'rc_this_oldid' ) ) === 0;
838 }
839
845 protected function getDataAttributes( RecentChange $rc ) {
846 $attrs = [];
847
848 $type = $rc->getAttribute( 'rc_source' );
849 switch ( $type ) {
850 case RecentChange::SRC_EDIT:
851 case RecentChange::SRC_NEW:
852 $attrs['data-mw-revid'] = $rc->mAttribs['rc_this_oldid'];
853 break;
854 case RecentChange::SRC_LOG:
855 $attrs['data-mw-logid'] = $rc->mAttribs['rc_logid'];
856 $attrs['data-mw-logaction'] =
857 $rc->mAttribs['rc_log_type'] . '/' . $rc->mAttribs['rc_log_action'];
858 break;
859 }
860
861 $attrs[ 'data-mw-ts' ] = $rc->getAttribute( 'rc_timestamp' );
862
863 return $attrs;
864 }
865
873 public function setChangeLinePrefixer( callable $prefixer ) {
874 $this->changeLinePrefixer = $prefixer;
875 }
876}
getPermissionManager()
$wgRecentChangesFlags
Flags (letter symbols) shown in recent changes and watchlist to indicate certain types of edits.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
static formatSummaryRow( $tags, $page, IContextSource $context=null)
Creates HTML for the given tags.
static newFromContext(IContextSource $context, array $groups=[])
Fetch an appropriate changes list class for the specified context Some users might want to use an enh...
maybeWatchedLink( $link, $watched=false)
static userCan( $rc, $field, User $user=null)
Determine if the current user is allowed to view a particular field of this revision,...
setWatchlistDivs( $value=true)
Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag.
formatCharacterDifference(RecentChange $old, RecentChange $new=null)
Format the character difference of one or several changes.
insertDateHeader(&$s, $rc_timestamp)
insertRollback(&$s, &$rc)
Insert a rollback link.
showAsUnpatrolled(RecentChange $rc)
static isUnpatrolled( $rc, User $user)
array $filterGroups
getHighlightsContainerDiv()
Get the container for highlights that are used in the new StructuredFilters system.
recentChangesLine(&$rc, $watched=false, $linenumber=null)
Format a line.
recentChangesFlags( $flags, $nothing="\u{00A0}")
Returns the appropriate flags for new page, minor change and patrolling.
getDataAttributes(RecentChange $rc)
Get recommended data attributes for a change line.
numberofWatchingusers( $count)
Returns the string which indicates the number of watching users.
getHTMLClasses( $rc, $watched)
Get an array of default HTML class attributes for the change.
callable $changeLinePrefixer
getTags(RecentChange $rc, array &$classes)
getArticleLink(&$rc, $unpatrolled, $watched)
insertUserRelatedLinks(&$s, &$rc)
Insert links to user page, user talk page and eventually a blocking link.
static showCharacterDifference( $old, $new, IContextSource $context=null)
Show formatted char difference.
getRollback(RecentChange $rc)
MapCacheLRU $watchMsgCache
endRecentChangesList()
Returns text for the end of RC.
static flag( $flag, IContextSource $context=null)
Make an "<abbr>" element for a given change flag.
LinkRenderer $linkRenderer
preCacheMessages()
As we use the same small set of messages in various methods and that they are called often,...
insertLogEntry( $rc)
Insert a formatted action.
setChangeLinePrefixer(callable $prefixer)
Sets the callable that generates a change line prefix added to the beginning of each line.
static isDeleted( $rc, $field)
Determine if said field of a revision is hidden.
const CSS_CLASS_PREFIX
static revDateLink(Revision $rev, User $user, Language $lang, $title=null)
Render the date and time of a revision in the current user language based on whether the user is able...
insertLog(&$s, $title, $logtype, $useParentheses=true)
insertTags(&$s, &$rc, &$classes)
insertComment( $rc)
Insert a formatted comment.
insertExtra(&$s, &$rc, &$classes)
__construct( $obj, array $filterGroups=[])
initChangesListRows( $rows)
getTimestamp( $rc)
Get the timestamp from $rc formatted with current user's settings and a separator.
isCategorizationWithoutRevision( $rcObj)
Determines whether a revision is linked to this change; this may not be the case when the categorizat...
getHTMLClassesForFilters( $rc)
Get an array of CSS classes attributed to filters for this row.
insertDiffHist(&$s, &$rc, $unpatrolled=null)
insertTimestamp(&$s, $rc)
Insert time timestamp string from $rc into $s.
beginRecentChangesList()
Returns text for the start of the tabular part of RC.
The simplest way of implementing IContextSource is to hold a RequestContext as a member variable and ...
msg( $key,... $params)
Get a Message object with context set Parameters are the same as wfMessage()
IContextSource $context
getContext()
Get the base IContextSource object.
setContext(IContextSource $context)
Marks HTML that shouldn't be escaped.
Definition HtmlArmor.php:28
Internationalisation code.
Definition Language.php:37
static generateRollback( $rev, IContextSource $context=null, $options=[ 'verify'])
Generate a rollback link for a given revision.
Definition Linker.php:1811
static userLink( $userId, $userName, $altUserName=false)
Make user link (or user contributions for unregistered users)
Definition Linker.php:898
static commentBlock( $comment, $title=null, $local=false, $wikiId=null, $useParentheses=true)
Wrap a comment in standard punctuation and formatting if it's non-empty, otherwise return empty strin...
Definition Linker.php:1547
static userToolLinks( $userId, $userText, $redContribsWhenNoEdits=false, $flags=0, $edits=null, $useParentheses=true)
Generate standard user tool links (talk, contributions, block link, etc.)
Definition Linker.php:943
static userCanBitfield( $bitfield, $field, User $user=null)
Determine if the current user is allowed to view a particular field of this log row,...
static newFromRow( $row)
Handy shortcut for constructing a formatter directly from database row.
Class to simplify the use of log pages.
Definition LogPage.php:33
Handles a simple LRU key/value map with a maximum number of entries.
Class that generates HTML links for pages.
MediaWikiServices is the service locator for the application scope of MediaWiki.
Page revision base class.
Utility class for creating new RC entries.
getAttribute( $name)
Get an attribute value.
getTitle()
Returns the title of the page associated with this entry.
Definition Revision.php:559
getId()
Get revision ID.
Definition Revision.php:442
getTimestamp()
Definition Revision.php:798
userCan( $field, User $user=null)
Determine if the current user is allowed to view a particular field of this revision,...
isDeleted( $field)
Definition Revision.php:692
The main skin class which provides methods and properties for all other skins.
Definition Skin.php:38
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition User.php:51
useFilePatrol()
Check whether to enable new files patrol features for this user.
Definition User.php:3724
useNPPatrol()
Check whether to enable new pages patrol features for this user.
Definition User.php:3712
useRCPatrol()
Check whether to enable recent changes patrol features for this user.
Definition User.php:3703
const RC_NEW
Definition Defines.php:132
const RC_LOG
Definition Defines.php:133
const RC_EDIT
Definition Defines.php:131
const RC_CATEGORIZE
Definition Defines.php:135
Interface for objects which can provide a MediaWiki context on request.
getConfig()
Get the site configuration.
msg( $key,... $params)
This is the method for getting translated interface messages.
Result wrapper for grabbing data queried from an IDatabase object.
$filter
if(!isset( $args[0])) $lang