@vituum/vite-plugin-latte 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +39 -0
  2. package/handler.js +9 -0
  3. package/index.js +138 -0
  4. package/index.php +173 -0
  5. package/latte/AssetFilter.php +11 -0
  6. package/latte/FetchFunction.php +28 -0
  7. package/latte/IconFilter.php +14 -0
  8. package/latte/JsonTag.php +64 -0
  9. package/latte/PlaceholderFunction.php +11 -0
  10. package/latte/RandomColorFunction.php +14 -0
  11. package/latte/TelFilter.php +22 -0
  12. package/package.json +35 -0
  13. package/vendor/autoload.php +7 -0
  14. package/vendor/bin/latte-lint +107 -0
  15. package/vendor/composer/ClassLoader.php +572 -0
  16. package/vendor/composer/InstalledVersions.php +350 -0
  17. package/vendor/composer/LICENSE +21 -0
  18. package/vendor/composer/autoload_classmap.php +183 -0
  19. package/vendor/composer/autoload_namespaces.php +9 -0
  20. package/vendor/composer/autoload_psr4.php +9 -0
  21. package/vendor/composer/autoload_real.php +57 -0
  22. package/vendor/composer/autoload_static.php +193 -0
  23. package/vendor/composer/installed.json +93 -0
  24. package/vendor/composer/installed.php +32 -0
  25. package/vendor/composer/platform_check.php +26 -0
  26. package/vendor/latte/latte/bin/latte-lint +29 -0
  27. package/vendor/latte/latte/composer.json +53 -0
  28. package/vendor/latte/latte/license.md +60 -0
  29. package/vendor/latte/latte/ncs.php +14 -0
  30. package/vendor/latte/latte/ncs.xml +9 -0
  31. package/vendor/latte/latte/readme.md +21 -0
  32. package/vendor/latte/latte/src/Bridges/Tracy/BlueScreenPanel.php +114 -0
  33. package/vendor/latte/latte/src/Bridges/Tracy/LattePanel.php +99 -0
  34. package/vendor/latte/latte/src/Bridges/Tracy/templates/LattePanel.panel.phtml +98 -0
  35. package/vendor/latte/latte/src/Bridges/Tracy/templates/LattePanel.tab.phtml +15 -0
  36. package/vendor/latte/latte/src/Latte/Compiler/Block.php +44 -0
  37. package/vendor/latte/latte/src/Latte/Compiler/Escaper.php +244 -0
  38. package/vendor/latte/latte/src/Latte/Compiler/ExpressionBuilder.php +128 -0
  39. package/vendor/latte/latte/src/Latte/Compiler/Node.php +28 -0
  40. package/vendor/latte/latte/src/Latte/Compiler/NodeHelpers.php +132 -0
  41. package/vendor/latte/latte/src/Latte/Compiler/NodeTraverser.php +77 -0
  42. package/vendor/latte/latte/src/Latte/Compiler/Nodes/AreaNode.php +17 -0
  43. package/vendor/latte/latte/src/Latte/Compiler/Nodes/AuxiliaryNode.php +27 -0
  44. package/vendor/latte/latte/src/Latte/Compiler/Nodes/FragmentNode.php +59 -0
  45. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/AttributeNode.php +48 -0
  46. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/BogusTagNode.php +46 -0
  47. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/CommentNode.php +39 -0
  48. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/ElementNode.php +129 -0
  49. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/QuotedValue.php +53 -0
  50. package/vendor/latte/latte/src/Latte/Compiler/Nodes/NopNode.php +21 -0
  51. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ArgumentNode.php +45 -0
  52. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ComplexTypeNode.php +17 -0
  53. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ArrayAccessNode.php +41 -0
  54. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ArrayItemNode.php +52 -0
  55. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ArrayNode.php +94 -0
  56. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/AssignNode.php +39 -0
  57. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/AssignOpNode.php +45 -0
  58. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/BinaryOpNode.php +65 -0
  59. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/CastNode.php +43 -0
  60. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ClassConstantFetchNode.php +42 -0
  61. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/CloneNode.php +36 -0
  62. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ClosureNode.php +73 -0
  63. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ClosureUseNode.php +37 -0
  64. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ConstantFetchNode.php +37 -0
  65. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/EmptyNode.php +36 -0
  66. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ErrorSuppressNode.php +36 -0
  67. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FilterCallNode.php +39 -0
  68. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FunctionCallNode.php +45 -0
  69. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FunctionCallableNode.php +39 -0
  70. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/InRangeNode.php +42 -0
  71. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/InstanceofNode.php +40 -0
  72. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/IssetNode.php +40 -0
  73. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MatchNode.php +49 -0
  74. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MethodCallNode.php +50 -0
  75. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MethodCallableNode.php +42 -0
  76. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/NewNode.php +45 -0
  77. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/NotNode.php +36 -0
  78. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PostOpNode.php +43 -0
  79. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PreOpNode.php +43 -0
  80. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PropertyFetchNode.php +42 -0
  81. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticCallNode.php +55 -0
  82. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticCallableNode.php +47 -0
  83. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticPropertyFetchNode.php +42 -0
  84. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/TernaryNode.php +50 -0
  85. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/UnaryOpNode.php +45 -0
  86. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/VariableNode.php +40 -0
  87. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ExpressionNode.php +17 -0
  88. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/FilterNode.php +67 -0
  89. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/IdentifierNode.php +36 -0
  90. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/IntersectionTypeNode.php +39 -0
  91. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/MatchArmNode.php +45 -0
  92. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ModifierNode.php +107 -0
  93. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/NameNode.php +89 -0
  94. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/NullableTypeNode.php +35 -0
  95. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ParameterNode.php +54 -0
  96. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/BooleanNode.php +30 -0
  97. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/EncapsedStringNode.php +80 -0
  98. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/EncapsedStringPartNode.php +30 -0
  99. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/FloatNode.php +63 -0
  100. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/IntegerNode.php +70 -0
  101. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/NullNode.php +29 -0
  102. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/StringNode.php +40 -0
  103. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ScalarNode.php +15 -0
  104. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/SuperiorTypeNode.php +29 -0
  105. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/UnionTypeNode.php +39 -0
  106. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/VarLikeIdentifierNode.php +21 -0
  107. package/vendor/latte/latte/src/Latte/Compiler/Nodes/StatementNode.php +15 -0
  108. package/vendor/latte/latte/src/Latte/Compiler/Nodes/TemplateNode.php +34 -0
  109. package/vendor/latte/latte/src/Latte/Compiler/Nodes/TextNode.php +37 -0
  110. package/vendor/latte/latte/src/Latte/Compiler/PhpHelpers.php +227 -0
  111. package/vendor/latte/latte/src/Latte/Compiler/Position.php +43 -0
  112. package/vendor/latte/latte/src/Latte/Compiler/PrintContext.php +334 -0
  113. package/vendor/latte/latte/src/Latte/Compiler/Tag.php +117 -0
  114. package/vendor/latte/latte/src/Latte/Compiler/TagLexer.php +399 -0
  115. package/vendor/latte/latte/src/Latte/Compiler/TagParser.php +388 -0
  116. package/vendor/latte/latte/src/Latte/Compiler/TagParserData.php +580 -0
  117. package/vendor/latte/latte/src/Latte/Compiler/TemplateGenerator.php +206 -0
  118. package/vendor/latte/latte/src/Latte/Compiler/TemplateLexer.php +391 -0
  119. package/vendor/latte/latte/src/Latte/Compiler/TemplateParser.php +448 -0
  120. package/vendor/latte/latte/src/Latte/Compiler/TemplateParserHtml.php +506 -0
  121. package/vendor/latte/latte/src/Latte/Compiler/Token.php +259 -0
  122. package/vendor/latte/latte/src/Latte/Compiler/TokenStream.php +151 -0
  123. package/vendor/latte/latte/src/Latte/ContentType.php +22 -0
  124. package/vendor/latte/latte/src/Latte/Engine.php +591 -0
  125. package/vendor/latte/latte/src/Latte/Essential/Blueprint.php +160 -0
  126. package/vendor/latte/latte/src/Latte/Essential/CachingIterator.php +232 -0
  127. package/vendor/latte/latte/src/Latte/Essential/CoreExtension.php +232 -0
  128. package/vendor/latte/latte/src/Latte/Essential/Filters.php +591 -0
  129. package/vendor/latte/latte/src/Latte/Essential/Nodes/BlockNode.php +161 -0
  130. package/vendor/latte/latte/src/Latte/Essential/Nodes/CaptureNode.php +98 -0
  131. package/vendor/latte/latte/src/Latte/Essential/Nodes/ContentTypeNode.php +74 -0
  132. package/vendor/latte/latte/src/Latte/Essential/Nodes/DebugbreakNode.php +53 -0
  133. package/vendor/latte/latte/src/Latte/Essential/Nodes/DefineNode.php +134 -0
  134. package/vendor/latte/latte/src/Latte/Essential/Nodes/DoNode.php +49 -0
  135. package/vendor/latte/latte/src/Latte/Essential/Nodes/DumpNode.php +58 -0
  136. package/vendor/latte/latte/src/Latte/Essential/Nodes/EmbedNode.php +125 -0
  137. package/vendor/latte/latte/src/Latte/Essential/Nodes/ExtendsNode.php +60 -0
  138. package/vendor/latte/latte/src/Latte/Essential/Nodes/FirstLastSepNode.php +81 -0
  139. package/vendor/latte/latte/src/Latte/Essential/Nodes/ForNode.php +91 -0
  140. package/vendor/latte/latte/src/Latte/Essential/Nodes/ForeachNode.php +155 -0
  141. package/vendor/latte/latte/src/Latte/Essential/Nodes/IfChangedNode.php +141 -0
  142. package/vendor/latte/latte/src/Latte/Essential/Nodes/IfContentNode.php +82 -0
  143. package/vendor/latte/latte/src/Latte/Essential/Nodes/IfNode.php +180 -0
  144. package/vendor/latte/latte/src/Latte/Essential/Nodes/ImportNode.php +49 -0
  145. package/vendor/latte/latte/src/Latte/Essential/Nodes/IncludeBlockNode.php +140 -0
  146. package/vendor/latte/latte/src/Latte/Essential/Nodes/IncludeFileNode.php +81 -0
  147. package/vendor/latte/latte/src/Latte/Essential/Nodes/IterateWhileNode.php +94 -0
  148. package/vendor/latte/latte/src/Latte/Essential/Nodes/NAttrNode.php +105 -0
  149. package/vendor/latte/latte/src/Latte/Essential/Nodes/NClassNode.php +54 -0
  150. package/vendor/latte/latte/src/Latte/Essential/Nodes/NTagNode.php +79 -0
  151. package/vendor/latte/latte/src/Latte/Essential/Nodes/ParametersNode.php +84 -0
  152. package/vendor/latte/latte/src/Latte/Essential/Nodes/PrintNode.php +70 -0
  153. package/vendor/latte/latte/src/Latte/Essential/Nodes/RawPhpNode.php +46 -0
  154. package/vendor/latte/latte/src/Latte/Essential/Nodes/RollbackNode.php +37 -0
  155. package/vendor/latte/latte/src/Latte/Essential/Nodes/SkipNode.php +71 -0
  156. package/vendor/latte/latte/src/Latte/Essential/Nodes/SpacelessNode.php +62 -0
  157. package/vendor/latte/latte/src/Latte/Essential/Nodes/SwitchNode.php +118 -0
  158. package/vendor/latte/latte/src/Latte/Essential/Nodes/TemplatePrintNode.php +39 -0
  159. package/vendor/latte/latte/src/Latte/Essential/Nodes/TemplateTypeNode.php +38 -0
  160. package/vendor/latte/latte/src/Latte/Essential/Nodes/TraceNode.php +35 -0
  161. package/vendor/latte/latte/src/Latte/Essential/Nodes/TranslateNode.php +104 -0
  162. package/vendor/latte/latte/src/Latte/Essential/Nodes/TryNode.php +75 -0
  163. package/vendor/latte/latte/src/Latte/Essential/Nodes/VarNode.php +106 -0
  164. package/vendor/latte/latte/src/Latte/Essential/Nodes/VarPrintNode.php +40 -0
  165. package/vendor/latte/latte/src/Latte/Essential/Nodes/VarTypeNode.php +36 -0
  166. package/vendor/latte/latte/src/Latte/Essential/Nodes/WhileNode.php +81 -0
  167. package/vendor/latte/latte/src/Latte/Essential/Passes.php +115 -0
  168. package/vendor/latte/latte/src/Latte/Essential/RawPhpExtension.php +28 -0
  169. package/vendor/latte/latte/src/Latte/Essential/RollbackException.php +16 -0
  170. package/vendor/latte/latte/src/Latte/Essential/Tracer.php +117 -0
  171. package/vendor/latte/latte/src/Latte/Essential/TranslatorExtension.php +101 -0
  172. package/vendor/latte/latte/src/Latte/Extension.php +97 -0
  173. package/vendor/latte/latte/src/Latte/Helpers.php +96 -0
  174. package/vendor/latte/latte/src/Latte/Loader.php +37 -0
  175. package/vendor/latte/latte/src/Latte/Loaders/FileLoader.php +95 -0
  176. package/vendor/latte/latte/src/Latte/Loaders/StringLoader.php +76 -0
  177. package/vendor/latte/latte/src/Latte/Policy.php +24 -0
  178. package/vendor/latte/latte/src/Latte/PositionAwareException.php +50 -0
  179. package/vendor/latte/latte/src/Latte/Runtime/Block.php +24 -0
  180. package/vendor/latte/latte/src/Latte/Runtime/FilterExecutor.php +151 -0
  181. package/vendor/latte/latte/src/Latte/Runtime/FilterInfo.php +39 -0
  182. package/vendor/latte/latte/src/Latte/Runtime/Filters.php +234 -0
  183. package/vendor/latte/latte/src/Latte/Runtime/Html.php +35 -0
  184. package/vendor/latte/latte/src/Latte/Runtime/HtmlStringable.php +17 -0
  185. package/vendor/latte/latte/src/Latte/Runtime/Template.php +381 -0
  186. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/FunctionCallNode.php +30 -0
  187. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/FunctionCallableNode.php +29 -0
  188. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/MethodCallNode.php +32 -0
  189. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/MethodCallableNode.php +30 -0
  190. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/PropertyFetchNode.php +32 -0
  191. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/SandboxNode.php +73 -0
  192. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticCallNode.php +31 -0
  193. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticCallableNode.php +30 -0
  194. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticPropertyFetchNode.php +32 -0
  195. package/vendor/latte/latte/src/Latte/Sandbox/RuntimeChecker.php +116 -0
  196. package/vendor/latte/latte/src/Latte/Sandbox/SandboxExtension.php +132 -0
  197. package/vendor/latte/latte/src/Latte/Sandbox/SecurityPolicy.php +185 -0
  198. package/vendor/latte/latte/src/Latte/Strict.php +101 -0
  199. package/vendor/latte/latte/src/Latte/attributes.php +24 -0
  200. package/vendor/latte/latte/src/Latte/exceptions.php +69 -0
  201. package/vendor/latte/latte/src/Tools/Linter.php +175 -0
