Optimizer.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. /**
  3. * @link http://www.yiiframework.com/
  4. * @copyright Copyright (c) 2008 Yii Software LLC
  5. * @license http://www.yiiframework.com/license/
  6. */
  7. namespace yii\twig;
  8. /**
  9. * Optimizer removes echo before special functions call and injects function name as an argument for the view helper
  10. * calls.
  11. *
  12. * @author Andrey Grachov <andrey.grachov@gmail.com>
  13. * @author Alexander Makarov <sam@rmcreative.ru>
  14. */
  15. class Optimizer implements \Twig_NodeVisitorInterface
  16. {
  17. /**
  18. * @inheritdoc
  19. */
  20. public function enterNode(\Twig_Node $node, \Twig_Environment $env)
  21. {
  22. return $node;
  23. }
  24. /**
  25. * @inheritdoc
  26. */
  27. public function leaveNode(\Twig_Node $node, \Twig_Environment $env)
  28. {
  29. if ($node instanceof \Twig_Node_Print) {
  30. $expression = $node->getNode('expr');
  31. if ($expression instanceof \Twig_Node_Expression_Function) {
  32. $name = $expression->getAttribute('name');
  33. if (preg_match('/^(?:register_.+_asset|use|.+_begin|.+_end)$/', $name)) {
  34. return new \Twig_Node_Do($expression, $expression->getTemplateLine());
  35. } elseif (in_array($name, ['begin_page', 'end_page', 'begin_body', 'end_body', 'head'])) {
  36. $arguments = [
  37. new \Twig_Node_Expression_Constant($name, $expression->getTemplateLine()),
  38. ];
  39. if ($expression->hasNode('arguments') && $expression->getNode('arguments') !== null) {
  40. foreach ($expression->getNode('arguments') as $key => $value) {
  41. if (is_int($key)) {
  42. $arguments[] = $value;
  43. } else {
  44. $arguments[$key] = $value;
  45. }
  46. }
  47. }
  48. $expression->setNode('arguments', new \Twig_Node($arguments));
  49. return new \Twig_Node_Do($expression, $expression->getTemplateLine());
  50. }
  51. }
  52. }
  53. return $node;
  54. }
  55. /**
  56. * @inheritdoc
  57. */
  58. public function getPriority()
  59. {
  60. return 100;
  61. }
  62. }