File: AceEditBoxBuilder.php

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (110 lines) | stat: -rw-r--r-- 3,497 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<?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 MediaWiki\Html\Html;
use MediaWiki\Output\OutputPage;
use MediaWiki\Permissions\Authority;
use MessageLocalizer;
use OOUI\ButtonWidget;
use OOUI\HorizontalLayout;
use OOUI\Widget;

/**
 * Class responsible for building filter edit boxes with both the Ace and the plain version
 */
class AceEditBoxBuilder extends EditBoxBuilder {

	/** @var PlainEditBoxBuilder */
	private $plainBuilder;

	/**
	 * @inheritDoc
	 * @param PlainEditBoxBuilder $plainBuilder
	 */
	public function __construct(
		AbuseFilterPermissionManager $afPermManager,
		KeywordsManager $keywordsManager,
		MessageLocalizer $messageLocalizer,
		Authority $authority,
		OutputPage $output,
		PlainEditBoxBuilder $plainBuilder
	) {
		parent::__construct( $afPermManager, $keywordsManager, $messageLocalizer, $authority, $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 = Html::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
		];
	}
}