getRequest()->getText( 'username' ); list( $username, $namespace ) = $this->extractParameters( $target ); $this->getOutput()->enableOOUI(); $user = User::newFromName( $username ); $username = $user ? $user->getName() : ''; $uid = $user ? $user->getId() : 0; if ( $this->including() ) { $contLang = MediaWikiServices::getInstance()->getContentLanguage(); if ( $namespace === null ) { if ( $uid != 0 ) { $out = $contLang->formatNum( $user->getEditCount() ); } else { $out = ''; } } else { $out = $contLang->formatNum( $this->editsInNs( $user, $namespace ) ); } $this->getOutput()->addHTML( $out ); } else { $nscount = $this->editsByNs( $user ); $html = new EditcountHTML; $html->setContext( $this->getContext() ); $html->outputHTML( $username, $uid, $nscount ); } } /** * Parse the username and namespace parts of the input and return them * * @param string $par * @return array */ private function extractParameters( $par ) { $parts = explode( '/', $par, 2 ); $parts[1] = isset( $parts[1] ) ? MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $parts[1] ) : null; return $parts; } /** * Count the number of edits of a user by namespace * * @param User $user The user to check * @return int[] */ protected function editsByNs( $user ) { if ( !$user || $user->getId() <= 0 ) { return []; } $dbr = wfGetDB( DB_REPLICA ); $actorWhere = ActorMigration::newMigration()->getWhere( $dbr, 'rev_user', $user ); $res = $dbr->select( [ 'revision', 'page' ] + $actorWhere['tables'], [ 'page_namespace', 'COUNT(*) AS count' ], [ $actorWhere['conds'] ], __METHOD__, [ 'GROUP BY' => 'page_namespace' ], [ 'page' => [ 'JOIN', 'page.page_id = rev_page' ] ] + $actorWhere['joins'] ); $nscount = []; foreach ( $res as $row ) { $nscount[$row->page_namespace] = (int)$row->count; } return $nscount; } /** * Count the number of edits of a user in a given namespace * * @param User $user The user to check * @param int $ns The namespace to check * @return int */ protected function editsInNs( $user, $ns ) { if ( !$user || $user->getId() <= 0 ) { return 0; } $dbr = wfGetDB( DB_REPLICA ); $actorWhere = ActorMigration::newMigration()->getWhere( $dbr, 'rev_user', $user ); return (int)$dbr->selectField( [ 'revision', 'page' ] + $actorWhere['tables'], 'COUNT(*)', [ 'page_namespace' => $ns, $actorWhere['conds'] ], __METHOD__, [], [ 'page' => [ 'JOIN', 'page.page_id = rev_page' ] ] + $actorWhere['joins'] ); } } class EditcountHTML extends Editcount { /** * @var int[] */ private $nscount; /** * @var int */ private $total; /** * Output the HTML form on Special:Editcount * * @param string $username * @param int $uid * @param int[] $nscount * @param int|null $total */ public function outputHTML( $username, $uid, array $nscount, $total = null ) { $this->nscount = $nscount; $this->total = $total ?: array_sum( $nscount ); $this->setHeaders(); $action = htmlspecialchars( $this->getPageTitle()->getLocalURL() ); $user = $this->msg( 'editcount_username' )->escaped(); $out = "
"; if ( $username != null && $uid != 0 ) { $editcounttable = $this->makeTable(); $out .= " "; } $out .= '
$user " . new OOUI\TextInputWidget( [ 'name' => 'username', 'value' => $username, 'autofocus' => true, ] ) . " " . new OOUI\ButtonInputWidget( [ 'label' => $this->msg( 'editcount_submit' )->text(), 'flags' => [ 'primary', 'progressive' ], 'type' => 'submit', ] ) . "
  $editcounttable  
'; $this->getOutput()->addHTML( $out ); } /** * Make the editcount-by-namespaces HTML table * * @return string */ private function makeTable() { $lang = $this->getLanguage(); $total = $this->msg( 'editcount_total' )->escaped(); $ftotal = $lang->formatNum( $this->total ); $percent = wfPercent( $this->total ? 100 : 0 ); // @fixme don't use inline styles $ret = " "; foreach ( $this->nscount as $ns => $edits ) { $fedits = $lang->formatNum( $edits ); $fns = ( $ns == NS_MAIN ) ? $this->msg( 'blanknamespace' ) : $lang->getFormattedNsText( $ns ); $percent = wfPercent( $edits / $this->total * 100 ); $fpercent = $lang->formatNum( $percent ); $ret .= " "; } $ret .= '
$total $ftotal $percent
$fns $fedits $fpercent
'; return $ret; } }