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\Node;
13
14/**
15 * Represents a combined node.
16 *
17 * This component is a port of the Python cssselect library,
18 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
19 *
20 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
21 *
22 * @internal
23 */
24class CombinedSelectorNode extends AbstractNode
25{
26    private $selector;
27    private $combinator;
28    private $subSelector;
29
30    public function __construct(NodeInterface $selector, string $combinator, NodeInterface $subSelector)
31    {
32        $this->selector = $selector;
33        $this->combinator = $combinator;
34        $this->subSelector = $subSelector;
35    }
36
37    public function getSelector(): NodeInterface
38    {
39        return $this->selector;
40    }
41
42    public function getCombinator(): string
43    {
44        return $this->combinator;
45    }
46
47    public function getSubSelector(): NodeInterface
48    {
49        return $this->subSelector;
50    }
51
52    /**
53     * {@inheritdoc}
54     */
55    public function getSpecificity(): Specificity
56    {
57        return $this->selector->getSpecificity()->plus($this->subSelector->getSpecificity());
58    }
59
60    public function __toString(): string
61    {
62        $combinator = ' ' === $this->combinator ? '<followed>' : $this->combinator;
63
64        return sprintf('%s[%s %s %s]', $this->getNodeName(), $this->selector, $combinator, $this->subSelector);
65    }
66}
67