@@ -0,0 +1,82 @@
1
+ <?php
2
+
3
+ /**
4
+ * This file is part of the Latte (https://latte.nette.org)
5
+ * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace Latte\Essential\Nodes;
11
+
12
+ use Latte\CompileException;
13
+ use Latte\Compiler\Nodes\AreaNode;
14
+ use Latte\Compiler\Nodes\AuxiliaryNode;
15
+ use Latte\Compiler\Nodes\Html\ElementNode;
16
+ use Latte\Compiler\Nodes\StatementNode;
17
+ use Latte\Compiler\PrintContext;
18
+ use Latte\Compiler\Tag;
19
+ use Latte\Compiler\TemplateParser;
20
+
21
+
22
+ /**
23
+ * n:ifcontent
24
+ */
25
+ class IfContentNode extends StatementNode
26
+ {
27
+ public AreaNode $content;
28
+ public int $id;
29
+ public ElementNode $htmlElement;
30
+
31
+
32
+ /** @return \Generator<int, ?array, array{AreaNode, ?Tag}, static> */
33
+ public static function create(Tag $tag, TemplateParser $parser): \Generator
34
+ {
35
+ $node = new static;
36
+ $node->id = $parser->generateId();
37
+ [$node->content] = yield;
38
+ $node->htmlElement = $tag->htmlElement;
39
+ if (!$node->htmlElement->content) {
40
+ throw new CompileException("Unnecessary n:ifcontent on empty element <{$node->htmlElement->name}>", $tag->position);
41
+ }
42
+ return $node;
43
+ }
44
+
45
+
46
+ public function print(PrintContext $context): string
47
+ {
48
+ try {
49
+ $saved = $this->htmlElement->content;
50
+ $this->htmlElement->content = new AuxiliaryNode(fn() => <<<XX
51
+ ob_start();
52
+ try {
53
+ {$saved->print($context)}
54
+ } finally {
55
+ \$ʟ_ifc[$this->id] = rtrim(ob_get_flush()) === '';
56
+ }
57
+
58
+ XX);
59
+ return <<<XX
60
+ ob_start(fn() => '');
61
+ try {
62
+ {$this->content->print($context)}
63
+ } finally {
64
+ if (\$ʟ_ifc[$this->id] ?? null) {
65
+ ob_end_clean();
66
+ } else {
67
+ echo ob_get_clean();
68
+ }
69
+ }
70
+
71
+ XX;
72
+ } finally {
73
+ $this->htmlElement->content = $saved;
74
+ }
75
+ }
76
+
77
+
78
+ public function &getIterator(): \Generator
79
+ {
80
+ yield $this->content;
81
+ }
82
+ }
@@ -0,0 +1,180 @@
1
+ <?php
2
+
3
+ /**
4
+ * This file is part of the Latte (https://latte.nette.org)
5
+ * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace Latte\Essential\Nodes;
11
+
12
+ use Latte\CompileException;
13
+ use Latte\Compiler\ExpressionBuilder;
14
+ use Latte\Compiler\Nodes\AreaNode;
15
+ use Latte\Compiler\Nodes\Php\Expression;
16
+ use Latte\Compiler\Nodes\Php\ExpressionNode;
17
+ use Latte\Compiler\Nodes\Php\Scalar\StringNode;
18
+ use Latte\Compiler\Nodes\StatementNode;
19
+ use Latte\Compiler\Position;
20
+ use Latte\Compiler\PrintContext;
21
+ use Latte\Compiler\Tag;
22
+ use Latte\Compiler\TagParser;
23
+ use Latte\Compiler\TemplateParser;
24
+
25
+
26
+ /**
27
+ * {if $cond} & {elseif $cond} & {else}
28
+ * {if} & {/if $cond}
29
+ * {ifset $var} & {elseifset $var}
30
+ * {ifset block} & {elseifset block}
31
+ */
32
+ class IfNode extends StatementNode
33
+ {
34
+ public ExpressionNode $condition;
35
+ public AreaNode $then;
36
+ public ?AreaNode $else = null;
37
+ public ?Position $elseLine = null;
38
+ public bool $capture = false;
39
+ public bool $ifset = false;
40
+
41
+
42
+ /** @return \Generator<int, ?array, array{AreaNode, ?Tag}, static> */
43
+ public static function create(Tag $tag, TemplateParser $parser): \Generator
44
+ {
45
+ $node = new static;
46
+ $node->ifset = in_array($tag->name, ['ifset', 'elseifset'], true);
47
+ $node->capture = !$tag->isNAttribute() && $tag->name === 'if' && $tag->parser->isEnd();
48
+ $node->position = $tag->position;
49
+ if (!$node->capture) {
50
+ $node->condition = $node->ifset
51
+ ? self::buildCondition($tag->parser)
52
+ : $tag->parser->parseExpression();
53
+ }
54
+
55
+ [$node->then, $nextTag] = yield $node->capture ? ['else'] : ['else', 'elseif', 'elseifset'];
56
+
57
+ if ($nextTag?->name === 'else') {
58
+ if ($nextTag->parser->stream->is('if')) {
59
+ throw new CompileException('Arguments are not allowed in {else}, did you mean {elseif}?', $nextTag->position);
60
+ }
61
+ $node->elseLine = $nextTag->position;
62
+ [$node->else, $nextTag] = yield;
63
+
64
+ } elseif ($nextTag?->name === 'elseif' || $nextTag?->name === 'elseifset') {
65
+ if ($node->capture) {
66
+ throw new CompileException('Tag ' . $nextTag->getNotation() . ' is unexpected here.', $nextTag->position);
67
+ }
68
+ $node->else = yield from self::create($nextTag, $parser);
69
+ }
70
+
71
+ if ($node->capture) {
72
+ $node->condition = $nextTag->parser->parseExpression();
73
+ }
74
+
75
+ return $node;
76
+ }
77
+
78
+
79
+ private static function buildCondition(TagParser $parser): ExpressionNode
80
+ {
81
+ $list = [];
82
+ do {
83
+ $block = $parser->tryConsumeModifier('block') ?? $parser->stream->tryConsume('#');
84
+ $name = $parser->parseUnquotedStringOrExpression();
85
+ $list[] = $block || $name instanceof StringNode
86
+ ? ExpressionBuilder::variable('$this')->method('hasBlock', [$name])->build()
87
+ : new Expression\IssetNode([$name]);
88
+ } while ($parser->stream->tryConsume(','));
89
+
90
+ return Expression\BinaryOpNode::nest('&&', ...$list);
91
+ }
92
+
93
+
94
+ public function print(PrintContext $context): string
95
+ {
96
+ return $this->capture
97
+ ? $this->printCapturing($context)
98
+ : $this->printCommon($context);
99
+ }
100
+
101
+
102
+ private function printCommon(PrintContext $context): string
103
+ {
104
+ if ($this->else) {
105
+ return $context->format(
106
+ ($this->else instanceof self
107
+ ? "if (%node) %line { %node } else%node\n"
108
+ : "if (%node) %line { %node } else %4.line { %3.node }\n"),
109
+ $this->condition,
110
+ $this->position,
111
+ $this->then,
112
+ $this->else,
113
+ $this->elseLine,
114
+ );
115
+ }
116
+ return $context->format(
117
+ "if (%node) %line { %node }\n",
118
+ $this->condition,
119
+ $this->position,
120
+ $this->then,
121
+ );
122
+ }
123
+
124
+
125
+ private function printCapturing(PrintContext $context): string
126
+ {
127
+ if ($this->else) {
128
+ return $context->format(
129
+ <<<'XX'
130
+ ob_start(fn() => '') %line;
131
+ try {
132
+ %node
133
+ ob_start(fn() => '') %line;
134
+ try {
135
+ %node
136
+ } finally {
137
+ $ʟ_ifB = ob_get_clean();
138
+ }
139
+ } finally {
140
+ $ʟ_ifA = ob_get_clean();
141
+ }
142
+ echo (%node) ? $ʟ_ifA : $ʟ_ifB %0.line;
143
+
144
+
145
+ XX,
146
+ $this->position,
147
+ $this->then,
148
+ $this->elseLine,
149
+ $this->else,
150
+ $this->condition,
151
+ );
152
+ }
153
+
154
+ return $context->format(
155
+ <<<'XX'
156
+ ob_start(fn() => '') %line;
157
+ try {
158
+ %node
159
+ } finally {
160
+ $ʟ_ifA = ob_get_clean();
161
+ }
162
+ if (%node) %0.line { echo $ʟ_ifA; }
163
+
164
+ XX,
165
+ $this->position,
166
+ $this->then,
167
+ $this->condition,
168
+ );
169
+ }
170
+
171
+
172
+ public function &getIterator(): \Generator
173
+ {
174
+ yield $this->condition;
175
+ yield $this->then;
176
+ if ($this->else) {
177
+ yield $this->else;
178
+ }
179
+ }
180
+ }
@@ -0,0 +1,49 @@
1
+ <?php
2
+
3
+ /**
4
+ * This file is part of the Latte (https://latte.nette.org)
5
+ * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace Latte\Essential\Nodes;
11
+
12
+ use Latte\Compiler\Nodes\Php\ExpressionNode;
13
+ use Latte\Compiler\Nodes\StatementNode;
14
+ use Latte\Compiler\PrintContext;
15
+ use Latte\Compiler\Tag;
16
+
17
+
18
+ /**
19
+ * {import "file"}
20
+ */
21
+ class ImportNode extends StatementNode
22
+ {
23
+ public ExpressionNode $file;
24
+
25
+
26
+ public static function create(Tag $tag): static
27
+ {
28
+ $tag->expectArguments();
29
+ $node = new static;
30
+ $node->file = $tag->parser->parseUnquotedStringOrExpression();
31
+ return $node;
32
+ }
33
+
34
+
35
+ public function print(PrintContext $context): string
36
+ {
37
+ return $context->format(
38
+ '$this->createTemplate(%node, $this->params, "import")->render() %line;',
39
+ $this->file,
40
+ $this->position,
41
+ );
42
+ }
43
+
44
+
45
+ public function &getIterator(): \Generator
46
+ {
47
+ yield $this->file;
48
+ }
49
+ }
@@ -0,0 +1,140 @@
1
+ <?php
2
+
3
+ /**
4
+ * This file is part of the Latte (https://latte.nette.org)
5
+ * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace Latte\Essential\Nodes;
11
+
12
+ use Latte\CompileException;
13
+ use Latte\Compiler\Block;
14
+ use Latte\Compiler\Nodes\Php\Expression\ArrayNode;
15
+ use Latte\Compiler\Nodes\Php\ExpressionNode;
16
+ use Latte\Compiler\Nodes\Php\ModifierNode;
17
+ use Latte\Compiler\Nodes\Php\Scalar;
18
+ use Latte\Compiler\Nodes\StatementNode;
19
+ use Latte\Compiler\PhpHelpers;
20
+ use Latte\Compiler\PrintContext;
21
+ use Latte\Compiler\Tag;
22
+ use Latte\Compiler\TemplateParser;
23
+ use Latte\Runtime\Template;
24
+
25
+
26
+ /**
27
+ * {include [block] name [from file] [, args]}
28
+ */
29
+ class IncludeBlockNode extends StatementNode
30
+ {
31
+ public ExpressionNode $name;
32
+ public ?ExpressionNode $from = null;
33
+ public ArrayNode $args;
34
+ public ModifierNode $modifier;
35
+ public int|string|null $layer;
36
+ public bool $parent = false;
37
+
38
+ /** @var Block[][] */
39
+ public array $blocks;
40
+
41
+
42
+ public static function create(Tag $tag, TemplateParser $parser): static
43
+ {
44
+ $tag->outputMode = $tag::OutputRemoveIndentation;
45
+
46
+ $tag->expectArguments();
47
+ $node = new static;
48
+ $tag->parser->tryConsumeModifier('block') ?? $tag->parser->stream->tryConsume('#');
49
+ $node->name = $tag->parser->parseUnquotedStringOrExpression();
50
+ $tokenName = $tag->parser->stream->peek(-1);
51
+
52
+ $stream = $tag->parser->stream;
53
+ if ($stream->tryConsume('from')) {
54
+ $node->from = $tag->parser->parseUnquotedStringOrExpression();
55
+ $tag->parser->stream->tryConsume(',');
56
+ }
57
+
58
+ $stream->tryConsume(',');
59
+ $node->args = $tag->parser->parseArguments();
60
+ $node->modifier = $tag->parser->parseModifier();
61
+ $node->modifier->escape = (bool) $node->modifier->filters;
62
+
63
+ $node->parent = $tokenName->is('parent');
64
+ if ($node->parent && $node->modifier->filters) {
65
+ throw new CompileException('Filters are not allowed in {include parent}', $tag->position);
66
+
67
+ } elseif ($node->parent || $tokenName->is('this')) {
68
+ $item = $tag->closestTag(['block', 'define'], fn($item) => isset($item->data->block) && $item->data->block->name !== '');
69
+ if (!$item) {
70
+ throw new CompileException("Cannot include $tokenName->text block outside of any block.", $tag->position);
71
+ }
72
+
73
+ $node->name = $item->data->block->name;
74
+ }
75
+
76
+ $node->blocks = &$parser->blocks;
77
+ $node->layer = $parser->blockLayer;
78
+ return $node;
79
+ }
80
+
81
+
82
+ public function print(PrintContext $context): string
83
+ {
84
+ $noEscape = $this->modifier->hasFilter('noescape');
85
+ $modArg = count($this->modifier->filters) > (int) $noEscape
86
+ ? $context->format(
87
+ 'function ($s, $type) { $ʟ_fi = new LR\FilterInfo($type); return %modifyContent($s); }',
88
+ $this->modifier,
89
+ )
90
+ : ($noEscape || $this->parent ? '' : PhpHelpers::dump($context->getEscaper()->export()));
91
+
92
+ return $this->from
93
+ ? $this->printBlockFrom($context, $modArg)
94
+ : $this->printBlock($context, $modArg);
95
+ }
96
+
97
+
98
+ private function printBlock(PrintContext $context, string $modArg): string
99
+ {
100
+ if ($this->name instanceof Scalar\StringNode || $this->name instanceof Scalar\IntegerNode) {
101
+ $staticName = (string) $this->name->value;
102
+ $block = $this->blocks[$this->layer][$staticName] ?? $this->blocks[Template::LayerLocal][$staticName] ?? null;
103
+ }
104
+
105
+ return $context->format(
106
+ '$this->renderBlock' . ($this->parent ? 'Parent' : '')
107
+ . '(%node, %node? + '
108
+ . (isset($block) && !$block->parameters ? 'get_defined_vars()' : '[]')
109
+ . '%raw) %line;',
110
+ $this->name,
111
+ $this->args,
112
+ $modArg ? ", $modArg" : '',
113
+ $this->position,
114
+ );
115
+ }
116
+
117
+
118
+ private function printBlockFrom(PrintContext $context, string $modArg): string
119
+ {
120
+ return $context->format(
121
+ '$this->createTemplate(%node, %node? + $this->params, "include")->renderToContentType(%raw, %node) %line;',
122
+ $this->from,
123
+ $this->args,
124
+ $modArg,
125
+ $this->name,
126
+ $this->position,
127
+ );
128
+ }
129
+
130
+
131
+ public function &getIterator(): \Generator
132
+ {
133
+ yield $this->name;
134
+ if ($this->from) {
135
+ yield $this->from;
136
+ }
137
+ yield $this->args;
138
+ yield $this->modifier;
139
+ }
140
+ }
@@ -0,0 +1,81 @@
1
+ <?php
2
+
3
+ /**
4
+ * This file is part of the Latte (https://latte.nette.org)
5
+ * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace Latte\Essential\Nodes;
11
+
12
+ use Latte\Compiler\Nodes\Php\Expression\ArrayNode;
13
+ use Latte\Compiler\Nodes\Php\ExpressionNode;
14
+ use Latte\Compiler\Nodes\Php\ModifierNode;
15
+ use Latte\Compiler\Nodes\StatementNode;
16
+ use Latte\Compiler\PhpHelpers;
17
+ use Latte\Compiler\PrintContext;
18
+ use Latte\Compiler\Tag;
19
+
20
+
21
+ /**
22
+ * {include [file] "file" [with blocks] [,] [params]}
23
+ */
24
+ class IncludeFileNode extends StatementNode
25
+ {
26
+ public ExpressionNode $file;
27
+ public ArrayNode $args;
28
+ public ModifierNode $modifier;
29
+ public string $mode;
30
+
31
+
32
+ public static function create(Tag $tag): static
33
+ {
34
+ $tag->outputMode = $tag::OutputRemoveIndentation;
35
+
36
+ $tag->expectArguments();
37
+ $node = new static;
38
+ $tag->parser->tryConsumeModifier('file');
39
+ $node->file = $tag->parser->parseUnquotedStringOrExpression();
40
+ $node->mode = 'include';
41
+
42
+ $stream = $tag->parser->stream;
43
+ if ($stream->tryConsume('with')) {
44
+ $stream->consume('blocks');
45
+ $node->mode = 'includeblock';
46
+ }
47
+
48
+ $stream->tryConsume(',');
49
+ $node->args = $tag->parser->parseArguments();
50
+ $node->modifier = $tag->parser->parseModifier();
51
+ $node->modifier->escape = (bool) $node->modifier->filters;
52
+ return $node;
53
+ }
54
+
55
+
56
+ public function print(PrintContext $context): string
57
+ {
58
+ $noEscape = $this->modifier->hasFilter('noescape');
59
+ return $context->format(
60
+ '$this->createTemplate(%node, %node? + $this->params, %dump)->renderToContentType(%raw) %line;',
61
+ $this->file,
62
+ $this->args,
63
+ $this->mode,
64
+ count($this->modifier->filters) > (int) $noEscape
65
+ ? $context->format(
66
+ 'function ($s, $type) { $ʟ_fi = new LR\FilterInfo($type); return %modifyContent($s); }',
67
+ $this->modifier,
68
+ )
69
+ : PhpHelpers::dump($noEscape ? null : $context->getEscaper()->export()),
70
+ $this->position,
71
+ );
72
+ }
73
+
74
+
75
+ public function &getIterator(): \Generator
76
+ {
77
+ yield $this->file;
78
+ yield $this->args;
79
+ yield $this->modifier;
80
+ }
81
+ }
@@ -0,0 +1,94 @@
1
+ <?php
2
+
3
+ /**
4
+ * This file is part of the Latte (https://latte.nette.org)
5
+ * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace Latte\Essential\Nodes;
11
+
12
+ use Latte\CompileException;
13
+ use Latte\Compiler\Nodes\AreaNode;
14
+ use Latte\Compiler\Nodes\Php\ExpressionNode;
15
+ use Latte\Compiler\Nodes\StatementNode;
16
+ use Latte\Compiler\PrintContext;
17
+ use Latte\Compiler\Tag;
18
+
19
+
20
+ /**
21
+ * {iterateWhile $cond}
22
+ */
23
+ class IterateWhileNode extends StatementNode
24
+ {
25
+ public ExpressionNode $condition;
26
+ public AreaNode $content;
27
+ public ?ExpressionNode $key;
28
+ public ExpressionNode $value;
29
+ public bool $postTest;
30
+
31
+
32
+ /** @return \Generator<int, ?array, array{AreaNode, ?Tag}, static> */
33
+ public static function create(Tag $tag): \Generator
34
+ {
35
+ $foreach = $tag->closestTag(['foreach']);
36
+ if (!$foreach) {
37
+ throw new CompileException("Tag {{$tag->name}} must be inside {foreach} ... {/foreach}.", $tag->position);
38
+ }
39
+
40
+ $node = new static;
41
+ $node->postTest = $tag->parser->isEnd();
42
+ if (!$node->postTest) {
43
+ $node->condition = $tag->parser->parseExpression();
44
+ }
45
+
46
+ [$node->key, $node->value] = $foreach->data->iterateWhile;
47
+ [$node->content, $nextTag] = yield;
48
+ if ($node->postTest) {
49
+ $nextTag->expectArguments();
50
+ $node->condition = $nextTag->parser->parseExpression();
51
+ }
52
+
53
+ return $node;
54
+ }
55
+
56
+
57
+ public function print(PrintContext $context): string
58
+ {
59
+ $stmt = $context->format(
60
+ <<<'XX'
61
+ if (!$iterator->hasNext() || !(%node)) {
62
+ break;
63
+ }
64
+ $iterator->next();
65
+ [%node, %node] = [$iterator->key(), $iterator->current()];
66
+ XX,
67
+ $this->condition,
68
+ $this->key,
69
+ $this->value,
70
+ );
71
+
72
+ $stmt = $this->postTest
73
+ ? $this->content->print($context) . "\n" . $stmt
74
+ : $stmt . "\n" . $this->content->print($context);
75
+
76
+ return $context->format(
77
+ <<<'XX'
78
+ do %line {
79
+ %raw
80
+ } while (true);
81
+
82
+ XX,
83
+ $this->position,
84
+ $stmt,
85
+ );
86
+ }
87
+
88
+
89
+ public function &getIterator(): \Generator
90
+ {
91
+ yield $this->condition;
92
+ yield $this->content;
93
+ }
94
+ }