friendship ended with social-app. php is my new best friend
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
12namespace Symfony\Component\CssSelector\XPath\Extension;
13
14use Symfony\Component\CssSelector\XPath\XPathExpr;
15
16/**
17 * XPath expression translator combination extension.
18 *
19 * This component is a port of the Python cssselect library,
20 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
21 *
22 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
23 *
24 * @internal
25 */
26class CombinationExtension extends AbstractExtension
27{
28 public function getCombinationTranslators(): array
29 {
30 return [
31 ' ' => $this->translateDescendant(...),
32 '>' => $this->translateChild(...),
33 '+' => $this->translateDirectAdjacent(...),
34 '~' => $this->translateIndirectAdjacent(...),
35 ];
36 }
37
38 public function translateDescendant(XPathExpr $xpath, XPathExpr $combinedXpath): XPathExpr
39 {
40 return $xpath->join('/descendant-or-self::*/', $combinedXpath);
41 }
42
43 public function translateChild(XPathExpr $xpath, XPathExpr $combinedXpath): XPathExpr
44 {
45 return $xpath->join('/', $combinedXpath);
46 }
47
48 public function translateDirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath): XPathExpr
49 {
50 return $xpath
51 ->join('/following-sibling::', $combinedXpath)
52 ->addNameTest()
53 ->addCondition('position() = 1');
54 }
55
56 public function translateIndirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath): XPathExpr
57 {
58 return $xpath->join('/following-sibling::', $combinedXpath);
59 }
60
61 public function getName(): string
62 {
63 return 'combination';
64 }
65}