| Conditions | 21 |
| Paths | 13830 |
| Total Lines | 185 |
| Code Lines | 113 |
| Lines | 13 |
| Ratio | 7.03 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | <?php |
||
| 345 | function formatRow( $row ) { |
||
| 346 | |||
| 347 | $ret = ''; |
||
| 348 | $classes = []; |
||
| 349 | |||
| 350 | /* |
||
| 351 | * There may be more than just revision rows. To make sure that we'll only be processing |
||
| 352 | * revisions here, let's _try_ to build a revision out of our row (without displaying |
||
| 353 | * notices though) and then trying to grab data from the built object. If we succeed, |
||
| 354 | * we're definitely dealing with revision data and we may proceed, if not, we'll leave it |
||
| 355 | * to extensions to subscribe to the hook to parse the row. |
||
| 356 | */ |
||
| 357 | MediaWiki\suppressWarnings(); |
||
| 358 | try { |
||
| 359 | $rev = new Revision( $row ); |
||
| 360 | $validRevision = (bool)$rev->getId(); |
||
| 361 | } catch ( Exception $e ) { |
||
| 362 | $validRevision = false; |
||
| 363 | } |
||
| 364 | MediaWiki\restoreWarnings(); |
||
| 365 | |||
| 366 | if ( $validRevision ) { |
||
| 367 | $classes = []; |
||
| 368 | |||
| 369 | $page = Title::newFromRow( $row ); |
||
| 370 | $link = Linker::link( |
||
| 371 | $page, |
||
| 372 | htmlspecialchars( $page->getPrefixedText() ), |
||
| 373 | [ 'class' => 'mw-contributions-title' ], |
||
| 374 | $page->isRedirect() ? [ 'redirect' => 'no' ] : [] |
||
| 375 | ); |
||
| 376 | # Mark current revisions |
||
| 377 | $topmarktext = ''; |
||
| 378 | $user = $this->getUser(); |
||
| 379 | if ( $row->rev_id === $row->page_latest ) { |
||
| 380 | $topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>'; |
||
| 381 | $classes[] = 'mw-contributions-current'; |
||
| 382 | # Add rollback link |
||
| 383 | if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user ) |
||
| 384 | && $page->quickUserCan( 'edit', $user ) |
||
| 385 | ) { |
||
| 386 | $this->preventClickjacking(); |
||
| 387 | $topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() ); |
||
| 388 | } |
||
| 389 | } |
||
| 390 | # Is there a visible previous revision? |
||
| 391 | View Code Duplication | if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) { |
|
| 392 | $difftext = Linker::linkKnown( |
||
| 393 | $page, |
||
| 394 | $this->messages['diff'], |
||
| 395 | [], |
||
| 396 | [ |
||
| 397 | 'diff' => 'prev', |
||
| 398 | 'oldid' => $row->rev_id |
||
| 399 | ] |
||
| 400 | ); |
||
| 401 | } else { |
||
| 402 | $difftext = $this->messages['diff']; |
||
| 403 | } |
||
| 404 | $histlink = Linker::linkKnown( |
||
| 405 | $page, |
||
| 406 | $this->messages['hist'], |
||
| 407 | [], |
||
| 408 | [ 'action' => 'history' ] |
||
| 409 | ); |
||
| 410 | |||
| 411 | if ( $row->rev_parent_id === null ) { |
||
| 412 | // For some reason rev_parent_id isn't populated for this row. |
||
| 413 | // Its rumoured this is true on wikipedia for some revisions (bug 34922). |
||
| 414 | // Next best thing is to have the total number of bytes. |
||
| 415 | $chardiff = ' <span class="mw-changeslist-separator">. .</span> '; |
||
| 416 | $chardiff .= Linker::formatRevisionSize( $row->rev_len ); |
||
| 417 | $chardiff .= ' <span class="mw-changeslist-separator">. .</span> '; |
||
| 418 | } else { |
||
| 419 | $parentLen = 0; |
||
| 420 | if ( isset( $this->mParentLens[$row->rev_parent_id] ) ) { |
||
| 421 | $parentLen = $this->mParentLens[$row->rev_parent_id]; |
||
| 422 | } |
||
| 423 | |||
| 424 | $chardiff = ' <span class="mw-changeslist-separator">. .</span> '; |
||
| 425 | $chardiff .= ChangesList::showCharacterDifference( |
||
| 426 | $parentLen, |
||
| 427 | $row->rev_len, |
||
| 428 | $this->getContext() |
||
| 429 | ); |
||
| 430 | $chardiff .= ' <span class="mw-changeslist-separator">. .</span> '; |
||
| 431 | } |
||
| 432 | |||
| 433 | $lang = $this->getLanguage(); |
||
| 434 | $comment = $lang->getDirMark() . Linker::revComment( $rev, false, true ); |
||
| 435 | $date = $lang->userTimeAndDate( $row->rev_timestamp, $user ); |
||
| 436 | if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) { |
||
| 437 | $d = Linker::linkKnown( |
||
| 438 | $page, |
||
| 439 | htmlspecialchars( $date ), |
||
| 440 | [ 'class' => 'mw-changeslist-date' ], |
||
| 441 | [ 'oldid' => intval( $row->rev_id ) ] |
||
| 442 | ); |
||
| 443 | } else { |
||
| 444 | $d = htmlspecialchars( $date ); |
||
| 445 | } |
||
| 446 | if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) { |
||
| 447 | $d = '<span class="history-deleted">' . $d . '</span>'; |
||
| 448 | } |
||
| 449 | |||
| 450 | # Show user names for /newbies as there may be different users. |
||
| 451 | # Note that we already excluded rows with hidden user names. |
||
| 452 | if ( $this->contribs == 'newbie' ) { |
||
| 453 | $userlink = ' . . ' . $lang->getDirMark() |
||
| 454 | . Linker::userLink( $rev->getUser(), $rev->getUserText() ); |
||
| 455 | $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams( |
||
| 456 | Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' '; |
||
| 457 | } else { |
||
| 458 | $userlink = ''; |
||
| 459 | } |
||
| 460 | |||
| 461 | $flags = []; |
||
| 462 | if ( $rev->getParentId() === 0 ) { |
||
| 463 | $flags[] = ChangesList::flag( 'newpage' ); |
||
| 464 | } |
||
| 465 | |||
| 466 | if ( $rev->isMinor() ) { |
||
| 467 | $flags[] = ChangesList::flag( 'minor' ); |
||
| 468 | } |
||
| 469 | |||
| 470 | $del = Linker::getRevDeleteLink( $user, $rev, $page ); |
||
| 471 | if ( $del !== '' ) { |
||
| 472 | $del .= ' '; |
||
| 473 | } |
||
| 474 | |||
| 475 | $diffHistLinks = $this->msg( 'parentheses' ) |
||
| 476 | ->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink ) |
||
| 477 | ->escaped(); |
||
| 478 | |||
| 479 | # Tags, if any. |
||
| 480 | list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( |
||
| 481 | $row->ts_tags, |
||
| 482 | 'contributions', |
||
| 483 | $this->getContext() |
||
| 484 | ); |
||
| 485 | $classes = array_merge( $classes, $newClasses ); |
||
| 486 | |||
| 487 | Hooks::run( 'SpecialContributions::formatRow::flags', [ $this->getContext(), $row, &$flags ] ); |
||
| 488 | |||
| 489 | $templateParams = [ |
||
| 490 | 'del' => $del, |
||
| 491 | 'timestamp' => $d, |
||
| 492 | 'diffHistLinks' => $diffHistLinks, |
||
| 493 | 'charDifference' => $chardiff, |
||
| 494 | 'flags' => $flags, |
||
| 495 | 'articleLink' => $link, |
||
| 496 | 'userlink' => $userlink, |
||
| 497 | 'logText' => $comment, |
||
| 498 | 'topmarktext' => $topmarktext, |
||
| 499 | 'tagSummary' => $tagSummary, |
||
| 500 | ]; |
||
| 501 | |||
| 502 | # Denote if username is redacted for this edit |
||
| 503 | if ( $rev->isDeleted( Revision::DELETED_USER ) ) { |
||
| 504 | $templateParams['rev-deleted-user-contribs'] = |
||
| 505 | $this->msg( 'rev-deleted-user-contribs' )->escaped(); |
||
| 506 | } |
||
| 507 | |||
| 508 | $templateParser = new TemplateParser(); |
||
| 509 | $ret = $templateParser->processTemplate( |
||
| 510 | 'SpecialContributionsLine', |
||
| 511 | $templateParams |
||
| 512 | ); |
||
| 513 | } |
||
| 514 | |||
| 515 | // Let extensions add data |
||
| 516 | Hooks::run( 'ContributionsLineEnding', [ $this, &$ret, $row, &$classes ] ); |
||
| 517 | |||
| 518 | // TODO: Handle exceptions in the catch block above. Do any extensions rely on |
||
| 519 | // receiving empty rows? |
||
| 520 | |||
| 521 | if ( $classes === [] && $ret === '' ) { |
||
| 522 | wfDebug( "Dropping Special:Contribution row that could not be formatted\n" ); |
||
| 523 | return "<!-- Could not format Special:Contribution row. -->\n"; |
||
| 524 | } |
||
| 525 | |||
| 526 | // FIXME: The signature of the ContributionsLineEnding hook makes it |
||
| 527 | // very awkward to move this LI wrapper into the template. |
||
| 528 | return Html::rawElement( 'li', [ 'class' => $classes ], $ret ) . "\n"; |
||
| 529 | } |
||
| 530 | |||
| 555 |
In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:
Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion: