]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - vendor/wikimedia/css-sanitizer/src/Sanitizer/NamespaceAtRuleSanitizer.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / vendor / wikimedia / css-sanitizer / src / Sanitizer / NamespaceAtRuleSanitizer.php
1 <?php
2 /**
3  * @file
4  * @license https://opensource.org/licenses/Apache-2.0 Apache-2.0
5  */
6
7 namespace Wikimedia\CSS\Sanitizer;
8
9 use Wikimedia\CSS\Grammar\Alternative;
10 use Wikimedia\CSS\Grammar\Juxtaposition;
11 use Wikimedia\CSS\Grammar\Matcher;
12 use Wikimedia\CSS\Grammar\MatcherFactory;
13 use Wikimedia\CSS\Grammar\Quantifier;
14 use Wikimedia\CSS\Objects\AtRule;
15 use Wikimedia\CSS\Objects\CSSObject;
16 use Wikimedia\CSS\Objects\Rule;
17 use Wikimedia\CSS\Util;
18
19 /**
20  * Sanitizes a CSS \@namespace rule
21  * @see https://www.w3.org/TR/2014/REC-css-namespaces-3-20140320/
22  */
23 class NamespaceAtRuleSanitizer extends RuleSanitizer {
24
25         /** @var Matcher */
26         protected $matcher;
27
28         /**
29          * @param MatcherFactory $matcherFactory
30          */
31         public function __construct( MatcherFactory $matcherFactory ) {
32                 $this->matcher = new Juxtaposition( [
33                         Quantifier::optional( $matcherFactory->ident() ),
34                         new Alternative( [
35                                 $matcherFactory->urlstring( 'namespace' ),
36                                 $matcherFactory->url( 'namespace' ),
37                         ] ),
38                 ] );
39         }
40
41         public function getIndex() {
42                 return -900;
43         }
44
45         public function handlesRule( Rule $rule ) {
46                 return $rule instanceof AtRule && !strcasecmp( $rule->getName(), 'namespace' );
47         }
48
49         protected function doSanitize( CSSObject $object ) {
50                 if ( !$object instanceof Rule || !$this->handlesRule( $object ) ) {
51                         $this->sanitizationError( 'expected-at-rule', $object, [ 'namespace' ] );
52                         return null;
53                 }
54
55                 if ( $object->getBlock() !== null ) {
56                         $this->sanitizationError( 'at-rule-block-not-allowed', $object->getBlock(), [ 'namespace' ] );
57                         return null;
58                 }
59                 if ( !$this->matcher->match( $object->getPrelude(), [ 'mark-significance' => true ] ) ) {
60                         $cv = Util::findFirstNonWhitespace( $object->getPrelude() );
61                         if ( $cv ) {
62                                 $this->sanitizationError( 'invalid-namespace-value', $cv );
63                         } else {
64                                 $this->sanitizationError( 'missing-namespace-value', $object );
65                         }
66                         return null;
67                 }
68                 $object = $this->fixPreludeWhitespace( $object, true );
69
70                 return $object;
71         }
72 }