]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - vendor/wikimedia/css-sanitizer/src/Sanitizer/FontFeatureValuesAtRuleSanitizer.php
MediaWiki 1.30.2
[autoinstalls/mediawiki.git] / vendor / wikimedia / css-sanitizer / src / Sanitizer / FontFeatureValuesAtRuleSanitizer.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\Matcher;
11 use Wikimedia\CSS\Grammar\MatcherFactory;
12 use Wikimedia\CSS\Grammar\Quantifier;
13 use Wikimedia\CSS\Objects\AtRule;
14 use Wikimedia\CSS\Objects\CSSObject;
15 use Wikimedia\CSS\Objects\Rule;
16 use Wikimedia\CSS\Util;
17
18 /**
19  * Sanitizes a CSS \@font-feature-values rule
20  * @see https://www.w3.org/TR/2013/CR-css-fonts-3-20131003/#at-font-feature-values-rule
21  */
22 class FontFeatureValuesAtRuleSanitizer extends RuleSanitizer {
23
24         /** @var Matcher */
25         protected $fontListMatcher;
26
27         /** @var FontFeatureValueAtRuleSanitizer[] */
28         protected $ruleSanitizers;
29
30         /**
31          * @param MatcherFactory $matcherFactory
32          */
33         public function __construct( MatcherFactory $matcherFactory ) {
34                 $this->fontListMatcher = Quantifier::hash( new Alternative( [
35                         $matcherFactory->string(),
36                         Quantifier::plus( $matcherFactory->ident() ),
37                 ] ) );
38
39                 $n = $matcherFactory->rawNumber();
40                 $n2 = Quantifier::count( $n, 1, 2 );
41                 $nPlus = Quantifier::plus( $n );
42                 $this->ruleSanitizers = [
43                         new FontFeatureValueAtRuleSanitizer( 'stylistic', $n ),
44                         new FontFeatureValueAtRuleSanitizer( 'styleset', $nPlus ),
45                         new FontFeatureValueAtRuleSanitizer( 'character-variant', $n2 ),
46                         new FontFeatureValueAtRuleSanitizer( 'swash', $n ),
47                         new FontFeatureValueAtRuleSanitizer( 'ornaments', $n ),
48                         new FontFeatureValueAtRuleSanitizer( 'annotation', $n ),
49                 ];
50         }
51
52         public function handlesRule( Rule $rule ) {
53                 return $rule instanceof AtRule && !strcasecmp( $rule->getName(), 'font-feature-values' );
54         }
55
56         protected function doSanitize( CSSObject $object ) {
57                 if ( !$object instanceof Rule || !$this->handlesRule( $object ) ) {
58                         $this->sanitizationError( 'expected-at-rule', $object, [ 'font-feature-values' ] );
59                         return null;
60                 }
61
62                 if ( $object->getBlock() === null ) {
63                         $this->sanitizationError( 'at-rule-block-required', $object, [ 'font-feature-values' ] );
64                         return null;
65                 }
66
67                 // Test the page selector
68                 if ( !$this->fontListMatcher->match( $object->getPrelude(), [ 'mark-significance' => true ] ) ) {
69                         $cv = Util::findFirstNonWhitespace( $object->getPrelude() );
70                         if ( $cv ) {
71                                 $this->sanitizationError( 'invalid-font-feature-values-font-list', $cv );
72                         } else {
73                                 $this->sanitizationError( 'missing-font-feature-values-font-list', $object );
74                         }
75                         return null;
76                 }
77
78                 $ret = clone( $object );
79                 $this->fixPreludeWhitespace( $ret, false );
80                 $this->sanitizeRuleBlock( $ret->getBlock(), $this->ruleSanitizers );
81
82                 return $ret;
83         }
84 }