mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/AbuseFilter.git
synced 2024-11-28 07:50:24 +00:00
f8e9ac7e2a
It's an evaluator, not a parser. Change-Id: Ib6d33e8423ea72709cf5a33f4397ba33e352ea80
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\AbuseFilterTokenizer;
|
|
use MediaWiki\Extension\AbuseFilter\Parser\FilterEvaluator;
|
|
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( FilterEvaluator::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( static 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
|
|
];
|
|
}
|
|
}
|