PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / 4.17.1
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress v4.17.1
4.17.2 4.17.1 4.17.0 4.16.19 4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.7.0 4.8.0 4.9.0
wp-user-avatar / third-party / vendor / symfony / css-selector / XPath / Translator.php
wp-user-avatar / third-party / vendor / symfony / css-selector / XPath Last commit date
Extension 2 months ago Translator.php 2 months ago TranslatorInterface.php 2 months ago XPathExpr.php 2 months ago
Translator.php
189 lines
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 namespace ProfilePressVendor\Symfony\Component\CssSelector\XPath;
12
13 use ProfilePressVendor\Symfony\Component\CssSelector\Exception\ExpressionErrorException;
14 use ProfilePressVendor\Symfony\Component\CssSelector\Node\FunctionNode;
15 use ProfilePressVendor\Symfony\Component\CssSelector\Node\NodeInterface;
16 use ProfilePressVendor\Symfony\Component\CssSelector\Node\SelectorNode;
17 use ProfilePressVendor\Symfony\Component\CssSelector\Parser\Parser;
18 use ProfilePressVendor\Symfony\Component\CssSelector\Parser\ParserInterface;
19 /**
20 * XPath expression translator interface.
21 *
22 * This component is a port of the Python cssselect library,
23 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
24 *
25 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
26 *
27 * @internal
28 */
29 class Translator implements TranslatorInterface
30 {
31 private $mainParser;
32 /**
33 * @var ParserInterface[]
34 */
35 private $shortcutParsers = [];
36 /**
37 * @var Extension\ExtensionInterface[]
38 */
39 private $extensions = [];
40 private $nodeTranslators = [];
41 private $combinationTranslators = [];
42 private $functionTranslators = [];
43 private $pseudoClassTranslators = [];
44 private $attributeMatchingTranslators = [];
45 public function __construct(?ParserInterface $parser = null)
46 {
47 $this->mainParser = $parser ?? new Parser();
48 $this->registerExtension(new Extension\NodeExtension())->registerExtension(new Extension\CombinationExtension())->registerExtension(new Extension\FunctionExtension())->registerExtension(new Extension\PseudoClassExtension())->registerExtension(new Extension\AttributeMatchingExtension());
49 }
50 public static function getXpathLiteral(string $element): string
51 {
52 if (!str_contains($element, "'")) {
53 return "'" . $element . "'";
54 }
55 if (!str_contains($element, '"')) {
56 return '"' . $element . '"';
57 }
58 $string = $element;
59 $parts = [];
60 while (\true) {
61 if (\false !== $pos = strpos($string, "'")) {
62 $parts[] = sprintf("'%s'", substr($string, 0, $pos));
63 $parts[] = "\"'\"";
64 $string = substr($string, $pos + 1);
65 } else {
66 $parts[] = "'{$string}'";
67 break;
68 }
69 }
70 return sprintf('concat(%s)', implode(', ', $parts));
71 }
72 /**
73 * {@inheritdoc}
74 */
75 public function cssToXPath(string $cssExpr, string $prefix = 'descendant-or-self::'): string
76 {
77 $selectors = $this->parseSelectors($cssExpr);
78 /** @var SelectorNode $selector */
79 foreach ($selectors as $index => $selector) {
80 if (null !== $selector->getPseudoElement()) {
81 throw new ExpressionErrorException('Pseudo-elements are not supported.');
82 }
83 $selectors[$index] = $this->selectorToXPath($selector, $prefix);
84 }
85 return implode(' | ', $selectors);
86 }
87 /**
88 * {@inheritdoc}
89 */
90 public function selectorToXPath(SelectorNode $selector, string $prefix = 'descendant-or-self::'): string
91 {
92 return ($prefix ?: '') . $this->nodeToXPath($selector);
93 }
94 /**
95 * @return $this
96 */
97 public function registerExtension(Extension\ExtensionInterface $extension): self
98 {
99 $this->extensions[$extension->getName()] = $extension;
100 $this->nodeTranslators = array_merge($this->nodeTranslators, $extension->getNodeTranslators());
101 $this->combinationTranslators = array_merge($this->combinationTranslators, $extension->getCombinationTranslators());
102 $this->functionTranslators = array_merge($this->functionTranslators, $extension->getFunctionTranslators());
103 $this->pseudoClassTranslators = array_merge($this->pseudoClassTranslators, $extension->getPseudoClassTranslators());
104 $this->attributeMatchingTranslators = array_merge($this->attributeMatchingTranslators, $extension->getAttributeMatchingTranslators());
105 return $this;
106 }
107 /**
108 * @throws ExpressionErrorException
109 */
110 public function getExtension(string $name): Extension\ExtensionInterface
111 {
112 if (!isset($this->extensions[$name])) {
113 throw new ExpressionErrorException(sprintf('Extension "%s" not registered.', $name));
114 }
115 return $this->extensions[$name];
116 }
117 /**
118 * @return $this
119 */
120 public function registerParserShortcut(ParserInterface $shortcut): self
121 {
122 $this->shortcutParsers[] = $shortcut;
123 return $this;
124 }
125 /**
126 * @throws ExpressionErrorException
127 */
128 public function nodeToXPath(NodeInterface $node): XPathExpr
129 {
130 if (!isset($this->nodeTranslators[$node->getNodeName()])) {
131 throw new ExpressionErrorException(sprintf('Node "%s" not supported.', $node->getNodeName()));
132 }
133 return $this->nodeTranslators[$node->getNodeName()]($node, $this);
134 }
135 /**
136 * @throws ExpressionErrorException
137 */
138 public function addCombination(string $combiner, NodeInterface $xpath, NodeInterface $combinedXpath): XPathExpr
139 {
140 if (!isset($this->combinationTranslators[$combiner])) {
141 throw new ExpressionErrorException(sprintf('Combiner "%s" not supported.', $combiner));
142 }
143 return $this->combinationTranslators[$combiner]($this->nodeToXPath($xpath), $this->nodeToXPath($combinedXpath));
144 }
145 /**
146 * @throws ExpressionErrorException
147 */
148 public function addFunction(XPathExpr $xpath, FunctionNode $function): XPathExpr
149 {
150 if (!isset($this->functionTranslators[$function->getName()])) {
151 throw new ExpressionErrorException(sprintf('Function "%s" not supported.', $function->getName()));
152 }
153 return $this->functionTranslators[$function->getName()]($xpath, $function);
154 }
155 /**
156 * @throws ExpressionErrorException
157 */
158 public function addPseudoClass(XPathExpr $xpath, string $pseudoClass): XPathExpr
159 {
160 if (!isset($this->pseudoClassTranslators[$pseudoClass])) {
161 throw new ExpressionErrorException(sprintf('Pseudo-class "%s" not supported.', $pseudoClass));
162 }
163 return $this->pseudoClassTranslators[$pseudoClass]($xpath);
164 }
165 /**
166 * @throws ExpressionErrorException
167 */
168 public function addAttributeMatching(XPathExpr $xpath, string $operator, string $attribute, ?string $value): XPathExpr
169 {
170 if (!isset($this->attributeMatchingTranslators[$operator])) {
171 throw new ExpressionErrorException(sprintf('Attribute matcher operator "%s" not supported.', $operator));
172 }
173 return $this->attributeMatchingTranslators[$operator]($xpath, $attribute, $value);
174 }
175 /**
176 * @return SelectorNode[]
177 */
178 private function parseSelectors(string $css): array
179 {
180 foreach ($this->shortcutParsers as $shortcut) {
181 $tokens = $shortcut->parse($css);
182 if (!empty($tokens)) {
183 return $tokens;
184 }
185 }
186 return $this->mainParser->parse($css);
187 }
188 }
189