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
14use Symfony\Component\CssSelector\Parser\Token;
15
16/**
17 * Represents a "<selector>:<name>(<arguments>)" node.
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 FunctionNode extends AbstractNode
27{
28    private $selector;
29    private $name;
30    private $arguments;
31
32    /**
33     * @param Token[] $arguments
34     */
35    public function __construct(NodeInterface $selector, string $name, array $arguments = [])
36    {
37        $this->selector = $selector;
38        $this->name = strtolower($name);
39        $this->arguments = $arguments;
40    }
41
42    public function getSelector(): NodeInterface
43    {
44        return $this->selector;
45    }
46
47    public function getName(): string
48    {
49        return $this->name;
50    }
51
52    /**
53     * @return Token[]
54     */
55    public function getArguments(): array
56    {
57        return $this->arguments;
58    }
59
60    /**
61     * {@inheritdoc}
62     */
63    public function getSpecificity(): Specificity
64    {
65        return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0));
66    }
67
68    public function __toString(): string
69    {
70        $arguments = implode(', ', array_map(function (Token $token) {
71            return "'".$token->getValue()."'";
72        }, $this->arguments));
73
74        return sprintf('%s[%s:%s(%s)]', $this->getNodeName(), $this->selector, $this->name, $arguments ? '['.$arguments.']' : '');
75    }
76}
77