Added: logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParser/Use.php URL: http://svn.apache.org/viewvc/logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParser/Use.php?rev=1341499&view=auto ============================================================================== --- logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParser/Use.php (added) +++ logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParser/Use.php Tue May 22 14:42:25 2012 @@ -0,0 +1,85 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2011 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Imports blocks defined in another template into the current template. + * + * <pre> + * {% extends "base.html" %} + * + * {% use "blocks.html" %} + * + * {% block title %}{% endblock %} + * {% block content %}{% endblock %} + * </pre> + * + * @see http://www.twig-project.org/doc/templates.html#horizontal-reuse for details. + */ +class Twig_TokenParser_Use 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) + { + $template = $this->parser->getExpressionParser()->parseExpression(); + + if (!$template instanceof Twig_Node_Expression_Constant) { + throw new Twig_Error_Syntax('The template references in a "use" statement must be a string.', $token->getLine()); + } + + $stream = $this->parser->getStream(); + + $targets = array(); + if ($stream->test('with')) { + $stream->next(); + + do { + $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + + $alias = $name; + if ($stream->test('as')) { + $stream->next(); + + $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + } + + $targets[$name] = new Twig_Node_Expression_Constant($alias, -1); + + if (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ',')) { + break; + } + + $stream->next(); + } while (true); + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + $this->parser->addTrait(new Twig_Node(array('template' => $template, 'targets' => new Twig_Node($targets)))); + + return null; + } + + /** + * Gets the tag name associated with this token parser. + * + * @return string The tag name + */ + public function getTag() + { + return 'use'; + } +}
Added: logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserBroker.php URL: http://svn.apache.org/viewvc/logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserBroker.php?rev=1341499&view=auto ============================================================================== --- logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserBroker.php (added) +++ logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserBroker.php Tue May 22 14:42:25 2012 @@ -0,0 +1,113 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * (c) 2010 Arnaud Le Blanc + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Default implementation of a token parser broker. + * + * @package twig + * @author Arnaud Le Blanc <[email protected]> + */ +class Twig_TokenParserBroker implements Twig_TokenParserBrokerInterface +{ + protected $parser; + protected $parsers = array(); + protected $brokers = array(); + + /** + * Constructor. + * + * @param array|Traversable $parsers A Traversable of Twig_TokenParserInterface instances + * @param array|Traversable $brokers A Traversable of Twig_TokenParserBrokerInterface instances + */ + public function __construct($parsers = array(), $brokers = array()) + { + foreach ($parsers as $parser) { + if (!$parser instanceof Twig_TokenParserInterface) { + throw new Twig_Error('$parsers must a an array of Twig_TokenParserInterface'); + } + $this->parsers[$parser->getTag()] = $parser; + } + foreach ($brokers as $broker) { + if (!$broker instanceof Twig_TokenParserBrokerInterface) { + throw new Twig_Error('$brokers must a an array of Twig_TokenParserBrokerInterface'); + } + $this->brokers[] = $broker; + } + } + + /** + * Adds a TokenParser. + * + * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance + */ + public function addTokenParser(Twig_TokenParserInterface $parser) + { + $this->parsers[$parser->getTag()] = $parser; + } + + /** + * Adds a TokenParserBroker. + * + * @param Twig_TokenParserBroker $broker A Twig_TokenParserBroker instance + */ + public function addTokenParserBroker(Twig_TokenParserBroker $broker) + { + $this->brokers[] = $broker; + } + + /** + * Gets a suitable TokenParser for a tag. + * + * First looks in parsers, then in brokers. + * + * @param string $tag A tag name + * + * @return null|Twig_TokenParserInterface A Twig_TokenParserInterface or null if no suitable TokenParser was found + */ + public function getTokenParser($tag) + { + if (isset($this->parsers[$tag])) { + return $this->parsers[$tag]; + } + $broker = end($this->brokers); + while (false !== $broker) { + $parser = $broker->getTokenParser($tag); + if (null !== $parser) { + return $parser; + } + $broker = prev($this->brokers); + } + + return null; + } + + public function getParsers() + { + return $this->parsers; + } + + public function getParser() + { + return $this->parser; + } + + public function setParser(Twig_ParserInterface $parser) + { + $this->parser = $parser; + foreach ($this->parsers as $tokenParser) { + $tokenParser->setParser($parser); + } + foreach ($this->brokers as $broker) { + $broker->setParser($parser); + } + } +} Added: logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserBrokerInterface.php URL: http://svn.apache.org/viewvc/logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserBrokerInterface.php?rev=1341499&view=auto ============================================================================== --- logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserBrokerInterface.php (added) +++ logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserBrokerInterface.php Tue May 22 14:42:25 2012 @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * (c) 2010 Arnaud Le Blanc + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Interface implemented by token parser brokers. + * + * Token parser brokers allows to implement custom logic in the process of resolving a token parser for a given tag name. + * + * @package twig + * @author Arnaud Le Blanc <[email protected]> + */ +interface Twig_TokenParserBrokerInterface +{ + /** + * Gets a TokenParser suitable for a tag. + * + * @param string $tag A tag name + * + * @return null|Twig_TokenParserInterface A Twig_TokenParserInterface or null if no suitable TokenParser was found + */ + function getTokenParser($tag); + + /** + * Calls Twig_TokenParserInterface::setParser on all parsers the implementation knows of. + * + * @param Twig_ParserInterface $parser A Twig_ParserInterface interface + */ + function setParser(Twig_ParserInterface $parser); + + /** + * Gets the Twig_ParserInterface. + * + * @return null|Twig_ParserInterface A Twig_ParserInterface instance or null + */ + function getParser(); +} Added: logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserInterface.php URL: http://svn.apache.org/viewvc/logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserInterface.php?rev=1341499&view=auto ============================================================================== --- logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserInterface.php (added) +++ logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenParserInterface.php Tue May 22 14:42:25 2012 @@ -0,0 +1,42 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2010 Fabien Potencier + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Interface implemented by token parsers. + * + * @package twig + * @author Fabien Potencier <[email protected]> + */ +interface Twig_TokenParserInterface +{ + /** + * Sets the parser associated with this token parser + * + * @param $parser A Twig_Parser instance + */ + function setParser(Twig_Parser $parser); + + /** + * Parses a token and returns a node. + * + * @param Twig_Token $token A Twig_Token instance + * + * @return Twig_NodeInterface A Twig_NodeInterface instance + */ + function parse(Twig_Token $token); + + /** + * Gets the tag name associated with this token parser. + * + * @return string The tag name + */ + function getTag(); +} Added: logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenStream.php URL: http://svn.apache.org/viewvc/logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenStream.php?rev=1341499&view=auto ============================================================================== --- logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenStream.php (added) +++ logging/site/branches/experimental-twig-textile/libs/Twig/lib/Twig/TokenStream.php Tue May 22 14:42:25 2012 @@ -0,0 +1,145 @@ +<?php + +/* + * This file is part of Twig. + * + * (c) 2009 Fabien Potencier + * (c) 2009 Armin Ronacher + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Represents a token stream. + * + * @package twig + * @author Fabien Potencier <[email protected]> + */ +class Twig_TokenStream +{ + protected $tokens; + protected $current; + protected $filename; + + /** + * Constructor. + * + * @param array $tokens An array of tokens + * @param string $filename The name of the filename which tokens are associated with + */ + public function __construct(array $tokens, $filename = null) + { + $this->tokens = $tokens; + $this->current = 0; + $this->filename = $filename; + } + + /** + * Returns a string representation of the token stream. + * + * @return string + */ + public function __toString() + { + return implode("\n", $this->tokens); + } + + public function injectTokens(array $tokens) + { + $this->tokens = array_merge(array_slice($this->tokens, 0, $this->current), $tokens, array_slice($this->tokens, $this->current)); + } + + /** + * Sets the pointer to the next token and returns the old one. + * + * @return Twig_Token + */ + public function next() + { + if (!isset($this->tokens[++$this->current])) { + throw new Twig_Error_Syntax('Unexpected end of template', -1, $this->filename); + } + + return $this->tokens[$this->current - 1]; + } + + /** + * Tests a token and returns it or throws a syntax error. + * + * @return Twig_Token + */ + public function expect($type, $value = null, $message = null) + { + $token = $this->tokens[$this->current]; + if (!$token->test($type, $value)) { + $line = $token->getLine(); + throw new Twig_Error_Syntax(sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s)', + $message ? $message.'. ' : '', + Twig_Token::typeToEnglish($token->getType(), $line), $token->getValue(), + Twig_Token::typeToEnglish($type, $line), $value ? sprintf(' with value "%s"', $value) : ''), + $line, + $this->filename + ); + } + $this->next(); + + return $token; + } + + /** + * Looks at the next token. + * + * @param integer $number + * + * @return Twig_Token + */ + public function look($number = 1) + { + if (!isset($this->tokens[$this->current + $number])) { + throw new Twig_Error_Syntax('Unexpected end of template', -1, $this->filename); + } + + return $this->tokens[$this->current + $number]; + } + + /** + * Tests the current token + * + * @return bool + */ + public function test($primary, $secondary = null) + { + return $this->tokens[$this->current]->test($primary, $secondary); + } + + /** + * Checks if end of stream was reached + * + * @return bool + */ + public function isEOF() + { + return $this->tokens[$this->current]->getType() === Twig_Token::EOF_TYPE; + } + + /** + * Gets the current token + * + * @return Twig_Token + */ + public function getCurrent() + { + return $this->tokens[$this->current]; + } + + /** + * Gets the filename associated with this stream + * + * @return string + */ + public function getFilename() + { + return $this->filename; + } +} Added: logging/site/branches/experimental-twig-textile/libs/Twig/package.xml.tpl URL: http://svn.apache.org/viewvc/logging/site/branches/experimental-twig-textile/libs/Twig/package.xml.tpl?rev=1341499&view=auto ============================================================================== --- logging/site/branches/experimental-twig-textile/libs/Twig/package.xml.tpl (added) +++ logging/site/branches/experimental-twig-textile/libs/Twig/package.xml.tpl Tue May 22 14:42:25 2012 @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?> +<package packagerversion="1.8.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 + http://pear.php.net/dtd/tasks-1.0.xsd + http://pear.php.net/dtd/package-2.0 + http://pear.php.net/dtd/package-2.0.xsd"> + <name>Twig</name> + <channel>pear.twig-project.org</channel> + <summary>Twig is a PHP template engine.</summary> + <description> + Twig is a template language for PHP, released under the new BSD license + (code and documentation). + + Twig uses a syntax similar to the Django and Jinja template languages which + inspired the Twig runtime environment. + </description> + <lead> + <name>Fabien Potencier</name> + <user>fabpot</user> + <email>[email protected]</email> + <active>yes</active> + </lead> + <lead> + <name>Armin Ronacher</name> + <user>armin</user> + <email>[email protected]</email> + <active>no</active> + </lead> + <date>{{ date }}</date> + <time>{{ time }}</time> + <version> + <release>{{ version }}</release> + <api>{{ api_version }}</api> + </version> + <stability> + <release>{{ stability }}</release> + <api>{{ stability }}</api> + </stability> + <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license> + <notes>-</notes> + <contents> + <dir name="/"> + <file name="AUTHORS" role="doc" /> + <file name="CHANGELOG" role="doc" /> + <file name="LICENSE" role="doc" /> + <file name="README.markdown" role="doc" /> + <dir name="lib"> + <dir name="Twig"> +{{ files }} + </dir> + </dir> + </dir> + </contents> + <dependencies> + <required> + <php> + <min>5.2.4</min> + </php> + <pearinstaller> + <min>1.4.0</min> + </pearinstaller> + </required> + </dependencies> + <phprelease /> +</package> Added: logging/site/branches/experimental-twig-textile/libs/Twig/phpunit.xml.dist URL: http://svn.apache.org/viewvc/logging/site/branches/experimental-twig-textile/libs/Twig/phpunit.xml.dist?rev=1341499&view=auto ============================================================================== --- logging/site/branches/experimental-twig-textile/libs/Twig/phpunit.xml.dist (added) +++ logging/site/branches/experimental-twig-textile/libs/Twig/phpunit.xml.dist Tue May 22 14:42:25 2012 @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<phpunit backupGlobals="false" + backupStaticAttributes="false" + colors="true" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true" + processIsolation="false" + stopOnFailure="false" + syntaxCheck="false" + bootstrap="test/bootstrap.php" +> + <testsuites> + <testsuite name="Twig Test Suite"> + <directory>./test/Twig/</directory> + </testsuite> + </testsuites> + + <filter> + <whitelist> + <directory suffix=".php">./lib/Twig/</directory> + </whitelist> + </filter> +</phpunit>
