Skip to content

Commit

Permalink
[TwigBundle] split the route tag to 2 tags: path and url
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed Nov 3, 2010
1 parent c991b25 commit 1e13ecb
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 3 deletions.
11 changes: 8 additions & 3 deletions src/Symfony/Bundle/TwigBundle/Extension/TemplatingExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use Symfony\Bundle\TwigBundle\TokenParser\HelperTokenParser;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bundle\TwigBundle\TokenParser\IncludeTokenParser;
use Symfony\Bundle\TwigBundle\TokenParser\UrlTokenParser;
use Symfony\Bundle\TwigBundle\TokenParser\PathTokenParser;

/*
* This file is part of the Symfony package.
Expand Down Expand Up @@ -63,15 +65,18 @@ public function getTokenParsers()
// {% asset 'css/blog.css' %}
new HelperTokenParser('asset', '<location>', 'templating.helper.assets', 'getUrl'),

// {% route 'blog_post' with ['id': post.id] %}
new HelperTokenParser('route', '<route> [with <arguments:array>]', 'templating.helper.router', 'generate'),

// {% render 'BlogBundle:Post:list' with ['limit': 2], ['alt': 'BlogBundle:Post:error'] %}
new HelperTokenParser('render', '<template> [with <attributes:array>[, <options:array>]]', 'templating.helper.actions', 'render'),

// {% flash 'notice' %}
new HelperTokenParser('flash', '<name>', 'templating.helper.session', 'getFlash'),

// {% path 'blog_post' with ['id': post.id] %}
new PathTokenParser(),

// {% url 'blog_post' with ['id': post.id] %}
new UrlTokenParser(),

// {% include 'sometemplate.php' with ['something' : 'something2'] %}
new IncludeTokenParser(),
);
Expand Down
44 changes: 44 additions & 0 deletions src/Symfony/Bundle/TwigBundle/Node/RouteNode.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace Symfony\Bundle\TwigBundle\Node;

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

/**
*
*
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class RouteNode extends \Twig_Node
{
public function __construct(\Twig_NodeInterface $route, \Twig_Node_Expression $attributes = null, $absolute, $lineno, $tag = null)
{
parent::__construct(array('route' => $route, 'route_attributes' => $attributes), array('absolute' => $absolute), $lineno, $tag);
}

/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler A Twig_Compiler instance
*/
public function compile($compiler)
{
$compiler
->addDebugInfo($this)
->write('echo $this->env->getExtension(\'templating\')->getContainer()->get(\'router\')->generate(')
->subcompile($this->getNode('route'))
->raw(', ')
->subcompile($this->getNode('route_attributes'))
->raw(', ')
->raw($this->getAttribute('absolute') ? 'true' : 'false')
->raw(");")
;
}
}
62 changes: 62 additions & 0 deletions src/Symfony/Bundle/TwigBundle/TokenParser/PathTokenParser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

namespace Symfony\Bundle\TwigBundle\TokenParser;

use Symfony\Bundle\TwigBundle\Node\RouteNode;

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

/**
*
*
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class PathTokenParser extends \Twig_TokenParser
{
/**
* Parses a token and returns a node.
*
* @param \Twig_Token $token A Twig_Token instance
*
* @return \Twig_NodeInterface A Twig_NodeInterface instance
*/
public function parse(\Twig_Token $token)
{
$lineno = $token->getLine();
$stream = $this->parser->getStream();

$route = $this->parser->getExpressionParser()->parseExpression();

$attributes = null;
if ($stream->test('with')) {
$stream->next();
$attributes = $this->parser->getExpressionParser()->parseExpression();
}

$stream->expect(\Twig_Token::BLOCK_END_TYPE);

return new RouteNode($route, $attributes, $this->isAbsolute(), $lineno, $this->getTag());
}

protected function isAbsolute()
{
return false;
}

/**
* Gets the tag name associated with this token parser.
*
* @param string The tag name
*/
public function getTag()
{
return 'path';
}
}
37 changes: 37 additions & 0 deletions src/Symfony/Bundle/TwigBundle/TokenParser/UrlTokenParser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

namespace Symfony\Bundle\TwigBundle\TokenParser;

use Symfony\Bundle\TwigBundle\Node\RouteNode;

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

/**
*
*
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class UrlTokenParser extends PathTokenParser
{
protected function isAbsolute()
{
return true;
}

/**
* Gets the tag name associated with this token parser.
*
* @param string The tag name
*/
public function getTag()
{
return 'url';
}
}

0 comments on commit 1e13ecb

Please sign in to comment.