PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.23.1
MailPoet – Newsletters, Email Marketing, and Automation v5.23.1
5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / symfony / css-selector / XPath / Translator.php
mailpoet / vendor-prefixed / symfony / css-selector / XPath Last commit date
Extension 2 years ago Translator.php 2 years ago TranslatorInterface.php 2 years ago XPathExpr.php 2 years ago index.php 2 years ago
Translator.php
130 lines
1 <?php
2 namespace MailPoetVendor\Symfony\Component\CssSelector\XPath;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Symfony\Component\CssSelector\Exception\ExpressionErrorException;
5 use MailPoetVendor\Symfony\Component\CssSelector\Node\FunctionNode;
6 use MailPoetVendor\Symfony\Component\CssSelector\Node\NodeInterface;
7 use MailPoetVendor\Symfony\Component\CssSelector\Node\SelectorNode;
8 use MailPoetVendor\Symfony\Component\CssSelector\Parser\Parser;
9 use MailPoetVendor\Symfony\Component\CssSelector\Parser\ParserInterface;
10 class Translator implements TranslatorInterface
11 {
12 private $mainParser;
13 private $shortcutParsers = [];
14 private $extensions = [];
15 private $nodeTranslators = [];
16 private $combinationTranslators = [];
17 private $functionTranslators = [];
18 private $pseudoClassTranslators = [];
19 private $attributeMatchingTranslators = [];
20 public function __construct(?ParserInterface $parser = null)
21 {
22 $this->mainParser = $parser ?? new Parser();
23 $this->registerExtension(new Extension\NodeExtension())->registerExtension(new Extension\CombinationExtension())->registerExtension(new Extension\FunctionExtension())->registerExtension(new Extension\PseudoClassExtension())->registerExtension(new Extension\AttributeMatchingExtension());
24 }
25 public static function getXpathLiteral(string $element) : string
26 {
27 if (!\str_contains($element, "'")) {
28 return "'" . $element . "'";
29 }
30 if (!\str_contains($element, '"')) {
31 return '"' . $element . '"';
32 }
33 $string = $element;
34 $parts = [];
35 while (\true) {
36 if (\false !== ($pos = \strpos($string, "'"))) {
37 $parts[] = \sprintf("'%s'", \substr($string, 0, $pos));
38 $parts[] = "\"'\"";
39 $string = \substr($string, $pos + 1);
40 } else {
41 $parts[] = "'{$string}'";
42 break;
43 }
44 }
45 return \sprintf('concat(%s)', \implode(', ', $parts));
46 }
47 public function cssToXPath(string $cssExpr, string $prefix = 'descendant-or-self::') : string
48 {
49 $selectors = $this->parseSelectors($cssExpr);
50 foreach ($selectors as $index => $selector) {
51 if (null !== $selector->getPseudoElement()) {
52 throw new ExpressionErrorException('Pseudo-elements are not supported.');
53 }
54 $selectors[$index] = $this->selectorToXPath($selector, $prefix);
55 }
56 return \implode(' | ', $selectors);
57 }
58 public function selectorToXPath(SelectorNode $selector, string $prefix = 'descendant-or-self::') : string
59 {
60 return ($prefix ?: '') . $this->nodeToXPath($selector);
61 }
62 public function registerExtension(Extension\ExtensionInterface $extension) : self
63 {
64 $this->extensions[$extension->getName()] = $extension;
65 $this->nodeTranslators = \array_merge($this->nodeTranslators, $extension->getNodeTranslators());
66 $this->combinationTranslators = \array_merge($this->combinationTranslators, $extension->getCombinationTranslators());
67 $this->functionTranslators = \array_merge($this->functionTranslators, $extension->getFunctionTranslators());
68 $this->pseudoClassTranslators = \array_merge($this->pseudoClassTranslators, $extension->getPseudoClassTranslators());
69 $this->attributeMatchingTranslators = \array_merge($this->attributeMatchingTranslators, $extension->getAttributeMatchingTranslators());
70 return $this;
71 }
72 public function getExtension(string $name) : Extension\ExtensionInterface
73 {
74 if (!isset($this->extensions[$name])) {
75 throw new ExpressionErrorException(\sprintf('Extension "%s" not registered.', $name));
76 }
77 return $this->extensions[$name];
78 }
79 public function registerParserShortcut(ParserInterface $shortcut) : self
80 {
81 $this->shortcutParsers[] = $shortcut;
82 return $this;
83 }
84 public function nodeToXPath(NodeInterface $node) : XPathExpr
85 {
86 if (!isset($this->nodeTranslators[$node->getNodeName()])) {
87 throw new ExpressionErrorException(\sprintf('Node "%s" not supported.', $node->getNodeName()));
88 }
89 return $this->nodeTranslators[$node->getNodeName()]($node, $this);
90 }
91 public function addCombination(string $combiner, NodeInterface $xpath, NodeInterface $combinedXpath) : XPathExpr
92 {
93 if (!isset($this->combinationTranslators[$combiner])) {
94 throw new ExpressionErrorException(\sprintf('Combiner "%s" not supported.', $combiner));
95 }
96 return $this->combinationTranslators[$combiner]($this->nodeToXPath($xpath), $this->nodeToXPath($combinedXpath));
97 }
98 public function addFunction(XPathExpr $xpath, FunctionNode $function) : XPathExpr
99 {
100 if (!isset($this->functionTranslators[$function->getName()])) {
101 throw new ExpressionErrorException(\sprintf('Function "%s" not supported.', $function->getName()));
102 }
103 return $this->functionTranslators[$function->getName()]($xpath, $function);
104 }
105 public function addPseudoClass(XPathExpr $xpath, string $pseudoClass) : XPathExpr
106 {
107 if (!isset($this->pseudoClassTranslators[$pseudoClass])) {
108 throw new ExpressionErrorException(\sprintf('Pseudo-class "%s" not supported.', $pseudoClass));
109 }
110 return $this->pseudoClassTranslators[$pseudoClass]($xpath);
111 }
112 public function addAttributeMatching(XPathExpr $xpath, string $operator, string $attribute, ?string $value) : XPathExpr
113 {
114 if (!isset($this->attributeMatchingTranslators[$operator])) {
115 throw new ExpressionErrorException(\sprintf('Attribute matcher operator "%s" not supported.', $operator));
116 }
117 return $this->attributeMatchingTranslators[$operator]($xpath, $attribute, $value);
118 }
119 private function parseSelectors(string $css) : array
120 {
121 foreach ($this->shortcutParsers as $shortcut) {
122 $tokens = $shortcut->parse($css);
123 if (!empty($tokens)) {
124 return $tokens;
125 }
126 }
127 return $this->mainParser->parse($css);
128 }
129 }
130