Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\CssSelector\XPath\Extension; Chris@0: Chris@0: use Symfony\Component\CssSelector\XPath\XPathExpr; Chris@0: Chris@0: /** Chris@0: * XPath expression translator combination extension. Chris@0: * Chris@0: * This component is a port of the Python cssselect library, Chris@0: * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. Chris@0: * Chris@0: * @author Jean-François Simon Chris@0: * Chris@0: * @internal Chris@0: */ Chris@0: class CombinationExtension extends AbstractExtension Chris@0: { Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getCombinationTranslators() Chris@0: { Chris@17: return [ Chris@17: ' ' => [$this, 'translateDescendant'], Chris@17: '>' => [$this, 'translateChild'], Chris@17: '+' => [$this, 'translateDirectAdjacent'], Chris@17: '~' => [$this, 'translateIndirectAdjacent'], Chris@17: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return XPathExpr Chris@0: */ Chris@0: public function translateDescendant(XPathExpr $xpath, XPathExpr $combinedXpath) Chris@0: { Chris@0: return $xpath->join('/descendant-or-self::*/', $combinedXpath); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return XPathExpr Chris@0: */ Chris@0: public function translateChild(XPathExpr $xpath, XPathExpr $combinedXpath) Chris@0: { Chris@0: return $xpath->join('/', $combinedXpath); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return XPathExpr Chris@0: */ Chris@0: public function translateDirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath) Chris@0: { Chris@0: return $xpath Chris@0: ->join('/following-sibling::', $combinedXpath) Chris@0: ->addNameTest() Chris@0: ->addCondition('position() = 1'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return XPathExpr Chris@0: */ Chris@0: public function translateIndirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath) Chris@0: { Chris@0: return $xpath->join('/following-sibling::', $combinedXpath); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getName() Chris@0: { Chris@0: return 'combination'; Chris@0: } Chris@0: }