mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/AbuseFilter.git
synced 2024-12-03 01:56:28 +00:00
f8438a4647
All methods were moved to the new parser. Tests and other pieces were adjusted to expect just a single parser. There are still some TODOs (remove AFPTransitionBase, remove $this->mCur), but these are left for another commit. Note that the new parser was not renamed: this is because the names are wrong anyway (CachingParser is more of an Evaluator than a Parser, and AFPTreeParser is the real parser, and should be renamed as well). NOTE to reviewers: this patch looks quite big, but if you diff the old parser with the new version of the CachingParser, you'll notice that the diff is actually small, since everything was basically copied verbatim. Bug: T239990 Change-Id: Ie914ef64c70503a201b4d2dec698ca2fa8e69b10
111 lines
3.3 KiB
PHP
111 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Extension\AbuseFilter\EditBox;
|
|
|
|
use MediaWiki\Extension\AbuseFilter\AbuseFilterPermissionManager;
|
|
use MediaWiki\Extension\AbuseFilter\KeywordsManager;
|
|
use MediaWiki\Extension\AbuseFilter\Parser\AbuseFilterCachingParser;
|
|
use MediaWiki\Extension\AbuseFilter\Parser\AbuseFilterTokenizer;
|
|
use MessageLocalizer;
|
|
use OOUI\ButtonWidget;
|
|
use OOUI\HorizontalLayout;
|
|
use OOUI\Widget;
|
|
use OutputPage;
|
|
use User;
|
|
use Xml;
|
|
|
|
/**
|
|
* Class responsible for building filter edit boxes with both the Ace and the plain version
|
|
*/
|
|
class AceEditBoxBuiler extends EditBoxBuilder {
|
|
|
|
/** @var PlainEditBoxBuiler */
|
|
private $plainBuilder;
|
|
|
|
/**
|
|
* @inheritDoc
|
|
* @param PlainEditBoxBuiler $plainBuilder
|
|
*/
|
|
public function __construct(
|
|
AbuseFilterPermissionManager $afPermManager,
|
|
KeywordsManager $keywordsManager,
|
|
MessageLocalizer $messageLocalizer,
|
|
User $user,
|
|
OutputPage $output,
|
|
PlainEditBoxBuiler $plainBuilder
|
|
) {
|
|
parent::__construct( $afPermManager, $keywordsManager, $messageLocalizer, $user, $output );
|
|
$this->plainBuilder = $plainBuilder;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
protected function getEditBox( string $rules, bool $isUserAllowed, bool $externalForm ) : string {
|
|
$rules = rtrim( $rules ) . "\n";
|
|
|
|
$attribs = [
|
|
// Rules are in English
|
|
'dir' => 'ltr',
|
|
'name' => 'wpAceFilterEditor',
|
|
'id' => 'wpAceFilterEditor',
|
|
'class' => 'mw-abusefilter-editor'
|
|
];
|
|
$rulesContainer = Xml::element( 'div', $attribs, $rules );
|
|
$editorConfig = $this->getAceConfig( $isUserAllowed );
|
|
$this->output->addJsConfigVars( 'aceConfig', $editorConfig );
|
|
return $rulesContainer . $this->plainBuilder->getEditBox( $rules, $isUserAllowed, $externalForm );
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
protected function getEditorControls() : Widget {
|
|
$base = parent::getEditorControls();
|
|
$switchEditor = new ButtonWidget(
|
|
[
|
|
'label' => $this->localizer->msg( 'abusefilter-edit-switch-editor' )->text(),
|
|
'id' => 'mw-abusefilter-switcheditor'
|
|
]
|
|
);
|
|
return new Widget( [
|
|
'content' => new HorizontalLayout( [
|
|
'items' => [ $switchEditor, $base ]
|
|
] )
|
|
] );
|
|
}
|
|
|
|
/**
|
|
* Extract values for syntax highlight
|
|
*
|
|
* @param bool $canEdit
|
|
* @return array
|
|
*/
|
|
private function getAceConfig( bool $canEdit ): array {
|
|
$values = $this->keywordsManager->getBuilderValues();
|
|
$deprecatedVars = $this->keywordsManager->getDeprecatedVariables();
|
|
|
|
$builderVariables = implode( '|', array_keys( $values['vars'] ) );
|
|
$builderFunctions = implode( '|', array_keys( AbuseFilterCachingParser::FUNCTIONS ) );
|
|
// AbuseFilterTokenizer::KEYWORDS also includes constants (true, false and null),
|
|
// but Ace redefines these constants afterwards so this will not be an issue
|
|
$builderKeywords = implode( '|', AbuseFilterTokenizer::KEYWORDS );
|
|
// Extract operators from tokenizer like we do in AbuseFilterParserTest
|
|
$operators = implode( '|', array_map( function ( $op ) {
|
|
return preg_quote( $op, '/' );
|
|
}, AbuseFilterTokenizer::OPERATORS ) );
|
|
$deprecatedVariables = implode( '|', array_keys( $deprecatedVars ) );
|
|
$disabledVariables = implode( '|', array_keys( $this->keywordsManager->getDisabledVariables() ) );
|
|
|
|
return [
|
|
'variables' => $builderVariables,
|
|
'functions' => $builderFunctions,
|
|
'keywords' => $builderKeywords,
|
|
'operators' => $operators,
|
|
'deprecated' => $deprecatedVariables,
|
|
'disabled' => $disabledVariables,
|
|
'aceReadOnly' => !$canEdit
|
|
];
|
|
}
|
|
}
|