vendor/bundles/Symfony/Bundle/AsseticBundle/Twig/AsseticNodeVisitor.php
author cavaliet
Tue, 15 Nov 2011 12:27:02 +0100
changeset 31 f457dd0e7a1e
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
First step to add context search to a page. Works fine but needs to be improved with several list of selectors.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Symfony framework.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * This source file is subject to the MIT license that is bundled
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * with this source code in the file LICENSE.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Symfony\Bundle\AsseticBundle\Twig;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Assetic\Extension\Twig\AsseticFilterFunction;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * Assetic node visitor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 * @author Kris Wallsmith <kris@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
class AsseticNodeVisitor implements \Twig_NodeVisitorInterface
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    public function enterNode(\Twig_NodeInterface $node, \Twig_Environment $env)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        return $node;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    public function leaveNode(\Twig_NodeInterface $node, \Twig_Environment $env)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        if (!$formula = $this->checkNode($node, $env)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
            return $node;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
        list($input, $filters, $options) = $formula;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
        $line = $node->getLine();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        // check context and call either asset() or path()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
        return new \Twig_Node_Expression_Conditional(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
            new \Twig_Node_Expression_GetAttr(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
                new \Twig_Node_Expression_Name('assetic', $line),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
                new \Twig_Node_Expression_Constant('use_controller', $line),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
                new \Twig_Node(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
                \Twig_TemplateInterface::ARRAY_CALL,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
                $line
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
            ),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
            new \Twig_Node_Expression_Function(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
                new \Twig_Node_Expression_Name('path', $line),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
                new \Twig_Node(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
                    new \Twig_Node_Expression_Constant('_assetic_'.$options['name'], $line),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
                )),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
                $line
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
            ),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
            new \Twig_Node_Expression_Function(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
                new \Twig_Node_Expression_Name('asset', $line),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
                new \Twig_Node(array($node, new \Twig_Node_Expression_Constant(isset($options['package']) ? $options['package'] : null, $line))),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
                $line
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
            ),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
            $line
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
     * Extracts formulae from filter function nodes.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
     * @return array|null The formula
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    private function checkNode(\Twig_NodeInterface $node, \Twig_Environment $env)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        if ($node instanceof \Twig_Node_Expression_Function) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
            $name = $node->getNode('name')->getAttribute('name');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            if ($env->getFunction($name) instanceof AsseticFilterFunction) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
                $arguments = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
                foreach ($node->getNode('arguments') as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
                    $arguments[] = eval('return '.$env->compile($argument).';');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
                $invoker = $env->getExtension('assetic')->getFilterInvoker($name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
                $factory = $invoker->getFactory();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
                $inputs = isset($arguments[0]) ? (array) $arguments[0] : array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
                $filters = $invoker->getFilters();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
                $options = array_replace($invoker->getOptions(), isset($arguments[1]) ? $arguments[1] : array());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
                if (!isset($options['name'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
                    $options['name'] = $factory->generateAssetName($inputs, $filters);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
                return array($inputs, $filters, $options);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    public function getPriority()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
        return 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
}