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() ) { if ( $namespace === null ) { if ( $uid != 0 ) { $out = $wgContLang->formatNum( $user->getEditCount() ); } else { $out = ''; } } else { $out = $wgContLang->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 ) { global $wgContLang; // @fixme don't use @ @list( $user, $namespace ) = explode( '/', $par, 2 ); // str*cmp sucks if ( isset( $namespace ) ) { $namespace = $wgContLang->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 = "
'; $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 = "$total | $ftotal | $percent |
---|---|---|
$fns | $fedits | $fpercent |