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}