addExtensionTable( 'linter', "$dir/linter.sql" ); } /** * Hook: EditFormInitialText * * If there is a lintid parameter, look up that error in the database * and setup and output our client-side helpers * * @param EditPage $editPage */ public static function onEditFormInitialText( EditPage $editPage ) { $context = $editPage->getContext(); $request = $context->getRequest(); $lintId = $request->getInt( 'lintid' ); if ( !$lintId ) { return; } $title = $editPage->getTitle(); $lintError = ( new Database( $title->getArticleID() ) )->getFromId( $lintId ); if ( !$lintError ) { // Already fixed or bogus URL parameter? return; } $out = $context->getOutput(); $out->addJsConfigVars( [ 'wgLinterErrorCategory' => $lintError->category, 'wgLinterErrorLocation' => $lintError->location, ] ); $out->addModules( 'ext.linter.edit' ); } /** * Hook: WikiPageDeletionUpdates * * Remove entries from the linter table upon page deletion * * @param WikiPage $wikiPage * @param Content $content * @param array &$updates */ public static function onWikiPageDeletionUpdates( WikiPage $wikiPage, Content $content, array &$updates ) { $id = $wikiPage->getId(); $updates[] = new MWCallableUpdate( function() use ( $id ) { $database = new Database( $id ); $database->setForPage( [] ); }, __METHOD__ ); } /** * Hook: APIQuerySiteInfoGeneralInfo * * Expose categories via action=query&meta=siteinfo * * @param ApiQuerySiteInfo $api * @param array &$data */ public static function onAPIQuerySiteInfoGeneralInfo( ApiQuerySiteInfo $api, array &$data ) { $catManager = new CategoryManager(); $totals = ( new Database( 0 ) )->getTotals(); $info = []; foreach ( $catManager->getErrors() as $error ) { $info['errors'][$error] = $totals[$error]; } foreach ( $catManager->getWarnings() as $warning ) { $info['warnings'][$warning] = $totals[$warning]; } $data['linter'] = $info; } /** * Hook: InfoAction * * Display quick summary of errors for this page on ?action=info * * @param IContextSource $context * @param array &$pageInfo */ public static function onInfoAction( IContextSource $context, array &$pageInfo ) { $pageId = $context->getTitle()->getArticleID(); if ( !$pageId ) { return; } $database = new Database( $pageId ); $totals = array_filter( $database->getTotalsForPage() ); if ( !$totals ) { // No errors, yay! return; } foreach ( $totals as $name => $count ) { $pageInfo['linter'][] = [ $context->msg( "linter-category-$name" ), htmlspecialchars( $count ) ]; } } }