getRequest()->getText( 'username' ); list( $username, $namespace ) = $this->extractParamaters( $target ); $this->getOutput()->enableOOUI(); $user = User::newFromName( $username ); $username = is_object( $user ) ? $user->getName() : ''; $uid = ( $user instanceof 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( $uid, $namespace ) ); } $this->getOutput()->addHTML( $out ); } else { if ( $uid != 0 ) { $nscount = $this->editsByNs( $uid ); $total = $this->getTotal( $nscount ); } $html = new EditcountHTML; $html->setContext( $this->getContext() ); // @fixme don't use @ $html->outputHTML( $username, $uid, @$nscount, @$total ); } } /** * Parse the username and namespace parts of the input and return them * * @private * * @param string $par * @return array */ function extractParamaters( $par ) { // @fixme don't use @ @list( $user, $namespace ) = explode( '/', $par, 2 ); // str*cmp sucks if ( isset( $namespace ) ) { $namespace = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $namespace ); } return [ $user, $namespace ]; } /** * Compute and return the total edits in all namespaces * * @private * * @param array $nscount An associative array * @return int */ function getTotal( $nscount ) { $total = 0; foreach ( array_values( $nscount ) as $i ) { $total += $i; } return $total; } /** * Count the number of edits of a user by namespace * * @param int $uid The user ID to check * @return array */ function editsByNs( $uid ) { $nscount = []; $dbr = wfGetDB( DB_REPLICA ); $res = $dbr->select( [ 'user', 'revision', 'page' ], [ 'page_namespace', 'COUNT(*) AS count' ], [ 'user_id' => $uid, 'rev_user = user_id', 'rev_page = page_id' ], __METHOD__, [ 'GROUP BY' => 'page_namespace' ] ); foreach ( $res as $row ) { $nscount[$row->page_namespace] = $row->count; } return $nscount; } /** * Count the number of edits of a user in a given namespace * * @param int $uid The user ID to check * @param int $ns The namespace to check * @return string */ function editsInNs( $uid, $ns ) { $dbr = wfGetDB( DB_REPLICA ); $res = $dbr->selectField( [ 'user', 'revision', 'page' ], [ 'COUNT(*) AS count' ], [ 'user_id' => $uid, 'page_namespace' => $ns, 'rev_user = user_id', 'rev_page = page_id' ], __METHOD__, [ 'GROUP BY' => 'page_namespace' ] ); return $res; } } class EditcountHTML extends Editcount { /** * @var array */ private $nscount; /** * @var int */ private $total; /** * Output the HTML form on Special:Editcount * * @param string $username * @param int $uid * @param array $nscount * @param int $total */ function outputHTML( $username, $uid, $nscount, $total ) { $this->nscount = $nscount; $this->total = $total; $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 * * @private */ function makeTable() { $lang = $this->getLanguage(); $total = $this->msg( 'editcount_total' )->escaped(); $ftotal = $lang->formatNum( $this->total ); $percent = $this->total > 0 ? wfPercent( $this->total / $this->total * 100, 2 ) : wfPercent( 0 ); // @bug 4400 // @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; } }