示例#1
0
 protected function getTest(Twig_Parser $parser, $line)
 {
     $stream = $parser->getStream();
     $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
     $env = $parser->getEnvironment();
     if ($stream->test(Twig_Token::NAME_TYPE)) {
         // try 2-words tests
         $name = $name . ' ' . $parser->getCurrentToken()->getValue();
         if ($test = $env->getTest($name)) {
             $parser->getStream()->next();
             return array($name, $test);
         }
     }
     if ($test = $env->getTest($name)) {
         return array($name, $test);
     }
     $e = new Twig_Error_Syntax(sprintf('Unknown "%s" test.', $name), $line, $parser->getFilename());
     $e->addSuggestions($name, array_keys($env->getTests()));
     throw $e;
 }
示例#2
0
文件: Parser.php 项目: vgrish/twiggy
 public function subparse($test, $dropNeedle = false)
 {
     $lineno = $this->getCurrentToken()->getLine();
     $rv = array();
     while (!$this->stream->isEOF()) {
         switch ($this->getCurrentToken()->getType()) {
             case Twig_Token::TEXT_TYPE:
                 $token = $this->stream->next();
                 $rv[] = new Twig_Node_Text($token->getValue(), $token->getLine());
                 break;
             case Twig_Token::VAR_START_TYPE:
                 $token = $this->stream->next();
                 $expr = $this->expressionParser->parseExpression();
                 $this->stream->expect(Twig_Token::VAR_END_TYPE);
                 $rv[] = new Twig_Node_Print($expr, $token->getLine());
                 break;
             case Twig_Token::BLOCK_START_TYPE:
                 $this->stream->next();
                 $token = $this->getCurrentToken();
                 if ($token->getType() !== Twig_Token::NAME_TYPE) {
                     throw new Twig_Error_Syntax('A block must start with a tag name.', $token->getLine(), $this->getFilename());
                 }
                 if (null !== $test && $test($token)) {
                     if ($dropNeedle) {
                         $this->stream->next();
                     }
                     if (1 === count($rv)) {
                         return $rv[0];
                     }
                     return new Twig_Node($rv, array(), $lineno);
                 }
                 if (!isset($this->handlers[$token->getValue()])) {
                     if (null !== $test) {
                         $e = new Twig_Error_Syntax(sprintf('Unexpected "%s" tag', $token->getValue()), $token->getLine(), $this->getFilename());
                         if (is_array($test) && isset($test[0]) && $test[0] instanceof Twig_TokenParserInterface) {
                             $e->appendMessage(sprintf(' (expecting closing tag for the "%s" tag defined near line %s).', $test[0]->getTag(), $lineno));
                         }
                     } else {
                         $e = new Twig_Error_Syntax(sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->getFilename());
                         $e->addSuggestions($token->getValue(), array_keys($this->env->getTags()));
                     }
                     throw $e;
                 }
                 $this->stream->next();
                 $subparser = $this->handlers[$token->getValue()];
                 $node = $subparser->parse($token);
                 if (null !== $node) {
                     $rv[] = $node;
                 }
                 break;
             default:
                 throw new Twig_Error_Syntax('Lexer or parser ended up in unsupported state.', 0, $this->getFilename());
         }
     }
     if (1 === count($rv)) {
         return $rv[0];
     }
     return new Twig_Node($rv, array(), $lineno);
 }
示例#3
0
 protected function getFilterNodeClass($name, $line)
 {
     $env = $this->parser->getEnvironment();
     if (false === ($filter = $env->getFilter($name))) {
         $e = new Twig_Error_Syntax(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getFilename());
         $e->addSuggestions($name, array_keys($env->getFilters()));
         throw $e;
     }
     if ($filter instanceof Twig_SimpleFilter && $filter->isDeprecated()) {
         $message = sprintf('Twig Filter "%s" is deprecated', $filter->getName());
         if ($filter->getAlternative()) {
             $message .= sprintf('. Use "%s" instead', $filter->getAlternative());
         }
         $message .= sprintf(' in %s at line %d.', $this->parser->getFilename(), $line);
         @trigger_error($message, E_USER_DEPRECATED);
     }
     if ($filter instanceof Twig_SimpleFilter) {
         return $filter->getNodeClass();
     }
     return $filter instanceof Twig_Filter_Node ? $filter->getClass() : 'Twig_Node_Expression_Filter';
 }
示例#4
0
 private function getFilterNodeClass($name, $line)
 {
     $env = $this->parser->getEnvironment();
     if (false === ($filter = $env->getFilter($name))) {
         $e = new Twig_Error_Syntax(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getFilename());
         $e->addSuggestions($name, array_keys($env->getFilters()));
         throw $e;
     }
     if ($filter->isDeprecated()) {
         $message = sprintf('Twig Filter "%s" is deprecated', $filter->getName());
         if (!is_bool($filter->getDeprecatedVersion())) {
             $message .= sprintf(' since version %s', $filter->getDeprecatedVersion());
         }
         if ($filter->getAlternative()) {
             $message .= sprintf('. Use "%s" instead', $filter->getAlternative());
         }
         $message .= sprintf(' in %s at line %d.', $this->parser->getFilename(), $line);
         @trigger_error($message, E_USER_DEPRECATED);
     }
     return $filter->getNodeClass();
 }