@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,161 @@
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\Escaper;
15
+ use Latte\Compiler\Nodes\AreaNode;
16
+ use Latte\Compiler\Nodes\Php\Expression\AssignNode;
17
+ use Latte\Compiler\Nodes\Php\Expression\VariableNode;
18
+ use Latte\Compiler\Nodes\Php\ModifierNode;
19
+ use Latte\Compiler\Nodes\Php\Scalar;
20
+ use Latte\Compiler\Nodes\StatementNode;
21
+ use Latte\Compiler\PrintContext;
22
+ use Latte\Compiler\Tag;
23
+ use Latte\Compiler\TemplateParser;
24
+ use Latte\Compiler\Token;
25
+ use Latte\Runtime\Template;
26
+
27
+
28
+ /**
29
+ * {block [local] [name]}
30
+ */
31
+ class BlockNode extends StatementNode
32
+ {
33
+ public ?Block $block = null;
34
+ public ModifierNode $modifier;
35
+ public AreaNode $content;
36
+
37
+
38
+ /** @return \Generator<int, ?array, array{AreaNode, ?Tag}, static|AreaNode> */
39
+ public static function create(Tag $tag, TemplateParser $parser): \Generator
40
+ {
41
+ $tag->outputMode = $tag::OutputRemoveIndentation;
42
+ $stream = $tag->parser->stream;
43
+ $node = new static;
44
+
45
+ if (!$stream->is('|', Token::End)) {
46
+ $layer = $tag->parser->tryConsumeModifier('local')
47
+ ? Template::LayerLocal
48
+ : $parser->blockLayer;
49
+ $stream->tryConsume('#');
50
+ $name = $tag->parser->parseUnquotedStringOrExpression();
51
+ $node->block = new Block($name, $layer, $tag);
52
+
53
+ if (!$node->block->isDynamic()) {
54
+ $parser->checkBlockIsUnique($node->block);
55
+ $tag->data->block = $node->block; // for {include}
56
+ }
57
+ }
58
+
59
+ $node->modifier = $tag->parser->parseModifier();
60
+ $node->modifier->escape = (bool) $node->modifier->filters;
61
+ if ($node->modifier->hasFilter('noescape') && count($node->modifier->filters) === 1) {
62
+ throw new CompileException('Filter |noescape is not expected here.', $tag->position);
63
+ }
64
+
65
+ [$node->content, $endTag] = yield;
66
+
67
+ if ($node->block && $endTag && $name instanceof Scalar\StringNode) {
68
+ $endTag->parser->stream->tryConsume($name->value);
69
+ }
70
+
71
+ return $node;
72
+ }
73
+
74
+
75
+ public function print(PrintContext $context): string
76
+ {
77
+ if (!$this->block) {
78
+ return $this->printFilter($context);
79
+
80
+ } elseif ($this->block->isDynamic()) {
81
+ return $this->printDynamic($context);
82
+ }
83
+
84
+ return $this->printStatic($context);
85
+ }
86
+
87
+
88
+ private function printFilter(PrintContext $context): string
89
+ {
90
+ return $context->format(
91
+ <<<'XX'
92
+ ob_start(fn() => '') %line;
93
+ try {
94
+ (function () { extract(func_get_arg(0));
95
+ %node
96
+ })(get_defined_vars());
97
+ } finally {
98
+ $ʟ_fi = new LR\FilterInfo(%dump);
99
+ echo %modifyContent(ob_get_clean());
100
+ }
101
+
102
+ XX,
103
+ $this->position,
104
+ $this->content,
105
+ $context->getEscaper()->export(),
106
+ $this->modifier,
107
+ );
108
+ }
109
+
110
+
111
+ private function printStatic(PrintContext $context): string
112
+ {
113
+ $this->modifier->escape = $this->modifier->escape || $context->getEscaper()->getState() === Escaper::HtmlAttribute;
114
+ $context->addBlock($this->block);
115
+ $this->block->content = $this->content->print($context); // must be compiled after is added
116
+
117
+ return $context->format(
118
+ '$this->renderBlock(%node, get_defined_vars()'
119
+ . ($this->modifier->filters || $this->modifier->escape
120
+ ? ', function ($s, $type) { $ʟ_fi = new LR\FilterInfo($type); return %modifyContent($s); }'
121
+ : '')
122
+ . ') %2.line;',
123
+ $this->block->name,
124
+ $this->modifier,
125
+ $this->position,
126
+ );
127
+ }
128
+
129
+
130
+ private function printDynamic(PrintContext $context): string
131
+ {
132
+ $context->addBlock($this->block);
133
+ $this->block->content = $this->content->print($context); // must be compiled after is added
134
+ $escaper = $context->getEscaper();
135
+ $this->modifier->escape = $this->modifier->escape || $escaper->getState() === Escaper::HtmlAttribute;
136
+
137
+ return $context->format(
138
+ '$this->addBlock(%node, %dump, [[$this, %dump]], %dump);
139
+ $this->renderBlock($ʟ_nm, get_defined_vars()'
140
+ . ($this->modifier->filters || $this->modifier->escape
141
+ ? ', function ($s, $type) { $ʟ_fi = new LR\FilterInfo($type); return %modifyContent($s); }'
142
+ : '')
143
+ . ');',
144
+ new AssignNode(new VariableNode('ʟ_nm'), $this->block->name),
145
+ $escaper->export(),
146
+ $this->block->method,
147
+ $this->block->layer,
148
+ $this->modifier,
149
+ );
150
+ }
151
+
152
+
153
+ public function &getIterator(): \Generator
154
+ {
155
+ if ($this->block) {
156
+ yield $this->block->name;
157
+ }
158
+ yield $this->modifier;
159
+ yield $this->content;
160
+ }
161
+ }
@@ -0,0 +1,98 @@
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\Escaper;
14
+ use Latte\Compiler\Node;
15
+ use Latte\Compiler\Nodes\AreaNode;
16
+ use Latte\Compiler\Nodes\Php\Expression;
17
+ use Latte\Compiler\Nodes\Php\ExpressionNode;
18
+ use Latte\Compiler\Nodes\Php\ModifierNode;
19
+ use Latte\Compiler\Nodes\StatementNode;
20
+ use Latte\Compiler\PrintContext;
21
+ use Latte\Compiler\Tag;
22
+
23
+
24
+ /**
25
+ * {capture $variable}
26
+ */
27
+ class CaptureNode extends StatementNode
28
+ {
29
+ public ExpressionNode $variable;
30
+ public ModifierNode $modifier;
31
+ public AreaNode $content;
32
+
33
+
34
+ /** @return \Generator<int, ?array, array{AreaNode, ?Tag}, static> */
35
+ public static function create(Tag $tag): \Generator
36
+ {
37
+ $tag->expectArguments();
38
+ $variable = $tag->parser->parseExpression();
39
+ if (!self::canBeAssignedTo($variable)) {
40
+ $text = '';
41
+ $i = 0;
42
+ while ($token = $tag->parser->stream->peek(--$i)) {
43
+ $text = $token->text . $text;
44
+ }
45
+
46
+ throw new CompileException("It is not possible to write into '$text' in " . $tag->getNotation(), $tag->position);
47
+ }
48
+ $node = new static;
49
+ $node->variable = $variable;
50
+ $node->modifier = $tag->parser->parseModifier();
51
+ [$node->content] = yield;
52
+ return $node;
53
+ }
54
+
55
+
56
+ public function print(PrintContext $context): string
57
+ {
58
+ $escaper = $context->getEscaper();
59
+ return $context->format(
60
+ <<<'XX'
61
+ ob_start(fn() => '') %line;
62
+ try {
63
+ %node
64
+ } finally {
65
+ $ʟ_tmp = %raw;
66
+ }
67
+ $ʟ_fi = new LR\FilterInfo(%dump); %node = %modifyContent($ʟ_tmp);
68
+
69
+
70
+ XX,
71
+ $this->position,
72
+ $this->content,
73
+ $escaper->getState() === Escaper::HtmlText
74
+ ? 'ob_get_length() ? new LR\Html(ob_get_clean()) : ob_get_clean()'
75
+ : 'ob_get_clean()',
76
+ $escaper->export(),
77
+ $this->variable,
78
+ $this->modifier,
79
+ );
80
+ }
81
+
82
+
83
+ private static function canBeAssignedTo(Node $node): bool
84
+ {
85
+ return $node instanceof Expression\VariableNode
86
+ || $node instanceof Expression\ArrayAccessNode
87
+ || $node instanceof Expression\PropertyFetchNode
88
+ || $node instanceof Expression\StaticPropertyFetchNode;
89
+ }
90
+
91
+
92
+ public function &getIterator(): \Generator
93
+ {
94
+ yield $this->variable;
95
+ yield $this->modifier;
96
+ yield $this->content;
97
+ }
98
+ }
@@ -0,0 +1,74 @@
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\StatementNode;
14
+ use Latte\Compiler\PrintContext;
15
+ use Latte\Compiler\Tag;
16
+ use Latte\Compiler\TemplateParser;
17
+ use Latte\ContentType;
18
+
19
+
20
+ /**
21
+ * {contentType ...}
22
+ */
23
+ class ContentTypeNode extends StatementNode
24
+ {
25
+ public string $contentType;
26
+ public ?string $mimeType = null;
27
+
28
+
29
+ public static function create(Tag $tag, TemplateParser $parser): static
30
+ {
31
+ $tag->expectArguments();
32
+ while (!$tag->parser->stream->consume()->isEnd());
33
+ $type = trim($tag->parser->text);
34
+
35
+ if (!$tag->isInHead() && !($tag->htmlElement?->name === 'script' && str_contains($type, 'html'))) {
36
+ throw new CompileException('{contentType} is allowed only in template header.', $tag->position);
37
+ }
38
+
39
+ $node = new static;
40
+ $node->contentType = match (true) {
41
+ str_contains($type, 'html') => ContentType::Html,
42
+ str_contains($type, 'xml') => ContentType::Xml,
43
+ str_contains($type, 'javascript') => ContentType::JavaScript,
44
+ str_contains($type, 'css') => ContentType::Css,
45
+ str_contains($type, 'calendar') => ContentType::ICal,
46
+ default => ContentType::Text
47
+ };
48
+ $parser->setContentType($node->contentType);
49
+
50
+ if (strpos($type, '/') && !$tag->htmlElement) {
51
+ $node->mimeType = $type;
52
+ }
53
+ return $node;
54
+ }
55
+
56
+
57
+ public function print(PrintContext $context): string
58
+ {
59
+ $context->beginEscape()->enterContentType($this->contentType);
60
+
61
+ return $this->mimeType
62
+ ? $context->format(
63
+ <<<'XX'
64
+ if (empty($this->global->coreCaptured) && in_array($this->getReferenceType(), ['extends', null], true)) {
65
+ header(%dump) %line;
66
+ }
67
+
68
+ XX,
69
+ 'Content-Type: ' . $this->mimeType,
70
+ $this->position,
71
+ )
72
+ : '';
73
+ }
74
+ }
@@ -0,0 +1,53 @@
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
+ * {debugbreak [$cond]}
20
+ */
21
+ class DebugbreakNode extends StatementNode
22
+ {
23
+ public ?ExpressionNode $condition;
24
+
25
+
26
+ public static function create(Tag $tag): static
27
+ {
28
+ $node = new static;
29
+ $node->condition = $tag->parser->isEnd() ? null : $tag->parser->parseExpression();
30
+ return $node;
31
+ }
32
+
33
+
34
+ public function print(PrintContext $context): string
35
+ {
36
+ if (function_exists($func = 'debugbreak') || function_exists($func = 'xdebug_break')) {
37
+ return $context->format(
38
+ ($this->condition ? 'if (%1.node) ' : '') . $func . '() %0.line;',
39
+ $this->position,
40
+ $this->condition,
41
+ );
42
+ }
43
+ return '';
44
+ }
45
+
46
+
47
+ public function &getIterator(): \Generator
48
+ {
49
+ if ($this->condition) {
50
+ yield $this->condition;
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,134 @@
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\Block;
13
+ use Latte\Compiler\Nodes\AreaNode;
14
+ use Latte\Compiler\Nodes\Php\Expression\AssignNode;
15
+ use Latte\Compiler\Nodes\Php\Expression\VariableNode;
16
+ use Latte\Compiler\Nodes\Php\ParameterNode;
17
+ use Latte\Compiler\Nodes\Php\Scalar;
18
+ use Latte\Compiler\Nodes\StatementNode;
19
+ use Latte\Compiler\PrintContext;
20
+ use Latte\Compiler\Tag;
21
+ use Latte\Compiler\TemplateParser;
22
+ use Latte\Compiler\Token;
23
+ use Latte\Runtime\Template;
24
+
25
+
26
+ /**
27
+ * {define [local] name}
28
+ */
29
+ class DefineNode extends StatementNode
30
+ {
31
+ public Block $block;
32
+ public AreaNode $content;
33
+
34
+
35
+ /** @return \Generator<int, ?array, array{AreaNode, ?Tag}, static> */
36
+ public static function create(Tag $tag, TemplateParser $parser): \Generator
37
+ {
38
+ $tag->expectArguments();
39
+ $layer = $tag->parser->tryConsumeModifier('local')
40
+ ? Template::LayerLocal
41
+ : $parser->blockLayer;
42
+ $tag->parser->stream->tryConsume('#');
43
+ $name = $tag->parser->parseUnquotedStringOrExpression();
44
+
45
+ $node = new static;
46
+ $node->block = new Block($name, $layer, $tag);
47
+ if (!$node->block->isDynamic()) {
48
+ $parser->checkBlockIsUnique($node->block);
49
+ $tag->data->block = $node->block; // for {include}
50
+ $tag->parser->stream->tryConsume(',');
51
+ $node->block->parameters = self::parseParameters($tag);
52
+ }
53
+
54
+ [$node->content, $endTag] = yield;
55
+ if ($endTag && $name instanceof Scalar\StringNode) {
56
+ $endTag->parser->stream->tryConsume($name->value);
57
+ }
58
+
59
+ return $node;
60
+ }
61
+
62
+
63
+ private static function parseParameters(Tag $tag): array
64
+ {
65
+ $stream = $tag->parser->stream;
66
+ $params = [];
67
+ while (!$stream->is(Token::End)) {
68
+ $type = $tag->parser->parseType();
69
+
70
+ $save = $stream->getIndex();
71
+ $expr = $stream->is(Token::Php_Variable) ? $tag->parser->parseExpression() : null;
72
+ if ($expr instanceof VariableNode && is_string($expr->name)) {
73
+ $params[] = new ParameterNode($expr, new Scalar\NullNode, $type);
74
+ } elseif (
75
+ $expr instanceof AssignNode
76
+ && $expr->var instanceof VariableNode
77
+ && is_string($expr->var->name)
78
+ ) {
79
+ $params[] = new ParameterNode($expr->var, $expr->expr, $type);
80
+ } else {
81
+ $stream->seek($save);
82
+ $stream->throwUnexpectedException(addendum: ' in ' . $tag->getNotation());
83
+ }
84
+
85
+ if (!$stream->tryConsume(',')) {
86
+ break;
87
+ }
88
+ }
89
+
90
+ return $params;
91
+ }
92
+
93
+
94
+ public function print(PrintContext $context): string
95
+ {
96
+ return $this->block->isDynamic()
97
+ ? $this->printDynamic($context)
98
+ : $this->printStatic($context);
99
+ }
100
+
101
+
102
+ private function printStatic(PrintContext $context): string
103
+ {
104
+ $context->addBlock($this->block);
105
+ $this->block->content = $this->content->print($context); // must be compiled after is added
106
+ return '';
107
+ }
108
+
109
+
110
+ private function printDynamic(PrintContext $context): string
111
+ {
112
+ $context->addBlock($this->block);
113
+ $this->block->content = $this->content->print($context); // must be compiled after is added
114
+
115
+ return $context->format(
116
+ '$this->addBlock(%node, %dump, [[$this, %dump]], %dump);',
117
+ new AssignNode(new VariableNode('ʟ_nm'), $this->block->name),
118
+ $context->getEscaper()->export(),
119
+ $this->block->method,
120
+ $this->block->layer,
121
+ );
122
+ }
123
+
124
+
125
+ public function &getIterator(): \Generator
126
+ {
127
+ yield $this->block->name;
128
+ foreach ($this->block->parameters as &$param) {
129
+ yield $param;
130
+ }
131
+
132
+ yield $this->content;
133
+ }
134
+ }
@@ -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
+ * {do expression}
20
+ */
21
+ class DoNode extends StatementNode
22
+ {
23
+ public ExpressionNode $expression;
24
+
25
+
26
+ public static function create(Tag $tag): static
27
+ {
28
+ $tag->expectArguments();
29
+ $node = new static;
30
+ $node->expression = $tag->parser->parseExpression();
31
+ return $node;
32
+ }
33
+
34
+
35
+ public function print(PrintContext $context): string
36
+ {
37
+ return $context->format(
38
+ '%node %line;',
39
+ $this->expression,
40
+ $this->position,
41
+ );
42
+ }
43
+
44
+
45
+ public function &getIterator(): \Generator
46
+ {
47
+ yield $this->expression;
48
+ }
49
+ }
@@ -0,0 +1,58 @@
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
+ * {dump [$var]}
20
+ */
21
+ class DumpNode extends StatementNode
22
+ {
23
+ public ?ExpressionNode $expression = null;
24
+
25
+
26
+ public static function create(Tag $tag): static
27
+ {
28
+ $node = new static;
29
+ $node->expression = $tag->parser->isEnd()
30
+ ? null
31
+ : $tag->parser->parseExpression();
32
+ return $node;
33
+ }
34
+
35
+
36
+ public function print(PrintContext $context): string
37
+ {
38
+ return $this->expression
39
+ ? $context->format(
40
+ 'Tracy\Debugger::barDump(%node, %dump) %line;',
41
+ $this->expression,
42
+ $this->expression->print($context),
43
+ $this->position,
44
+ )
45
+ : $context->format(
46
+ "Tracy\\Debugger::barDump(get_defined_vars(), 'variables') %line;",
47
+ $this->position,
48
+ );
49
+ }
50
+
51
+
52
+ public function &getIterator(): \Generator
53
+ {
54
+ if ($this->expression) {
55
+ yield $this->expression;
56
+ }
57
+ }
58
+ }