%PDF- %PDF-
Direktori : /home/q/g/b/qgbqkvz/www/wp-content/plugins/wp-scss/scssphp/src/Ast/Selector/ |
Current File : /home/q/g/b/qgbqkvz/www/wp-content/plugins/wp-scss/scssphp/src/Ast/Selector/SimpleSelector.php |
<?php /** * SCSSPHP * * @copyright 2012-2020 Leaf Corcoran * * @license http://opensource.org/licenses/MIT MIT * * @link http://scssphp.github.io/scssphp */ namespace ScssPhp\ScssPhp\Ast\Selector; use ScssPhp\ScssPhp\Exception\SassFormatException; use ScssPhp\ScssPhp\Exception\SassScriptException; use ScssPhp\ScssPhp\Logger\LoggerInterface; use ScssPhp\ScssPhp\Parser\SelectorParser; use ScssPhp\ScssPhp\Util\EquatableUtil; use ScssPhp\ScssPhp\Util\ListUtil; /** * An abstract superclass for simple selectors. */ abstract class SimpleSelector extends Selector { /** * Names of pseudo-classes that take selectors as arguments, and that are * subselectors of their arguments. * * For example, `.foo` is a superselector of `:matches(.foo)`. */ private const SUBSELECTOR_PSEUDOS = [ 'is', 'matches', 'where', 'any', 'nth-child', 'nth-last-child', ]; /** * Parses a simple selector from $contents. * * If passed, $url is the name of the file from which $contents comes. * $allowParent controls whether a {@see ParentSelector} is allowed in this * selector. * * @throws SassFormatException if parsing fails. */ public static function parse(string $contents, ?LoggerInterface $logger = null, ?string $url = null, bool $allowParent = true): SimpleSelector { return (new SelectorParser($contents, $logger, $url, $allowParent))->parseSimpleSelector(); } /** * This selector's specificity. * * Specificity is represented in base 1000. The spec says this should be * "sufficiently high"; it's extremely unlikely that any single selector * sequence will contain 1000 simple selectors. */ public function getSpecificity(): int { return 1000; } /** * Returns a new {@see SimpleSelector} based on $this, as though it had been * written with $suffix at the end. * * Assumes $suffix is a valid identifier suffix. If this wouldn't produce a * valid SimpleSelector, throws a {@see SassScriptException}. * * @throws SassScriptException */ public function addSuffix(string $suffix): SimpleSelector { throw new SassScriptException("Invalid parent selector \"$this\""); } /** * Returns the components of a {@see CompoundSelector} that matches only elements * matched by both this and $compound. * * By default, this just returns a copy of $compound with this selector * added to the end, or returns the original array if this selector already * exists in it. * * Returns `null` if unification is impossible—for example, if there are * multiple ID selectors. * * @param list<SimpleSelector> $compound * * @return list<SimpleSelector>|null */ public function unify(array $compound): ?array { if (\count($compound) === 1) { $other = $compound[0]; if ($other instanceof UniversalSelector || $other instanceof PseudoSelector && ($other->isHost() || $other->isHostContext())) { return $other->unify([$this]); } } if (EquatableUtil::listContains($compound, $this)) { return $compound; } $result = []; $addedThis = false; foreach ($compound as $simple) { // Make sure pseudo selectors always come last. if (!$addedThis && $simple instanceof PseudoSelector) { $result[] = $this; $addedThis = true; } $result[] = $simple; } if (!$addedThis) { $result[] = $this; } return $result; } public function isSuperselector(SimpleSelector $other): bool { if ($this === $other || $this->equals($other)) { return true; } if ($other instanceof PseudoSelector && $other->isClass()) { $list = $other->getSelector(); if ($list !== null && \in_array($other->getNormalizedName(), self::SUBSELECTOR_PSEUDOS, true)) { foreach ($list->getComponents() as $complex) { if (\count($complex->getComponents()) === 0) { return false; } foreach (ListUtil::last($complex->getComponents())->getSelector()->getComponents() as $simple) { if ($this->isSuperselector($simple)) { continue 2; } } return false; } return true; } } return false; } }