@vituum/vite-plugin-latte 2.0.0-next.4 → 2.0.0
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.
- package/README.md +1 -1
- package/index.js +4 -2
- package/package.json +11 -9
- package/types/index.d.ts +1 -1
- package/vendor/autoload.php +1 -4
- package/vendor/composer/InstalledVersions.php +36 -2
- package/vendor/composer/autoload_classmap.php +14 -15
- package/vendor/composer/autoload_psr4.php +2 -0
- package/vendor/composer/autoload_static.php +38 -15
- package/vendor/composer/installed.json +32 -22
- package/vendor/composer/installed.php +12 -12
- package/vendor/composer/platform_check.php +4 -5
- package/vendor/latte/latte/bin/latte-lint +10 -3
- package/vendor/latte/latte/composer.json +16 -6
- package/vendor/latte/latte/src/Bridges/Tracy/BlueScreenPanel.php +13 -38
- package/vendor/latte/latte/src/Bridges/Tracy/LattePanel.php +9 -7
- package/vendor/latte/latte/src/Bridges/Tracy/TracyExtension.php +2 -4
- package/vendor/latte/latte/src/Bridges/Tracy/dist/panel.phtml +94 -0
- package/vendor/latte/latte/src/Bridges/Tracy/dist/tab.phtml +10 -0
- package/vendor/latte/latte/src/Latte/Compiler/Block.php +4 -6
- package/vendor/latte/latte/src/Latte/Compiler/Escaper.php +67 -86
- package/vendor/latte/latte/src/Latte/Compiler/Node.php +6 -3
- package/vendor/latte/latte/src/Latte/Compiler/NodeHelpers.php +16 -6
- package/vendor/latte/latte/src/Latte/Compiler/NodeTraverser.php +25 -12
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/AreaNode.php +7 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/AuxiliaryNode.php +5 -4
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/FragmentNode.php +8 -4
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/AttributeNode.php +7 -15
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/BogusTagNode.php +4 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/CommentNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/ElementNode.php +37 -67
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/ExpressionAttributeNode.php +60 -0
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/TagNode.php +70 -0
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/NopNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ArgumentNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ArrayItemNode.php +4 -15
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ClosureUseNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ComplexTypeNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ArrayAccessNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ArrayNode.php +6 -22
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/AssignNode.php +18 -5
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/AssignOpNode.php +18 -7
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/AuxiliaryNode.php +5 -4
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/BinaryOpNode.php +38 -9
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/CastNode.php +14 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ClassConstantFetchNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/CloneNode.php +12 -4
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ClosureNode.php +10 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ConstantFetchNode.php +7 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/EmptyNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FilterCallNode.php +10 -4
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FunctionCallNode.php +14 -5
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/InNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/InstanceofNode.php +14 -5
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/IssetNode.php +6 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MatchNode.php +6 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MethodCallNode.php +18 -5
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/NewNode.php +14 -4
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PostOpNode.php +14 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PreOpNode.php +14 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PropertyFetchNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticMethodCallNode.php +14 -15
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticPropertyFetchNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/TemporaryNode.php +7 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/TernaryNode.php +16 -11
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/UnaryOpNode.php +19 -9
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/VariableNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ExpressionNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/FilterNode.php +33 -8
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/IdentifierNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/InterpolatedStringPartNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/IntersectionTypeNode.php +6 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ListItemNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ListNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/MatchArmNode.php +6 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ModifierNode.php +29 -41
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/NameNode.php +9 -4
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/NullableTypeNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/OperatorNode.php +27 -0
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ParameterNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/BooleanNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/FloatNode.php +9 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/IntegerNode.php +8 -6
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/InterpolatedStringNode.php +9 -5
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/NullNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/StringNode.php +6 -4
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ScalarNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/SuperiorTypeNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/UnionTypeNode.php +6 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/VarLikeIdentifierNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/{Expression/NotNode.php → VariadicPlaceholderNode.php} +9 -9
- package/vendor/latte/latte/src/Latte/{Essential → Compiler}/Nodes/PrintNode.php +9 -15
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/StatementNode.php +7 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/TemplateNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/TextNode.php +6 -4
- package/vendor/latte/latte/src/Latte/Compiler/PhpHelpers.php +32 -18
- package/vendor/latte/latte/src/Latte/Compiler/Position.php +7 -7
- package/vendor/latte/latte/src/Latte/Compiler/PrintContext.php +72 -104
- package/vendor/latte/latte/src/Latte/Compiler/Tag.php +17 -16
- package/vendor/latte/latte/src/Latte/Compiler/TagLexer.php +11 -8
- package/vendor/latte/latte/src/Latte/Compiler/TagParser.php +28 -23
- package/vendor/latte/latte/src/Latte/Compiler/TagParserData.php +360 -336
- package/vendor/latte/latte/src/Latte/Compiler/TemplateGenerator.php +49 -38
- package/vendor/latte/latte/src/Latte/Compiler/TemplateLexer.php +37 -12
- package/vendor/latte/latte/src/Latte/Compiler/TemplateParser.php +35 -21
- package/vendor/latte/latte/src/Latte/Compiler/TemplateParserHtml.php +121 -71
- package/vendor/latte/latte/src/Latte/Compiler/Token.php +79 -70
- package/vendor/latte/latte/src/Latte/Compiler/TokenStream.php +21 -14
- package/vendor/latte/latte/src/Latte/ContentType.php +4 -3
- package/vendor/latte/latte/src/Latte/Engine.php +147 -188
- package/vendor/latte/latte/src/Latte/Essential/AuxiliaryIterator.php +5 -7
- package/vendor/latte/latte/src/Latte/Essential/Blueprint.php +5 -5
- package/vendor/latte/latte/src/Latte/Essential/CachingIterator.php +5 -4
- package/vendor/latte/latte/src/Latte/Essential/CoreExtension.php +155 -127
- package/vendor/latte/latte/src/Latte/Essential/Filters.php +99 -44
- package/vendor/latte/latte/src/Latte/Essential/Nodes/BlockNode.php +14 -13
- package/vendor/latte/latte/src/Latte/Essential/Nodes/CaptureNode.php +5 -6
- package/vendor/latte/latte/src/Latte/Essential/Nodes/ContentTypeNode.php +3 -4
- package/vendor/latte/latte/src/Latte/Essential/Nodes/CustomFunctionCallNode.php +46 -0
- package/vendor/latte/latte/src/Latte/Essential/Nodes/DebugbreakNode.php +2 -3
- package/vendor/latte/latte/src/Latte/Essential/Nodes/DefineNode.php +10 -7
- package/vendor/latte/latte/src/Latte/Essential/Nodes/DoNode.php +3 -4
- package/vendor/latte/latte/src/Latte/Essential/Nodes/DumpNode.php +2 -3
- package/vendor/latte/latte/src/Latte/Essential/Nodes/EmbedNode.php +8 -9
- package/vendor/latte/latte/src/Latte/Essential/Nodes/ExtendsNode.php +3 -5
- package/vendor/latte/latte/src/Latte/Essential/Nodes/FirstLastSepNode.php +4 -7
- package/vendor/latte/latte/src/Latte/Essential/Nodes/ForNode.php +6 -5
- package/vendor/latte/latte/src/Latte/Essential/Nodes/ForeachNode.php +7 -7
- package/vendor/latte/latte/src/Latte/Essential/Nodes/IfChangedNode.php +4 -5
- package/vendor/latte/latte/src/Latte/Essential/Nodes/IfContentNode.php +7 -6
- package/vendor/latte/latte/src/Latte/Essential/Nodes/IfNode.php +11 -11
- package/vendor/latte/latte/src/Latte/Essential/Nodes/ImportNode.php +5 -6
- package/vendor/latte/latte/src/Latte/Essential/Nodes/IncludeBlockNode.php +26 -27
- package/vendor/latte/latte/src/Latte/Essential/Nodes/IncludeFileNode.php +7 -10
- package/vendor/latte/latte/src/Latte/Essential/Nodes/IterateWhileNode.php +6 -6
- package/vendor/latte/latte/src/Latte/Essential/Nodes/JumpNode.php +4 -8
- package/vendor/latte/latte/src/Latte/Essential/Nodes/NAttrNode.php +35 -47
- package/vendor/latte/latte/src/Latte/Essential/Nodes/NClassNode.php +4 -5
- package/vendor/latte/latte/src/Latte/Essential/Nodes/NElseNode.php +69 -34
- package/vendor/latte/latte/src/Latte/Essential/Nodes/NTagNode.php +9 -33
- package/vendor/latte/latte/src/Latte/Essential/Nodes/ParametersNode.php +7 -4
- package/vendor/latte/latte/src/Latte/Essential/Nodes/RawPhpNode.php +3 -4
- package/vendor/latte/latte/src/Latte/Essential/Nodes/RollbackNode.php +2 -3
- package/vendor/latte/latte/src/Latte/Essential/Nodes/SpacelessNode.php +4 -5
- package/vendor/latte/latte/src/Latte/Essential/Nodes/SwitchNode.php +9 -7
- package/vendor/latte/latte/src/Latte/Essential/Nodes/TemplatePrintNode.php +4 -4
- package/vendor/latte/latte/src/Latte/Essential/Nodes/TemplateTypeNode.php +3 -4
- package/vendor/latte/latte/src/Latte/Essential/Nodes/TraceNode.php +2 -3
- package/vendor/latte/latte/src/Latte/Essential/Nodes/TranslateNode.php +5 -5
- package/vendor/latte/latte/src/Latte/Essential/Nodes/TryNode.php +4 -5
- package/vendor/latte/latte/src/Latte/Essential/Nodes/VarNode.php +10 -6
- package/vendor/latte/latte/src/Latte/Essential/Nodes/VarPrintNode.php +2 -3
- package/vendor/latte/latte/src/Latte/Essential/Nodes/VarTypeNode.php +3 -4
- package/vendor/latte/latte/src/Latte/Essential/Nodes/WhileNode.php +5 -5
- package/vendor/latte/latte/src/Latte/Essential/Passes.php +82 -21
- package/vendor/latte/latte/src/Latte/Essential/RawPhpExtension.php +2 -4
- package/vendor/latte/latte/src/Latte/Essential/RollbackException.php +1 -3
- package/vendor/latte/latte/src/Latte/Essential/Tracer.php +24 -28
- package/vendor/latte/latte/src/Latte/Essential/TranslatorExtension.php +14 -14
- package/vendor/latte/latte/src/Latte/Extension.php +12 -6
- package/vendor/latte/latte/src/Latte/Feature.php +24 -0
- package/vendor/latte/latte/src/Latte/Helpers.php +65 -15
- package/vendor/latte/latte/src/Latte/Loader.php +1 -9
- package/vendor/latte/latte/src/Latte/Loaders/FileLoader.php +11 -17
- package/vendor/latte/latte/src/Latte/Loaders/StringLoader.php +7 -21
- package/vendor/latte/latte/src/Latte/Policy.php +4 -3
- package/vendor/latte/latte/src/Latte/Runtime/Block.php +2 -4
- package/vendor/latte/latte/src/Latte/Runtime/Cache.php +143 -0
- package/vendor/latte/latte/src/Latte/Runtime/FilterExecutor.php +5 -6
- package/vendor/latte/latte/src/Latte/Runtime/FilterInfo.php +11 -11
- package/vendor/latte/latte/src/Latte/Runtime/FunctionExecutor.php +5 -6
- package/vendor/latte/latte/src/Latte/Runtime/Helpers.php +91 -0
- package/vendor/latte/latte/src/Latte/Runtime/Html.php +3 -5
- package/vendor/latte/latte/src/Latte/Runtime/HtmlHelpers.php +374 -0
- package/vendor/latte/latte/src/Latte/Runtime/HtmlStringable.php +1 -3
- package/vendor/latte/latte/src/Latte/Runtime/Template.php +162 -182
- package/vendor/latte/latte/src/Latte/Runtime/XmlHelpers.php +108 -0
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/FunctionCallNode.php +12 -4
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/MethodCallNode.php +15 -5
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/PropertyFetchNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/SandboxNode.php +5 -6
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticMethodCallNode.php +14 -4
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticPropertyFetchNode.php +4 -3
- package/vendor/latte/latte/src/Latte/Sandbox/RuntimeChecker.php +8 -6
- package/vendor/latte/latte/src/Latte/Sandbox/SandboxExtension.php +16 -12
- package/vendor/latte/latte/src/Latte/Sandbox/SecurityPolicy.php +18 -16
- package/vendor/latte/latte/src/Latte/attributes.php +7 -3
- package/vendor/latte/latte/src/Latte/exceptions.php +52 -6
- package/vendor/latte/latte/src/Tools/Linter.php +74 -28
- package/vendor/latte/latte/src/Tools/LinterExtension.php +176 -0
- package/vendor/nette/utils/composer.json +15 -5
- package/vendor/nette/utils/readme.md +1 -1
- package/vendor/nette/utils/src/HtmlStringable.php +4 -1
- package/vendor/nette/utils/src/Iterators/CachingIterator.php +10 -25
- package/vendor/nette/utils/src/Iterators/Mapper.php +2 -3
- package/vendor/nette/utils/src/SmartObject.php +3 -0
- package/vendor/nette/utils/src/StaticClass.php +1 -11
- package/vendor/nette/utils/src/Translator.php +1 -1
- package/vendor/nette/utils/src/Utils/ArrayHash.php +6 -10
- package/vendor/nette/utils/src/Utils/ArrayList.php +8 -12
- package/vendor/nette/utils/src/Utils/Arrays.php +38 -18
- package/vendor/nette/utils/src/Utils/Callback.php +13 -8
- package/vendor/nette/utils/src/Utils/DateTime.php +95 -26
- package/vendor/nette/utils/src/Utils/FileInfo.php +6 -7
- package/vendor/nette/utils/src/Utils/FileSystem.php +10 -5
- package/vendor/nette/utils/src/Utils/Finder.php +31 -12
- package/vendor/nette/utils/src/Utils/Floats.php +1 -0
- package/vendor/nette/utils/src/Utils/Helpers.php +22 -2
- package/vendor/nette/utils/src/Utils/Html.php +130 -127
- package/vendor/nette/utils/src/Utils/Image.php +80 -60
- package/vendor/nette/utils/src/Utils/ImageColor.php +5 -0
- package/vendor/nette/utils/src/Utils/ImageType.php +2 -0
- package/vendor/nette/utils/src/Utils/Iterables.php +41 -7
- package/vendor/nette/utils/src/Utils/Json.php +2 -0
- package/vendor/nette/utils/src/Utils/ObjectHelpers.php +2 -0
- package/vendor/nette/utils/src/Utils/Paginator.php +10 -43
- package/vendor/nette/utils/src/Utils/Random.php +2 -0
- package/vendor/nette/utils/src/Utils/Reflection.php +22 -15
- package/vendor/nette/utils/src/Utils/ReflectionMethod.php +6 -1
- package/vendor/nette/utils/src/Utils/Strings.php +62 -57
- package/vendor/nette/utils/src/Utils/Type.php +91 -42
- package/vendor/nette/utils/src/Utils/Validators.php +9 -7
- package/vendor/latte/latte/src/Bridges/Tracy/templates/LattePanel.panel.phtml +0 -101
- package/vendor/latte/latte/src/Bridges/Tracy/templates/LattePanel.tab.phtml +0 -15
- package/vendor/latte/latte/src/Latte/Compiler/ExpressionBuilder.php +0 -129
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ErrorSuppressNode.php +0 -36
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FunctionCallableNode.php +0 -39
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MethodCallableNode.php +0 -42
- package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticMethodCallableNode.php +0 -57
- package/vendor/latte/latte/src/Latte/PositionAwareException.php +0 -47
- package/vendor/latte/latte/src/Latte/Runtime/Filters.php +0 -283
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/FunctionCallableNode.php +0 -29
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/MethodCallableNode.php +0 -30
- package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticMethodCallableNode.php +0 -30
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler;
|
|
11
9
|
|
|
10
|
+
use Latte;
|
|
12
11
|
use Latte\Compiler\Nodes\Html\ElementNode;
|
|
13
12
|
use Latte\ContentType;
|
|
14
|
-
use Latte\Runtime\
|
|
13
|
+
use Latte\Runtime\Helpers;
|
|
14
|
+
use Latte\Runtime\HtmlHelpers;
|
|
15
|
+
use function in_array, is_string, str_starts_with, strtolower;
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
/**
|
|
@@ -23,8 +24,7 @@ final class Escaper
|
|
|
23
24
|
Text = 'text',
|
|
24
25
|
JavaScript = 'js',
|
|
25
26
|
Css = 'css',
|
|
26
|
-
ICal = 'ical'
|
|
27
|
-
Url = 'url';
|
|
27
|
+
ICal = 'ical';
|
|
28
28
|
|
|
29
29
|
public const
|
|
30
30
|
HtmlText = 'html',
|
|
@@ -36,55 +36,49 @@ final class Escaper
|
|
|
36
36
|
|
|
37
37
|
private const Convertors = [
|
|
38
38
|
self::Text => [
|
|
39
|
-
self::HtmlText => '
|
|
40
|
-
self::HtmlAttribute => '
|
|
41
|
-
self::HtmlAttribute . '/' . self::JavaScript => '
|
|
42
|
-
self::HtmlAttribute . '/' . self::Css => '
|
|
43
|
-
self::
|
|
44
|
-
|
|
45
|
-
'xml' => '
|
|
46
|
-
'xml/attr' => 'escapeXml',
|
|
39
|
+
self::HtmlText => 'HtmlHelpers::escapeText',
|
|
40
|
+
self::HtmlAttribute => 'HtmlHelpers::escapeAttr',
|
|
41
|
+
self::HtmlAttribute . '/' . self::JavaScript => 'HtmlHelpers::escapeAttr',
|
|
42
|
+
self::HtmlAttribute . '/' . self::Css => 'HtmlHelpers::escapeAttr',
|
|
43
|
+
self::HtmlComment => 'HtmlHelpers::escapeComment',
|
|
44
|
+
'xml' => 'XmlHelpers::escapeText',
|
|
45
|
+
'xml/attr' => 'XmlHelpers::escapeAttr',
|
|
47
46
|
],
|
|
48
47
|
self::JavaScript => [
|
|
49
|
-
self::HtmlText => '
|
|
50
|
-
self::HtmlAttribute => '
|
|
51
|
-
self::HtmlAttribute . '/' . self::JavaScript => '
|
|
52
|
-
self::HtmlRawText . '/' . self::JavaScript => '
|
|
53
|
-
self::HtmlComment => '
|
|
48
|
+
self::HtmlText => 'HtmlHelpers::escapeText',
|
|
49
|
+
self::HtmlAttribute => 'HtmlHelpers::escapeAttr',
|
|
50
|
+
self::HtmlAttribute . '/' . self::JavaScript => 'HtmlHelpers::escapeAttr',
|
|
51
|
+
self::HtmlRawText . '/' . self::JavaScript => 'HtmlHelpers::convertJSToRawText',
|
|
52
|
+
self::HtmlComment => 'HtmlHelpers::escapeComment',
|
|
54
53
|
],
|
|
55
54
|
self::Css => [
|
|
56
|
-
self::HtmlText => '
|
|
57
|
-
self::HtmlAttribute => '
|
|
58
|
-
self::HtmlAttribute . '/' . self::Css => '
|
|
59
|
-
self::HtmlRawText . '/' . self::Css => '
|
|
60
|
-
self::HtmlComment => '
|
|
55
|
+
self::HtmlText => 'HtmlHelpers::escapeText',
|
|
56
|
+
self::HtmlAttribute => 'HtmlHelpers::escapeAttr',
|
|
57
|
+
self::HtmlAttribute . '/' . self::Css => 'HtmlHelpers::escapeAttr',
|
|
58
|
+
self::HtmlRawText . '/' . self::Css => 'HtmlHelpers::convertJSToRawText',
|
|
59
|
+
self::HtmlComment => 'HtmlHelpers::escapeComment',
|
|
61
60
|
],
|
|
62
61
|
self::HtmlText => [
|
|
63
|
-
self::
|
|
64
|
-
self::HtmlAttribute
|
|
65
|
-
self::HtmlAttribute . '/' . self::
|
|
66
|
-
self::HtmlAttribute . '/' . self::
|
|
67
|
-
self::HtmlComment => '
|
|
68
|
-
self::HtmlRawText . '/' . self::HtmlText => '
|
|
62
|
+
self::Text => 'HtmlHelpers::convertHtmlToText',
|
|
63
|
+
self::HtmlAttribute => 'HtmlHelpers::convertHtmlToAttr',
|
|
64
|
+
self::HtmlAttribute . '/' . self::JavaScript => 'HtmlHelpers::convertHtmlToAttr',
|
|
65
|
+
self::HtmlAttribute . '/' . self::Css => 'HtmlHelpers::convertHtmlToAttr',
|
|
66
|
+
self::HtmlComment => 'HtmlHelpers::escapeComment',
|
|
67
|
+
self::HtmlRawText . '/' . self::HtmlText => 'HtmlHelpers::convertHtmlToRawText',
|
|
69
68
|
],
|
|
70
69
|
self::HtmlAttribute => [
|
|
71
|
-
self::HtmlText => '
|
|
72
|
-
],
|
|
73
|
-
self::HtmlAttribute . '/' . self::Url => [
|
|
74
|
-
self::HtmlText => 'convertHtmlToHtmlAttr',
|
|
75
|
-
self::HtmlAttribute => 'nop',
|
|
70
|
+
self::HtmlText => 'HtmlHelpers::convertAttrToHtml',
|
|
76
71
|
],
|
|
77
72
|
];
|
|
78
73
|
|
|
79
74
|
private string $state = '';
|
|
80
|
-
private string $tag = '';
|
|
81
75
|
private string $subType = '';
|
|
82
76
|
|
|
83
77
|
|
|
84
78
|
public function __construct(
|
|
85
79
|
private string $contentType,
|
|
86
80
|
) {
|
|
87
|
-
$this->state = in_array($contentType, [ContentType::Html, ContentType::Xml], true)
|
|
81
|
+
$this->state = in_array($contentType, [ContentType::Html, ContentType::Xml], strict: true)
|
|
88
82
|
? self::HtmlText
|
|
89
83
|
: $contentType;
|
|
90
84
|
}
|
|
@@ -118,18 +112,11 @@ final class Escaper
|
|
|
118
112
|
{
|
|
119
113
|
if ($el->isRawText()) {
|
|
120
114
|
$this->state = self::HtmlRawText;
|
|
121
|
-
$this->subType = self::Text;
|
|
122
115
|
if ($el->is('script')) {
|
|
123
116
|
$type = $el->getAttribute('type');
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
$this->subType = self::JavaScript;
|
|
128
|
-
|
|
129
|
-
} elseif (is_string($type) && preg_match('#text/((x-)?template|html)$#Ai', $type)) {
|
|
130
|
-
$this->subType = self::HtmlText;
|
|
131
|
-
}
|
|
132
|
-
|
|
117
|
+
$this->subType = $type === true || $type === null
|
|
118
|
+
? self::JavaScript
|
|
119
|
+
: (is_string($type) ? HtmlHelpers::classifyScriptType($type) : '');
|
|
133
120
|
} elseif ($el->is('style')) {
|
|
134
121
|
$this->subType = self::Css;
|
|
135
122
|
}
|
|
@@ -144,7 +131,6 @@ final class Escaper
|
|
|
144
131
|
public function enterHtmlTag(string $name): void
|
|
145
132
|
{
|
|
146
133
|
$this->state = self::HtmlTag;
|
|
147
|
-
$this->tag = strtolower($name);
|
|
148
134
|
}
|
|
149
135
|
|
|
150
136
|
|
|
@@ -166,10 +152,6 @@ final class Escaper
|
|
|
166
152
|
$this->subType = self::JavaScript;
|
|
167
153
|
} elseif ($name === 'style') {
|
|
168
154
|
$this->subType = self::Css;
|
|
169
|
-
} elseif ((in_array($name, ['href', 'src', 'action', 'formaction'], true)
|
|
170
|
-
|| ($name === 'data' && $this->tag === 'object'))
|
|
171
|
-
) {
|
|
172
|
-
$this->subType = self::Url;
|
|
173
155
|
}
|
|
174
156
|
}
|
|
175
157
|
}
|
|
@@ -191,56 +173,55 @@ final class Escaper
|
|
|
191
173
|
{
|
|
192
174
|
return match ($this->contentType) {
|
|
193
175
|
ContentType::Html => match ($this->state) {
|
|
194
|
-
self::HtmlText => 'LR\
|
|
195
|
-
self::HtmlTag => 'LR\
|
|
176
|
+
self::HtmlText => 'LR\HtmlHelpers::escapeText(' . $str . ')',
|
|
177
|
+
self::HtmlTag => 'LR\HtmlHelpers::escapeTag(' . $str . ')',
|
|
196
178
|
self::HtmlAttribute => match ($this->subType) {
|
|
197
|
-
'',
|
|
198
|
-
self::
|
|
199
|
-
self::
|
|
200
|
-
self::Css => 'LR\Filters::escapeHtmlAttr(LR\Filters::escapeCss(' . $str . '))',
|
|
179
|
+
'' => 'LR\HtmlHelpers::escapeAttr(' . $str . ')',
|
|
180
|
+
self::JavaScript => 'LR\HtmlHelpers::escapeAttr(LR\Helpers::escapeJs(' . $str . '))',
|
|
181
|
+
self::Css => 'LR\HtmlHelpers::escapeAttr(LR\Helpers::escapeCss(' . $str . '))',
|
|
201
182
|
},
|
|
202
|
-
self::HtmlComment => 'LR\
|
|
203
|
-
self::HtmlBogusTag => 'LR\
|
|
183
|
+
self::HtmlComment => 'LR\HtmlHelpers::escapeComment(' . $str . ')',
|
|
184
|
+
self::HtmlBogusTag => 'LR\HtmlHelpers::escapeTag(' . $str . ')',
|
|
204
185
|
self::HtmlRawText => match ($this->subType) {
|
|
205
|
-
self::Text => 'LR\
|
|
206
|
-
self::HtmlText => 'LR\
|
|
207
|
-
self::JavaScript => 'LR\
|
|
208
|
-
self::Css => 'LR\
|
|
186
|
+
self::Text => 'LR\HtmlHelpers::convertJSToRawText(' . $str . ')', // sanitization, escaping is not possible
|
|
187
|
+
self::HtmlText => 'LR\HtmlHelpers::escapeRawHtml(' . $str . ')',
|
|
188
|
+
self::JavaScript => 'LR\Helpers::escapeJs(' . $str . ')',
|
|
189
|
+
self::Css => 'LR\Helpers::escapeCss(' . $str . ')',
|
|
209
190
|
},
|
|
210
191
|
default => throw new \LogicException("Unknown context $this->contentType, $this->state."),
|
|
211
192
|
},
|
|
212
193
|
ContentType::Xml => match ($this->state) {
|
|
213
|
-
self::HtmlText,
|
|
214
|
-
self::HtmlBogusTag => 'LR\
|
|
215
|
-
self::HtmlAttribute => 'LR\
|
|
216
|
-
self::HtmlComment => 'LR\
|
|
217
|
-
self::HtmlTag => 'LR\
|
|
194
|
+
self::HtmlText => 'LR\XmlHelpers::escapeText(' . $str . ')',
|
|
195
|
+
self::HtmlBogusTag => 'LR\XmlHelpers::escapeTag(' . $str . ')',
|
|
196
|
+
self::HtmlAttribute => 'LR\XmlHelpers::escapeAttr(' . $str . ')',
|
|
197
|
+
self::HtmlComment => 'LR\HtmlHelpers::escapeComment(' . $str . ')',
|
|
198
|
+
self::HtmlTag => 'LR\XmlHelpers::escapeTag(' . $str . ')',
|
|
218
199
|
default => throw new \LogicException("Unknown context $this->contentType, $this->state."),
|
|
219
200
|
},
|
|
220
|
-
ContentType::JavaScript => 'LR\
|
|
221
|
-
ContentType::Css => 'LR\
|
|
222
|
-
ContentType::ICal => 'LR\
|
|
201
|
+
ContentType::JavaScript => 'LR\Helpers::escapeJs(' . $str . ')',
|
|
202
|
+
ContentType::Css => 'LR\Helpers::escapeCss(' . $str . ')',
|
|
203
|
+
ContentType::ICal => 'LR\Helpers::escapeIcal(' . $str . ')',
|
|
223
204
|
ContentType::Text => '($this->filters->escape)(' . $str . ')',
|
|
224
205
|
default => throw new \LogicException("Unknown content-type $this->contentType."),
|
|
225
206
|
};
|
|
226
207
|
}
|
|
227
208
|
|
|
228
209
|
|
|
229
|
-
public function escapeMandatory(string $str): string
|
|
210
|
+
public function escapeMandatory(string $str, ?Position $position = null): string
|
|
230
211
|
{
|
|
231
212
|
return match ($this->contentType) {
|
|
232
213
|
ContentType::Html => match ($this->state) {
|
|
233
|
-
self::HtmlAttribute => "LR\\
|
|
214
|
+
self::HtmlAttribute => "LR\\HtmlHelpers::escapeQuotes($str)",
|
|
234
215
|
self::HtmlRawText => match ($this->subType) {
|
|
235
|
-
self::HtmlText => 'LR\
|
|
236
|
-
default => "LR\\
|
|
216
|
+
self::HtmlText => 'LR\HtmlHelpers::convertHtmlToRawText(' . $str . ')',
|
|
217
|
+
default => "LR\\HtmlHelpers::convertJSToRawText($str)",
|
|
237
218
|
},
|
|
238
|
-
self::HtmlComment =>
|
|
219
|
+
self::HtmlComment => throw new Latte\CompileException('Using |noescape is not allowed in this context.', $position),
|
|
239
220
|
default => $str,
|
|
240
221
|
},
|
|
241
222
|
ContentType::Xml => match ($this->state) {
|
|
242
|
-
self::HtmlAttribute => "LR\\
|
|
243
|
-
self::HtmlComment =>
|
|
223
|
+
self::HtmlAttribute => "LR\\HtmlHelpers::escapeQuotes($str)",
|
|
224
|
+
self::HtmlComment => throw new Latte\CompileException('Using |noescape is not allowed in this context.', $position),
|
|
244
225
|
default => $str,
|
|
245
226
|
},
|
|
246
227
|
default => $str,
|
|
@@ -248,20 +229,20 @@ final class Escaper
|
|
|
248
229
|
}
|
|
249
230
|
|
|
250
231
|
|
|
251
|
-
public function
|
|
232
|
+
public function escapeContent(string $str): string
|
|
252
233
|
{
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
234
|
+
return 'LR\Helpers::convertTo($ʟ_fi, '
|
|
235
|
+
. var_export($this->export(), return: true) . ', '
|
|
236
|
+
. $str
|
|
237
|
+
. ')';
|
|
257
238
|
}
|
|
258
239
|
|
|
259
240
|
|
|
260
241
|
public static function getConvertor(string $source, string $dest): ?callable
|
|
261
242
|
{
|
|
262
243
|
return match (true) {
|
|
263
|
-
$source === $dest =>
|
|
264
|
-
isset(self::Convertors[$source][$dest]) =>
|
|
244
|
+
$source === $dest => Helpers::nop(...),
|
|
245
|
+
isset(self::Convertors[$source][$dest]) => 'Latte\Runtime\\' . self::Convertors[$source][$dest],
|
|
265
246
|
default => null,
|
|
266
247
|
};
|
|
267
248
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
1
|
+
<?php declare(strict_types=1);
|
|
4
2
|
|
|
5
3
|
namespace Latte\Compiler;
|
|
6
4
|
|
|
7
5
|
|
|
8
6
|
/**
|
|
7
|
+
* Base class for AST nodes representing parsed template structure.
|
|
8
|
+
*
|
|
9
|
+
* Each node must implement print() to generate PHP code and getIterator()
|
|
10
|
+
* to yield child nodes for compiler passes.
|
|
11
|
+
*
|
|
9
12
|
* @implements \IteratorAggregate<Node>
|
|
10
13
|
*/
|
|
11
14
|
abstract class Node implements \IteratorAggregate
|
|
@@ -1,23 +1,28 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler;
|
|
11
9
|
|
|
12
10
|
use Latte\Compiler\Nodes\Php;
|
|
13
11
|
use Latte\Compiler\Nodes\Php\Expression;
|
|
14
12
|
use Latte\Compiler\Nodes\Php\ExpressionNode;
|
|
15
13
|
use Latte\Compiler\Nodes\Php\Scalar;
|
|
14
|
+
use function array_merge, constant, defined;
|
|
16
15
|
|
|
17
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Utility functions for working with AST nodes.
|
|
19
|
+
*/
|
|
18
20
|
final class NodeHelpers
|
|
19
21
|
{
|
|
20
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* @param callable(Node): bool $filter
|
|
24
|
+
* @return Node[]
|
|
25
|
+
*/
|
|
21
26
|
public static function find(Node $node, callable $filter): array
|
|
22
27
|
{
|
|
23
28
|
$found = [];
|
|
@@ -31,6 +36,7 @@ final class NodeHelpers
|
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
|
|
39
|
+
/** @param callable(Node): bool $filter */
|
|
34
40
|
public static function findFirst(Node $node, callable $filter): ?Node
|
|
35
41
|
{
|
|
36
42
|
$found = null;
|
|
@@ -48,7 +54,7 @@ final class NodeHelpers
|
|
|
48
54
|
public static function clone(Node $node): Node
|
|
49
55
|
{
|
|
50
56
|
return (new NodeTraverser)
|
|
51
|
-
->traverse($node, enter: fn(Node $node) => clone $node);
|
|
57
|
+
->traverse($node, enter: fn(Node $node) => clone $node) ?? throw new \LogicException;
|
|
52
58
|
}
|
|
53
59
|
|
|
54
60
|
|
|
@@ -90,7 +96,11 @@ final class NodeHelpers
|
|
|
90
96
|
? constant($name)
|
|
91
97
|
: throw new \InvalidArgumentException("The constant '$name' is not defined.");
|
|
92
98
|
|
|
93
|
-
} elseif (
|
|
99
|
+
} elseif (
|
|
100
|
+
$node instanceof Expression\ClassConstantFetchNode
|
|
101
|
+
&& $constants
|
|
102
|
+
&& $node->name instanceof Php\IdentifierNode
|
|
103
|
+
) {
|
|
94
104
|
$class = $node->class instanceof Php\NameNode
|
|
95
105
|
? $node->class->toCodeString()
|
|
96
106
|
: self::toValue($node->class, $constants);
|
|
@@ -1,39 +1,45 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler;
|
|
11
9
|
|
|
12
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Traverses and transforms AST nodes using visitor pattern.
|
|
13
|
+
*/
|
|
13
14
|
final class NodeTraverser
|
|
14
15
|
{
|
|
15
16
|
public const DontTraverseChildren = 1;
|
|
16
17
|
public const StopTraversal = 2;
|
|
18
|
+
public const RemoveNode = 3;
|
|
17
19
|
|
|
18
|
-
/** @var ?
|
|
19
|
-
private $enter;
|
|
20
|
+
/** @var ?(\Closure(Node): (Node|int|void|null)) */
|
|
21
|
+
private ?\Closure $enter = null;
|
|
20
22
|
|
|
21
|
-
/** @var ?
|
|
22
|
-
private $leave;
|
|
23
|
+
/** @var ?(\Closure(Node): (Node|int|void|null)) */
|
|
24
|
+
private ?\Closure $leave = null;
|
|
23
25
|
|
|
24
26
|
private bool $stop;
|
|
25
27
|
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
/**
|
|
30
|
+
* @param ?(callable(Node): (Node|int|void|null)) $enter
|
|
31
|
+
* @param ?(callable(Node): (Node|int|void|null)) $leave
|
|
32
|
+
*/
|
|
33
|
+
public function traverse(Node $node, ?callable $enter = null, ?callable $leave = null): ?Node
|
|
28
34
|
{
|
|
29
|
-
$this->enter = $enter;
|
|
30
|
-
$this->leave = $leave;
|
|
35
|
+
$this->enter = $enter ? $enter(...) : null;
|
|
36
|
+
$this->leave = $leave ? $leave(...) : null;
|
|
31
37
|
$this->stop = false;
|
|
32
38
|
return $this->traverseNode($node);
|
|
33
39
|
}
|
|
34
40
|
|
|
35
41
|
|
|
36
|
-
private function traverseNode(Node $node): Node
|
|
42
|
+
private function traverseNode(Node $node): ?Node
|
|
37
43
|
{
|
|
38
44
|
$children = true;
|
|
39
45
|
if ($this->enter) {
|
|
@@ -46,7 +52,10 @@ final class NodeTraverser
|
|
|
46
52
|
|
|
47
53
|
} elseif ($res === self::StopTraversal) {
|
|
48
54
|
$this->stop = true;
|
|
49
|
-
$
|
|
55
|
+
return $node;
|
|
56
|
+
|
|
57
|
+
} elseif ($res === self::RemoveNode) {
|
|
58
|
+
return null;
|
|
50
59
|
}
|
|
51
60
|
}
|
|
52
61
|
|
|
@@ -63,8 +72,12 @@ final class NodeTraverser
|
|
|
63
72
|
$res = ($this->leave)($node);
|
|
64
73
|
if ($res instanceof Node) {
|
|
65
74
|
$node = $res;
|
|
75
|
+
|
|
66
76
|
} elseif ($res === self::StopTraversal) {
|
|
67
77
|
$this->stop = true;
|
|
78
|
+
|
|
79
|
+
} elseif ($res === self::RemoveNode) {
|
|
80
|
+
return null;
|
|
68
81
|
}
|
|
69
82
|
}
|
|
70
83
|
|
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler\Nodes;
|
|
11
9
|
|
|
12
10
|
use Latte\Compiler\Node;
|
|
13
11
|
|
|
14
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Base for nodes representing template content that produces output.
|
|
15
|
+
*
|
|
16
|
+
* Includes text, HTML elements, and Latte tags. Extend StatementNode
|
|
17
|
+
* for custom Latte tags, or AreaNode directly for passive content.
|
|
18
|
+
*/
|
|
15
19
|
abstract class AreaNode extends Node
|
|
16
20
|
{
|
|
17
21
|
}
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler\Nodes;
|
|
11
9
|
|
|
12
10
|
use Latte\Compiler\Node;
|
|
13
11
|
use Latte\Compiler\PrintContext;
|
|
14
12
|
|
|
15
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Code generator hidden from compiler passes. Pass child nodes for traversal.
|
|
16
|
+
*/
|
|
16
17
|
class AuxiliaryNode extends AreaNode
|
|
17
18
|
{
|
|
18
19
|
public function __construct(
|
|
19
|
-
public
|
|
20
|
+
public readonly \Closure $print,
|
|
20
21
|
/** @var (?Node)[] */
|
|
21
22
|
public array $nodes = [],
|
|
22
23
|
) {
|
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler\Nodes;
|
|
11
9
|
|
|
12
10
|
use Latte\Compiler\PrintContext;
|
|
11
|
+
use Latte\Helpers;
|
|
12
|
+
use function array_merge, count;
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* Container for sequence of child nodes.
|
|
17
|
+
*/
|
|
15
18
|
final class FragmentNode extends AreaNode
|
|
16
19
|
{
|
|
17
20
|
/** @var AreaNode[] */
|
|
18
21
|
public array $children = [];
|
|
19
22
|
|
|
20
23
|
|
|
21
|
-
/** @param AreaNode[]
|
|
24
|
+
/** @param AreaNode[] $children */
|
|
22
25
|
public function __construct(array $children = [])
|
|
23
26
|
{
|
|
24
27
|
foreach ($children as $child) {
|
|
@@ -65,5 +68,6 @@ final class FragmentNode extends AreaNode
|
|
|
65
68
|
foreach ($this->children as &$item) {
|
|
66
69
|
yield $item;
|
|
67
70
|
}
|
|
71
|
+
Helpers::removeNulls($this->children);
|
|
68
72
|
}
|
|
69
73
|
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler\Nodes\Html;
|
|
11
9
|
|
|
12
10
|
use Latte\Compiler\NodeHelpers;
|
|
13
11
|
use Latte\Compiler\Nodes\AreaNode;
|
|
14
|
-
use Latte\Compiler\Nodes\FragmentNode;
|
|
15
12
|
use Latte\Compiler\Nodes\TextNode;
|
|
16
13
|
use Latte\Compiler\Position;
|
|
17
14
|
use Latte\Compiler\PrintContext;
|
|
18
15
|
|
|
19
16
|
|
|
17
|
+
/**
|
|
18
|
+
* HTML attribute with name, optional value, and quote style.
|
|
19
|
+
*/
|
|
20
20
|
class AttributeNode extends AreaNode
|
|
21
21
|
{
|
|
22
22
|
public function __construct(
|
|
@@ -37,21 +37,13 @@ class AttributeNode extends AreaNode
|
|
|
37
37
|
|
|
38
38
|
$res .= "echo '=';";
|
|
39
39
|
$quote = $this->quote ?? ($this->value instanceof TextNode ? null : '"');
|
|
40
|
-
$res .= $quote ? 'echo ' . var_export($quote, true) . ';' : '';
|
|
40
|
+
$res .= $quote ? 'echo ' . var_export($quote, return: true) . ';' : '';
|
|
41
41
|
|
|
42
42
|
$escaper = $context->beginEscape();
|
|
43
43
|
$escaper->enterHtmlAttribute(NodeHelpers::toText($this->name));
|
|
44
|
-
|
|
45
|
-
foreach ($this->value->children as $child) {
|
|
46
|
-
$res .= $child->print($context);
|
|
47
|
-
$escaper->enterHtmlAttribute(null);
|
|
48
|
-
}
|
|
49
|
-
} else {
|
|
50
|
-
$res .= $this->value->print($context);
|
|
51
|
-
}
|
|
52
|
-
|
|
44
|
+
$res .= $this->value->print($context);
|
|
53
45
|
$context->restoreEscape();
|
|
54
|
-
$res .= $quote ? 'echo ' . var_export($quote, true) . ';' : '';
|
|
46
|
+
$res .= $quote ? 'echo ' . var_export($quote, return: true) . ';' : '';
|
|
55
47
|
return $res;
|
|
56
48
|
}
|
|
57
49
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler\Nodes\Html;
|
|
11
9
|
|
|
12
10
|
use Latte\Compiler\Nodes\AreaNode;
|
|
@@ -15,7 +13,7 @@ use Latte\Compiler\PrintContext;
|
|
|
15
13
|
|
|
16
14
|
|
|
17
15
|
/**
|
|
18
|
-
*
|
|
16
|
+
* DOCTYPE or bogus HTML tags.
|
|
19
17
|
*/
|
|
20
18
|
class BogusTagNode extends AreaNode
|
|
21
19
|
{
|
|
@@ -30,11 +28,11 @@ class BogusTagNode extends AreaNode
|
|
|
30
28
|
|
|
31
29
|
public function print(PrintContext $context): string
|
|
32
30
|
{
|
|
33
|
-
$res = 'echo ' . var_export($this->openDelimiter, true) . ';';
|
|
31
|
+
$res = 'echo ' . var_export($this->openDelimiter, return: true) . ';';
|
|
34
32
|
$context->beginEscape()->enterHtmlBogusTag();
|
|
35
33
|
$res .= $this->content->print($context);
|
|
36
34
|
$context->restoreEscape();
|
|
37
|
-
$res .= 'echo ' . var_export($this->endDelimiter, true) . ';';
|
|
35
|
+
$res .= 'echo ' . var_export($this->endDelimiter, return: true) . ';';
|
|
38
36
|
return $res;
|
|
39
37
|
}
|
|
40
38
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
<?php
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* This file is part of the Latte (https://latte.nette.org)
|
|
5
5
|
* Copyright (c) 2008 David Grudl (https://davidgrudl.com)
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
declare(strict_types=1);
|
|
9
|
-
|
|
10
8
|
namespace Latte\Compiler\Nodes\Html;
|
|
11
9
|
|
|
12
10
|
use Latte\Compiler\Nodes\AreaNode;
|
|
@@ -14,6 +12,9 @@ use Latte\Compiler\Position;
|
|
|
14
12
|
use Latte\Compiler\PrintContext;
|
|
15
13
|
|
|
16
14
|
|
|
15
|
+
/**
|
|
16
|
+
* HTML comment (<!-- ... -->).
|
|
17
|
+
*/
|
|
17
18
|
class CommentNode extends AreaNode
|
|
18
19
|
{
|
|
19
20
|
public function __construct(
|