A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					180 lines
				
				4.4 KiB
			
		
		
			
		
	
	
					180 lines
				
				4.4 KiB
			| 
								 
											7 years ago
										 
									 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								define('TWIGtagIni', 't');
							 | 
						||
| 
								 | 
							
								define('TWIGtagClose', 'endt');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class transTokenParser extends \Twig_TokenParser
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public function parse(\Twig_Token $token)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      $lineno = $token->getLine();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      $stream = $this->parser->getStream();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // recovers all inline parameters close to your tag name
							 | 
						||
| 
								 | 
							
								      $params = array_merge(array (), $this->getInlineParams($token));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      $continue = true;
							 | 
						||
| 
								 | 
							
								      while ($continue)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         // create subtree until the decidetransFork() callback returns true
							 | 
						||
| 
								 | 
							
								         $body = $this->parser->subparse(array ($this, 'decidetransFork'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         // I like to put a switch here, in case you need to add middle tags, such
							 | 
						||
| 
								 | 
							
								         // as: {% trans %}, {% nexttrans %}, {% endtrans %}.
							 | 
						||
| 
								 | 
							
								         $tag = $stream->next()->getValue();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         switch ($tag)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            case TWIGtagClose:
							 | 
						||
| 
								 | 
							
								               $continue = false;
							 | 
						||
| 
								 | 
							
								               break;
							 | 
						||
| 
								 | 
							
								            default:
							 | 
						||
| 
								 | 
							
								               throw new \Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags '.TWIGtagClose.' to close the '.TWIGtagIni.' block started at line %d)', $lineno), -1);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         // you want $body at the beginning of your arguments
							 | 
						||
| 
								 | 
							
								         array_unshift($params, $body);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         // if your endtrans can also contains params, you can uncomment this line:
							 | 
						||
| 
								 | 
							
								         // $params = array_merge($params, $this->getInlineParams($token));
							 | 
						||
| 
								 | 
							
								         // and comment this one:
							 | 
						||
| 
								 | 
							
								         $stream->expect(\Twig_Token::BLOCK_END_TYPE);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return new transNode(new \Twig_Node($params), $lineno, $this->getTag());
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   /**
							 | 
						||
| 
								 | 
							
								    * Recovers all tag parameters until we find a BLOCK_END_TYPE ( %} )
							 | 
						||
| 
								 | 
							
								    *
							 | 
						||
| 
								 | 
							
								    * @param \Twig_Token $token
							 | 
						||
| 
								 | 
							
								    * @return array
							 | 
						||
| 
								 | 
							
								    */
							 | 
						||
| 
								 | 
							
								   protected function getInlineParams(\Twig_Token $token)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      $stream = $this->parser->getStream();
							 | 
						||
| 
								 | 
							
								      $params = array ();
							 | 
						||
| 
								 | 
							
								      while (!$stream->test(\Twig_Token::BLOCK_END_TYPE))
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         $params[] = $this->parser->getExpressionParser()->parseExpression();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      $stream->expect(\Twig_Token::BLOCK_END_TYPE);
							 | 
						||
| 
								 | 
							
								      return $params;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   /**
							 | 
						||
| 
								 | 
							
								    * Callback called at each tag name when subparsing, must return
							 | 
						||
| 
								 | 
							
								    * true when the expected end tag is reached.
							 | 
						||
| 
								 | 
							
								    *
							 | 
						||
| 
								 | 
							
								    * @param \Twig_Token $token
							 | 
						||
| 
								 | 
							
								    * @return bool
							 | 
						||
| 
								 | 
							
								    */
							 | 
						||
| 
								 | 
							
								   public function decidetransFork(\Twig_Token $token)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return $token->test(array (TWIGtagClose));
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   /**
							 | 
						||
| 
								 | 
							
								    * Your tag name: if the parsed tag match the one you put here, your parse()
							 | 
						||
| 
								 | 
							
								    * method will be called.
							 | 
						||
| 
								 | 
							
								    *
							 | 
						||
| 
								 | 
							
								    * @return string
							 | 
						||
| 
								 | 
							
								    */
							 | 
						||
| 
								 | 
							
								   public function getTag()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return TWIGtagIni;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class transNode extends \Twig_Node
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public function __construct($params, $lineno = 0, $tag = null)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      parent::__construct(array ('params' => $params), array (), $lineno, $tag);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public function compile(\Twig_Compiler $compiler)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      $count = count($this->getNode('params'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      $compiler
							 | 
						||
| 
								 | 
							
								         ->addDebugInfo($this);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      for ($i = 0; ($i < $count); $i++)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         // argument is not an expression (such as, a \Twig_Node_Textbody)
							 | 
						||
| 
								 | 
							
								         // we should trick with output buffering to get a valid argument to pass
							 | 
						||
| 
								 | 
							
								         // to the functionToCall() function.
							 | 
						||
| 
								 | 
							
								         if (!($this->getNode('params')->getNode($i) instanceof \Twig_Node_Expression))
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            $compiler
							 | 
						||
| 
								 | 
							
								               ->write('ob_start();')
							 | 
						||
| 
								 | 
							
								               ->raw(PHP_EOL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $compiler
							 | 
						||
| 
								 | 
							
								               ->subcompile($this->getNode('params')->getNode($i));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $compiler
							 | 
						||
| 
								 | 
							
								               ->write('$_trans[] = ob_get_clean();')
							 | 
						||
| 
								 | 
							
								               ->raw(PHP_EOL);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         else
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            $compiler
							 | 
						||
| 
								 | 
							
								               ->write('$_trans[] = ')
							 | 
						||
| 
								 | 
							
								               ->subcompile($this->getNode('params')->getNode($i))
							 | 
						||
| 
								 | 
							
								               ->raw(';')
							 | 
						||
| 
								 | 
							
								               ->raw(PHP_EOL);
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      $compiler
							 | 
						||
| 
								 | 
							
								         ->write('call_user_func_array(')
							 | 
						||
| 
								 | 
							
								         ->string('traduzir')
							 | 
						||
| 
								 | 
							
								         ->raw(', $_trans);')
							 | 
						||
| 
								 | 
							
								         ->raw(PHP_EOL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      $compiler
							 | 
						||
| 
								 | 
							
								         ->write('unset($_trans);')
							 | 
						||
| 
								 | 
							
								         ->raw(PHP_EOL);
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class transExtension extends \Twig_Extension
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public function getTokenParsers()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return array (
							 | 
						||
| 
								 | 
							
								              new transTokenParser(),
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public function getName()
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      return TWIGtagIni;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function traduzir() {
							 | 
						||
| 
								 | 
							
									$params = func_get_args();
							 | 
						||
| 
								 | 
							
									$body = array_shift($params);
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									if (class_exists('Translate')) {
							 | 
						||
| 
								 | 
							
										$trans = new Translate();
							 | 
						||
| 
								 | 
							
										echo ($trans->translation($body)); 
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
										echo $body;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								}
							 |