MediaWiki  master
LogFormatter.php
Go to the documentation of this file.
1 <?php
34 
47 class LogFormatter {
48  // Audience options for viewing usernames, comments, and actions
49  public const FOR_PUBLIC = 1;
50  public const FOR_THIS_USER = 2;
51 
52  // Static->
53 
59  public static function newFromEntry( LogEntry $entry ) {
60  $logActionsHandlers = MediaWikiServices::getInstance()->getMainConfig()
61  ->get( MainConfigNames::LogActionsHandlers );
62  $fulltype = $entry->getFullType();
63  $wildcard = $entry->getType() . '/*';
64  $handler = $logActionsHandlers[$fulltype] ?? $logActionsHandlers[$wildcard] ?? '';
65 
66  if ( $handler !== '' && is_string( $handler ) && class_exists( $handler ) ) {
67  return new $handler( $entry );
68  }
69 
70  return new LegacyLogFormatter( $entry );
71  }
72 
80  public static function newFromRow( $row ) {
82  }
83 
84  // Nonstatic->
85 
87  protected $entry;
88 
91 
93  public $context;
94 
96  protected $linkFlood = false;
97 
105  protected $plaintext = false;
106 
108  protected $irctext = false;
109 
113  private $linkRenderer;
114 
119  protected $parsedParameters;
120 
126  protected function __construct( LogEntry $entry ) {
127  $this->entry = $entry;
128  $this->context = RequestContext::getMain();
129  }
130 
135  public function setContext( IContextSource $context ) {
136  $this->context = $context;
137  }
138 
143  public function setLinkRenderer( LinkRenderer $linkRenderer ) {
144  $this->linkRenderer = $linkRenderer;
145  }
146 
151  public function getLinkRenderer() {
152  if ( $this->linkRenderer !== null ) {
153  return $this->linkRenderer;
154  } else {
155  return MediaWikiServices::getInstance()->getLinkRenderer();
156  }
157  }
158 
165  public function setAudience( $audience ) {
166  $this->audience = ( $audience == self::FOR_THIS_USER )
167  ? self::FOR_THIS_USER
168  : self::FOR_PUBLIC;
169  }
170 
175  public function canViewLogType() {
176  // If the user doesn't have the right permission to view the specific
177  // log type, return false
178  $logRestrictions = $this->context->getConfig()->get( MainConfigNames::LogRestrictions );
179  $type = $this->entry->getType();
180  return !isset( $logRestrictions[$type] )
181  || $this->context->getAuthority()->isAllowed( $logRestrictions[$type] );
182  }
183 
189  protected function canView( $field ) {
190  if ( $this->audience == self::FOR_THIS_USER ) {
192  $this->entry->getDeleted(), $field, $this->context->getAuthority() ) &&
194  } else {
195  return !$this->entry->isDeleted( $field ) && self::canViewLogType();
196  }
197  }
198 
205  public function setShowUserToolLinks( $value ) {
206  $this->linkFlood = $value;
207  }
208 
217  public function getPlainActionText() {
218  $this->plaintext = true;
219  $text = $this->getActionText();
220  $this->plaintext = false;
221 
222  return $text;
223  }
224 
231  public function getIRCActionComment() {
232  $actionComment = $this->getIRCActionText();
233  $comment = $this->entry->getComment();
234 
235  if ( $comment != '' ) {
236  if ( $actionComment == '' ) {
237  $actionComment = $comment;
238  } else {
239  $actionComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
240  }
241  }
242 
243  return $actionComment;
244  }
245 
253  public function getIRCActionText() {
254  $this->plaintext = true;
255  $this->irctext = true;
256 
258  $parameters = $entry->getParameters();
259  // @see LogPage::actionText()
260  // Text of title the action is aimed at.
261  $target = $entry->getTarget()->getPrefixedText();
262  $text = null;
263  $contLang = MediaWikiServices::getInstance()->getContentLanguage();
264  switch ( $entry->getType() ) {
265  case 'move':
266  switch ( $entry->getSubtype() ) {
267  case 'move':
268  $movesource = $parameters['4::target'];
269  $text = wfMessage( '1movedto2' )
270  ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
271  break;
272  case 'move_redir':
273  $movesource = $parameters['4::target'];
274  $text = wfMessage( '1movedto2_redir' )
275  ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
276  break;
277  case 'move-noredirect':
278  break;
279  case 'move_redir-noredirect':
280  break;
281  }
282  break;
283 
284  case 'delete':
285  switch ( $entry->getSubtype() ) {
286  case 'delete':
287  $text = wfMessage( 'deletedarticle' )
288  ->rawParams( $target )->inContentLanguage()->escaped();
289  break;
290  case 'restore':
291  $text = wfMessage( 'undeletedarticle' )
292  ->rawParams( $target )->inContentLanguage()->escaped();
293  break;
294  }
295  break;
296 
297  case 'patrol':
298  // https://github.com/wikimedia/mediawiki/commit/1a05f8faf78675dc85984f27f355b8825b43efff
299  // Create a diff link to the patrolled revision
300  if ( $entry->getSubtype() === 'patrol' ) {
301  $diffLink = htmlspecialchars(
302  wfMessage( 'patrol-log-diff', $parameters['4::curid'] )
303  ->inContentLanguage()->text() );
304  $text = wfMessage( 'patrol-log-line', $diffLink, "[[$target]]", "" )
305  ->inContentLanguage()->text();
306  } else {
307  // broken??
308  }
309  break;
310 
311  case 'protect':
312  switch ( $entry->getSubtype() ) {
313  case 'protect':
314  $text = wfMessage( 'protectedarticle' )
315  ->rawParams( $target . ' ' . $parameters['4::description'] )
316  ->inContentLanguage()
317  ->escaped();
318  break;
319  case 'unprotect':
320  $text = wfMessage( 'unprotectedarticle' )
321  ->rawParams( $target )->inContentLanguage()->escaped();
322  break;
323  case 'modify':
324  $text = wfMessage( 'modifiedarticleprotection' )
325  ->rawParams( $target . ' ' . $parameters['4::description'] )
326  ->inContentLanguage()
327  ->escaped();
328  break;
329  case 'move_prot':
330  $text = wfMessage( 'movedarticleprotection' )
331  ->rawParams( $target, $parameters['4::oldtitle'] )->inContentLanguage()->escaped();
332  break;
333  }
334  break;
335 
336  case 'newusers':
337  switch ( $entry->getSubtype() ) {
338  case 'newusers':
339  case 'create':
340  $text = wfMessage( 'newuserlog-create-entry' )
341  ->inContentLanguage()->escaped();
342  break;
343  case 'create2':
344  case 'byemail':
345  $text = wfMessage( 'newuserlog-create2-entry' )
346  ->rawParams( $target )->inContentLanguage()->escaped();
347  break;
348  case 'autocreate':
349  $text = wfMessage( 'newuserlog-autocreate-entry' )
350  ->inContentLanguage()->escaped();
351  break;
352  }
353  break;
354 
355  case 'upload':
356  switch ( $entry->getSubtype() ) {
357  case 'upload':
358  $text = wfMessage( 'uploadedimage' )
359  ->rawParams( $target )->inContentLanguage()->escaped();
360  break;
361  case 'overwrite':
362  case 'revert':
363  $text = wfMessage( 'overwroteimage' )
364  ->rawParams( $target )->inContentLanguage()->escaped();
365  break;
366  }
367  break;
368 
369  case 'rights':
370  if ( count( $parameters['4::oldgroups'] ) ) {
371  $oldgroups = implode( ', ', $parameters['4::oldgroups'] );
372  } else {
373  $oldgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
374  }
375  if ( count( $parameters['5::newgroups'] ) ) {
376  $newgroups = implode( ', ', $parameters['5::newgroups'] );
377  } else {
378  $newgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
379  }
380  switch ( $entry->getSubtype() ) {
381  case 'rights':
382  $text = wfMessage( 'rightslogentry' )
383  ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
384  break;
385  case 'autopromote':
386  $text = wfMessage( 'rightslogentry-autopromote' )
387  ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
388  break;
389  }
390  break;
391 
392  case 'merge':
393  $text = wfMessage( 'pagemerge-logentry' )
394  ->rawParams( $target, $parameters['4::dest'], $parameters['5::mergepoint'] )
395  ->inContentLanguage()->escaped();
396  break;
397 
398  case 'block':
399  switch ( $entry->getSubtype() ) {
400  case 'block':
401  // Keep compatibility with extensions by checking for
402  // new key (5::duration/6::flags) or old key (0/optional 1)
403  if ( $entry->isLegacy() ) {
404  $rawDuration = $parameters[0];
405  $rawFlags = $parameters[1] ?? '';
406  } else {
407  $rawDuration = $parameters['5::duration'];
408  $rawFlags = $parameters['6::flags'];
409  }
410  $duration = $contLang->translateBlockExpiry(
411  $rawDuration,
412  null,
413  (int)wfTimestamp( TS_UNIX, $entry->getTimestamp() )
414  );
415  $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $contLang );
416  $text = wfMessage( 'blocklogentry' )
417  ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
418  break;
419  case 'unblock':
420  $text = wfMessage( 'unblocklogentry' )
421  ->rawParams( $target )->inContentLanguage()->escaped();
422  break;
423  case 'reblock':
424  $duration = $contLang->translateBlockExpiry(
425  $parameters['5::duration'],
426  null,
427  (int)wfTimestamp( TS_UNIX, $entry->getTimestamp() )
428  );
429  $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'],
430  $contLang );
431  $text = wfMessage( 'reblock-logentry' )
432  ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
433  break;
434  }
435  break;
436 
437  case 'import':
438  switch ( $entry->getSubtype() ) {
439  case 'upload':
440  $text = wfMessage( 'import-logentry-upload' )
441  ->rawParams( $target )->inContentLanguage()->escaped();
442  break;
443  case 'interwiki':
444  $text = wfMessage( 'import-logentry-interwiki' )
445  ->rawParams( $target )->inContentLanguage()->escaped();
446  break;
447  }
448  break;
449  // case 'suppress' --private log -- aaron (so we know who to blame in a few years :-D)
450  // default:
451  }
452 
453  $this->plaintext = false;
454  $this->irctext = false;
455 
456  return $text ?? $this->getPlainActionText();
457  }
458 
466  public function getActionText() {
467  if ( $this->canView( LogPage::DELETED_ACTION ) ) {
468  $element = $this->getActionMessage();
469  if ( $element instanceof Message ) {
470  $element = $this->plaintext ? $element->text() : $element->escaped();
471  }
472  if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
473  $element = $this->styleRestrictedElement( $element );
474  }
475  } else {
476  $sep = $this->msg( 'word-separator' );
477  $sep = $this->plaintext ? $sep->text() : $sep->escaped();
478  $performer = $this->getPerformerElement();
479  $element = $performer . $sep . $this->getRestrictedElement( 'rev-deleted-event' );
480  }
481 
482  return $element;
483  }
484 
491  protected function getActionMessage() {
492  $message = $this->msg( $this->getMessageKey() );
493  $message->params( $this->getMessageParameters() );
494 
495  return $message;
496  }
497 
506  protected function getMessageKey() {
507  $type = $this->entry->getType();
508  $subtype = $this->entry->getSubtype();
509 
510  return "logentry-$type-$subtype";
511  }
512 
519  public function getActionLinks() {
520  return '';
521  }
522 
529  protected function extractParameters() {
531  $params = [];
532 
533  if ( $entry->isLegacy() ) {
534  foreach ( $entry->getParameters() as $index => $value ) {
535  $params[$index + 3] = $value;
536  }
537  }
538 
539  // Filter out parameters which are not in format #:foo
540  foreach ( $entry->getParameters() as $key => $value ) {
541  if ( strpos( $key, ':' ) === false ) {
542  continue;
543  }
544  [ $index, $type, ] = explode( ':', $key, 3 );
545  if ( ctype_digit( $index ) ) {
546  $params[(int)$index - 1] = $this->formatParameterValue( $type, $value );
547  }
548  }
549 
550  /* Message class doesn't like non consecutive numbering.
551  * Fill in missing indexes with empty strings to avoid
552  * incorrect renumbering.
553  */
554  if ( count( $params ) ) {
555  $max = max( array_keys( $params ) );
556  // index 0 to 2 are added in getMessageParameters
557  for ( $i = 3; $i < $max; $i++ ) {
558  if ( !isset( $params[$i] ) ) {
559  $params[$i] = '';
560  }
561  }
562  }
563 
564  return $params;
565  }
566 
577  protected function getMessageParameters() {
578  if ( isset( $this->parsedParameters ) ) {
580  }
581 
583  $params = $this->extractParameters();
584  $params[0] = Message::rawParam( $this->getPerformerElement() );
585  $params[1] = $this->canView( LogPage::DELETED_USER ) ? $entry->getPerformerIdentity()->getName() : '';
586  $params[2] = Message::rawParam( $this->makePageLink( $entry->getTarget() ) );
587 
588  // Bad things happens if the numbers are not in correct order
589  ksort( $params );
590 
591  $this->parsedParameters = $params;
593  }
594 
621  protected function formatParameterValue( $type, $value ) {
622  $saveLinkFlood = $this->linkFlood;
623 
624  switch ( strtolower( trim( $type ) ) ) {
625  case 'raw':
626  $value = Message::rawParam( $value );
627  break;
628  case 'list':
629  $value = $this->context->getLanguage()->commaList( $value );
630  break;
631  case 'msg':
632  $value = $this->msg( $value )->text();
633  break;
634  case 'msg-content':
635  $value = $this->msg( $value )->inContentLanguage()->text();
636  break;
637  case 'number':
638  $value = Message::numParam( $value );
639  break;
640  case 'user':
641  $user = User::newFromName( $value );
642  $value = $user->getName();
643  break;
644  case 'user-link':
645  $this->setShowUserToolLinks( false );
646 
647  $user = User::newFromName( $value );
648 
649  if ( !$user ) {
650  $value = $this->msg( 'empty-username' )->text();
651  } else {
652  $value = Message::rawParam( $this->makeUserLink( $user ) );
653  $this->setShowUserToolLinks( $saveLinkFlood );
654  }
655  break;
656  case 'title':
657  $title = Title::newFromText( $value );
658  $value = $title->getPrefixedText();
659  break;
660  case 'title-link':
661  $title = Title::newFromText( $value );
662  $value = Message::rawParam( $this->makePageLink( $title ) );
663  break;
664  case 'plain':
665  // Plain text, nothing to do
666  default:
667  // Catch other types and use the old behavior (return as-is)
668  }
669 
670  return $value;
671  }
672 
683  protected function makePageLink( Title $title = null, $parameters = [], $html = null ) {
684  if ( !$title instanceof Title ) {
685  $msg = $this->msg( 'invalidtitle' )->text();
686  if ( $this->plaintext ) {
687  return $msg;
688  } else {
689  return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ], $msg );
690  }
691  }
692 
693  if ( $this->plaintext ) {
694  $link = '[[' . $title->getPrefixedText() . ']]';
695  } else {
696  $html = $html !== null ? new HtmlArmor( $html ) : $html;
697  $link = $this->getLinkRenderer()->makeLink( $title, $html, [], $parameters );
698  }
699 
700  return $link;
701  }
702 
709  public function getPerformerElement() {
710  if ( $this->canView( LogPage::DELETED_USER ) ) {
711  $performerIdentity = $this->entry->getPerformerIdentity();
712  $element = $this->makeUserLink( $performerIdentity );
713  if ( $this->entry->isDeleted( LogPage::DELETED_USER ) ) {
714  $element = $this->styleRestrictedElement( $element );
715  }
716  } else {
717  $element = $this->getRestrictedElement( 'rev-deleted-user' );
718  }
719 
720  return $element;
721  }
722 
728  public function getComment() {
729  if ( $this->canView( LogPage::DELETED_COMMENT ) ) {
730  $comment = MediaWikiServices::getInstance()->getCommentFormatter()
731  ->formatBlock( $this->entry->getComment() );
732  // No hard coded spaces thanx
733  $element = ltrim( $comment );
734  if ( $this->entry->isDeleted( LogPage::DELETED_COMMENT ) ) {
735  $element = $this->styleRestrictedElement( $element );
736  }
737  } else {
738  $element = $this->getRestrictedElement( 'rev-deleted-comment' );
739  }
740 
741  return $element;
742  }
743 
750  protected function getRestrictedElement( $message ) {
751  if ( $this->plaintext ) {
752  return $this->msg( $message )->text();
753  }
754 
755  return $this->styleRestrictedElement( $this->msg( $message )->escaped() );
756  }
757 
763  protected function styleRestrictedElement( $content ) {
764  if ( $this->plaintext ) {
765  return $content;
766  }
767  $attribs = [ 'class' => [ 'history-deleted' ] ];
768  if ( $this->entry->isDeleted( LogPage::DELETED_RESTRICTED ) ) {
769  $attribs['class'][] = 'mw-history-suppressed';
770  }
771 
772  return Html::rawElement( 'span', $attribs, $content );
773  }
774 
781  protected function msg( $key, ...$params ) {
782  return $this->context->msg( $key, ...$params );
783  }
784 
791  protected function makeUserLink( UserIdentity $user, $toolFlags = 0 ) {
792  if ( $this->plaintext ) {
793  $element = $user->getName();
794  } else {
795  $element = Linker::userLink(
796  $user->getId(),
797  $user->getName()
798  );
799  if ( $this->linkFlood ) {
800  $editCount = $user->isRegistered()
801  ? MediaWikiServices::getInstance()->getUserEditTracker()->getUserEditCount( $user )
802  : null;
803 
804  $element .= Linker::userToolLinks(
805  $user->getId(),
806  $user->getName(),
807  true, // redContribsWhenNoEdits
808  $toolFlags,
809  $editCount,
810  // do not render parentheses in the HTML markup (CSS will provide)
811  false
812  );
813  }
814  }
815 
816  return $element;
817  }
818 
823  public function getPreloadTitles() {
824  return [];
825  }
826 
830  public function getMessageParametersForTesting() {
831  // This function was added because getMessageParameters() is
832  // protected and a change from protected to public caused
833  // problems with extensions
834  return $this->getMessageParameters();
835  }
836 
843  protected function getParametersForApi() {
844  return $this->entry->getParameters();
845  }
846 
862  public function formatParametersForApi() {
863  $logParams = [];
864  foreach ( $this->getParametersForApi() as $key => $value ) {
865  $vals = explode( ':', $key, 3 );
866  if ( count( $vals ) !== 3 ) {
867  if ( $value instanceof __PHP_Incomplete_Class ) {
868  wfLogWarning( 'Log entry of type ' . $this->entry->getFullType() .
869  ' contains unrecoverable extra parameters.' );
870  continue;
871  }
872  $logParams[$key] = $value;
873  continue;
874  }
875  $logParams += $this->formatParameterValueForApi( $vals[2], $vals[1], $value );
876  }
877  ApiResult::setIndexedTagName( $logParams, 'param' );
878  ApiResult::setArrayType( $logParams, 'assoc' );
879 
880  return $logParams;
881  }
882 
892  protected function formatParameterValueForApi( $name, $type, $value ) {
893  $type = strtolower( trim( $type ) );
894  switch ( $type ) {
895  case 'bool':
896  $value = (bool)$value;
897  break;
898 
899  case 'number':
900  if ( is_int( $value ) || ctype_digit( (string)$value ) ) {
901  $value = (int)$value;
902  } else {
903  $value = (float)$value;
904  }
905  break;
906 
907  case 'array':
908  case 'assoc':
909  case 'kvp':
910  if ( is_array( $value ) ) {
911  ApiResult::setArrayType( $value, $type );
912  }
913  break;
914 
915  case 'timestamp':
916  $value = wfTimestamp( TS_ISO_8601, $value );
917  break;
918 
919  case 'msg':
920  case 'msg-content':
921  $msg = $this->msg( $value );
922  if ( $type === 'msg-content' ) {
923  $msg->inContentLanguage();
924  }
925  $value = [];
926  $value["{$name}_key"] = $msg->getKey();
927  if ( $msg->getParams() ) {
928  $value["{$name}_params"] = $msg->getParams();
929  }
930  $value["{$name}_text"] = $msg->text();
931  return $value;
932 
933  case 'title':
934  case 'title-link':
935  $title = Title::newFromText( $value );
936  if ( !$title ) {
937  $title = SpecialPage::getTitleFor( 'Badtitle', $value );
938  }
939  $value = [];
940  ApiQueryBase::addTitleInfo( $value, $title, "{$name}_" );
941  return $value;
942 
943  case 'user':
944  case 'user-link':
945  $user = User::newFromName( $value );
946  if ( $user ) {
947  $value = $user->getName();
948  }
949  break;
950 
951  default:
952  // do nothing
953  break;
954  }
955 
956  return [ $name => $value ];
957  }
958 }
wfLogWarning( $msg, $callerOffset=1, $level=E_USER_WARNING)
Send a warning as a PHP error and the debug log.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
static addTitleInfo(&$arr, $title, $prefix='')
Add information (title and namespace) about a Title object to a result array.
static setArrayType(array &$arr, $type, $kvpKeyName=null)
Set the array data type.
Definition: ApiResult.php:716
static setIndexedTagName(array &$arr, $tag)
Set the tag name for numeric-keyed values in XML format.
Definition: ApiResult.php:604
static formatBlockFlags( $flags, Language $lang)
Convert a comma-delimited list of block log flags into a more readable (and translated) form.
static newFromRow( $row)
Constructs new LogEntry from database result row.
Marks HTML that shouldn't be escaped.
Definition: HtmlArmor.php:30
This class formats all log entries for log types which have not been converted to the new system.
isLegacy()
Whether the parameters for this log are stored in new or old format.
getFullType()
The full logtype in format maintype/subtype.
static userCanBitfield( $bitfield, $field, Authority $performer)
Determine if the current user is allowed to view a particular field of this log row,...
Implements the default log formatting.
styleRestrictedElement( $content)
Helper method for styling restricted element.
LogEntryBase $entry
static newFromRow( $row)
Handy shortcut for constructing a formatter directly from database row.
canView( $field)
Check if a log item can be displayed.
const FOR_PUBLIC
bool $linkFlood
Whether to output user tool links.
setShowUserToolLinks( $value)
If set to true, will produce user tool links after the user name.
getActionLinks()
Returns extra links that comes after the action text, like "revert", etc.
static newFromEntry(LogEntry $entry)
Constructs a new formatter suitable for given entry.
array $parsedParameters
getMessageParametersForTesting()
__construct(LogEntry $entry)
bool $plaintext
Set to true if we are constructing a message text that is going to be included in page history or sen...
getRestrictedElement( $message)
Helper method for displaying restricted element.
formatParameterValue( $type, $value)
Formats parameters values dependent to their type.
getActionMessage()
Returns a sentence describing the log action.
const FOR_THIS_USER
getActionText()
Gets the log action, including username.
canViewLogType()
Check if a log item type can be displayed.
msg( $key,... $params)
Shortcut for wfMessage which honors local context.
getPerformerElement()
Provides the name of the user who performed the log action.
setLinkRenderer(LinkRenderer $linkRenderer)
formatParameterValueForApi( $name, $type, $value)
Format a single parameter value for API output.
IContextSource $context
Context for logging.
int $audience
Constant for handling log_deleted.
formatParametersForApi()
Format parameters for API output.
getComment()
Gets the user provided comment.
getParametersForApi()
Get the array of parameters, converted from legacy format if necessary.
makePageLink(Title $title=null, $parameters=[], $html=null)
Helper to make a link to the page, taking the plaintext value in consideration.
getMessageKey()
Returns a key to be used for formatting the action sentence.
makeUserLink(UserIdentity $user, $toolFlags=0)
setAudience( $audience)
Set the visibility restrictions for displaying content.
getIRCActionText()
Even uglier hack to maintain backwards compatibility with IRC bots (T36508).
setContext(IContextSource $context)
Replace the default context.
getIRCActionComment()
Even uglier hack to maintain backwards compatibility with IRC bots (T36508).
getPlainActionText()
Ugly hack to produce plaintext version of the message.
extractParameters()
Extracts the optional extra parameters for use in action messages.
getMessageParameters()
Formats parameters intended for action message from array of all parameters.
const DELETED_USER
Definition: LogPage.php:44
const DELETED_RESTRICTED
Definition: LogPage.php:45
const DELETED_COMMENT
Definition: LogPage.php:43
const DELETED_ACTION
Definition: LogPage.php:42
This class is a collection of static functions that serve two purposes:
Definition: Html.php:55
Class that generates HTML for internal links.
Some internal bits split of from Skin.php.
Definition: Linker.php:67
A class containing constants representing the names of configuration variables.
Service locator for MediaWiki core services.
Represents a title within MediaWiki.
Definition: Title.php:82
The Message class deals with fetching and processing of interface message into a variety of formats.
Definition: Message.php:144
static rawParam( $raw)
Definition: Message.php:1135
static numParam( $num)
Definition: Message.php:1146
static getMain()
Get the RequestContext object associated with the main request.
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don't need a full Title object,...
static newFromName( $name, $validate='valid')
Definition: User.php:592
Interface for objects which can provide a MediaWiki context on request.
An individual log entry.
Definition: LogEntry.php:35
getPerformerIdentity()
getParameters()
Get the extra parameters stored for this message.
getTimestamp()
Get the timestamp when the action was executed.
getTarget()
Get the target page of this action.
getSubtype()
The log subtype.
getType()
The main log type.
Interface for objects representing user identity.
getId( $wikiId=self::LOCAL)
$content
Definition: router.php:76