4 * @license https://opensource.org/licenses/Apache-2.0 Apache-2.0
7 namespace Wikimedia\CSS\Sanitizer;
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;
20 * Sanitizes a CSS \@namespace rule
21 * @see https://www.w3.org/TR/2014/REC-css-namespaces-3-20140320/
23 class NamespaceAtRuleSanitizer extends RuleSanitizer {
29 * @param MatcherFactory $matcherFactory
31 public function __construct( MatcherFactory $matcherFactory ) {
32 $this->matcher = new Juxtaposition( [
33 Quantifier::optional( $matcherFactory->ident() ),
35 $matcherFactory->urlstring( 'namespace' ),
36 $matcherFactory->url( 'namespace' ),
41 public function getIndex() {
45 public function handlesRule( Rule $rule ) {
46 return $rule instanceof AtRule && !strcasecmp( $rule->getName(), 'namespace' );
49 protected function doSanitize( CSSObject $object ) {
50 if ( !$object instanceof Rule || !$this->handlesRule( $object ) ) {
51 $this->sanitizationError( 'expected-at-rule', $object, [ 'namespace' ] );
55 if ( $object->getBlock() !== null ) {
56 $this->sanitizationError( 'at-rule-block-not-allowed', $object->getBlock(), [ 'namespace' ] );
59 if ( !$this->matcher->match( $object->getPrelude(), [ 'mark-significance' => true ] ) ) {
60 $cv = Util::findFirstNonWhitespace( $object->getPrelude() );
62 $this->sanitizationError( 'invalid-namespace-value', $cv );
64 $this->sanitizationError( 'missing-namespace-value', $object );
68 $object = $this->fixPreludeWhitespace( $object, true );